From e479f9328548740a8206c8026a1a25adeace0690 Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 20 Dec 2019 14:28:26 +0100 Subject: [PATCH] Took everything from the main repo that I need. Also fixed compile. Nothing works yet. --- game/.gitignore | 16 + game/autoload/CursorManager.gd | 28 + game/autoload/CursorManager.tscn | 22 + game/autoload/EntityDataManager.gd | 375 +++++++++++ game/autoload/EntityDataManager.tscn | 26 + game/autoload/Logger.gd | 637 ++++++++++++++++++ game/autoload/Logger.tscn | 6 + game/autoload/ProfileManager.gd | 85 +++ game/autoload/ProfileManager.tscn | 6 + game/autoload/Server.gd | 203 ++++++ game/autoload/Server.tscn | 6 + game/autoload/SettingsManager.gd | 63 ++ game/autoload/SettingsManager.tscn | 6 + game/autoload/ThemeAtlas.gd | 14 + game/autoload/ThemeAtlas.tscn | 25 + game/autoload/WorldNumbers.gd | 36 + game/autoload/WorldNumbers.tscn | 8 + .../aura_groups/1_aspect_of_scorpions.tres | 3 + game/data/aura_groups/2_aspect_of_wasps.tres | 3 + game/data/aura_groups/3_aspect_of_wolves.tres | 3 + game/data/aura_groups/4_aspect_of_bees.tres | 3 + .../auras/10_aspect_of_scorpions_rank_1.tres | 28 + game/data/auras/11_aspect_of_wasps_rank1.tres | 23 + .../auras/12_aspect_of_wolves_rank_1.tres | 32 + game/data/auras/13_aspect_of_bees_rank_1.tres | 23 + game/data/auras/14_rejuvenation_rank_1.tres | 19 + game/data/auras/15_close_wounds_rank_1.tres | 18 + game/data/auras/16_ironbark_rank_1.tres | 19 + .../auras/17_natures_swiftness_rank_1.tres | 21 + game/data/auras/1_test1.tres | 11 + game/data/auras/20_root_rank_1.tres | 13 + game/data/auras/21_aspect_of_scorpions.tres | 28 + game/data/auras/22_aspect_of_wasps.tres | 23 + game/data/auras/23_aspect_of_wolves.tres | 32 + game/data/auras/24_aspect_of_bees.tres | 23 + game/data/biomes/1_test.tres | 7 + game/data/biomes/2_tdungb.tres | 9 + game/data/character_specs/1_test.tres | 3 + .../character_specs/2_elementalist_fire.tres | 6 + .../character_specs/3_elementalist_water.tres | 6 + .../character_specs/4_elementalist_ice.tres | 6 + game/data/crafting/1_test_craft.tres | 36 + .../2_chest_of_the_infinite_wisdom.tres | 21 + game/data/cursors/arrow.png | Bin 0 -> 173 bytes game/data/cursors/arrow.png.import | 34 + game/data/cursors/arrow16.png | Bin 0 -> 379 bytes game/data/cursors/arrow16.png.import | 34 + game/data/cursors/arrow32.png | Bin 0 -> 418 bytes game/data/cursors/arrow32.png.import | 34 + game/data/cursors/arrow8.png | Bin 0 -> 173 bytes game/data/cursors/arrow8.png.import | 34 + game/data/cursors/attack16.png | Bin 0 -> 414 bytes game/data/cursors/attack16.png.import | 34 + game/data/cursors/drag_drop.png | Bin 0 -> 371 bytes game/data/cursors/drag_drop.png.import | 34 + game/data/cursors/forbidden.png | Bin 0 -> 436 bytes game/data/cursors/forbidden.png.import | 34 + game/data/cursors/ibeam.png | Bin 0 -> 256 bytes game/data/cursors/ibeam.png.import | 34 + game/data/cursors/loot16.png | Bin 0 -> 377 bytes game/data/cursors/loot16.png.import | 34 + game/data/cursors/speak.png | Bin 0 -> 426 bytes game/data/cursors/speak.png.import | 34 + game/data/dungeon_rooms/1_test.tres | 3 + .../data/dungeon_rooms/2_test_start_room.tres | 6 + game/data/dungeons/1_test.tres | 8 + .../data/effect_data/aspect_of_scorpions.tres | 10 + game/data/effect_data/natures_swiftness.tres | 10 + game/data/entities/1_naturalist.tres | 18 + game/data/entity_classes/1_naturalist.tres | 259 +++++++ game/data/entity_classes/2_elementalist.tres | 207 ++++++ .../entity_resources/1_mana_resource.tres | 7 + game/data/entity_skills/1_test.tres | 4 + game/data/environments/default_env.tres | 13 + game/data/fonts/OFL.txt | 93 +++ game/data/fonts/VT323-Regular.ttf | Bin 0 -> 86576 bytes game/data/icons/3_iron_bar.tres | 8 + .../icons/4_chest_of_the_infinite_wisdom.tres | 8 + game/data/icons/icons-1/11.png | Bin 0 -> 2827 bytes game/data/icons/icons-1/11.png.import | 34 + game/data/icons/icons-1/43.png | Bin 0 -> 8244 bytes game/data/icons/icons-1/43.png.import | 34 + game/data/icons/icons-1/5.png | Bin 0 -> 3297 bytes game/data/icons/icons-1/5.png.import | 34 + game/data/icons/icons-1/61.png | Bin 0 -> 3024 bytes game/data/icons/icons-1/61.png.import | 34 + game/data/icons/icons-1/Readme.txt | 16 + game/data/icons/icons-2/README.txt | 12 + game/data/icons/icons-2/enchant-acid-2.png | Bin 0 -> 3032 bytes .../icons/icons-2/enchant-acid-2.png.import | 34 + game/data/icons/icons-2/enchant-blue-2.png | Bin 0 -> 3111 bytes .../icons/icons-2/enchant-blue-2.png.import | 34 + game/data/icons/icons-2/heal-jade-2.png | Bin 0 -> 3314 bytes .../data/icons/icons-2/heal-jade-2.png.import | 34 + game/data/icons/icons-2/protect-acid-3.png | Bin 0 -> 3506 bytes .../icons/icons-2/protect-acid-3.png.import | 34 + game/data/icons/icons-2/protect-eerie-2.png | Bin 0 -> 3357 bytes .../icons/icons-2/protect-eerie-2.png.import | 34 + game/data/icons/icons-3/README.txt | 11 + game/data/icons/icons-3/beam-jade-2.png | Bin 0 -> 3220 bytes .../data/icons/icons-3/beam-jade-2.png.import | 34 + game/data/icons/icons-3/haste-royal-2.png | Bin 0 -> 3277 bytes .../icons/icons-3/haste-royal-2.png.import | 34 + game/data/icons/icons-3/lighting-acid-2.png | Bin 0 -> 3404 bytes .../icons/icons-3/lighting-acid-2.png.import | 34 + game/data/icons/icons-3/vines-plain-1.png | Bin 0 -> 2525 bytes .../icons/icons-3/vines-plain-1.png.import | 34 + game/data/icons/icons-3/vines-plain-2.png | Bin 0 -> 2739 bytes .../icons/icons-3/vines-plain-2.png.import | 34 + game/data/icons/icons-4/README.txt | 24 + game/data/icons/icons-4/explosion-royal-2.png | Bin 0 -> 3086 bytes .../icons-4/explosion-royal-2.png.import | 34 + game/data/icons/icons-4/horror-acid-3.png | Bin 0 -> 3133 bytes .../icons/icons-4/horror-acid-3.png.import | 34 + game/data/icons/icons-4/leaf-acid-1.png | Bin 0 -> 2695 bytes .../data/icons/icons-4/leaf-acid-1.png.import | 34 + game/data/icons/icons-4/wild-orange-2.png | Bin 0 -> 3019 bytes .../icons/icons-4/wild-orange-2.png.import | 34 + game/data/icons/icons-4/wind-blue-1.png | Bin 0 -> 2631 bytes .../data/icons/icons-4/wind-blue-1.png.import | 34 + game/data/icons/icons-5/README.txt | 23 + game/data/icons/icons-5/wind-grasp-acid-2.png | Bin 0 -> 2917 bytes .../icons-5/wind-grasp-acid-2.png.import | 34 + .../data/icons/icons-5/wind-grasp-eerie-2.png | Bin 0 -> 2966 bytes .../icons-5/wind-grasp-eerie-2.png.import | 34 + game/data/icons/icons.png | Bin 0 -> 1438 bytes game/data/icons/icons.png.import | 34 + game/data/icons/items/gold.tres | 8 + game/data/icons/naturalist/amplify_pain.tres | 7 + .../data/icons/naturalist/aspect_of_bees.tres | 7 + .../icons/naturalist/aspect_of_scorpions.tres | 8 + .../icons/naturalist/aspect_of_wasps.tres | 8 + .../icons/naturalist/aspect_of_wolves.tres | 8 + game/data/icons/naturalist/attunement.tres | 8 + game/data/icons/naturalist/calm.tres | 8 + game/data/icons/naturalist/close_wounds.tres | 7 + game/data/icons/naturalist/first_aid.tres | 7 + game/data/icons/naturalist/inner_will.tres | 8 + game/data/icons/naturalist/ironbark.tres | 7 + .../icons/naturalist/natures_swiftness.tres | 8 + game/data/icons/naturalist/regenerate.tres | 7 + game/data/icons/naturalist/rejuvenation.tres | 7 + game/data/icons/naturalist/root.tres | 8 + .../icons/naturalist/shield_of_barbs.tres | 8 + .../icons/naturalist/strength_of_nature.tres | 8 + game/data/icons/naturalist/test.tres | 8 + game/data/icons/naturalist/uproot.tres | 8 + game/data/item_templates/1_gold.tres | 9 + game/data/item_templates/2_test.tres | 12 + .../3_chest_of_the_infinite_wisdom.tres | 34 + game/data/planets/1_test.tres | 9 + game/data/planets/2_tdungeon.tres | 9 + .../player_character_data/1_naturalist.tres | 17 + game/data/spell_effects/textures/arrows.png | Bin 0 -> 482 bytes .../spell_effects/textures/arrows.png.import | 34 + game/data/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 + game/data/spell_effects/textures/star.png | Bin 0 -> 283 bytes .../spell_effects/textures/star.png.import | 34 + .../spells/10_aspect_of_scorpions_rank_1.tres | 26 + .../spells/11_aspect_of_wasps_rank_1.tres | 24 + .../spells/12_aspect_of_wolves_rank_1.tres | 24 + .../data/spells/13_aspect_of_bees_rank_1.tres | 27 + game/data/spells/14_amplify_pain_rank_1.tres | 38 ++ game/data/spells/15_rejuvenation_rank_1.tres | 21 + game/data/spells/16_close_wounds_rank_1.tres | 23 + game/data/spells/17_ironbark_rank_1.tres | 24 + .../spells/18_natures_swiftness_rank_1.tres | 24 + game/data/spells/19_uproot_rank_1.tres | 23 + game/data/spells/1_test_spell.tres | 19 + game/data/spells/20_root_rank_1.tres | 24 + .../spells/21_strength_of_nature_rank_1.tres | 25 + .../spells/22_shield_of_barbs_rank_1.tres | 21 + game/data/spells/23_calm_rank_1.tres | 20 + game/data/spells/24_attunement_rank_1.tres | 21 + game/data/spells/25_inner_will.tres | 20 + game/data/spells/26_rest.tres | 17 + game/data/spells/27_aspect_of_scorpions.tres | 25 + game/data/spells/28_aspectofwasps.tres | 22 + game/data/spells/29_aspect_of_wolves.tres | 22 + game/data/spells/2_test_cast_spell.tres | 14 + game/data/spells/30_aspect_of_bees.tres | 26 + game/data/spells/31_overload.tres | 40 ++ game/data/spells/32_heat.tres | 7 + game/data/spells/33_normal.tres | 7 + game/data/spells/34_cold.tres | 7 + game/data/world_spells/1_testwp.tres | 6 + game/data/xp/xp_data.tres | 52 ++ game/default_bus_layout.tres | 3 + .../DungeonGeneratorScene.gd | 191 ++++++ .../DungeonGeneratorScene.tscn | 14 + .../dungeon_generator/MainDungeonGenerator.gd | 25 + game/dungeon_generator/Room.gd | 13 + game/dungeon_generator/Room.tscn | 11 + .../old_voxelmanlevelgenerator.tres | 11 + game/icon.png | Bin 0 -> 7569 bytes game/icon.png.flags | 1 + game/icon.png.import | 37 + game/menu/CharacterEntry.gd | 32 + game/menu/CharacterEntry.tscn | 81 +++ .../menu/character_creation_button_group.tres | 3 + game/menu/menu_character_button_group.tres | 3 + game/networking/PlayerMaster.gd | 24 + game/networking/SpawnPoint.gd | 118 ++++ game/player/CameraPivot.gd | 74 ++ game/player/CharacterSkeletonAttachPoint.gd | 75 +++ game/player/CharacterSkeletonGD.gd | 26 + game/player/DisplayEntity.gd | 379 +++++++++++ game/player/DisplayPlayer.gd | 53 ++ game/player/DisplayPlayer.tscn | 25 + game/player/GUI.gd | 20 + game/player/Mob.gd | 344 ++++++++++ game/player/Mob.tscn | 34 + game/player/MobTest.gd | 31 + game/player/NamePlate.gd | 152 +++++ game/player/NetworkedPlayer.gd | 119 ++++ game/player/NetworkedPlayer.tscn | 37 + game/player/Player.gd | 489 ++++++++++++++ game/player/Player.tscn | 35 + game/player/PlayerGDBase.gd | 104 +++ game/player/Unitframes.gd | 32 + game/project.godot | 260 +++++++ game/scenes/BrokenSeals.tscn | 3 + game/scenes/CharacterCreationMenu.gd | 64 ++ game/scenes/CharacterSelector.gd | 36 + game/scenes/CharacterSelectorMenu.gd | 147 ++++ game/scenes/ConnectButton.gd | 19 + game/scenes/ConnectServerButton.gd | 57 ++ game/scenes/DisconnectButton.gd | 19 + game/scenes/GameScene.gd | 9 + game/scenes/HostButton.gd | 16 + game/scenes/HostGameButton.gd | 55 ++ game/scenes/Main.tscn | 94 +++ game/scenes/MainScene.gd | 93 +++ game/scenes/Menu.gd | 30 + game/scenes/Menu.tscn | 519 ++++++++++++++ game/scenes/Shared.tscn | 11 + game/scenes/World.tscn | 73 ++ game/scripts/ai/EntityAIGD.gd | 128 ++++ game/scripts/auras/aura_script.gd | 96 +++ game/scripts/biomes/simple_biome.gd | 9 + .../scripts/dungeon_start_rooms/start_room.gd | 14 + game/scripts/dungeons/dungeon.gd | 47 ++ game/scripts/entities/EntityClassDataGD.gd | 117 ++++ game/scripts/entities/EntityDataGD.gd | 61 ++ game/scripts/items/ItemTemplateGD.gd | 13 + game/scripts/planets/dung_simple_planet.gd | 94 +++ game/scripts/planets/simple_planet.gd | 54 ++ game/scripts/projectiles/WorldSpellGD.gd | 51 ++ game/scripts/resources/ManResource.gd | 15 + game/scripts/resources/ManaResourceData.gd | 8 + .../resources/spell_effect_visual_basic.gd | 21 + .../settings/DirectionalLightSettings.gd | 17 + game/scripts/spells/amplify_pain.gd | 21 + game/scripts/spells/gd_spell_script.gd | 182 +++++ .../world_generators/MainPlanetGenerator.gd | 82 +++ game/ui/actionbars/ActionBar.gd | 30 + game/ui/actionbars/ActionBar.tscn | 33 + game/ui/actionbars/ActionBarEntry.gd | 276 ++++++++ game/ui/actionbars/ActionBarEntry.tscn | 91 +++ game/ui/actionbars/Actionbars.gd | 52 ++ game/ui/actionbars/EditorKeybindSetup.gd | 37 + game/ui/auraframe/AuraEntry.gd | 79 +++ game/ui/auraframe/AuraEntry.tscn | 94 +++ game/ui/auraframe/AuraFrame.gd | 59 ++ game/ui/auraframe/AuraFrame.tscn | 41 ++ game/ui/bags/Bag.tscn | 323 +++++++++ game/ui/bags/BagEntry.gd | 236 +++++++ game/ui/bags/BagEntry.tscn | 104 +++ game/ui/bags/BagFrame.gd | 13 + game/ui/bags/BagFrame.tscn | 51 ++ game/ui/bags/EquipmentSlot.gd | 87 +++ game/ui/bags/EquipmentSlot.tscn | 37 + game/ui/bags/InventoryGUI.gd | 110 +++ game/ui/bags/ItemPupop.gd | 19 + game/ui/bags/weapon_set_button_group.tres | 3 + game/ui/buttons/Buttons.gd | 47 ++ game/ui/castbar/Castbar.gd | 74 ++ game/ui/castbar/Castbar.tscn | 27 + game/ui/crafting/ItemEntry.gd | 31 + game/ui/crafting/ItemEntry.tscn | 45 ++ game/ui/crafting/RecipeSelector.gd | 17 + game/ui/crafting/RecipeSelector.tscn | 12 + game/ui/debug/DebugInfo.gd | 61 ++ game/ui/debug/DebugInfo.tscn | 18 + game/ui/debug/SpawnPointSimpleUI.tscn | 101 +++ game/ui/debug/debuginfo_font.tres | 7 + game/ui/errorframe/ErrorFrame.tscn | 5 + game/ui/ingame_menu/ExitButton.gd | 12 + game/ui/ingame_menu/IngameMenu.tscn | 83 +++ game/ui/keybinds/KeybindCategory.gd | 9 + game/ui/keybinds/KeybindCategory.tscn | 29 + game/ui/keybinds/KeybindEntry.gd | 23 + game/ui/keybinds/KeybindEntry.tscn | 34 + game/ui/keybinds/Keybinds.gd | 113 ++++ game/ui/keybinds/Keybinds.tscn | 73 ++ game/ui/login/Login.tscn | 88 +++ game/ui/loot_window/LootEntry.gd | 33 + game/ui/loot_window/LootEntry.tscn | 61 ++ game/ui/loot_window/LootWindow.gd | 66 ++ game/ui/loot_window/LootWindow.tscn | 50 ++ game/ui/map/Map.tscn | 47 ++ game/ui/minimap/MiniMap.tscn | 11 + game/ui/nameplates/NamePlate.tscn | 68 ++ .../ui/nameplates/name_plate_dynamicfont.tres | 7 + 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 | 71 ++ game/ui/numbers/Number.tscn | 92 +++ game/ui/numbers/number_font.tres | 7 + game/ui/options/OptionCheckBox.gd | 17 + game/ui/options/OptionRow.gd | 9 + game/ui/options/Options.tscn | 128 ++++ game/ui/options/Threads.gd | 19 + game/ui/player_ui/RemoveProfile.gd | 21 + game/ui/player_ui/player_ui.gd | 15 + game/ui/player_ui/player_ui.tscn | 432 ++++++++++++ game/ui/register/Register.tscn | 114 ++++ game/ui/spellbook/SpellEntryPopup.gd | 27 + game/ui/starmap/StarMap.tscn | 72 ++ game/ui/talents/Spec.gd | 35 + game/ui/talents/Spec.tscn | 22 + game/ui/talents/TalentEntry.gd | 109 +++ game/ui/talents/TalentEntry.tscn | 110 +++ game/ui/talents/TalentRow.gd | 9 + game/ui/talents/TalentRow.tscn | 44 ++ game/ui/talents/talent_switcher_button.gd | 16 + game/ui/talents/talent_switcher_button.tscn | 14 + game/ui/theme/GameUI.png | Bin 0 -> 16423 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/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/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/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 + .../ui/theme/scrollbar_grabber_highlight.tres | 13 + game/ui/theme/scrollbar_grabber_pressed.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/ui_dynamicfont.tres | 7 + game/ui/theme/ui_dynamicfont_small.tres | 7 + game/ui/theme/ui_theme.tres | 371 ++++++++++ game/ui/theme/unlocked_icon.tres | 7 + game/ui/theme/window_bg_atlas.tres | 7 + game/ui/theme/window_bg_bg.tres | 7 + game/ui/touch_pad/TurnPanel.gd | 111 +++ 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 + game/ui/unitframes/TargetUnitframe.gd | 99 +++ game/ui/unitframes/TargetUnitframe.tscn | 76 +++ game/ui/unitframes/UnitframeBase.gd | 90 +++ game/ui/unitframes/UnitframeBase.tscn | 87 +++ game/ui/windows/CharacterWindow.tscn | 38 ++ game/ui/windows/CraftItemDescription.gd | 26 + game/ui/windows/CraftingWindow.gd | 124 ++++ game/ui/windows/CraftingWindow.tscn | 311 +++++++++ game/ui/windows/InventoryWindow.tscn | 125 ++++ game/ui/windows/SpellBookWindow.gd | 173 +++++ game/ui/windows/SpellBookWindow.tscn | 179 +++++ game/ui/windows/SpellContainer.gd | 117 ++++ game/ui/windows/SpellContainer.tscn | 150 +++++ game/ui/windows/SpellDragAndDropSpellBook.gd | 29 + game/ui/windows/TalentWindow.gd | 80 +++ game/ui/windows/TalentWindow.tscn | 76 +++ game/ui/windows/VBoxContainer.gd | 17 + game/ui/windows/base/BaseWindow.tscn | 79 +++ .../windows/base/PagedContentContainer.tscn | 56 ++ game/ui/windows/base/ScrollContainer.tscn | 22 + game/ui/windows/inventory/ItemEntry.tscn | 54 ++ 402 files changed, 17996 insertions(+) create mode 100644 game/.gitignore create mode 100644 game/autoload/CursorManager.gd create mode 100644 game/autoload/CursorManager.tscn create mode 100644 game/autoload/EntityDataManager.gd create mode 100644 game/autoload/EntityDataManager.tscn create mode 100644 game/autoload/Logger.gd create mode 100644 game/autoload/Logger.tscn create mode 100644 game/autoload/ProfileManager.gd create mode 100644 game/autoload/ProfileManager.tscn create mode 100644 game/autoload/Server.gd create mode 100644 game/autoload/Server.tscn create mode 100644 game/autoload/SettingsManager.gd create mode 100644 game/autoload/SettingsManager.tscn create mode 100644 game/autoload/ThemeAtlas.gd create mode 100644 game/autoload/ThemeAtlas.tscn create mode 100644 game/autoload/WorldNumbers.gd create mode 100644 game/autoload/WorldNumbers.tscn create mode 100644 game/data/aura_groups/1_aspect_of_scorpions.tres create mode 100644 game/data/aura_groups/2_aspect_of_wasps.tres create mode 100644 game/data/aura_groups/3_aspect_of_wolves.tres create mode 100644 game/data/aura_groups/4_aspect_of_bees.tres create mode 100644 game/data/auras/10_aspect_of_scorpions_rank_1.tres create mode 100644 game/data/auras/11_aspect_of_wasps_rank1.tres create mode 100644 game/data/auras/12_aspect_of_wolves_rank_1.tres create mode 100644 game/data/auras/13_aspect_of_bees_rank_1.tres create mode 100644 game/data/auras/14_rejuvenation_rank_1.tres create mode 100644 game/data/auras/15_close_wounds_rank_1.tres create mode 100644 game/data/auras/16_ironbark_rank_1.tres create mode 100644 game/data/auras/17_natures_swiftness_rank_1.tres create mode 100644 game/data/auras/1_test1.tres create mode 100644 game/data/auras/20_root_rank_1.tres create mode 100644 game/data/auras/21_aspect_of_scorpions.tres create mode 100644 game/data/auras/22_aspect_of_wasps.tres create mode 100644 game/data/auras/23_aspect_of_wolves.tres create mode 100644 game/data/auras/24_aspect_of_bees.tres create mode 100644 game/data/biomes/1_test.tres create mode 100644 game/data/biomes/2_tdungb.tres create mode 100644 game/data/character_specs/1_test.tres create mode 100644 game/data/character_specs/2_elementalist_fire.tres create mode 100644 game/data/character_specs/3_elementalist_water.tres create mode 100644 game/data/character_specs/4_elementalist_ice.tres create mode 100644 game/data/crafting/1_test_craft.tres create mode 100644 game/data/crafting/2_chest_of_the_infinite_wisdom.tres create mode 100644 game/data/cursors/arrow.png create mode 100644 game/data/cursors/arrow.png.import create mode 100644 game/data/cursors/arrow16.png create mode 100644 game/data/cursors/arrow16.png.import create mode 100644 game/data/cursors/arrow32.png create mode 100644 game/data/cursors/arrow32.png.import create mode 100644 game/data/cursors/arrow8.png create mode 100644 game/data/cursors/arrow8.png.import create mode 100644 game/data/cursors/attack16.png create mode 100644 game/data/cursors/attack16.png.import create mode 100644 game/data/cursors/drag_drop.png create mode 100644 game/data/cursors/drag_drop.png.import create mode 100644 game/data/cursors/forbidden.png create mode 100644 game/data/cursors/forbidden.png.import create mode 100644 game/data/cursors/ibeam.png create mode 100644 game/data/cursors/ibeam.png.import create mode 100644 game/data/cursors/loot16.png create mode 100644 game/data/cursors/loot16.png.import create mode 100644 game/data/cursors/speak.png create mode 100644 game/data/cursors/speak.png.import create mode 100644 game/data/dungeon_rooms/1_test.tres create mode 100644 game/data/dungeon_rooms/2_test_start_room.tres create mode 100644 game/data/dungeons/1_test.tres create mode 100644 game/data/effect_data/aspect_of_scorpions.tres create mode 100644 game/data/effect_data/natures_swiftness.tres create mode 100644 game/data/entities/1_naturalist.tres create mode 100644 game/data/entity_classes/1_naturalist.tres create mode 100644 game/data/entity_classes/2_elementalist.tres create mode 100644 game/data/entity_resources/1_mana_resource.tres create mode 100644 game/data/entity_skills/1_test.tres create mode 100644 game/data/environments/default_env.tres create mode 100644 game/data/fonts/OFL.txt create mode 100644 game/data/fonts/VT323-Regular.ttf create mode 100644 game/data/icons/3_iron_bar.tres create mode 100644 game/data/icons/4_chest_of_the_infinite_wisdom.tres create mode 100644 game/data/icons/icons-1/11.png create mode 100644 game/data/icons/icons-1/11.png.import create mode 100644 game/data/icons/icons-1/43.png create mode 100644 game/data/icons/icons-1/43.png.import create mode 100644 game/data/icons/icons-1/5.png create mode 100644 game/data/icons/icons-1/5.png.import create mode 100644 game/data/icons/icons-1/61.png create mode 100644 game/data/icons/icons-1/61.png.import create mode 100644 game/data/icons/icons-1/Readme.txt create mode 100644 game/data/icons/icons-2/README.txt create mode 100644 game/data/icons/icons-2/enchant-acid-2.png create mode 100644 game/data/icons/icons-2/enchant-acid-2.png.import create mode 100644 game/data/icons/icons-2/enchant-blue-2.png create mode 100644 game/data/icons/icons-2/enchant-blue-2.png.import create mode 100644 game/data/icons/icons-2/heal-jade-2.png create mode 100644 game/data/icons/icons-2/heal-jade-2.png.import create mode 100644 game/data/icons/icons-2/protect-acid-3.png create mode 100644 game/data/icons/icons-2/protect-acid-3.png.import create mode 100644 game/data/icons/icons-2/protect-eerie-2.png create mode 100644 game/data/icons/icons-2/protect-eerie-2.png.import create mode 100644 game/data/icons/icons-3/README.txt create mode 100644 game/data/icons/icons-3/beam-jade-2.png create mode 100644 game/data/icons/icons-3/beam-jade-2.png.import create mode 100644 game/data/icons/icons-3/haste-royal-2.png create mode 100644 game/data/icons/icons-3/haste-royal-2.png.import create mode 100644 game/data/icons/icons-3/lighting-acid-2.png create mode 100644 game/data/icons/icons-3/lighting-acid-2.png.import create mode 100644 game/data/icons/icons-3/vines-plain-1.png create mode 100644 game/data/icons/icons-3/vines-plain-1.png.import create mode 100644 game/data/icons/icons-3/vines-plain-2.png create mode 100644 game/data/icons/icons-3/vines-plain-2.png.import create mode 100644 game/data/icons/icons-4/README.txt create mode 100644 game/data/icons/icons-4/explosion-royal-2.png create mode 100644 game/data/icons/icons-4/explosion-royal-2.png.import create mode 100644 game/data/icons/icons-4/horror-acid-3.png create mode 100644 game/data/icons/icons-4/horror-acid-3.png.import create mode 100644 game/data/icons/icons-4/leaf-acid-1.png create mode 100644 game/data/icons/icons-4/leaf-acid-1.png.import create mode 100644 game/data/icons/icons-4/wild-orange-2.png create mode 100644 game/data/icons/icons-4/wild-orange-2.png.import create mode 100644 game/data/icons/icons-4/wind-blue-1.png create mode 100644 game/data/icons/icons-4/wind-blue-1.png.import create mode 100644 game/data/icons/icons-5/README.txt create mode 100644 game/data/icons/icons-5/wind-grasp-acid-2.png create mode 100644 game/data/icons/icons-5/wind-grasp-acid-2.png.import create mode 100644 game/data/icons/icons-5/wind-grasp-eerie-2.png create mode 100644 game/data/icons/icons-5/wind-grasp-eerie-2.png.import create mode 100644 game/data/icons/icons.png create mode 100644 game/data/icons/icons.png.import create mode 100644 game/data/icons/items/gold.tres create mode 100644 game/data/icons/naturalist/amplify_pain.tres create mode 100644 game/data/icons/naturalist/aspect_of_bees.tres create mode 100644 game/data/icons/naturalist/aspect_of_scorpions.tres create mode 100644 game/data/icons/naturalist/aspect_of_wasps.tres create mode 100644 game/data/icons/naturalist/aspect_of_wolves.tres create mode 100644 game/data/icons/naturalist/attunement.tres create mode 100644 game/data/icons/naturalist/calm.tres create mode 100644 game/data/icons/naturalist/close_wounds.tres create mode 100644 game/data/icons/naturalist/first_aid.tres create mode 100644 game/data/icons/naturalist/inner_will.tres create mode 100644 game/data/icons/naturalist/ironbark.tres create mode 100644 game/data/icons/naturalist/natures_swiftness.tres create mode 100644 game/data/icons/naturalist/regenerate.tres create mode 100644 game/data/icons/naturalist/rejuvenation.tres create mode 100644 game/data/icons/naturalist/root.tres create mode 100644 game/data/icons/naturalist/shield_of_barbs.tres create mode 100644 game/data/icons/naturalist/strength_of_nature.tres create mode 100644 game/data/icons/naturalist/test.tres create mode 100644 game/data/icons/naturalist/uproot.tres create mode 100644 game/data/item_templates/1_gold.tres create mode 100644 game/data/item_templates/2_test.tres create mode 100644 game/data/item_templates/3_chest_of_the_infinite_wisdom.tres create mode 100644 game/data/planets/1_test.tres create mode 100644 game/data/planets/2_tdungeon.tres create mode 100644 game/data/player_character_data/1_naturalist.tres create mode 100644 game/data/spell_effects/textures/arrows.png create mode 100644 game/data/spell_effects/textures/arrows.png.import create mode 100644 game/data/spell_effects/textures/big_glow.png create mode 100644 game/data/spell_effects/textures/big_glow.png.import create mode 100644 game/data/spell_effects/textures/main_texture.png create mode 100644 game/data/spell_effects/textures/main_texture.png.import create mode 100644 game/data/spell_effects/textures/small_star.png create mode 100644 game/data/spell_effects/textures/small_star.png.import create mode 100644 game/data/spell_effects/textures/star.png create mode 100644 game/data/spell_effects/textures/star.png.import create mode 100644 game/data/spells/10_aspect_of_scorpions_rank_1.tres create mode 100644 game/data/spells/11_aspect_of_wasps_rank_1.tres create mode 100644 game/data/spells/12_aspect_of_wolves_rank_1.tres create mode 100644 game/data/spells/13_aspect_of_bees_rank_1.tres create mode 100644 game/data/spells/14_amplify_pain_rank_1.tres create mode 100644 game/data/spells/15_rejuvenation_rank_1.tres create mode 100644 game/data/spells/16_close_wounds_rank_1.tres create mode 100644 game/data/spells/17_ironbark_rank_1.tres create mode 100644 game/data/spells/18_natures_swiftness_rank_1.tres create mode 100644 game/data/spells/19_uproot_rank_1.tres create mode 100644 game/data/spells/1_test_spell.tres create mode 100644 game/data/spells/20_root_rank_1.tres create mode 100644 game/data/spells/21_strength_of_nature_rank_1.tres create mode 100644 game/data/spells/22_shield_of_barbs_rank_1.tres create mode 100644 game/data/spells/23_calm_rank_1.tres create mode 100644 game/data/spells/24_attunement_rank_1.tres create mode 100644 game/data/spells/25_inner_will.tres create mode 100644 game/data/spells/26_rest.tres create mode 100644 game/data/spells/27_aspect_of_scorpions.tres create mode 100644 game/data/spells/28_aspectofwasps.tres create mode 100644 game/data/spells/29_aspect_of_wolves.tres create mode 100644 game/data/spells/2_test_cast_spell.tres create mode 100644 game/data/spells/30_aspect_of_bees.tres create mode 100644 game/data/spells/31_overload.tres create mode 100644 game/data/spells/32_heat.tres create mode 100644 game/data/spells/33_normal.tres create mode 100644 game/data/spells/34_cold.tres create mode 100644 game/data/world_spells/1_testwp.tres create mode 100644 game/data/xp/xp_data.tres create mode 100644 game/default_bus_layout.tres create mode 100644 game/dungeon_generator/DungeonGeneratorScene.gd create mode 100644 game/dungeon_generator/DungeonGeneratorScene.tscn create mode 100644 game/dungeon_generator/MainDungeonGenerator.gd create mode 100644 game/dungeon_generator/Room.gd create mode 100644 game/dungeon_generator/Room.tscn create mode 100644 game/dungeon_generator/old_voxelmanlevelgenerator.tres create mode 100644 game/icon.png create mode 100644 game/icon.png.flags create mode 100644 game/icon.png.import create mode 100644 game/menu/CharacterEntry.gd create mode 100644 game/menu/CharacterEntry.tscn create mode 100644 game/menu/character_creation_button_group.tres create mode 100644 game/menu/menu_character_button_group.tres create mode 100644 game/networking/PlayerMaster.gd create mode 100644 game/networking/SpawnPoint.gd create mode 100644 game/player/CameraPivot.gd create mode 100644 game/player/CharacterSkeletonAttachPoint.gd create mode 100644 game/player/CharacterSkeletonGD.gd create mode 100644 game/player/DisplayEntity.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/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/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.tscn create mode 100644 game/scripts/ai/EntityAIGD.gd create mode 100644 game/scripts/auras/aura_script.gd create mode 100644 game/scripts/biomes/simple_biome.gd create mode 100644 game/scripts/dungeon_start_rooms/start_room.gd create mode 100644 game/scripts/dungeons/dungeon.gd create mode 100644 game/scripts/entities/EntityClassDataGD.gd create mode 100644 game/scripts/entities/EntityDataGD.gd create mode 100644 game/scripts/items/ItemTemplateGD.gd create mode 100644 game/scripts/planets/dung_simple_planet.gd create mode 100644 game/scripts/planets/simple_planet.gd create mode 100644 game/scripts/projectiles/WorldSpellGD.gd create mode 100644 game/scripts/resources/ManResource.gd create mode 100644 game/scripts/resources/ManaResourceData.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/world_generators/MainPlanetGenerator.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/EditorKeybindSetup.gd 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/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/EquipmentSlot.gd create mode 100644 game/ui/bags/EquipmentSlot.tscn create mode 100644 game/ui/bags/InventoryGUI.gd create mode 100644 game/ui/bags/ItemPupop.gd create mode 100644 game/ui/bags/weapon_set_button_group.tres create mode 100644 game/ui/buttons/Buttons.gd create mode 100644 game/ui/castbar/Castbar.gd create mode 100644 game/ui/castbar/Castbar.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/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/ingame_menu/ExitButton.gd create mode 100644 game/ui/ingame_menu/IngameMenu.tscn 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/map/Map.tscn 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/OptionCheckBox.gd create mode 100644 game/ui/options/OptionRow.gd create mode 100644 game/ui/options/Options.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/SpellEntryPopup.gd 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/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/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/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/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_highlight.tres create mode 100644 game/ui/theme/scrollbar_grabber_pressed.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/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_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/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/windows/CharacterWindow.tscn create mode 100644 game/ui/windows/CraftItemDescription.gd create mode 100644 game/ui/windows/CraftingWindow.gd create mode 100644 game/ui/windows/CraftingWindow.tscn create mode 100644 game/ui/windows/InventoryWindow.tscn create mode 100644 game/ui/windows/SpellBookWindow.gd create mode 100644 game/ui/windows/SpellBookWindow.tscn create mode 100644 game/ui/windows/SpellContainer.gd create mode 100644 game/ui/windows/SpellContainer.tscn create mode 100644 game/ui/windows/SpellDragAndDropSpellBook.gd create mode 100644 game/ui/windows/TalentWindow.gd create mode 100644 game/ui/windows/TalentWindow.tscn create mode 100644 game/ui/windows/VBoxContainer.gd create mode 100644 game/ui/windows/base/BaseWindow.tscn create mode 100644 game/ui/windows/base/PagedContentContainer.tscn create mode 100644 game/ui/windows/base/ScrollContainer.tscn create mode 100644 game/ui/windows/inventory/ItemEntry.tscn 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/autoload/CursorManager.gd b/game/autoload/CursorManager.gd new file mode 100644 index 0000000..585e0ca --- /dev/null +++ b/game/autoload/CursorManager.gd @@ -0,0 +1,28 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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/autoload/CursorManager.tscn b/game/autoload/CursorManager.tscn new file mode 100644 index 0000000..ae87593 --- /dev/null +++ b/game/autoload/CursorManager.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://autoload/CursorManager.gd" type="Script" id=1] +[ext_resource path="res://data/cursors/arrow16.png" type="Texture" id=2] +[ext_resource path="res://data/cursors/loot16.png" type="Texture" id=3] +[ext_resource path="res://data/cursors/attack16.png" type="Texture" id=4] +[ext_resource path="res://data/cursors/speak.png" type="Texture" id=5] +[ext_resource path="res://data/cursors/drag_drop.png" type="Texture" id=6] +[ext_resource path="res://data/cursors/forbidden.png" type="Texture" id=7] +[ext_resource path="res://data/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/autoload/EntityDataManager.gd b/game/autoload/EntityDataManager.gd new file mode 100644 index 0000000..1004472 --- /dev/null +++ b/game/autoload/EntityDataManager.gd @@ -0,0 +1,375 @@ +extends Node + +# 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(PackedScene) var player_scene : PackedScene +export(PackedScene) var networked_player_scene : PackedScene +export(PackedScene) var mob_scene : PackedScene +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 + +var _players : Array +var _mobs : Array + +func _ready(): + _spawn_parent = get_node(spawn_parent_path) + +# 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 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) -> void: +# print("recspawnfor " + global_name) + var entity : Entity = networked_player_scene.instance() + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + entity.name = str(global_name) + entity.from_dict(parse_json(data)) + + entity.translation = position + + Logger.info("Player spawned ") + + _players.append(entity) + +remote func creceive_despawn_for(path : NodePath) -> void: +# print("recdespawnfor " + path) + var ent = get_node_or_null(path) + + if ent: + ent.queue_free() + +func spawn_networked_player_from_data(data : String, position : Vector3, network_owner : int) -> Entity: + var entity : Entity = networked_player_scene.instance() + + _next_entity_guid += 1 + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + entity.name = str(network_owner) + entity.from_dict(parse_json(data)) + + entity.set_network_master(network_owner) + entity.translation = position + + Logger.info("Player spawned ") + + _players.append(entity) + + rpc_id(network_owner, "spawn_owned_player", data, position) + + return entity + +puppet func spawn_owned_player(data : String, position : Vector3) -> void: + var entity : Entity = player_scene.instance() + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + + entity.from_dict(parse_json(data)) + entity.name = str(multiplayer.get_network_unique_id()) + entity.translation = position + entity.set_network_master(multiplayer.get_network_unique_id()) + + Logger.info("Player spawned ") + + +func load_player(file_name : String, position : Vector3, network_owner : int) -> Entity: +# var createinfo : EntityCreateInfo = EntityCreateInfo.new() +# +# var cls : EntityData = Entities.get_player_character_data(class_id) +# +# var class_profile : ClassProfile = Profiles.get_class_profile(class_id) +# +# createinfo.entity_data = cls +# createinfo.player_name = name +# createinfo.level = class_profile.level +# createinfo.xp = class_profile.xp +# createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = player_scene.instance() + + _next_entity_guid += 1 + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + + entity.from_dict(load_file(file_name)) + + entity.translation = position +# entity.initialize(createinfo) + entity.set_network_master(network_owner) + + Logger.info("Player spawned ") + + _players.append(entity) + + return entity + +func spawn_display_player(name : String) -> Entity: + var entity : Entity = player_display_scene.instance() as Entity + + entity.name = name + + Logger.info("Player Display spawned") + + return entity + +func spawn_player_for_menu(class_id : int, name : String, parent : Node) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + var cls : EntityData = Entities.get_player_character_data(class_id) + var class_profile : ClassProfile = Profiles.get_class_profile(class_id) + + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = 1 + createinfo.xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = player_display_scene.instance() as Entity + entity.initialize(createinfo) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + parent.add_child(entity) + entity.owner = parent + + return 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 = Entities.get_entity_data(class_id) + + var class_profile : ClassProfile = Profiles.get_class_profile(class_id) + + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = 1 + createinfo.xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = spawn(createinfo, true, position, node_name) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + if get_tree().is_network_server(): + entity.set_network_master(sid) + + Logger.info("Player spawned " + str(createinfo)) + + _players.append(entity) + + return 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 = Entities.get_player_character_data(class_id) + + var class_profile : ClassProfile = Profiles.get_class_profile(class_id) + + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = 1 + createinfo.xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = spawn(createinfo, false, position, node_name) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + entity.set_network_master(network_owner) + + Logger.info("Player spawned " + str(createinfo)) + + _players.append(entity) + + return entity + +func spawn_mob(class_id : int, level : int, position : Vector3) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + var cls : EntityData = Entities.get_entity_data(class_id) + + if cls == null: + print("clsnull") + + createinfo.entity_data = cls + createinfo.player_name = "Mob" + createinfo.level = 1 + + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_AI + + var entity : Entity = spawn(createinfo, false, position) + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + Logger.info("Mob spawned " + str(createinfo)) + + _mobs.append(entity) + + return entity + +func spawn(createinfo : EntityCreateInfo, networked : bool, position : Vector3, node_name : String = "") -> Entity: + var entity_node : Entity = null + + if not networked: + if createinfo.entity_controller == EntityEnums.ENITIY_CONTROLLER_PLAYER: + entity_node = player_scene.instance() + else: + entity_node = mob_scene.instance() + else: + entity_node = networked_player_scene.instance() + + if entity_node == null: + print("EntityManager: entity node is null") + return null + + if node_name == "": + entity_node.name += "_" + str(_next_entity_guid) + else: + entity_node.name = node_name + + _next_entity_guid += 1 + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity_node) + entity_node.owner = spawn_parent + + entity_node.translation = position + + entity_node.initialize(createinfo) + + return 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 != "": + Logger.error("Save corrupted! " + file_name) + Logger.error(json_err) + return Dictionary() + + var p = parse_json(st) + + if typeof(p) != TYPE_DICTIONARY: + Logger.error("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/autoload/EntityDataManager.tscn b/game/autoload/EntityDataManager.tscn new file mode 100644 index 0000000..2404c92 --- /dev/null +++ b/game/autoload/EntityDataManager.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://autoload/EntityDataManager.gd" type="Script" id=1] +[ext_resource path="res://player/NetworkedPlayer.tscn" type="PackedScene" id=2] +[ext_resource path="res://player/Player.tscn" type="PackedScene" id=3] +[ext_resource path="res://player/Mob.tscn" type="PackedScene" id=4] +[ext_resource path="res://player/DisplayPlayer.tscn" type="PackedScene" id=5] + +[node name="EntityDataManager" type="EntityDataManager"] +xp_data_path = "res://data/xp/xp_data.tres" +entity_resources_folder = "res://data/entity_resources" +entity_skills_folder = "res://data/entity_skills" +entity_datas_folder = "res://data/entities" +spells_folder = "res://data/spells" +auras_folder = "res://data/auras" +world_spell_datas_folder = "res://data/world_spells" +craft_data_folder = "res://data/crafting" +item_template_folder = "res://data/item_templates" +mob_data_folder = "res://data/mob_data" +player_character_data_folder = "res://data/player_character_data" +script = ExtResource( 1 ) +player_scene = ExtResource( 3 ) +networked_player_scene = ExtResource( 2 ) +mob_scene = ExtResource( 4 ) +player_display_scene = ExtResource( 5 ) +default_level_override = 50 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/ProfileManager.gd b/game/autoload/ProfileManager.gd new file mode 100644 index 0000000..c499b04 --- /dev/null +++ b/game/autoload/ProfileManager.gd @@ -0,0 +1,85 @@ +extends ProfileManager + +# 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 save_interval : float = 20 +#var last_save_time : float = 0 + +func _ready(): + var save_game : File = File.new() + + if save_game.file_exists("user://profile.save"): + load_full() + else: + load_defaults() + + 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) + + +func _save() -> void: + save_full() + +func _load() -> void: + load_full() + +func save_full() -> void: + var save_game = File.new() + + save_game.open("user://profile.save", File.WRITE) + + save_game.store_line(to_json(to_dict())) + + save_game.close() + +func load_full() -> void: + clear_class_profiles() + + var save_game : File = File.new() + + if save_game.file_exists("user://profile.save"): + if save_game.open("user://profile.save", File.READ) == OK: + + var text : String = save_game.get_as_text() + + if text == "": + load_defaults() + return + + var save_json : Dictionary = parse_json(text) + + from_dict(save_json) + diff --git a/game/autoload/ProfileManager.tscn b/game/autoload/ProfileManager.tscn new file mode 100644 index 0000000..1d2cc57 --- /dev/null +++ b/game/autoload/ProfileManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/ProfileManager.gd" type="Script" id=1] + +[node name="ProfileManager" type="ProfileManager"] +script = ExtResource( 1 ) diff --git a/game/autoload/Server.gd b/game/autoload/Server.gd new file mode 100644 index 0000000..bb7122f --- /dev/null +++ b/game/autoload/Server.gd @@ -0,0 +1,203 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 = Entities.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 = Entities.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: + Entities.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 : Spatial = get_node("/root/GameScene/VoxelWorld") + + terrarin.set_player(local_player_master.player as Node2D) 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/autoload/SettingsManager.gd b/game/autoload/SettingsManager.gd new file mode 100644 index 0000000..10f99d4 --- /dev/null +++ b/game/autoload/SettingsManager.gd @@ -0,0 +1,63 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +signal setting_changed(section, key, value) + +const SAVE_PATH : String = "user://settings.cfg" + +var _config_file : ConfigFile = ConfigFile.new() +var _settings : Dictionary = { + "rendering" : { + "thread_model" : ProjectSettings.get("rendering/threads/thread_model") + }, + "debug" : { + "debug_info" : false + } +} + +func _ready(): + load_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])) + + +func set_rendering_thread_model(value : int) -> void: + ProjectSettings.set("rendering/threads/thread_model", value) diff --git a/game/autoload/SettingsManager.tscn b/game/autoload/SettingsManager.tscn new file mode 100644 index 0000000..8e95a7d --- /dev/null +++ b/game/autoload/SettingsManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/SettingsManager.gd" type="Script" id=1] + +[node name="SettingsManager" type="Node"] +script = ExtResource( 1 ) diff --git a/game/autoload/ThemeAtlas.gd b/game/autoload/ThemeAtlas.gd new file mode 100644 index 0000000..9ff5cf0 --- /dev/null +++ b/game/autoload/ThemeAtlas.gd @@ -0,0 +1,14 @@ +extends TextureMerger + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +#func _texture_added(texture): +# print("added") +# +#func _texture_removed(): +# print("removed") + +func _texture_merged(): + $Sprite.texture = get_generated_texture(0) diff --git a/game/autoload/ThemeAtlas.tscn b/game/autoload/ThemeAtlas.tscn new file mode 100644 index 0000000..1f171c9 --- /dev/null +++ b/game/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/autoload/WorldNumbers.gd b/game/autoload/WorldNumbers.gd new file mode 100644 index 0000000..71e199a --- /dev/null +++ b/game/autoload/WorldNumbers.gd @@ -0,0 +1,36 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 + + 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/autoload/WorldNumbers.tscn b/game/autoload/WorldNumbers.tscn new file mode 100644 index 0000000..7037d13 --- /dev/null +++ b/game/autoload/WorldNumbers.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://autoload/WorldNumbers.gd" type="Script" id=1] +[ext_resource path="res://ui/numbers/Number.tscn" type="PackedScene" id=2] + +[node name="WorldNumbers" type="Node"] +script = ExtResource( 1 ) +number_scene = ExtResource( 2 ) diff --git a/game/data/aura_groups/1_aspect_of_scorpions.tres b/game/data/aura_groups/1_aspect_of_scorpions.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/1_aspect_of_scorpions.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/aura_groups/2_aspect_of_wasps.tres b/game/data/aura_groups/2_aspect_of_wasps.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/2_aspect_of_wasps.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/aura_groups/3_aspect_of_wolves.tres b/game/data/aura_groups/3_aspect_of_wolves.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/3_aspect_of_wolves.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/aura_groups/4_aspect_of_bees.tres b/game/data/aura_groups/4_aspect_of_bees.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/4_aspect_of_bees.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/auras/10_aspect_of_scorpions_rank_1.tres b/game/data/auras/10_aspect_of_scorpions_rank_1.tres new file mode 100644 index 0000000..581d101 --- /dev/null +++ b/game/data/auras/10_aspect_of_scorpions_rank_1.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://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/1_aspect_of_scorpions.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Scorpions" +id = 10 +icon = ExtResource( 2 ) +time = 30.0 +tick = 3.0 +debuff = true +rank = 10 +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 = 340 +damage_max = 355 +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/data/auras/11_aspect_of_wasps_rank1.tres b/game/data/auras/11_aspect_of_wasps_rank1.tres new file mode 100644 index 0000000..7e37377 --- /dev/null +++ b/game/data/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://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/2_aspect_of_wasps.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 11 +icon = ExtResource( 2 ) +time = 21.0 +tick = 1.0 +debuff = true +rank = 10 +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 = 280 +damage_max = 300 +script = ExtResource( 1 ) diff --git a/game/data/auras/12_aspect_of_wolves_rank_1.tres b/game/data/auras/12_aspect_of_wolves_rank_1.tres new file mode 100644 index 0000000..20c8de4 --- /dev/null +++ b/game/data/auras/12_aspect_of_wolves_rank_1.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://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/3_aspect_of_wolves.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 12 +icon = ExtResource( 2 ) +time = 22.0 +tick = 2.0 +debuff = true +rank = 10 +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 = 280 +damage_max = 330 +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/data/auras/13_aspect_of_bees_rank_1.tres b/game/data/auras/13_aspect_of_bees_rank_1.tres new file mode 100644 index 0000000..ae28d31 --- /dev/null +++ b/game/data/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://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/4_aspect_of_bees.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 13 +icon = ExtResource( 2 ) +time = 21.0 +tick = 3.0 +debuff = true +rank = 10 +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 = 420 +damage_max = 440 +script = ExtResource( 1 ) diff --git a/game/data/auras/14_rejuvenation_rank_1.tres b/game/data/auras/14_rejuvenation_rank_1.tres new file mode 100644 index 0000000..4dbb84b --- /dev/null +++ b/game/data/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://data/icons/naturalist/rejuvenation.tres" type="Texture" id=2] + +[resource] +resource_name = "Rejuvenation" +id = 14 +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/data/auras/15_close_wounds_rank_1.tres b/game/data/auras/15_close_wounds_rank_1.tres new file mode 100644 index 0000000..f4c0159 --- /dev/null +++ b/game/data/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://data/icons/naturalist/close_wounds.tres" type="Texture" id=2] + +[resource] +resource_name = "Close Wounds" +id = 15 +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/data/auras/16_ironbark_rank_1.tres b/game/data/auras/16_ironbark_rank_1.tres new file mode 100644 index 0000000..a5f2775 --- /dev/null +++ b/game/data/auras/16_ironbark_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://data/icons/naturalist/ironbark.tres" type="Texture" id=2] + +[resource] +resource_name = "Ironbark" +id = 16 +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." +attribute_count = 1 +StatModAttribute_0/stat = 24 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = -70.0 +script = ExtResource( 1 ) diff --git a/game/data/auras/17_natures_swiftness_rank_1.tres b/game/data/auras/17_natures_swiftness_rank_1.tres new file mode 100644 index 0000000..416d1bc --- /dev/null +++ b/game/data/auras/17_natures_swiftness_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://data/icons/naturalist/natures_swiftness.tres" type="Texture" id=1] +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=2] +[ext_resource path="res://data/effect_data/natures_swiftness.tres" type="SpellEffectVisual" id=3] + +[resource] +resource_name = "Nature's Swiftness" +id = 17 +icon = ExtResource( 1 ) +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( 3 ) +attribute_count = 1 +StatModAttribute_0/stat = 1 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = 60.0 +script = ExtResource( 2 ) diff --git a/game/data/auras/1_test1.tres b/game/data/auras/1_test1.tres new file mode 100644 index 0000000..25d72d0 --- /dev/null +++ b/game/data/auras/1_test1.tres @@ -0,0 +1,11 @@ +[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://data/icons/naturalist/amplify_pain.tres" type="Texture" id=2] + +[resource] +id = 1 +icon = ExtResource( 2 ) +aura_type = 1 +text_description = "Test" +script = ExtResource( 1 ) diff --git a/game/data/auras/20_root_rank_1.tres b/game/data/auras/20_root_rank_1.tres new file mode 100644 index 0000000..c884450 --- /dev/null +++ b/game/data/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://data/icons/naturalist/root.tres" type="Texture" id=2] + +[resource] +id = 20 +icon = ExtResource( 2 ) +time = 10.0 +debuff = true +aura_type = 1 +states_add = 4 +script = ExtResource( 1 ) diff --git a/game/data/auras/21_aspect_of_scorpions.tres b/game/data/auras/21_aspect_of_scorpions.tres new file mode 100644 index 0000000..fe955e4 --- /dev/null +++ b/game/data/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://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/1_aspect_of_scorpions.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Scorpions" +id = 21 +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/data/auras/22_aspect_of_wasps.tres b/game/data/auras/22_aspect_of_wasps.tres new file mode 100644 index 0000000..5a2085e --- /dev/null +++ b/game/data/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://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/2_aspect_of_wasps.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 22 +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/data/auras/23_aspect_of_wolves.tres b/game/data/auras/23_aspect_of_wolves.tres new file mode 100644 index 0000000..862b504 --- /dev/null +++ b/game/data/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://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/3_aspect_of_wolves.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 23 +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/data/auras/24_aspect_of_bees.tres b/game/data/auras/24_aspect_of_bees.tres new file mode 100644 index 0000000..5e8160d --- /dev/null +++ b/game/data/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://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/4_aspect_of_bees.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 24 +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/data/biomes/1_test.tres b/game/data/biomes/1_test.tres new file mode 100644 index 0000000..dfbcdca --- /dev/null +++ b/game/data/biomes/1_test.tres @@ -0,0 +1,7 @@ +[gd_resource type="BiomeData" load_steps=2 format=2] + +[ext_resource path="res://scripts/biomes/simple_biome.gd" type="Script" id=1] + +[resource] +target_script = ExtResource( 1 ) +voxel_surfaces = [ null, null, null, null ] diff --git a/game/data/biomes/2_tdungb.tres b/game/data/biomes/2_tdungb.tres new file mode 100644 index 0000000..d1f6642 --- /dev/null +++ b/game/data/biomes/2_tdungb.tres @@ -0,0 +1,9 @@ +[gd_resource type="BiomeData" load_steps=3 format=2] + +[ext_resource path="res://scripts/biomes/simple_biome.gd" type="Script" id=1] +[ext_resource path="res://data/dungeons/1_test.tres" type="DungeonData" id=2] + +[resource] +target_script = ExtResource( 1 ) +dungeon_datas = [ ExtResource( 2 ) ] +voxel_surfaces = [ null, null, null, null ] diff --git a/game/data/character_specs/1_test.tres b/game/data/character_specs/1_test.tres new file mode 100644 index 0000000..569f57a --- /dev/null +++ b/game/data/character_specs/1_test.tres @@ -0,0 +1,3 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] diff --git a/game/data/character_specs/2_elementalist_fire.tres b/game/data/character_specs/2_elementalist_fire.tres new file mode 100644 index 0000000..759368f --- /dev/null +++ b/game/data/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/data/character_specs/3_elementalist_water.tres b/game/data/character_specs/3_elementalist_water.tres new file mode 100644 index 0000000..44ccb22 --- /dev/null +++ b/game/data/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/data/character_specs/4_elementalist_ice.tres b/game/data/character_specs/4_elementalist_ice.tres new file mode 100644 index 0000000..8a517e5 --- /dev/null +++ b/game/data/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/data/crafting/1_test_craft.tres b/game/data/crafting/1_test_craft.tres new file mode 100644 index 0000000..94f0602 --- /dev/null +++ b/game/data/crafting/1_test_craft.tres @@ -0,0 +1,36 @@ +[gd_resource type="CraftRecipe" load_steps=8 format=2] + +[ext_resource path="res://data/item_templates/2_test.tres" type="ItemTemplate" id=1] +[ext_resource path="res://data/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/data/crafting/2_chest_of_the_infinite_wisdom.tres b/game/data/crafting/2_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..0a2e4a4 --- /dev/null +++ b/game/data/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://data/item_templates/3_chest_of_the_infinite_wisdom.tres" type="ItemTemplate" id=1] +[ext_resource path="res://data/item_templates/2_test.tres" type="ItemTemplate" id=2] + +[sub_resource type="CraftRecipeHelper" id=1] +item = ExtResource( 2 ) +count = 1 + +[sub_resource type="CraftRecipeHelper" id=2] +item = ExtResource( 1 ) +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/data/cursors/arrow.png b/game/data/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/data/cursors/arrow32.png.import b/game/data/cursors/arrow32.png.import new file mode 100644 index 0000000..f5a1d2c --- /dev/null +++ b/game/data/cursors/arrow32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow32.png-be6fa5cda55ea381f4bb81ac68755fdf.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/arrow32.png" +dest_files=[ "res://.import/arrow32.png-be6fa5cda55ea381f4bb81ac68755fdf.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/data/cursors/arrow8.png b/game/data/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/data/cursors/attack16.png.import b/game/data/cursors/attack16.png.import new file mode 100644 index 0000000..15c3e51 --- /dev/null +++ b/game/data/cursors/attack16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/attack16.png-7ed84a4c029e562bb79e6820694ed73a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/attack16.png" +dest_files=[ "res://.import/attack16.png-7ed84a4c029e562bb79e6820694ed73a.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/data/cursors/drag_drop.png b/game/data/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/data/cursors/ibeam.png.import b/game/data/cursors/ibeam.png.import new file mode 100644 index 0000000..562a700 --- /dev/null +++ b/game/data/cursors/ibeam.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ibeam.png-2c9af42df231350813f1688b4c7338a8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/ibeam.png" +dest_files=[ "res://.import/ibeam.png-2c9af42df231350813f1688b4c7338a8.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/data/cursors/loot16.png b/game/data/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/data/cursors/loot16.png.import b/game/data/cursors/loot16.png.import new file mode 100644 index 0000000..d0330b1 --- /dev/null +++ b/game/data/cursors/loot16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/loot16.png-726ee829901668bed967b88a77b79dca.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/loot16.png" +dest_files=[ "res://.import/loot16.png-726ee829901668bed967b88a77b79dca.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/data/cursors/speak.png b/game/data/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/data/cursors/speak.png.import b/game/data/cursors/speak.png.import new file mode 100644 index 0000000..da790b3 --- /dev/null +++ b/game/data/cursors/speak.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/speak.png-4f28d4f817d13bbd186e0ad861f71a83.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/speak.png" +dest_files=[ "res://.import/speak.png-4f28d4f817d13bbd186e0ad861f71a83.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/data/dungeon_rooms/1_test.tres b/game/data/dungeon_rooms/1_test.tres new file mode 100644 index 0000000..816db79 --- /dev/null +++ b/game/data/dungeon_rooms/1_test.tres @@ -0,0 +1,3 @@ +[gd_resource type="DungeonRoomData" format=2] + +[resource] diff --git a/game/data/dungeon_rooms/2_test_start_room.tres b/game/data/dungeon_rooms/2_test_start_room.tres new file mode 100644 index 0000000..bb0fe8f --- /dev/null +++ b/game/data/dungeon_rooms/2_test_start_room.tres @@ -0,0 +1,6 @@ +[gd_resource type="DungeonRoomData" load_steps=2 format=2] + +[ext_resource path="res://scripts/dungeon_start_rooms/start_room.gd" type="Script" id=1] + +[resource] +target_script = ExtResource( 1 ) diff --git a/game/data/dungeons/1_test.tres b/game/data/dungeons/1_test.tres new file mode 100644 index 0000000..b3dfbff --- /dev/null +++ b/game/data/dungeons/1_test.tres @@ -0,0 +1,8 @@ +[gd_resource type="DungeonData" load_steps=3 format=2] + +[ext_resource path="res://scripts/dungeons/dungeon.gd" type="Script" id=1] +[ext_resource path="res://data/dungeon_rooms/2_test_start_room.tres" type="DungeonRoomData" id=2] + +[resource] +target_script = ExtResource( 1 ) +dungeon_start_room_datas = [ ExtResource( 2 ) ] diff --git a/game/data/effect_data/aspect_of_scorpions.tres b/game/data/effect_data/aspect_of_scorpions.tres new file mode 100644 index 0000000..2374e69 --- /dev/null +++ b/game/data/effect_data/aspect_of_scorpions.tres @@ -0,0 +1,10 @@ +[gd_resource type="SpellEffectVisual" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=1] + +[resource] +script = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect_time = 4.0 +root_spell_cast_finish_effect_time = 1.0 diff --git a/game/data/effect_data/natures_swiftness.tres b/game/data/effect_data/natures_swiftness.tres new file mode 100644 index 0000000..6d0c851 --- /dev/null +++ b/game/data/effect_data/natures_swiftness.tres @@ -0,0 +1,10 @@ +[gd_resource type="SpellEffectVisual" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=1] + +[resource] +script = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +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/data/entities/1_naturalist.tres b/game/data/entities/1_naturalist.tres new file mode 100644 index 0000000..dec8206 --- /dev/null +++ b/game/data/entities/1_naturalist.tres @@ -0,0 +1,18 @@ +[gd_resource type="EntityData" load_steps=5 format=2] + +[ext_resource path="res://data/entity_classes/1_naturalist.tres" type="EntityClassData" id=1] +[ext_resource path="res://scripts/entities/EntityDataGD.gd" type="Script" id=2] +[ext_resource path="res://data/item_templates/2_test.tres" type="ItemTemplate" id=3] + +[sub_resource type="LootDataItem" id=1] +item = ExtResource( 3 ) + +[resource] +resource_name = "Naturalist" +id = 1 +entity_type = 4 +entity_controller = 1 +text_name = "Naturalist" +entity_class_data = ExtResource( 1 ) +loot_db = SubResource( 1 ) +script = ExtResource( 2 ) diff --git a/game/data/entity_classes/1_naturalist.tres b/game/data/entity_classes/1_naturalist.tres new file mode 100644 index 0000000..998f958 --- /dev/null +++ b/game/data/entity_classes/1_naturalist.tres @@ -0,0 +1,259 @@ +[gd_resource type="EntityClassData" load_steps=77 format=2] + +[ext_resource path="res://data/spells/26_rest.tres" type="Spell" id=1] +[ext_resource path="res://data/spells/21_strength_of_nature_rank_1.tres" type="Spell" id=2] +[ext_resource path="res://data/spells/14_amplify_pain_rank_1.tres" type="Spell" id=3] +[ext_resource path="res://data/spells/10_aspect_of_scorpions_rank_1.tres" type="Spell" id=4] +[ext_resource path="res://data/spells/13_aspect_of_bees_rank_1.tres" type="Spell" id=5] +[ext_resource path="res://data/spells/11_aspect_of_wasps_rank_1.tres" type="Spell" id=6] +[ext_resource path="res://data/spells/19_uproot_rank_1.tres" type="Spell" id=7] +[ext_resource path="res://data/spells/16_close_wounds_rank_1.tres" type="Spell" id=8] +[ext_resource path="res://data/spells/18_natures_swiftness_rank_1.tres" type="Spell" id=9] +[ext_resource path="res://data/spells/15_rejuvenation_rank_1.tres" type="Spell" id=10] +[ext_resource path="res://data/spells/17_ironbark_rank_1.tres" type="Spell" id=11] +[ext_resource path="res://data/spells/22_shield_of_barbs_rank_1.tres" type="Spell" id=12] +[ext_resource path="res://data/spells/20_root_rank_1.tres" type="Spell" id=13] +[ext_resource path="res://data/spells/23_calm_rank_1.tres" type="Spell" id=14] +[ext_resource path="res://data/spells/24_attunement_rank_1.tres" type="Spell" id=15] +[ext_resource path="res://data/spells/12_aspect_of_wolves_rank_1.tres" type="Spell" id=16] +[ext_resource path="res://data/spells/25_inner_will.tres" type="Spell" id=17] +[ext_resource path="res://data/auras/1_test1.tres" type="Aura" id=18] +[ext_resource path="res://scripts/entities/EntityClassDataGD.gd" type="Script" id=19] +[ext_resource path="res://scripts/ai/EntityAIGD.gd" type="Script" id=20] +[ext_resource path="res://data/auras/13_aspect_of_bees_rank_1.tres" type="Aura" id=21] +[ext_resource path="res://data/auras/15_close_wounds_rank_1.tres" type="Aura" id=22] +[ext_resource path="res://data/spells/29_aspect_of_wolves.tres" type="Spell" id=23] +[ext_resource path="res://data/spells/27_aspect_of_scorpions.tres" type="Spell" id=24] +[ext_resource path="res://data/spells/28_aspectofwasps.tres" type="Spell" id=25] +[ext_resource path="res://data/spells/30_aspect_of_bees.tres" type="Spell" id=26] +[ext_resource path="res://data/entity_resources/1_mana_resource.tres" type="EntityResourceData" id=27] + +[sub_resource type="EntityAI" id=1] +script = ExtResource( 20 ) + +[sub_resource type="TalentRowData" id=2] +Talent_0_0 = ExtResource( 21 ) + +[sub_resource type="TalentRowData" id=3] +Talent_2_0 = ExtResource( 22 ) + +[sub_resource type="CharacterSpec" id=4] +id = 1 +talent_rows = [ SubResource( 2 ), SubResource( 3 ) ] + +[sub_resource type="StatDataEntry" id=5] +stat_id = 5 +base = 12.0 + +[sub_resource type="StatDataEntry" id=6] +stat_id = 12 + +[sub_resource type="StatDataEntry" id=7] +stat_id = 13 + +[sub_resource type="StatDataEntry" id=8] +stat_id = 19 + +[sub_resource type="StatDataEntry" id=9] +stat_id = 34 + +[sub_resource type="StatDataEntry" id=10] +stat_id = 21 + +[sub_resource type="StatDataEntry" id=11] +stat_id = 24 + +[sub_resource type="StatDataEntry" id=12] +stat_id = 38 + +[sub_resource type="StatDataEntry" id=13] +stat_id = 36 + +[sub_resource type="StatDataEntry" id=14] +stat_id = 31 + +[sub_resource type="StatDataEntry" id=15] +stat_id = 32 + +[sub_resource type="StatDataEntry" id=16] +stat_id = 3 +base = 1.5 + +[sub_resource type="StatDataEntry" id=17] +stat_id = 4 + +[sub_resource type="StatDataEntry" id=18] +stat_id = 10 + +[sub_resource type="StatDataEntry" id=19] +stat_id = 25 + +[sub_resource type="StatDataEntry" id=20] +stat_id = 0 + +[sub_resource type="StatDataEntry" id=21] +stat_id = 28 + +[sub_resource type="Curve" id=22] +max_value = 10.0 +_data = [ Vector2( 0, 10 ), 0.0, 0.0, 0, 1, Vector2( 1, 10 ), 0.0, 0.0, 1, 0 ] + +[sub_resource type="StatDataEntry" id=23] +stat_id = 8 +base = 20.0 +mod_stat_count = 1 +ModStat_0/stat_id = 2 +ModStat_0/curve = SubResource( 22 ) +ModStat_0/max_value = 1000.0 + +[sub_resource type="StatDataEntry" id=24] +stat_id = 33 + +[sub_resource type="StatDataEntry" id=25] +stat_id = 2 + +[sub_resource type="StatDataEntry" id=26] +stat_id = 15 +base = 5.0 + +[sub_resource type="StatDataEntry" id=27] +stat_id = 16 +base = 50.0 + +[sub_resource type="StatDataEntry" id=28] +stat_id = 26 + +[sub_resource type="StatDataEntry" id=29] +stat_id = 22 +base = 15.0 + +[sub_resource type="StatDataEntry" id=30] +stat_id = 30 + +[sub_resource type="StatDataEntry" id=31] +stat_id = 20 + +[sub_resource type="StatDataEntry" id=32] +stat_id = 39 + +[sub_resource type="StatDataEntry" id=33] +stat_id = 11 + +[sub_resource type="StatDataEntry" id=34] +stat_id = 29 + +[sub_resource type="StatDataEntry" id=35] +stat_id = 35 + +[sub_resource type="StatDataEntry" id=36] +stat_id = 1 +base = 4.2 +modifier_apply_type = 1 + +[sub_resource type="StatDataEntry" id=37] +stat_id = 17 +base = 5.0 + +[sub_resource type="StatDataEntry" id=38] +stat_id = 18 +base = 50.0 + +[sub_resource type="StatDataEntry" id=39] +stat_id = 27 + +[sub_resource type="StatDataEntry" id=40] +stat_id = 23 + +[sub_resource type="StatDataEntry" id=41] +stat_id = 14 + +[sub_resource type="StatDataEntry" id=42] +stat_id = 9 + +[sub_resource type="Curve" id=43] +max_value = 10.0 +_data = [ Vector2( 0, 10 ), 0.0, 0.0, 0, 1, Vector2( 1, 10 ), 0.0, 0.0, 1, 0 ] + +[sub_resource type="StatDataEntry" id=44] +stat_id = 7 +base = 10.0 +mod_stat_count = 1 +ModStat_0/stat_id = 0 +ModStat_0/curve = SubResource( 43 ) +ModStat_0/max_value = 1000.0 + +[sub_resource type="StatDataEntry" id=45] +stat_id = 6 +base = 8.0 + +[sub_resource type="StatDataEntry" id=46] +stat_id = 37 + +[sub_resource type="StatDataEntry" id=47] +stat_id = 40 +base = 1.0 + +[sub_resource type="SimpleLevelStatData" id=48] +agility_per_level = 4 +strength_per_level = 2 +stamina_per_level = 4 +intellect_per_level = 4 +spirit_per_level = 6 + +[sub_resource type="StatData" id=49] +base_stat_health = SubResource( 20 ) +base_stat_speed = SubResource( 36 ) +base_stat_mana = SubResource( 25 ) +base_stat_gcd = SubResource( 16 ) +base_stat_haste = SubResource( 17 ) +base_stat_agility = SubResource( 5 ) +base_stat_strength = SubResource( 45 ) +base_stat_stamina = SubResource( 44 ) +base_stat_intellect = SubResource( 23 ) +base_stat_spirit = SubResource( 42 ) +base_stat_haste_rating = SubResource( 18 ) +base_stat_resilience = SubResource( 33 ) +base_stat_armor = SubResource( 6 ) +base_stat_attack_power = SubResource( 7 ) +base_stat_spell_power = SubResource( 41 ) +base_stat_melee_crit = SubResource( 26 ) +base_stat_melee_crit_bonus = SubResource( 27 ) +base_stat_spell_crit = SubResource( 37 ) +base_stat_spell_crit_bonus = SubResource( 38 ) +base_stat_block = SubResource( 8 ) +base_stat_parry = SubResource( 31 ) +base_stat_damage_reduction = SubResource( 10 ) +base_stat_melee_damage_reduction = SubResource( 29 ) +base_stat_spell_damage_reduction = SubResource( 40 ) +base_stat_damage_taken = SubResource( 11 ) +base_stat_heal_taken = SubResource( 19 ) +base_stat_melee_damage = SubResource( 28 ) +base_stat_spell_damage = SubResource( 39 ) +base_stat_holy_resist = SubResource( 21 ) +base_stat_shadow_resist = SubResource( 34 ) +base_stat_nature_resist = SubResource( 30 ) +base_stat_fire_resist = SubResource( 14 ) +base_stat_frost_resist = SubResource( 15 ) +base_stat_lightning_resist = SubResource( 24 ) +base_stat_chaos_resist = SubResource( 9 ) +base_stat_silence_resist = SubResource( 35 ) +base_stat_fear_resist = SubResource( 13 ) +base_stat_stun_resist = SubResource( 46 ) +base_stat_energy = SubResource( 12 ) +base_stat_rage = SubResource( 32 ) +base_stat_xp_rate = SubResource( 47 ) +level_stat_data = SubResource( 48 ) + +[resource] +resource_name = "Naturalist" +id = 1 +text_name = "Naturalist" +stat_data = SubResource( 49 ) +player_resource_type = 2 +entity_resources = [ ExtResource( 27 ) ] +specs = [ SubResource( 4 ) ] +spells = [ ExtResource( 4 ), ExtResource( 6 ), ExtResource( 16 ), ExtResource( 5 ), ExtResource( 3 ), ExtResource( 10 ), ExtResource( 8 ), ExtResource( 11 ), ExtResource( 9 ), ExtResource( 7 ), ExtResource( 13 ), ExtResource( 2 ), ExtResource( 12 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 17 ), ExtResource( 1 ), ExtResource( 24 ), ExtResource( 25 ), ExtResource( 23 ), ExtResource( 26 ) ] +start_spells = [ ExtResource( 24 ) ] +auras = [ ExtResource( 18 ) ] +ais = [ SubResource( 1 ) ] +script = ExtResource( 19 ) diff --git a/game/data/entity_classes/2_elementalist.tres b/game/data/entity_classes/2_elementalist.tres new file mode 100644 index 0000000..e5a5eda --- /dev/null +++ b/game/data/entity_classes/2_elementalist.tres @@ -0,0 +1,207 @@ +[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://data/character_specs/2_elementalist_fire.tres" type="CharacterSpec" id=2] +[ext_resource path="res://data/character_specs/3_elementalist_water.tres" type="CharacterSpec" id=3] +[ext_resource path="res://data/character_specs/4_elementalist_ice.tres" type="CharacterSpec" id=4] +[ext_resource path="res://data/spells/34_cold.tres" type="Spell" id=5] +[ext_resource path="res://data/spells/32_heat.tres" type="Spell" id=6] +[ext_resource path="res://data/spells/33_normal.tres" type="Spell" id=7] + +[sub_resource type="StatDataEntry" id=1] +stat_id = 5 + +[sub_resource type="StatDataEntry" id=2] +stat_id = 12 + +[sub_resource type="StatDataEntry" id=3] +stat_id = 13 + +[sub_resource type="StatDataEntry" id=4] +stat_id = 19 +base = 10.0 + +[sub_resource type="StatDataEntry" id=5] +stat_id = 34 + +[sub_resource type="StatDataEntry" id=6] +stat_id = 21 + +[sub_resource type="StatDataEntry" id=7] +stat_id = 24 + +[sub_resource type="StatDataEntry" id=8] +stat_id = 38 + +[sub_resource type="StatDataEntry" id=9] +stat_id = 36 + +[sub_resource type="StatDataEntry" id=10] +stat_id = 31 + +[sub_resource type="StatDataEntry" id=11] +stat_id = 32 + +[sub_resource type="StatDataEntry" id=12] +stat_id = 3 +base = 1.5 + +[sub_resource type="StatDataEntry" id=13] +stat_id = 4 + +[sub_resource type="StatDataEntry" id=14] +stat_id = 10 + +[sub_resource type="StatDataEntry" id=15] +stat_id = 25 + +[sub_resource type="StatDataEntry" id=16] +stat_id = 0 +base = 100.0 + +[sub_resource type="StatDataEntry" id=17] +stat_id = 28 + +[sub_resource type="StatDataEntry" id=18] +stat_id = 8 + +[sub_resource type="StatDataEntry" id=19] +stat_id = 33 + +[sub_resource type="StatDataEntry" id=20] +stat_id = 2 +base = 100.0 + +[sub_resource type="StatDataEntry" id=21] +stat_id = 15 +base = 5.0 + +[sub_resource type="StatDataEntry" id=22] +stat_id = 16 +base = 50.0 + +[sub_resource type="StatDataEntry" id=23] +stat_id = 26 + +[sub_resource type="StatDataEntry" id=24] +stat_id = 22 +base = 15.0 + +[sub_resource type="StatDataEntry" id=25] +stat_id = 30 + +[sub_resource type="StatDataEntry" id=26] +stat_id = 20 +base = 15.0 + +[sub_resource type="StatDataEntry" id=27] +stat_id = 39 + +[sub_resource type="StatDataEntry" id=28] +stat_id = 11 + +[sub_resource type="StatDataEntry" id=29] +stat_id = 29 + +[sub_resource type="StatDataEntry" id=30] +stat_id = 35 + +[sub_resource type="StatDataEntry" id=31] +stat_id = 1 +base = 4.2 + +[sub_resource type="StatDataEntry" id=32] +stat_id = 17 +base = 5.0 + +[sub_resource type="StatDataEntry" id=33] +stat_id = 18 +base = 50.0 + +[sub_resource type="StatDataEntry" id=34] +stat_id = 27 + +[sub_resource type="StatDataEntry" id=35] +stat_id = 23 + +[sub_resource type="StatDataEntry" id=36] +stat_id = 14 + +[sub_resource type="StatDataEntry" id=37] +stat_id = 9 + +[sub_resource type="StatDataEntry" id=38] +stat_id = 7 + +[sub_resource type="StatDataEntry" id=39] +stat_id = 6 + +[sub_resource type="StatDataEntry" id=40] +stat_id = 37 + +[sub_resource type="StatDataEntry" id=41] +stat_id = 40 +base = 1.0 + +[sub_resource type="SimpleLevelStatData" id=42] +agility_per_level = 4 +strength_per_level = 4 +stamina_per_level = 5 +intellect_per_level = 5 +spirit_per_level = 1 + +[sub_resource type="StatData" id=43] +base_stat_health = SubResource( 16 ) +base_stat_speed = SubResource( 31 ) +base_stat_mana = SubResource( 20 ) +base_stat_gcd = SubResource( 12 ) +base_stat_haste = SubResource( 13 ) +base_stat_agility = SubResource( 1 ) +base_stat_strength = SubResource( 39 ) +base_stat_stamina = SubResource( 38 ) +base_stat_intellect = SubResource( 18 ) +base_stat_spirit = SubResource( 37 ) +base_stat_haste_rating = SubResource( 14 ) +base_stat_resilience = SubResource( 28 ) +base_stat_armor = SubResource( 2 ) +base_stat_attack_power = SubResource( 3 ) +base_stat_spell_power = SubResource( 36 ) +base_stat_melee_crit = SubResource( 21 ) +base_stat_melee_crit_bonus = SubResource( 22 ) +base_stat_spell_crit = SubResource( 32 ) +base_stat_spell_crit_bonus = SubResource( 33 ) +base_stat_block = SubResource( 4 ) +base_stat_parry = SubResource( 26 ) +base_stat_damage_reduction = SubResource( 6 ) +base_stat_melee_damage_reduction = SubResource( 24 ) +base_stat_spell_damage_reduction = SubResource( 35 ) +base_stat_damage_taken = SubResource( 7 ) +base_stat_heal_taken = SubResource( 15 ) +base_stat_melee_damage = SubResource( 23 ) +base_stat_spell_damage = SubResource( 34 ) +base_stat_holy_resist = SubResource( 17 ) +base_stat_shadow_resist = SubResource( 29 ) +base_stat_nature_resist = SubResource( 25 ) +base_stat_fire_resist = SubResource( 10 ) +base_stat_frost_resist = SubResource( 11 ) +base_stat_lightning_resist = SubResource( 19 ) +base_stat_chaos_resist = SubResource( 5 ) +base_stat_silence_resist = SubResource( 30 ) +base_stat_fear_resist = SubResource( 9 ) +base_stat_stun_resist = SubResource( 40 ) +base_stat_energy = SubResource( 8 ) +base_stat_rage = SubResource( 27 ) +base_stat_xp_rate = SubResource( 41 ) +level_stat_data = SubResource( 42 ) + +[resource] +resource_name = "Elementalist" +id = 2 +text_name = "Elementalist" +stat_data = SubResource( 43 ) +player_resource_type = 2 +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/data/entity_resources/1_mana_resource.tres b/game/data/entity_resources/1_mana_resource.tres new file mode 100644 index 0000000..b3cff4e --- /dev/null +++ b/game/data/entity_resources/1_mana_resource.tres @@ -0,0 +1,7 @@ +[gd_resource type="EntityResourceData" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/ManaResourceData.gd" type="Script" id=1] + +[resource] +id = 1 +script = ExtResource( 1 ) diff --git a/game/data/entity_skills/1_test.tres b/game/data/entity_skills/1_test.tres new file mode 100644 index 0000000..f921777 --- /dev/null +++ b/game/data/entity_skills/1_test.tres @@ -0,0 +1,4 @@ +[gd_resource type="EntitySkillData" format=2] + +[resource] +id = 1 diff --git a/game/data/environments/default_env.tres b/game/data/environments/default_env.tres new file mode 100644 index 0000000..d37b59d --- /dev/null +++ b/game/data/environments/default_env.tres @@ -0,0 +1,13 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] +sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) +sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) +sky_curve = 0.25 +ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) +ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) +ground_curve = 0.01 + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/game/data/fonts/OFL.txt b/game/data/fonts/OFL.txt new file mode 100644 index 0000000..3e89993 --- /dev/null +++ b/game/data/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/data/fonts/VT323-Regular.ttf b/game/data/fonts/VT323-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8eeeae60fa86834116ae615fa67fca5f6ef94bb6 GIT binary patch literal 86576 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 Riu&F6+_7WleSpW^{{ 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 mlanLDFeXZ}+b{ozQ}7Q~JX5g!!U&820000 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 literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-1/5.png.import b/game/data/icons/icons-1/5.png.import new file mode 100644 index 0000000..8aeedf7 --- /dev/null +++ b/game/data/icons/icons-1/5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/5.png-c332f38dae48aad24a86e83f8f203afd.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-1/5.png" +dest_files=[ "res://.import/5.png-c332f38dae48aad24a86e83f8f203afd.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/data/icons/icons-1/61.png b/game/data/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/data/icons/icons-2/enchant-blue-2.png.import b/game/data/icons/icons-2/enchant-blue-2.png.import new file mode 100644 index 0000000..245fa46 --- /dev/null +++ b/game/data/icons/icons-2/enchant-blue-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/enchant-blue-2.png-c9908f0a2a0fcfcfe240897d34b2f283.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/enchant-blue-2.png" +dest_files=[ "res://.import/enchant-blue-2.png-c9908f0a2a0fcfcfe240897d34b2f283.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/data/icons/icons-2/heal-jade-2.png b/game/data/icons/icons-2/heal-jade-2.png new file mode 100644 index 0000000000000000000000000000000000000000..84df53d7c8cd6c68eb0969b891b87cafd70cff40 GIT binary patch literal 3314 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1e^k|e7Q{Ld+T1SABANKd8c-V)i!!N+lFDE%ovRCMq-}tJc(^o<{hM>`Mar&?{~L_ z#}xY)^4a>c$^PxWPe?|TM#QSXJOc%PKIK{vU|lGo;*;=+-+LXd8YE^5*k!#(LCRs zI!qLvobk=vIh;8SnG5%Woa~DhXJ9yj0=Lf7g@9@P*h1&ra?b0dIC&73GGQ}1VE>29 z{kNNc=W=WH9U}7ji52YP&0LtVk=vhG1wd#SZt(>8T?W7Z#vf1>2*wj;g@e_%yG4ui z#jS8~4paUoq3Tg(fYw)N<2STJ4}u zmmYiSxoa=I4jy4ZCPo^0=qRI3auZ51WyYCio;u5{3tU@a$%-qjymXaSKd2e1zg>R= zH8RxrAhp-!4{DfoIlnDv%Sqgr0WlT=;&~$gLi5JVE1_C!f$iC%UWp$NX z72kqHg11yqbQSY;7FIa4haL4d?E$yQ+VWZIp+@Bn5lsQJF(O0^k-npyO6U2C7|3}Z z)TQk;#(pBvY-JWI<7@?SbWpQ9_Eg##W%9k*P!zsi6Cu~3n~jh=9r+wmWd-f2y7NPq z^ucyxQV4fFK+|hyJ9e-GkT(>s1ycc=!LlGW1tt6JIx<*6*CRYM#@%#M znOqDg5HA)xO<=3dRu2MtXTO@{I-~6>0q7V^-Oq({&eO=QTJMq*ou z&FhqF?#eQi&8&j#m0_MvWZ(^21h{l(ft$N~!eeCIb#lO-bWA|?p4E27j}P>Iu{Tpn zU)k@?-KFjlu|T8_cIE4emK`HweeRj2lqqJ#s2jmYW59ps1KlWsms2fnebC%h`TFNU zNW*(pzu?$>5p7zkJLZ-UXkCL6hhc-GliZlL=BcfOK#|J=K--h3EH#hMtTc_?a+eHVr&uuO)VZ!$~$BND3;TSE_{Le zijE%>WD%k;Uld^5LE{+P;qFVo0?nH}8OgvNv^Ln*iXCaugD^t#=bsa182{EmV*K1oaxMq4i;y=1}_+JV6Uz zAG0UAzG=(*463$~?%aHGNtB)hK~AT9yr31?rK?~_hoR<0hmbzf7C*aT09?I%8M{FZ zCYwOn2{1M>fJo@L(h4VdSEdKDh>iUa6fdhYq4!{cUrv128cphp(&z>#GeAiO$^d;) z!fzU71iKZzo*|<=-fP$$WtU`T1B?P&K$7%U;R`&mM+_tB`ve5(!%A-jK zZKB+^2D4zoYcmpAq1Gus*;f_>IZsk-Ca+w#A%MoBVb7P@Jat!Te{t)|)$Meln7?9uuyBwu=(0G?TAgRa`W>H_`58`#ZOZvm=4ymkn5 z3gJVvXd8HMwX1r^@wHvApKXj}H0OH>GrdaZw|bh*5g3alouK{VSF+QGzi6cIX#Wq& z-HyK*dpY^O(RQ0{&gZAE)`H;8XBxSZK_90g8%>lglR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsI)` z6$c}TIAmy@EQ*RaY88r5A=C=3I+%}sL6e3g#l=x@EjakGSaoo5*44pP5ClI!TwI+L zU8KbSC509-9vt`M-Mz=%JAkW~70v1x2Q=L_Q;E2c$*u~aSM-3#0LBoN6w8^3A0wV>=UiW!-S9@>&o@w^?1G|E9#B_NZ zbN~PV24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jdGA z6)!QZfNPlm00SCHL_t(I%LT#7Zd+9VfZ_iPcks0x+fghBk~AuXh9D@TS|Jf41QLrf zEMdfI(t`1PCFjA}At7pekaKCL|P+IIZKf@$BpCJDtP#iIRWL%2JWC zUL?x8_^OJn1tjez(kPVj5%Y7XRA3twR6iwsa6+1f^oHALrHd4wd=52~xGO8@oetT# z3Pn-CcmkP9;+N{!sX-1hY#gFiFCd?o;D6RaYwe?AO|n*D?)9Adyvrmsbney(Z-6m| z`c=d7`4M4a88%CtemR9*2hX2FC(}L!Px8VC5yOFD?|KDi#?ZJDQF~ev1Tk2_&TnOM zYgv6UPhKJJ#yBwfa9!HvR zgc%5o0JH2MCI)Av$cqx2T8KgBmMGEC&Y*RQ7QT->O6a#s%&r?A9u#>0 zosj1%buI=M@I{5yclY_@wg33~&l0t2i0QiM?J;rx3>Dbf4VQp%A>hi}C)^)a=$;5V zdPvF78Jiy89~`m$kIN($TwZIk^GywNk{|{#5-G8XVS3AOxYgjj_4`aS!OuTc*li8i zIqPy`v&`|KX8qNB>}}2?zdA!S2PETDlq*Xc%DTu(naK>E&<{uUH||9 literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-2/heal-jade-2.png.import b/game/data/icons/icons-2/heal-jade-2.png.import new file mode 100644 index 0000000..ce8b63e --- /dev/null +++ b/game/data/icons/icons-2/heal-jade-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/heal-jade-2.png-d697c16d862d1cdfbba68e3189ce5187.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/heal-jade-2.png" +dest_files=[ "res://.import/heal-jade-2.png-d697c16d862d1cdfbba68e3189ce5187.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/data/icons/icons-2/protect-acid-3.png b/game/data/icons/icons-2/protect-acid-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ce0d62e0fd0937927ba351cbd3f11512001eee GIT binary patch literal 3506 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 literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-2/protect-acid-3.png.import b/game/data/icons/icons-2/protect-acid-3.png.import new file mode 100644 index 0000000..e500115 --- /dev/null +++ b/game/data/icons/icons-2/protect-acid-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/protect-acid-3.png-fba7e733232cd6a25d50c1349f82ccba.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/protect-acid-3.png" +dest_files=[ "res://.import/protect-acid-3.png-fba7e733232cd6a25d50c1349f82ccba.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/data/icons/icons-2/protect-eerie-2.png b/game/data/icons/icons-2/protect-eerie-2.png new file mode 100644 index 0000000000000000000000000000000000000000..85cc9a4ca751202d9ca837ae5febf666952d7a72 GIT binary patch literal 3357 zcmV+&4dU{NP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b>vh}D9{Ld<~1V948azH>;c97+#0pag4lVqkU z$M^bR8w=6hdK@?Z_0Q%0fluU=9VaQd=Irs|$~86&ioc(F&cX9J+l7CFU+%l_LBuV> zH{DBVHoxJ1`tibBBlKVIyJAmbF+39^A2(?^0TWw-fy*u z#})f0Ii^1&``Z0{g9Rv!gjp2hq(J_h`FcR`jw&^r1J1bK^Kdj`N)BHHi`NqX^2_!< z0R7JZ{Q~kEx!=+MM!$g{o8711u*`-L27me>q(2A$K>X9f^m!D2eUQV)@E<^4Ym~L- z-Cg4hM6)T%yNAwx2NOFWr}J9IA^1-i%Q-5J;+t2HGranaLqiP_tSlEejL^ag^L%Si zxX5uv!FP-r>D((Mu|_@2@jk+e0uBci@TPG(aK;orU&2|pp7k^otULmy#sFjCko_MH z_un4=ox`oA8=?*I!wP=Itz5XVncHW~0wG};Z|MO14x``yq#sBX45kBf!3LY}*F;a@ zhqmbOOqiGOeWM~c8D;FpxIjZKQR0+RPLhgCHMLBcbILhO-bttg`BAA8W?yACAAl zS}@k)VQSBlk2TzNBF{wF=_GB=z*yt}#$_`ALC4LRFM&C3<~C=(Mg&EQa58Of+z6X7 zP{=dHw8F>T59a<7Z!VR;#9RDd%(+e7|ARRP>i)>vpRhJ|ozuhEjlzwoCqy5#-C}Vq z_7qEv1s82Fu-Svy8!||p=WYW=DW9Qgk8K1_0oc@5F+jP_5~}O{To52YVmme%<4M@ld+S27nEFw=eu5RX+wXPV7jB& zc#-3NZKUeW30#_q6eiUX)7grb;_2?ySJGv})rDXxI$T!d>vCUZAEsQ(AbMm-<;>3s z8@!IhyA@8m)TZlE8L0g~_B!XoMHda94e1%wxX_a6P1j=R0*+Eva|d3OnQ-6hKGwUH z(eljwjx_>Ex@-+ahfw5ttV2)IihQT098Mqzf|DYZsP4}8&C zA{Ebm}*37y2DNb+y>)6(Ih_}&8iN{G8W51b3e^}q+zxM z>4zc%n-*YTe1W@kA%7d#1zC@Z)og5{+osGl)3`vj|QaXN}mky&O^1K&rj|w?se)D^1|XgpJtI2%>hJ3=M|0luB%U& zjSp4VYDp&BOi=B8iD;C&Em#`G^rXvc3on02)f=9yD|xq)NwaM1)Pfy>*F6;S1$cWo zVQ@B{k-7P$)W+^93pm%^6xG~7S1d%3 z9)e%tP6Hn_k&(nODabZcUr9j?UREYZ{Y!@Errb2sFjmWac`Ftx&bu~2JywsP-I;iP zxUZfFmG@wT>WD5ylL>9NP}k*JyA5j%R>M4G;a`a@V)e1BQgwQ}lHHWh#2QK7m7Mp>RulkNq4U4QkR}2#DJ;wG^pH+S(_dSIUQwZCNYnpBA! z%v1i-tGgM2>|S#Smctld0t6@h6(!V23uOE@RNFazn6ru>R%?etUuE50#-AlBWNiZ{ zmh#GpFZt^R9{e1wh~n3gSe^c8XxPnT1ah{xEX>4Tx0C=2zkv&MmKpe$iQ$^8=gB7GWWT;LSL`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLxH>7iNQwVT3N2zhIPS;0dyl(!fKV?p&FUBjG~G5+ ziMW`_u8Li+=tUTVh#?{~%b1g-Bz(u$Jpz2ai}5V~bAOILHD@s(AQI0q!?cMvh^IGg zgY!Odm=$G}_?&pmqze*1a$WKGjdQ_efoF!zbZVYBOe_}KSZQNcG&SNW;;5?WlrLmF zRyl8R*2-1ZyeEHQD5tM1bDice5?I6%B#2N@MG0lt)K>{QDHc++ANTP`T)#vvg;V+82h1sXNS`95}>#t9I72Cnp$zfuQgK1r{& zwCEAgzYSbmw=`uBxZDATo($QPT`5RY$mfCgGy0}1FmMa>ta-gP_i_3Fq^Yaq4RCM> zj20++-RIri?Y;ebrrF;QnkFy?RwIf@cN6Q|n1l8o^t!5T!+H zEv5luZ1cc1Y14hU>t^;bug~94q{yfgE*Zwi35SW13_)jrD0^7*Wx`SsbL}?1ObAnw zqrDm}Rj0!dF+KEArm%&_XxhO&H-nbWkcuL@r_0nYlu?F8;ou2kX&OTfIPuv!qb-|8 z*QSwl(S?wtgd}@@fur|U(2ao5u#uw)%5ES;ipTH2ggYJJKhQDV0>htvkG7-eE6|5U zmQtlaf4W3pG*P`>G|Of1dmU?|kBB6_=h7%V+PlX%Pt9SxaS`#!H}s z6@vOh>Q~oEHvVGr?2DKMlej&=Z0P)P?K%-XPJZ@oIx3quoY8~W0>!rp>|M( zFK!a62ygWQ-doGe-^kN-W5QD&`Za|BWH(GOZ~X}oc&3AE<kt*;NV2ojtPOKA@jWu+`Y$(Z^qsIgzKh_$*Vey@IZ3)Yg9GerFS`BF@Gk>WR-l z#mI=5ZV+Q`|4n*ol3=MoQ*Y7#Ws}O=t5hz(PUpu>_T4I}rD?3O3ABC>DtQtTWLNpL zO9on}i{0!q^U-DeOo*|33jgyT=v@7o=+#AJG0XTnZ<1fzA-eaF-hKmL`DhC9!T9s1 zQ5%OiLnec#7qONmX?}N)-0VE@LXrRW_8GdeLQa&if7+vd<30z279DDcJTuBB!+0)- z)mONeo}qr_BGGI_`{owrq=s2pAhn|yx_*mzyGG;gK8JCQCc6liqEaNdj9}t0qB-Qx zPSRbyL^$Vx1K!#;;_KU}&VZfce=*VV)qrDK2#KZuG%OrOaL7{7Jc{K4y>k`hUY*9B neS8(tQ$9@&31}g)$W!5eo>y0phIr9v00000NkvXXu0mjfap_h} literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-2/protect-eerie-2.png.import b/game/data/icons/icons-2/protect-eerie-2.png.import new file mode 100644 index 0000000..17ea08c --- /dev/null +++ b/game/data/icons/icons-2/protect-eerie-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/protect-eerie-2.png-73044f4d125be4eba38b20cec63a5566.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/protect-eerie-2.png" +dest_files=[ "res://.import/protect-eerie-2.png-73044f4d125be4eba38b20cec63a5566.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/data/icons/icons-3/README.txt b/game/data/icons/icons-3/README.txt new file mode 100644 index 0000000..d6ec7e1 --- /dev/null +++ b/game/data/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/data/icons/icons-3/beam-jade-2.png b/game/data/icons/icons-3/beam-jade-2.png new file mode 100644 index 0000000000000000000000000000000000000000..49fb7b0976796ee7791a90f98baa74c2c4865aac GIT binary patch literal 3220 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 LNkvXXu0mjfA%-ro literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-3/haste-royal-2.png.import b/game/data/icons/icons-3/haste-royal-2.png.import new file mode 100644 index 0000000..7578b2f --- /dev/null +++ b/game/data/icons/icons-3/haste-royal-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/haste-royal-2.png-f543b59bf135e994010f5ae2003abb4c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/haste-royal-2.png" +dest_files=[ "res://.import/haste-royal-2.png-f543b59bf135e994010f5ae2003abb4c.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/data/icons/icons-3/lighting-acid-2.png b/game/data/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/data/icons/icons-3/vines-plain-2.png.import b/game/data/icons/icons-3/vines-plain-2.png.import new file mode 100644 index 0000000..23c2e43 --- /dev/null +++ b/game/data/icons/icons-3/vines-plain-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/vines-plain-2.png-2d669ab81b66d5d1f5a0bd423cc51a66.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/vines-plain-2.png" +dest_files=[ "res://.import/vines-plain-2.png-2d669ab81b66d5d1f5a0bd423cc51a66.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/data/icons/icons-4/README.txt b/game/data/icons/icons-4/README.txt new file mode 100644 index 0000000..fb7d29c --- /dev/null +++ b/game/data/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/data/icons/icons-4/explosion-royal-2.png b/game/data/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/data/icons/icons-4/explosion-royal-2.png.import b/game/data/icons/icons-4/explosion-royal-2.png.import new file mode 100644 index 0000000..15a7d64 --- /dev/null +++ b/game/data/icons/icons-4/explosion-royal-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/explosion-royal-2.png-80d5d46ded15ebbbb3cc9785d3e51084.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/explosion-royal-2.png" +dest_files=[ "res://.import/explosion-royal-2.png-80d5d46ded15ebbbb3cc9785d3e51084.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/data/icons/icons-4/horror-acid-3.png b/game/data/icons/icons-4/horror-acid-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b83b74beb6d148bc63b4e397f8f6f426198cbd85 GIT binary patch literal 3133 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 X2-ahJaRoC+00000NkvXXu0mjfo>$`& literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-4/horror-acid-3.png.import b/game/data/icons/icons-4/horror-acid-3.png.import new file mode 100644 index 0000000..c291ece --- /dev/null +++ b/game/data/icons/icons-4/horror-acid-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/horror-acid-3.png-e8ee360b50045aa779876bed15fb2374.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/horror-acid-3.png" +dest_files=[ "res://.import/horror-acid-3.png-e8ee360b50045aa779876bed15fb2374.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/data/icons/icons-4/leaf-acid-1.png b/game/data/icons/icons-4/leaf-acid-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1547714cb933c066a55d842d9e1a1df189de9458 GIT binary patch literal 2695 zcmV;23V8L2P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1dV5j3j}{7)1P0f{>t&MIf%@ZBIWdwsUwtMbn7 z30NQteK0v-L z^Ns$~`U0P;_PZ}Eqhf@{9|tJ>8T7z_vIj15-XWQi8&>wBLl&Bz+ zhAsezpgX`Ac)BMW$pwmJ6LTU0ju`}1SkBIK0|OKS4;abbxyUAQ=B*oZ5*=9%9C>#m zH-U)YqD$ZgQ3kTS5AdJlGkmB97kmgIh7__1CDiDmk0HjG;!bikx#UwwF{PAKNj1Cd zbI38LoO8*waB;|ip~R9(E~V7Urb1E0S{3pYJ&l`dzJ(TBYPpqGJKU%H9(wGl=U#dp zJlsH<7;&VLM;UdJnaC8=&oJXmGtV;Xg0C&N{0b|swDKyeKCCILKiA)2jg&P$Ol`UJ zu!dff(p`dfItiOIFvgz1c-joWp?Py=GkMROxy_j^yz?2u$gsIFgEnKJ&`;v9=;7|g z++X6&g#4Fy_jdB~?L>$k+p1a^@p~+$&wt?5x#>>i;kN~ey!hMtAuStv4Hdzx-JB53J|hv>5!;7CyLxrehRa-K|# zZ)S@OUtA4bI*Gy4yV7TpDRVf)hZA+)7dqw!q@^Ny;Yim`J_}(lStnozvB`u!BV1eB z!^e5&_{UZ#+A3S=y{93pW!t;-CKs>Ch!xpI&od(0#Lm3!ERUT~F}uLM>{j z6}3N*xrqjDFf(~ss5t4wzvB=k%p49bS% zKA6aq#{Q9{&$@#@dqZ^L>`0nyJ)2wZt!91eoM!#$T%S(aoXriZu~qY}ivaIxHn;X! zuMkFdZE2p&4lJr4wc#8*S*!NQy+74|NL|bOf7h{!v%e+eH-{*J-CiGm>Q0eZbAQY{ z&uQV->R4_2G0j>0004n zX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iQ>CI62P23$1gTCIL`4J_twIqhgj%6h z2lLS{Xws0RxHt-~1qVMCs}3&Cx;nTDg5U>;i>s5OiFPiWsYU?W-2*P%o7Xw7M5FBDVQ4Z zBymL5bjs(_9;=ME7;B}9(zqvkVK}R=EHj!v2}0hc>K|C1q^k}Cyia=9Gven#Jv0eWwN&NZ*M#y(CT zfE0C=xB(6hfss6Aulu~aqqVnx&ouh`0nyEJ&71CG-v9sr32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Re3ltS23|U=hga7~n4M{{nR4C6qlFf<~SrCQKiMV;QvVN>8#a3FB z85$KAD&j_%l`k-hc~M>Y7OoUGx)24yak}lUs_v@%xp7>i48$%7&LO_fNdR!8kxt&c zo(`>y94DD&CjgQX0MJPg$yh=l2{=&%H%ZwG|OSovd;iEjydcCfo6o zru$K*OJ>Ku)!4=0IC_vPr+`Veqd(HkKdaiA6ECmAja6lrmmp~*fYi2V9$7w~&z~() z$WF`Uhu!)f)x&N?d_i}iYfIZ)l#mEIi1t&lpJo1HIXjuu_o~U`Wqnlhe%*cSQ>XRI z$-nQquBZqE+(-kqdVVeBZ~J4hPkV8V>?+GHnZHHhVbLY0<5; z*tF4NIIg#^&v)n1hlW52SV&E_%DLM~Uk`nq(r&2Ux4Vs76itTCmgwbn%&>%ExbQ@i@Dj^djU^THJwB1KPsJmMQ zu-!xuArRX97q|aeUSC*91W-A%TL{U}6-gjLVEo zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxvLvew{AU$j0unE=9G(&0ftT+D1l?z5Y~LH< zQ>VKqiic39Qff2)_0MVkfj@SUjSop;j?v=JXP>#CA@=;`{Y}>IZ+)=0@uT0o7mO~4 zyE~7m==g&E@R@M;p!&1lh`wRbh3?9_pj$gL8vWZy^z-Q_uM6dI8Zk@yHnsA(HyyZ5 z(T_`e>9@#wHs2jS!Am`0lw%%_oZa94Sm0ot%dX&?@Qvp+4%cdDgPU`#mcSuDj`tjB zza8|$$+u;G_5N%9;(RXJ?|$)RR3D-7#}^d-?ELNGuZ`Wah=0Do8~N=x`kAxKoa3CX z_y~_iWt277J8KRGR=C{lX%Sb#C!n47m2rtJwgH@Oo2|GSWn!Q*4SDKRXwumCMhzx< z9-MGzZtQlSxWt*;M$WH`CMRInodC1O!vHhy_}M~x-@Ny0B-ptVhB9F>+F<{O%lx;O zf9EoDw&fzS@_YrmcrgoREacWVMgb6-id)zYzL&ypzxV^H0>QA|EI44X^(;{XeYoW| z&JN=O?k6h9q^=9VMc6yQ7=(Z)8_5NVWD|2Df*%C{6!EWGx{ zoJ4yp2adeDp-liHxabnFL6iY3?*sUgynsU`xZpzwF{B_S=KV zVoFI;PDPw}2@)lVNS2a0J7{3YF{dm!=Tg`dY*esT!T5rn%GFh0Lya|6skxR0`ZV7{ zi!C*2xs}e{b;v}IJ$321mqBJgDTW_m#F2)KJjw*urkj3-8E2X@^DGZFMfJDqZ=gns z8gHc5xb#p%uSw}HK}$};!VHM9Cm@~{0w6Rm%&d_2ypUU%*~|!vz%Vi_Y)q$x7$Ee6 zI81ujeUST0xS1e-2{-;<$e9J*{{uM#=zhoT52*E(=h{Z>MB(zOb%?%cU12eWp&2QV z$3KF#?}kJ^JN?!W-rv$_HYJ24UeBx5(QKq%(4$evNrOVd#{?-dY&VK-m_bzR-X zH3T-syWc|Xm=Nk&9pO3lD1>Re8|ru~`Mk?4na?N$c9DIwW=EmZyVQL5mfl97V-hr* zf9`MP8e+>iI4Eb-8OZJDNS1q0Uw~fMwsB4_)V)psWzUgAw(AV$4D@@IVxMg*ed}K8 z5J*u~uhI2C1@&wW=1i>4(K~>;%~tviFm*_2zPF#_%|iG%1GiM#nKB}E-57KSxsO-E z$Y8PBQDD(C$(n<95uvIm+i-zA2d+3evkvp2oEF}t^Lpj8p3E_IQk%XF#dJ7V>~vM9 zjNP8_Q%Eb4mb5e)Sf^Lc8BQ_6iCmIBV8j1L2GgM=_HGa^NWllpa|vG2h7 zjjjEx}?9v0yVXTqk4;bWMEHC;IpG4xC+4I0;j+K7sw zT}Jsx3pI52ktl0_fUlCEraRu(iWqdIhs}Glh@U~dvv2p%y#saa#kJ-Rs+b}Gh^^X`og5m}A$DTdY;;TP z4pGr)qst$M7i)iPp)K-nqD*oodWL z0)hm}_EDD@k6MS`5>vZunR!qy%01c+=?~zT-5J&dZ6gZ(%BxmKb)vy^IiDfFx;r4f zq8J;p>Y3{)`hJdv>?lu6ka))voiSO@QysWGmHaK@NO}fj)7+x@4ohUTV-i$pRD`y= zUIe-CC?|rssqPL$wP2Am1>%p4>s7-feqmVbN|@W6;Gr}5_*zzt{gg22*4ae-RE++G zUr?>d_OWgWCkJH|>VDtiW$}Qd(P5yO8R7&8uUo2@gLf0_Xm%0F+zw5Q!=kvDUPHMhS7oS*nI@yVqK;{3-h3F{CwwDdZ~YpI zII8-l1^gOuD`A<&U1s+MQGyCiy4i6_S0#iC30An~($j$5zN4TlTB6I90?A zca(3rR&_i|s1H&TUZG;`XZ=-~&XN{`qEbJ|o_)0KRAHNbquE~3tS>seg?R{C<1*^2u zniRhpKaSNXfiY`*(|B^zB7!Qv7@$TN^?j69@N{VK+jRTr) zo5^@gNM}}s&?~yZqaVZQkQB?96U794$JadqY`u%JEdO(Vjvh5@DL_CVo>dIfCf*>P z-n0$I`^3CbkW}Jx;xUshNc_lj+2c3Hd6zks$(yOj(RT-`!fd$q6qh90S^49Oq*M2<-y(s^fegJ5K!s2tET>dedL70W+VZ zSDRYo2H0*FaOK~yNu1;I;eRA(3f;P>*~&Ya1d7^6vywuz~_kg5?c z8$m2BE-G#cg_bVFjjmnz58U*JbW`Y}yKZV1g?3Q{F`~po6Ey?LNa8rjnREHR_wDnb zHB3a#umU*4nKPb|5DB$xA&Q7<-KLmQ5=}`AB2Hx95N4Je(XJ!UIOkGSe2*A~Rlylf zNk&!6gocO+Avm575CO{smUJWt3Ymc@NC*f}MUJAX%0}-o&=O>< zNW{H71WU7C{(8Rizjr?Ma1bp0@-I~p9KnmB zn+`JR(&{Joq2axj4kGgGWXG{$Rj+MTmp<3|X}{R5E#n{W!qSxd@Kt_ep*-7b-t1CN zFczXFsVIJmv@y0nKhB=6)kxq;x}5HO-CI7tFdE7F000m`uTGYHw3h`2Lj3OP5vS$f z>qsgaL$h1rx!E?;=EbW~BlOR9=y2L;EFa3V!UCZdUhm#sT9VD1m+bPfHcRrf4=3{j zN%HGzw_ov$kBrKB@ZO*TzTJzD|J#WToSAM7leY5P%aEn^&kg@}-xMb8MNxwQZQ N002ovPDHLkV1lID!CU|U literal 0 HcmV?d00001 diff --git a/game/data/icons/icons-4/wild-orange-2.png.import b/game/data/icons/icons-4/wild-orange-2.png.import new file mode 100644 index 0000000..892c7d7 --- /dev/null +++ b/game/data/icons/icons-4/wild-orange-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wild-orange-2.png-9ac324900de05bf8d56240e0e27c829f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/wild-orange-2.png" +dest_files=[ "res://.import/wild-orange-2.png-9ac324900de05bf8d56240e0e27c829f.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/data/icons/icons-4/wind-blue-1.png b/game/data/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/data/icons/icons-4/wind-blue-1.png.import b/game/data/icons/icons-4/wind-blue-1.png.import new file mode 100644 index 0000000..5ee02a7 --- /dev/null +++ b/game/data/icons/icons-4/wind-blue-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wind-blue-1.png-29c9c4f83b5aef00d6a1aa6cc9858798.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/wind-blue-1.png" +dest_files=[ "res://.import/wind-blue-1.png-29c9c4f83b5aef00d6a1aa6cc9858798.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/data/icons/icons-5/README.txt b/game/data/icons/icons-5/README.txt new file mode 100644 index 0000000..dc2d436 --- /dev/null +++ b/game/data/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/data/icons/icons-5/wind-grasp-acid-2.png b/game/data/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/data/icons/icons-5/wind-grasp-eerie-2.png.import b/game/data/icons/icons-5/wind-grasp-eerie-2.png.import new file mode 100644 index 0000000..8df7ff5 --- /dev/null +++ b/game/data/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-5e215ef1cadb2fad8d60fa5d444bc35a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-5/wind-grasp-eerie-2.png" +dest_files=[ "res://.import/wind-grasp-eerie-2.png-5e215ef1cadb2fad8d60fa5d444bc35a.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/data/icons/icons.png b/game/data/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/data/icons/icons.png.import b/game/data/icons/icons.png.import new file mode 100644 index 0000000..aa59dc0 --- /dev/null +++ b/game/data/icons/icons.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icons.png-b27181a78f3417a7c6a94542cf47974c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons.png" +dest_files=[ "res://.import/icons.png-b27181a78f3417a7c6a94542cf47974c.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/data/icons/items/gold.tres b/game/data/icons/items/gold.tres new file mode 100644 index 0000000..4cee830 --- /dev/null +++ b/game/data/icons/items/gold.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/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/data/icons/naturalist/amplify_pain.tres b/game/data/icons/naturalist/amplify_pain.tres new file mode 100644 index 0000000..5ccc4f9 --- /dev/null +++ b/game/data/icons/naturalist/amplify_pain.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/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/data/icons/naturalist/aspect_of_bees.tres b/game/data/icons/naturalist/aspect_of_bees.tres new file mode 100644 index 0000000..28ced35 --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_bees.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/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/data/icons/naturalist/aspect_of_scorpions.tres b/game/data/icons/naturalist/aspect_of_scorpions.tres new file mode 100644 index 0000000..b5704bf --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_scorpions.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/enchant-acid-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/aspect_of_wasps.tres b/game/data/icons/naturalist/aspect_of_wasps.tres new file mode 100644 index 0000000..7b631d9 --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_wasps.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/enchant-blue-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/aspect_of_wolves.tres b/game/data/icons/naturalist/aspect_of_wolves.tres new file mode 100644 index 0000000..f1aebbf --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_wolves.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/wild-orange-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/attunement.tres b/game/data/icons/naturalist/attunement.tres new file mode 100644 index 0000000..128e1ca --- /dev/null +++ b/game/data/icons/naturalist/attunement.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/horror-acid-3.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/calm.tres b/game/data/icons/naturalist/calm.tres new file mode 100644 index 0000000..1cb49a3 --- /dev/null +++ b/game/data/icons/naturalist/calm.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-5/wind-grasp-acid-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/close_wounds.tres b/game/data/icons/naturalist/close_wounds.tres new file mode 100644 index 0000000..84061b8 --- /dev/null +++ b/game/data/icons/naturalist/close_wounds.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/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/data/icons/naturalist/first_aid.tres b/game/data/icons/naturalist/first_aid.tres new file mode 100644 index 0000000..4ab5085 --- /dev/null +++ b/game/data/icons/naturalist/first_aid.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-1/61.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/inner_will.tres b/game/data/icons/naturalist/inner_will.tres new file mode 100644 index 0000000..0d2c2a6 --- /dev/null +++ b/game/data/icons/naturalist/inner_will.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-5/wind-grasp-eerie-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/ironbark.tres b/game/data/icons/naturalist/ironbark.tres new file mode 100644 index 0000000..2b48746 --- /dev/null +++ b/game/data/icons/naturalist/ironbark.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/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/data/icons/naturalist/natures_swiftness.tres b/game/data/icons/naturalist/natures_swiftness.tres new file mode 100644 index 0000000..0019ef9 --- /dev/null +++ b/game/data/icons/naturalist/natures_swiftness.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/haste-royal-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/regenerate.tres b/game/data/icons/naturalist/regenerate.tres new file mode 100644 index 0000000..9168a83 --- /dev/null +++ b/game/data/icons/naturalist/regenerate.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/wind-blue-1.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/rejuvenation.tres b/game/data/icons/naturalist/rejuvenation.tres new file mode 100644 index 0000000..ed54d58 --- /dev/null +++ b/game/data/icons/naturalist/rejuvenation.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/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/data/icons/naturalist/root.tres b/game/data/icons/naturalist/root.tres new file mode 100644 index 0000000..fbd59e6 --- /dev/null +++ b/game/data/icons/naturalist/root.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/vines-plain-1.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/shield_of_barbs.tres b/game/data/icons/naturalist/shield_of_barbs.tres new file mode 100644 index 0000000..64b7405 --- /dev/null +++ b/game/data/icons/naturalist/shield_of_barbs.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/protect-eerie-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/strength_of_nature.tres b/game/data/icons/naturalist/strength_of_nature.tres new file mode 100644 index 0000000..cc10385 --- /dev/null +++ b/game/data/icons/naturalist/strength_of_nature.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/lighting-acid-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/test.tres b/game/data/icons/naturalist/test.tres new file mode 100644 index 0000000..7069296 --- /dev/null +++ b/game/data/icons/naturalist/test.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 80, 928, 16, 16 ) diff --git a/game/data/icons/naturalist/uproot.tres b/game/data/icons/naturalist/uproot.tres new file mode 100644 index 0000000..3af0653 --- /dev/null +++ b/game/data/icons/naturalist/uproot.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/vines-plain-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/item_templates/1_gold.tres b/game/data/item_templates/1_gold.tres new file mode 100644 index 0000000..0495c01 --- /dev/null +++ b/game/data/item_templates/1_gold.tres @@ -0,0 +1,9 @@ +[gd_resource type="ItemTemplate" load_steps=2 format=2] + +[ext_resource path="res://data/icons/items/gold.tres" type="Texture" id=1] + +[resource] +id = 1 +text_name = "Gold" +item_type = 13 +icon = ExtResource( 1 ) diff --git a/game/data/item_templates/2_test.tres b/game/data/item_templates/2_test.tres new file mode 100644 index 0000000..63d8850 --- /dev/null +++ b/game/data/item_templates/2_test.tres @@ -0,0 +1,12 @@ +[gd_resource type="ItemTemplate" load_steps=3 format=2] + +[ext_resource path="res://scripts/items/ItemTemplateGD.gd" type="Script" id=1] +[ext_resource path="res://data/icons/3_iron_bar.tres" type="Texture" id=2] + +[resource] +resource_name = "Iron Bar" +id = 2 +text_name = "Iron Bar" +stack_size = 10 +icon = ExtResource( 2 ) +script = ExtResource( 1 ) diff --git a/game/data/item_templates/3_chest_of_the_infinite_wisdom.tres b/game/data/item_templates/3_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..4f17dc3 --- /dev/null +++ b/game/data/item_templates/3_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,34 @@ +[gd_resource type="ItemTemplate" load_steps=4 format=2] + +[ext_resource path="res://scripts/items/ItemTemplateGD.gd" type="Script" id=1] +[ext_resource path="res://data/item_visuals/1_chest_of_the_infinite_wisdom.tres" type="ItemVisual" id=2] +[ext_resource path="res://data/icons/4_chest_of_the_infinite_wisdom.tres" type="Texture" id=3] + +[resource] +resource_name = "Chest of the Infinite Wisdom" +id = 3 +text_name = "Chest of the Infinite Wisdom" +item_type = 1 +rarity = 6 +armor_type = 1 +equip_slot = 3 +item_visual = ExtResource( 2 ) +icon = ExtResource( 3 ) +item_stat_modifier_count = 2 +Modifiers_0/stat_id = 8 +Modifiers_0/min_base_mod = 1000.0 +Modifiers_0/max_base_mod = 0.0 +Modifiers_0/min_bonus_mod = 1000.0 +Modifiers_0/max_bonus_mod = 0.0 +Modifiers_0/min_percent_mod = 0.0 +Modifiers_0/max_percent_mod = 0.0 +Modifiers_0/scaling_factor = 1.0 +Modifiers_1/stat_id = 7 +Modifiers_1/min_base_mod = 1000.0 +Modifiers_1/max_base_mod = 0.0 +Modifiers_1/min_bonus_mod = 1000.0 +Modifiers_1/max_bonus_mod = 0.0 +Modifiers_1/min_percent_mod = 0.0 +Modifiers_1/max_percent_mod = 0.0 +Modifiers_1/scaling_factor = 1.0 +script = ExtResource( 1 ) diff --git a/game/data/planets/1_test.tres b/game/data/planets/1_test.tres new file mode 100644 index 0000000..0d2253c --- /dev/null +++ b/game/data/planets/1_test.tres @@ -0,0 +1,9 @@ +[gd_resource type="PlanetData" load_steps=3 format=2] + +[ext_resource path="res://data/biomes/1_test.tres" type="BiomeData" id=1] +[ext_resource path="res://scripts/planets/simple_planet.gd" type="Script" id=2] + +[resource] +id = 1 +target_script = ExtResource( 2 ) +biome_datas = [ ExtResource( 1 ) ] diff --git a/game/data/planets/2_tdungeon.tres b/game/data/planets/2_tdungeon.tres new file mode 100644 index 0000000..9093fb4 --- /dev/null +++ b/game/data/planets/2_tdungeon.tres @@ -0,0 +1,9 @@ +[gd_resource type="PlanetData" load_steps=3 format=2] + +[ext_resource path="res://data/biomes/2_tdungb.tres" type="BiomeData" id=1] +[ext_resource path="res://scripts/planets/dung_simple_planet.gd" type="Script" id=2] + +[resource] +id = 2 +target_script = ExtResource( 2 ) +biome_datas = [ ExtResource( 1 ) ] diff --git a/game/data/player_character_data/1_naturalist.tres b/game/data/player_character_data/1_naturalist.tres new file mode 100644 index 0000000..226faf4 --- /dev/null +++ b/game/data/player_character_data/1_naturalist.tres @@ -0,0 +1,17 @@ +[gd_resource type="EntityData" load_steps=5 format=2] + +[ext_resource path="res://data/entity_classes/1_naturalist.tres" type="EntityClassData" id=1] +[ext_resource path="res://scripts/entities/EntityDataGD.gd" type="Script" id=2] +[ext_resource path="res://data/crafting/1_test_craft.tres" type="CraftRecipe" id=3] +[ext_resource path="res://data/crafting/2_chest_of_the_infinite_wisdom.tres" type="CraftRecipe" id=4] + +[resource] +resource_name = "Naturalist" +id = 1 +entity_type = 4 +entity_controller = 1 +text_name = "Naturalist" +bag_size = 24 +entity_class_data = ExtResource( 1 ) +craft_recipes = [ ExtResource( 3 ), ExtResource( 4 ) ] +script = ExtResource( 2 ) diff --git a/game/data/spell_effects/textures/arrows.png b/game/data/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/data/spell_effects/textures/big_glow.png.import b/game/data/spell_effects/textures/big_glow.png.import new file mode 100644 index 0000000..ad06fe9 --- /dev/null +++ b/game/data/spell_effects/textures/big_glow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/big_glow.png-d3eda1d6185d63bdc430c646a22bb62f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/big_glow.png" +dest_files=[ "res://.import/big_glow.png-d3eda1d6185d63bdc430c646a22bb62f.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/data/spell_effects/textures/main_texture.png b/game/data/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/data/spell_effects/textures/main_texture.png.import b/game/data/spell_effects/textures/main_texture.png.import new file mode 100644 index 0000000..0a40480 --- /dev/null +++ b/game/data/spell_effects/textures/main_texture.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/main_texture.png-f00e0ab4ed97ff1475835686a7454874.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/main_texture.png" +dest_files=[ "res://.import/main_texture.png-f00e0ab4ed97ff1475835686a7454874.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/data/spell_effects/textures/small_star.png b/game/data/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/data/spell_effects/textures/small_star.png.import b/game/data/spell_effects/textures/small_star.png.import new file mode 100644 index 0000000..b453d45 --- /dev/null +++ b/game/data/spell_effects/textures/small_star.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_star.png-df42addd723ec8255619446fbe11ce1a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/small_star.png" +dest_files=[ "res://.import/small_star.png-df42addd723ec8255619446fbe11ce1a.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/data/spell_effects/textures/star.png b/game/data/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/data/spell_effects/textures/star.png.import b/game/data/spell_effects/textures/star.png.import new file mode 100644 index 0000000..abac45d --- /dev/null +++ b/game/data/spell_effects/textures/star.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/star.png-d57669aa5fea5b6090428296488efa8d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/star.png" +dest_files=[ "res://.import/star.png-d57669aa5fea5b6090428296488efa8d.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/data/spells/10_aspect_of_scorpions_rank_1.tres b/game/data/spells/10_aspect_of_scorpions_rank_1.tres new file mode 100644 index 0000000..0f84b99 --- /dev/null +++ b/game/data/spells/10_aspect_of_scorpions_rank_1.tres @@ -0,0 +1,26 @@ +[gd_resource type="Spell" load_steps=6 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/10_aspect_of_scorpions_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://data/effect_data/aspect_of_scorpions.tres" type="SpellEffectVisual" id=4] +[ext_resource path="res://data/spells/27_aspect_of_scorpions.tres" type="Spell" id=5] + +[resource] +resource_name = "Aspect of Scorpions" +id = 10 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +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 = true +range_range = 26.0 +cast = true +cast_cast_time = 1.2 +training_required_spell = ExtResource( 5 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/11_aspect_of_wasps_rank_1.tres b/game/data/spells/11_aspect_of_wasps_rank_1.tres new file mode 100644 index 0000000..067426e --- /dev/null +++ b/game/data/spells/11_aspect_of_wasps_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/11_aspect_of_wasps_rank1.tres" type="Aura" id=3] +[ext_resource path="res://data/spells/28_aspectofwasps.tres" type="Spell" id=4] + +[resource] +resource_name = "Aspect of Wasps" +id = 11 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +target_aura_applys = [ ExtResource( 3 ) ] +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 = true +range_range = 26.0 +aoe_targetType = 541 +aoe_colliderType = 541 +training_required_spell = ExtResource( 4 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/12_aspect_of_wolves_rank_1.tres b/game/data/spells/12_aspect_of_wolves_rank_1.tres new file mode 100644 index 0000000..c4d6fd5 --- /dev/null +++ b/game/data/spells/12_aspect_of_wolves_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/12_aspect_of_wolves_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://data/spells/29_aspect_of_wolves.tres" type="Spell" id=4] + +[resource] +resource_name = "Aspect of Wolves" +id = 12 +spell_type = 8 +rank = 10 +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 = true +range_range = 26.0 +aoe_targetType = 1129071960 +aoe_colliderType = 1058050193 +training_required_spell = ExtResource( 4 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/13_aspect_of_bees_rank_1.tres b/game/data/spells/13_aspect_of_bees_rank_1.tres new file mode 100644 index 0000000..8651131 --- /dev/null +++ b/game/data/spells/13_aspect_of_bees_rank_1.tres @@ -0,0 +1,27 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/13_aspect_of_bees_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://data/spells/30_aspect_of_bees.tres" type="Spell" id=4] + +[resource] +resource_name = "Aspect of Bees" +id = 13 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +needs_target = true +target_aura_applys = [ ExtResource( 3 ) ] +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 = true +range_range = 26.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +training_required_spell = ExtResource( 4 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/14_amplify_pain_rank_1.tres b/game/data/spells/14_amplify_pain_rank_1.tres new file mode 100644 index 0000000..b5c1b53 --- /dev/null +++ b/game/data/spells/14_amplify_pain_rank_1.tres @@ -0,0 +1,38 @@ +[gd_resource type="Spell" load_steps=6 format=2] + +[ext_resource path="res://scripts/spells/amplify_pain.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/amplify_pain.tres" type="Texture" id=2] +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=3] +[ext_resource path="res://data/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=5] + +[sub_resource type="SpellEffectVisual" id=1] +script = ExtResource( 3 ) +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_time = 0.4 +root_spell_cast_finish_effect_time = 1.0 + +[resource] +resource_name = "Amplify Pain" +id = 14 +spell_type = 8 +level = 10 +icon = ExtResource( 2 ) +visual_spell_effects = SubResource( 1 ) +text_name = "Amplify Pain" +text_description = "Range: 26m. +Casttime: {3}. +Causes your damage over time effects to tick." +range = true +range_range = 26.0 +cast = true +cast_cast_time = 1.5 +damage = true +damage_type = 16 +damage_min = 130 +damage_max = 150 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 1 ) diff --git a/game/data/spells/15_rejuvenation_rank_1.tres b/game/data/spells/15_rejuvenation_rank_1.tres new file mode 100644 index 0000000..a6f789c --- /dev/null +++ b/game/data/spells/15_rejuvenation_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://data/icons/naturalist/rejuvenation.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/14_rejuvenation_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Rejuvenation" +id = 15 +spell_type = 8 +target_type = 2 +target_relation_type = 4 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 3 ) ] +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( 1 ) diff --git a/game/data/spells/16_close_wounds_rank_1.tres b/game/data/spells/16_close_wounds_rank_1.tres new file mode 100644 index 0000000..2b00494 --- /dev/null +++ b/game/data/spells/16_close_wounds_rank_1.tres @@ -0,0 +1,23 @@ +[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://data/icons/naturalist/close_wounds.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/15_close_wounds_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Close Wounds" +id = 16 +spell_type = 8 +target_type = 2 +target_relation_type = -870457328 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 3 ) ] +text_name = "Close Wounds" +text_description = "Casttime: 2 sec. +Cooldown: {2} +Heals you for 720 to 780 every 3 sec for 21 sec." +cast = true +cast_cast_time = 1.3 +aoe_colliderType = -2147479552 +script = ExtResource( 1 ) diff --git a/game/data/spells/17_ironbark_rank_1.tres b/game/data/spells/17_ironbark_rank_1.tres new file mode 100644 index 0000000..fe4e3c7 --- /dev/null +++ b/game/data/spells/17_ironbark_rank_1.tres @@ -0,0 +1,24 @@ +[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://data/icons/naturalist/ironbark.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/16_ironbark_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Ironbark" +id = 17 +spell_type = 8 +target_type = 480 +target_relation_type = 914787760 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 3 ) ] +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 +cooldown_global_cooldown = false +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 1 ) diff --git a/game/data/spells/18_natures_swiftness_rank_1.tres b/game/data/spells/18_natures_swiftness_rank_1.tres new file mode 100644 index 0000000..da63fe3 --- /dev/null +++ b/game/data/spells/18_natures_swiftness_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://data/icons/naturalist/natures_swiftness.tres" type="Texture" id=1] +[ext_resource path="res://data/auras/17_natures_swiftness_rank_1.tres" type="Aura" id=2] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=3] + +[resource] +resource_name = "Nature's Swiftness" +id = 18 +spell_type = 8 +target_type = 520 +target_relation_type = 393653346 +rank = 1 +icon = ExtResource( 1 ) +caster_aura_applys = [ ExtResource( 2 ) ] +text_name = "Nature's Swiftness" +text_description = "Instant. +Cooldown: {2} +Increases your movement speed by 60% for 6 sec. This spell is not on the global cooldown." +cooldown_cooldown = 20.0 +cooldown_global_cooldown = false +aoe_targetType = 520 +aoe_colliderType = 186459648 +script = ExtResource( 3 ) diff --git a/game/data/spells/19_uproot_rank_1.tres b/game/data/spells/19_uproot_rank_1.tres new file mode 100644 index 0000000..19f806b --- /dev/null +++ b/game/data/spells/19_uproot_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://data/icons/naturalist/uproot.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] + +[resource] +resource_name = "Uproot" +id = 19 +spell_type = 8 +target_type = -2147460864 +rank = 1 +icon = ExtResource( 1 ) +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 = true +range_range = 15.0 +aoe = true +aoe_targetType = -572653568 +aoe_colliderType = 537722880 +script = ExtResource( 2 ) diff --git a/game/data/spells/1_test_spell.tres b/game/data/spells/1_test_spell.tres new file mode 100644 index 0000000..db80897 --- /dev/null +++ b/game/data/spells/1_test_spell.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://data/icons/naturalist/test.tres" type="Texture" id=2] + +[resource] +resource_name = "adadadadadad" +spell_type = 16 +target_relation_type = -138672214 +rank = 1 +icon = ExtResource( 2 ) +needs_target = true +text_name = "adadadadadad" +damage = true +damage_min = 200 +damage_max = 300 +aoe_targetType = 1431112251 +aoe_colliderType = 827465778 +script = ExtResource( 1 ) diff --git a/game/data/spells/20_root_rank_1.tres b/game/data/spells/20_root_rank_1.tres new file mode 100644 index 0000000..20e46d6 --- /dev/null +++ b/game/data/spells/20_root_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://data/icons/naturalist/root.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://data/auras/20_root_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Root" +id = 20 +spell_type = 8 +rank = 1 +icon = ExtResource( 1 ) +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Root" +text_description = "Range: 26m. +Casttime: 1.5 sec. +Cooldown: {2} +Roots the target for 8 sec." +range = true +cast = true +cast_cast_time = 1.4 +aoe_targetType = 8 +aoe_colliderType = 537722880 +script = ExtResource( 2 ) diff --git a/game/data/spells/21_strength_of_nature_rank_1.tres b/game/data/spells/21_strength_of_nature_rank_1.tres new file mode 100644 index 0000000..d140825 --- /dev/null +++ b/game/data/spells/21_strength_of_nature_rank_1.tres @@ -0,0 +1,25 @@ +[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://data/icons/naturalist/strength_of_nature.tres" type="Texture" id=2] + +[resource] +resource_name = "Strength of Nature" +id = 21 +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 = true +heal_min = 6700 +heal_max = 7000 +aoe_targetType = 5 +aoe_colliderType = 7602273 +script = ExtResource( 1 ) diff --git a/game/data/spells/22_shield_of_barbs_rank_1.tres b/game/data/spells/22_shield_of_barbs_rank_1.tres new file mode 100644 index 0000000..f713fb7 --- /dev/null +++ b/game/data/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://data/icons/naturalist/shield_of_barbs.tres" type="Texture" id=2] + +[resource] +resource_name = "Shield of Barbs" +id = 22 +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/data/spells/23_calm_rank_1.tres b/game/data/spells/23_calm_rank_1.tres new file mode 100644 index 0000000..9bd08fd --- /dev/null +++ b/game/data/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://data/icons/naturalist/calm.tres" type="Texture" id=2] + +[resource] +resource_name = "Calm" +id = 23 +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/data/spells/24_attunement_rank_1.tres b/game/data/spells/24_attunement_rank_1.tres new file mode 100644 index 0000000..29e0693 --- /dev/null +++ b/game/data/spells/24_attunement_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://data/icons/naturalist/attunement.tres" type="Texture" id=2] + +[resource] +resource_name = "Attunement" +id = 24 +spell_type = 8 +target_type = -2147448576 +target_relation_type = 24 +rank = 1 +icon = ExtResource( 2 ) +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( 1 ) diff --git a/game/data/spells/25_inner_will.tres b/game/data/spells/25_inner_will.tres new file mode 100644 index 0000000..7c3cb77 --- /dev/null +++ b/game/data/spells/25_inner_will.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://data/icons/naturalist/inner_will.tres" type="Texture" id=2] + +[resource] +resource_name = "Inner Will" +id = 25 +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 +cooldown_global_cooldown = false +aoe_targetType = 7 +aoe_colliderType = 480 +script = ExtResource( 1 ) diff --git a/game/data/spells/26_rest.tres b/game/data/spells/26_rest.tres new file mode 100644 index 0000000..00cc4d9 --- /dev/null +++ b/game/data/spells/26_rest.tres @@ -0,0 +1,17 @@ +[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://data/icons/naturalist/regenerate.tres" type="Texture" id=2] + +[resource] +resource_name = "Rest" +id = 26 +spell_type = 1 +target_type = 2 +target_relation_type = 24 +icon = ExtResource( 2 ) +text_name = "Rest" +text_description = "Rest for 30 seconds, greatly increasing your regeneration." +aoe_targetType = 5 +aoe_colliderType = 1065353216 +script = ExtResource( 1 ) diff --git a/game/data/spells/27_aspect_of_scorpions.tres b/game/data/spells/27_aspect_of_scorpions.tres new file mode 100644 index 0000000..39a504b --- /dev/null +++ b/game/data/spells/27_aspect_of_scorpions.tres @@ -0,0 +1,25 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://data/icons/naturalist/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://data/auras/21_aspect_of_scorpions.tres" type="Aura" id=3] +[ext_resource path="res://data/effect_data/aspect_of_scorpions.tres" type="SpellEffectVisual" id=4] + +[resource] +resource_name = "Aspect of Scorpions" +id = 27 +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 = true +range_range = 26.0 +cast = true +cast_cast_time = 1.2 +spell_cooldown_mainpulation_data_count = -1 +script = ExtResource( 2 ) diff --git a/game/data/spells/28_aspectofwasps.tres b/game/data/spells/28_aspectofwasps.tres new file mode 100644 index 0000000..5dbed01 --- /dev/null +++ b/game/data/spells/28_aspectofwasps.tres @@ -0,0 +1,22 @@ +[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://data/auras/22_aspect_of_wasps.tres" type="Aura" id=2] +[ext_resource path="res://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 28 +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 = true +range_range = 26.0 +aoe_targetType = 541 +aoe_colliderType = 541 +script = ExtResource( 1 ) diff --git a/game/data/spells/29_aspect_of_wolves.tres b/game/data/spells/29_aspect_of_wolves.tres new file mode 100644 index 0000000..325e2b4 --- /dev/null +++ b/game/data/spells/29_aspect_of_wolves.tres @@ -0,0 +1,22 @@ +[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://data/auras/23_aspect_of_wolves.tres" type="Aura" id=2] +[ext_resource path="res://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 29 +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 = true +range_range = 26.0 +aoe_targetType = 1129071960 +aoe_colliderType = 1058050193 +script = ExtResource( 1 ) diff --git a/game/data/spells/2_test_cast_spell.tres b/game/data/spells/2_test_cast_spell.tres new file mode 100644 index 0000000..5e4130a --- /dev/null +++ b/game/data/spells/2_test_cast_spell.tres @@ -0,0 +1,14 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://data/icons/naturalist/natures_swiftness.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] + +[resource] +id = 2 +spell_type = 16 +target_type = -2147461888 +target_relation_type = 4 +rank = 1 +icon = ExtResource( 1 ) +aoe_targetType = -2147459840 +script = ExtResource( 2 ) diff --git a/game/data/spells/30_aspect_of_bees.tres b/game/data/spells/30_aspect_of_bees.tres new file mode 100644 index 0000000..6d75c09 --- /dev/null +++ b/game/data/spells/30_aspect_of_bees.tres @@ -0,0 +1,26 @@ +[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://data/auras/24_aspect_of_bees.tres" type="Aura" id=2] +[ext_resource path="res://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 30 +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 = true +range_range = 26.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 1 ) diff --git a/game/data/spells/31_overload.tres b/game/data/spells/31_overload.tres new file mode 100644 index 0000000..5494a89 --- /dev/null +++ b/game/data/spells/31_overload.tres @@ -0,0 +1,40 @@ +[gd_resource type="Spell" load_steps=7 format=2] + +[ext_resource path="res://data/icons/naturalist/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://data/spell_effects/nature/AmplifyPain.tscn" type="PackedScene" id=4] +[ext_resource path="res://data/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 = true +range_range = 26.0 +cast = true +cast_cast_time = 1.5 +damage = true +damage_type = 16 +damage_min = 130 +damage_max = 150 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 3 ) diff --git a/game/data/spells/32_heat.tres b/game/data/spells/32_heat.tres new file mode 100644 index 0000000..35c17a3 --- /dev/null +++ b/game/data/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/data/spells/33_normal.tres b/game/data/spells/33_normal.tres new file mode 100644 index 0000000..0ae7212 --- /dev/null +++ b/game/data/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/data/spells/34_cold.tres b/game/data/spells/34_cold.tres new file mode 100644 index 0000000..11bcbbc --- /dev/null +++ b/game/data/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/data/world_spells/1_testwp.tres b/game/data/world_spells/1_testwp.tres new file mode 100644 index 0000000..af613f4 --- /dev/null +++ b/game/data/world_spells/1_testwp.tres @@ -0,0 +1,6 @@ +[gd_resource type="WorldSpellData" format=2] + +[resource] +resource_name = "Test" +id = 1 +text_name = "Test" diff --git a/game/data/xp/xp_data.tres b/game/data/xp/xp_data.tres new file mode 100644 index 0000000..57e1f70 --- /dev/null +++ b/game/data/xp/xp_data.tres @@ -0,0 +1,52 @@ +[gd_resource type="XPData" format=2] + +[resource] +level_2 = 600 +level_3 = 1000 +level_4 = 1000 +level_5 = 1000 +level_6 = 1000 +level_7 = 1000 +level_8 = 1000 +level_9 = 1000 +level_10 = 1000 +level_11 = 1000 +level_12 = 1000 +level_13 = 1000 +level_14 = 1000 +level_15 = 1000 +level_16 = 1000 +level_17 = 1000 +level_18 = 1000 +level_19 = 1000 +level_20 = 1000 +level_21 = 1000 +level_22 = 1000 +level_23 = 1000 +level_24 = 1000 +level_25 = 1000 +level_26 = 1000 +level_27 = 1000 +level_28 = 1000 +level_29 = 1000 +level_30 = 1000 +level_31 = 1000 +level_32 = 1000 +level_33 = 1000 +level_34 = 1000 +level_35 = 1000 +level_36 = 1000 +level_37 = 1000 +level_38 = 1000 +level_39 = 1000 +level_40 = 1000 +level_41 = 1000 +level_42 = 1000 +level_43 = 1000 +level_44 = 1000 +level_45 = 1000 +level_46 = 1000 +level_47 = 1000 +level_48 = 1000 +level_49 = 1000 +level_50 = 1000 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/dungeon_generator/DungeonGeneratorScene.gd b/game/dungeon_generator/DungeonGeneratorScene.gd new file mode 100644 index 0000000..8dbdc40 --- /dev/null +++ b/game/dungeon_generator/DungeonGeneratorScene.gd @@ -0,0 +1,191 @@ +extends Navigation2D + +export (PackedScene) var room : PackedScene +export (NodePath) var map_path : NodePath + +var map + +var tile_size : int = 3 +var num_rooms : int = 50 +var min_size : int = 9 +var max_size : int = 20 +var hspread : float = 400 +var cull : float = 0.5 + +var path : AStar + +func _ready(): + map = get_node(map_path) + + randomize() + make_rooms() + +func make_rooms(): + for i in range(num_rooms): + var pos : Vector2 = Vector2(rand_range(-hspread, hspread), 0) + var r : Node = room.instance() + var w = min_size + randi() % (max_size - min_size) + var h = min_size + randi() % (max_size - min_size) + + r.make_room(pos, Vector2(w, h)* tile_size) + $Rooms.add_child(r) + r.owner = $Rooms + + yield(get_tree().create_timer(1.1), 'timeout') + #cull rooms + var room_positions : Array = [] + for room in $Rooms.get_children(): + if randf() < cull: + room.queue_free() + else: + room.mode = RigidBody2D.MODE_STATIC + room_positions.append(Vector3(room.position.x, room.position.y, 0)) + + yield(get_tree(), 'idle_frame') + + #generate MST + path = find_mst(room_positions) + + make_map() + + +func a_draw(): + for room in $Rooms.get_children(): + draw_rect(Rect2(room.position - room.size, room.size * 2), + Color(0, 1, 0), false) + + if path: + for p in path.get_points(): + for c in path.get_point_connections(p): + var pp = path.get_point_position(p) + var cp = path.get_point_position(c) + + draw_line(Vector2(pp.x, pp.y), Vector2(cp.x, cp.y), Color(1, 1, 0), 15, true) + +func a_process(delta): + update() + +func a_input(event): + if event.is_action_pressed('ui_select'): + for n in $Rooms.get_children(): + n.queue_free() + + path = null + + make_rooms() + + if event.is_action_pressed('ui_focus_next'): + make_map() + +func find_mst(nodes : Array) -> AStar: + #Prim's algorithm + var path = AStar.new() + path.add_point(path.get_available_point_id(), nodes.pop_front()) + + while nodes: + var min_dist = INF + var min_p = null + var p = null + + for p1 in path.get_points(): + p1 = path.get_point_position(p1) + + for p2 in nodes: + if p1.distance_to(p2) < min_dist: + min_dist = p1.distance_to(p2) + min_p = p2 + p = p1 + + var n = path.get_available_point_id() + path.add_point(n, min_p) + path.connect_points(path.get_closest_point(p), n) + nodes.erase(min_p) + + return path + +func make_map() -> void: + map.clear() + + #for x in range(0, 200): + # for y in range(0, 200): + # tile_map.set_cell(x, y, 0) + + #fill tilemap with walls + #var full_rect = Rect2() + #carve the rooms + var corridors = [] + var mob_count = 0 + var player_spawned = false + for room in $Rooms.get_children(): + var top_left = room.position.floor() + var bottom_right = (top_left + room.size).floor() + + for x in range(top_left.x, bottom_right.x): + for z in range(top_left.y, bottom_right.y): + for y in range(0, 2): + map.draw_voxel_data_point(Vector3(x, y, z), 0, randi() % 255) + + + #connection + #var p = path.get_closest_point(Vector3(room.position.x, room.position.y, 0)) + + #for conn in path.get_point_connections(p): + # if not conn in corridors: + # var start = Vector2(path.get_point_position(p).x, path.get_point_position(p).y).ceil() + # var end = Vector2(path.get_point_position(conn).x, path.get_point_position(conn).y).ceil() + + # carve_path(start, end) + + #corridors.append(p) + + var pos : Vector2 = room.position + (room.size / 2).floor() + if not player_spawned: + #Entities.spawn_player(1, Vector3(pos.x, 2, pos.y)) + player_spawned = true + else: + if mob_count < 20: + Entities.spawn_mob(1, randi() % 3, Vector3(pos.x, 2, pos.y)) + mob_count += 1 + + map.build() + +func carve_path(pos1, pos2): + var x_diff = sign(pos2.x - pos1.x) + var y_diff = sign(pos2.y - pos1.y) + + if x_diff == 0: + x_diff = pow(-1.0, randi() % 2) + if y_diff == 0: + y_diff = pow(-1.0, randi() % 2) + + var x_y = pos1 + var y_x = pos2 + + #if (randi() % 2) > 0: + # x_y = pos2 + # y_x = pos1 + + for x in range(pos1.x, pos2.x, x_diff): + for n in range(5): + var tile = 1 + + if n == 0 or n == 4: + tile = 0 + + # if tile_map.get_cell(x, x_y.y + (n * y_diff)) != 1: + # tile_map.set_cell(x, x_y.y + (n * y_diff), tile) + + for y in range(pos1.y, pos2.y, y_diff): + for n in range(5): + var tile = 1 + + if n == 0 or n == 4: + tile = 0 + + # if tile_map.get_cell(y_x.x + (n * x_diff), y) != 1: + # tile_map.set_cell(y_x.x + (n * x_diff), y, tile) + + + + + diff --git a/game/dungeon_generator/DungeonGeneratorScene.tscn b/game/dungeon_generator/DungeonGeneratorScene.tscn new file mode 100644 index 0000000..3d33b3b --- /dev/null +++ b/game/dungeon_generator/DungeonGeneratorScene.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://dungeon_generator/DungeonGeneratorScene.gd" type="Script" id=1] +[ext_resource path="res://dungeon_generator/Room.tscn" type="PackedScene" id=2] + +[node name="DungeonGenerator" type="Navigation2D"] +script = ExtResource( 1 ) +room = ExtResource( 2 ) + +[node name="Rooms" type="Node" parent="."] + +[node name="Camera2D" type="Camera2D" parent="."] +current = true +zoom = Vector2( 10, 10 ) diff --git a/game/dungeon_generator/MainDungeonGenerator.gd b/game/dungeon_generator/MainDungeonGenerator.gd new file mode 100644 index 0000000..179a311 --- /dev/null +++ b/game/dungeon_generator/MainDungeonGenerator.gd @@ -0,0 +1,25 @@ +tool +extends Resource +class_name MainDungeonGenerator + +enum GenType { + TEST = 0, NORMAL = 1, NOISE3D = 2, ANL = 3 +} + + +export(MeshDataResource) var prop_mesht : MeshDataResource + + +export(int) var gen_type : int = GenType.NORMAL +export(int) var _level_seed : int +export(bool) var _spawn_mobs : bool + +var _world : Navigation2D + +func setup(world : Navigation2D, level_seed : int, spawn_mobs : bool) -> void: + _level_seed = level_seed + _world = world + _spawn_mobs = spawn_mobs + +func _generate_chunk(chunk : Resource) -> void: + pass diff --git a/game/dungeon_generator/Room.gd b/game/dungeon_generator/Room.gd new file mode 100644 index 0000000..8454f30 --- /dev/null +++ b/game/dungeon_generator/Room.gd @@ -0,0 +1,13 @@ +extends RigidBody2D + +var size : Vector2 + +func make_room(_pos : Vector2, _size : Vector2): + position = _pos + size = _size + + var s : RectangleShape2D = RectangleShape2D.new() + s.custom_solver_bias = 0.75 + s.extents = size + + $CollisionShape2D.shape = s diff --git a/game/dungeon_generator/Room.tscn b/game/dungeon_generator/Room.tscn new file mode 100644 index 0000000..54ce402 --- /dev/null +++ b/game/dungeon_generator/Room.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://dungeon_generator/Room.gd" type="Script" id=1] + +[node name="Room" type="RigidBody2D"] +collision_layer = 524288 +collision_mask = 524288 +mode = 2 +script = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] diff --git a/game/dungeon_generator/old_voxelmanlevelgenerator.tres b/game/dungeon_generator/old_voxelmanlevelgenerator.tres new file mode 100644 index 0000000..e1e74d8 --- /dev/null +++ b/game/dungeon_generator/old_voxelmanlevelgenerator.tres @@ -0,0 +1,11 @@ +[gd_resource type="VoxelmanLevelGenerator" load_steps=3 format=2] + +[ext_resource path="res://dungeon_generator/MainDungeonGenerator.gd" type="Script" id=1] +[ext_resource path="res://prop_tool/dada.tres" type="PropData" id=2] + +[resource] +script = ExtResource( 1 ) +prop = ExtResource( 2 ) +gen_type = 1 +_level_seed = 35 +_spawn_mobs = false diff --git a/game/icon.png b/game/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad9b4311700295590d65d2634a34661cd29a312 GIT binary patch literal 7569 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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/menu/CharacterEntry.gd b/game/menu/CharacterEntry.gd new file mode 100644 index 0000000..3f2a8c6 --- /dev/null +++ b/game/menu/CharacterEntry.gd @@ -0,0 +1,32 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 + +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 + + +func setup(pfile_name : String, name : String, cls_name : String, level : int, pentity : Entity) -> void: + file_name = pfile_name + name_label.text = name + class_label.text = cls_name + level_label.text = str(level) + entity = pentity + +func set_class_name(name : String) -> void: + class_label.text = name diff --git a/game/menu/CharacterEntry.tscn b/game/menu/CharacterEntry.tscn new file mode 100644 index 0000000..54ca93d --- /dev/null +++ b/game/menu/CharacterEntry.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://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/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 = 76.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 = 138.0 +margin_bottom = 15.0 + +[node name="class" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 138.0 +margin_bottom = 38.0 + +[node name="level" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 138.0 +margin_bottom = 61.0 diff --git a/game/menu/character_creation_button_group.tres b/game/menu/character_creation_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/menu/character_creation_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/menu/menu_character_button_group.tres b/game/menu/menu_character_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/menu/menu_character_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/networking/PlayerMaster.gd b/game/networking/PlayerMaster.gd new file mode 100644 index 0000000..fe8c245 --- /dev/null +++ b/game/networking/PlayerMaster.gd @@ -0,0 +1,24 @@ +extends Resource +class_name PlayerMaster + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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/networking/SpawnPoint.gd b/game/networking/SpawnPoint.gd new file mode 100644 index 0000000..4be573a --- /dev/null +++ b/game/networking/SpawnPoint.gd @@ -0,0 +1,118 @@ +extends Spatial + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 : Navigation2D + +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 Navigation2D + + 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 = Entities.spawn_player(1, Vector3(10, 20, 10), "Player", "1", 1) + call_deferred("set_terrarin_player") +# +# Entities.spawn_mob(1, 50, Vector3(20, 6, 20)) +# Entities.spawn_mob(1, 50, Vector3(54, 6, 22)) +# Entities.spawn_mob(1, 50, Vector3(76, 6, 54)) + +func set_terrarin_player(): + terrarin.set_player(player as Node2D) + +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/player/CameraPivot.gd b/game/player/CameraPivot.gd new file mode 100644 index 0000000..4ca93e5 --- /dev/null +++ b/game/player/CameraPivot.gd @@ -0,0 +1,74 @@ +extends Spatial + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (float) var max_camera_distance : float = 20.0 + +var target_camera_distance : float = 6.0 +var camera_distance : float = target_camera_distance + +var camera : Camera + +var x_rot : float = 0.0 +var y_rot : float = 0.0 + +var player : Entity + +func _ready() -> void: + camera = $Camera + + camera.translation.z = target_camera_distance + + player = get_node("..") + + set_physics_process(true) + +func _physics_process(delta): + var pos : Vector3 = to_global(Vector3()) + + var space_state = get_world().direct_space_state + + var result : Dictionary = space_state.intersect_ray(pos, to_global(Vector3(0, 0, target_camera_distance)), [player], player.collision_mask) + + if result: + camera_distance = (result.position - pos).length() - 0.2 + else: + camera_distance = target_camera_distance + + camera.translation.z = camera_distance + +func camera_distance_set_delta(delta : float) -> void: + target_camera_distance += delta + + if target_camera_distance > max_camera_distance: + target_camera_distance = max_camera_distance + elif target_camera_distance < 0: + target_camera_distance = 0 + +func rotate_delta(x_delta : float, y_delta : float) -> void: + x_rot += y_delta + y_rot += x_delta + + x_rot = clamp(x_rot, -90, 90) + + if y_rot >= 360: + y_rot = y_rot - 360 + if y_rot < 0: + y_rot = y_rot + 360 + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) + +func get_y_rot() -> float: + return y_rot + +func set_y_rot(yrot : float) -> void: + y_rot = yrot + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) + +func a_process(delta : float) -> void: + y_rot += delta + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) 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/DisplayEntity.gd b/game/player/DisplayEntity.gd new file mode 100644 index 0000000..ae4ea4a --- /dev/null +++ b/game/player/DisplayEntity.gd @@ -0,0 +1,379 @@ +extends Entity + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 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 queued_camera_rotaions : 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 camera : Camera +var camera_pivot : Spatial + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +var animation_run : bool = false + +var moving : bool = false +var casting_anim : bool = false + +var last_mouse_over : Entity = null + +func _ready() -> void: + camera = $CameraPivot/Camera as Camera + camera_pivot = $CameraPivot as Spatial + + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + set_process(true) + +func _physics_process(delta : float) -> void: + if not _on: + return + + process_input(delta) + process_movement(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 = 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: + if anim_node_state_machine != null and not animation_run: + anim_node_state_machine.travel("run-loop") + animation_run = true + + input_dir = input_dir.normalized() + + animation_tree["parameters/run-loop/blend_position"] = input_dir + else: + if anim_node_state_machine != null and animation_run: + anim_node_state_machine.travel("idle-loop") + animation_run = false + + if queued_camera_rotaions.length_squared() > 1: + camera_pivot.rotate_delta(queued_camera_rotaions.x * 2.0, -queued_camera_rotaions.y) + queued_camera_rotaions = Vector2() + + +func process_movement(delta : float) -> void: + var state : int = 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.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() + + moving = true + moved() + else: + dir = Vector3() + moving = false + + 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)) + + if get_tree().network_peer: + if get_tree().is_network_server(): + rset_position(position, rotation) + else: + rpc("set_position", position, rotation) + +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_down_delta = Vector2() + mouse_down_pos = event.position + + if event.button_index == BUTTON_RIGHT and event.device != -1: + mouse_right_down = event.pressed + + + if mouse_left_down and mouse_right_down: + mouse_move_dir.y = 1 + else: + mouse_move_dir.y = 0 + + 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 is InputEventScreenTouch and event.pressed: + target(event.position) + + 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 from = camera.project_ray_origin(position) + var to = from + camera.project_ray_normal(position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + print(result) + if result.collider and result.collider is Entity: + var ent : Entity = result.collider as Entity + + crequest_target_change(ent.get_path()) + return + + crequest_target_change(NodePath()) + else: + crequest_target_change(NodePath()) + +func cmouseover(event): + var from = camera.project_ray_origin(event.position) + var to = from + camera.project_ray_normal(event.position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + if result.collider and result.collider is Entity: + var mo : Entity = result.collider as Entity + + if last_mouse_over != null and last_mouse_over != mo: + if is_instance_valid(last_mouse_over): + last_mouse_over.onc_mouse_exit() + + last_mouse_over = null + + if last_mouse_over == null: + mo.onc_mouse_enter() + last_mouse_over = mo + + return + + if last_mouse_over != null: + last_mouse_over.onc_mouse_exit() + last_mouse_over = null + +func analog_force_change(vector, touchpad): + if touchpad.padname == "TouchPad": + touchpad_dir = vector + touchpad_dir.x *= -1 + elif touchpad.padname == "TargetPad": + #try to target + return + +func queue_camera_rotation(rot : Vector2) -> void: + queued_camera_rotaions += rot + +remote func rset_position(pposition : Vector2, protation : float) -> void: + if get_tree().is_network_server(): + rpc("set_position", pposition, protation) + +func _moved() -> void: + if sis_casting(): + sfail_cast() + +func _con_target_changed(entity: Entity, old_target: Entity) -> void: + if is_instance_valid(old_target): + old_target.onc_untargeted() + + if is_instance_valid(ctarget): + ctarget.onc_targeted() + + if canc_interact(): + crequest_interact() + +func _con_cast_started(info): + if anim_node_state_machine != null and not casting_anim: + anim_node_state_machine.travel("casting-loop") + casting_anim = true + animation_run = false + +func _con_cast_failed(info): + 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") + +func _con_cast_finished(info): + 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 _con_spell_cast_success(info): + 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 _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.gd b/game/player/DisplayPlayer.gd new file mode 100644 index 0000000..fae3b42 --- /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..f736773 --- /dev/null +++ b/game/player/DisplayPlayer.tscn @@ -0,0 +1,25 @@ +[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", +]] +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +sseed = 9240987 +cseed = 9240987 +script = ExtResource( 1 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.960532, 0 ) +__meta__ = { +"_editor_description_": "" +} + +[node name="Model" type="Spatial" parent="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..e822432 --- /dev/null +++ b/game/player/GUI.gd @@ -0,0 +1,20 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var player_path : NodePath +export (Array, NodePath) var child_controls : Array + +func _ready() -> void: + + if player_path != null: + var player = get_node(player_path) + + + for child_path in child_controls: + var child = get_node(child_path) + + child.set_player(player) + diff --git a/game/player/Mob.gd b/game/player/Mob.gd new file mode 100644 index 0000000..f3b6da9 --- /dev/null +++ b/game/player/Mob.gd @@ -0,0 +1,344 @@ +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. + +#export (String) var map_path : String +export(float) var max_visible_distance : float = 120 setget set_max_visible_distance +var max_visible_distance_squared : float = max_visible_distance * max_visible_distance + +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 + +#var process_gravity : bool = true + +var _on : bool = true + +var y_rot : float = 0.0 + +var vel : Vector3 = Vector3() +var dir : Vector3 = Vector3() +var target_movement_direction : Vector2 = Vector2() + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +var animation_run : bool = false + +var moving : bool = false +var sleep : bool = false +var dead : bool = false +var death_timer : float = 0 + +func _ready() -> void: + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + animation_tree["parameters/run-loop/blend_position"] = Vector2(0, -1) + + ai_state = EntityEnums.AI_STATE_PATROL + + set_process(true) + set_physics_process(true) + + +func _process(delta : float) -> void: + if dead: + death_timer += delta + + if death_timer > 60: + queue_free() + + return + + var camera : Camera = get_tree().get_root().get_camera() as Camera + + if camera == null: + return + + var cam_pos : Vector2 = camera.global_transform.xform(Vector3()) + var dstv : Vector2 = cam_pos - position + dstv.y = 0 + var dst : float = dstv.length_squared() + + if dst > max_visible_distance_squared: + if visible: + hide() + return + else: + if not visible: + show() + + #TODO check later if this gives a performance boost +# 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() + + +func _physics_process(delta : float) -> void: + if not _on: + return + + if sentity_data == null: + return + + if dead: + return + + process_movement(delta) + +func process_movement(delta : float) -> void: +# if starget != null: +# look_at(starget.translation, Vector3(0, 1, 0)) +# + var state : int = 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: + if anim_node_state_machine != null and not animation_run: + anim_node_state_machine.travel("run-loop") + animation_run = true + + target_movement_direction = target_movement_direction.normalized() + moving = true + else: + if anim_node_state_machine != null and animation_run: + anim_node_state_machine.travel("idle-loop") + animation_run = false + + moving = false + + if target_movement_direction.x > 0.1 or target_movement_direction.y > 0.1 or target_movement_direction.x < -0.1 or target_movement_direction.y < -0.1: + y_rot = Vector2(0, 1).angle_to(target_movement_direction) + + var forward : Vector3 = Vector3(0, 0, 1).rotated(Vector3(0, 1, 0), deg2rad(y_rot)) + var right : Vector3 = forward.cross(Vector3(0, 1, 0)) * -target_movement_direction.x + forward *= target_movement_direction.y #only potentially make it zero after getting the right vector + + dir = forward + dir += right + + if dir.length_squared() > 0.1: + dir = dir.normalized() + + moving = true + else: + dir = Vector3() + moving = false + + if not moving and sleep: + return + + if moving and sleep: + sleep = false + + 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 + + var facing : Vector3 = vel + facing.y = 0 + +# vel = move_and_slide(vel, Vector3(0,1,0), false, 4, deg2rad(MAX_SLOPE_ANGLE)) + sset_position(position, rotation) + + if vel.length_squared() < 0.12: + sleep = true + + +func sstart_attack(entity : Entity) -> void: + ai_state = EntityEnums.AI_STATE_ATTACK + + starget = entity + +func _onc_mouse_enter() -> void: + if centity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_LOOT: + Input.set_default_cursor_shape(Input.CURSOR_CROSS) + else: + Input.set_default_cursor_shape(Input.CURSOR_MOVE) + +func _onc_mouse_exit() -> void: + Input.set_default_cursor_shape(Input.CURSOR_ARROW) + +func _son_death(): + if dead: + return + + if starget == null: + queue_free() + return + + #warning-ignore:unused_variable + for i in range(sget_aura_count()): + sremove_aura(sget_aura(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.adds_xp(int(5.0 * slevel * ldiff)) + + starget = null + + sentity_interaction_type = EntityEnums.ENITIY_INTERACTION_TYPE_LOOT + ai_state = EntityEnums.AI_STATE_OFF + + anim_node_state_machine.travel("dead") + +# set_process(false) + set_physics_process(false) + +remote func rset_position(position : Vector2, rotation : float) -> void: + if get_tree().is_network_server(): + rpc("rset_position", position, rotation) + +func _son_damage_dealt(data): + if ai_state != EntityEnums.AI_STATE_ATTACK and data.dealer != self: + sstart_attack(data.dealer) + +func _con_damage_dealt(info : SpellDamageInfo) -> void: +# if info.dealer == + WorldNumbers.damage(position, 1.6, info.damage, info.crit) + +func _con_heal_dealt(info : SpellHealInfo) -> void: + WorldNumbers.heal(position, 1.6, info.heal, info.crit) + +func _moved() -> void: + if sis_casting(): + sfail_cast() + +func set_max_visible_distance(var value : float) -> void: + max_visible_distance_squared = value * value + + max_visible_distance = value + +func _setup(): + sentity_name = sentity_data.text_name + +func _son_xp_gained(value : int) -> void: + if not Entities.get_xp_data().can_level_up(gets_level()): + return + + var xpr : int = Entities.get_xp_data().get_xp(gets_level()); + + if xpr <= sxp: + slevelup(1) + sxp = 0 + +func _son_level_up(value: 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 * value + sfree_talent_points += value + + 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 - value, 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 + + + 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 hass_spell(spell): + var spnum :int = gets_spell_count() + + crequest_spell_learn(spell.id) + + if spnum != gets_spell_count(): + break + + if sfree_spell_points == 0: + break + + + if sfree_spell_points == 0: + break + + +func sset_position(pposition : Vector2, protation : float) -> void: + if multiplayer.network_peer and multiplayer.is_network_server(): +# cset_position(position, rotation) + vrpc("cset_position", pposition, protation) + +remote func cset_position(pposition : Vector2, protation : float) -> void: + position = pposition + rotation = protation + diff --git a/game/player/Mob.tscn b/game/player/Mob.tscn new file mode 100644 index 0000000..8716358 --- /dev/null +++ b/game/player/Mob.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://player/Mob.gd" type="Script" id=2] +[ext_resource path="res://ui/nameplates/NamePlate.tscn" type="PackedScene" id=3] + +[sub_resource type="CapsuleShape" id=1] +radius = 0.266582 +height = 0.927641 + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 0.216228, 0.0681041, 0.183397 ) + +[node name="Mob" type="Entity" groups=[ +"mobs", +]] +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +script = ExtResource( 2 ) + +[node name="Body_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.73, 0 ) +shape = SubResource( 1 ) + +[node name="Feet_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0 ) +shape = SubResource( 2 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 0, 0 ) + +[node name="Model" type="Spatial" parent="Rotation_Helper"] + +[node name="NamePlate" parent="." instance=ExtResource( 3 )] diff --git a/game/player/MobTest.gd b/game/player/MobTest.gd new file mode 100644 index 0000000..7bf0f3a --- /dev/null +++ b/game/player/MobTest.gd @@ -0,0 +1,31 @@ +extends Entity + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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(get_health().ccurrent) + "/" + str(get_health().cmax)) + pass + +func s_on_damage_taken(entity, dpd): + print("s " + str(dpd.damage)) + #print("ch " + str(get_health().scurrent) + "/" + str(get_health().smax)) + pass diff --git a/game/player/NamePlate.gd b/game/player/NamePlate.gd new file mode 100644 index 0000000..9546908 --- /dev/null +++ b/game/player/NamePlate.gd @@ -0,0 +1,152 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 : Stat = null + +func _ready(): + 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 + health = entity.get_health() + + health.connect("c_changed", self, "c_health_changed") + + name_label.text = entity.centity_name + + entity.connect("cname_changed", self, "cname_changed") + entity.connect("onc_mouse_entered", self, "onc_entity_mouse_entered") + entity.connect("onc_mouse_exited", self, "onc_entity_mouse_exited") + entity.connect("onc_targeted", self, "onc_targeted") + entity.connect("onc_untargeted", self, "onc_untargeted") + + c_health_changed(health) + + 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.01: + interpolating = false + + + var position : Vector3 = entity.translation + + var camera : Camera = get_tree().get_root().get_camera() as Camera + + if camera == null: + return + + var cam_pos : Vector3 = camera.global_transform.xform(Vector3()) + var dstv : Vector3 = cam_pos - position + dstv.y = 0 + var dst : float = dstv.length_squared() + + if dst > max_distance_squared: + if visible: + hide() + return + + 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() + + + position.y += 1.9 + var screen_position : Vector2 = camera.unproject_position(position) + + var new_pos : Vector2 = Vector2(screen_position.x - (rect_size.x / 2.0) * rect_scale.x, screen_position.y - (rect_size.y) * rect_scale.y) + + set_position(new_pos) + + +func set_max_distance(var value : float) -> void: + max_distance_squared = value * value + + max_distance = value + +func c_health_changed(stat : Stat) -> void: + health_bar.max_value = stat.cmax + health_bar.value = stat.ccurrent + + +# 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 onc_targeted() -> void: + targeted = true + + modulate = targeted_color + interpolate_scale(targeted_scale) + +func onc_untargeted() -> void: + targeted = false + + modulate = normal_color + interpolate_scale(normal_scale) + +func interpolate_scale(target : Vector2) -> void: + target_scale = target + interpolating = true diff --git a/game/player/NetworkedPlayer.gd b/game/player/NetworkedPlayer.gd new file mode 100644 index 0000000..db39f00 --- /dev/null +++ b/game/player/NetworkedPlayer.gd @@ -0,0 +1,119 @@ +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") + + position = pposition + 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..418d5f2 --- /dev/null +++ b/game/player/NetworkedPlayer.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://player/NetworkedPlayer.gd" type="Script" id=1] +[ext_resource path="res://data/models/armature_model_orig_v2.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/nameplates/NamePlate.tscn" type="PackedScene" id=3] + +[sub_resource type="CapsuleShape" id=1] +radius = 0.266582 +height = 0.927641 + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 0.216228, 0.0681041, 0.183397 ) + +[node name="NetworkedPlayer" type="Entity"] +input_ray_pickable = false +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +script = ExtResource( 1 ) + +[node name="Body_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.8, 0 ) +shape = SubResource( 1 ) + +[node name="Feet_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.194237, 0 ) +shape = SubResource( 2 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.960532, 0 ) + +[node name="Model" type="Spatial" parent="Rotation_Helper"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.875205, 0 ) + +[node name="character" parent="Rotation_Helper/Model" instance=ExtResource( 2 )] + +[node name="NamePlate" parent="." instance=ExtResource( 3 )] diff --git a/game/player/Player.gd b/game/player/Player.gd new file mode 100644 index 0000000..bad2d34 --- /dev/null +++ b/game/player/Player.gd @@ -0,0 +1,489 @@ +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. + +export(float) var MOUSE_SENSITIVITY : float = 0.05 +export(String) var world_path : String = ".." +export(NodePath) var model_path : NodePath = "Rotation_Helper/Model" + +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 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 queued_camera_rotaions : 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 camera : Camera +var camera_pivot : Spatial + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +var animation_run : bool = false + +var moving : bool = false +var casting_anim : bool = false + +var last_mouse_over : Entity = null + +var world : Navigation2D = null + +var model_rotation_node : Spatial + +func _ready() -> void: + camera = $CameraPivot/Camera as Camera + camera_pivot = $CameraPivot as Spatial + + model_rotation_node = get_node(model_path) + + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + world = get_node(world_path) as Navigation2D + +# set_process(true) + +func _physics_process(delta : float) -> void: + if not _on: + return + + if world.initial_generation: + return + + process_input(delta) + process_movement(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 = 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: + if anim_node_state_machine != null and not animation_run: + anim_node_state_machine.travel("run-loop") + animation_run = true + + input_dir = input_dir.normalized() + + animation_tree["parameters/run-loop/blend_position"] = input_dir + + if (input_dir.y < 0.1): + model_rotation_node.transform.basis = Basis(Vector3(0, acos(input_dir.x) - PI / 2.0, 0)) + else: + model_rotation_node.transform.basis = Basis() + else: + if anim_node_state_machine != null and animation_run: + anim_node_state_machine.travel("idle-loop") + animation_run = false + + +func process_movement(delta : float) -> void: + var state : int = 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.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() + + moving = true + moved() + else: + dir = Vector3() + moving = false + + 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)) + + if multiplayer.has_network_peer(): + if not multiplayer.is_network_server(): + rpc_id(1, "sset_position", position, rotation) + else: + sset_position(position, rotation) + + +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_down_delta = Vector2() + mouse_down_pos = event.position + + if event.button_index == BUTTON_RIGHT and event.device != -1: + mouse_right_down = event.pressed + + + if mouse_left_down and mouse_right_down: + mouse_move_dir.y = -1 + else: + mouse_move_dir.y = 0 + + 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 is InputEventScreenTouch and event.pressed: + target(event.position) + + 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 from = camera.project_ray_origin(position) + var to = from + camera.project_ray_normal(position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + print(result) + if result.collider and result.collider is Entity: + var ent : Entity = result.collider as Entity + + crequest_target_change(ent.get_path()) + return + + crequest_target_change(NodePath()) + else: + crequest_target_change(NodePath()) + +func cmouseover(event): + var from = camera.project_ray_origin(event.position) + var to = from + camera.project_ray_normal(event.position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + if result.collider and result.collider is Entity: + var mo : Entity = result.collider as Entity + + if last_mouse_over != null and last_mouse_over != mo: + if is_instance_valid(last_mouse_over): + last_mouse_over.onc_mouse_exit() + + last_mouse_over = null + + if last_mouse_over == null: + mo.onc_mouse_enter() + last_mouse_over = mo + + return + + if last_mouse_over != null: + last_mouse_over.onc_mouse_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 queue_camera_rotation(rot : Vector2) -> void: + queued_camera_rotaions += rot + +remote func sset_position(pposition : Vector2, protation : float) -> void: + if get_network_master() != 1: + print(str(get_network_master()) + "psset") + + if multiplayer.network_peer and multiplayer.is_network_server(): + vrpc("cset_position", pposition, protation) + cset_position(pposition, protation) + +remote func cset_position(pposition : Vector2, protation : float) -> void: + if get_network_master() != 1: + print(str(get_network_master()) + " pcset") + position = pposition + rotation = protation + +func _moved() -> void: + if sis_casting(): + sfail_cast() + +func _setup(): + setup_actionbars() + +func _con_target_changed(entity: Entity, old_target: Entity) -> void: + if is_instance_valid(old_target): + old_target.onc_untargeted() + + if is_instance_valid(ctarget): + ctarget.onc_targeted() + + if canc_interact(): + crequest_interact() + +func _con_cast_started(info): + if anim_node_state_machine != null and not casting_anim: + anim_node_state_machine.travel("casting-loop") + casting_anim = true + animation_run = false + +func _con_cast_failed(info): + 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") + +func _con_cast_finished(info): + 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 _con_spell_cast_success(info): + 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 _son_xp_gained(value : int) -> void: + if not Entities.get_xp_data().can_level_up(gets_level()): + return + + var xpr : int = Entities.get_xp_data().get_xp(gets_level()); + + if xpr <= sxp: + slevelup(1) + sxp = 0 + + +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 + + +#func _con_xp_gained(value): +# print(value) + +func _scraft(id): + if not hass_craft_recipe_id(id): + return + + var recipe : CraftRecipe = gets_craft_recipe_id(id) + + if recipe == null: + return + + for i in range(recipe.required_tools_count): + var mat : CraftRecipeHelper = recipe.get_required_tool(i) + + if mat == null: + continue + + if not sbag.has_item(mat.item, mat.count): + return + + + for i in range(recipe.required_materials_count): + var mat : CraftRecipeHelper = recipe.get_required_material(i) + + if mat == null: + continue + + if not sbag.has_item(mat.item, mat.count): + return + + #ok, player has everything + + for i in range(recipe.required_materials_count): + var mat : CraftRecipeHelper = recipe.get_required_material(i) + + if mat == null: + continue + + sbag.remove_items(mat.item, mat.count) + + var item : ItemInstance = recipe.item.item.create_item_instance() + + sbag.add_item(item) + +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..98bee48 --- /dev/null +++ b/game/player/Player.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://player/Player.gd" type="Script" id=2] +[ext_resource path="res://ui/player_ui/player_ui.tscn" type="PackedScene" id=3] + +[sub_resource type="CapsuleShape" id=1] +radius = 0.266582 +height = 0.927641 + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 0.216228, 0.0681041, 0.183397 ) + +[node name="Player" type="Entity" groups=[ +"players", +]] +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +script = ExtResource( 2 ) + +[node name="Body_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.73, 0 ) +shape = SubResource( 1 ) + +[node name="Feet_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0 ) +shape = SubResource( 2 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 0, 0 ) + +[node name="Model" type="Spatial" parent="Rotation_Helper"] + +[node name="GUILayer" parent="." instance=ExtResource( 3 )] +[connection signal="onc_open_loot_winow_request" from="." to="GUILayer" method="_on_Player_onc_open_loot_winow_request"] diff --git a/game/player/PlayerGDBase.gd b/game/player/PlayerGDBase.gd new file mode 100644 index 0000000..a55af8c --- /dev/null +++ b/game/player/PlayerGDBase.gd @@ -0,0 +1,104 @@ +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.collision_mask = 2 + _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.transform = Transform2D(0, position) + var res : Array = 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(gets_sees_count()): + var ent : Entity = gets_sees(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: + Entities.despawn_for(self, ent) + + removes_sees(ent) + + for e in currenty_sees_filtered: + var ent : Entity = e as Entity + + if self.get_network_master() != 1: + Entities.spawn_for(self, ent) + + adds_sees(ent) + + + + diff --git a/game/player/Unitframes.gd b/game/player/Unitframes.gd new file mode 100644 index 0000000..04fca72 --- /dev/null +++ b/game/player/Unitframes.gd @@ -0,0 +1,32 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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: + 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/project.godot b/game/project.godot new file mode 100644 index 0000000..1950e05 --- /dev/null +++ b/game/project.godot @@ -0,0 +1,260 @@ +; 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": "Spatial", +"class": "CharacterSkeketonAttachPoint", +"language": "GDScript", +"path": "res://player/CharacterSkeletonAttachPoint.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": "ItemTemplate", +"class": "ItemTemplateGD", +"language": "GDScript", +"path": "res://scripts/items/ItemTemplateGD.gd" +}, { +"base": "Node", +"class": "Main", +"language": "GDScript", +"path": "res://scenes/MainScene.gd" +}, { +"base": "Resource", +"class": "MainDungeonGenerator", +"language": "GDScript", +"path": "res://dungeon_generator/MainDungeonGenerator.gd" +}, { +"base": "Resource", +"class": "MainPlanetGenerator", +"language": "GDScript", +"path": "res://scripts/world_generators/MainPlanetGenerator.gd" +}, { +"base": "EntityResource", +"class": "ManaResource", +"language": "GDScript", +"path": "res://scripts/resources/ManResource.gd" +}, { +"base": "Control", +"class": "Menu", +"language": "GDScript", +"path": "res://scenes/Menu.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://networking/PlayerMaster.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": "WorldSpell", +"class": "WorldSpellGD", +"language": "GDScript", +"path": "res://scripts/projectiles/WorldSpellGD.gd" +} ] +_global_script_class_icons={ +"AuraGD": "", +"CharacterSkeketonAttachPoint": "", +"DisplayPlayerGD": "", +"EntityAIGD": "", +"EntityDataGD": "", +"ItemTemplateGD": "", +"Main": "", +"MainDungeonGenerator": "", +"MainPlanetGenerator": "", +"ManaResource": "", +"Menu": "", +"NetworkedPlayerGD": "", +"PlayerGD": "", +"PlayerMaster": "", +"SpellEffectVisualBasic": "", +"SpellGD": "", +"WorldSpellGD": "" +} +Node="input/actionbar_5_11" + +[application] + +config/name="Broken Seals 2D" +run/main_scene="res://scenes/Main.tscn" +config/icon="res://icon.png" +config/version="0.2" + +[autoload] + +Logger="*res://autoload/Logger.tscn" +Settings="*res://autoload/SettingsManager.gd" +CursorManager="*res://autoload/CursorManager.tscn" +Entities="*res://autoload/EntityDataManager.tscn" +Profiles="*res://autoload/ProfileManager.tscn" +WorldNumbers="*res://autoload/WorldNumbers.tscn" +ThemeAtlas="*res://autoload/ThemeAtlas.tscn" +Server="*res://autoload/Server.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 + +[editor_plugins] + +enabled=PoolStringArray( "ess_data" ) + +[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 +} + +[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) + ] +} + +[layer_names] + +3d_physics/layer_1="World" +3d_physics/layer_2="Entities" + +[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 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..d4d669b --- /dev/null +++ b/game/scenes/CharacterCreationMenu.gd @@ -0,0 +1,64 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 fb : Button = null + + for i in range(Entities.get_player_character_data_count()): + var d : EntityData = Entities.get_player_character_data_index(i) + + var ce : Button = character_entry.instance() as Button + + if fb == null: + fb = ce + + container.add_child(ce) + ce.owner = container + + ce.id = d.id + ce.set_class_name(d.entity_class_data.text_name) + 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 = Entities.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..838ee58 --- /dev/null +++ b/game/scenes/CharacterSelector.gd @@ -0,0 +1,36 @@ +extends MarginContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..dc362ae --- /dev/null +++ b/game/scenes/CharacterSelectorMenu.gd @@ -0,0 +1,147 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 + +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 = Entities.spawn_display_player(file_name) + 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.connect("pressed", self, "character_selection_changed") + + #display.sentity_data.entity_class_data.entity_class_name + centry.setup(file_name, display.sentity_name, "", display.slevel, display) + + if first_entry == null: + first_entry = centry + + if first_entry != null: + first_entry.pressed = true + + else: + dir.make_dir("user://" + character_folder) + +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 delete_character() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + + 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.hide() + + b.entity.show() diff --git a/game/scenes/ConnectButton.gd b/game/scenes/ConnectButton.gd new file mode 100644 index 0000000..a8e4395 --- /dev/null +++ b/game/scenes/ConnectButton.gd @@ -0,0 +1,19 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..e78a5d7 --- /dev/null +++ b/game/scenes/ConnectServerButton.gd @@ -0,0 +1,57 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..30ace2c --- /dev/null +++ b/game/scenes/DisconnectButton.gd @@ -0,0 +1,19 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..fdba6bc --- /dev/null +++ b/game/scenes/GameScene.gd @@ -0,0 +1,9 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..1434ea8 --- /dev/null +++ b/game/scenes/HostButton.gd @@ -0,0 +1,16 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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. + +#func _pressed(): +# Server.start_hosting() diff --git a/game/scenes/HostGameButton.gd b/game/scenes/HostGameButton.gd new file mode 100644 index 0000000..da16972 --- /dev/null +++ b/game/scenes/HostGameButton.gd @@ -0,0 +1,55 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..74a82c9 --- /dev/null +++ b/game/scenes/Main.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=6 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] + +[node name="Main" type="Node"] +script = ExtResource( 1 ) +menu_scene = ExtResource( 3 ) +world_scene = ExtResource( 2 ) +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..5a677b3 --- /dev/null +++ b/game/scenes/MainScene.gd @@ -0,0 +1,93 @@ +extends Node +class_name Main + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..7bae9fe --- /dev/null +++ b/game/scenes/Menu.gd @@ -0,0 +1,30 @@ +extends Control +class_name Menu + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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() + diff --git a/game/scenes/Menu.tscn b/game/scenes/Menu.tscn new file mode 100644 index 0000000..ab7a920 --- /dev/null +++ b/game/scenes/Menu.tscn @@ -0,0 +1,519 @@ +[gd_scene load_steps=16 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://menu/CharacterEntry.tscn" type="PackedScene" id=2] +[ext_resource path="res://scenes/Menu.gd" type="Script" id=3] +[ext_resource path="res://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://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] + +[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/CharacterSelector/VBoxContainer/ScrollContainer/Container") +player_display_container_path = NodePath("../Char/CharacterDisplay") +character_button_group = ExtResource( 4 ) +character_entry = ExtResource( 2 ) +character_folder = "characters" + +[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="CharacterSelector" type="PanelContainer" parent="CharacterSelectorMenu/CharacterSelector"] +margin_top = 20.0 +margin_right = 269.0 +margin_bottom = 580.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/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/CharacterSelector/VBoxContainer"] +margin_right = 261.0 +margin_bottom = 484.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Container" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/ScrollContainer"] +margin_right = 261.0 +size_flags_horizontal = 3 + +[node name="Load" type="Button" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer"] +margin_top = 492.0 +margin_right = 261.0 +margin_bottom = 518.269 +text = "Load" + +[node name="HBoxContainer" type="HBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer"] +margin_top = 526.0 +margin_right = 261.0 +margin_bottom = 552.0 + +[node name="Delete" type="Button" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer"] +margin_right = 128.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Delete" + +[node name="Create" type="Button" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer"] +margin_left = 132.0 +margin_right = 261.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Create" + +[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.269 +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.269 +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.269 +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.269 +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.269 +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.269 +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.269 +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.269 +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 = 13.0 +margin_right = 120.0 +margin_bottom = 39.269 +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 = 47.0 +margin_right = 120.0 +margin_bottom = 73.269 +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"] +margin_top = 81.0 +margin_right = 120.0 +margin_bottom = 107.269 +rect_min_size = Vector2( 120, 0 ) +text = "Login" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button3" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 115.0 +margin_right = 120.0 +margin_bottom = 141.269 +rect_min_size = Vector2( 120, 0 ) +text = "Register" +__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.269 +rect_min_size = Vector2( 120, 0 ) +text = "Options" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Options" parent="." instance=ExtResource( 8 )] +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, 6.02678, 0 ) + +[node name="CharacterDisplay" type="Spatial" parent="Char"] + +[node name="Camera" type="Camera" parent="Char"] +transform = Transform( 0.906006, -0.157589, 0.392835, 0.0104413, 0.936144, 0.351461, -0.423137, -0.314324, 0.849797, 0.300506, 1.57764, 2.14719 ) +current = true +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/Load" to="CharacterSelectorMenu" method="load_character"] +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer/Delete" to="CharacterSelectorMenu" method="delete_character"] +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer/Create" to="." method="switch_to_menu" binds= [ 1 ]] +[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/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.tscn b/game/scenes/World.tscn new file mode 100644 index 0000000..99e7f62 --- /dev/null +++ b/game/scenes/World.tscn @@ -0,0 +1,73 @@ +[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.447059, 0.780392, 0.854902, 1 ) +sky_horizon_color = Color( 0.273637, 0.277344, 0.206924, 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.45098, 0.352941, 0.113725, 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.24 +ambient_light_sky_contribution = 0.09 +fog_enabled = true +fog_color = Color( 0.184314, 0.207843, 0.156863, 1 ) +fog_sun_color = Color( 0.239216, 0.337255, 0.396078, 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 +adjustment_enabled = true +adjustment_brightness = 1.1 +adjustment_contrast = 1.25 + +[node name="World" type="Navigation2D" 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.7 +light_specular = 0.65 +shadow_bias = 0.07 +script = ExtResource( 3 ) + +[node name="DirectionalLight2" type="DirectionalLight" parent="."] +transform = Transform( 0.826603, 0.474891, -0.302004, -0.49276, 0.351482, -0.79602, -0.271874, 0.806808, 0.524543, 0, 18.834, 0 ) +light_color = Color( 0.631373, 0.631373, 0.631373, 1 ) +light_energy = 0.48 +light_specular = 0.0 +directional_shadow_normal_bias = 0.1 diff --git a/game/scripts/ai/EntityAIGD.gd b/game/scripts/ai/EntityAIGD.gd new file mode 100644 index 0000000..a7b5e51 --- /dev/null +++ b/game/scripts/ai/EntityAIGD.gd @@ -0,0 +1,128 @@ +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 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 _on_set_owner(): + if not is_instance_valid(owner): + return + + 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.target_movement_direction = Vector2() + return + + var cast : bool = false + if not owner.gets_has_global_cooldown(): + 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.hass_spell_id(spell_id): + continue + + if taskey == null: + if target.sget_aura_by(owner, tas["aura_id"]) == null and not owner.hass_cooldown(spell_id): + owner.crequest_spell_cast(spell_id) + cast = true + break + else: + if target.sget_aura_with_group_by(owner, taskey) == null and not owner.hass_cooldown(spell_id): + owner.crequest_spell_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.hass_spell_id(spell_id): + continue + + if not owner.hass_cooldown(spell_id): + owner.crequest_spell_cast(spell_id) + cast = true + break + + + if owner.sis_casting(): + owner.target_movement_direction = Vector2() + return + + var dir : Vector3 = target.translation - owner.translation + + owner.target_movement_direction = Vector2(dir.x, dir.z) + +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/auras/aura_script.gd b/game/scripts/auras/aura_script.gd new file mode 100644 index 0000000..944ef97 --- /dev/null +++ b/game/scripts/auras/aura_script.gd @@ -0,0 +1,96 @@ +extends Aura +class_name AuraGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _handle_aura_damage(aura_data : AuraData, damage_info : SpellDamageInfo) -> void: + randomize() + + damage_info.damage = damage_min + (randi() % (damage_max - damage_min)) + damage_info.damage_source_type = aura_data.aura.damage_type + + if (is_instance_valid(damage_info.dealer)): + damage_info.dealer.sdeal_damage_to(damage_info) + +func _handle_aura_heal(aura_data : AuraData, shi : SpellHealInfo) -> void: + randomize() + + shi.heal = heal_min + (randi() % (heal_max - heal_min)) + shi.heal_source_type = aura_data.aura.aura_type + + shi.dealer.sdeal_heal_to(shi) + +func _sapply(info : AuraApplyInfo) -> void: +# var add : bool = false + var ad : AuraData = info.target.sget_aura_by(info.caster, info.aura.id) + + if ad == null: +# add = true + ad = AuraData.new() + + setup_aura_data(ad, info); + + for i in range(get_aura_stat_attribute_count()): + var stat_attribute : AuraStatAttribute = get_aura_stat_attribute(i) + var stat : Stat = info.target.get_stat_enum(stat_attribute.stat) + stat.add_modifier(id, stat_attribute.base_mod, stat_attribute.bonus_mod, stat_attribute.percent_mod) + + 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.sadd_state_ref(i) + + + info.target.sadd_aura(ad); + else: + ad.remaining_time = time + + +func _sdeapply(data : AuraData) -> void: + for i in range(get_aura_stat_attribute_count()): + var stat_attribute : AuraStatAttribute = get_aura_stat_attribute(i) + + var stat : Stat = data.owner.get_stat_enum(stat_attribute.stat) + + stat.remove_modifier(id) + + 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.sremove_state_ref(i) + +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/biomes/simple_biome.gd b/game/scripts/biomes/simple_biome.gd new file mode 100644 index 0000000..e9feb60 --- /dev/null +++ b/game/scripts/biomes/simple_biome.gd @@ -0,0 +1,9 @@ +extends Biome + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _generate_chunk(chunk: Node, spawn_mobs: bool) -> void: +# var chunk : VoxelChunk = chunk.get_chunk() + pass diff --git a/game/scripts/dungeon_start_rooms/start_room.gd b/game/scripts/dungeon_start_rooms/start_room.gd new file mode 100644 index 0000000..af1385c --- /dev/null +++ b/game/scripts/dungeon_start_rooms/start_room.gd @@ -0,0 +1,14 @@ +tool +extends DungeonRoom + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + sizex = 4 + sizey = 4 + sizez = 4 + +func _generate_chunk(chunk : Node, spawn_mobs: bool) -> void: + pass diff --git a/game/scripts/dungeons/dungeon.gd b/game/scripts/dungeons/dungeon.gd new file mode 100644 index 0000000..e33020b --- /dev/null +++ b/game/scripts/dungeons/dungeon.gd @@ -0,0 +1,47 @@ +tool +extends Dungeon + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + if data.get_dungeon_start_room_data_count() == 0: + return + + var drd : DungeonRoomData = data.get_dungeon_start_room_data(0) + + var dung : DungeonRoom + if drd.target_script != null: + dung = drd.target_script.new() + + if dung == null: + print("drd is null. wrong type? " + drd.resource_path) + return + elif drd.target_class_name != "": + if not ClassDB.class_exists(drd.target_class_name): + print("class doesnt exists" + drd.resource_path) + return + + dung = ClassDB.instance(drd.target_class_name) + else: + dung = DungeonRoom.new() + + dung.posx = posx + dung.posy = posy + dung.posz = posz + dung.current_seed = current_seed + dung.data = drd + dung.setup() + + add_dungeon_start_room(dung) + +func _setup_library(library): + ._setup_library(library) + + for i in range(get_dungeon_start_room_count()): + get_dungeon_start_room(i).setup_library(library) + +func _generate_chunk(chunk, spawn_mobs): + for i in range(get_dungeon_start_room_count()): + get_dungeon_start_room(i).generate_chunk(chunk, spawn_mobs) diff --git a/game/scripts/entities/EntityClassDataGD.gd b/game/scripts/entities/EntityClassDataGD.gd new file mode 100644 index 0000000..8158bbd --- /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 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.gets_has_global_cooldown(): + 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.hass_spell_id(spell_id): + continue + + if taskey == null: + if target.sget_aura_by(entity, tas["aura_id"]) == null and not entity.hass_cooldown(spell_id): + entity.crequest_spell_cast(spell_id) + cast = true + break + else: + if target.sget_aura_with_group_by(entity, taskey) == null and not entity.hass_cooldown(spell_id): + entity.crequest_spell_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.hass_spell_id(spell_id): + continue + + if not entity.hass_cooldown(spell_id): + entity.crequest_spell_cast(spell_id) + cast = true + break + + + if entity.sis_casting(): + 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.adds_resource(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..9888d60 --- /dev/null +++ b/game/scripts/entities/EntityDataGD.gd @@ -0,0 +1,61 @@ +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 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(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) + +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/items/ItemTemplateGD.gd b/game/scripts/items/ItemTemplateGD.gd new file mode 100644 index 0000000..b25dd10 --- /dev/null +++ b/game/scripts/items/ItemTemplateGD.gd @@ -0,0 +1,13 @@ +extends ItemTemplate +class_name ItemTemplateGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _create_item_instance(): + var ii : ItemInstance = ItemInstance.new() + + ii.item_template = self + + return ii diff --git a/game/scripts/planets/dung_simple_planet.gd b/game/scripts/planets/dung_simple_planet.gd new file mode 100644 index 0000000..1e6d6c0 --- /dev/null +++ b/game/scripts/planets/dung_simple_planet.gd @@ -0,0 +1,94 @@ +tool +extends Planet + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + if data == null: + return + + if data.get_biome_data_count() == 0: + return + + var bdata : BiomeData = data.get_biome_data(0) + + var b : Biome + + if bdata.target_script != null: + b = bdata.target_script.new() + + if b == null: + print("biome is null. wrong type? " + bdata.resource_path) + return + elif bdata.target_class_name != "": + if not ClassDB.class_exists(bdata.target_class_name): + print("class doesnt exists" + bdata.resource_path) + return + + b = ClassDB.instance(bdata.target_class_name) + else: + b = Biome.new() + + b.current_seed = current_seed + b.data = bdata + b.setup() + add_biome(b) + + if bdata.get_dungeon_data_count() == 0: + return + + var dd : DungeonData = bdata.get_dungeon_data(0) + + var dung : Dungeon + if dd.target_script != null: + dung = dd.target_script.new() + + if dung == null: + print("dd is null. wrong type? " + dd.resource_path) + return + elif dd.target_class_name != "": + if not ClassDB.class_exists(dd.target_class_name): + print("class doesnt exists" + dd.resource_path) + return + + dung = ClassDB.instance(dd.target_class_name) + else: + dung = Dungeon.new() + + dung.posx = 0 + dung.posy = -4 + dung.posz = 0 + dung.current_seed = current_seed + dung.data = dd + dung.setup() + + add_dungeon(dung) + +func _setup_library(library): + ._setup_library(library) + + for i in range(get_biome_count()): + var b : Biome = get_biome(i) + + if b != null: + b.setup_library(library) + + for i in range(get_dungeon_count()): + var d : Dungeon = get_dungeon(i) + + if d != null: + d.setup_library(library) + +func _generate_chunk(chunk, spawn_mobs): + if (get_biome_count() == 0): + return + + var b : Biome = get_biome(0) + + b.generate_chunk(chunk, spawn_mobs) + + for i in range(get_dungeon_count()): + get_dungeon(i).generate_chunk(chunk, spawn_mobs) + diff --git a/game/scripts/planets/simple_planet.gd b/game/scripts/planets/simple_planet.gd new file mode 100644 index 0000000..82e2f57 --- /dev/null +++ b/game/scripts/planets/simple_planet.gd @@ -0,0 +1,54 @@ +tool +extends Planet + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + if data == null: + return + + if data.get_biome_data_count() == 0: + return + + var bdata : BiomeData = data.get_biome_data(0) + + var b : Biome + + if bdata.target_script != null: + b = bdata.target_script.new() + + if b == null: + print("biome is null. wrong type? " + bdata.resource_path) + return + elif bdata.target_class_name != "": + if not ClassDB.class_exists(bdata.target_class_name): + print("class doesnt exists" + bdata.resource_path) + return + + b = ClassDB.instance(bdata.target_class_name) + else: + b = Biome.new() + + b.current_seed = current_seed + b.data = bdata + b.setup() + add_biome(b) + +func _setup_library(library): + ._setup_library(library) + + for i in range(get_biome_count()): + var b : Biome = get_biome(i) + + if b != null: + b.setup_library(library) + +func _generate_chunk(chunk, spawn_mobs): + if (get_biome_count() == 0): + return + + var b : Biome = get_biome(0) + + b.generate_chunk(chunk, spawn_mobs) diff --git a/game/scripts/projectiles/WorldSpellGD.gd b/game/scripts/projectiles/WorldSpellGD.gd new file mode 100644 index 0000000..fdca907 --- /dev/null +++ b/game/scripts/projectiles/WorldSpellGD.gd @@ -0,0 +1,51 @@ +extends WorldSpell +class_name WorldSpellGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +var _target : Node2D +var _info : SpellCastInfo +var _speed : float + +func _ready() -> void: + if _info == null: + set_process(false) + +func launch(info : SpellCastInfo, effect : PackedScene, speed : float) -> void: + if not is_instance_valid(info.target): + return + + _info = info + _target = info.target.get_character_skeleton().torso_attach_point + _speed = speed + +# translation = info.caster.translation + position = info.caster.get_character_skeleton().right_hand_attach_point.global_transform.origin + + var eff : Node = effect.instance() + + eff.owner = self + add_child(eff) + + set_process(true) + +func _process(delta : float) -> void: + if not is_instance_valid(_target): +# set_process(false) + queue_free() + return + + var l : Vector2 = _target.global_transform.origin - position + + if l.length() < 1: + _info.spell.son_spell_hit(_info) + queue_free() + return + + var dir : Vector2 = l.normalized() + + global_transform.origin += dir * _speed * delta +# global_transform = transform.looking_at(_target.global_transform.origin, Vector3(0, 1, 0)) + diff --git a/game/scripts/resources/ManResource.gd b/game/scripts/resources/ManResource.gd new file mode 100644 index 0000000..1721000 --- /dev/null +++ b/game/scripts/resources/ManResource.gd @@ -0,0 +1,15 @@ +extends EntityResource +class_name ManaResource + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _init(): + should_process = false + +#func _ons_stat_changed(stat : Stat): +# print(stat.get_id()) + +func _process_server(delta): + pass diff --git a/game/scripts/resources/ManaResourceData.gd b/game/scripts/resources/ManaResourceData.gd new file mode 100644 index 0000000..747feb3 --- /dev/null +++ b/game/scripts/resources/ManaResourceData.gd @@ -0,0 +1,8 @@ +extends EntityResourceData + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _get_entity_resource_instance() -> EntityResource: + return ManaResource.new() 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..b61e7cb --- /dev/null +++ b/game/scripts/resources/spell_effect_visual_basic.gd @@ -0,0 +1,21 @@ +extends SpellEffectVisual +class_name SpellEffectVisualBasic + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..2e3edfb --- /dev/null +++ b/game/scripts/settings/DirectionalLightSettings.gd @@ -0,0 +1,17 @@ +extends DirectionalLight + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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 diff --git a/game/scripts/spells/amplify_pain.gd b/game/scripts/spells/amplify_pain.gd new file mode 100644 index 0000000..99ab3f7 --- /dev/null +++ b/game/scripts/spells/amplify_pain.gd @@ -0,0 +1,21 @@ +extends SpellGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _sfinish_cast(info : SpellCastInfo) -> void: + var target : Entity = info.target + + if not is_instance_valid(target): + return + + for i in range(target.sget_aura_count()): + + var ad : AuraData = target.sget_aura(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..4b28076 --- /dev/null +++ b/game/scripts/spells/gd_spell_script.gd @@ -0,0 +1,182 @@ +extends Spell +class_name SpellGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _sstart_casting(info : SpellCastInfo) -> void: + if info.caster.sis_casting(): + return + + if info.spell.cooldown_global_cooldown and info.caster.gets_has_global_cooldown() or info.caster.hass_category_cooldown(spell_type) or info.caster.hass_cooldown(id): + return + + if !info.caster.hass_spell(self): + return + + if cast: + info.caster.sstart_casting(info) + return + + info.caster.sspell_cast_success(info) + + if info.target: + info.target.son_cast_finished_target(info) + + handle_cooldown(info) + + if projectile != null: + fire_projectile(info) + else: + handle_effect(info) + + handle_gcd(info) + +func _sfinish_cast(info : SpellCastInfo) -> void: + info.caster.son_cast_finished(info) + info.caster.sspell_cast_success(info) + + if is_instance_valid(info.target): + info.target.son_cast_finished_target(info) + + if projectile != null: + fire_projectile(info) + else: + handle_effect(info) + + handle_cooldown(info) + +func _son_cast_player_moved(info): + if !cast_can_move_while_casting: + info.caster.sfail_cast() + +func fire_projectile(info : SpellCastInfo): + pass +# if projectile_type == SPELL_PROJECTILE_TYPE_FOLLOW: +# var sp : WorldSpellGD = WorldSpellGD.new() +# +# info.get_caster().get_parent().add_child(sp) +# sp.owner = info.get_caster().get_parent() +# +# sp.launch(info, projectile, projectile_speed) + +func _son_spell_hit(info): + handle_effect(info) + +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 and info.target: + var sdi : SpellDamageInfo = SpellDamageInfo.new() + + sdi.damage_source = self + sdi.dealer = info.caster + sdi.receiver = info.target + + handle_spell_damage(sdi) + + 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.sget_aura_with_group_by(info.caster, aura.aura_group) + else: + ad = info.target.sget_aura_by(info.caster, aura.get_id()) + + if ad != null: + info.target.sremove_aura_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.adds_cooldown(id, cooldown_cooldown) + +func handle_gcd(info : SpellCastInfo) -> void: + if cooldown_global_cooldown and cast_cast_time < 0.01: + info.caster.sstart_global_cooldown(info.caster.get_gcd().scurrent) + +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().left_hand_attach_point.add_effect(basic_spell_effect.spell_cast_effect_left_hand) + + if basic_spell_effect.spell_cast_effect_right_hand != null: + info.caster.get_character_skeleton().right_hand_attach_point.add_effect(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().left_hand_attach_point.remove_effect(basic_spell_effect.spell_cast_effect_left_hand) + + if basic_spell_effect.spell_cast_effect_right_hand != null: + info.caster.get_character_skeleton().right_hand_attach_point.remove_effect(basic_spell_effect.spell_cast_effect_right_hand) + +func _con_spell_cast_started(info): + add_spell_cast_effect(info) + +func _con_spell_cast_failed(info): + remove_spell_cast_effect(info) + +func _con_spell_cast_interrupted(info): + remove_spell_cast_effect(info) + +func _con_spell_cast_success(info): + 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().torso_attach_point.add_effect_timed(bse.torso_spell_cast_finish_effect, bse.torso_spell_cast_finish_effect_time) + + if bse.root_spell_cast_finish_effect != null: + info.target.get_character_skeleton().root_attach_point.add_effect_timed(bse.root_spell_cast_finish_effect, bse.root_spell_cast_finish_effect_time) + diff --git a/game/scripts/world_generators/MainPlanetGenerator.gd b/game/scripts/world_generators/MainPlanetGenerator.gd new file mode 100644 index 0000000..65f0ae6 --- /dev/null +++ b/game/scripts/world_generators/MainPlanetGenerator.gd @@ -0,0 +1,82 @@ +tool +extends Resource +class_name MainPlanetGenerator + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +const planet_folder : String = "res://data/planets/" + +export(int) var _force_planet : int = -1 +export(int) var _level_seed : int +export(bool) var _spawn_mobs : bool + +var _world : Navigation2D +var _planet : Planet +var _library : Resource + +func setup(world : Navigation2D, level_seed : int, spawn_mobs : bool, library: Resource) -> void: + _level_seed = level_seed + _world = world + _spawn_mobs = spawn_mobs + _library = library + + create_planet() + +func _generate_chunk(chunk : Node) -> void: + if _planet == null: + return + + _planet.generate_chunk(chunk, _spawn_mobs) + +func create_planet(): + var planet_files : Array + + var dir = Directory.new() + if dir.open(planet_folder) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while (file_name != ""): + if not dir.current_is_dir(): + planet_files.append(file_name) + + file_name = dir.get_next() + + 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 : PlanetData = ResourceLoader.load(planet_folder + planet_files[ind], "PlanetData") + + 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) diff --git a/game/ui/actionbars/ActionBar.gd b/game/ui/actionbars/ActionBar.gd new file mode 100644 index 0000000..f71581b --- /dev/null +++ b/game/ui/actionbars/ActionBar.gd @@ -0,0 +1,30 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..aeb44e5 --- /dev/null +++ b/game/ui/actionbars/ActionBarEntry.gd @@ -0,0 +1,276 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 : Cooldown = null +var categ_cd : CategoryCooldown = null + +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") + +func _exit_tree(): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + +func _process(delta : float) -> void: + if cd == null and categ_cd == null 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 != null and cd.remaining > value: + value = cd.remaining + + if categ_cd != null and categ_cd.remaining > value: + value = categ_cd.remaining + + 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) + + var action_list : Array = InputMap.get_action_list(action_name) + + 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 + + iea.action = action_name + iea.pressed = true + var sc : ShortCut = ShortCut.new() + sc.shortcut = iea + shortcut = sc + + setup_icon() + +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_id == 0): + 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 = Entities.get_spell(button_entry.item_id) + + 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 + +func _on_button_pressed() -> void: + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + if (button_entry.item_id == 0): + return + + player.crequest_spell_cast(button_entry.item_id) + +func set_button_entry_data(type: int, item_id: int) -> void: + button_entry.type = type + button_entry.itekm_id = item_id + + 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_id = button_entry.item_id + + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE + button_entry.item_id = 0 + +# 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): + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL + elif (esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_ITEM): + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM + + button_entry.item_id = esd.item_id + + setup_icon() + +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 = null + + player = p_player + + if player == null: + return + +# for i in range(player.getc_cooldown_count()): +# var cooldown : Cooldown = player.getc_cooldown(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") + + +func _ccooldown_added(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = cooldown + set_process(true) + show_cooldown_timer(cooldown.remaining) + +func _ccooldown_removed(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = null + +func _ccategory_cooldown_added(cooldown : CategoryCooldown) -> void: + if cooldown.category_id == spell_type: + categ_cd = cooldown + set_process(true) + show_cooldown_timer(cooldown.remaining) + +func _ccategory_cooldown_removed(cooldown : CategoryCooldown) -> void: + if cooldown.category_id == spell_type: + categ_cd = null + + +func _cgcd_started(value :float) -> void: + if not has_gcd: + return + + gcd = value + show_cooldown_timer(value) + set_process(true) + +func _cgcd_finished() -> 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..8f503c6 --- /dev/null +++ b/game/ui/actionbars/Actionbars.gd @@ -0,0 +1,52 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var actionbar_scene + +var _player : Entity + + +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: + clear_actionbars() + + if cls == null: + return + + var 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/EditorKeybindSetup.gd b/game/ui/actionbars/EditorKeybindSetup.gd new file mode 100644 index 0000000..92c1e86 --- /dev/null +++ b/game/ui/actionbars/EditorKeybindSetup.gd @@ -0,0 +1,37 @@ +tool +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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/auraframe/AuraEntry.gd b/game/ui/auraframe/AuraEntry.gd new file mode 100644 index 0000000..66f08ac --- /dev/null +++ b/game/ui/auraframe/AuraEntry.gd @@ -0,0 +1,79 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..835612c --- /dev/null +++ b/game/ui/auraframe/AuraFrame.gd @@ -0,0 +1,59 @@ +extends MarginContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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("caura_added", self, "on_caura_added") + entity.connect("caura_removed", self, "on_caura_removed") + +func on_caura_added(aura_data : AuraData) -> void: + 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) + +func on_caura_removed(aura_data : AuraData) -> void: + 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..e7682d5 --- /dev/null +++ b/game/ui/auraframe/AuraFrame.tscn @@ -0,0 +1,41 @@ +[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="MarginContainer"] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -376.0 +margin_right = -1.0 +margin_bottom = 160.0 +mouse_filter = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +aura_entry_scene = ExtResource( 2 ) +buff_container_path = NodePath("VBoxContainer/Buffs") +debuff_container_path = NodePath("VBoxContainer/Debuffs") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 375.0 +margin_bottom = 160.0 +mouse_filter = 2 + +[node name="Buffs" type="GridContainer" parent="VBoxContainer"] +margin_right = 375.0 +margin_bottom = 76.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 + +[node name="Debuffs" type="GridContainer" parent="VBoxContainer"] +margin_top = 84.0 +margin_right = 375.0 +margin_bottom = 160.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 diff --git a/game/ui/bags/Bag.tscn b/game/ui/bags/Bag.tscn new file mode 100644 index 0000000..67acfdb --- /dev/null +++ b/game/ui/bags/Bag.tscn @@ -0,0 +1,323 @@ +[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/ItemPupop.gd" type="Script" id=5] + +[node name="Inventory" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +inventory_item_scene = ExtResource( 3 ) +inventory_item_container_path = NodePath("VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer/GridContainer") +item_tooltip_path = NodePath("TooltipContainer/ItemTooltip") +inventory_slots = [ NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer/Head"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Neck"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Shoulder"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Chest"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Hands"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Belt"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5/Legs"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5/Feet"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Ring1"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Ring2"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Trinket1"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Trinket2"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer/MainHand"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer/OffHand") ] + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 26.0 + +[node name="BagName" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 5.0 +margin_right = 982.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Inventory" +align = 1 + +[node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 986.0 +margin_right = 1016.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 20 ) +text = "X" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 34.0 +margin_right = 1016.0 +margin_bottom = 592.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/HBoxContainer3"] +margin_right = 227.96 +margin_bottom = 558.0 +rect_min_size = Vector2( 227.96, 0 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 223.96 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 96.0 +margin_right = 219.0 +margin_bottom = 146.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Head" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer" instance=ExtResource( 4 )] + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 156.0 +margin_right = 219.0 +margin_bottom = 206.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Shoulder" parent="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +text = "Neck" +equip_slot = 1 + +[node name="Hands" parent="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 216.0 +margin_right = 219.0 +margin_bottom = 266.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Ring1" parent="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +text = "Chest" +equip_slot = 3 + +[node name="Ring2" parent="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 276.0 +margin_right = 219.0 +margin_bottom = 326.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Trinket1" parent="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +text = "Belt" +equip_slot = 5 + +[node name="Trinket2" parent="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 336.0 +margin_right = 219.0 +margin_bottom = 386.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Legs" parent="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="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 396.0 +margin_right = 219.0 +margin_bottom = 454.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="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="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="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="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer" instance=ExtResource( 4 )] +margin_left = 54.0 +margin_right = 104.0 +text = "OH" +equip_slot = 13 +texture_path = NodePath("../OffHand/MarginContainer/TextureRect") + +[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/HBoxContainer3"] +margin_left = 231.0 +margin_right = 1016.0 +margin_bottom = 558.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 781.0 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer"] +margin_right = 777.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="GridContainer" type="GridContainer" parent="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="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer"] +margin_top = 524.0 +margin_right = 777.0 +margin_bottom = 550.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_top = 5.0 +margin_right = 743.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "190 " +align = 2 + +[node name="ResizeButton" type="Button" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_left = 747.0 +margin_right = 777.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 20 ) + +[node name="TooltipContainer" type="Control" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +mouse_filter = 2 + +[node name="ItemTooltip" type="PopupPanel" parent="TooltipContainer"] +margin_right = 295.0 +margin_bottom = 223.0 +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_path = NodePath("../ItemTooltip/VBoxContainer/HBoxContainer/VBoxContainer/NameLabel") +description_path = NodePath("../ItemTooltip/VBoxContainer/DescriptionLabel") + +[node name="VBoxContainer" type="VBoxContainer" parent="TooltipContainer/ItemTooltip"] +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="TooltipContainer/ItemTooltip/VBoxContainer"] +margin_right = 287.0 +margin_bottom = 26.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer"] +margin_right = 249.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="NameLabel" type="RichTextLabel" parent="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer/VBoxContainer"] +margin_top = 4.0 +margin_right = 249.0 +margin_bottom = 22.0 +rect_min_size = Vector2( 0, 18 ) +size_flags_horizontal = 3 +bbcode_enabled = true + +[node name="Button" type="Button" parent="TooltipContainer/ItemTooltip/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="TooltipContainer/ItemTooltip/VBoxContainer"] +margin_top = 34.0 +margin_right = 287.0 +margin_bottom = 42.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DescriptionLabel" type="RichTextLabel" parent="TooltipContainer/ItemTooltip/VBoxContainer"] +margin_top = 50.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/CloseButton" to="." method="hide"] +[connection signal="pressed" from="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer/Button" to="TooltipContainer/ItemTooltip" method="hide"] diff --git a/game/ui/bags/BagEntry.gd b/game/ui/bags/BagEntry.gd new file mode 100644 index 0000000..c5b4364 --- /dev/null +++ b/game/ui/bags/BagEntry.gd @@ -0,0 +1,236 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 : Cooldown = null + +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("pressed", 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 == null 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 != null and cd.remaining > value: + value = cd.remaining + + 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.spell_id + has_gcd = spell.cooldown_global_cooldown + else: + spell_id = 0 + has_gcd = false + + icon_rect.texture = item.item_template.icon + + + +func _on_button_pressed() -> void: + #if spell_id != 0: + # player.crequest_spell_cast(button_entry.item_id) + pass + +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_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.crequest_item_swap(slot_id, esd.item_id) + setup_icon() + elif esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM: + player.crequest_equip(esd.item_id, 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.getc_cooldown_count()): +# var cooldown : Cooldown = player.getc_cooldown(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(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = cooldown + set_process(true) + show_cooldown_timer(cooldown.remaining) + +func _ccooldown_removed(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = null + +func _cgcd_started(value :float) -> void: + if not has_gcd: + return + + gcd = value + show_cooldown_timer(value) + set_process(true) + +func _cgcd_finished() -> void: + gcd = 0 + +func _pressed(): + if _tooltip != null and item != null: + var pos : Vector2 = rect_global_position + pos.x += rect_size.x + + _tooltip.set_item(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..5f6ffb1 --- /dev/null +++ b/game/ui/bags/BagFrame.gd @@ -0,0 +1,13 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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/EquipmentSlot.gd b/game/ui/bags/EquipmentSlot.gd new file mode 100644 index 0000000..14795d8 --- /dev/null +++ b/game/ui/bags/EquipmentSlot.gd @@ -0,0 +1,87 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 + +func set_tooltip_node(tooltip : Popup) -> void: + _tooltip = tooltip + +func set_player(player: Entity) -> void: + if _player != null: + _player.disconnect("con_equip_success", self, "con_equip_success") + + _player = player + + if _player == null: + return + + _player.connect("con_equip_success", self, "con_equip_success") + +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.crequest_equip(equip_slot, dd.item_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_id = equip_slot + + return esd + +func con_equip_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 diff --git a/game/ui/bags/EquipmentSlot.tscn b/game/ui/bags/EquipmentSlot.tscn new file mode 100644 index 0000000..da21a9a --- /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 = 76.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..b0a24d5 --- /dev/null +++ b/game/ui/bags/InventoryGUI.gd @@ -0,0 +1,110 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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") + + for ie in _inventory_item_container.get_children(): + ie.queue_free() + + _player = p_player + + _player.connect("cbag_changed", self, "cbag_changed") + + 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 on_visibility_changed() -> void: + refresh_bags() diff --git a/game/ui/bags/ItemPupop.gd b/game/ui/bags/ItemPupop.gd new file mode 100644 index 0000000..68f22b7 --- /dev/null +++ b/game/ui/bags/ItemPupop.gd @@ -0,0 +1,19 @@ +extends PopupPanel + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var name_path : NodePath +export(NodePath) var description_path : NodePath + +var _name : RichTextLabel +var _description : RichTextLabel + +func _ready(): + _name = get_node(name_path) as RichTextLabel + _description = get_node(description_path) as RichTextLabel + +func set_item(item : ItemInstance) -> void: + _name.bbcode_text = item.item_template.text_name +# _description.text = item.item_template. 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..fc0dd74 --- /dev/null +++ b/game/ui/buttons/Buttons.gd @@ -0,0 +1,47 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 + +func _ready(): + spell_book = get_node(spell_book_path) + spell_book_button = get_node(spell_book_button_path) + + spell_book_button.connect("pressed", self, "_spell_book_click") + + lock_button = get_node(lock_button_path) + lock_button.connect("pressed", self, "_lock_button_click") + +func set_player(p_player): + player = p_player + +func _spell_book_click(): + if spell_book.visible: + spell_book.hide() + else: + spell_book.show() + +func _lock_button_click(): + if player == null: + return + + var cls = player.centity_data + + if cls == null: + return + + var profile = Profiles.get_class_profile(cls.id) + + profile.actionbar_locked = not profile.actionbar_locked + diff --git a/game/ui/castbar/Castbar.gd b/game/ui/castbar/Castbar.gd new file mode 100644 index 0000000..022d093 --- /dev/null +++ b/game/ui/castbar/Castbar.gd @@ -0,0 +1,74 @@ +extends MarginContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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("ccast_started", self, "_ccast_started") + player.disconnect("ccast_failed", self, "_ccast_failed") + player.disconnect("ccast_finished", self, "_ccast_finished") + player.disconnect("ccast_interrupted", self, "_ccast_interrupted") + + player = p_player + + player.connect("ccast_started", self, "_ccast_started") + player.connect("ccast_failed", self, "_ccast_failed") + player.connect("ccast_finished", self, "_ccast_finished") + player.connect("ccast_interrupted", self, "_ccast_interrupted") + + +func _ccast_started(pspell_cast_info: SpellCastInfo) -> void: + 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() + + +func _ccast_failed(pspell_cast_info: SpellCastInfo) -> void: + set_process(false) + hide() + +func _ccast_finished(pspell_cast_info: SpellCastInfo) -> void: + set_process(false) + hide() + +func _ccast_interrupted(pspell_cast_info: SpellCastInfo) -> void: + set_process(false) + hide() + + + + diff --git a/game/ui/castbar/Castbar.tscn b/game/ui/castbar/Castbar.tscn new file mode 100644 index 0000000..a12ee28 --- /dev/null +++ b/game/ui/castbar/Castbar.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/castbar/Castbar.gd" type="Script" id=1] + +[node name="Castbar" type="MarginContainer"] +margin_left = 339.0 +margin_top = 416.0 +margin_right = 691.0 +margin_bottom = 441.0 +script = ExtResource( 1 ) +progress_bar_path = NodePath("ProgressBar") +label_path = NodePath("Label") + +[node name="ProgressBar" type="ProgressBar" parent="."] +margin_right = 352.0 +margin_bottom = 25.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +percent_visible = false + +[node name="Label" type="Label" parent="."] +margin_right = 352.0 +margin_bottom = 25.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 1 diff --git a/game/ui/crafting/ItemEntry.gd b/game/ui/crafting/ItemEntry.gd new file mode 100644 index 0000000..b595767 --- /dev/null +++ b/game/ui/crafting/ItemEntry.gd @@ -0,0 +1,31 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..c920db9 --- /dev/null +++ b/game/ui/crafting/RecipeSelector.gd @@ -0,0 +1,17 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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/debug/DebugInfo.gd b/game/ui/debug/DebugInfo.gd new file mode 100644 index 0000000..52655a0 --- /dev/null +++ b/game/ui/debug/DebugInfo.gd @@ -0,0 +1,61 @@ +extends Label + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..79d066d --- /dev/null +++ b/game/ui/debug/SpawnPointSimpleUI.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://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..550e47a --- /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://data/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/ingame_menu/ExitButton.gd b/game/ui/ingame_menu/ExitButton.gd new file mode 100644 index 0000000..8cdbb07 --- /dev/null +++ b/game/ui/ingame_menu/ExitButton.gd @@ -0,0 +1,12 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + + +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..bae325c --- /dev/null +++ b/game/ui/ingame_menu/IngameMenu.tscn @@ -0,0 +1,83 @@ +[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/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] + +[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 = 132.0 + +[node name="Resume" type="Button" parent="Menu/VBoxContainer"] +margin_right = 147.0 +margin_bottom = 26.269 +text = "Resume" + +[node name="Keybinds" type="Button" parent="Menu/VBoxContainer"] +margin_top = 34.0 +margin_right = 147.0 +margin_bottom = 60.269 +text = "Keybinds" + +[node name="Options" type="Button" parent="Menu/VBoxContainer"] +margin_top = 68.0 +margin_right = 147.0 +margin_bottom = 94.269 +text = "Options" + +[node name="Exit" type="Button" parent="Menu/VBoxContainer"] +margin_top = 102.0 +margin_right = 147.0 +margin_bottom = 128.269 +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 +[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/Options" to="Options" method="show"] diff --git a/game/ui/keybinds/KeybindCategory.gd b/game/ui/keybinds/KeybindCategory.gd new file mode 100644 index 0000000..9a7d848 --- /dev/null +++ b/game/ui/keybinds/KeybindCategory.gd @@ -0,0 +1,9 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..6d609e9 --- /dev/null +++ b/game/ui/keybinds/KeybindEntry.gd @@ -0,0 +1,23 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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..94cd0cf --- /dev/null +++ b/game/ui/keybinds/Keybinds.gd @@ -0,0 +1,113 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var keybind_category_scene : PackedScene + +export(NodePath) var content_container_path : NodePath + + +# 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) diff --git a/game/ui/keybinds/Keybinds.tscn b/game/ui/keybinds/Keybinds.tscn new file mode 100644 index 0000000..e6ba833 --- /dev/null +++ b/game/ui/keybinds/Keybinds.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=4 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] + +[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 ) +content_container_path = NodePath("VBoxContainer/ScrollContainer/Content") + +[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 = 968.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="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="Content" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] +margin_right = 1016.0 +size_flags_horizontal = 3 + +[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 = 848.0 +margin_right = 928.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"] 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..208f168 --- /dev/null +++ b/game/ui/loot_window/LootEntry.gd @@ -0,0 +1,33 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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.crequest_loot(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..a5361ab --- /dev/null +++ b/game/ui/loot_window/LootWindow.gd @@ -0,0 +1,66 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var entry_scene : PackedScene +export(NodePath) var container_path : NodePath + +var container : Node + +var player : Entity +var target_bag : Bag + +func _ready(): + 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") + +func on_visibility_changed(): + if visible: + refresh() + else: + 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") + diff --git a/game/ui/loot_window/LootWindow.tscn b/game/ui/loot_window/LootWindow.tscn new file mode 100644 index 0000000..5aa5eb5 --- /dev/null +++ b/game/ui/loot_window/LootWindow.tscn @@ -0,0 +1,50 @@ +[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="PanelContainer"] +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("VBoxContainer/ScrollContainer/container") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 15.0 +text = "Loot" +align = 1 +valign = 1 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 23.0 +margin_right = 1016.0 +margin_bottom = 558.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="container" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] +margin_right = 1016.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="VBoxContainer"] +margin_top = 566.0 +margin_right = 1016.0 +margin_bottom = 592.269 +text = "close" +[connection signal="pressed" from="VBoxContainer/Button" to="." method="hide"] 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/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..e62c202 --- /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 = 50.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..d3f2869 --- /dev/null +++ b/game/ui/nameplates/name_plate_dynamicfont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/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..66a3688 --- /dev/null +++ b/game/ui/numbers/Number.gd @@ -0,0 +1,71 @@ +extends Label + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..80d3023 --- /dev/null +++ b/game/ui/numbers/number_font.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 12 +font_data = ExtResource( 1 ) diff --git a/game/ui/options/OptionCheckBox.gd b/game/ui/options/OptionCheckBox.gd new file mode 100644 index 0000000..74e795f --- /dev/null +++ b/game/ui/options/OptionCheckBox.gd @@ -0,0 +1,17 @@ +extends CheckBox + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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/OptionRow.gd b/game/ui/options/OptionRow.gd new file mode 100644 index 0000000..da60344 --- /dev/null +++ b/game/ui/options/OptionRow.gd @@ -0,0 +1,9 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(String) var property_category : String +export(String) var property_name : String + diff --git a/game/ui/options/Options.tscn b/game/ui/options/Options.tscn new file mode 100644 index 0000000..e3f910f --- /dev/null +++ b/game/ui/options/Options.tscn @@ -0,0 +1,128 @@ +[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/player_ui/RemoveProfile.gd" type="Script" id=2] +[ext_resource path="res://ui/options/OptionRow.gd" type="Script" id=3] +[ext_resource path="res://ui/options/Threads.gd" type="Script" id=4] +[ext_resource path="res://ui/options/OptionCheckBox.gd" type="Script" id=5] + +[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 = 30.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 + +[node name="Threads2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Video"] +visible = false +margin_right = 519.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +script = ExtResource( 3 ) +property_category = "rendering/threads" +property_name = "thread_model" + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads2"] +margin_top = 5.0 +margin_right = 255.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "asd" + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads2"] +margin_left = 263.0 +margin_right = 519.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +text = "tb" + +[node name="Threads" type="HBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Video"] +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +script = ExtResource( 4 ) + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads"] +margin_top = 5.0 +margin_right = 259.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "Thread Model" + +[node name="OptionButton" type="OptionButton" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads"] +margin_left = 267.0 +margin_right = 527.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +align = 1 +expand_icon = true + +[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 = 30.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.269 +text = "Close" +[connection signal="pressed" from="PanelContainer/VBoxContainer/Close" to="." method="hide"] diff --git a/game/ui/options/Threads.gd b/game/ui/options/Threads.gd new file mode 100644 index 0000000..1a09917 --- /dev/null +++ b/game/ui/options/Threads.gd @@ -0,0 +1,19 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..fbfe351 --- /dev/null +++ b/game/ui/player_ui/RemoveProfile.gd @@ -0,0 +1,21 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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..0c7e232 --- /dev/null +++ b/game/ui/player_ui/player_ui.gd @@ -0,0 +1,15 @@ +extends CanvasLayer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var loot_window_path : NodePath +var loot_window : Control + +func _ready(): + loot_window = get_node(loot_window_path) as Control + +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..60391ff --- /dev/null +++ b/game/ui/player_ui/player_ui.tscn @@ -0,0 +1,432 @@ +[gd_scene load_steps=28 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://player/Unitframes.gd" type="Script" id=3] +[ext_resource path="res://ui/errorframe/ErrorFrame.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/auraframe/AuraFrame.tscn" type="PackedScene" id=5] +[ext_resource path="res://ui/map/Map.tscn" type="PackedScene" id=6] +[ext_resource path="res://ui/touch_pad/TurnPanel.gd" type="Script" id=7] +[ext_resource path="res://ui/actionbars/Actionbars.gd" type="Script" id=8] +[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/windows/TalentWindow.tscn" type="PackedScene" id=11] +[ext_resource path="res://ui/unitframes/TargetUnitframe.tscn" type="PackedScene" id=12] +[ext_resource path="res://ui/touch_pad/analog.tscn" type="PackedScene" id=13] +[ext_resource path="res://ui/actionbars/ActionBar.tscn" type="PackedScene" id=14] +[ext_resource path="res://ui/bags/Bag.tscn" type="PackedScene" id=15] +[ext_resource path="res://ui/castbar/Castbar.tscn" type="PackedScene" id=16] +[ext_resource path="res://ui/windows/SpellBookWindow.tscn" type="PackedScene" id=17] +[ext_resource path="res://ui/minimap/MiniMap.tscn" type="PackedScene" id=18] +[ext_resource path="res://ui/loot_window/LootWindow.tscn" type="PackedScene" id=19] +[ext_resource path="res://ui/windows/CraftingWindow.tscn" type="PackedScene" id=20] +[ext_resource path="res://ui/unitframes/UnitframeBase.tscn" type="PackedScene" id=21] +[ext_resource path="res://ui/starmap/StarMap.tscn" type="PackedScene" id=22] +[ext_resource path="res://ui/theme/spellbook_icon.tres" type="Texture" id=23] +[ext_resource path="res://ui/theme/bag_icon.tres" type="Texture" id=24] +[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] + +[node name="GUILayer" type="CanvasLayer"] +script = ExtResource( 28 ) +loot_window_path = NodePath("GUI/Windows/LootWindow") + +[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_group_": true, +"_edit_lock_": true +} +player_path = NodePath("../..") +child_controls = [ NodePath("Unitframes"), NodePath("Actionbars"), NodePath("Windows/SpellBookWindow"), NodePath("Buttons"), NodePath("Castbar"), NodePath("AuraFrame"), NodePath("Windows/Inventory"), NodePath("Windows/LootWindow"), NodePath("Windows/TalentWindow"), NodePath("Windows/CraftingWindow") ] + +[node name="TouchTargetControls" type="MarginContainer" parent="GUI"] +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, +"_edit_lock_": true +} + +[node name="HBoxContainer" type="HBoxContainer" parent="GUI/TouchTargetControls"] +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="GUI/TouchTargetControls/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="GUI/TouchTargetControls/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" parent="GUI/TouchTargetControls/HBoxContainer/TargetPad" instance=ExtResource( 13 )] +position = Vector2( 40, 30 ) +listenerNodePath = NodePath("../../../../../..") +padname = "TargetPad" + +[node name="TouchMovementControls" type="MarginContainer" parent="GUI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 100 +custom_constants/margin_top = 200 +custom_constants/margin_left = 60 +custom_constants/margin_bottom = 50 +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="HBoxContainer" type="HBoxContainer" parent="GUI/TouchMovementControls"] +margin_left = 60.0 +margin_top = 200.0 +margin_right = 924.0 +margin_bottom = 550.0 +mouse_filter = 2 +size_flags_horizontal = 7 +size_flags_vertical = 7 + +[node name="TouchPad" type="Control" parent="GUI/TouchMovementControls/HBoxContainer"] +margin_right = 203.0 +margin_bottom = 350.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 + +[node name="Analog" parent="GUI/TouchMovementControls/HBoxContainer/TouchPad" instance=ExtResource( 13 )] +position = Vector2( 100, 290 ) +listenerNodePath = NodePath("../../../../../..") +padname = "TouchPad" + +[node name="Control" type="Control" parent="GUI/TouchMovementControls/HBoxContainer"] +margin_left = 207.0 +margin_right = 533.0 +margin_bottom = 350.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 + +[node name="TurnPanel" type="Control" parent="GUI/TouchMovementControls/HBoxContainer"] +margin_left = 537.0 +margin_right = 864.0 +margin_bottom = 350.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 + +[node name="Node2D" type="Node2D" parent="GUI/TouchMovementControls/HBoxContainer/TurnPanel"] +position = Vector2( -600, -200 ) +script = ExtResource( 7 ) + +[node name="Buttons" type="Control" parent="GUI"] +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -202.0 +margin_top = -45.0 +margin_right = 140.0 +mouse_filter = 2 +script = ExtResource( 9 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} +spell_book_path = NodePath("../Windows/SpellBookWindow") +spell_book_button_path = NodePath("HBoxContainer/SpellBookButton") +lock_button_path = NodePath("HBoxContainer/LockButton") + +[node name="HBoxContainer" type="HBoxContainer" parent="GUI/Buttons"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/separation = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpellBookButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_right = 45.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "SpellBook" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="TextureRect" type="TextureRect" parent="GUI/Buttons/HBoxContainer/SpellBookButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 23 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BagButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 45.0 +margin_right = 90.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="TextureRect2" type="TextureRect" parent="GUI/Buttons/HBoxContainer/BagButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 24 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TalentButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 90.0 +margin_right = 135.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "T" + +[node name="CraftingButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 135.0 +margin_right = 180.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "Cr" + +[node name="MapButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +visible = false +margin_left = 180.0 +margin_right = 225.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "Map" + +[node name="LockButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 180.0 +margin_right = 225.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="locked" type="TextureRect" parent="GUI/Buttons/HBoxContainer/LockButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 25 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="unlocked" type="TextureRect" parent="GUI/Buttons/HBoxContainer/LockButton"] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 26 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Menu" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 225.0 +margin_right = 270.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +focus_mode = 0 +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "M" + +[node name="Actionbars" type="HBoxContainer" parent="GUI"] +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( 8 ) +__meta__ = { +"_edit_use_anchors_": false +} +actionbar_scene = ExtResource( 14 ) + +[node name="Windows" type="CanvasLayer" parent="GUI"] +layer = 2 + +[node name="SpellBookWindow" parent="GUI/Windows" instance=ExtResource( 17 )] +visible = false +margin_left = 60.0 +margin_top = 50.0 +margin_right = 561.0 + +[node name="TalentWindow" parent="GUI/Windows" instance=ExtResource( 11 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 61.685 +margin_top = 54.195 +margin_right = 430.685 +margin_bottom = 513.195 + +[node name="CraftingWindow" parent="GUI/Windows" instance=ExtResource( 20 )] +visible = false +margin_left = 31.0 +margin_top = 23.0 +margin_right = -345.0 +margin_bottom = -67.0 + +[node name="Inventory" parent="GUI/Windows" instance=ExtResource( 15 )] +visible = false +margin_left = 56.0 +margin_top = 69.0 +margin_right = -422.0 +margin_bottom = -109.0 +inventory_item_container_path = NodePath("../Inventory/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer/GridContainer") + +[node name="LootWindow" parent="GUI/Windows" instance=ExtResource( 19 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 39.0 +margin_top = 85.0 +margin_right = 242.0 +margin_bottom = 315.0 + +[node name="StarMap" parent="GUI/Windows" instance=ExtResource( 22 )] +visible = false + +[node name="Map" parent="GUI/Windows" instance=ExtResource( 6 )] +visible = false + +[node name="Unitframes" type="Control" parent="GUI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 1.0 +margin_right = 1.0 +mouse_filter = 2 +script = ExtResource( 3 ) +__meta__ = { +"_edit_lock_": true +} +player_unit_frame_path = NodePath("PlayerUnitFrame") +target_unit_frame_path = NodePath("TargetUnitframe") + +[node name="PlayerUnitFrame" parent="GUI/Unitframes" instance=ExtResource( 21 )] +margin_right = 151.0 + +[node name="TargetUnitframe" parent="GUI/Unitframes" instance=ExtResource( 12 )] +visible = false + +[node name="MiniMap" parent="GUI" instance=ExtResource( 18 )] + +[node name="AuraFrame" parent="GUI" instance=ExtResource( 5 )] +margin_left = -331.0 +margin_bottom = 123.0 + +[node name="Castbar" parent="GUI" instance=ExtResource( 16 )] +visible = false +margin_left = 382.0 +margin_top = 461.0 +margin_right = 607.0 +margin_bottom = 480.0 +mouse_filter = 2 + +[node name="ErrorFrame" parent="GUI" instance=ExtResource( 4 )] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -191.728 +margin_top = 140.333 +margin_right = 180.272 +margin_bottom = 288.333 +mouse_filter = 2 + +[node name="IngameMenu" parent="GUI" instance=ExtResource( 2 )] +visible = false +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/BagButton" to="GUI/Windows/Inventory" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/TalentButton" to="GUI/Windows/TalentWindow" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/CraftingButton" to="GUI/Windows/CraftingWindow" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/MapButton" to="GUI/Windows/Map" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/Menu" to="GUI/IngameMenu" method="show"] 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/SpellEntryPopup.gd b/game/ui/spellbook/SpellEntryPopup.gd new file mode 100644 index 0000000..c98fa4b --- /dev/null +++ b/game/ui/spellbook/SpellEntryPopup.gd @@ -0,0 +1,27 @@ +extends PopupPanel + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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.text_description + 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..3493d71 --- /dev/null +++ b/game/ui/talents/Spec.gd @@ -0,0 +1,35 @@ +extends ScrollContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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.get_num_talent_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..0cd341a --- /dev/null +++ b/game/ui/talents/TalentEntry.gd @@ -0,0 +1,109 @@ +extends CenterContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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) -> void: + if _player != null: + _player.disconnect("ctalent_learned", self, "ctalent_learned") + _player.disconnect("ctalent_reset", self, "ctalent_reset") + + _row = row + _spec = spec + _player = player + _spec_index = spec_index + + _player.connect("ctalent_learned", self, "ctalent_learned") + _player.connect("ctalent_reset", self, "ctalent_reset") + + refresh() + + +func refresh() -> void: + var tr : TalentRowData = _spec.get_talent_row(_row) + + if tr.get_talent(culomn, 0) == null: + _main_container.hide() + return + + var rank_count : int = 0 + var known_rank_count : int = 0 + + for i in range(TalentRowData.MAX_TALENTS_PER_ENTRY): + var a : Aura = tr.get_talent(culomn, i) + + if a == null: + break + + if _player.hasc_talent(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 = tr.get_talent(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.crequest_talent_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..987554f --- /dev/null +++ b/game/ui/talents/TalentRow.gd @@ -0,0 +1,9 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func set_player(player : Entity, spec : CharacterSpec, spec_index: int, row : int) -> void: + for ch in get_children(): + ch.set_player(player, spec, spec_index, row) diff --git a/game/ui/talents/TalentRow.tscn b/game/ui/talents/TalentRow.tscn new file mode 100644 index 0000000..b556fa0 --- /dev/null +++ b/game/ui/talents/TalentRow.tscn @@ -0,0 +1,44 @@ +[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 +} + +[node name="TalentEntry" parent="." instance=ExtResource( 1 )] +margin_right = 198.0 +margin_bottom = 600.0 + +[node name="TalentEntry2" parent="." instance=ExtResource( 1 )] +margin_left = 206.0 +margin_right = 404.0 +margin_bottom = 600.0 +culomn = 1 + +[node name="TalentEntry3" parent="." instance=ExtResource( 1 )] +margin_left = 412.0 +margin_right = 610.0 +margin_bottom = 600.0 +culomn = 2 + +[node name="TalentEntry4" parent="." instance=ExtResource( 1 )] +margin_left = 618.0 +margin_right = 816.0 +margin_bottom = 600.0 +culomn = 3 + +[node name="TalentEntry5" parent="." instance=ExtResource( 1 )] +margin_left = 824.0 +margin_right = 1024.0 +margin_bottom = 600.0 +culomn = 4 diff --git a/game/ui/talents/talent_switcher_button.gd b/game/ui/talents/talent_switcher_button.gd new file mode 100644 index 0000000..2ef1616 --- /dev/null +++ b/game/ui/talents/talent_switcher_button.gd @@ -0,0 +1,16 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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..21f456f16fc478fa4ebdb416ca62b45a36df3758 GIT binary patch literal 16423 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 BW556a literal 0 HcmV?d00001 diff --git a/game/ui/theme/GameUI.png.import b/game/ui/theme/GameUI.png.import new file mode 100644 index 0000000..e782fe4 --- /dev/null +++ b/game/ui/theme/GameUI.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/GameUI.png-73e86ec1148027f9a719b18a5dba0e84.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/theme/GameUI.png" +dest_files=[ "res://.import/GameUI.png-73e86ec1148027f9a719b18a5dba0e84.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/actionbar_dynamicfont.tres b/game/ui/theme/actionbar_dynamicfont.tres new file mode 100644 index 0000000..cfe6cb4 --- /dev/null +++ b/game/ui/theme/actionbar_dynamicfont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 21 +font_data = ExtResource( 1 ) diff --git a/game/ui/theme/bag_icon.tres b/game/ui/theme/bag_icon.tres new file mode 100644 index 0000000..5d21af3 --- /dev/null +++ b/game/ui/theme/bag_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( 2, 101, 12, 14 ) diff --git a/game/ui/theme/button_bg_atlas.tres b/game/ui/theme/button_bg_atlas.tres new file mode 100644 index 0000000..431a19c --- /dev/null +++ b/game/ui/theme/button_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( 1, 55, 13, 14 ) diff --git a/game/ui/theme/button_bg_stylebox.tres b/game/ui/theme/button_bg_stylebox.tres new file mode 100644 index 0000000..94886cc --- /dev/null +++ b/game/ui/theme/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 = 5.0562 +margin_right = 5.57024 +margin_top = 5.69876 +margin_bottom = 5.57024 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.772549, 0.772549, 0.772549, 1 ) diff --git a/game/ui/theme/button_bg_stylebox_disabled.tres b/game/ui/theme/button_bg_stylebox_disabled.tres new file mode 100644 index 0000000..82fdb5c --- /dev/null +++ b/game/ui/theme/button_bg_stylebox_disabled.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 = 5.57024 +margin_right = 4.92768 +margin_top = 5.18471 +margin_bottom = 5.18471 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.984314, 0.984314, 0.984314, 1 ) diff --git a/game/ui/theme/button_bg_stylebox_focus.tres b/game/ui/theme/button_bg_stylebox_focus.tres new file mode 100644 index 0000000..91ef13d --- /dev/null +++ b/game/ui/theme/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 = 5.0562 +margin_right = 4.92768 +margin_top = 5.82727 +margin_bottom = 5.0562 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.807843, 0.807843, 0.807843, 1 ) diff --git a/game/ui/theme/button_bg_stylebox_hover.tres b/game/ui/theme/button_bg_stylebox_hover.tres new file mode 100644 index 0000000..298037a --- /dev/null +++ b/game/ui/theme/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 = 4.15661 +margin_right = 4.79917 +margin_top = 4.67066 +margin_bottom = 4.88346 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/button_bg_stylebox_pressed.tres b/game/ui/theme/button_bg_stylebox_pressed.tres new file mode 100644 index 0000000..540dc11 --- /dev/null +++ b/game/ui/theme/button_bg_stylebox_pressed.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 = 3.0 +margin_right = 3.0 +margin_top = 3.0 +margin_bottom = 3.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.431373, 0.431373, 0.431373, 1 ) diff --git a/game/ui/theme/checkbox_checked_texture.tres b/game/ui/theme/checkbox_checked_texture.tres new file mode 100644 index 0000000..0072fe5 --- /dev/null +++ b/game/ui/theme/checkbox_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( 9, 46, 7, 7 ) diff --git a/game/ui/theme/checkbox_texture.tres b/game/ui/theme/checkbox_texture.tres new file mode 100644 index 0000000..f020975 --- /dev/null +++ b/game/ui/theme/checkbox_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, 46, 7, 7 ) diff --git a/game/ui/theme/cooldown_progress.png b/game/ui/theme/cooldown_progress.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e30efc5eb892e05a9efd1b78689405f26e18d5 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaMs(j9#r85lP9 zbN@+X1@buyJR*x382Ao@Fyrz36)8YLUQZXt5Q*^QgoK0}>_5M8%zKI 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/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..8b8a490 --- /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( 31, 101, 12, 14 ) 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_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/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..8311c95 --- /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( 16, 101, 12, 14 ) diff --git a/game/ui/theme/ui_dynamicfont.tres b/game/ui/theme/ui_dynamicfont.tres new file mode 100644 index 0000000..d3f2869 --- /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://data/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..80d3023 --- /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://data/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..d9df2c7 --- /dev/null +++ b/game/ui/theme/ui_theme.tres @@ -0,0 +1,371 @@ +[gd_resource type="Theme" load_steps=30 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] + +[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( 4 ) +TabContainer/styles/tab_disabled = ExtResource( 5 ) +TabContainer/styles/tab_fg = ExtResource( 3 ) +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 ) diff --git a/game/ui/theme/unlocked_icon.tres b/game/ui/theme/unlocked_icon.tres new file mode 100644 index 0000000..439f356 --- /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( 45, 101, 12, 14 ) 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_pad/TurnPanel.gd b/game/ui/touch_pad/TurnPanel.gd new file mode 100644 index 0000000..1859357 --- /dev/null +++ b/game/ui/touch_pad/TurnPanel.gd @@ -0,0 +1,111 @@ +extends Node2D + +const INACTIVE_IDX = -1; + +export (NodePath) var listenerNodePath : NodePath = "../../../../../.." +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 : Entity = null + +func _ready(): + parent = get_node("..") + listener = get_node(listenerNodePath) as Entity + + 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..d48122c --- /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 (NodePath) var listenerNodePath : NodePath = "/root/game/player" +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/unitframes/TargetUnitframe.gd b/game/ui/unitframes/TargetUnitframe.gd new file mode 100644 index 0000000..1143967 --- /dev/null +++ b/game/ui/unitframes/TargetUnitframe.gd @@ -0,0 +1,99 @@ +extends UnitFrame + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 aura_grid_path : NodePath + +var _name_text : Label +var _health_range : Range +var _health_text : Label +var _aura_grid : GridContainer + +var _player : Entity + +# 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 + _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.get_health().disconnect("c_changed", self, "_on_player_health_changed") + _player.disconnect("caura_added", self, "on_caura_added") + _player.disconnect("caura_removed", self, "on_caura_removed") + _player.disconnect("cdied", self, "cdied") + + 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.cget_aura_count()): + var aura : AuraData = _player.cget_aura(index) + + on_caura_added(aura) + + + _player.connect("caura_added", self, "on_caura_added") + _player.connect("caura_removed", self, "on_caura_removed") + _player.connect("cdied", self, "cdied") + + var health = _player.get_health() + _on_player_health_changed(health) + health.connect("c_changed", self, "_on_player_health_changed") + + _name_text.text = _player.centity_name + + set_process(true) + show() + +func on_caura_added(aura_data : AuraData) -> void: + 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) + +func on_caura_removed(aura_data : AuraData) -> void: + 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(health : Stat) -> void: + if health.cmax == 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.cmax + _health_range.value = health.ccurrent + + _health_text.text = str(health.ccurrent) + "/" + str(health.cmax) + +func cdied(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..5671b41 --- /dev/null +++ b/game/ui/unitframes/TargetUnitframe.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=3 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] + +[node name="TargetUnitframe" type="UnitFrame"] +margin_left = 151.0 +margin_right = 300.0 +margin_bottom = 57.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +aura_entry_scene = ExtResource( 2 ) +name_text_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/Label") +health_range_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/MarginContainer/ProgressBar") +health_text_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/MarginContainer/Label") +aura_grid_path = NodePath("auras") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = -1.0 +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="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 147.0 +margin_bottom = 54.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +margin_right = 145.0 +margin_bottom = 52.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_right = 145.0 +margin_bottom = 14.0 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 18.0 +margin_right = 145.0 +margin_bottom = 32.0 + +[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/HBoxContainer/VBoxContainer/MarginContainer"] +margin_right = 145.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +percent_visible = false + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer/MarginContainer"] +margin_right = 145.0 +margin_bottom = 14.0 +align = 1 +valign = 1 + +[node name="auras" type="GridContainer" parent="."] +margin_left = 1.0 +margin_top = 61.0 +margin_right = 149.0 +margin_bottom = 193.0 +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..4948f1c --- /dev/null +++ b/game/ui/unitframes/UnitframeBase.gd @@ -0,0 +1,90 @@ +extends Container + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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 xp_range_path : NodePath + +var _name_text : Label +var _level_text : Label +var _health_range : Range +var _health_text : Label +var _xp_range : Range + +var _player : Entity + +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) + _xp_range = get_node(xp_range_path) + +func set_player(p_player: Entity) -> void: + if not _player == null: + _player.get_health().disconnect("c_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("con_xp_gained", self, "con_xp_gained") + _player.disconnect("centity_data_changed", self, "centity_data_changed") + + _player = null + + if p_player == null: + return + + _player = p_player + + _player.connect("cname_changed", self, "cname_changed") + _player.connect("con_level_up", self, "clevel_changed") + _player.connect("con_level_changed", self, "clevel_changed") + _player.connect("con_xp_gained", self, "con_xp_gained") + _player.connect("centity_data_changed", self, "centity_data_changed") + + var health = _player.get_health() + _on_player_health_changed(health) + health.connect("c_changed", self, "_on_player_health_changed") + + _name_text.text = _player.centity_name + _level_text.text = str(_player.clevel) + + clevel_changed(_player, 0) + con_xp_gained(_player, 0) + +func _on_player_health_changed(health: Stat) -> void: + if health.cmax == 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.cmax + _health_range.value = health.ccurrent + + _health_text.text = str(health.ccurrent) + "/" + str(health.cmax) + +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) + + _xp_range.min_value = 0 + _xp_range.max_value = Entities.get_xp_data().get_xp(_player.clevel) + +func con_xp_gained(entity: Entity, val: int) -> void: + _xp_range.value = _player.cxp + +func centity_data_changed(data: EntityData) -> void: + var health = _player.get_health() + _on_player_health_changed(health) diff --git a/game/ui/unitframes/UnitframeBase.tscn b/game/ui/unitframes/UnitframeBase.tscn new file mode 100644 index 0000000..60cab94 --- /dev/null +++ b/game/ui/unitframes/UnitframeBase.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=3 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] + +[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") +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 +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 +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 + +[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 +percent_visible = false diff --git a/game/ui/windows/CharacterWindow.tscn b/game/ui/windows/CharacterWindow.tscn new file mode 100644 index 0000000..fcfed61 --- /dev/null +++ b/game/ui/windows/CharacterWindow.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="CharacterWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.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 = 1020.0 +margin_bottom = 596.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 40.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 12.0 +margin_right = 968.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "Equipment" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "X" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/windows/CraftItemDescription.gd b/game/ui/windows/CraftItemDescription.gd new file mode 100644 index 0000000..13c7ee0 --- /dev/null +++ b/game/ui/windows/CraftItemDescription.gd @@ -0,0 +1,26 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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/windows/CraftingWindow.gd b/game/ui/windows/CraftingWindow.gd new file mode 100644 index 0000000..8be85a2 --- /dev/null +++ b/game/ui/windows/CraftingWindow.gd @@ -0,0 +1,124 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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(): + _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.gets_craft_recipe_count()): + var cr : CraftRecipe = _player.gets_craft_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.crequest_craft(_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) diff --git a/game/ui/windows/CraftingWindow.tscn b/game/ui/windows/CraftingWindow.tscn new file mode 100644 index 0000000..dc883e3 --- /dev/null +++ b/game/ui/windows/CraftingWindow.tscn @@ -0,0 +1,311 @@ +[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/windows/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/windows/CraftItemDescription.gd" type="Script" id=5] + +[sub_resource type="ButtonGroup" id=1] + +[node name="CraftingWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +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("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription") +tools_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/ToolsContainer") +materials_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/MaterialContainer") +recipe_selector_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes/VBoxContainer") +recipe_selector_main_on = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes") +recipe_selector_main_off = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/CenterContainer2") +materials_container_main_on = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry") +materials_container_main_off = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CenterContainer") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="Header" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="VBoxContainer/Header"] +margin_top = 7.0 +margin_right = 972.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Crafting" + +[node name="Button" type="Button" parent="VBoxContainer/Header"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="Categories" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 64.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/Categories"] +margin_right = 1016.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="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 198.0 +margin_right = 298.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +pressed = true +group = SubResource( 1 ) +text = "Alchemy" + +[node name="Smithing" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 302.0 +margin_right = 402.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Smithing" + +[node name="Enchanting" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 406.0 +margin_right = 506.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Enchantig" + +[node name="Engineering" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 510.0 +margin_right = 610.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Engineering" + +[node name="Tailoring" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 614.0 +margin_right = 714.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Tailoring" + +[node name="Other" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 718.0 +margin_right = 818.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Other" + +[node name="VBoxContainer" type="MarginContainer" parent="VBoxContainer"] +margin_top = 72.0 +margin_right = 1016.0 +margin_bottom = 592.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 520.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer"] +margin_right = 674.0 +margin_bottom = 520.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="CraftEntry" type="VBoxContainer" parent="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="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="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer"] +margin_right = 714.0 +margin_bottom = 122.0 +size_flags_horizontal = 3 + +[node name="CraftItemDescription" type="HBoxContainer" parent="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="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="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="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="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="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="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2/VBoxContainer"] +margin_right = 292.0 +margin_bottom = 15.0 + +[node name="RichTextLabel" type="RichTextLabel" parent="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="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="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="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="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="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="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="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 670.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CenterContainer"] +margin_left = 288.0 +margin_top = 248.0 +margin_right = 378.0 +margin_bottom = 263.0 +text = "Select a recipe" +align = 1 +valign = 1 + +[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer"] +margin_left = 678.0 +margin_right = 1016.0 +margin_bottom = 520.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.5 + +[node name="Recipes" type="ScrollContainer" parent="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="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes"] +margin_right = 282.0 +size_flags_horizontal = 3 + +[node name="CenterContainer2" type="CenterContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 334.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/CenterContainer2"] +margin_left = 135.0 +margin_top = 248.0 +margin_right = 195.0 +margin_bottom = 263.0 +text = "No recipes" +align = 1 +valign = 1 +[connection signal="pressed" from="VBoxContainer/Header/Button" to="." method="hide"] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Alchemy" to="." method="set_category" binds= [ 1 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Smithing" to="." method="set_category" binds= [ 2 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Enchanting" to="." method="set_category" binds= [ 4 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Engineering" to="." method="set_category" binds= [ 5 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Tailoring" to="." method="set_category" binds= [ 3 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Other" to="." method="set_category" binds= [ 0 ]] +[connection signal="pressed" from="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/HBoxContainer/CraftButton" to="." method="request_craft"] diff --git a/game/ui/windows/InventoryWindow.tscn b/game/ui/windows/InventoryWindow.tscn new file mode 100644 index 0000000..69e3f87 --- /dev/null +++ b/game/ui/windows/InventoryWindow.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/windows/inventory/ItemEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/windows/base/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/windows/SpellBookWindow.gd b/game/ui/windows/SpellBookWindow.gd new file mode 100644 index 0000000..670223a --- /dev/null +++ b/game/ui/windows/SpellBookWindow.gd @@ -0,0 +1,173 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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_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: + _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") + + 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[i].set_spell(_player, null) + i += 1 + n += 1 + continue + + var spell : Spell = _spells[spindex] + + if not show_not_learnable: + if not _player.hasc_spell(spell) and spell.training_required_spell \ + and not _player.hasc_spell(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 + + _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 + diff --git a/game/ui/windows/SpellBookWindow.tscn b/game/ui/windows/SpellBookWindow.tscn new file mode 100644 index 0000000..cb6a4a3 --- /dev/null +++ b/game/ui/windows/SpellBookWindow.tscn @@ -0,0 +1,179 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/windows/SpellContainer.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/windows/SpellBookWindow.gd" type="Script" id=4] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=5] + +[node name="SpellBookWindow" type="PanelContainer"] +margin_right = 884.0 +margin_bottom = 510.0 +theme = ExtResource( 5 ) +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} +spell_entry_container_path = NodePath("PagedContent/GridContainer") +prev_button_path = NodePath("PagedContent/Controls/HBoxContainer/Button2") +next_button_path = NodePath("PagedContent/Controls/HBoxContainer/Button") +spell_points_label_path = NodePath("PagedContent/Controls/HBoxContainer/SpellPoints") +show_not_learnable = true + +[node name="PagedContent" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 880.0 +margin_bottom = 506.0 + +[node name="Header" type="HBoxContainer" parent="PagedContent"] +margin_right = 876.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="PagedContent/Header"] +margin_top = 7.0 +margin_right = 54.0 +margin_bottom = 22.0 +text = "Spellbook" + +[node name="HBoxContainer" type="HBoxContainer" parent="PagedContent/Header"] +margin_left = 58.0 +margin_right = 832.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="Button" type="Button" parent="PagedContent/Header/HBoxContainer"] +margin_left = 337.0 +margin_right = 437.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 100, 0 ) +text = "Nature" + +[node name="Button" type="Button" parent="PagedContent/Header"] +margin_left = 836.0 +margin_right = 876.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="GridContainer" type="GridContainer" parent="PagedContent"] +margin_top = 38.0 +margin_right = 876.0 +margin_bottom = 464.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 2 + +[node name="SpellContainer" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 0.0 +margin_right = 436.0 +margin_bottom = 67.0 + +[node name="SpellContainer2" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 0.0 +margin_right = 876.0 +margin_bottom = 67.0 + +[node name="SpellContainer3" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 71.0 +margin_right = 436.0 +margin_bottom = 138.0 + +[node name="SpellContainer4" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 71.0 +margin_right = 876.0 +margin_bottom = 138.0 + +[node name="SpellContainer5" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 142.0 +margin_right = 436.0 +margin_bottom = 209.0 + +[node name="SpellContainer6" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 142.0 +margin_right = 876.0 +margin_bottom = 209.0 + +[node name="SpellContainer7" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 213.0 +margin_right = 436.0 +margin_bottom = 280.0 + +[node name="SpellContainer8" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 213.0 +margin_right = 876.0 +margin_bottom = 280.0 + +[node name="SpellContainer9" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 284.0 +margin_right = 436.0 +margin_bottom = 351.0 + +[node name="SpellContainer10" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 284.0 +margin_right = 876.0 +margin_bottom = 351.0 + +[node name="SpellContainer11" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 355.0 +margin_right = 436.0 +margin_bottom = 422.0 + +[node name="SpellContainer12" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 355.0 +margin_right = 876.0 +margin_bottom = 422.0 + +[node name="Controls" type="MarginContainer" parent="PagedContent"] +margin_top = 472.0 +margin_right = 876.0 +margin_bottom = 502.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="PagedContent/Controls"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 874.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button2" type="Button" parent="PagedContent/Controls/HBoxContainer"] +margin_right = 288.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "< Previous page" + +[node name="SpellPoints" type="Label" parent="PagedContent/Controls/HBoxContainer"] +margin_left = 292.0 +margin_top = 5.0 +margin_right = 580.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +align = 1 +valign = 1 + +[node name="Button" type="Button" parent="PagedContent/Controls/HBoxContainer"] +margin_left = 584.0 +margin_right = 872.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Next page >" +[connection signal="pressed" from="PagedContent/Header/Button" to="." method="hide"] diff --git a/game/ui/windows/SpellContainer.gd b/game/ui/windows/SpellContainer.gd new file mode 100644 index 0000000..109016b --- /dev/null +++ b/game/ui/windows/SpellContainer.gd @@ -0,0 +1,117 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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.hasc_spell(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.crequest_spell_learn(_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 _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.hasc_spell(_spell.training_required_spell): + + get_node(known_label_path).hide() + get_node(learn_button_path).show() + + modulate = unlearnable_color + + return + + get_node(known_label_path).hide() + get_node(learn_button_path).show() + + modulate = not_known_color + + modulate = not_known_color + + diff --git a/game/ui/windows/SpellContainer.tscn b/game/ui/windows/SpellContainer.tscn new file mode 100644 index 0000000..ed333ac --- /dev/null +++ b/game/ui/windows/SpellContainer.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/windows/SpellDragAndDropSpellBook.gd" type="Script" id=1] +[ext_resource path="res://ui/windows/SpellContainer.gd" type="Script" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/spellbook/SpellEntryPopup.gd" type="Script" id=5] + +[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( 3 ) +script = ExtResource( 2 ) +__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( 1 ) + +[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( 5 ) +__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 = 250.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.269 +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 = 42.0 + +[node name="PanelContainer" type="PanelContainer" parent="SpellEntryPopup/VBoxContainer"] +visible = false +margin_top = 50.0 +margin_right = 296.0 +margin_bottom = 80.0 +rect_min_size = Vector2( 0, 20 ) + +[node name="KnownLabel" type="Label" parent="SpellEntryPopup/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 7.0 +margin_right = 292.0 +margin_bottom = 22.0 +text = "Known" +align = 1 +valign = 1 + +[node name="LearnButton" type="Button" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 50.0 +margin_right = 288.0 +margin_bottom = 76.269 +text = "Learn" + +[node name="RichTextLabel" type="RichTextLabel" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 84.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/windows/SpellDragAndDropSpellBook.gd b/game/ui/windows/SpellDragAndDropSpellBook.gd new file mode 100644 index 0000000..c4585d0 --- /dev/null +++ b/game/ui/windows/SpellDragAndDropSpellBook.gd @@ -0,0 +1,29 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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_id = spell.id + + return esd diff --git a/game/ui/windows/TalentWindow.gd b/game/ui/windows/TalentWindow.gd new file mode 100644 index 0000000..7707b6d --- /dev/null +++ b/game/ui/windows/TalentWindow.gd @@ -0,0 +1,80 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +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(): + _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 + s.name = spec.text_name + + s.set_spec(_player, spec, i) + diff --git a/game/ui/windows/TalentWindow.tscn b/game/ui/windows/TalentWindow.tscn new file mode 100644 index 0000000..c65d20e --- /dev/null +++ b/game/ui/windows/TalentWindow.tscn @@ -0,0 +1,76 @@ +[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/windows/TalentWindow.gd" type="Script" id=3] +[ext_resource path="res://ui/talents/talent_switcher_button.tscn" type="PackedScene" id=4] + +[node name="TalentWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +spec_scene = ExtResource( 2 ) +spec_switcher_scene = ExtResource( 4 ) +spec_container_path = NodePath("VBoxContainer/TabContainer") +spec_switcher_path = NodePath("VBoxContainer/Header/SpecSwitcher") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="Header" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 0, 30 ) +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/Header"] +margin_top = 7.0 +margin_right = 42.0 +margin_bottom = 22.0 +text = "Talents" + +[node name="SpecSwitcher" type="HBoxContainer" parent="VBoxContainer/Header"] +margin_left = 50.0 +margin_right = 968.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Button" type="Button" parent="VBoxContainer/Header"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +visible = false +margin_top = 48.0 +margin_right = 1016.0 +margin_bottom = 576.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/MarginContainer"] +margin_right = 1016.0 +margin_bottom = 528.0 +scroll_horizontal_enabled = false + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/MarginContainer/ScrollContainer"] +margin_right = 1016.0 +size_flags_horizontal = 3 + +[node name="TabContainer" type="TabContainer" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 592.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +[connection signal="pressed" from="VBoxContainer/Header/Button" to="." method="hide"] diff --git a/game/ui/windows/VBoxContainer.gd b/game/ui/windows/VBoxContainer.gd new file mode 100644 index 0000000..db9e53c --- /dev/null +++ b/game/ui/windows/VBoxContainer.gd @@ -0,0 +1,17 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# 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 diff --git a/game/ui/windows/base/BaseWindow.tscn b/game/ui/windows/base/BaseWindow.tscn new file mode 100644 index 0000000..a5a7286 --- /dev/null +++ b/game/ui/windows/base/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/windows/base/PagedContentContainer.tscn b/game/ui/windows/base/PagedContentContainer.tscn new file mode 100644 index 0000000..b7ce2a6 --- /dev/null +++ b/game/ui/windows/base/PagedContentContainer.tscn @@ -0,0 +1,56 @@ +[gd_scene format=2] + +[node name="PagedContent" type="VSplitContainer"] +margin_right = 523.0 +margin_bottom = 400.0 +dragger_visibility = 2 + +[node name="Content" type="MarginContainer" parent="."] +margin_right = 523.0 +margin_bottom = 376.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 + +[node name="Controls" type="MarginContainer" parent="."] +margin_top = 376.0 +margin_right = 523.0 +margin_bottom = 400.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="Controls"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 521.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button2" type="Button" parent="Controls/HBoxContainer"] +margin_right = 154.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "< Previous page" + +[node name="MarginContainer" type="MarginContainer" parent="Controls/HBoxContainer"] +margin_left = 158.0 +margin_right = 359.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 1.3 + +[node name="Button" type="Button" parent="Controls/HBoxContainer"] +margin_left = 363.0 +margin_right = 519.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Next page >" diff --git a/game/ui/windows/base/ScrollContainer.tscn b/game/ui/windows/base/ScrollContainer.tscn new file mode 100644 index 0000000..f5ef79a --- /dev/null +++ b/game/ui/windows/base/ScrollContainer.tscn @@ -0,0 +1,22 @@ +[gd_scene format=2] + +[node name="ScrollContainer" type="HSplitContainer"] +editor/display_folded = true +margin_right = 523.0 +margin_bottom = 403.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +collapsed = true +dragger_visibility = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +margin_right = 511.0 +margin_bottom = 403.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VScrollBar" type="VScrollBar" parent="."] +margin_left = 511.0 +margin_right = 523.0 +margin_bottom = 403.0 + diff --git a/game/ui/windows/inventory/ItemEntry.tscn b/game/ui/windows/inventory/ItemEntry.tscn new file mode 100644 index 0000000..ba1094a --- /dev/null +++ b/game/ui/windows/inventory/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