[
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing Guidelines\n\n<!-- How to contribute -->\n<!-- How to join the community -->\n<!-- How to get support -->\n\n<!-- See https://github.com/atom/atom/blob/master/CONTRIBUTING.md#reporting-bugs for reference -->\n\nThank you very much for helping us make the project better! 😄\nWe appreciate every contribution, and you taking the time to give back to the community. 🙂\nAt the same time, there are a few guidelines we'd ask you to follow here to help bring everyone's work together as smoothly as possible.\n\nThis guide explains how to report bugs, but how to suggest new features, where you can get support with the project as a user, and how to get in touch with other creators through the community channels.\n\n## How Do I Submit A (Good) Bug Report?\n\nWe track both bugs and improvements in the issues tab on GitHub.\n\nWriting a good bug report makes it a lot easier for maintainers and contributors to fix it. A good bug report:\n\n1. Starts with a clear title that describes the issue\n1. Includes a list of steps to reproduce the bug, an information about the version of the program and the platform you're working with\n1. Contains the traceback or the error reported by the program in the output tab when the bug occurs\n\nYou should also mention any steps you've taken to try and solve the issue or extra information you think would be valuable to help track down and fixed a bug.\n\n*Tips: take a quick screenshot and drag and drop it in the GitHub issue's body to help illustrate the problem! For Windows users, I recommend to use [ShareX](https://getsharex.com/) for that (open source). Ubuntu comes with a built-in tool, press <kbd>Shift</kbd> <kbd>PrtScn</kbd> by default to capture a rectangular area on your screen.*\n\n### Bad and good bug report examples\n\nHere's an example of a *bad* bug report:\n\n```md\n# X doesn't work\n\nI can't make feature X work\n```\n\nThis report doesn't give any information about what the bug is, what triggers it, whether it can be reproduced, if it's platform-specific, if you' re using an unsupported platform...\n\nHere's an example of a good bug report,\n\n```md\n\n```\n\n## I want to submit a new feature or improve existing code\n\nThat's great to hear! Be sure to let everyone know you're working on this by opening an issue or replying to an existing issue.\n\n## I need help to use this project!\n\n\n\n## Where can I chat with other contributors?\n\nIssues\nJoin us on Discord! https://discord.gg/87NNb3Z\n#open-source channel\n\nIf you would like to discuss an issue in private, you can find me on Twitter\n"
  },
  {
    "path": ".gitignore",
    "content": ".import\n.projectile\n"
  },
  {
    "path": "Demo.tscn",
    "content": "[gd_scene load_steps=14 format=2]\n\n[ext_resource path=\"res://core/Game.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://audio/MusicPlayer.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://vfx/fog_background.material\" type=\"Material\" id=3]\n[ext_resource path=\"res://vfx/Fog.gd\" type=\"Script\" id=4]\n[ext_resource path=\"res://core/LevelLoader.gd\" type=\"Script\" id=5]\n[ext_resource path=\"res://actors/player/Player.tscn\" type=\"PackedScene\" id=6]\n[ext_resource path=\"res://vfx/fog_foreground.material\" type=\"Material\" id=7]\n[ext_resource path=\"res://vfx/TransitionColor.tscn\" type=\"PackedScene\" id=8]\n[ext_resource path=\"res://interface/Interface.gd\" type=\"Script\" id=9]\n[ext_resource path=\"res://interface/gui/player/PlayerGUI.tscn\" type=\"PackedScene\" id=10]\n[ext_resource path=\"res://interface/menus/shop/ShopMenu.tscn\" type=\"PackedScene\" id=11]\n[ext_resource path=\"res://interface/menus/pause/PauseMenu.tscn\" type=\"PackedScene\" id=12]\n[ext_resource path=\"res://interface/gui/lifebar/LifebarsBuilder.tscn\" type=\"PackedScene\" id=13]\n\n[node name=\"Game\" type=\"Node\"]\npause_mode = 1\nscript = ExtResource( 1 )\n\n[node name=\"MusicPlayer\" parent=\".\" instance=ExtResource( 2 )]\n\n[node name=\"Background\" type=\"CanvasLayer\" parent=\".\"]\neditor/display_folded = true\nlayer = -100\n\n[node name=\"ColorRect\" type=\"ColorRect\" parent=\"Background\"]\nanchor_right = 1.0\nanchor_bottom = 1.0\ncolor = Color( 0.0625, 0.0549316, 0.0549316, 1 )\n\n[node name=\"BackgroundFog\" type=\"ColorRect\" parent=\"Background\"]\nvisible = false\nmaterial = ExtResource( 3 )\nanchor_right = 1.0\nanchor_bottom = 1.0\nscript = ExtResource( 4 )\n\n[node name=\"LevelLoader\" type=\"Node\" parent=\".\"]\npause_mode = 1\nscript = ExtResource( 5 )\nLEVEL_START = \"res://levels/Grasslands.tscn\"\n\n[node name=\"Player\" parent=\"LevelLoader\" instance=ExtResource( 6 )]\n\n[node name=\"Overlays\" type=\"CanvasLayer\" parent=\".\"]\npause_mode = 2\neditor/display_folded = true\nlayer = 50\n\n[node name=\"ForegroundFog\" type=\"ColorRect\" parent=\"Overlays\"]\nvisible = false\nmaterial = ExtResource( 7 )\nanchor_right = 1.0\nanchor_bottom = 1.0\nscript = ExtResource( 4 )\n\n[node name=\"TransitionColor\" parent=\"Overlays\" instance=ExtResource( 8 )]\n\n[node name=\"Interface\" type=\"CanvasLayer\" parent=\".\"]\npause_mode = 2\nlayer = 100\nscript = ExtResource( 9 )\n\n[node name=\"PlayerGUI\" parent=\"Interface\" instance=ExtResource( 10 )]\n\n[node name=\"ShopMenu\" parent=\"Interface\" instance=ExtResource( 11 )]\npause_mode = 2\nvisible = false\n_sections_unfolded = [ \"Pause\", \"Theme\" ]\n\n[node name=\"PauseMenu\" parent=\"Interface\" instance=ExtResource( 12 )]\nvisible = false\n_sections_unfolded = [ \"Pause\", \"Theme\" ]\n\n[node name=\"LifebarsBuilder\" parent=\"Interface\" instance=ExtResource( 13 )]\n\n[connection signal=\"loaded\" from=\"LevelLoader\" to=\"Interface\" method=\"_on_Level_loaded\"]\n[connection signal=\"loaded\" from=\"LevelLoader\" to=\"Background/BackgroundFog\" method=\"_on_LevelLoader_loaded\"]\n[connection signal=\"loaded\" from=\"LevelLoader\" to=\"Overlays/ForegroundFog\" method=\"_on_LevelLoader_loaded\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 GDquest\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<h1 align=\"center\">\n  Make Pro 2d Games with Godot</br>\n  <small>Open Source A-RPG Demo</small>\n</h1>\n\n<p align='center'>\n  <img src=\"https://i.imgur.com/zW56qs0.png\" alt=\"Banner for the project, showing the player facing the game's boss, the blue wild boar\" />\n</p>\n\n<hr>\n\nThis is the full source code with all the system produced for the [Make Professional 2d Games with Godot](https://gumroad.com/l/godot-tutorial-make-professional-2d-games) course.\n\n![The game's boss, the Wild Boar](https://i.imgur.com/Bt57gQH.png)\n\nThis game demo tries to show good Godot programming practices to support a growing game project. It has multiple interlocking systems, the core gameplay loop in place, a boss encounter, an inventory and shop systems, user interface with nested menus...\n\n![Grasslands with the two monsters available in the game, the mosquito and the porcupine](https://i.imgur.com/OPg5QEn.png)\n\n## LICENSE ##\n\nThe entire source code is available under the MIT licence and everyone is welcome to [contribute](https://github.com/GDquest/make-pro-2d-games-with-godot/issues/)! Better art, gameplay improvements, code re-factoring, and more…\n\nAll the techniques I used to build this project are in our [intermediate-level Godot course on Gumroad](https://gumroad.com/gdquest). If you're interested in getting it, be aware it's not 100% step-by-step.\n\nIf you have requests for tutorials from elements of that game demo, please feel free to [ask on Twitter](https://twitter.com/NathanGDquest)! I will not redo what's in the course but I'll gladly make extra videos that would benefit everyone! 😄\n\nThis is our first open game on GDQuest. We are looking to build more Free games and game creation tools in the future. Be sure to [subscribe to our YouTube channel](http://youtube.com/c/gdquest) to know when that happens ☺\n\n## Dependencies ##\n\nThe project runs in **Godot 3.1**.\n\n## Features ##\n\nHere's a list of the gameplay features and a few of the systems you will find in the demo\n\n### Gameplay ###\n\n- A player that can walk, jump, and do a three hit combo with a sword\n- Two monsters with steering based movement\n- Boss with 3 phases, drops random stacks of coins upon dying\n- Items, and inventory, and a shop that will cover your basics for an RPG game\n\n### Core systems ###\n\n- LevelLoader, to load maps cleanly, keep the player's data around\n- Save and load system\n- Game node to handle pause and initialize the game at the start\n- Shader to animate the transition between levels\n\n### User interface ###\n\n- An inventory menu and a shop menu where you can buy and sell items between two characters\n- A pause menu with sound options\n- A system to create life bars that hook onto monsters and follow them in the game world, but that are still managed by the UI system\n- The animated player life bar (tutorial)\n- Animated boss light bar that appears when the boss spans\n\n### Visual effects ###\n\n- Layered particle systems like explosions, bursting fire, rock sparkles, dust\n- Beautiful noise-based fog thanks to [Gonkee](https://github.com/Gonkee/Gonkee-Fog-Shader)\n\n### A few misc extras\n\n- Modular hit box and damage source system to create ranged and melee weapons\n- Stats node to manage the player and the monsters' health\n- Gaps the player can fall into\n\n### Contributing\n\nYou can find our contributor's guides here:\n\n- [Contributor's guide](https://www.gdquest.com/open-source/guidelines/contributing-to-gdquest-projects/)\n- [GDScript best practices](https://www.gdquest.com/open-source/guidelines/godot-gdscript/)\n- [Kind communication guidelines](https://www.gdquest.com/open-source/guidelines/kind-communication-guidelines/)\n"
  },
  {
    "path": "actors/Actor.gd",
    "content": "extends KinematicBody2D\n\nsignal direction_changed(new_direction)\nsignal position_changed(new_position)\nsignal died()\n\nonready var health = $Health\n\nvar look_direction = Vector2(1, 0) setget set_look_direction\n\nfunc take_damage_from(damage_source):\n\thealth.take_damage(damage_source.damage)\n\nfunc set_dead(value):\n\tset_process_input(not value)\n\tset_physics_process(not value)\n\t$CollisionPolygon2D.disabled = value\n\temit_signal('died')\n\nfunc set_look_direction(value):\n\tlook_direction = value\n\temit_signal(\"direction_changed\", value)\n\nfunc reset(target_global_position):\n\tglobal_position = target_global_position\n"
  },
  {
    "path": "actors/Actor.tscn",
    "content": "[gd_scene load_steps=11 format=2]\n\n[ext_resource path=\"res://actors/health/Stats.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://actors/body.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://interface/theme/icons/add.png\" type=\"Texture\" id=3]\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Skin/Body:scale\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Skin/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Skin/Body:position\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, -31.5144 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Skin/Body:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"heal\"\nlength = 0.6\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Skin/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.2, 0.6 ),\n\"transitions\": PoolRealArray( 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 0, 1, 0.179688, 1 ), Color( 1, 1, 1, 1 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Skin/HealParticles:emitting\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.6 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 2,\n\"values\": [ true, false ]\n}\n\n[sub_resource type=\"Gradient\" id=3]\n\noffsets = PoolRealArray( 0, 0.111475, 0.872131, 1 )\ncolors = PoolColorArray( 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 )\n\n[sub_resource type=\"GradientTexture\" id=4]\n\nflags = 4\ngradient = SubResource( 3 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.693359 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 20.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 60.0\ninitial_velocity_random = 0.0\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 1.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 1.0\nscale_random = 0.0\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 4 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Damping\" ]\n\n[node name=\"Actor\" type=\"KinematicBody2D\" groups=[\n\"actor\",\n]]\n\ninput_pickable = false\ncollision_layer = 1\ncollision_mask = 1\ncollision/safe_margin = 0.08\n_sections_unfolded = [ \"Transform\", \"Visibility\" ]\n\n[node name=\"Health\" parent=\".\" index=\"0\" instance=ExtResource( 1 )]\n\nmax_health = 100\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"1\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"SETUP\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/heal = SubResource( 2 )\nblend_times = [  ]\n_sections_unfolded = [ \"Playback Options\" ]\n\n[node name=\"Skin\" type=\"Position2D\" parent=\".\" index=\"2\"]\n\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"Body\" type=\"Sprite\" parent=\"Skin\" index=\"0\"]\n\nposition = Vector2( 0, -31.5144 )\ntexture = ExtResource( 2 )\noffset = Vector2( 1.40758, -3.05176e-005 )\n_sections_unfolded = [ \"Transform\", \"Visibility\" ]\n\n[node name=\"HealParticles\" type=\"Particles2D\" parent=\"Skin\" index=\"1\"]\n\nposition = Vector2( 37.3383, -68.3211 )\nrotation = -1.19808\nemitting = false\namount = 3\nlifetime = 0.6\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 7 )\ntexture = ExtResource( 3 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\" ]\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\".\" index=\"3\"]\n\nbuild_mode = 0\npolygon = PoolVector2Array( -30, 0, -30, -40, 34, -40, 34, 0 )\n_sections_unfolded = [ \"Transform\" ]\n\n\n"
  },
  {
    "path": "actors/CoinsAttractor.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[sub_resource type=\"CircleShape2D\" id=2]\n\ncustom_solver_bias = 0.0\nradius = 41.2311\n\n[node name=\"CoinsAttractor\" type=\"Area2D\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\ncollision_layer = 128\ncollision_mask = 64\naudio_bus_override = false\naudio_bus_name = \"Master\"\n_sections_unfolded = [ \"Collision\" ]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"0\"]\n\nshape = SubResource( 2 )\n\n\n"
  },
  {
    "path": "actors/CoinsCollector.gd",
    "content": "extends Area2D\n\nsignal coins_received(amount)\n\nconst Coins = preload(\"res://core/inventory/items/Coins.gd\")\n\nfunc _on_area_entered(area):\n\tprint(area)\n\tif not area is Coins:\n\t\treturn\n\tarea.queue_free()\n\temit_signal(\"coins_received\", area.amount)\n"
  },
  {
    "path": "actors/CoinsCollector.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://actors/CoinsCollector.gd\" type=\"Script\" id=1]\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 44.6727\n\n[node name=\"CoinsCollector\" type=\"Area2D\" index=\"0\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitorable = false\ncollision_layer = 128\ncollision_mask = 64\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\" ]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"0\"]\n\nshape = SubResource( 1 )\n\n[connection signal=\"area_entered\" from=\".\" to=\".\" method=\"_on_area_entered\"]\n\n\n"
  },
  {
    "path": "actors/CoinsFountain.gd",
    "content": "extends Position2D\n\nconst Coins = preload(\"res://core/inventory/items/Coins.tscn\")\n\nonready var timer = $Timer\n\nexport(int) var MAX_SPAWN_COUNT = 12\nvar spawn_cycles = 0\n\nfunc start():\n\ttimer.start()\n\nfunc _on_Timer_timeout():\n\tspawn_random_coin_stack()\n\nfunc spawn_random_coin_stack():\n\tvar coins = Coins.instance()\n\tadd_child(coins)\n\tcoins.set_random_amount()\n\tcoins.throw()\n\tspawn_cycles += 1\n\tif spawn_cycles == MAX_SPAWN_COUNT:\n\t\ttimer.stop()\n"
  },
  {
    "path": "actors/CoinsFountain.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://actors/CoinsFountain.gd\" type=\"Script\" id=1]\n\n[sub_resource type=\"GDScript\" id=1]\n\nscript/source = \"extends Timer\n\nexport(float) var MINIMUM_WAIT_TIME = 0.05\nexport(float) var MAXIMUM_WAIT_TIME = 0.1\n\nfunc _init():\n\tassert(MINIMUM_WAIT_TIME <= MAXIMUM_WAIT_TIME)\n\nfunc randomize_wait_time():\n\twait_time = rand_range(MINIMUM_WAIT_TIME, MAXIMUM_WAIT_TIME)\"\n\n[node name=\"CoinsFountain\" type=\"Position2D\"]\n\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Transform\" ]\nMAX_SPAWN_COUNT = 20\n\n[node name=\"Timer\" type=\"Timer\" parent=\".\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 0.05\none_shot = false\nautostart = false\nscript = SubResource( 1 )\nMINIMUM_WAIT_TIME = 0.05\nMAXIMUM_WAIT_TIME = 0.1\n\n[connection signal=\"timeout\" from=\"Timer\" to=\".\" method=\"_on_Timer_timeout\"]\n\n[connection signal=\"timeout\" from=\"Timer\" to=\"Timer\" method=\"randomize_wait_time\"]\n\n\n"
  },
  {
    "path": "actors/DamageSource.gd",
    "content": "extends Area2D\n\nexport(int) var damage = 2\nvar effect\n\nfunc set_active(value):\n\t$CollisionShape2D.disabled = not value\n"
  },
  {
    "path": "actors/DamageSource.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://actors/DamageSource.gd\" type=\"Script\" id=1]\n\n[node name=\"DamageSource\" type=\"Area2D\" index=\"0\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitoring = false\ncollision_layer = 32\ncollision_mask = 4\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\" ]\ndamage = 2\n\n\n"
  },
  {
    "path": "actors/body.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/body.png-e947538dbfd8a8c2e1335860c186fed8.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://actors/body.png\"\ndest_files=[ \"res://.import/body.png-e947538dbfd8a8c2e1335860c186fed8.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "actors/camera/ShakingCamera.gd",
    "content": "tool\nextends Camera2D\n\nexport(float) var amplitude = 6.0\nexport(float) var duration = 0.8 setget set_duration\nexport(float, EASE) var DAMP_EASING = 1.0\nexport(bool) var shake = false setget set_shake\n\nonready var timer = $Timer\n\nenum States {IDLE, SHAKING}\nvar state = States.IDLE\n\nfunc _ready():\n\tself.duration = duration\n\tset_process(false)\n\trandomize()\n\nfunc set_duration(value):\n\tduration = value\n\tif not timer:\n\t\treturn\n\ttimer.wait_time = duration\n\nfunc set_shake(value):\n\tshake = value\n\tif shake:\n\t\t_change_state(States.SHAKING)\n\telse:\n\t\t_change_state(States.IDLE)\n\nfunc _change_state(new_state):\n\tmatch new_state:\n\t\tStates.IDLE:\n\t\t\toffset = Vector2()\n\t\t\tset_process(false)\n\t\tStates.SHAKING:\n\t\t\tset_process(true)\n\t\t\ttimer.start()\n\tstate = new_state\n\nfunc _process(delta):\n\tvar damping = ease(timer.time_left / timer.wait_time, DAMP_EASING)\n\toffset = Vector2(\n\t\trand_range(amplitude, -amplitude) * damping,\n\t\trand_range(amplitude, -amplitude) * damping)\n\nfunc _on_ShakeTimer_timeout():\n\tself.shake = false\n"
  },
  {
    "path": "actors/camera/ShakingCamera.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://actors/camera/ShakingCamera.gd\" type=\"Script\" id=1]\n\n[node name=\"ShakingCamera\" type=\"Camera2D\" index=\"0\"]\n\nanchor_mode = 1\nrotating = false\ncurrent = true\nzoom = Vector2( 1, 1 )\nlimit_left = -10000000\nlimit_top = -10000000\nlimit_right = 10000000\nlimit_bottom = 10000000\nlimit_smoothed = false\ndrag_margin_h_enabled = true\ndrag_margin_v_enabled = true\nsmoothing_enabled = false\nsmoothing_speed = 5.0\noffset_v = 0.0\noffset_h = 0.0\ndrag_margin_left = 0.2\ndrag_margin_top = 0.2\ndrag_margin_right = 0.2\ndrag_margin_bottom = 0.2\neditor_draw_screen = true\neditor_draw_limits = false\neditor_draw_drag_margin = false\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Drag Margin\", \"Smoothing\", \"Transform\" ]\namplitude = 8.0\nduration = 0.8\nDAMP_EASING = 1.0\nshake = false\n\n[node name=\"Timer\" type=\"Timer\" parent=\".\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 0.8\none_shot = true\nautostart = false\n\n[connection signal=\"timeout\" from=\"Timer\" to=\".\" method=\"_on_ShakeTimer_timeout\"]\n\n\n"
  },
  {
    "path": "actors/characters/seller/Seller.gd",
    "content": "extends Area2D\n\nsignal shop_open_requested(shop, user)\n\nconst Player = preload(\"res://actors/player/PlayerController.gd\")\n\nfunc _unhandled_input(event):\n\tif not event.is_action_pressed(\"ui_accept\"):\n\t\treturn\n\tfor body in get_overlapping_bodies():\n\t\tif body is Player:\n\t\t\temit_signal(\"shop_open_requested\", $Shop, body)\n\t\t\tget_tree().set_input_as_handled()\n"
  },
  {
    "path": "actors/characters/seller/Seller.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://actors/characters/seller/Seller.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/shop/Shop.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://actors/body.png\" type=\"Texture\" id=3]\n\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 49.2988\n\n[node name=\"Seller\" type=\"Area2D\" index=\"0\" groups=[\n\"seller\",\n]]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Transform\" ]\n\n[node name=\"Shop\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"1\"]\n\nshape = SubResource( 1 )\n\n[node name=\"Body\" type=\"Sprite\" parent=\".\" index=\"2\"]\n\nposition = Vector2( 0, -20 )\ntexture = ExtResource( 3 )\n_sections_unfolded = [ \"Transform\" ]\n\n\n"
  },
  {
    "path": "actors/health/Stats.gd",
    "content": "extends Node\n\nsignal health_changed(new_health)\nsignal damage_taken(new_health)\nsignal health_depleted()\n\nvar modifiers = {}\n\nvar health = 0\nexport(int) var max_health = 9 setget set_max_health\nexport(int) var strength = 2\nexport(int) var defense = 0\n\nfunc _ready():\n\thealth = max_health\n\nfunc set_max_health(value):\n\tmax_health = max(0, value)\n\nfunc take_damage(amount):\n\thealth -= amount\n\thealth = max(0, health)\n\temit_signal(\"health_changed\", health)\n\temit_signal(\"damage_taken\", health)\n\tif health == 0:\n\t\temit_signal(\"health_depleted\")\n\nfunc heal(amount):\n\thealth += amount\n\thealth = max(health, max_health)\n\temit_signal(\"health_changed\", health)\n\nfunc add_modifier(id, modifier):\n\tmodifiers[id] = modifier\n\nfunc remove_modifier(id):\n\tmodifiers.erase(id)\n"
  },
  {
    "path": "actors/health/Stats.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://actors/health/Stats.gd\" type=\"Script\" id=1]\n\n[node name=\"Stats\" type=\"Node\" index=\"0\"]\n\nscript = ExtResource( 1 )\nhealth = 0\nmax_health = 9\nstrength = 2\ndefense = 0\n\n\n"
  },
  {
    "path": "actors/health/Status.gd",
    "content": "extends Node\n\nsignal added(status)\nsignal removed(status)\n\nvar statuses_active = {}\n\n# Example status\nconst POISON = {\n\t'name': \"Poison\",\n\t'effect': {\n\t\t'periodic_damage': {\n\t\t\t'cycles': 5,\n\t\t\t'stat': 'health',\n\t\t\t'damage': 1,\n\t\t}\n\t}\n}\nconst INVINCIBLE = {\n\t'name': \"Invincible\",\n\t'effect': {\n\t\t'stat_modifier': {\n\t\t\t'add': {\n\t\t\t\t'defense': 1000,\n\t\t\t\t'magic_defense': 1000\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc add(id, status):\n\tstatuses_active[id] = status\n\nfunc remove(id):\n\tstatuses_active.erase(id)\n\nfunc as_string():\n\tvar string = \"\"\n\tfor status in statuses_active.values():\n\t\tstring += \"%s.%s: %s\" % [status['id'], status['name'], status['effect']]\n\treturn string\n"
  },
  {
    "path": "actors/hit_box/HitBox.gd",
    "content": "extends Area2D\n\nconst DamageSource = preload(\"res://actors/DamageSource.gd\")\n\nfunc _on_area_entered(area):\n\tif not area is DamageSource:\n\t\treturn\n\towner.take_damage_from(area)\n\nfunc set_active(value):\n\t$CollisionShape2D.disabled = not value\n"
  },
  {
    "path": "actors/hit_box/HitBox.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://actors/hit_box/HitBox.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://actors/hit_box/hitbox_default.tres\" type=\"Shape2D\" id=2]\n\n[node name=\"HitBox\" type=\"Area2D\" index=\"0\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitorable = false\ncollision_layer = 4\ncollision_mask = 32\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\", \"Transform\" ]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 0, -8.42273 )\nshape = ExtResource( 2 )\n\n[connection signal=\"area_entered\" from=\".\" to=\".\" method=\"_on_area_entered\"]\n\n\n"
  },
  {
    "path": "actors/hit_box/hitbox_default.tres",
    "content": "[gd_resource type=\"CircleShape2D\" format=2]\n\n[resource]\n\ncustom_solver_bias = 0.0\nradius = 99.636\n\n"
  },
  {
    "path": "actors/player/Player.tscn",
    "content": "[gd_scene load_steps=37 format=2]\n\n[ext_resource path=\"res://actors/player/PlayerController.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://actors/camera/ShakingCamera.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://actors/hit_box/HitBox.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://actors/player/PlayerStateMachine.gd\" type=\"Script\" id=4]\n[ext_resource path=\"res://actors/player/states/motion/on_ground/Idle.gd\" type=\"Script\" id=5]\n[ext_resource path=\"res://actors/player/states/motion/on_ground/Move.gd\" type=\"Script\" id=6]\n[ext_resource path=\"res://actors/player/states/motion/on_ground/BumpPlayer.gd\" type=\"Script\" id=7]\n[ext_resource path=\"res://actors/player/states/Fall.gd\" type=\"Script\" id=8]\n[ext_resource path=\"res://actors/player/states/motion/in_air/Jump.gd\" type=\"Script\" id=9]\n[ext_resource path=\"res://actors/player/states/combat/Stagger.gd\" type=\"Script\" id=10]\n[ext_resource path=\"res://actors/player/states/combat/Attack.gd\" type=\"Script\" id=11]\n[ext_resource path=\"res://actors/player/states/Die.gd\" type=\"Script\" id=12]\n[ext_resource path=\"res://actors/player/shadow.png\" type=\"Texture\" id=13]\n[ext_resource path=\"res://actors/weapons/sword/WeaponPivot.gd\" type=\"Script\" id=14]\n[ext_resource path=\"res://actors/weapons/sword/Sword.tscn\" type=\"PackedScene\" id=15]\n[ext_resource path=\"res://actors/player/body.png\" type=\"Texture\" id=16]\n[ext_resource path=\"res://interface/fonts/SourceCodePro-Bold.ttf\" type=\"DynamicFontData\" id=17]\n[ext_resource path=\"res://actors/player/states/debug/StateNameDisplayer.gd\" type=\"Script\" id=18]\n[ext_resource path=\"res://actors/health/Stats.tscn\" type=\"PackedScene\" id=19]\n[ext_resource path=\"res://core/shop/purse/Purse.tscn\" type=\"PackedScene\" id=20]\n[ext_resource path=\"res://core/inventory/Inventory.tscn\" type=\"PackedScene\" id=21]\n[ext_resource path=\"res://core/inventory/items/usable/potions/restore_health/MinorHealthPotion.tscn\" type=\"PackedScene\" id=22]\n[ext_resource path=\"res://core/inventory/items/usable/potions/restore_health/StrongHealthPotion.tscn\" type=\"PackedScene\" id=23]\n[ext_resource path=\"res://actors/weapons/bullet/BulletSpawner.gd\" type=\"Script\" id=24]\n[ext_resource path=\"res://audio/sfx/step_01.wav\" type=\"AudioStream\" id=25]\n[ext_resource path=\"res://audio/AudioShuffleStepSounds.gd\" type=\"Script\" id=26]\n[ext_resource path=\"res://actors/CoinsCollector.tscn\" type=\"PackedScene\" id=27]\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 31.3139\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, -58.8242 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"BodyPivot/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"BodyPivot/Body:scale\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Shadow:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\"Shadow:scale\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/5/type = \"value\"\ntracks/5/path = NodePath(\"BodyPivot:scale\")\ntracks/5/interp = 1\ntracks/5/loop_wrap = true\ntracks/5/imported = false\ntracks/5/enabled = true\ntracks/5/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/6/type = \"value\"\ntracks/6/path = NodePath(\"BodyPivot:modulate\")\ntracks/6/interp = 1\ntracks/6/loop_wrap = true\ntracks/6/imported = false\ntracks/6/enabled = true\ntracks/6/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=3]\n\nresource_name = \"bump\"\nlength = 0.2\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.1, 0.2 ),\n\"transitions\": PoolRealArray( 0.466516, 1, 0.466516 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, -58.8242 ), Vector2( 0, -100 ), Vector2( 0, -58.8242 ) ]\n}\n\n[sub_resource type=\"Animation\" id=4]\n\nresource_name = \"die\"\nlength = 0.6\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.4 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"BodyPivot:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.25, 0.5 ),\n\"transitions\": PoolRealArray( 0.326562, 0.326562, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 0, 0 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Shadow:scale\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0, 0.25, 0.5 ),\n\"transitions\": PoolRealArray( 0.27991, 0.27991, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 0.275362, 0.275362 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Shadow:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0, 0.25, 0.5 ),\n\"transitions\": PoolRealArray( 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\n\n[sub_resource type=\"Animation\" id=5]\n\nlength = 1.1\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.3, 1.1 ),\n\"transitions\": PoolRealArray( 1, 0, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, -58.8242 ), Vector2( 0, 20 ), Vector2( 0, -58.8242 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"BodyPivot/Body:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.3, 1.1 ),\n\"transitions\": PoolRealArray( 1, 0, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 0.0163307, 0.0163307 ), Vector2( 1, 1 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Shadow:modulate\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0, 0.15, 1.1 ),\n\"transitions\": PoolRealArray( 1, 0, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0, 0.3, 1.1 ),\n\"transitions\": PoolRealArray( 1, 0, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 0.175781, 0.175781, 0.175781, 1 ), Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=6]\n\nlength = 0.01\nloop = true\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 0.466516 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, -58.8242 ) ]\n}\n\n[sub_resource type=\"Animation\" id=7]\n\nlength = 0.6\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.4 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=8]\n\nlength = 0.3\nloop = true\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.15 ),\n\"transitions\": PoolRealArray( 0.466516, 1.86089 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, -58.8242 ), Vector2( 0, -75.549 ) ]\n}\ntracks/1/type = \"method\"\ntracks/1/path = NodePath(\"Sfx/Steps\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"values\": [ {\n\"args\": [  ],\n\"method\": \"play_random\"\n} ]\n}\ntracks/2/type = \"method\"\ntracks/2/path = NodePath(\"StateMachine/Move\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0.3 ),\n\"transitions\": PoolRealArray( 1 ),\n\"values\": [ {\n\"args\": [  ],\n\"method\": \"spawn_dust\"\n} ]\n}\n\n[sub_resource type=\"DynamicFont\" id=9]\n\nsize = 20\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 17 )\n_sections_unfolded = [ \"Font\", \"Settings\" ]\n\n[node name=\"Player\" type=\"KinematicBody2D\" index=\"0\"]\n\nposition = Vector2( 960, 550 )\ninput_pickable = false\ncollision_layer = 1\ncollision_mask = 3\ncollision/safe_margin = 0.08\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\", \"Transform\", \"Visibility\" ]\n__meta__ = {\n\"_edit_horizontal_guides_\": [  ]\n}\n\n[node name=\"ShakingCamera\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\n[node name=\"HitBox\" parent=\".\" index=\"1\" instance=ExtResource( 3 )]\n\nmonitorable = true\n\n[node name=\"CollisionShape2D\" parent=\"HitBox\" index=\"0\"]\n\nshape = SubResource( 1 )\n\n[node name=\"StateMachine\" type=\"Node\" parent=\".\" index=\"2\"]\n\nscript = ExtResource( 4 )\nactive = false\n\n[node name=\"Idle\" type=\"Node\" parent=\"StateMachine\" index=\"0\"]\n\nscript = ExtResource( 5 )\n\n[node name=\"Move\" type=\"Node\" parent=\"StateMachine\" index=\"1\"]\n\nscript = ExtResource( 6 )\nMAX_WALK_SPEED = 450\nMAX_RUN_SPEED = 700\n\n[node name=\"Bump\" type=\"Node\" parent=\"StateMachine\" index=\"2\"]\n\nscript = ExtResource( 7 )\nSPEED = 240.0\n\n[node name=\"Fall\" type=\"Node\" parent=\"StateMachine\" index=\"3\"]\n\nscript = ExtResource( 8 )\n\n[node name=\"Jump\" type=\"Node\" parent=\"StateMachine\" index=\"4\"]\n\nscript = ExtResource( 9 )\nBASE_MAX_HORIZONTAL_SPEED = 400.0\nAIR_ACCELERATION = 1000.0\nAIR_DECCELERATION = 2000.0\nAIR_STEERING_POWER = 50.0\nJUMP_HEIGHT = 120.0\nJUMP_DURATION = 0.8\nGRAVITY = 1600.0\n\n[node name=\"Stagger\" type=\"Node\" parent=\"StateMachine\" index=\"5\"]\n\nscript = ExtResource( 10 )\n\n[node name=\"Attack\" type=\"Node\" parent=\"StateMachine\" index=\"6\"]\n\nscript = ExtResource( 11 )\n\n[node name=\"Die\" type=\"Node\" parent=\"StateMachine\" index=\"7\"]\n\nscript = ExtResource( 12 )\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"3\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 2 )\nanims/bump = SubResource( 3 )\nanims/die = SubResource( 4 )\nanims/fall = SubResource( 5 )\nanims/idle = SubResource( 6 )\nanims/stagger = SubResource( 7 )\nanims/walk = SubResource( 8 )\nblend_times = [  ]\n\n[node name=\"Shadow\" type=\"Sprite\" parent=\".\" index=\"4\"]\n\nself_modulate = Color( 1, 1, 1, 0.361098 )\nposition = Vector2( 0.362319, -4 )\ntexture = ExtResource( 13 )\n_sections_unfolded = [ \"Transform\", \"Visibility\" ]\n\n[node name=\"BodyPivot\" type=\"Position2D\" parent=\".\" index=\"5\"]\n\n_sections_unfolded = [ \"Material\", \"Transform\", \"Visibility\" ]\n\n[node name=\"WeaponPivot\" type=\"Position2D\" parent=\"BodyPivot\" index=\"0\"]\n\nposition = Vector2( 0, -62 )\nscript = ExtResource( 14 )\n_sections_unfolded = [ \"Transform\", \"Z Index\" ]\n\n[node name=\"Offset\" type=\"Position2D\" parent=\"BodyPivot/WeaponPivot\" index=\"0\"]\n\nposition = Vector2( 110, 0 )\n\n[node name=\"Sword\" parent=\"BodyPivot/WeaponPivot/Offset\" index=\"0\" instance=ExtResource( 15 )]\n\n[node name=\"Body\" type=\"Sprite\" parent=\"BodyPivot\" index=\"1\"]\n\nposition = Vector2( 0, -58.8242 )\ntexture = ExtResource( 16 )\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"StateNameDisplayer\" type=\"Label\" parent=\"BodyPivot\" index=\"2\"]\n\neditor/display_folded = true\nvisible = false\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = -109.0\nmargin_top = -172.0\nmargin_right = 110.0\nmargin_bottom = -138.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = SubResource( 9 )\ntext = \"Test\"\nalign = 1\nvalign = 1\nuppercase = true\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\nscript = ExtResource( 18 )\n_sections_unfolded = [ \"Rect\", \"custom_fonts\" ]\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\".\" index=\"6\"]\n\nbuild_mode = 0\npolygon = PoolVector2Array( -20, 0, -20, -20, 20, -20, 20, 0 )\n\n[node name=\"Health\" parent=\".\" index=\"7\" instance=ExtResource( 19 )]\n\n[node name=\"Purse\" parent=\".\" index=\"8\" instance=ExtResource( 20 )]\n\ncoins = 32\nMAXIMUM = 1000000\n\n[node name=\"Inventory\" parent=\".\" index=\"9\" instance=ExtResource( 21 )]\n\n[node name=\"MinorHealthPotion\" parent=\"Inventory\" index=\"0\" instance=ExtResource( 22 )]\n\namount = 4\n\n[node name=\"StrongHealthPotion\" parent=\"Inventory\" index=\"1\" instance=ExtResource( 23 )]\n\n[node name=\"BulletSpawn\" type=\"Node2D\" parent=\".\" index=\"10\"]\n\nposition = Vector2( 1.17401, -61.266 )\nscript = ExtResource( 24 )\n_sections_unfolded = [ \"Transform\" ]\n\n[node name=\"CooldownTimer\" type=\"Timer\" parent=\"BulletSpawn\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 0.2\none_shot = true\nautostart = false\n\n[node name=\"Sfx\" type=\"Node\" parent=\".\" index=\"11\"]\n\n[node name=\"Steps\" type=\"AudioStreamPlayer\" parent=\"Sfx\" index=\"0\"]\n\nstream = ExtResource( 25 )\nvolume_db = -16.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 0\nbus = \"Master\"\nscript = ExtResource( 26 )\n\n[node name=\"CoinsCollector\" parent=\".\" index=\"12\" instance=ExtResource( 27 )]\n\n[connection signal=\"direction_changed\" from=\".\" to=\"BodyPivot/WeaponPivot\" method=\"_on_Player_direction_changed\"]\n\n[connection signal=\"state_changed\" from=\"StateMachine\" to=\"BodyPivot/StateNameDisplayer\" method=\"_on_StateMachine_state_changed\"]\n\n[connection signal=\"last_moved\" from=\"StateMachine/Move\" to=\"StateMachine/Bump\" method=\"_on_Move_last_moved\"]\n\n[connection signal=\"finished\" from=\"StateMachine/Die\" to=\".\" method=\"_on_Die_finished\"]\n\n[connection signal=\"animation_finished\" from=\"AnimationPlayer\" to=\"StateMachine\" method=\"_on_animation_finished\"]\n\n[connection signal=\"combo_finished\" from=\"BodyPivot/WeaponPivot/Offset/Sword\" to=\"StateMachine/Attack\" method=\"_on_Sword_combo_finished\"]\n\n[connection signal=\"damage_taken\" from=\"Health\" to=\"StateMachine\" method=\"_on_Health_damage_taken\"]\n\n[connection signal=\"health_depleted\" from=\"Health\" to=\"StateMachine\" method=\"_on_Health_health_depleted\"]\n\n[connection signal=\"coins_received\" from=\"CoinsCollector\" to=\"Purse\" method=\"add_coins\"]\n\n\n[editable path=\"HitBox\"]\n"
  },
  {
    "path": "actors/player/PlayerController.gd",
    "content": "extends \"res://actors/Actor.gd\"\n\nonready var weapon = $BodyPivot/WeaponPivot/Offset/Sword\nonready var camera = $ShakingCamera\nonready var state_machine = $StateMachine\nonready var anim_player = $AnimationPlayer\nonready var body = $BodyPivot/Body\nonready var purse = $Purse\n\nfunc _ready():\n\tanim_player.play('SETUP')\n\tstate_machine.start()\n\nfunc reset(target_global_position):\n\t.reset(target_global_position)\n\tanim_player.play('SETUP')\n\tcamera.offset = Vector2()\n\tcamera.current = true\n\nfunc get_body():\n\treturn body\n\nfunc take_damage_from(damage_source):\n\tif state_machine.current_state == $StateMachine/Stagger:\n\t\treturn\n\t.take_damage_from(damage_source)\n\t$StateMachine/Stagger.knockback_direction = (damage_source.global_position - global_position).normalized()\n\tcamera.shake = true\n\nfunc move(velocity):\n\tmove_and_slide(velocity, Vector2(), 5, 2)\n\temit_signal(\"position_changed\", position)\n\tif get_slide_count() == 0:\n\t\treturn\n\treturn get_slide_collision(0)\n\nfunc fall(gap_size):\n\t\"\"\"\n\tInterrupts the state machine and goes to the Fall state\n\t\"\"\"\n\tstate_machine._change_state('fall')\n\tyield(state_machine.current_state, 'finished')\n\tmove_and_collide(-look_direction * gap_size * 1.5)\n\t$Health.take_damage(2)\n\nfunc _on_Die_finished(string):\n\tset_dead(true)\n\nfunc get_health_node():\n\treturn $Health\n\nfunc get_inventory():\n\treturn $Inventory\n\nfunc get_purse():\n\treturn purse\n"
  },
  {
    "path": "actors/player/PlayerStateMachine.gd",
    "content": "extends \"res://utils/state/StateMachine.gd\"\n\nfunc _ready():\n\tstates_map = {\n\t\t'idle': $Idle,\n\t\t'move': $Move,\n\t\t'jump': $Jump,\n\t\t'bump': $Bump,\n\t\t'fall': $Fall,\n\t\t'stagger': $Stagger,\n\t\t'attack': $Attack,\n\t\t'die': $Die,\n\t}\n\tfor state in get_children():\n\t\tstate.connect('finished', self, '_change_state')\n\nfunc _change_state(state_name):\n\tif current_state == states_map['die']:\n\t\tset_active(false)\n\t\treturn\n\t# Reset the player's jump height if transitioning away from jump to a state\n\t# that would stop jump's update method\n\tif current_state == states_map['jump'] and state_name in ['fall']:\n\t\tcurrent_state.height = 0\n\tif not active:\n\t\treturn\n\tif state_name in ['stagger', 'jump', 'attack']:\n\t\tstates_stack.push_front(states_map[state_name])\n\tif state_name == 'jump' and current_state == $Move:\n\t\t$Jump.initialize($Move.speed, $Move.velocity)\n\t._change_state(state_name)\n\nfunc _unhandled_input(event):\n\tif event.is_action_pressed('attack'):\n\t\tif current_state in [$Attack, $Stagger]:\n\t\t\treturn\n\t\t_change_state('attack')\n\t\tget_tree().set_input_as_handled()\n\t\treturn\n\tcurrent_state.handle_input(event)\n\nfunc _on_Health_damage_taken(new_health):\n\t_change_state('stagger')\n\nfunc _on_Health_health_depleted():\n\t_change_state('die')\n"
  },
  {
    "path": "actors/player/body.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/body.png-f9a1fa1c6faee90775a5169653a19c8b.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://actors/player/body.png\"\ndest_files=[ \"res://.import/body.png-f9a1fa1c6faee90775a5169653a19c8b.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "actors/player/shadow.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/shadow.png-a76d0d66e7c861fcbe21472ca29df610.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://actors/player/shadow.png\"\ndest_files=[ \"res://.import/shadow.png-a76d0d66e7c861fcbe21472ca29df610.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "actors/player/states/Die.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.set_dead(true)\n\towner.get_node(\"AnimationPlayer\").play(\"die\")\n\nfunc _on_animation_finished(anim_name):\n\temit_signal(\"finished\", \"none\")\n"
  },
  {
    "path": "actors/player/states/Fall.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('fall')\n\nfunc _on_animation_finished(anim_name):\n\temit_signal('finished', 'idle')\n"
  },
  {
    "path": "actors/player/states/combat/Attack.gd",
    "content": "\"\"\"\nThe stagger state end with the stagger animation from the AnimationPlayer\nThe animation only affects the Body Sprite\"s modulate property so \nit could stack with other animations if we had two AnimationPlayer nodes\n\"\"\"\nextends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.get_node(\"AnimationPlayer\").play(\"idle\")\n\towner.weapon.attack()\n\nfunc _on_Sword_combo_finished():\n\temit_signal(\"finished\", \"previous\")\n"
  },
  {
    "path": "actors/player/states/combat/Stagger.gd",
    "content": "\"\"\"\nThe stagger state end with the stagger animation from the AnimationPlayer\nThe animation only affects the Body Sprite\"s modulate property so \nit could stack with other animations if we had two AnimationPlayer nodes\n\"\"\"\nextends \"res://utils/state/State.gd\"\n\nvar knockback_direction = Vector2()\n\nfunc enter():\n\towner.get_node(\"AnimationPlayer\").play(\"stagger\")\n\nfunc _on_animation_finished(anim_name):\n\towner.get_body().modulate = Color('#ffffff')\n\temit_signal(\"finished\", \"previous\")\n"
  },
  {
    "path": "actors/player/states/debug/StateNameDisplayer.gd",
    "content": "extends Label\n\nfunc _on_StateMachine_state_changed(current_state):\n\ttext = current_state.name\n"
  },
  {
    "path": "actors/player/states/motion/Motion.gd",
    "content": "# Collection of important methods to handle direction and animation\nextends \"res://utils/state/State.gd\"\n\nfunc handle_input(event):\n\tif event.is_action_pressed(\"discrete_move_left\") or Input.is_action_pressed(\"joy_move_left\") \\\n\tor event.is_action_pressed(\"discrete_move_right\") or Input.is_action_pressed(\"joy_move_right\") \\\n\tor event.is_action_pressed(\"discrete_move_up\") or Input.is_action_pressed(\"joy_move_up\") \\\n\tor event.is_action_pressed(\"discrete_move_down\") or Input.is_action_pressed(\"joy_move_down\"):\n\t\tget_tree().set_input_as_handled()\n\nfunc get_input_direction():\n\tvar input_direction = Vector2()\n\t\n\tinput_direction.x = \\\n\t\tint(Input.is_action_pressed(\"discrete_move_right\") or Input.is_action_pressed(\"joy_move_right\")) - \\\n\t\tint(Input.is_action_pressed(\"discrete_move_left\") or Input.is_action_pressed(\"joy_move_left\"))\n\tinput_direction.y = \\\n\t\tint(Input.is_action_pressed(\"discrete_move_down\") or Input.is_action_pressed(\"joy_move_down\")) - \\\n\t\tint(Input.is_action_pressed(\"discrete_move_up\") or Input.is_action_pressed(\"joy_move_up\"))\n\t\n\treturn input_direction\n\nfunc update_look_direction(direction):\n\tif direction and owner.look_direction != direction:\n\t\towner.look_direction = direction\n"
  },
  {
    "path": "actors/player/states/motion/in_air/Jump.gd",
    "content": "extends \"../Motion.gd\"\n\nexport(float) var BASE_MAX_HORIZONTAL_SPEED = 400.0\n\nexport(float) var AIR_ACCELERATION = 1000.0\nexport(float) var AIR_DECCELERATION = 2000.0\nexport(float) var AIR_STEERING_POWER = 50.0\n\nexport(float) var JUMP_HEIGHT = 120.0\nexport(float) var JUMP_DURATION = 0.8\n\nexport(float) var GRAVITY = 1600.0\n\nvar enter_velocity = Vector2()\n\nvar max_horizontal_speed = 0.0\nvar horizontal_speed = 0.0\nvar horizontal_velocity = Vector2()\n\nvar vertical_speed = 0.0\nvar height = 0.0 setget set_height\n\nfunc initialize(speed, velocity):\n\thorizontal_speed = speed\n\tmax_horizontal_speed = speed if speed > 0.0 else BASE_MAX_HORIZONTAL_SPEED\n\tenter_velocity = velocity\n\nfunc enter():\n\tvar input_direction = get_input_direction()\n\tupdate_look_direction(input_direction)\n\n\thorizontal_velocity = enter_velocity if input_direction else Vector2()\n\tvertical_speed = 600.0\n\n\towner.get_node(\"AnimationPlayer\").play(\"idle\")\n\nfunc update(delta):\n\tvar input_direction = get_input_direction()\n\tupdate_look_direction(input_direction)\n\n\tmove_horizontally(delta, input_direction)\n\tanimate_jump_height(delta)\n\n\tif height <= 0.0:\n\t\temit_signal(\"finished\", \"previous\")\n\nfunc move_horizontally(delta, direction):\n\tif direction:\n\t\thorizontal_speed += AIR_ACCELERATION * delta\n\telse:\n\t\thorizontal_speed -= AIR_DECCELERATION * delta\n\thorizontal_speed = clamp(horizontal_speed, 0, max_horizontal_speed)\n\n\tvar target_velocity = horizontal_speed * direction.normalized()\n\tvar steering_velocity = (target_velocity - horizontal_velocity).normalized() * AIR_STEERING_POWER\n\thorizontal_velocity += steering_velocity\n\n\towner.move_and_slide(horizontal_velocity)\n\towner.emit_signal(\"position_changed\", owner.position)\n\nfunc set_height(new_height):\n\theight = new_height\n\towner.get_node(\"BodyPivot\").position.y = -height\n\nfunc animate_jump_height(delta):\n\tvertical_speed -= GRAVITY * delta\n\tset_height(max(0.0, height + vertical_speed * delta))\n"
  },
  {
    "path": "actors/player/states/motion/on_ground/BumpPlayer.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nexport(float) var SPEED = 240.0\nvar direction = Vector2(-1.0, 0.0)\n\nfunc _on_Move_last_moved(moved_direction):\n\tdirection = -moved_direction\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('bump')\n\nfunc update(delta):\n\towner.move_and_slide(direction * SPEED)\n\nfunc _on_animation_finished(anim_name):\n\temit_signal('finished', 'idle')\n"
  },
  {
    "path": "actors/player/states/motion/on_ground/Idle.gd",
    "content": "extends \"OnGround.gd\"\n\nfunc enter():\n\towner.get_node(\"AnimationPlayer\").play(\"idle\")\n\nfunc handle_input(event):\n\treturn .handle_input(event)\n\nfunc update(delta):\n\tvar input_direction = get_input_direction()\n\tif input_direction:\n\t\temit_signal(\"finished\", \"move\")\n"
  },
  {
    "path": "actors/player/states/motion/on_ground/Move.gd",
    "content": "extends \"OnGround.gd\"\n\nsignal last_moved(direction)\n\nexport(float) var MAX_WALK_SPEED = 450\nexport(float) var MAX_RUN_SPEED = 700\n\nconst DustRun = preload(\"res://vfx/particles/dust_puffs/DustRun.tscn\")\nconst DustWalk = preload(\"res://vfx/particles/dust_puffs/DustWalk.tscn\")\n\nfunc enter():\n\tspeed = 0.0\n\tvelocity = Vector2()\n\n\tvar input_direction = get_input_direction()\n\tupdate_look_direction(input_direction)\n\towner.get_node(\"AnimationPlayer\").play(\"walk\")\n\nfunc exit():\n\towner.get_node(\"AnimationPlayer\").play(\"idle\")\n\nfunc handle_input(event):\n\treturn .handle_input(event)\n\nfunc update(delta):\n\tvar input_direction = get_input_direction()\n\tif not input_direction:\n\t\temit_signal(\"finished\", \"idle\")\n\tupdate_look_direction(input_direction)\n\n\tspeed = MAX_RUN_SPEED if Input.is_action_pressed(\"run\") else MAX_WALK_SPEED\n\tvelocity = input_direction.normalized() * speed\n\tvar collision_info = owner.move(velocity)\n\tif not collision_info:\n\t\treturn\n\tif speed == MAX_RUN_SPEED and collision_info.collider.is_in_group(\"environment\"):\n\t\temit_signal(\"last_moved\", input_direction)\n\t\temit_signal(\"finished\", 'bump')\n\nfunc spawn_dust():\n\tvar dust\n\tmatch speed:\n\t\tMAX_RUN_SPEED:\n\t\t\tdust = DustRun.instance()\n\t\tMAX_WALK_SPEED:\n\t\t\tdust = DustWalk.instance()\n\towner.add_child(dust)\n\tdust.start()\n"
  },
  {
    "path": "actors/player/states/motion/on_ground/OnGround.gd",
    "content": "extends \"../Motion.gd\"\n\nvar speed = 0.0\nvar velocity = Vector2()\n\nfunc handle_input(event):\n\tif event.is_action_pressed(\"jump\"):\n\t\temit_signal(\"finished\", \"jump\")\n\treturn .handle_input(event)\n"
  },
  {
    "path": "actors/shadow.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/shadow.png-c2c688bd1e688f17d176ab7d3afdad57.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://actors/shadow.png\"\ndest_files=[ \"res://.import/shadow.png-c2c688bd1e688f17d176ab7d3afdad57.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "actors/weapons/bullet/Bullet.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://actors/weapons/bullet/bullet.gd\" type=\"Script\" id=1]\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 12.0\n\n[node name=\"Bullet\" type=\"KinematicBody2D\" index=\"0\"]\n\ninput_pickable = false\ncollision_layer = 2\ncollision_mask = 2\ncollision/safe_margin = 0.08\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\", \"collision\" ]\nSPEED = 1000.0\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"0\"]\n\nshape = SubResource( 1 )\n\n\n"
  },
  {
    "path": "actors/weapons/bullet/BulletSpawner.gd",
    "content": "extends Node2D\n\nvar bullet = preload(\"Bullet.tscn\")\n\nfunc _input(event):\n\tif event.is_action_pressed(\"fire\"):\n\t\tfire(owner.look_direction)\n\nfunc fire(direction):\n\tif not $CooldownTimer.is_stopped():\n\t\treturn\n\n\t$CooldownTimer.start()\n\tvar new_bullet = bullet.instance()\n\tnew_bullet.direction = direction\n\tadd_child(new_bullet)\n"
  },
  {
    "path": "actors/weapons/bullet/bullet.gd",
    "content": "extends KinematicBody2D\n\n\nvar direction = Vector2()\nexport(float) var SPEED = 1000.0\n\nfunc _ready():\n\tset_as_toplevel(true)\n\nfunc _physics_process(delta):\n\tif is_outside_view_bounds():\n\t\tqueue_free()\n\n\tvar motion = direction * SPEED * delta\n\tvar collision_info = move_and_collide(motion)\n\tif collision_info:\n\t\tqueue_free()\n\nfunc is_outside_view_bounds():\n\treturn position.x > OS.get_screen_size().x or position.x < 0.0 \\\n\t\tor position.y > OS.get_screen_size().y or position.y < 0.0\n\nfunc _draw():\n\tdraw_circle(Vector2(), $CollisionShape2D.shape.radius, Color('#ffffff'))\n"
  },
  {
    "path": "actors/weapons/sword/Sword.gd",
    "content": "extends \"res://actors/DamageSource.gd\"\n\nsignal combo_finished()\n\nenum States { IDLE, ATTACK }\nvar state = null\n\nenum AttackInputStates { WAITING, LISTENING, REGISTERED }\nvar attack_input_state = AttackInputStates.WAITING\nvar ready_for_next_attack = false\n\nvar attack_id = 0\nvar combo = [\n\t{\n\t\t'damage': 1,\n\t\t'animation': 'attack_fast',\n\t},\n\t{\n\t\t'damage': 1,\n\t\t'animation': 'attack_fast',\n\t},\n\t{\n\t\t'damage': 3,\n\t\t'animation': 'attack_medium',\n\t}]\n\nfunc _ready():\n\t$AnimationPlayer.connect('animation_finished', self, \"_on_animation_finished\")\n\t_change_state(States.IDLE)\n\nfunc _change_state(new_state):\n\tmatch state:\n\t\tStates.IDLE:\n\t\t\tvisible = true\n\tmatch new_state:\n\t\tStates.IDLE:\n\t\t\tattack_id = 0\n\t\t\tvisible = false\n\t\tStates.ATTACK:\n\t\t\tattack_input_state = AttackInputStates.WAITING\n\t\t\tready_for_next_attack = false\n\t\t\tvar attack = combo[min(attack_id, combo.size() - 1)]\n\t\t\tdamage = attack['damage']\n\t\t\t$AnimationPlayer.play(attack['animation'])\n\t\t\tattack_id += 1\n\tstate = new_state\n\nfunc _input(event):\n\tif not state == States.ATTACK:\n\t\treturn\n\tif attack_input_state != AttackInputStates.LISTENING:\n\t\treturn\n\tif event.is_action_pressed('attack'):\n\t\tattack_input_state = AttackInputStates.REGISTERED\n\nfunc _physics_process(delta):\n\tif attack_input_state == AttackInputStates.REGISTERED and ready_for_next_attack:\n\t\tattack()\n\nfunc attack():\n\t_change_state(States.ATTACK)\n\n# use with AnimationPlayer func track\nfunc set_attack_input_listening():\n\tattack_input_state = AttackInputStates.LISTENING\n\n# use with AnimationPlayer func track\nfunc set_ready_for_next_attack():\n\tready_for_next_attack = true\n\nfunc _on_animation_finished(name):\n\tif attack_input_state == AttackInputStates.REGISTERED and attack_id < combo.size():\n\t\tattack()\n\telse:\n\t\t_change_state(States.IDLE)\n\t\temit_signal(\"combo_finished\")\n"
  },
  {
    "path": "actors/weapons/sword/Sword.tscn",
    "content": "[gd_scene load_steps=8 format=2]\n\n[ext_resource path=\"res://actors/weapons/sword/Sword.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://actors/weapons/sword/sword.png\" type=\"Texture\" id=2]\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:rotation_degrees\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\".:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\".:visible\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\".:monitoring\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\".:monitorable\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ false ]\n}\ntracks/5/type = \"value\"\ntracks/5/path = NodePath(\"CollisionPolygon2D:disabled\")\ntracks/5/interp = 1\ntracks/5/loop_wrap = true\ntracks/5/imported = false\ntracks/5/enabled = true\ntracks/5/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"attack_circular\"\nlength = 0.3\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:rotation_degrees\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.15, 0.2 ),\n\"transitions\": PoolRealArray( 0.439427, 1, 1 ),\n\"update\": 0,\n\"values\": [ -100.0, 100.0, 90.0 ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\".:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.15, 0.2 ),\n\"transitions\": PoolRealArray( 1, 2.50795, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\".:visible\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"CollisionPolygon2D:disabled\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0, 0.2 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 1,\n\"values\": [ false, true ]\n}\n\n[sub_resource type=\"Animation\" id=3]\n\nlength = 0.45\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:rotation_degrees\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.15, 0.2 ),\n\"transitions\": PoolRealArray( 0.439427, 1, 1 ),\n\"update\": 0,\n\"values\": [ -80.0, 85.0, 75.0 ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\".:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.15, 0.2 ),\n\"transitions\": PoolRealArray( 1, 2.50795, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\".:visible\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/3/type = \"method\"\ntracks/3/path = NodePath(\".\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0.1, 0.25 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"values\": [ {\n\"args\": [  ],\n\"method\": \"set_attack_input_listening\"\n}, {\n\"args\": [  ],\n\"method\": \"set_ready_for_next_attack\"\n} ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\"CollisionPolygon2D:disabled\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0, 0.2 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 1,\n\"values\": [ false, true ]\n}\n\n[sub_resource type=\"Animation\" id=4]\n\nresource_name = \"attack_medium\"\nlength = 0.5\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:rotation_degrees\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0.05, 0.25, 0.35 ),\n\"transitions\": PoolRealArray( 0.439427, 1, 1 ),\n\"update\": 0,\n\"values\": [ 95.0, -95.0, -90.0 ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\".:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.1, 0.2, 0.25 ),\n\"transitions\": PoolRealArray( 1, 2.50795, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\".:visible\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"CollisionPolygon2D:disabled\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0, 0.35 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 1,\n\"values\": [ false, true ]\n}\n\n[sub_resource type=\"Animation\" id=5]\n\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:visible\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ false ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"CollisionPolygon2D:disabled\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\n\n[node name=\"Sword\" type=\"Area2D\"]\n\nrotation = 1.5708\ninput_pickable = false\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitoring = false\ncollision_layer = 16\ncollision_mask = 8\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\", \"Transform\" ]\ndamage = 2\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"0\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/attack_circular = SubResource( 2 )\nanims/attack_fast = SubResource( 3 )\nanims/attack_medium = SubResource( 4 )\nanims/idle = SubResource( 5 )\nblend_times = [  ]\n_sections_unfolded = [ \"Playback Options\" ]\n\n[node name=\"sword\" type=\"Sprite\" parent=\".\" index=\"1\"]\n\nposition = Vector2( 4, 0 )\ntexture = ExtResource( 2 )\noffset = Vector2( 67, 0 )\n_sections_unfolded = [ \"Offset\", \"Transform\" ]\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\".\" index=\"2\"]\n\nbuild_mode = 0\npolygon = PoolVector2Array( 32, -112, 128, -80, 160, 0, 128, 80, 32, 112 )\ndisabled = true\n\n\n"
  },
  {
    "path": "actors/weapons/sword/WeaponPivot.gd",
    "content": "extends Position2D\n\nfunc _on_Player_direction_changed(new_direction):\n\trotation = new_direction.angle()\n\tshow_behind_parent = new_direction == Vector2(0, -1)\n"
  },
  {
    "path": "actors/weapons/sword/sword.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/sword.png-2705643189a083599451044bb61b43fc.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://actors/weapons/sword/sword.png\"\ndest_files=[ \"res://.import/sword.png-2705643189a083599451044bb61b43fc.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "audio/AudioShuffleStepSounds.gd",
    "content": "extends AudioStreamPlayer\n\n# In Godot 3.1 you can export the Array instead\nvar samples = [\n\tpreload(\"res://audio/sfx/step_01.wav\"),\n\tpreload(\"res://audio/sfx/step_02.wav\")\n]\n\nfunc _ready():\n\trandomize()\n\nfunc play_random():\n\t# In Godot 3.1 you can use Array.shuffle() after going through the sounds\n\tstream = samples[randi() % samples.size()]\n\tplay()\n"
  },
  {
    "path": "audio/AudioStreamPlayer.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://audio/AudioShuffleStepSounds.gd\" type=\"Script\" id=1]\n\n\n[node name=\"AudioStreamPlayer\" type=\"AudioStreamPlayer\"]\n\nstream = null\nvolume_db = 0.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 0\nbus = \"Master\"\nscript = ExtResource( 1 )\n\n\n"
  },
  {
    "path": "audio/MusicPlayer.gd",
    "content": "extends AudioStreamPlayer\n\nfunc _ready():\n\tplay()\n"
  },
  {
    "path": "audio/MusicPlayer.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://audio/music/birdy_pong.ogg\" type=\"AudioStream\" id=1]\n\n[node name=\"MusicPlayer\" type=\"AudioStreamPlayer\"]\n\npause_mode = 2\nstream = ExtResource( 1 )\nvolume_db = 0.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 0\nbus = \"Music\"\n_sections_unfolded = [ \"Pause\" ]\n\n\n"
  },
  {
    "path": "audio/music/birdy_pong.ogg.import",
    "content": "[remap]\n\nimporter=\"ogg_vorbis\"\ntype=\"AudioStreamOGGVorbis\"\npath=\"res://.import/birdy_pong.ogg-25193f4693fd63a5305fa3c526808da0.oggstr\"\n\n[deps]\n\nsource_file=\"res://audio/music/birdy_pong.ogg\"\ndest_files=[ \"res://.import/birdy_pong.ogg-25193f4693fd63a5305fa3c526808da0.oggstr\" ]\n\n[params]\n\nloop=true\nloop_offset=-2.65\n"
  },
  {
    "path": "audio/sfx/menu_confirm.wav.import",
    "content": "[remap]\n\nimporter=\"wav\"\ntype=\"AudioStreamSample\"\npath=\"res://.import/menu_confirm.wav-b14347e8ceccbb161b72ec9db2392e19.sample\"\n\n[deps]\n\nsource_file=\"res://audio/sfx/menu_confirm.wav\"\ndest_files=[ \"res://.import/menu_confirm.wav-b14347e8ceccbb161b72ec9db2392e19.sample\" ]\n\n[params]\n\nforce/8_bit=false\nforce/mono=false\nforce/max_rate=false\nforce/max_rate_hz=44100\nedit/trim=true\nedit/normalize=true\nedit/loop=false\ncompress/mode=0\n"
  },
  {
    "path": "audio/sfx/menu_navigate_01.wav.import",
    "content": "[remap]\n\nimporter=\"wav\"\ntype=\"AudioStreamSample\"\npath=\"res://.import/menu_navigate_01.wav-773eee8fbe1dd9eb11962e36b57bc664.sample\"\n\n[deps]\n\nsource_file=\"res://audio/sfx/menu_navigate_01.wav\"\ndest_files=[ \"res://.import/menu_navigate_01.wav-773eee8fbe1dd9eb11962e36b57bc664.sample\" ]\n\n[params]\n\nforce/8_bit=false\nforce/mono=false\nforce/max_rate=false\nforce/max_rate_hz=44100\nedit/trim=true\nedit/normalize=true\nedit/loop=false\ncompress/mode=0\n"
  },
  {
    "path": "audio/sfx/menu_navigate_02.wav.import",
    "content": "[remap]\n\nimporter=\"wav\"\ntype=\"AudioStreamSample\"\npath=\"res://.import/menu_navigate_02.wav-671622ef2a874b5827dcda32ef1e01ba.sample\"\n\n[deps]\n\nsource_file=\"res://audio/sfx/menu_navigate_02.wav\"\ndest_files=[ \"res://.import/menu_navigate_02.wav-671622ef2a874b5827dcda32ef1e01ba.sample\" ]\n\n[params]\n\nforce/8_bit=false\nforce/mono=false\nforce/max_rate=false\nforce/max_rate_hz=44100\nedit/trim=true\nedit/normalize=true\nedit/loop=false\ncompress/mode=0\n"
  },
  {
    "path": "audio/sfx/menu_popup_open.wav.import",
    "content": "[remap]\n\nimporter=\"wav\"\ntype=\"AudioStreamSample\"\npath=\"res://.import/menu_popup_open.wav-51859fa0446f42584709772f4d8e8405.sample\"\n\n[deps]\n\nsource_file=\"res://audio/sfx/menu_popup_open.wav\"\ndest_files=[ \"res://.import/menu_popup_open.wav-51859fa0446f42584709772f4d8e8405.sample\" ]\n\n[params]\n\nforce/8_bit=false\nforce/mono=false\nforce/max_rate=false\nforce/max_rate_hz=44100\nedit/trim=true\nedit/normalize=true\nedit/loop=false\ncompress/mode=0\n"
  },
  {
    "path": "audio/sfx/step_01.wav.import",
    "content": "[remap]\n\nimporter=\"wav\"\ntype=\"AudioStreamSample\"\npath=\"res://.import/step_01.wav-daf925df75ada545cb636d177cd40f57.sample\"\n\n[deps]\n\nsource_file=\"res://audio/sfx/step_01.wav\"\ndest_files=[ \"res://.import/step_01.wav-daf925df75ada545cb636d177cd40f57.sample\" ]\n\n[params]\n\nforce/8_bit=false\nforce/mono=false\nforce/max_rate=false\nforce/max_rate_hz=44100\nedit/trim=true\nedit/normalize=true\nedit/loop=false\ncompress/mode=0\n"
  },
  {
    "path": "audio/sfx/step_02.wav.import",
    "content": "[remap]\n\nimporter=\"wav\"\ntype=\"AudioStreamSample\"\npath=\"res://.import/step_02.wav-f7737a1e06e1f3d2e9e00fd041d0652d.sample\"\n\n[deps]\n\nsource_file=\"res://audio/sfx/step_02.wav\"\ndest_files=[ \"res://.import/step_02.wav-f7737a1e06e1f3d2e9e00fd041d0652d.sample\" ]\n\n[params]\n\nforce/8_bit=false\nforce/mono=false\nforce/max_rate=false\nforce/max_rate_hz=44100\nedit/trim=true\nedit/normalize=true\nedit/loop=false\ncompress/mode=0\n"
  },
  {
    "path": "core/Game.gd",
    "content": "extends Node\n\nonready var level_loader = $LevelLoader\nonready var transition = $Overlays/TransitionColor\nonready var pause_menu = $Interface/PauseMenu\nonready var tree = get_tree()\n\nfunc _ready():\n\t$Interface.initialize($LevelLoader/Player)\n\tlevel_loader.initialize()\n\tfor door in level_loader.get_doors():\n\t\tdoor.connect(\"player_entered\", self, \"_on_Door_player_entered\")\n\nfunc change_level(scene_path):\n\ttree.paused = true\n\tyield(transition.fade_to_color(), \"completed\")\n\t\n\tlevel_loader.change_level(scene_path)\n\tfor door in level_loader.get_doors():\n\t\tdoor.connect(\"player_entered\", self, \"_on_Door_player_entered\")\n\n\tyield(transition.fade_from_color(), \"completed\")\n\ttree.paused = false\n\nfunc _on_Door_player_entered(target_map):\n\tchange_level(target_map)\n\nfunc _unhandled_input(event):\n\tif event.is_action_pressed(\"pause\"):\n\t\tpause()\n\t\ttree.set_input_as_handled()\n\tif event.is_action_pressed(\"toggle_fullscreen\"):\n\t\tOS.window_fullscreen = not OS.window_fullscreen\n\nfunc pause():\n\ttree.paused = true\n\tpause_menu.open()\n\tyield(pause_menu, \"closed\")\n\ttree.paused = false\n\nfunc _on_ShopMenu_open():\n\ttree.paused = true\n\nfunc _on_ShopMenu_closed():\n\ttree.paused = false\n"
  },
  {
    "path": "core/LevelLoader.gd",
    "content": "extends Node\n\nsignal loaded(level)\n\nexport(String, FILE, \"*.tscn\") var LEVEL_START\n\nvar map\nonready var player = $Player\n\nfunc initialize():\n\tremove_child(player)\n\tchange_level(LEVEL_START)\n\nfunc change_level(scene_path):\n\tif map:\n\t\tmap.get_ysort_node().remove_child(player)\n\t\tremove_child(map)\n\t\tmap.queue_free()\n\tmap = load(scene_path).instance()\n\tadd_child(map)\n\t\n\tmap.get_ysort_node().add_child(player)\n\tvar spawn = map.get_node(\"PlayerSpawningPoint\")\n\tplayer.reset(spawn.global_position)\n\t\n\tfor monster in get_tree().get_nodes_in_group(\"monster\"):\n\t\tmonster.initialize(player)\n\tmap.initialize()\n\temit_signal(\"loaded\", map)\n\nfunc get_doors():\n\tvar doors = []\n\tfor door in get_tree().get_nodes_in_group(\"doors\"):\n\t\tif not map.is_a_parent_of(door):\n\t\t\tcontinue\n\t\tdoors.append(door)\n\treturn doors\n"
  },
  {
    "path": "core/inventory/Inventory.gd",
    "content": "extends Node\n\nsignal content_changed(items_as_string)\nsignal item_added(item)\nsignal item_removed(item)\n\nfunc get_items():\n\treturn get_children()\n\nfunc find_item(reference):\n\tfor item in get_items():\n\t\tif item.name == reference.name:\n\t\t\treturn item\n\nfunc has(item):\n\treturn true if find_item(item) else false\n\nfunc get_count(reference):\n\tvar item = find_item(reference)\n\treturn item.amount if item else 0\n\nfunc add(reference, amount=1):\n\tvar item = find_item(reference)\n\tif not item:\n\t\titem = _instance_item_from_db(reference)\n\t\tamount -= item.amount\n\titem.amount += amount\n\temit_signal(\"content_changed\", get_content_as_string())\n\nfunc trash(reference, amount=1):\n\tvar item = find_item(reference)\n\tif not item:\n\t\treturn\n\titem.amount -= amount\n\temit_signal(\"content_changed\", get_content_as_string())\n\nfunc use(item, user):\n\titem.use(user)\n\temit_signal(\"content_changed\", get_content_as_string())\n\nfunc get_content_as_string():\n\tvar string = \"\"\n\tfor item in get_items():\n\t\tif item.amount == 0:\n\t\t\tcontinue\n\t\tstring += \"%s: %s\" % [item.name, item.amount]\n\t\tstring += \"\\n\"\n\treturn string\n\nfunc _instance_item_from_db(reference):\n\tvar item = ItemDatabase.get_item(reference)\n\tadd_child(item)\n\titem.connect(\"depleted\", self, \"_on_Item_depleted\", [item])\n\temit_signal(\"item_added\", item)\n\treturn item\n\nfunc _on_Item_depleted(item):\n\temit_signal(\"item_removed\", item)\n"
  },
  {
    "path": "core/inventory/Inventory.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://core/inventory/Inventory.gd\" type=\"Script\" id=1]\n\n\n[node name=\"Inventory\" type=\"Node\"]\n\nscript = ExtResource( 1 )\n\n\n"
  },
  {
    "path": "core/inventory/ItemDatabase.gd",
    "content": "extends Node\n\nfunc get_item(reference):\n\tfor item in get_children():\n\t\tif reference.name == item.name:\n\t\t\treturn item.duplicate()\n\nfunc get_items():\n\treturn get_children()\n"
  },
  {
    "path": "core/inventory/ItemDatabase.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://core/inventory/ItemDatabase.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/inventory/items/equipment/sword/Sword.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://core/inventory/items/usable/potions/restore_health/MinorHealthPotion.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://core/inventory/items/usable/potions/restore_health/StrongHealthPotion.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/FireballScroll.tscn\" type=\"PackedScene\" id=5]\n\n\n[node name=\"ItemDatabase\" type=\"Node\"]\n\nscript = ExtResource( 1 )\n\n[node name=\"Sword\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\n[node name=\"MinorHealthPotion\" parent=\".\" index=\"1\" instance=ExtResource( 3 )]\n\n[node name=\"StrongHealthPotion\" parent=\".\" index=\"2\" instance=ExtResource( 4 )]\n\n[node name=\"FireballScroll\" parent=\".\" index=\"3\" instance=ExtResource( 5 )]\n\n\n"
  },
  {
    "path": "core/inventory/items/Coins.gd",
    "content": "tool\nextends Area2D\n\nenum CoinAmounts {SMALL=10, MID=30, HIGH=100}\n\nexport(CoinAmounts) var amount = CoinAmounts.SMALL setget set_amount\nexport(float) var MAX_START_VERTICAL_THRUST = 400.0\nexport(float) var MAX_HORIZONTAL_SPEED = 200.0\nexport(float) var GRAVITY = 2000.0\nexport(float) var STOP_THRESHOLD_VERTICAL_SPEED = 4.0\nexport(float, 0.0, 1.0) var DAMPING_FACTOR = 0.4\n\nonready var sprite = $coins\n\nvar direction = Vector2()\nvar velocity = Vector2()\nvar speed_horizontal = 0.0\nvar speed_vertical = 0.0\nvar height = 0.0 setget set_height\n\nvar TEXTURES = {\n\tCoinAmounts.SMALL: preload(\"res://core/inventory/items/coins/coin_single.png\"),\n\tCoinAmounts.MID: preload(\"res://core/inventory/items/coins/coins_three.png\"),\n\tCoinAmounts.HIGH: preload(\"res://core/inventory/items/coins/coins_stack.png\"),\n}\n\nfunc set_amount(value):\n\tamount = value\n\tif not sprite:\n\t\treturn\n\tsprite.texture = TEXTURES[value]\n\nfunc _ready():\n\tset_process(false)\n\nfunc throw():\n\tvar rand_angle = randf() * 2 * PI\n\tdirection = Vector2(\n\t\tcos(rand_angle),\n\t\tsin(rand_angle))\n\tspeed_vertical = (randf() * 0.5 + 0.5) * MAX_START_VERTICAL_THRUST\n\tspeed_horizontal = (randf() * 0.8 + 0.2) * MAX_HORIZONTAL_SPEED\n\t$Timer.wait_time = rand_range(1.0, 2.0)\n\t$Timer.start()\n\tset_process(true)\n\nfunc _process(delta):\n\t# Move horizontally\n\tvar speed_scale = $Timer.time_left / $Timer.wait_time\n\tvelocity = speed_horizontal * direction * speed_scale\n\tposition += velocity * delta\n\n\t# Move vertically\n\tspeed_vertical -= GRAVITY * delta\n\tvar distance_vertical = speed_vertical * delta\n\tself.height += distance_vertical\n\tif height < 0.0:\n\t\tself.height = 0.0\n\t\tset_process(false)\n\nfunc set_height(value):\n\theight = value\n\tif is_processing():\n\t\t$coins.position.y = -height\n\nfunc set_random_amount():\n\tvar amounts = [CoinAmounts.SMALL, CoinAmounts.MID, CoinAmounts.HIGH]\n\tself.amount = amounts[randi() % amounts.size()]\n\n# TODO: won't work as currently velocity is re-calculated on every process tick\n#func steer_towards(target_global_position):\n#\tvelocity = Steering.follow(\n#\t\tvelocity, \n#\t\tglobal_position, \n#\t\ttarget_global_position, \n#\t\tMAX_HORIZONTAL_SPEED)\n"
  },
  {
    "path": "core/inventory/items/Coins.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://core/inventory/items/Coins.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/inventory/items/coins/coin_single.png\" type=\"Texture\" id=2]\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 25.1241\n\n[node name=\"Coins\" type=\"Area2D\" index=\"0\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitoring = false\ncollision_layer = 64\ncollision_mask = 0\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Audio Bus\", \"Collision\" ]\namount = 10\nMAX_START_VERTICAL_THRUST = 700.0\nMAX_HORIZONTAL_SPEED = 200.0\nGRAVITY = 1000.0\nSTOP_THRESHOLD_VERTICAL_SPEED = 3.0\nDAMPING_FACTOR = 0.6\n\n[node name=\"coins\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\ntexture = ExtResource( 2 )\n_sections_unfolded = [ \"Transform\" ]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"1\"]\n\nshape = SubResource( 1 )\n\n[node name=\"Timer\" type=\"Timer\" parent=\".\" index=\"2\"]\n\nprocess_mode = 1\nwait_time = 1.0\none_shot = true\nautostart = false\n\n\n"
  },
  {
    "path": "core/inventory/items/Item.gd",
    "content": "extends Node\n\nsignal amount_changed(amount)\nsignal depleted()\n\nexport(Texture) var icon\nexport(String) var display_name = \"\"\nexport(String) var description = \"\"\nexport(int) var price = 100\n\nexport(int) var amount = 1 setget set_amount\n\nexport(bool) var unique = false\nexport(bool) var usable = true\n\nfunc use(user):\n\tif (not usable) or unique:\n\t\treturn\n\tif amount == 0:\n\t\treturn\n\tself.amount -= 1\n\t_apply_effect(user)\n\nfunc set_amount(value):\n\tamount = max(0, value)\n\temit_signal(\"amount_changed\", amount)\n\tif amount == 0:\n\t\tqueue_free()\n\t\temit_signal(\"depleted\")\n\nfunc _apply_effect(user):\n\tprint(\"Item %s has no apply_effect override\" % name)\n"
  },
  {
    "path": "core/inventory/items/Item.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/inventory/items/Item.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://icon.png\" type=\"Texture\" id=2]\n\n\n[node name=\"Item\" type=\"Node\" index=\"0\"]\n\nscript = ExtResource( 1 )\nicon = ExtResource( 2 )\ndisplay_name = \"\"\ndescription = \"\"\nprice = 100\namount = 1\nunique = false\nusable = true\n\n\n"
  },
  {
    "path": "core/inventory/items/coins/coin_single.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/coin_single.png-d22b36184b3f7cd2e981df8d72015e0f.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/inventory/items/coins/coin_single.png\"\ndest_files=[ \"res://.import/coin_single.png-d22b36184b3f7cd2e981df8d72015e0f.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/inventory/items/coins/coins_stack.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/coins_stack.png-b4644d39c8e95f1e5c2242620e4272e4.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/inventory/items/coins/coins_stack.png\"\ndest_files=[ \"res://.import/coins_stack.png-b4644d39c8e95f1e5c2242620e4272e4.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/inventory/items/coins/coins_three.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/coins_three.png-29938721d7b59c8b32b7201678affe18.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/inventory/items/coins/coins_three.png\"\ndest_files=[ \"res://.import/coins_three.png-29938721d7b59c8b32b7201678affe18.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/inventory/items/equipment/Equipment.gd",
    "content": "extends '../Item.gd'\n\nexport(int) var STRENGTH = 0\nexport(int) var MAGIC = 0\nexport(int) var ARMOR = 0\nexport(int) var SPEED = 0\n"
  },
  {
    "path": "core/inventory/items/equipment/Equipment.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/inventory/items/Item.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://core/inventory/items/equipment/Equipment.gd\" type=\"Script\" id=2]\n\n\n[node name=\"Equipment\" index=\"0\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\nicon = null\nSTRENGTH = 0\nMAGIC = 0\nARMOR = 0\nSPEED = 0\n\n\n"
  },
  {
    "path": "core/inventory/items/equipment/sword/Sword.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/inventory/items/equipment/Equipment.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/theme/icons/sword.png\" type=\"Texture\" id=2]\n\n\n[node name=\"Sword\" index=\"0\" instance=ExtResource( 1 )]\n\nicon = ExtResource( 2 )\ndisplay_name = \"Sword\"\ndescription = \"An old, slightly rusted sword. Fairly dull.\"\nprice = 25\nusable = false\nSTRENGTH = 20\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/potions/BaseHealthPotion.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/inventory/items/Item.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://core/inventory/items/usable/potions/HealthPotion.gd\" type=\"Script\" id=2]\n\n\n[node name=\"HealthPotion\" index=\"0\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\nicon = null\nprice = 20\nHEAL_AMOUNT = 20\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/potions/HealthPotion.gd",
    "content": "extends \"res://core/inventory/items/Item.gd\"\n\nexport(int) var HEAL_AMOUNT = 20\n\nfunc _apply_effect(user):\n\tif not user.has_node(\"Health\"):\n\t\treturn\n\n\tuser.get_node(\"Health\").heal(HEAL_AMOUNT)\n\tuser.get_node(\"AnimationPlayer\").play(\"heal\")\n"
  },
  {
    "path": "core/inventory/items/usable/potions/restore_health/MinorHealthPotion.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/inventory/items/usable/potions/BaseHealthPotion.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/theme/icons/potion_health.png\" type=\"Texture\" id=2]\n\n\n\n[node name=\"MinorHealthPotion\" index=\"0\" instance=ExtResource( 1 )]\n\nicon = ExtResource( 2 )\ndisplay_name = \"Minor health potion\"\ndescription = \"Heals 10 life points\"\namount = 1\nHEAL_AMOUNT = 10\n"
  },
  {
    "path": "core/inventory/items/usable/potions/restore_health/StrongHealthPotion.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/inventory/items/usable/potions/BaseHealthPotion.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/theme/icons/potion_health.png\" type=\"Texture\" id=2]\n\n\n[node name=\"StrongHealthPotion\" index=\"0\" instance=ExtResource( 1 )]\n\nicon = ExtResource( 2 )\ndisplay_name = \"Strong health potion\"\ndescription = \"Heals 50 life points\"\nprice = 100\nHEAL_AMOUNT = 50\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/FireballScroll.gd",
    "content": "extends \"res://core/inventory/items/Item.gd\"\n\nexport(PackedScene) var Fireball\n\nfunc _apply_effect(user):\n\tvar fireball = Fireball.instance()\n\tuser.add_child(fireball)\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/FireballScroll.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://core/inventory/items/Item.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/FireballScroll.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/theme/icons/fire_scroll.png\" type=\"Texture\" id=3]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/Fireball.tscn\" type=\"PackedScene\" id=4]\n\n\n[node name=\"FireballScroll\" index=\"0\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\nicon = ExtResource( 3 )\ndisplay_name = \"Fire scroll\"\ndescription = \"Launches a fire ball that sweeps through the air and damages a single target.\"\nFireball = ExtResource( 4 )\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/Fireball.gd",
    "content": "extends Area2D\n\nexport(PackedScene) var Explosion\nexport(float) var SPEED = 1000.0\nvar direction = Vector2(1, 0)\n\nfunc _physics_process(delta):\n\tposition += direction * SPEED * delta\n\nfunc _on_body_entered(body):\n\texplode()\n\nfunc _on_area_entered(area):\n\texplode()\n\nfunc explode():\n\tset_active(false)\n\t\n\tvar explosion_node = Explosion.instance()\n\tadd_child(explosion_node)\n\tget_tree().create_timer(explosion_node.lifetime * 2.0).connect(\"timeout\", self, \"queue_free\")\n\nfunc set_active(value):\n\tset_physics_process(value)\n\t$CollisionShape2D.disabled = value\n\t$Fireball.active = value\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/Fireball.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/Fireball.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/explosions/Explosion.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/FireballParticles.tscn\" type=\"PackedScene\" id=3]\n\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 31.9831\n\n[node name=\"Fireball\" type=\"Area2D\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\ncollision_layer = 8\ncollision_mask = 6\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\" ]\nExplosion = ExtResource( 2 )\nSPEED = 1400.0\n\n[node name=\"Fireball\" parent=\".\" index=\"0\" instance=ExtResource( 3 )]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"1\"]\n\nshape = SubResource( 1 )\n\n[connection signal=\"area_entered\" from=\".\" to=\".\" method=\"_on_area_entered\"]\n\n[connection signal=\"body_entered\" from=\".\" to=\".\" method=\"_on_body_entered\"]\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/FireballParticles.tscn",
    "content": "[gd_scene load_steps=13 format=2]\n\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/fireball/fireball.material\" type=\"Material\" id=1]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/smoke_clouds.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/ParticlesToggle.gd\" type=\"Script\" id=3]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/sparkles_small.tres\" type=\"Gradient\" id=4]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/circle.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/sparkles.tres\" type=\"Gradient\" id=6]\n\n\n\n\n\n\n\n\n\n\n\n[sub_resource type=\"GradientTexture\" id=1]\n\nflags = 4\ngradient = ExtResource( 4 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=2]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.399763 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=3]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 2 )\n\n[sub_resource type=\"ParticlesMaterial\" id=4]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 500, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.06\nscale_random = 0.0\nscale_curve = SubResource( 3 )\ncolor_ramp = SubResource( 1 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Gravity\", \"Scale\", \"Tangential Accel\" ]\n\n[sub_resource type=\"GradientTexture\" id=5]\n\nflags = 4\ngradient = ExtResource( 6 )\nwidth = 2048\n\n[sub_resource type=\"ParticlesMaterial\" id=6]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 450, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.08\nscale_random = 0.0\nscale_curve = SubResource( 3 )\ncolor_ramp = SubResource( 5 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Gravity\", \"Scale\" ]\n\n[node name=\"FireballParticles\" type=\"Particles2D\" index=\"0\"]\n\nemitting = true\namount = 300\nlifetime = 0.4\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.0\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = ExtResource( 1 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\nscript = ExtResource( 3 )\n_sections_unfolded = [ \"Process Material\", \"Time\", \"Transform\" ]\nactive = true\n\n[node name=\"SmallSparkles\" type=\"Particles2D\" parent=\".\" index=\"0\"]\n\nrotation = -1.61079\nemitting = true\namount = 40\nlifetime = 0.6\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 4 )\ntexture = ExtResource( 5 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\" ]\n\n[node name=\"TinySparkles\" type=\"Particles2D\" parent=\".\" index=\"1\"]\n\nrotation = -1.61079\nemitting = true\namount = 60\nlifetime = 0.6\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 6 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\" ]\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/ParticlesToggle.gd",
    "content": "tool\nextends Particles2D\n\nexport(bool) var active = true setget set_active\n\nfunc set_active(value):\n\tactive = value\n\temitting = value\n\tfor child in get_children():\n\t\tif not child.get_class() == \"Particles2D\":\n\t\t\tcontinue\n\t\tchild.emitting = value\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/fire_to_black.tres",
    "content": "[gd_resource type=\"Gradient\" format=2]\n\n[resource]\n\noffsets = PoolRealArray( 0, 0.00682594, 0.0887372, 0.395904, 0.915601, 1 )\ncolors = PoolColorArray( 1, 0.773438, 0, 0, 1, 0.755566, 0, 0.381278, 1, 0.726563, 0, 1, 1, 0.304688, 0, 1, 0.160156, 0.115112, 0.115112, 1, 0, 0, 0, 0 )\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/sparkles.tres",
    "content": "[gd_resource type=\"Gradient\" format=2]\n\n[resource]\n\noffsets = PoolRealArray( 0, 0.0613811, 0.84399, 1 )\ncolors = PoolColorArray( 1, 0.846985, 0.148438, 0, 1, 0.820313, 0, 1, 1, 0.398438, 0, 1, 0.964844, 0, 0, 0 )\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/sparkles_small.tres",
    "content": "[gd_resource type=\"Gradient\" format=2]\n\n[resource]\n\noffsets = PoolRealArray( 0, 0.0971867, 0.751918, 1 )\ncolors = PoolColorArray( 0.980469, 0.878616, 0.413635, 0, 1, 0.820313, 0, 1, 1, 0.257813, 0, 1, 0, 0, 0, 0 )\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/explosions/Explosion.gd",
    "content": "extends Particles2D\n\nfunc _ready():\n\tone_shot = true\n\t$SmallSparkles.one_shot = true\n\tget_tree().create_timer(lifetime * 2.0).connect('timeout', self, 'queue_free')\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/explosions/Explosion.tscn",
    "content": "[gd_scene load_steps=16 format=2]\n\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/fire_to_black.tres\" type=\"Gradient\" id=1]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/smoke_clouds.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/explosions/Explosion.gd\" type=\"Script\" id=3]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/assets/gradient_ramps/sparkles.tres\" type=\"Gradient\" id=4]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/circle.png\" type=\"Texture\" id=5]\n\n\n\n\n\n\n\n\n\n\n[sub_resource type=\"GradientTexture\" id=1]\n\nflags = 4\ngradient = ExtResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=2]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=3]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 2 )\n\n[sub_resource type=\"Curve\" id=4]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.166992 ), 0.0, 1.80027, 0, 0, Vector2( 1, 1 ), 0.121391, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=5]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 4 )\n\n[sub_resource type=\"ParticlesMaterial\" id=6]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 180.0\nflatness = 0.0\ngravity = Vector3( 0, 1200, 0 )\ninitial_velocity = 600.0\ninitial_velocity_random = 0.6\nangular_velocity = 180.0\nangular_velocity_random = 0.6\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.4\nscale_random = 1.0\nscale_curve = SubResource( 5 )\ncolor_ramp = SubResource( 1 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nhue_variation_curve = SubResource( 3 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Spread\" ]\n\n[sub_resource type=\"GradientTexture\" id=7]\n\nflags = 4\ngradient = ExtResource( 4 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=8]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.399763 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=9]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 8 )\n\n[sub_resource type=\"ParticlesMaterial\" id=10]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 60.0\nflatness = 0.0\ngravity = Vector3( 0, 1200, 0 )\ninitial_velocity = 800.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.04\nscale_random = 0.04\nscale_curve = SubResource( 9 )\ncolor_ramp = SubResource( 7 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Emission Shape\", \"Initial Velocity\", \"Orbit Velocity\", \"Scale\" ]\n\n[node name=\"Explosion\" type=\"Particles2D\"]\n\nrotation = -1.5708\nz_index = 20\nemitting = true\namount = 80\nlifetime = 0.8\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 6 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\nscript = ExtResource( 3 )\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Time\", \"Transform\", \"Z Index\" ]\n\n[node name=\"SmallSparkles\" type=\"Particles2D\" parent=\".\" index=\"0\"]\n\nrotation = 0.00504816\nemitting = true\namount = 80\nlifetime = 0.8\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 10 )\ntexture = ExtResource( 5 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Time\" ]\n\n\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/circle.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/circle.png-3a0701102b0b6f1dc869953be140b137.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/circle.png\"\ndest_files=[ \"res://.import/circle.png-3a0701102b0b6f1dc869953be140b137.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/smoke_clouds.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/smoke_clouds.png-75a81e90df68496c912ffb2365928e06.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/sprites/smoke_clouds.png\"\ndest_files=[ \"res://.import/smoke_clouds.png-75a81e90df68496c912ffb2365928e06.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/save/SaveAndLoad.gd",
    "content": "extends Node\n\nsignal game_saved(id)\nsignal game_loaded(id)\n\nonready var GAME_VERSION = ProjectSettings.get_setting(\"application/config/version\")\nvar SAVE_DIRECTORY = \"res://save/\" if ProjectSettings.get_setting(\"application/config/debug\") else \"res://user/\"\nconst SAVE_FILE_EXT = \".game\"\n\nfunc save_game(id):\n\tvar save_data = {\n\t\t\"version\": GAME_VERSION,\n\t\t\"data\": []\n\t}\n\t# Get nodes in group works in tree order, from top to bottom\n\t# So we are guaranteed to get the parent first\n\tfor node in get_tree().get_nodes_in_group(\"save\"):\n\t\tvar node_save_data = node.get_save_data()\n\t\tassert(node_save_data[\"filename\"] != \"\")\n\t\tassert(node_save_data[\"parent\"] != \"\")\n\t\tsave_data[\"data\"].append(node_save_data)\n\n\tvar directory = Directory.new()\n\tif not directory.dir_exists(SAVE_DIRECTORY):\n\t\tdirectory.make_dir_recursive(SAVE_DIRECTORY)\n\n\tvar path = get_save_file_path(id)\n\tvar file = File.new()\n\tfile.open(path, File.WRITE)\n\tfile.store_string(to_json(save_data))\n\tfile.close()\n\temit_signal(\"game_saved\", id)\n\nfunc load_game(id):\n\tvar path = get_save_file_path(id)\n\tvar file = File.new()\n\tif not file.file_exists(path):\n\t\tprint(\"Couldn't load: file %s does not exist.\" % path)\n\t\treturn\n\tfile.open(path, File.READ)\n\tvar save_data = parse_json(file.get_as_text())\n\tfile.close()\n\n\tfor node in get_tree().get_nodes_in_group(\"save\"):\n\t\tnode.queue_free()\n\n\tfor node_data in save_data[\"data\"]:\n\t\tvar node = load(node_data[\"filename\"]).instance()\n\t\tget_node(node_data[\"parent\"]).add_child(node)\n\t\tvar properties = node_data[\"properties\"]\n\t\tfor property in properties.keys():\n\t\t\tvar value\n\t\t\tif is_vector_2(property, node):\n\t\t\t\tvalue = parse_vector_2(properties[property])\n\t\t\telse:\n\t\t\t\tvalue = properties[property]\n\t\t\tnode.set(property, value)\n\temit_signal(\"game_loaded\", id)\n\nfunc get_save_file_path(id):\n\treturn SAVE_DIRECTORY + str(id) + SAVE_FILE_EXT\n\nfunc is_vector_2(property_name, node):\n\treturn typeof(node.get(property_name)) == typeof(Vector2())\n\nfunc parse_vector_2(json_string):\n\tvar numbers_string = json_string.substr(1, len(json_string) - 2)\n\tvar comma_position = numbers_string.find(\",\")\n\tvar value_x = float(numbers_string.left(comma_position))\n\tvar value_y = float(numbers_string.right(comma_position + 1))\n\treturn Vector2(value_x, value_y)\n"
  },
  {
    "path": "core/save/SaveAndLoad.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://SaveAndLoad.gd\" type=\"Script\" id=1]\n\n[node name=\"SaveAndLoad\" type=\"Node\" index=\"0\"]\n\nscript = ExtResource( 1 )\n\n\n"
  },
  {
    "path": "core/shop/Shop.gd",
    "content": "extends Node\n\nexport(bool) var STOCK_INFINITE = false\nexport(bool) var MONEY_INFINITE = false\n\nexport(int) var MAX_TRANSACTION_COUNT = 100\nexport(float, 0.0, 1.0) var BUY_MULTIPLIER = 0.25\n\nonready var inventory = $Inventory\nonready var purse = $Purse\n\nfunc _ready():\n\tassert(inventory != null)\n\nfunc buy_from(actor, item, amount=1):\n\tamount = clamp(amount, 1, MAX_TRANSACTION_COUNT)\n\tvar transaction_value = max(get_buy_value(item) * amount, purse.coins)\n\n\tactor.get_node(\"Inventory\").trash(item, amount)\n\tactor.get_node(\"Purse\").add_coins(transaction_value)\n\t\n\tif not STOCK_INFINITE:\n\t\tinventory.add(item, amount)\n\tif not MONEY_INFINITE:\n\t\tpurse.remove_coins(transaction_value)\n\nfunc sell_to(actor, item, amount=1):\n\tamount = clamp(amount, 1, MAX_TRANSACTION_COUNT)\n\tvar transaction_value = item.price * amount\n\tactor.get_node(\"Purse\").remove_coins(item.price * amount)\n\tactor.get_node(\"Inventory\").add(item, amount)\n\n\tif not STOCK_INFINITE:\n\t\tinventory.trash(item, amount)\n\tif MONEY_INFINITE:\n\t\treturn\n\tpurse.add_coins(item.price * amount)\n\nfunc get_buy_value(item):\n\treturn round(item.price * BUY_MULTIPLIER)\n\nfunc get_purse():\n\treturn purse\n"
  },
  {
    "path": "core/shop/Shop.tscn",
    "content": "[gd_scene load_steps=7 format=2]\n\n[ext_resource path=\"res://core/shop/Shop.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/inventory/Inventory.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://core/inventory/items/equipment/sword/Sword.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/FireballScroll.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://core/inventory/items/usable/potions/restore_health/StrongHealthPotion.tscn\" type=\"PackedScene\" id=5]\n[ext_resource path=\"res://core/shop/purse/Purse.tscn\" type=\"PackedScene\" id=6]\n\n[node name=\"Shop\" type=\"Node\"]\n\neditor/display_folded = true\nscript = ExtResource( 1 )\nSTOCK_INFINITE = false\nMONEY_INFINITE = false\nMAX_TRANSACTION_COUNT = 100\nBUY_MULTIPLIER = 0.25\n\n[node name=\"Inventory\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\n[node name=\"Sword\" parent=\"Inventory\" index=\"0\" instance=ExtResource( 3 )]\n\namount = 6\n\n[node name=\"FireballScroll\" parent=\"Inventory\" index=\"1\" instance=ExtResource( 4 )]\n\n[node name=\"StrongHealthPotion\" parent=\"Inventory\" index=\"2\" instance=ExtResource( 5 )]\n\n[node name=\"Purse\" parent=\".\" index=\"1\" instance=ExtResource( 6 )]\n\nMAXIMUM = 1000000\n\n\n"
  },
  {
    "path": "core/shop/purse/Purse.gd",
    "content": "extends Node\n\nsignal coins_changed(coins)\n\nexport(int) var coins = 0\nexport(int) var MAXIMUM = 1000000\n\nfunc has_coins(amount):\n\treturn coins >= amount\n\nfunc add_coins(amount):\n\tcoins = min(coins + amount, MAXIMUM)\n\temit_signal(\"coins_changed\", coins)\n\nfunc remove_coins(amount):\n\tif not has_coins(amount):\n\t\treturn\n\tcoins = max(0, coins - amount)\n\temit_signal(\"coins_changed\", coins)\n"
  },
  {
    "path": "core/shop/purse/Purse.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://core/shop/purse/Purse.gd\" type=\"Script\" id=1]\n\n\n\n[node name=\"Purse\" type=\"Node\" index=\"0\"]\n\nscript = ExtResource( 1 )\ncoins = 0\n\n\n"
  },
  {
    "path": "core/world/Door.gd",
    "content": "extends Area2D\n\nsignal player_entered(map_path)\n\nexport(String, FILE, \"*.tscn\") var map_path\nvar PlayerController = preload(\"res://actors/player/PlayerController.gd\")\n\nexport(bool) var ACTIVE_AT_START = true\n\nfunc _ready():\n\tset_active(ACTIVE_AT_START)\n\tassert(map_path != \"\")\n\nfunc _on_body_entered(body):\n\tif not body is PlayerController:\n\t\treturn\n\temit_signal(\"player_entered\", map_path)\n\nfunc set_active(value):\n\tvisible = value\n\t$CollisionShape2D.disabled = not value\n"
  },
  {
    "path": "core/world/Door.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://core/world/Door.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/world/stairs.png\" type=\"Texture\" id=2]\n\n\n[sub_resource type=\"RectangleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nextents = Vector2( 66, 58.7724 )\n\n[node name=\"Door\" type=\"Area2D\" index=\"0\" groups=[\n\"doors\",\n]]\n\ninput_pickable = false\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\ncollision_layer = 8\ncollision_mask = 3\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Visibility\" ]\nmap_path = null\n\n[node name=\"Stairs\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 1, -24.0106 )\ntexture = ExtResource( 2 )\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"1\"]\n\nposition = Vector2( -3, -16.2276 )\nshape = SubResource( 1 )\n\n[connection signal=\"body_entered\" from=\".\" to=\".\" method=\"_on_body_entered\"]\n\n\n"
  },
  {
    "path": "core/world/Gap.gd",
    "content": "extends Area2D\n\nfunc _on_body_entered(body):\n\tif not body.has_method('fall'):\n\t\treturn\n\tbody.fall($CollisionShape2D.shape.extents)\n"
  },
  {
    "path": "core/world/Gap.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://core/world/Gap.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/world/pit.png\" type=\"Texture\" id=2]\n\n\n[sub_resource type=\"RectangleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nextents = Vector2( 50, 30 )\n\n[node name=\"Gap\" type=\"Area2D\" groups=[\n\"environment\",\n\"gap\",\n]]\n\ninput_pickable = false\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitorable = false\ncollision_layer = 2\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\" ]\n\n[node name=\"Gap\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 1, -24.0106 )\ntexture = ExtResource( 2 )\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"1\"]\n\nposition = Vector2( 1, -24.2276 )\nshape = SubResource( 1 )\n\n[connection signal=\"body_entered\" from=\".\" to=\".\" method=\"_on_body_entered\"]\n\n\n"
  },
  {
    "path": "core/world/PlayerSpawningPoint.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[sub_resource type=\"GDScript\" id=1]\n\nscript/source = \"tool\nextends Position2D\n\nexport(float) var RADIUS = 100.0\nexport(int) var EDGES = 32\nexport(Color) var LINE_COLOR = Color(\\\"#ffffff\\\")\n\nfunc _ready():\n\tset_as_toplevel(true)\n\nfunc _draw():\n\tif not Engine.editor_hint:\n\t\treturn\n\tvar points = PoolVector2Array()\n\tvar angle_step = PI * 2 / EDGES\n\tfor i in range(EDGES + 1):\n\t\tvar point = Vector2(\n\t\t\tcos(angle_step * i) * RADIUS,\n\t\t\tsin(angle_step * i) * RADIUS\n\t\t)\n\t\tpoints.append(point)\n\tdraw_polyline(points, LINE_COLOR, 4.0)\n\"\n\n[node name=\"PlayerSpawningPoint\" type=\"Position2D\" index=\"0\"]\n\nscript = SubResource( 1 )\nRADIUS = 100.0\nEDGES = 16\nLINE_COLOR = Color( 0.921875, 0.154846, 0.766072, 1 )\n\n\n"
  },
  {
    "path": "core/world/Rock.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://core/world/rock.png\" type=\"Texture\" id=1]\n\n\n[sub_resource type=\"RectangleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nextents = Vector2( 23.4314, 15.2998 )\n\n[sub_resource type=\"RectangleShape2D\" id=2]\n\ncustom_solver_bias = 0.0\nextents = Vector2( 44.0727, 26.1865 )\n\n[node name=\"Rock\" type=\"StaticBody2D\" groups=[\n\"environment\",\n]]\n\ninput_pickable = false\ncollision_layer = 2\ncollision_mask = 1\nconstant_linear_velocity = Vector2( 0, 0 )\nconstant_angular_velocity = 0.0\nfriction = 1.0\nbounce = 0.0\n_sections_unfolded = [ \"Collision\" ]\n\n[node name=\"rock\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 12.0737, 1.98891 )\ntexture = ExtResource( 1 )\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"1\"]\n\nposition = Vector2( 43.7353, 34.2526 )\nshape = SubResource( 1 )\n\n[node name=\"CollisionShape2D2\" type=\"CollisionShape2D\" parent=\".\" index=\"2\"]\n\nposition = Vector2( -1.99999, -6.48269 )\nshape = SubResource( 2 )\n\n\n"
  },
  {
    "path": "core/world/pit.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/pit.png-5ec5084f4b0d321ced939a029f9e9f2b.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/world/pit.png\"\ndest_files=[ \"res://.import/pit.png-5ec5084f4b0d321ced939a029f9e9f2b.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/world/rock.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/rock.png-d90c7ea6986b7d7efafc6116d7469b11.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/world/rock.png\"\ndest_files=[ \"res://.import/rock.png-d90c7ea6986b7d7efafc6116d7469b11.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/world/stairs.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/stairs.png-459082f78726e41c4edb789b8d018960.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/world/stairs.png\"\ndest_files=[ \"res://.import/stairs.png-459082f78726e41c4edb789b8d018960.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/world/tilesets/cave/cave.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/cave.png-7421b3ea2eb0cd51e25cb4e00e5ffa5c.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/world/tilesets/cave/cave.png\"\ndest_files=[ \"res://.import/cave.png-7421b3ea2eb0cd51e25cb4e00e5ffa5c.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/world/tilesets/cave/cave.tres",
    "content": "[gd_resource type=\"TileSet\" load_steps=14 format=2]\n\n[ext_resource path=\"res://core/world/tilesets/cave/cave.png\" type=\"Texture\" id=1]\n\n\n\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=1]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=2]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=3]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=4]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=5]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=6]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=7]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=8]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=9]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=10]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=11]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=12]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[resource]\n\n0/name = \"cave\"\n0/texture = ExtResource( 1 )\n0/tex_offset = Vector2( 0, 0 )\n0/modulate = Color( 1, 1, 1, 1 )\n0/region = Rect2( 0, 0, 640, 384 )\n0/is_autotile = true\n0/autotile/bitmask_mode = 0\n0/autotile/icon_coordinate = Vector2( 0, 0 )\n0/autotile/tile_size = Vector2( 128, 128 )\n0/autotile/spacing = 0\n0/autotile/bitmask_flags = [ Vector2( 0, 0 ), 256, Vector2( 0, 1 ), 260, Vector2( 0, 2 ), 4, Vector2( 1, 0 ), 320, Vector2( 1, 1 ), 325, Vector2( 1, 2 ), 5, Vector2( 2, 0 ), 64, Vector2( 2, 1 ), 65, Vector2( 2, 2 ), 1, Vector2( 3, 0 ), 69, Vector2( 3, 1 ), 321, Vector2( 4, 0 ), 261, Vector2( 4, 1 ), 324 ]\n0/autotile/occluder_map = [  ]\n0/autotile/navpoly_map = [  ]\n0/autotile/priority_map = [  ]\n0/occluder_offset = Vector2( 320, 192 )\n0/navigation_offset = Vector2( 320, 192 )\n0/shapes = [ {\n\"autotile_coord\": Vector2( 0, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 1 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 1, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 2 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 2, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 3 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 2, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 4 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 2, 2 ),\n\"one_way\": false,\n\"shape\": SubResource( 5 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 1, 2 ),\n\"one_way\": false,\n\"shape\": SubResource( 6 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 0, 2 ),\n\"one_way\": false,\n\"shape\": SubResource( 7 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 0, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 8 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 3, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 9 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 4, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 10 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 3, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 11 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 4, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 12 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n} ]\n_sections_unfolded = [ \"0\" ]\n\n"
  },
  {
    "path": "core/world/tilesets/cave/cave_tileset_src.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://core/world/tilesets/cave/cave.png\" type=\"Texture\" id=1]\n\n\n\n\n[node name=\"Node2D\" type=\"Node2D\" index=\"0\"]\n\n[node name=\"cave\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 322.14, 192 )\ntexture = ExtResource( 1 )\nregion_enabled = true\nregion_rect = Rect2( 0, 0, 640, 384 )\n_sections_unfolded = [ \"Region\" ]\n\n\n"
  },
  {
    "path": "core/world/tilesets/outdoor/outdoor.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/outdoor.png-1eb405fc65af37f625e19d928044f95c.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/world/tilesets/outdoor/outdoor.png\"\ndest_files=[ \"res://.import/outdoor.png-1eb405fc65af37f625e19d928044f95c.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "core/world/tilesets/outdoor/outdoor.tres",
    "content": "[gd_resource type=\"TileSet\" load_steps=18 format=2]\n\n[ext_resource path=\"res://core/world/tilesets/outdoor/outdoor.png\" type=\"Texture\" id=1]\n[ext_resource path=\"res://core/world/tilesets/outdoor/pit.png\" type=\"Texture\" id=2]\n\n\n\n\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=1]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( -48, 16, -48, -48, 24, -48, 24, 8, 8, 16 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=2]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 24, 8, 48, 8, 48, 40, 8, 40, 8, 16 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=3]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 80, 128, 80, 96, 96, 80, 128, 80, 128, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=4]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 80, 32, 80, 48, 96, 48, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=5]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 48, 0, 48, 128, 0, 128, 0, 0 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=6]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 48, 0, 48, 32, 32, 48, 0, 48 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=7]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 128, 0, 128, 48, 0, 48, 0, 0 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=8]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 128, 48, 96, 48, 80, 32, 80, 0, 128, 0 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=9]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 80, 128, 80, 0, 128, 0, 128, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=10]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=11]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 80, 128, 80, 128, 128, 0, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=12]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 128, 0, 128, 128, 0, 128, 0, 80, 80, 80, 80, 0 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=13]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 128, 0, 112, 0, 0, 128, 0, 128, 48, 48, 48, 48, 128 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=14]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 0, 0, 128, 0, 128, 128, 80, 128, 80, 48, 0, 48 )\n\n[sub_resource type=\"ConvexPolygonShape2D\" id=15]\n\ncustom_solver_bias = 0.0\npoints = PoolVector2Array( 48, 0, 48, 80, 128, 80, 128, 128, 0, 128, 0, 0 )\n\n[resource]\n\n0/name = \"grass\"\n0/texture = ExtResource( 1 )\n0/tex_offset = Vector2( 0, 0 )\n0/modulate = Color( 1, 1, 1, 1 )\n0/region = Rect2( 0, 0, 384, 256 )\n0/is_autotile = true\n0/autotile/bitmask_mode = 0\n0/autotile/icon_coordinate = Vector2( 0, 1 )\n0/autotile/tile_size = Vector2( 128, 128 )\n0/autotile/spacing = 0\n0/autotile/bitmask_flags = [ Vector2( 0, 0 ), 325, Vector2( 0, 1 ), 325, Vector2( 1, 0 ), 325, Vector2( 2, 0 ), 325 ]\n0/autotile/occluder_map = [  ]\n0/autotile/navpoly_map = [  ]\n0/autotile/priority_map = [ Vector3( 0, 1, 35 ) ]\n0/occluder_offset = Vector2( 192, 128 )\n0/navigation_offset = Vector2( 192, 128 )\n0/shapes = [  ]\n1/name = \"dirt\"\n1/texture = ExtResource( 1 )\n1/tex_offset = Vector2( 0, 0 )\n1/modulate = Color( 1, 1, 1, 1 )\n1/region = Rect2( 384, 0, 640, 512 )\n1/is_autotile = true\n1/autotile/bitmask_mode = 0\n1/autotile/icon_coordinate = Vector2( 1, 1 )\n1/autotile/tile_size = Vector2( 128, 128 )\n1/autotile/spacing = 0\n1/autotile/bitmask_flags = [ Vector2( 0, 0 ), 256, Vector2( 0, 1 ), 260, Vector2( 0, 2 ), 4, Vector2( 0, 3 ), 325, Vector2( 1, 0 ), 320, Vector2( 1, 1 ), 325, Vector2( 1, 2 ), 5, Vector2( 1, 3 ), 325, Vector2( 2, 0 ), 64, Vector2( 2, 1 ), 65, Vector2( 2, 2 ), 1, Vector2( 2, 3 ), 325, Vector2( 3, 0 ), 69, Vector2( 3, 1 ), 321, Vector2( 3, 2 ), 257, Vector2( 3, 3 ), 68, Vector2( 4, 0 ), 261, Vector2( 4, 1 ), 324, Vector2( 4, 2 ), 68, Vector2( 4, 3 ), 257 ]\n1/autotile/occluder_map = [  ]\n1/autotile/navpoly_map = [  ]\n1/autotile/priority_map = [ Vector3( 0, 3, 2 ), Vector3( 1, 1, 48 ) ]\n1/occluder_offset = Vector2( 320, 256 )\n1/navigation_offset = Vector2( 320, 256 )\n1/shapes = [  ]\n2/name = \"rock\"\n2/texture = ExtResource( 1 )\n2/tex_offset = Vector2( 0, 0 )\n2/modulate = Color( 1, 1, 1, 1 )\n2/region = Rect2( 256, 384, 128, 128 )\n2/is_autotile = false\n2/occluder_offset = Vector2( 64, 64 )\n2/navigation_offset = Vector2( 64, 64 )\n2/shapes = [ {\n\"autotile_coord\": Vector2( 0, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 1 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 64, 64 )\n}, {\n\"autotile_coord\": Vector2( 0, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 2 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 64, 64 )\n} ]\n3/name = \"outdoor\"\n3/texture = ExtResource( 1 )\n3/tex_offset = Vector2( 0, 0 )\n3/modulate = Color( 1, 1, 1, 1 )\n3/region = Rect2( 0, 0, 384, 256 )\n3/is_autotile = false\n3/occluder_offset = Vector2( 192, 128 )\n3/navigation_offset = Vector2( 192, 128 )\n3/shapes = [  ]\n4/name = \"bush\"\n4/texture = ExtResource( 1 )\n4/tex_offset = Vector2( 0, 0 )\n4/modulate = Color( 1, 1, 1, 1 )\n4/region = Rect2( 0, 512, 1024, 384 )\n4/is_autotile = true\n4/autotile/bitmask_mode = 1\n4/autotile/icon_coordinate = Vector2( 1, 1 )\n4/autotile/tile_size = Vector2( 128, 128 )\n4/autotile/spacing = 0\n4/autotile/bitmask_flags = [ Vector2( 0, 0 ), 176, Vector2( 0, 1 ), 146, Vector2( 0, 2 ), 50, Vector2( 1, 0 ), 56, Vector2( 1, 1 ), 16, Vector2( 1, 2 ), 56, Vector2( 2, 0 ), 152, Vector2( 2, 1 ), 146, Vector2( 2, 2 ), 26, Vector2( 3, 0 ), 144, Vector2( 3, 1 ), 18, Vector2( 3, 2 ), 48, Vector2( 4, 0 ), 178, Vector2( 4, 1 ), 184, Vector2( 4, 2 ), 24, Vector2( 5, 0 ), 154, Vector2( 5, 1 ), 58, Vector2( 5, 2 ), 186, Vector2( 6, 0 ), 176, Vector2( 6, 1 ), 50, Vector2( 7, 0 ), 152, Vector2( 7, 1 ), 26 ]\n4/autotile/occluder_map = [  ]\n4/autotile/navpoly_map = [  ]\n4/autotile/priority_map = [  ]\n4/occluder_offset = Vector2( 512, 192 )\n4/navigation_offset = Vector2( 512, 192 )\n4/shapes = [  ]\n5/name = \"pit\"\n5/texture = ExtResource( 2 )\n5/tex_offset = Vector2( 0, 0 )\n5/modulate = Color( 1, 1, 1, 1 )\n5/region = Rect2( 0, 0, 640, 384 )\n5/is_autotile = true\n5/autotile/bitmask_mode = 0\n5/autotile/icon_coordinate = Vector2( 1, 1 )\n5/autotile/tile_size = Vector2( 128, 128 )\n5/autotile/spacing = 0\n5/autotile/bitmask_flags = [ Vector2( 0, 0 ), 256, Vector2( 0, 1 ), 260, Vector2( 0, 2 ), 4, Vector2( 1, 0 ), 320, Vector2( 1, 1 ), 325, Vector2( 1, 2 ), 5, Vector2( 2, 0 ), 64, Vector2( 2, 1 ), 65, Vector2( 2, 2 ), 1, Vector2( 3, 0 ), 69, Vector2( 3, 1 ), 321, Vector2( 4, 0 ), 261, Vector2( 4, 1 ), 324 ]\n5/autotile/occluder_map = [  ]\n5/autotile/navpoly_map = [  ]\n5/autotile/priority_map = [  ]\n5/occluder_offset = Vector2( 320, 192 )\n5/navigation_offset = Vector2( 320, 192 )\n5/shapes = [ {\n\"autotile_coord\": Vector2( 0, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 3 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 2, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 4 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 2, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 5 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 2, 2 ),\n\"one_way\": false,\n\"shape\": SubResource( 6 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 1, 2 ),\n\"one_way\": false,\n\"shape\": SubResource( 7 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 0, 2 ),\n\"one_way\": false,\n\"shape\": SubResource( 8 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 0, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 9 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 1, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 10 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 1, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 11 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 4, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 12 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 3, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 13 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 4, 0 ),\n\"one_way\": false,\n\"shape\": SubResource( 14 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n}, {\n\"autotile_coord\": Vector2( 3, 1 ),\n\"one_way\": false,\n\"shape\": SubResource( 15 ),\n\"shape_transform\": Transform2D( 1, 0, 0, 1, 0, 0 )\n} ]\n_sections_unfolded = [ \"5\", \"Resource\" ]\n\n"
  },
  {
    "path": "core/world/tilesets/outdoor/outdoor.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://core/world/tilesets/outdoor/outdoor.png\" type=\"Texture\" id=1]\n[ext_resource path=\"res://core/world/tilesets/outdoor/pit.png\" type=\"Texture\" id=2]\n\n\n\n\n\n\n\n\n\n\n\n[node name=\"Outdoor\" type=\"Node\"]\n\n[node name=\"outdoor\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 192, 160 )\ntexture = ExtResource( 1 )\nregion_enabled = true\nregion_rect = Rect2( 0, 0, 384, 256 )\n_sections_unfolded = [ \"Region\" ]\n\n[node name=\"dirt\" type=\"Sprite\" parent=\".\" index=\"1\"]\n\nposition = Vector2( 320, 576 )\ntexture = ExtResource( 1 )\nregion_enabled = true\nregion_rect = Rect2( 384, 0, 640, 512 )\n_sections_unfolded = [ \"Region\" ]\n\n[node name=\"bush\" type=\"Sprite\" parent=\".\" index=\"2\"]\n\nposition = Vector2( 1200, 592 )\ntexture = ExtResource( 1 )\nregion_enabled = true\nregion_rect = Rect2( 0, 512, 1024, 384 )\n_sections_unfolded = [ \"Region\" ]\n\n[node name=\"rock\" type=\"Sprite\" parent=\".\" index=\"3\"]\n\nposition = Vector2( 832, 192 )\ntexture = ExtResource( 1 )\nregion_enabled = true\nregion_rect = Rect2( 256, 384, 128, 128 )\n_sections_unfolded = [ \"Region\" ]\n\n[node name=\"StaticBody2D\" type=\"StaticBody2D\" parent=\"rock\" index=\"0\"]\n\ninput_pickable = false\ncollision_layer = 1\ncollision_mask = 1\nconstant_linear_velocity = Vector2( 0, 0 )\nconstant_angular_velocity = 0.0\nfriction = 1.0\nbounce = 0.0\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\"rock/StaticBody2D\" index=\"0\"]\n\nbuild_mode = 0\npolygon = PoolVector2Array( 24, -48, 24, 8, 48, 8, 48, 40, 8, 40, 8, 16, -48, 16, -48, -48 )\n\n[node name=\"pit\" type=\"Sprite\" parent=\".\" index=\"4\"]\n\nposition = Vector2( 1056, 1024 )\ntexture = ExtResource( 2 )\n\n\n"
  },
  {
    "path": "core/world/tilesets/outdoor/pit.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/pit.png-81c563e22c5b735099e3aed47ef25a25.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://core/world/tilesets/outdoor/pit.png\"\ndest_files=[ \"res://.import/pit.png-81c563e22c5b735099e3aed47ef25a25.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "default_bus_layout.tres",
    "content": "[gd_resource type=\"AudioBusLayout\" format=2]\n\n[resource]\n\nbus/0/name = \"Master\"\nbus/0/solo = false\nbus/0/mute = false\nbus/0/bypass_fx = false\nbus/0/volume_db = 0.0\nbus/0/send = \"\"\nbus/1/name = \"Music\"\nbus/1/solo = false\nbus/1/mute = false\nbus/1/bypass_fx = false\nbus/1/volume_db = -4.8\nbus/1/send = \"Master\"\nbus/2/name = \"Sounds\"\nbus/2/solo = false\nbus/2/mute = false\nbus/2/bypass_fx = false\nbus/2/volume_db = 0.0\nbus/2/send = \"LowPass\"\nbus/3/name = \"Interface\"\nbus/3/solo = false\nbus/3/mute = false\nbus/3/bypass_fx = false\nbus/3/volume_db = 0.0\nbus/3/send = \"Master\"\n\n"
  },
  {
    "path": "default_env.tres",
    "content": "[gd_resource type=\"Environment\" load_steps=2 format=2]\n\n[sub_resource type=\"ProceduralSky\" id=1]\nsky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )\nsky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )\nsky_curve = 0.25\nground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )\nground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )\nground_curve = 0.01\nsun_energy = 16.0\n\n[resource]\nbackground_mode = 2\nbackground_sky = SubResource( 1 )\n\n"
  },
  {
    "path": "icon.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://icon.png\"\ndest_files=[ \"res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/Interface.gd",
    "content": "extends CanvasLayer\n\nonready var shop_menu = $ShopMenu\n\nfunc _ready():\n\tshop_menu.connect('closed', self, 'remove_child', [shop_menu])\n\tremove_child(shop_menu)\n\nfunc initialize(player):\n\t$PlayerGUI.initialize(player.get_health_node(), player.get_purse())\n\t$PauseMenu.initialize({'actor': player})\n\nfunc _on_Level_loaded(level):\n\tvar tree = get_tree()\n\tfor seller in tree.get_nodes_in_group('seller'):\n\t\tseller.connect('shop_open_requested', self, 'shop_open')\n\n\tvar monsters = tree.get_nodes_in_group('monster')\n\tvar spawners = tree.get_nodes_in_group('monster_spawner')\n\t$LifebarsBuilder.initialize(monsters, spawners)\n\nfunc shop_open(seller_shop, buyer):\n\tadd_child(shop_menu)\n\tshop_menu.open({'shop': seller_shop, 'buyer': buyer})\n"
  },
  {
    "path": "interface/TopLevelUi.gd",
    "content": "tool\nextends Control\n\nfunc _ready():\n\tset_as_toplevel(true)\n"
  },
  {
    "path": "interface/fonts/montserrat_black_48.tres",
    "content": "[gd_resource type=\"DynamicFont\" load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/fonts/montserrat_black.ttf\" type=\"DynamicFontData\" id=1]\n\n[resource]\n\nsize = 48\nuse_mipmaps = true\nuse_filter = false\nfont_data = ExtResource( 1 )\n_sections_unfolded = [ \"Font\", \"Settings\" ]\n\n"
  },
  {
    "path": "interface/fonts/source_code_pro_explanations.tres",
    "content": "[gd_resource type=\"DynamicFont\" load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/fonts/SourceCodePro-Bold.ttf\" type=\"DynamicFontData\" id=1]\n\n[resource]\n\nsize = 18\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 1 )\n_sections_unfolded = [ \"Font\", \"Settings\" ]\n\n"
  },
  {
    "path": "interface/fonts/source_code_pro_explanations_bold.tres",
    "content": "[gd_resource type=\"DynamicFont\" load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/fonts/SourceCodePro-Black.ttf\" type=\"DynamicFontData\" id=1]\n\n\n[resource]\n\nsize = 24\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 1 )\n_sections_unfolded = [ \"Font\", \"Settings\" ]\n\n"
  },
  {
    "path": "interface/gui/boss/BossLifebar.gd",
    "content": "tool\nextends Control\n\nexport(String) var boss_name = \"Boss Name\"\n\nonready var bar = $Bar\nonready var anim_player = $AnimationPlayer\n\nfunc _ready():\n\tset_as_toplevel(true)\n\t$Label.text = boss_name\n\thide()\n\nfunc initialize(health_node):\n\tbar.max_value = health_node.max_health\n\tbar.value = health_node.health\n\tprint(bar.value)\n\thealth_node.connect('health_changed', self, '_on_Health_health_changed')\n\nfunc appear():\n\tshow()\n\tanim_player.play(\"appear\")\n\nfunc disappear():\n\tanim_player.play(\"disappear\")\n\tyield(anim_player, \"animation_finished\")\n\thide()\n\nfunc _on_Health_health_changed(value):\n\tbar.value = value\n"
  },
  {
    "path": "interface/gui/boss/BossLifebar.tscn",
    "content": "[gd_scene load_steps=7 format=2]\n\n[ext_resource path=\"res://interface/gui/boss/BossLifebar.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=2]\n[ext_resource path=\"res://interface/gui/boss/boss_bar_bg.png\" type=\"Texture\" id=3]\n[ext_resource path=\"res://interface/gui/boss/boss_bar_fill.png\" type=\"Texture\" id=4]\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"appear\"\nlength = 1.0\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Label:self_modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.5 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Bar:self_modulate\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0.2, 0.7 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Label:rect_position\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0, 0.5 ),\n\"transitions\": PoolRealArray( 0.356926, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( -84, 0 ), Vector2( 0, 0 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Bar:rect_position\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0.2, 0.7 ),\n\"transitions\": PoolRealArray( 0.407274, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 104, 27 ), Vector2( 156, 27 ) ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"disappear\"\nlength = 0.8\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Label:self_modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.7 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Bar:self_modulate\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0.1, 0.8 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\n\n[node name=\"BossLifebar\" type=\"VBoxContainer\"]\n\nvisible = false\nanchor_left = 0.5\nanchor_top = 1.0\nanchor_right = 0.5\nanchor_bottom = 1.0\nmargin_left = -780.0\nmargin_top = -133.0\nmargin_right = 780.0\nmargin_bottom = -40.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 0\nscript = ExtResource( 1 )\nboss_name = \"\"\n\n[node name=\"Label\" type=\"Label\" parent=\".\" index=\"0\"]\n\nself_modulate = Color( 1, 1, 1, 0 )\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 1560.0\nmargin_bottom = 23.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntheme = ExtResource( 2 )\nalign = 1\nvalign = 2\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Theme\", \"Visibility\", \"custom_fonts\" ]\n\n[node name=\"Bar\" type=\"TextureProgress\" parent=\".\" index=\"1\"]\n\nmodulate = Color( 1, 0.0195313, 0.272308, 1 )\nself_modulate = Color( 1, 1, 1, 5.96046e-008 )\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 156.0\nmargin_top = 27.0\nmargin_right = 1404.0\nmargin_bottom = 93.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 4\nsize_flags_vertical = 4\nmin_value = 0.0\nmax_value = 100.0\nstep = 1.0\npage = 0.0\nvalue = 100.0\nexp_edit = false\nrounded = false\ntexture_under = ExtResource( 3 )\ntexture_over = null\ntexture_progress = ExtResource( 4 )\nradial_fill_degrees = 360.0\nradial_center_offset = Vector2( 0, 0 )\nnine_patch_stretch = false\n_sections_unfolded = [ \"Size Flags\", \"Textures\", \"Visibility\" ]\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"2\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/appear = SubResource( 1 )\nanims/disappear = SubResource( 2 )\nblend_times = [  ]\n\n\n"
  },
  {
    "path": "interface/gui/boss/boss_bar_bg.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/boss_bar_bg.png-aed3843f4ed3efb0dbc21b2322fd9e56.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/gui/boss/boss_bar_bg.png\"\ndest_files=[ \"res://.import/boss_bar_bg.png-aed3843f4ed3efb0dbc21b2322fd9e56.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/gui/boss/boss_bar_fill.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/boss_bar_fill.png-9d50dc46e3fabfa93c1e17061ffa511b.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/gui/boss/boss_bar_fill.png\"\ndest_files=[ \"res://.import/boss_bar_fill.png-9d50dc46e3fabfa93c1e17061ffa511b.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/gui/lifebar/HookableLifeBar.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://interface/gui/lifebar/Lifebar.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/gui/lifebar/background.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://interface/gui/lifebar/fill.png\" type=\"Texture\" id=3]\n\n[node name=\"HookableLifeBar\" type=\"Node2D\" groups=[\n\"bars\",\n]]\n\nscript = ExtResource( 1 )\n\n[node name=\"Background\" type=\"TextureRect\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = -95.0\nmargin_top = -11.0\nmargin_right = 97.0\nmargin_bottom = 11.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 2 )\nstretch_mode = 0\n_sections_unfolded = [ \"Rect\", \"Textures\" ]\n\n[node name=\"TextureProgress\" type=\"TextureProgress\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = -95.0\nmargin_top = -11.0\nmargin_right = 97.0\nmargin_bottom = 11.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nmin_value = 0.0\nmax_value = 100.0\nstep = 1.0\npage = 0.0\nvalue = 60.0\nexp_edit = false\nrounded = false\ntexture_under = null\ntexture_over = null\ntexture_progress = ExtResource( 3 )\nradial_fill_degrees = 360.0\nradial_center_offset = Vector2( 0, 0 )\nnine_patch_stretch = false\n_sections_unfolded = [ \"Rect\" ]\n\n\n"
  },
  {
    "path": "interface/gui/lifebar/InterfaceAnchor.tscn",
    "content": "[gd_scene format=2]\n\n[node name=\"InterfaceAnchor\" type=\"RemoteTransform2D\"]\n\nposition = Vector2( 0, -98.2191 )\nremote_path = NodePath(\"\")\nuse_global_coordinates = true\nupdate_position = true\nupdate_rotation = false\nupdate_scale = false\n\n\n"
  },
  {
    "path": "interface/gui/lifebar/Lifebar.gd",
    "content": "extends Node2D\n\nvar max_health = 0 setget set_max_health\nvar health = 0 setget set_health\n\nfunc set_max_health(value):\n\tmax_health = value\n\t$TextureProgress.max_value = value\n\nfunc set_health(value):\n\thealth = value\n\t$TextureProgress.value = value\n\nfunc initialize(actor):\n\tvar hook = actor.get_node(\"InterfaceAnchor\")\n\tglobal_position = hook.global_position\n\thook.remote_path = hook.get_path_to(self)\n\t\n\tvar health_node = actor.get_node(\"Stats\")\n\thealth_node.connect(\"health_changed\", self, \"_on_Actor_health_changed\")\n\thealth_node.connect(\"health_depleted\", self, \"_on_Actor_health_depleted\")\n\t\n\tself.health = health_node.health\n\tself.max_health = health_node.max_health\n\nfunc _on_Actor_health_changed(new_health):\n\tself.health = new_health\n\t\nfunc _on_Actor_health_depleted():\n\tqueue_free()\n"
  },
  {
    "path": "interface/gui/lifebar/LifebarsBuilder.gd",
    "content": "extends Node\n\nconst Lifebar = preload(\"res://interface/gui/lifebar/HookableLifeBar.tscn\")\n\nfunc initialize(monsters, monster_spawners):\n\tfor monster in monsters:\n\t\tcreate_lifebar(monster)\n\tfor spawner in monster_spawners:\n\t\tmonster_spawners.connect('spawned_monster', self, '_on_MonsterSpawner_spawned_monster')\n\nfunc _on_MonsterSpawner_spawned_monster(monster_node):\n\tcreate_lifebar(monster_node)\n\nfunc create_lifebar(actor):\n\tif not actor.has_node('InterfaceAnchor'):\n\t\treturn\n\tvar lifebar = Lifebar.instance()\n\tactor.add_child(lifebar)\n\tlifebar.initialize(actor)\n"
  },
  {
    "path": "interface/gui/lifebar/LifebarsBuilder.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/gui/lifebar/LifebarsBuilder.gd\" type=\"Script\" id=1]\n\n[node name=\"LifebarsBuilder\" type=\"Node\"]\n\nscript = ExtResource( 1 )\n\n\n"
  },
  {
    "path": "interface/gui/lifebar/background.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/background.png-62efda1a07fd52ccf13fb5c00abc7e8c.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/gui/lifebar/background.png\"\ndest_files=[ \"res://.import/background.png-62efda1a07fd52ccf13fb5c00abc7e8c.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/gui/lifebar/fill.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/fill.png-b3e6044072b4f216e075877da6e81969.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/gui/lifebar/fill.png\"\ndest_files=[ \"res://.import/fill.png-b3e6044072b4f216e075877da6e81969.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/gui/player/PlayerGUI.gd",
    "content": "extends Control\n\nfunc initialize(health_node, purse):\n\t$LifeBar.initialize(health_node)\n\t$CoinsCounter.initialize(purse)\n\thealth_node.connect('health_depleted', self, '_on_Player_Health_health_depleted')\n\nfunc _on_Player_Health_health_depleted():\n\t$AnimationPlayer.play(\"fade_out\")\n"
  },
  {
    "path": "interface/gui/player/PlayerGUI.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=1]\n[ext_resource path=\"res://interface/gui/player/PlayerGUI.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/gui/player/life_bar/LifeBar.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://core/inventory/items/coins/coin_single.png\" type=\"Texture\" id=4]\n[ext_resource path=\"res://interface/fonts/source_code_pro_explanations_bold.tres\" type=\"DynamicFont\" id=5]\n\n[sub_resource type=\"GDScript\" id=3]\n\nscript/source = \"extends Panel\n\n\nfunc initialize(purse):\n\tpurse.connect('coins_changed', self, '_on_Purse_coins_changed')\n\tupdate_count(purse.coins)\n\nfunc _on_Purse_coins_changed(coins):\n\tupdate_count(coins)\n\nfunc update_count(value):\n\t$Label.text = str(value)\n\"\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.5\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nlength = 0.8\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.8 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\ntracks/1/type = \"method\"\ntracks/1/path = NodePath(\".\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0.8 ),\n\"transitions\": PoolRealArray( 1 ),\n\"values\": [ {\n\"args\": [  ],\n\"method\": \"queue_free\"\n} ]\n}\n\n[node name=\"PlayerGUI\" type=\"HBoxContainer\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 0.0\nmargin_left = 20.0\nmargin_top = 20.0\nmargin_right = -30.0\nmargin_bottom = 73.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntheme = ExtResource( 1 )\ncustom_constants/separation = 16\nalignment = 0\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Anchor\", \"Theme\", \"custom_constants\" ]\n\n[node name=\"LifeBar\" parent=\".\" index=\"0\" instance=ExtResource( 3 )]\n\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 396.0\nmargin_bottom = 53.0\n_sections_unfolded = [ \"Rect\", \"Size Flags\" ]\n\n[node name=\"CoinsCounter\" type=\"Panel\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 412.0\nmargin_right = 532.0\nmargin_bottom = 53.0\nrect_min_size = Vector2( 120, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = SubResource( 3 )\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"Coin\" type=\"TextureRect\" parent=\"CoinsCounter\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.5\nanchor_right = 0.0\nanchor_bottom = 0.5\nmargin_left = 15.0\nmargin_top = -16.5\nmargin_right = 45.0\nmargin_bottom = 16.5\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 4 )\nexpand = true\nstretch_mode = 0\n\n[node name=\"Label\" type=\"Label\" parent=\"CoinsCounter\" index=\"1\"]\n\nanchor_left = 1.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = -72.0\nmargin_right = -20.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 5 )\ntext = \"120\"\nalign = 2\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"2\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/fade_out = SubResource( 2 )\nblend_times = [  ]\n\n\n"
  },
  {
    "path": "interface/gui/player/life_bar/LifeBar.tscn",
    "content": "[gd_scene load_steps=8 format=2]\n\n[ext_resource path=\"res://interface/gui/player/life_bar/bg.png\" type=\"Texture\" id=1]\n[ext_resource path=\"res://interface/gui/player/life_bar/Lifebar.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/gui/player/life_bar/fill.png\" type=\"Texture\" id=3]\n[ext_resource path=\"res://interface/gui/player/life_bar/TextureProgress.gd\" type=\"Script\" id=4]\n\n\n\n\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"heal\"\nlength = 0.4\nloop = false\nstep = 0.1\n\n[sub_resource type=\"Animation\" id=3]\n\nlength = 0.4\nloop = false\nstep = 0.1\n\n[node name=\"LifeBar\" type=\"TextureRect\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_right = -884.0\nmargin_bottom = -667.0\nrect_pivot_offset = Vector2( 196.476, 27.8519 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 1 )\nstretch_mode = 0\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"TextureProgress\" type=\"TextureProgress\" parent=\".\" index=\"0\"]\n\nmodulate = Color( 0.366329, 0.902344, 0.0951691, 1 )\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nmin_value = 0.0\nmax_value = 34.0\nstep = 1.0\npage = 0.0\nvalue = 16.0\nexp_edit = false\nrounded = false\ntexture_under = null\ntexture_over = null\ntexture_progress = ExtResource( 3 )\nradial_fill_degrees = 360.0\nradial_center_offset = Vector2( 0, 0 )\nnine_patch_stretch = false\nscript = ExtResource( 4 )\n_sections_unfolded = [ \"Textures\", \"Visibility\" ]\nCOLOR_FULL = Color( 0.708904, 0.9375, 0.0769043, 1 )\nCOLOR_NORMAL = Color( 0.366329, 0.902344, 0.0951691, 1 )\nCOLOR_LOW = Color( 0.910156, 0.62426, 0.131546, 1 )\nCOLOR_CRITICAL = Color( 0.957031, 0.203889, 0.056076, 1 )\nTHRESHOLD_LOW = 0.4\nTHRESHOLD_CRITICAL = 0.2\n\n[node name=\"Tween\" type=\"Tween\" parent=\"TextureProgress\" index=\"0\"]\n\nrepeat = false\nplayback_process_mode = 1\nplayback_speed = 1.0\nplayback/active = false\nplayback/repeat = false\nplayback/speed = 1.0\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"1\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"SETUP\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/heal = SubResource( 2 )\nanims/shake = SubResource( 3 )\nblend_times = [  ]\n\n[connection signal=\"maximum_changed\" from=\".\" to=\"TextureProgress\" method=\"_on_Bar_maximum_changed\"]\n\n\n"
  },
  {
    "path": "interface/gui/player/life_bar/Lifebar.gd",
    "content": "extends Control\n\nsignal maximum_changed(maximum)\n\nvar maximum = 100\nvar current_health = 0\n\nfunc initialize(health_node):\n\thealth_node.connect('health_changed', self, '_on_Player_Health_health_changed')\n\tmaximum = health_node.max_health\n\tcurrent_health = health_node.health\n\temit_signal(\"maximum_changed\", maximum)\n\tanimate_bar(current_health)\n\nfunc _on_Player_Health_health_changed(new_health):\n\tanimate_bar(new_health)\n\tcurrent_health = new_health\n\nfunc animate_bar(target_health):\n\t$TextureProgress.animate_value(current_health, target_health)\n\t$TextureProgress.update_color(target_health)\n"
  },
  {
    "path": "interface/gui/player/life_bar/TextureProgress.gd",
    "content": "tool\nextends TextureProgress\n\nexport(Color) var COLOR_FULL\nexport(Color) var COLOR_NORMAL\nexport(Color) var COLOR_LOW\nexport(Color) var COLOR_CRITICAL\n\nexport(float, 0, 1) var THRESHOLD_LOW = 0.3\nexport(float, 0, 1) var THRESHOLD_CRITICAL = 0.1\n\nvar color_active = COLOR_NORMAL\n\nfunc _on_Bar_maximum_changed(maximum):\n\tmax_value = maximum\n\nfunc animate_value(start, end):\n\t$Tween.interpolate_property(self, \"value\", start, end, 0.5, Tween.TRANS_QUART, Tween.EASE_OUT)\n\t$Tween.start()\n\nfunc update_color(new_value):\n\tvar new_color\n\tif new_value > THRESHOLD_LOW * max_value:\n\t\tif new_value < max_value:\n\t\t\tnew_color = COLOR_NORMAL\n\t\telse:\n\t\t\tnew_color = COLOR_FULL\n\telif new_value > THRESHOLD_CRITICAL * max_value:\n\t\tnew_color = COLOR_LOW\n\telse:\n\t\tnew_color = COLOR_CRITICAL\n\n\tif new_color == color_active:\n\t\treturn\n\tcolor_active = new_color\n\t$Tween.interpolate_property(self, \"modulate\", modulate, new_color, 0.4, Tween.TRANS_QUART, Tween.EASE_OUT)\n\t$Tween.start()\n"
  },
  {
    "path": "interface/gui/player/life_bar/bg.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/bg.png-4137f69cffc7cfbd089694c7a17196f3.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/gui/player/life_bar/bg.png\"\ndest_files=[ \"res://.import/bg.png-4137f69cffc7cfbd089694c7a17196f3.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/gui/player/life_bar/fill.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/fill.png-6d81f3dffced581fbfcd68a8ff5225b0.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/gui/player/life_bar/fill.png\"\ndest_files=[ \"res://.import/fill.png-6d81f3dffced581fbfcd68a8ff5225b0.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/items/ItemButton.gd",
    "content": "extends Button\n\nsignal amount_changed(value)\n\nvar description = \"\"\nvar amount = 0\n\nfunc initialize(item, price, purse):\n\t$Name.text = item.display_name\n\t$Price.text = str(price)\n\t$Icon.texture = item.icon\n\t\n\tdescription = item.description\n\tamount = item.amount\n\n\tif purse.coins < price:\n\t\tdisabled = true\n\t\n\titem.connect(\"amount_changed\", self, \"_on_Item_amount_changed\")\n\titem.connect(\"depleted\", self, \"_on_Item_depleted\")\n\tpurse.connect(\"coins_changed\", self, \"_on_Purse_coins_changed\", [price])\n\nfunc _on_Item_depleted():\n\tdisabled = true\n\nfunc _on_Item_amount_changed(value):\n\tamount = value\n\temit_signal(\"amount_changed\", value)\n\nfunc _on_Purse_coins_changed(coins, price):\n\tif price > coins:\n\t\tdisabled = true\n"
  },
  {
    "path": "interface/items/ItemButton.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=1]\n[ext_resource path=\"res://interface/items/ItemButton.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/theme/icons/purse.png\" type=\"Texture\" id=3]\n[ext_resource path=\"res://interface/theme/icons/coins.png\" type=\"Texture\" id=4]\n\n[node name=\"ItemButton\" type=\"Button\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 300.0\nmargin_bottom = 60.0\nrect_min_size = Vector2( 300, 60 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ntheme = ExtResource( 1 )\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\nflat = false\nalign = 1\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Focus\", \"Rect\", \"Size Flags\", \"Theme\" ]\n\n[node name=\"Name\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 1.0\nmargin_left = 54.0\nmargin_right = 254.0\nrect_min_size = Vector2( 200, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Item Name\"\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"Icon\" type=\"TextureRect\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 1.0\nmargin_right = 70.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 3 )\nstretch_mode = 4\n\n[node name=\"coins\" type=\"TextureRect\" parent=\".\" index=\"2\"]\n\nanchor_left = 1.0\nanchor_top = 0.5\nanchor_right = 1.0\nanchor_bottom = 0.5\nmargin_left = -41.0\nmargin_top = -18.0\nmargin_right = -9.0\nmargin_bottom = 14.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 4 )\nstretch_mode = 0\n\n[node name=\"Price\" type=\"Label\" parent=\".\" index=\"3\"]\n\nanchor_left = 1.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = -127.0\nmargin_right = -47.0\nrect_min_size = Vector2( 80, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"20\"\nalign = 2\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Rect\" ]\n\n\n"
  },
  {
    "path": "interface/items/ItemGrid.gd",
    "content": "extends GridContainer\n\nfunc initialize():\n\tupdate_focus_neighbours()\n\tget_child(0).grab_focus()\n\nfunc update_focus_neighbours(ignore=null):\n\tvar buttons_to_update = get_children()\n\t# There's a bug with the Node.tree_exited signal so the button is still in the tree\n\tif ignore:\n\t\tbuttons_to_update.remove(ignore.get_index())\n\tvar count = buttons_to_update.size()\n\tvar index = 0\n\tfor button in buttons_to_update:\n\t\tvar index_previous = index - 1\n\t\tvar index_next = (index + 1) % count\n\t\tvar button_previous = button.get_path_to(buttons_to_update[index_previous])\n\t\tvar button_next = button.get_path_to(buttons_to_update[index_next])\n\t\tbutton.focus_neighbour_left = button_previous\n\t\tbutton.focus_neighbour_right = button_next\n\t\tbutton.focus_neighbour_top = button_previous\n\t\tbutton.focus_neighbour_bottom = button_next\n\t\tbutton.focus_previous = button_previous\n\t\tbutton.focus_next = button_next\n\t\tindex += 1\n"
  },
  {
    "path": "interface/items/ItemsList.gd",
    "content": "extends Control\n\nsignal focused_button_changed(button)\nsignal item_amount_changed(amount)\nsignal focused_item_changed(item)\n\nexport(PackedScene) var ItemButton = preload(\"res://interface/items/ItemButton.tscn\")\nonready var _grid = $Grid\n\nfunc initialize():\n\t_grid.initialize()\n\nfunc add_item_button(item, price, purse):\n\tvar item_button = ItemButton.instance()\n\titem_button.initialize(item, price, purse)\n\t_grid.add_child(item_button)\n\titem_button.connect(\"focus_entered\", self, \"_on_ItemButton_focus_entered\", [item_button, item])\n\titem_button.connect(\"amount_changed\", self, \"_on_ItemButton_amount_changed\")\n\treturn item_button\n\nfunc _gui_input(event):\n\tif not get_focus_owner() == self:\n\t\treturn\n\tif event.is_action_pressed('ui_left') or \\\n\t\tevent.is_action_pressed('ui_right') or \\\n\t\tevent.is_action_pressed('ui_up') or \\\n\t\tevent.is_action_pressed('ui_down'):\n\t\t$MenuSfx/Navigate.play()\n\t\taccept_event()\n\nfunc get_item_buttons():\n\treturn _grid.get_children()\n\nfunc _on_ItemButton_focus_entered(button, item):\n\temit_signal(\"focused_button_changed\", button)\n\temit_signal(\"focused_item_changed\", item)\n\nfunc _on_ItemButton_amount_changed(value):\n\temit_signal(\"item_amount_changed\", value)\n"
  },
  {
    "path": "interface/items/ItemsList.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://interface/items/ItemsList.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/items/ItemButton.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://interface/items/ItemGrid.gd\" type=\"Script\" id=3]\n[ext_resource path=\"res://interface/menus/MenuSfx.tscn\" type=\"PackedScene\" id=4]\n\n[node name=\"ItemsList\" type=\"Panel\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Size Flags\" ]\nItemButton = ExtResource( 2 )\n\n[node name=\"Grid\" type=\"GridContainer\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 40.0\nmargin_top = 40.0\nmargin_right = -40.0\nmargin_bottom = -40.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ncustom_constants/vseparation = 16\ncustom_constants/hseparation = 16\ncolumns = 2\nscript = ExtResource( 3 )\n\n[node name=\"MenuSfx\" parent=\".\" index=\"1\" instance=ExtResource( 4 )]\n\n\n"
  },
  {
    "path": "interface/menus/Menu.gd",
    "content": "extends Control\nclass_name Menu\n\nsignal open()\nsignal closed()\n\nexport(NodePath) var SUB_MENU_PATH\n\nonready var sound_confirm = $MenuSfx/Confirm\nonready var sound_navigate = $MenuSfx/Navigate\nonready var sound_open = $MenuSfx/Open\n\nfunc _ready():\n\tset_process_input(false)\n\nfunc open(args={}):\n\tset_process_input(true)\n\tshow()\n\tsound_open.play()\n\temit_signal(\"open\")\n\nfunc close():\n\tsound_confirm.play()\n\tset_process_input(false)\n\thide()\n\temit_signal(\"closed\")\n\nfunc _gui_input(event):\n\tif event.is_action_pressed(\"ui_cancel\"):\n\t\taccept_event()\n\t\tclose()\n\n# You can streamline opening sub menus with these methods\n# The main drawback is you lose the initialize method's signature\n# Instead you have to group the arguments in a dictionary\nfunc initialize(args={}):\n\treturn\n\nfunc open_sub_menu(menu, args={}):\n\tvar sub_menu = menu.instance() if menu is PackedScene else menu\n\tif SUB_MENU_PATH:\n\t\tget_node(SUB_MENU_PATH).add_child(sub_menu)\n\telse:\n\t\tadd_child(sub_menu)\n\tsub_menu.initialize(args)\n\n\tset_process_input(false)\n\tsub_menu.open(args)\n\tyield(sub_menu, \"closed\")\n\tset_process_input(true)\n\tremove_child(sub_menu)\n"
  },
  {
    "path": "interface/menus/Menu.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=1]\n[ext_resource path=\"res://interface/menus/Menu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/menus/MenuSfx.tscn\" type=\"PackedScene\" id=3]\n\n[node name=\"Menu\" type=\"Control\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntheme = ExtResource( 1 )\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Theme\" ]\nSUB_MENU_PATH = null\n\n[node name=\"MenuSfx\" parent=\".\" index=\"0\" instance=ExtResource( 3 )]\n\n\n"
  },
  {
    "path": "interface/menus/MenuSfx.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://audio/sfx/menu_confirm.wav\" type=\"AudioStream\" id=1]\n[ext_resource path=\"res://audio/sfx/menu_navigate_01.wav\" type=\"AudioStream\" id=2]\n[ext_resource path=\"res://audio/sfx/menu_popup_open.wav\" type=\"AudioStream\" id=3]\n\n[node name=\"MenuSfx\" type=\"Node\" index=\"0\"]\n\n[node name=\"Confirm\" type=\"AudioStreamPlayer\" parent=\".\" index=\"0\"]\n\nstream = ExtResource( 1 )\nvolume_db = -1.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 2\nbus = \"Interface\"\n\n[node name=\"Navigate\" type=\"AudioStreamPlayer\" parent=\".\" index=\"1\"]\n\nstream = ExtResource( 2 )\nvolume_db = -6.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 2\nbus = \"Interface\"\n\n[node name=\"Open\" type=\"AudioStreamPlayer\" parent=\".\" index=\"2\"]\n\nstream = ExtResource( 3 )\nvolume_db = -3.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 2\nbus = \"Interface\"\n\n\n"
  },
  {
    "path": "interface/menus/MenuTitle.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://interface/theme/fonts/source_code_pro_26.tres\" type=\"DynamicFont\" id=1]\n\n[sub_resource type=\"GDScript\" id=1]\n\nscript/source = \"tool\nextends Control\n\nexport(String) var title = \\\"Title\\\" setget set_title\n\nonready var label = $Label\nfunc _ready():\n\tset_title(title)\n\nfunc set_title(string):\n\ttitle = string\n\tif not label:\n\t\treturn\n\tlabel.text = string\n\"\n\n[node name=\"TitlePanel\" type=\"Panel\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 1920.0\nmargin_bottom = 80.0\nrect_min_size = Vector2( 0, 80 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = SubResource( 1 )\n_sections_unfolded = [ \"Rect\" ]\ntitle = \"Title\"\n\n[node name=\"Label\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 2.0\nmargin_right = 2.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 1 )\ntext = \"Title\"\nalign = 1\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n\n"
  },
  {
    "path": "interface/menus/inventory/InventoryMenu.gd",
    "content": "extends Menu\n\nonready var items_list = $Column/ItemsMenu\n\n\"\"\"args: {inventory}\"\"\"\nfunc initialize(args={}):\n\titems_list.initialize(args['inventory'])\n\n\"\"\"args: {inventory}\"\"\"\nfunc open(args={}):\n\tassert(args.size() == 1)\n\tvar inventory = args['inventory']\n\t.open()\n\nfunc close():\n\t.close()\n\tqueue_free()\n"
  },
  {
    "path": "interface/menus/inventory/InventoryMenu.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://interface/menus/Menu.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/menus/inventory/InventoryMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=3]\n[ext_resource path=\"res://interface/menus/MenuTitle.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://interface/menus/inventory/ItemsMenu.tscn\" type=\"PackedScene\" id=5]\n\n[node name=\"InventoryMenu\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntheme = ExtResource( 3 )\ncustom_constants/separation = 0\nalignment = 0\n_sections_unfolded = [ \"Theme\", \"custom_constants\" ]\n\n[node name=\"TitlePanel\" parent=\"Column\" index=\"0\" instance=ExtResource( 4 )]\n\ntitle = \"Inventory\"\n\n[node name=\"ItemsMenu\" parent=\"Column\" index=\"1\" instance=ExtResource( 5 )]\n\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 80.0\nmargin_right = 1920.0\nmargin_bottom = 1080.0\n\n\n"
  },
  {
    "path": "interface/menus/inventory/ItemButton.gd",
    "content": "extends Button\n\nvar description = \"\"\n\nfunc initialize(item):\n\t$Name.text = item.display_name\n\t$Amount.text = str(item.amount)\n\t$Icon.texture = item.icon\n\t\n\tdescription = item.description\n\t\n\tdisabled = not item.usable\n\t\n\titem.connect(\"amount_changed\", self, \"_on_Item_amount_changed\")\n\titem.connect(\"depleted\", self, \"queue_free\")\n\nfunc _on_Item_amount_changed(amount):\n\t$Amount.text = str(amount)\n"
  },
  {
    "path": "interface/menus/inventory/ItemButton.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://interface/menus/inventory/ItemButton.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/theme/icons/purse.png\" type=\"Texture\" id=2]\n\n\n\n[node name=\"ItemButton\" type=\"Button\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 280.0\nmargin_bottom = 60.0\nrect_min_size = Vector2( 300, 60 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\nflat = false\nalign = 1\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Rect\", \"Size Flags\" ]\n\n[node name=\"Name\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 1.0\nmargin_left = 70.0\nmargin_right = 270.0\nrect_min_size = Vector2( 200, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Item Name\"\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"Icon\" type=\"TextureRect\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 1.0\nmargin_right = 70.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 2 )\nstretch_mode = 4\n\n[node name=\"Amount\" type=\"Label\" parent=\".\" index=\"2\"]\n\nanchor_left = 1.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = -100.0\nmargin_right = -20.0\nrect_min_size = Vector2( 80, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"20\"\nalign = 2\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Rect\" ]\n\n\n"
  },
  {
    "path": "interface/menus/inventory/ItemGrid.gd",
    "content": "extends GridContainer\n\nonready var placeholder_button = $Placeholder\nfunc _ready():\n\tremove_child(placeholder_button)\n\nfunc initialize(item_buttons):\n\tfor button in item_buttons:\n\t\tadd_child(button)\n\tupdate_focus_neighbours()\n\tfor button in get_children():\n\t\tbutton.connect(\"tree_exited\", self, \"_on_ItemButton_tree_exited\", [button])\n\tget_child(0).grab_focus()\n\tadd_child(placeholder_button)\n\nfunc _on_ItemButton_tree_exited(button):\n\tvar to_focus_path = button.focus_neighbour_left if button.get_index() > 0 else button.focus_neighbour_right\n\tbutton.get_node(to_focus_path).grab_focus()\n\tupdate_focus_neighbours(button)\n\nfunc update_focus_neighbours(ignore=null):\n\tvar buttons_to_update = get_children()\n\t# There's a bug with the Node.tree_exited signal so the button is still in the tree\n\tif ignore:\n\t\tbuttons_to_update.remove(ignore.get_index())\n\tvar count = buttons_to_update.size()\n\tvar index = 0\n\tfor button in buttons_to_update:\n\t\tvar index_previous = index - 1\n\t\tvar index_next = (index + 1) % count\n\t\tbutton.focus_neighbour_left = button.get_path_to(buttons_to_update[index_previous])\n\t\tbutton.focus_neighbour_right = button.get_path_to(buttons_to_update[index_next])\n\t\tindex += 1\n"
  },
  {
    "path": "interface/menus/inventory/ItemsMenu.gd",
    "content": "extends Control\n\nsignal item_use_requested(item, actor)\n\nexport(PackedScene) var ItemButton\n\nonready var _item_grid = $Column/ItemsList/Margin/Grid\nonready var _description_label = $Column/DescriptionPanel/Margin/Label\n\nfunc initialize(inventory):\n\tvar buttons = []\n\tfor item in inventory.get_items():\n\t\tvar item_button = create_item_button(item)\n\t\titem_button.connect(\"focus_entered\", self, \"_on_ItemButton_focus_entered\")\n\t\titem_button.connect(\"pressed\", self, \"_on_ItemButton_pressed\", [item])\n\t\tbuttons.append(item_button)\n\t_item_grid.initialize(buttons)\n\n\tinventory.connect(\"item_added\", self, \"create_item_button\")\n\tconnect(\"item_use_requested\", inventory, \"use\")\n\nfunc create_item_button(item):\n\tvar item_button = ItemButton.instance()\n\titem_button.initialize(item)\n\treturn item_button\n\nfunc _on_ItemButton_focus_entered():\n\t_description_label.text = get_focus_owner().description\n\nfunc _on_ItemButton_pressed(item):\n\tvar button = get_focus_owner()\n\t$UserSelectMenu.open()\n\tvar actor = yield($UserSelectMenu, \"closed\")\n\tbutton.grab_focus()\n\tif not actor:\n\t\treturn\n\temit_signal(\"item_use_requested\", item, actor)\n"
  },
  {
    "path": "interface/menus/inventory/ItemsMenu.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=1]\n[ext_resource path=\"res://interface/menus/inventory/ItemsMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/menus/inventory/ItemButton.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://interface/menus/inventory/ItemGrid.gd\" type=\"Script\" id=4]\n[ext_resource path=\"res://interface/menus/inventory/user_select/UserSelectMenu.tscn\" type=\"PackedScene\" id=5]\n\n[node name=\"ItemsMenu\" type=\"Control\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 3\ntheme = ExtResource( 1 )\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Size Flags\" ]\nItemButton = ExtResource( 3 )\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncustom_constants/separation = 0\nalignment = 0\n\n[node name=\"ItemsList\" type=\"Panel\" parent=\"Column\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 1920.0\nmargin_bottom = 980.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 3\n\n[node name=\"Margin\" type=\"MarginContainer\" parent=\"Column/ItemsList\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n_sections_unfolded = [ \"custom_constants\" ]\n\n[node name=\"Grid\" type=\"GridContainer\" parent=\"Column/ItemsList/Margin\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 16.0\nmargin_top = 16.0\nmargin_right = 1904.0\nmargin_bottom = 964.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ncustom_constants/vseparation = 16\ncustom_constants/hseparation = 16\ncolumns = 2\nscript = ExtResource( 4 )\n_sections_unfolded = [ \"custom_constants\" ]\n\n[node name=\"Placeholder\" type=\"Button\" parent=\"Column/ItemsList/Margin/Grid\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 1888.0\nmargin_bottom = 27.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ndisabled = true\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\nflat = true\nalign = 1\n_sections_unfolded = [ \"Size Flags\" ]\n\n[node name=\"DescriptionPanel\" type=\"Panel\" parent=\"Column\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 980.0\nmargin_right = 1920.0\nmargin_bottom = 1080.0\nrect_min_size = Vector2( 0, 100 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"Margin\" type=\"MarginContainer\" parent=\"Column/DescriptionPanel\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"Label\" type=\"Label\" parent=\"Column/DescriptionPanel/Margin\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 16.0\nmargin_top = 25.0\nmargin_right = 1904.0\nmargin_bottom = 74.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Item descripton here.\n\"\nautowrap = true\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n\n[node name=\"UserSelectMenu\" parent=\".\" index=\"1\" instance=ExtResource( 5 )]\n\nvisible = false\n\n\n"
  },
  {
    "path": "interface/menus/inventory/user_select/ActorButton.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://actors/body.png\" type=\"Texture\" id=1]\n\n[node name=\"ActorButton\" type=\"Button\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 310.0\nmargin_right = 420.0\nmargin_bottom = 410.0\nrect_min_size = Vector2( 300, 100 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\nflat = false\nalign = 1\n_sections_unfolded = [ \"Rect\", \"Size Flags\" ]\n\n[node name=\"Name\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 1.0\nmargin_left = 90.0\nmargin_right = 290.0\nrect_min_size = Vector2( 200, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Actor\"\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"Icon\" type=\"TextureRect\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 1.0\nmargin_right = 90.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 1 )\nstretch_mode = 4\n\n\n"
  },
  {
    "path": "interface/menus/inventory/user_select/UserSelectMenu.gd",
    "content": "extends Control\n\nsignal closed(selected_actor)\n\nexport(PackedScene) var ActorButton\n\nfunc _ready():\n\tset_as_toplevel(true)\n\nfunc initialize(actors):\n\tfor actor in actors:\n\t\tcreate_actor_button(actor)\n\nfunc create_actor_button(actor):\n\tvar button = ActorButton.instance()\n\tbutton.get_node(\"Name\").text = actor.name\n\tbutton.connect(\"pressed\", self, \"_on_SelectButton_pressed\", [actor])\n\t$ActorsList.add_child(button)\n\nfunc _input(event):\n\tif event.is_action_pressed(\"ui_cancel\"):\n\t\tclose()\n\nfunc _on_SelectButton_pressed(actor):\n\tclose(actor)\n\n# TODO: Temporarily bypassing the menu, \n# see https://github.com/GDquest/make-pro-2d-games-with-godot/issues/66\nfunc open():\n\tclose()\n\treturn\n\t$ActorsList.get_child(0).grab_focus()\n\tvisible = true\n\tset_process_input(true)\n\nfunc close(selected_actor=null):\n\tvisible = false\n\tset_process_input(false)\n\temit_signal(\"closed\", selected_actor)\n"
  },
  {
    "path": "interface/menus/inventory/user_select/UserSelectMenu.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://interface/menus/inventory/user_select/UserSelectMenu.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/menus/inventory/user_select/ActorButton.tscn\" type=\"PackedScene\" id=2]\n\n\n[node name=\"UserSelectMenu\" type=\"Control\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = ExtResource( 1 )\nActorButton = ExtResource( 2 )\n\n[node name=\"BlackOverlay\" type=\"ColorRect\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncolor = Color( 0, 0, 0, 0.313726 )\n\n[node name=\"ActorsList\" type=\"VBoxContainer\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.5\nanchor_top = 0.0\nanchor_right = 0.5\nanchor_bottom = 1.0\nmargin_left = -210.0\nmargin_right = 210.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 1\n\n\n"
  },
  {
    "path": "interface/menus/pause/OptionsMenu.gd",
    "content": "extends Menu\n\nconst SoundController = preload(\"res://interface/menus/pause/SoundController.gd\")\n\nonready var first_slider = $Column/MusicController/Row/HSlider\n\nfunc open(args={}):\n\t.open()\n\tfirst_slider.grab_focus()\n\tset_focus_neighbors()\n\nfunc set_focus_neighbors():\n\t\"\"\"\n\tLoops through the sliders and assign their focus neighbors manually\n\tThis fixes keyboard navigation in the options menu\n\t\"\"\"\n\tvar sliders = get_sound_sliders()\n\tvar index = 0\n\tfor slider in sliders:\n\t\tvar index_previous = index - 1\n\t\tif index_previous >= 0:\n\t\t\tslider.focus_neighbour_top = slider.get_path_to(sliders[index_previous])\n\t\tvar index_next = index + 1\n\t\tif index_next < sliders.size():\n\t\t\tslider.focus_neighbour_bottom = NodePath(slider.get_path_to(sliders[index_next]))\n\t\tindex += 1\n\n\tvar back_button = $Column/GoBackButton\n\tvar last_slider = sliders[-1]\n\tlast_slider.focus_neighbour_bottom = last_slider.get_path_to(back_button)\n\tback_button.focus_neighbour_top = back_button.get_path_to(last_slider)\n\nfunc get_sound_sliders():\n\tvar sliders = []\n\tfor node in $Column.get_children():\n\t\tif not node is SoundController:\n\t\t\tcontinue\n\t\tsliders.append(node.slider)\n\treturn sliders\n"
  },
  {
    "path": "interface/menus/pause/OptionsMenu.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=1]\n[ext_resource path=\"res://interface/menus/pause/OptionsMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/menus/MenuSfx.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://interface/theme/fonts/default_font_comfortaa.tres\" type=\"DynamicFont\" id=4]\n[ext_resource path=\"res://interface/menus/pause/SoundController.tscn\" type=\"PackedScene\" id=5]\n\n[node name=\"OptionsMenu\" type=\"Panel\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntheme = ExtResource( 1 )\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Focus\", \"Theme\" ]\nSUB_MENU_PATH = null\n\n[node name=\"MenuSfx\" parent=\".\" index=\"0\" instance=ExtResource( 3 )]\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 570.0\nmargin_top = 147.0\nmargin_right = -570.0\nmargin_bottom = -147.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 1\n_sections_unfolded = [ \"Focus\" ]\n\n[node name=\"Title\" type=\"Label\" parent=\"Column\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 73.0\nmargin_right = 780.0\nmargin_bottom = 108.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 4 )\ntext = \"Sound Options\"\nalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Focus\", \"custom_fonts\" ]\n\n[node name=\"HSeparator\" type=\"HSeparator\" parent=\"Column\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 124.0\nmargin_right = 780.0\nmargin_bottom = 128.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"MusicController\" parent=\"Column\" index=\"2\" instance=ExtResource( 5 )]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 0.0\nmargin_top = 144.0\nmargin_right = 780.0\nmargin_bottom = 284.0\n\n[node name=\"SfxController\" parent=\"Column\" index=\"3\" instance=ExtResource( 5 )]\n\neditor/display_folded = true\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 0.0\nmargin_top = 300.0\nmargin_right = 780.0\nmargin_bottom = 440.0\n\n[node name=\"InterfaceController\" parent=\"Column\" index=\"4\" instance=ExtResource( 5 )]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 0.0\nmargin_top = 456.0\nmargin_right = 780.0\nmargin_bottom = 596.0\n\n[node name=\"HSeparator2\" type=\"HSeparator\" parent=\"Column\" index=\"5\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 612.0\nmargin_right = 780.0\nmargin_bottom = 616.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"GoBackButton\" type=\"Button\" parent=\"Column\" index=\"6\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 632.0\nmargin_right = 780.0\nmargin_bottom = 712.0\nrect_min_size = Vector2( 0, 80 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Go back\"\nflat = false\nalign = 1\n_sections_unfolded = [ \"Focus\", \"Rect\" ]\n\n[connection signal=\"pressed\" from=\"Column/GoBackButton\" to=\".\" method=\"close\"]\n\n\n"
  },
  {
    "path": "interface/menus/pause/PauseMenu.gd",
    "content": "extends Menu\n\nsignal unpause()\n\nconst InventoryMenu = preload(\"res://interface/menus/inventory/InventoryMenu.tscn\")\nconst PlayerController = preload(\"res://actors/player/PlayerController.gd\")\n\nonready var continue_button = $Background/Column/ContinueButton\nonready var items_button = $Background/Column/ItemsButton\nonready var options_button = $Background/Column/OptionsButton\nonready var save_button = $Background/Column/SaveButton\n\nonready var buttons_container = $Background/Column\n\nonready var save_menu = $SaveMenu\nonready var options_menu = $OptionsMenu\n\nfunc _ready():\n\toptions_button.connect('pressed', self, 'open_sub_menu', [options_menu])\n\tsave_button.connect('pressed', self, 'open_sub_menu', [save_menu])\n\tremove_child(save_menu)\n\tremove_child(options_menu)\n\n\"\"\"args: {actor}\"\"\"\nfunc initialize(args={}):\n\tvar actor = args['actor']\n\tassert(actor is PlayerController)\n\tvar inventory = actor.get_inventory()\n\titems_button.connect('pressed', self, 'open_sub_menu', [InventoryMenu, {'inventory':inventory}])\n\tactor.connect('died', self, '_on_Player_died')\n\nfunc _on_Player_died():\n\titems_button.disabled = true\n\nfunc open(args={}):\n\t.open()\n\tcontinue_button.grab_focus()\n\nfunc open_sub_menu(menu, args={}):\n\tvar last_focused_item = get_focus_owner()\n\tbuttons_container.hide()\n\tyield(.open_sub_menu(menu, args), 'completed')\n\tbuttons_container.show()\n\tlast_focused_item.grab_focus()\n"
  },
  {
    "path": "interface/menus/pause/PauseMenu.tscn",
    "content": "[gd_scene load_steps=7 format=2]\n\n[ext_resource path=\"res://interface/menus/Menu.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/menus/pause/PauseMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/menus/shared/Button.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://interface/menus/save_and_load/SaveMenu.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://interface/menus/pause/OptionsMenu.tscn\" type=\"PackedScene\" id=5]\n\n[sub_resource type=\"GDScript\" id=1]\n\nscript/source = \"extends VBoxContainer\n\nvar focus_active = true setget set_focus_active\n\nfunc _ready():\n\tself.focus_active = focus_active\n\nfunc set_focus_active(value):\n\tfocus_active = true\n\tvar focus_mode = FOCUS_ALL if focus_active else FOCUS_NONE\n\tfor child in get_children():\n\t\tchild.focus_mode = focus_mode\n\"\n\n[node name=\"PauseMenu\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\n\n[node name=\"DarkOverlay\" type=\"ColorRect\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncolor = Color( 0, 0, 0, 0.313726 )\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"Background\" type=\"ColorRect\" parent=\".\" index=\"2\"]\n\nanchor_left = 0.5\nanchor_top = 0.5\nanchor_right = 0.5\nanchor_bottom = 0.5\nmargin_left = -300.0\nmargin_top = -280.0\nmargin_right = 300.0\nmargin_bottom = 280.0\nrect_min_size = Vector2( 600, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncolor = Color( 0.136719, 0.136719, 0.136719, 1 )\n_sections_unfolded = [ \"Rect\", \"custom_constants\" ]\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\"Background\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_min_size = Vector2( 600, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 1\nscript = SubResource( 1 )\n_sections_unfolded = [ \"Focus\", \"Margin\", \"Rect\", \"Theme\" ]\n\n[node name=\"Label\" type=\"Label\" parent=\"Background/Column\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 68.0\nmargin_right = 600.0\nmargin_bottom = 91.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Pause Menu\"\nalign = 1\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Focus\", \"Theme\" ]\n\n[node name=\"ContinueButton\" parent=\"Background/Column\" index=\"1\" instance=ExtResource( 3 )]\n\nmargin_left = 100.0\nmargin_top = 107.0\nmargin_right = 500.0\nmargin_bottom = 171.0\ntext = \"Continue\"\n\n[node name=\"ItemsButton\" parent=\"Background/Column\" index=\"2\" instance=ExtResource( 3 )]\n\nmargin_left = 100.0\nmargin_top = 187.0\nmargin_right = 500.0\nmargin_bottom = 251.0\ntext = \"Items\"\n\n[node name=\"SaveButton\" parent=\"Background/Column\" index=\"3\" instance=ExtResource( 3 )]\n\nmargin_left = 100.0\nmargin_top = 267.0\nmargin_right = 500.0\nmargin_bottom = 331.0\ntext = \"Save\"\n\n[node name=\"OptionsButton\" parent=\"Background/Column\" index=\"4\" instance=ExtResource( 3 )]\n\nmargin_left = 100.0\nmargin_top = 347.0\nmargin_right = 500.0\nmargin_bottom = 411.0\ntext = \"Options\"\n\n[node name=\"TitleScreenButton\" parent=\"Background/Column\" index=\"5\" instance=ExtResource( 3 )]\n\nmargin_left = 100.0\nmargin_top = 427.0\nmargin_right = 500.0\nmargin_bottom = 491.0\ntext = \"Title Screen\"\n\n[node name=\"SaveMenu\" parent=\".\" index=\"3\" instance=ExtResource( 4 )]\n\nvisible = false\n\n[node name=\"OptionsMenu\" parent=\".\" index=\"4\" instance=ExtResource( 5 )]\n\nvisible = false\n\n[connection signal=\"pressed\" from=\"Background/Column/ContinueButton\" to=\".\" method=\"close\"]\n\n[connection signal=\"pressed\" from=\"Background/Column/TitleScreenButton\" to=\".\" method=\"close\"]\n\n\n"
  },
  {
    "path": "interface/menus/pause/SoundController.gd",
    "content": "tool\nextends Panel\n\nonready var audio_bus_label = $Row/Label\nonready var amount_label = $Row/Amount\nonready var slider = $Row/HSlider\n\nexport(String, \"Music\", \"World\", \"Interface\") var BUS_NAME = \"Music\"\nvar audio_bus_index\n\nfunc _ready():\n\taudio_bus_index = AudioServer.get_bus_index(BUS_NAME)\n\taudio_bus_label.text = BUS_NAME\n\tvar volume_db = AudioServer.get_bus_volume_db(audio_bus_index)\n\tslider.value = round(min(db2linear(volume_db) * 100.0, 100.0))\n\nfunc change_volume(value):\n\tvar volume = max(linear2db(value / slider.max_value), -80.0)\n\tAudioServer.set_bus_volume_db(audio_bus_index, volume)\n"
  },
  {
    "path": "interface/menus/pause/SoundController.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=1]\n[ext_resource path=\"res://interface/menus/pause/SoundController.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/theme/fonts/source_code_pro_26.tres\" type=\"DynamicFont\" id=3]\n\n[sub_resource type=\"GDScript\" id=2]\n\nresource_local_to_scene = true\nscript/source = \"extends Label\n\nfunc _on_HSlider_value_changed(value):\n\ttext = str(value)\n\"\n_sections_unfolded = [ \"Resource\" ]\n\n[node name=\"SoundController\" type=\"Panel\" index=\"0\"]\n\nanchor_left = 0.5\nanchor_top = 0.5\nanchor_right = 0.5\nanchor_bottom = 0.5\nmargin_left = -390.0\nmargin_top = -110.0\nmargin_right = 390.0\nmargin_bottom = 110.0\nrect_min_size = Vector2( 780, 140 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntheme = ExtResource( 1 )\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Focus\", \"Rect\", \"Theme\" ]\n\n[node name=\"Row\" type=\"HBoxContainer\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.5\nanchor_top = 0.5\nanchor_right = 0.5\nanchor_bottom = 0.5\nmargin_left = -320.0\nmargin_top = -80.0\nmargin_right = 320.0\nmargin_bottom = 80.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 0\n_sections_unfolded = [ \"Focus\" ]\n\n[node name=\"Label\" type=\"Label\" parent=\"Row\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 140.0\nmargin_bottom = 160.0\nrect_min_size = Vector2( 140, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 5\ncustom_fonts/font = ExtResource( 3 )\ntext = \"Music\"\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Focus\", \"Rect\", \"custom_colors\", \"custom_fonts\" ]\n\n[node name=\"HSlider\" type=\"HSlider\" parent=\"Row\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 156.0\nmargin_right = 576.0\nmargin_bottom = 160.0\nrect_min_size = Vector2( 0, 140 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\nmin_value = 0.0\nmax_value = 100.0\nstep = 10.0\npage = 0.0\nvalue = 58.0\nexp_edit = false\nrounded = false\neditable = true\ntick_count = 0\nticks_on_borders = false\nfocus_mode = 2\n_sections_unfolded = [ \"Focus\" ]\n\n[node name=\"Amount\" type=\"Label\" parent=\"Row\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 592.0\nmargin_top = 63.0\nmargin_right = 640.0\nmargin_bottom = 97.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 3 )\ntext = \"100\"\nalign = 1\nvalign = 2\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\nscript = SubResource( 2 )\n_sections_unfolded = [ \"custom_colors\", \"custom_fonts\" ]\n\n[connection signal=\"value_changed\" from=\"Row/HSlider\" to=\".\" method=\"change_volume\"]\n\n[connection signal=\"value_changed\" from=\"Row/HSlider\" to=\"Row/Amount\" method=\"_on_HSlider_value_changed\"]\n\n\n"
  },
  {
    "path": "interface/menus/save_and_load/SaveMenu.gd",
    "content": "extends Menu\n\nonready var save_button = $Panel/Column/SaveButton\nonready var load_button = $Panel/Column/LoadButton\n\nfunc open(args={}):\n\t.open()\n\tsave_button.grab_focus()\n"
  },
  {
    "path": "interface/menus/save_and_load/SaveMenu.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://interface/menus/Menu.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/menus/save_and_load/SaveMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=3]\n[ext_resource path=\"res://interface/theme/fonts/default_font_comfortaa.tres\" type=\"DynamicFont\" id=4]\n\n[node name=\"SaveMenu\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\n\n[node name=\"Panel\" type=\"Panel\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntheme = ExtResource( 3 )\n_sections_unfolded = [ \"Focus\", \"Theme\" ]\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\"Panel\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 570.0\nmargin_top = 147.0\nmargin_right = -570.0\nmargin_bottom = -147.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 1\n_sections_unfolded = [ \"Focus\" ]\n\n[node name=\"Title\" type=\"Label\" parent=\"Panel/Column\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 211.0\nmargin_right = 780.0\nmargin_bottom = 246.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 4 )\ntext = \"Save and Load\"\nalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"Focus\", \"custom_fonts\" ]\n\n[node name=\"HSeparator\" type=\"HSeparator\" parent=\"Panel/Column\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 262.0\nmargin_right = 780.0\nmargin_bottom = 266.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"SaveButton\" type=\"Button\" parent=\"Panel/Column\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 282.0\nmargin_right = 780.0\nmargin_bottom = 362.0\nrect_min_size = Vector2( 0, 80 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncustom_fonts/font = ExtResource( 4 )\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Save\"\nflat = false\nalign = 1\n_sections_unfolded = [ \"Focus\", \"custom_fonts\" ]\n\n[node name=\"LoadButton\" type=\"Button\" parent=\"Panel/Column\" index=\"3\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 378.0\nmargin_right = 780.0\nmargin_bottom = 458.0\nrect_min_size = Vector2( 0, 80 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncustom_fonts/font = ExtResource( 4 )\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Load\"\nflat = false\nalign = 1\n_sections_unfolded = [ \"Focus\", \"custom_fonts\" ]\n\n[node name=\"HSeparator2\" type=\"HSeparator\" parent=\"Panel/Column\" index=\"4\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 474.0\nmargin_right = 780.0\nmargin_bottom = 478.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"GoBackButton\" type=\"Button\" parent=\"Panel/Column\" index=\"5\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 494.0\nmargin_right = 780.0\nmargin_bottom = 574.0\nrect_min_size = Vector2( 0, 80 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Go back\"\nflat = false\nalign = 1\n_sections_unfolded = [ \"Focus\", \"Rect\" ]\n\n[connection signal=\"pressed\" from=\"Panel/Column/GoBackButton\" to=\".\" method=\"close\"]\n\n\n"
  },
  {
    "path": "interface/menus/shared/Button.gd",
    "content": "extends Button\n\nfunc _gui_input(event):\n\tif event.is_action_pressed('ui_accept'):\n\t\taccept_event()\n"
  },
  {
    "path": "interface/menus/shared/Button.tscn",
    "content": "[gd_scene format=2]\n\n[node name=\"Button\" type=\"Button\"]\n\neditor/display_folded = true\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 400.0\nmargin_bottom = 64.0\nrect_min_size = Vector2( 400, 64 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 4\nsize_flags_vertical = 4\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Button\"\nflat = false\nalign = 1\n_sections_unfolded = [ \"Rect\", \"Theme\" ]\n\n\n"
  },
  {
    "path": "interface/menus/shop/ShopMenu.gd",
    "content": "extends Menu\n\nexport(PackedScene) var BuyMenu = preload(\"menus/BuySubMenu.tscn\")\nexport(PackedScene) var SellMenu = preload(\"menus/SellSubMenu.tscn\")\n\nonready var buttons = $Column/Buttons\nonready var submenu = $Column/Menu\n\nonready var button_buy = $Column/Buttons/BuyButton\nonready var button_sell = $Column/Buttons/SellButton\n\nfunc _ready():\n\thide()\n\n\n\"\"\"args: {shop, buyer}\"\"\"\nfunc open(args={}):\n\tassert(args.size() == 2)\n\tvar shop = args['shop']\n\tvar buyer = args['buyer']\n\t\n\tbutton_buy.connect(\"pressed\", self, \"open_submenu\",\n\t\t[BuyMenu, {\n\t\t\t'shop':shop,\n\t\t\t'buyer':buyer,\n\t\t\t'inventory':shop.inventory}])\n\tbutton_sell.connect(\"pressed\", self, \"open_submenu\",\n\t\t[SellMenu, {\n\t\t\t'shop':shop,\n\t\t\t'buyer':buyer,\n\t\t\t'inventory':buyer.get_node(\"Inventory\")}])\n\t.open()\n\tbuttons.get_child(0).grab_focus()\n\nfunc close():\n\tbutton_buy.disconnect('pressed', self, 'open_submenu')\n\tbutton_sell.disconnect('pressed', self, 'open_submenu')\n\t.close()\n\n\n\"\"\"args: shop, buyer, inventory\"\"\"\nfunc open_submenu(Menu, args={}):\n\tassert(args.size() == 3)\n\tvar shop = args['shop']\n\tvar buyer = args['buyer']\n\tvar inventory = args['inventory']\n\t\n\tvar pressed_button = get_focus_owner()\n\t\n\tvar active_menu = Menu.instance()\n\tsubmenu.add_child(active_menu)\n\tactive_menu.initialize({'shop':shop, 'buyer':buyer, 'items':inventory.get_items()})\n\tset_process_input(false)\n\tactive_menu.open()\n\tyield(active_menu, \"closed\")\n\tset_process_input(true)\n\tpressed_button.grab_focus()\n\nfunc _on_QuitButton_pressed():\n\tclose()\n"
  },
  {
    "path": "interface/menus/shop/ShopMenu.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://interface/menus/Menu.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/menus/shop/ShopMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/menus/shop/menus/BuySubMenu.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://interface/menus/shop/menus/SellSubMenu.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://interface/menus/MenuTitle.tscn\" type=\"PackedScene\" id=5]\n\n[node name=\"ShopMenu\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\nBuyMenu = ExtResource( 3 )\nSellMenu = ExtResource( 4 )\n\n[node name=\"DarkOverlay\" type=\"ColorRect\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncolor = Color( 0, 0, 0, 0.313726 )\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\".\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 0\n_sections_unfolded = [ \"custom_constants\" ]\n\n[node name=\"TitlePanel\" parent=\"Column\" index=\"0\" instance=ExtResource( 5 )]\n\ntitle = \"Terrence's shop\"\n\n[node name=\"Buttons\" type=\"HBoxContainer\" parent=\"Column\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 96.0\nmargin_right = 1920.0\nmargin_bottom = 166.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nalignment = 0\n\n[node name=\"BuyButton\" type=\"Button\" parent=\"Column/Buttons\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 629.0\nmargin_bottom = 70.0\nrect_min_size = Vector2( 0, 70 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Buy\"\nflat = false\nalign = 1\n\n[node name=\"SellButton\" type=\"Button\" parent=\"Column/Buttons\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 645.0\nmargin_right = 1274.0\nmargin_bottom = 70.0\nrect_min_size = Vector2( 0, 70 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Sell\"\nflat = false\nalign = 1\n\n[node name=\"QuitButton\" type=\"Button\" parent=\"Column/Buttons\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 1290.0\nmargin_right = 1920.0\nmargin_bottom = 70.0\nrect_min_size = Vector2( 0, 70 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nfocus_mode = 2\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 1\ntoggle_mode = false\nenabled_focus_mode = 2\nshortcut = null\ngroup = null\ntext = \"Quit\"\nflat = false\nalign = 1\n\n[node name=\"Menu\" type=\"Control\" parent=\"Column\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 182.0\nmargin_right = 1920.0\nmargin_bottom = 1080.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 3\n\n[connection signal=\"pressed\" from=\"Column/Buttons/QuitButton\" to=\".\" method=\"_on_QuitButton_pressed\"]\n\n\n"
  },
  {
    "path": "interface/menus/shop/menus/BuySubMenu.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://interface/menus/shop/menus/ShopSubMenu.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://audio/sfx/menu_confirm.wav\" type=\"AudioStream\" id=2]\n[ext_resource path=\"res://audio/sfx/menu_navigate_01.wav\" type=\"AudioStream\" id=3]\n[ext_resource path=\"res://audio/sfx/menu_popup_open.wav\" type=\"AudioStream\" id=4]\n\n[node name=\"BuySubMenu\" instance=ExtResource( 1 )]\n\nACTION = \"sell_to\"\n\n[node name=\"Sfx\" type=\"Node\" parent=\".\" index=\"0\"]\n\n[node name=\"Confirm\" type=\"AudioStreamPlayer\" parent=\"Sfx\" index=\"0\"]\n\nstream = ExtResource( 2 )\nvolume_db = 0.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 0\nbus = \"Interface\"\n\n[node name=\"Navigate\" type=\"AudioStreamPlayer\" parent=\"Sfx\" index=\"1\"]\n\nstream = ExtResource( 3 )\nvolume_db = 0.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 0\nbus = \"Interface\"\n\n[node name=\"Open\" type=\"AudioStreamPlayer\" parent=\"Sfx\" index=\"2\"]\n\nstream = ExtResource( 4 )\nvolume_db = 0.0\npitch_scale = 1.0\nautoplay = false\nmix_target = 0\nbus = \"Interface\"\n\n\n"
  },
  {
    "path": "interface/menus/shop/menus/SellSubMenu.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/menus/shop/menus/ShopSubMenu.tscn\" type=\"PackedScene\" id=1]\n\n[node name=\"SellSubMenu\" instance=ExtResource( 1 )]\n\nACTION = \"buy_from\"\n\n\n"
  },
  {
    "path": "interface/menus/shop/menus/ShopSubMenu.gd",
    "content": "extends Menu\n\nexport(String, \"sell_to\", \"buy_from\") var ACTION = \"\"\n\nonready var items_list = $Column/Row/ShopItemsList\nonready var description_panel = $Column/DescriptionPanel\nonready var info_panel = $Column/Row/InfoPanel\nonready var amount_popup = items_list.get_node(\"AmountPopup\")\n\nfunc _ready():\n\tassert(ACTION != \"\")\n\n\"\"\"Args: {shop, buyer, items}\"\"\"\nfunc initialize(args={}):\n\tassert(args.size() == 3)\n\t# Extract the nodes from the args dict to preserve legacy code below\n\tvar shop = args['shop']\n\tvar items = args['items']\n\tvar buyer = args['buyer']\n\t\n\tvar purse = buyer.get_purse()\n\tinfo_panel.initialize(purse)\n\n\tfor item in items:\n\t\tvar price = shop.get_buy_value(item) if ACTION == \"buy_from\" else item.price\n\t\tvar item_button = items_list.add_item_button(item, price, purse)\n\n\t\titem_button.connect(\"pressed\", self, \"_on_ItemButton_pressed\", [shop, buyer, item])\n\t\titem_button.connect(\"pressed\", info_panel, \"_on_focused_Item_amount_changed\", [item])\n\titems_list.connect(\"focused_button_changed\", self, \"_on_ItemList_focused_button_changed\")\n\titems_list.initialize()\n\nfunc _on_ItemList_focused_button_changed(item_button):\n\tdescription_panel.display(item_button.description)\n\nfunc open(args={}):\n\t.open()\n\titems_list.get_child(0).grab_focus()\n\nfunc close():\n\t.close()\n\tqueue_free()\n\nfunc _on_ItemButton_pressed(shop, buyer, item):\n\tvar price = shop.get_buy_value(item) if ACTION == \"buy_from\" else item.price\n\tvar coins = shop.get_purse().coins if ACTION == \"buy_from\" else buyer.get_purse().coins\n\tvar max_amount = min(item.amount, floor(coins / price))\n\n\tvar focused_item = get_focus_owner()\n\tamount_popup.initialize({'value': 1, 'max_value': max_amount})\n\tvar amount = yield(amount_popup.open(), \"completed\")\n\tfocused_item.grab_focus()\n\tif not amount:\n\t\treturn\n\tshop.call(ACTION, buyer, item, amount)\n"
  },
  {
    "path": "interface/menus/shop/menus/ShopSubMenu.tscn",
    "content": "[gd_scene load_steps=7 format=2]\n\n[ext_resource path=\"res://interface/menus/Menu.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/menus/shop/menus/ShopSubMenu.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=3]\n[ext_resource path=\"res://interface/menus/shop/panels/ShopItemsList.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://interface/menus/shop/panels/InfoPanel.tscn\" type=\"PackedScene\" id=5]\n[ext_resource path=\"res://interface/menus/shop/panels/DescriptionPanel.tscn\" type=\"PackedScene\" id=6]\n\n[node name=\"ShopSubMenu\" index=\"0\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\nACTION = \"\"\n\n[node name=\"Column\" type=\"VBoxContainer\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 3\ntheme = ExtResource( 3 )\nalignment = 0\n_sections_unfolded = [ \"Rect\", \"Theme\" ]\n\n[node name=\"Row\" type=\"HBoxContainer\" parent=\"Column\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 1920.0\nmargin_bottom = 964.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nalignment = 0\n_sections_unfolded = [ \"Size Flags\" ]\n\n[node name=\"ShopItemsList\" parent=\"Column/Row\" index=\"0\" instance=ExtResource( 4 )]\n\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 1504.0\nmargin_bottom = 964.0\n\n[node name=\"InfoPanel\" parent=\"Column/Row\" index=\"1\" instance=ExtResource( 5 )]\n\nmargin_left = 1520.0\nmargin_right = 1920.0\nmargin_bottom = 964.0\n\n[node name=\"DescriptionPanel\" parent=\"Column\" index=\"1\" instance=ExtResource( 6 )]\n\nmargin_top = 980.0\nmargin_right = 1920.0\nmargin_bottom = 1080.0\n\n[connection signal=\"focused_button_changed\" from=\"Column/Row/ShopItemsList\" to=\"Column/Row/InfoPanel\" method=\"_on_ItemsList_focused_button_changed\"]\n\n[connection signal=\"item_amount_changed\" from=\"Column/Row/ShopItemsList\" to=\"Column/Row/InfoPanel\" method=\"_on_ItemsList_item_amount_changed\"]\n\n\n"
  },
  {
    "path": "interface/menus/shop/panels/DescriptionPanel.gd",
    "content": "extends Panel\n\nfunc display(message):\n\t$Description.text = message\n"
  },
  {
    "path": "interface/menus/shop/panels/DescriptionPanel.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/menus/shop/panels/DescriptionPanel.gd\" type=\"Script\" id=1]\n\n\n\n[node name=\"DescriptionPanel\" type=\"Panel\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 620.0\nmargin_right = 1280.0\nmargin_bottom = 720.0\nrect_min_size = Vector2( 0, 100 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"Description\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 40.0\nmargin_top = 20.0\nmargin_right = 1240.0\nmargin_bottom = 81.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Item descripton here.\n\"\nautowrap = true\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n\n\n"
  },
  {
    "path": "interface/menus/shop/panels/InfoPanel.gd",
    "content": "extends Control\n\nonready var _money_label = $MoneyPanel/Count\nonready var _owned_label = $OwnedPanel/Count\n\nfunc initialize(purse):\n\tpurse.connect(\"coins_changed\", self, \"_on_Purse_coins_changed\")\n\tupdate_coins(purse.coins)\n\nfunc update_coins(amount):\n\t_money_label.text = str(amount)\n\nfunc update_amount(amount):\n\t_owned_label.text = str(amount)\n\nfunc _on_Purse_coins_changed(coins):\n\tupdate_coins(coins)\n\nfunc _on_focused_Item_amount_changed(item):\n\tupdate_amount(item.amount)\n\nfunc _on_ItemsList_focused_button_changed(button):\n\tupdate_amount(button.amount)\n\nfunc _on_ItemsList_item_amount_changed(amount):\n\tupdate_amount(amount)\n"
  },
  {
    "path": "interface/menus/shop/panels/InfoPanel.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://interface/menus/shop/panels/InfoPanel.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/theme/icons/coins.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://interface/theme/icons/purse.png\" type=\"Texture\" id=3]\n\n\n\n\n\n[node name=\"InfoPanel\" type=\"Panel\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 880.0\nmargin_right = 1280.0\nmargin_bottom = 462.0\nrect_min_size = Vector2( 400, 0 )\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Rect\" ]\n\n[node name=\"MoneyPanel\" type=\"Panel\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.5\nanchor_top = 0.0\nanchor_right = 0.5\nanchor_bottom = 0.0\nmargin_left = -180.0\nmargin_top = 18.0\nmargin_right = 180.0\nmargin_bottom = 78.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"Label\" type=\"Label\" parent=\"MoneyPanel\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 20.0\nmargin_right = -20.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Purse\"\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n\n[node name=\"Count\" type=\"Label\" parent=\"MoneyPanel\" index=\"1\"]\n\nanchor_left = 1.0\nanchor_top = 0.5\nanchor_right = 1.0\nanchor_bottom = 0.5\nmargin_left = -240.0\nmargin_top = -30.0\nmargin_right = -60.0\nmargin_bottom = 30.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"1600\"\nalign = 2\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n\n[node name=\"CoinsIcon\" type=\"TextureRect\" parent=\"MoneyPanel\" index=\"2\"]\n\nanchor_left = 1.0\nanchor_top = 0.5\nanchor_right = 1.0\nanchor_bottom = 0.5\nmargin_left = -52.0\nmargin_top = -16.0\nmargin_right = -20.0\nmargin_bottom = 16.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 2 )\nstretch_mode = 0\n\n[node name=\"OwnedPanel\" type=\"Panel\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.5\nanchor_top = 0.0\nanchor_right = 0.5\nanchor_bottom = 0.0\nmargin_left = -180.0\nmargin_top = 98.0\nmargin_right = 180.0\nmargin_bottom = 158.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\n\n[node name=\"Label\" type=\"Label\" parent=\"OwnedPanel\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 20.0\nmargin_right = -20.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"Available\"\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n\n[node name=\"Count\" type=\"Label\" parent=\"OwnedPanel\" index=\"1\"]\n\nanchor_left = 1.0\nanchor_top = 0.5\nanchor_right = 1.0\nanchor_bottom = 0.5\nmargin_left = -240.0\nmargin_top = -30.0\nmargin_right = -60.0\nmargin_bottom = 30.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ntext = \"4\"\nalign = 2\nvalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n\n[node name=\"PurseIcon\" type=\"TextureRect\" parent=\"OwnedPanel\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 308.0\nmargin_top = 14.0\nmargin_right = 340.0\nmargin_bottom = 46.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 1\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ntexture = ExtResource( 3 )\nstretch_mode = 0\n\n\n"
  },
  {
    "path": "interface/menus/shop/panels/ShopItemsList.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://interface/items/ItemsList.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://interface/menus/shop/popups/AmountPopup.tscn\" type=\"PackedScene\" id=2]\n\n\n[node name=\"ShopItemsList\" instance=ExtResource( 1 )]\n\n[node name=\"AmountPopup\" parent=\".\" index=\"1\" instance=ExtResource( 2 )]\n\nvisible = false\n\n\n"
  },
  {
    "path": "interface/menus/shop/popups/AmountLabel.gd",
    "content": "extends Label\n\nvar _max_value\n\nfunc initialize(value, max_value):\n\t_max_value = max_value\n\tupdate_text(value)\n\nfunc update_text(value):\n\ttext = \"%s/%s\" % [value, _max_value]\n\nfunc _on_HSlider_value_changed(value):\n\tupdate_text(value)\n"
  },
  {
    "path": "interface/menus/shop/popups/AmountPopup.gd",
    "content": "extends Menu\n\nsignal amount_confirmed(value)\n\nonready var popup = $Popup\nonready var slider = $Popup/VBoxContainer/Slider/HSlider\nonready var label = $Popup/VBoxContainer/Slider/Amount\n\n\n\"\"\"args: {value, max_value}\"\"\"\nfunc initialize(args={}):\n\tassert(args.size() == 2)\n\tvar value = args['value']\n\tvar max_value = args['max_value']\n\tlabel.initialize(value, max_value)\n\tslider.initialize(value, max_value)\n\tslider.grab_focus()\n\nfunc open(args={}):\n\tpopup.popup_centered()\n\t.open()\n\tvar amount = yield(self, \"amount_confirmed\")\n\tclose()\n\treturn amount\n\nfunc _input(event):\n\tif event.is_action_pressed(\"ui_cancel\"):\n\t\temit_signal(\"amount_confirmed\", 0)\n\t\taccept_event()\n\telif event.is_action_pressed(\"ui_accept\"):\n\t\temit_signal(\"amount_confirmed\", slider.value)\n\t\taccept_event()\n"
  },
  {
    "path": "interface/menus/shop/popups/AmountPopup.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://interface/menus/shop/popups/AmountPopup.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/menus/MenuSfx.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://interface/default.theme\" type=\"Theme\" id=3]\n[ext_resource path=\"res://interface/menus/shop/popups/HSlider.gd\" type=\"Script\" id=4]\n\n[sub_resource type=\"GDScript\" id=1]\nresource_local_to_scene = true\nscript/source = \"extends Label\n\nvar _max_value\n\nfunc initialize(value, max_value):\n\t_max_value = max_value\n\tupdate_text(value)\n\nfunc _on_HSlider_value_changed(value):\n\tupdate_text(value)\n\nfunc update_text(value):\n\ttext = \\\"%s/%s\\\" % [value, _max_value]\n\"\n\n[node name=\"AmountPopup\" type=\"Control\"]\nmargin_right = 40.0\nmargin_bottom = 40.0\nscript = ExtResource( 1 )\n\n[node name=\"MenuSfx\" parent=\".\" instance=ExtResource( 2 )]\n\n[node name=\"Popup\" type=\"PopupPanel\" parent=\".\"]\nvisible = true\nmargin_right = 300.0\nmargin_bottom = 300.0\nrect_min_size = Vector2( 300, 120 )\ntheme = ExtResource( 3 )\npopup_exclusive = true\n\n[node name=\"VBoxContainer\" type=\"VBoxContainer\" parent=\"Popup\"]\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 2.0\nmargin_top = 2.0\nmargin_right = -2.0\nmargin_bottom = -2.0\n\n[node name=\"Title\" type=\"Label\" parent=\"Popup/VBoxContainer\"]\nmargin_right = 296.0\nmargin_bottom = 60.0\nrect_min_size = Vector2( 0, 60 )\ntext = \"Amount\"\nalign = 1\nvalign = 1\n\n[node name=\"Slider\" type=\"Control\" parent=\"Popup/VBoxContainer\"]\nmargin_top = 76.0\nmargin_right = 296.0\nmargin_bottom = 216.0\nrect_min_size = Vector2( 0, 140 )\n\n[node name=\"Amount\" type=\"Label\" parent=\"Popup/VBoxContainer/Slider\"]\nanchor_right = 1.0\nmargin_top = 34.0\nmargin_bottom = 57.0\ntext = \"6/8\"\nalign = 1\nvalign = 1\nscript = SubResource( 1 )\n\n[node name=\"HSlider\" type=\"HSlider\" parent=\"Popup/VBoxContainer/Slider\"]\nanchor_top = 0.5\nanchor_right = 1.0\nanchor_bottom = 0.5\nmargin_left = 20.0\nmargin_top = -7.0\nmargin_right = -20.0\nmargin_bottom = 9.0\nmax_value = 8.0\nvalue = 6.0\nscript = ExtResource( 4 )\n\n[node name=\"OkButton\" type=\"Button\" parent=\"Popup/VBoxContainer\"]\nmargin_left = 18.0\nmargin_top = 232.0\nmargin_right = 278.0\nmargin_bottom = 272.0\nrect_min_size = Vector2( 260, 40 )\nsize_flags_horizontal = 4\ntext = \"OK\"\n\n[connection signal=\"value_changed\" from=\"Popup/VBoxContainer/Slider/HSlider\" to=\"Popup/VBoxContainer/Slider/Amount\" method=\"_on_HSlider_value_changed\"]\n"
  },
  {
    "path": "interface/menus/shop/popups/HSlider.gd",
    "content": "extends HSlider\n\nfunc initialize(current, maximum):\n\tmax_value = maximum\n\tvalue = current\n"
  },
  {
    "path": "interface/theme/fonts/comfortaa_tips.tres",
    "content": "[gd_resource type=\"DynamicFont\" load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/theme/fonts/Comfortaa-Bold.ttf\" type=\"DynamicFontData\" id=1]\n\n\n[resource]\n\nsize = 22\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 1 )\n_sections_unfolded = [ \"Extra Spacing\", \"Font\", \"Settings\" ]\n\n"
  },
  {
    "path": "interface/theme/fonts/default_font_comfortaa.tres",
    "content": "[gd_resource type=\"DynamicFont\" load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/theme/fonts/Comfortaa-Bold.ttf\" type=\"DynamicFontData\" id=1]\n\n\n[resource]\n\nsize = 30\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 1 )\n\n"
  },
  {
    "path": "interface/theme/fonts/source_code_pro_26.tres",
    "content": "[gd_resource type=\"DynamicFont\" load_steps=2 format=2]\n\n[ext_resource path=\"res://interface/theme/fonts/SourceCodePro-Regular.ttf\" type=\"DynamicFontData\" id=1]\n\n[resource]\n\nsize = 26\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 1 )\n_sections_unfolded = [ \"Font\", \"Settings\" ]\n\n"
  },
  {
    "path": "interface/theme/icons/add.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/add.png-a2d973072fa729536972b5d9b7b2035f.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/add.png\"\ndest_files=[ \"res://.import/add.png-a2d973072fa729536972b5d9b7b2035f.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/cancel.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/cancel.png-037fe98dac59e9a85d5be364d636db68.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/cancel.png\"\ndest_files=[ \"res://.import/cancel.png-037fe98dac59e9a85d5be364d636db68.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/coins.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/coins.png-d3cc02b051752e916d567a271598e8e8.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/coins.png\"\ndest_files=[ \"res://.import/coins.png-d3cc02b051752e916d567a271598e8e8.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/fire_scroll.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/fire_scroll.png-ea84ffcfb65793b96e965f4d5bd34780.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/fire_scroll.png\"\ndest_files=[ \"res://.import/fire_scroll.png-ea84ffcfb65793b96e965f4d5bd34780.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/potion_health.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/potion_health.png-e775c0060582f7b89180f1d376299720.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/potion_health.png\"\ndest_files=[ \"res://.import/potion_health.png-e775c0060582f7b89180f1d376299720.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/potion_mana.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/potion_mana.png-7aa82fe7a278054b00e2e350eab56c9c.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/potion_mana.png\"\ndest_files=[ \"res://.import/potion_mana.png-7aa82fe7a278054b00e2e350eab56c9c.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/purse.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/purse.png-98ac931d0e1f2927c25fc95f9b1cc6af.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/purse.png\"\ndest_files=[ \"res://.import/purse.png-98ac931d0e1f2927c25fc95f9b1cc6af.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/remove.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/remove.png-0d204696e7aa93085028f1e68e1459d2.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/remove.png\"\ndest_files=[ \"res://.import/remove.png-0d204696e7aa93085028f1e68e1459d2.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "interface/theme/icons/sword.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/sword.png-217a5d3b34aaecc05313ecaf68a75610.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://interface/theme/icons/sword.png\"\ndest_files=[ \"res://.import/sword.png-217a5d3b34aaecc05313ecaf68a75610.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "levels/Cave.tscn",
    "content": "[gd_scene load_steps=10 format=2]\n\n[ext_resource path=\"res://core/world/tilesets/cave/cave.tres\" type=\"TileSet\" id=1]\n[ext_resource path=\"res://monsters/BossShakingCamera.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://core/world/PlayerSpawningPoint.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://core/world/Door.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://core/world/pit.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://monsters/bosses/wild_boar/WildBoar.tscn\" type=\"PackedScene\" id=6]\n[ext_resource path=\"res://actors/CoinsFountain.tscn\" type=\"PackedScene\" id=7]\n\n[sub_resource type=\"GDScript\" id=1]\n\nscript/source = \"extends \\\"res://levels/Level.gd\\\"\n\nonready var camera = $BossShakingCamera\nonready var wild_boar = $YSort/WildBoar\n\nconst PlayerController = preload(\\\"res://actors/player/PlayerController.gd\\\")\n\nfunc _ready():\n\tcamera.current = true\n\nfunc _on_CameraTrigger_body_entered(body):\n\tassert(body is PlayerController)\n\tcamera.initialize(body)\n\tyield(camera.move_to_room_center(), \\\"completed\\\")\n\twild_boar.start()\n\nfunc _on_WildBoar_died():\n\t$Door.set_active(true)\n\"\n\n[sub_resource type=\"GDScript\" id=2]\n\nscript/source = \"extends Area2D\n\nfunc _on_body_entered(body):\n\tqueue_free()\n\"\n\n[node name=\"Cave\" type=\"TileMap\" index=\"0\"]\n\nposition = Vector2( 0, 32 )\nmode = 0\ntile_set = ExtResource( 1 )\ncell_size = Vector2( 128, 128 )\ncell_quadrant_size = 16\ncell_custom_transform = Transform2D( 1, 0, 0, 1, 0, 0 )\ncell_half_offset = 2\ncell_tile_origin = 0\ncell_y_sort = false\ncell_clip_uv = false\ncollision_use_kinematic = false\ncollision_friction = 1.0\ncollision_bounce = 0.0\ncollision_layer = 2\ncollision_mask = 1\noccluder_light_mask = 1\nformat = 1\ntile_data = PoolIntArray( 1, 0, 0, 2, 0, 1, 3, 0, 1, 4, 0, 1, 5, 0, 1, 6, 0, 1, 7, 0, 1, 8, 0, 1, 9, 0, 1, 10, 0, 1, 11, 0, 1, 12, 0, 1, 13, 0, 2, 65537, 0, 65536, 65538, 0, 65537, 65539, 0, 65537, 65540, 0, 65537, 65541, 0, 65537, 65542, 0, 65537, 65543, 0, 65537, 65544, 0, 65537, 65545, 0, 65537, 65546, 0, 65537, 65547, 0, 65537, 65548, 0, 65537, 65549, 0, 65538, 131073, 0, 65536, 131074, 0, 65537, 131075, 0, 65537, 131076, 0, 65537, 131077, 0, 65537, 131078, 0, 65537, 131079, 0, 65537, 131080, 0, 65537, 131081, 0, 65537, 131082, 0, 65537, 131083, 0, 65537, 131084, 0, 65537, 131085, 0, 65538, 196609, 0, 65536, 196610, 0, 65537, 196611, 0, 65537, 196612, 0, 65537, 196613, 0, 65537, 196614, 0, 65537, 196615, 0, 65537, 196616, 0, 65537, 196617, 0, 65537, 196618, 0, 65537, 196619, 0, 65537, 196620, 0, 65537, 196621, 0, 65538, 262145, 0, 65536, 262146, 0, 65537, 262147, 0, 65537, 262148, 0, 65537, 262149, 0, 65537, 262150, 0, 65537, 262151, 0, 65537, 262152, 0, 65537, 262153, 0, 65537, 262154, 0, 65537, 262155, 0, 65537, 262156, 0, 65537, 262157, 0, 65538, 327681, 0, 65536, 327682, 0, 65537, 327683, 0, 65537, 327684, 0, 65537, 327685, 0, 65537, 327686, 0, 65537, 327687, 0, 65537, 327688, 0, 65537, 327689, 0, 65537, 327690, 0, 65537, 327691, 0, 65537, 327692, 0, 65537, 327693, 0, 65538, 393217, 0, 65536, 393218, 0, 65537, 393219, 0, 65537, 393220, 0, 65537, 393221, 0, 65537, 393222, 0, 65537, 393223, 0, 65537, 393224, 0, 65537, 393225, 0, 65537, 393226, 0, 65537, 393227, 0, 65537, 393228, 0, 65537, 393229, 0, 65538, 458753, 0, 131072, 458754, 0, 131073, 458755, 0, 131073, 458756, 0, 131073, 458757, 0, 131073, 458758, 0, 4, 458759, 0, 65537, 458760, 0, 3, 458761, 0, 131073, 458762, 0, 131073, 458763, 0, 131073, 458764, 0, 131073, 458765, 0, 131074, 524294, 0, 65536, 524295, 0, 65537, 524296, 0, 65538, 589830, 0, 65536, 589831, 0, 65537, 589832, 0, 65539, 589833, 0, 2, 655366, 0, 65536, 655367, 0, 65537, 655368, 0, 3, 655369, 0, 131074, 720902, 0, 65536, 720903, 0, 65537, 720904, 0, 65538, 786437, 0, 0, 786438, 0, 65540, 786439, 0, 65537, 786440, 0, 65538, 851973, 0, 131072, 851974, 0, 4, 851975, 0, 65537, 851976, 0, 65538, 917510, 0, 65536, 917511, 0, 65537, 917512, 0, 65538, 983046, 0, 65536, 983047, 0, 65537, 983048, 0, 65538, 1048582, 0, 65536, 1048583, 0, 65537, 1048584, 0, 65538, 1114118, 0, 65536, 1114119, 0, 65537, 1114120, 0, 65538, 1179654, 0, 65536, 1179655, 0, 65537, 1179656, 0, 65538, 1245190, 0, 65536, 1245191, 0, 65537, 1245192, 0, 65538, 1310724, 0, 0, 1310725, 0, 1, 1310726, 0, 65540, 1310727, 0, 65537, 1310728, 0, 65539, 1310729, 0, 1, 1310730, 0, 2, 1376260, 0, 65536, 1376261, 0, 65537, 1376262, 0, 65537, 1376263, 0, 65537, 1376264, 0, 65537, 1376265, 0, 65537, 1376266, 0, 65538, 1441796, 0, 65536, 1441797, 0, 65537, 1441798, 0, 65537, 1441799, 0, 65537, 1441800, 0, 65537, 1441801, 0, 65537, 1441802, 0, 65538, 1507332, 0, 65536, 1507333, 0, 65537, 1507334, 0, 65537, 1507335, 0, 65537, 1507336, 0, 65537, 1507337, 0, 65537, 1507338, 0, 65538, 1572868, 0, 131072, 1572869, 0, 131073, 1572870, 0, 131073, 1572871, 0, 131073, 1572872, 0, 131073, 1572873, 0, 131073, 1572874, 0, 131074 )\nscript = SubResource( 1 )\n_sections_unfolded = [ \"Cell\", \"Collision\", \"Transform\" ]\n__meta__ = {\n\"_edit_lock_\": true\n}\nfog = true\n\n[node name=\"BossShakingCamera\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\nposition = Vector2( 960, 408 )\ncurrent = false\n\n[node name=\"CameraTrigger\" type=\"Area2D\" parent=\".\" index=\"1\"]\n\neditor/display_folded = true\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitorable = false\ncollision_layer = 0\naudio_bus_override = false\naudio_bus_name = \"Master\"\nscript = SubResource( 2 )\n_sections_unfolded = [ \"Collision\" ]\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\"CameraTrigger\" index=\"0\"]\n\nbuild_mode = 0\npolygon = PoolVector2Array( 768, 896, 1152, 896, 1152, 1024, 768, 1024 )\n\n[node name=\"PlayerSpawningPoint\" parent=\".\" index=\"2\" instance=ExtResource( 3 )]\n\nposition = Vector2( 960, 2912 )\n\n[node name=\"Door\" parent=\".\" index=\"3\" instance=ExtResource( 4 )]\n\neditor/display_folded = true\nvisible = false\nposition = Vector2( 1570, 208 )\nmap_path = \"res://levels/Grasslands.tscn\"\nACTIVE_AT_START = false\n\n[node name=\"Stairs\" parent=\"Door\" index=\"0\"]\n\ntexture = ExtResource( 5 )\n\n[node name=\"YSort\" type=\"YSort\" parent=\".\" index=\"4\"]\n\nsort_enabled = true\n\n[node name=\"WildBoar\" parent=\"YSort\" index=\"0\" instance=ExtResource( 6 )]\n\nposition = Vector2( 970, 528 )\n\n[node name=\"CoinsFountain\" parent=\"YSort\" index=\"1\" instance=ExtResource( 7 )]\n\nposition = Vector2( 970, 528 )\nMAX_SPAWN_COUNT = 16\n\n[connection signal=\"body_entered\" from=\"CameraTrigger\" to=\".\" method=\"_on_CameraTrigger_body_entered\"]\n\n[connection signal=\"body_entered\" from=\"CameraTrigger\" to=\"CameraTrigger\" method=\"_on_body_entered\"]\n\n[connection signal=\"died\" from=\"YSort/WildBoar\" to=\".\" method=\"_on_WildBoar_died\"]\n\n[connection signal=\"died\" from=\"YSort/WildBoar\" to=\"YSort/CoinsFountain\" method=\"start\"]\n\n[connection signal=\"hit_wall\" from=\"YSort/WildBoar\" to=\"BossShakingCamera\" method=\"_on_WildBoar_hit_wall\"]\n\n\n[editable path=\"Door\"]\n"
  },
  {
    "path": "levels/Grasslands.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://levels/Level.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://core/world/tilesets/outdoor/outdoor.tres\" type=\"TileSet\" id=2]\n[ext_resource path=\"res://core/world/Gap.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://monsters/porcupine/Porcupine.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://monsters/mosquito/Nest.tscn\" type=\"PackedScene\" id=5]\n[ext_resource path=\"res://actors/characters/seller/Seller.tscn\" type=\"PackedScene\" id=6]\n[ext_resource path=\"res://core/world/PlayerSpawningPoint.tscn\" type=\"PackedScene\" id=7]\n[ext_resource path=\"res://core/world/Door.tscn\" type=\"PackedScene\" id=8]\n\n[node name=\"Grasslands\" type=\"Node2D\" index=\"0\"]\n\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Cell\", \"Collision\" ]\nfog = false\n\n[node name=\"Ground\" type=\"TileMap\" parent=\".\" index=\"0\"]\n\nmode = 0\ntile_set = ExtResource( 2 )\ncell_size = Vector2( 128, 128 )\ncell_quadrant_size = 16\ncell_custom_transform = Transform2D( 1, 0, 0, 1, 0, 0 )\ncell_half_offset = 2\ncell_tile_origin = 0\ncell_y_sort = false\ncell_clip_uv = false\ncollision_use_kinematic = false\ncollision_friction = 1.0\ncollision_bounce = 0.0\ncollision_layer = 1\ncollision_mask = 1\noccluder_light_mask = 1\nformat = 1\ntile_data = PoolIntArray( 0, 0, 65536, 1, 0, 65536, 2, 0, 65536, 3, 0, 65536, 4, 0, 65536, 5, 0, 65536, 6, 0, 65536, 7, 0, 65536, 8, 0, 65536, 9, 0, 65536, 10, 0, 65536, 11, 0, 65536, 12, 0, 65536, 13, 0, 65536, 14, 0, 65536, 15, 0, 65536, 16, 0, 65536, 17, 0, 65536, 18, 0, 65536, 19, 0, 65536, 20, 0, 65536, 21, 0, 65536, 22, 0, 65536, 23, 0, 65536, 24, 0, 65536, 25, 0, 65536, 26, 0, 65536, 27, 0, 65536, 28, 0, 65536, 29, 0, 65536, 30, 0, 65536, 31, 0, 65536, 32, 0, 65536, 33, 0, 65536, 34, 0, 65536, 35, 0, 65536, 36, 0, 65536, 37, 0, 65536, 38, 0, 65536, 39, 0, 65536, 40, 0, 65536, 41, 0, 65536, 42, 0, 65536, 43, 0, 65536, 44, 0, 65536, 45, 0, 65536, 46, 0, 65536, 65536, 0, 65536, 65537, 0, 65536, 65538, 0, 2, 65539, 0, 65536, 65540, 0, 65536, 65541, 0, 65536, 65542, 0, 65536, 65543, 1, 0, 65544, 1, 1, 65545, 1, 1, 65546, 1, 1, 65547, 1, 1, 65548, 1, 1, 65549, 1, 1, 65550, 1, 1, 65551, 1, 1, 65552, 1, 1, 65553, 1, 1, 65554, 1, 1, 65555, 1, 2, 65556, 0, 65536, 65557, 0, 0, 65558, 0, 65536, 65559, 0, 65536, 65560, 0, 65536, 65561, 0, 0, 65562, 0, 65536, 65563, 0, 65536, 65564, 0, 0, 65565, 0, 65536, 65566, 0, 65536, 65567, 0, 65536, 65568, 0, 0, 65569, 0, 2, 65570, 0, 65536, 65571, 0, 65536, 65572, 0, 65536, 65573, 0, 65536, 65574, 0, 65536, 65575, 0, 65536, 65576, 0, 65536, 65577, 0, 65536, 65578, 0, 65536, 65579, 0, 65536, 65580, 0, 65536, 65581, 0, 65536, 65582, 0, 65536, 131072, 0, 65536, 131073, 0, 65536, 131074, 0, 65536, 131075, 0, 65536, 131076, 1, 0, 131077, 1, 1, 131078, 1, 1, 131079, 1, 65540, 131080, 1, 65537, 131081, 1, 65537, 131082, 1, 65537, 131083, 1, 65537, 131084, 1, 65537, 131085, 1, 65537, 131086, 1, 65537, 131087, 1, 65537, 131088, 1, 65537, 131089, 1, 65537, 131090, 1, 65537, 131091, 1, 65538, 131092, 0, 65536, 131093, 0, 65536, 131094, 0, 0, 131095, 0, 65536, 131096, 0, 65536, 131097, 0, 65536, 131098, 0, 65536, 131099, 0, 65536, 131100, 0, 65536, 131101, 0, 65536, 131102, 0, 65536, 131103, 0, 65536, 131104, 0, 65536, 131105, 0, 65536, 131106, 0, 65536, 131107, 0, 65536, 131108, 0, 65536, 131109, 0, 65536, 131110, 0, 65536, 131111, 0, 65536, 131112, 0, 65536, 131113, 0, 65536, 131114, 0, 65536, 131115, 0, 65536, 131116, 0, 65536, 131117, 0, 65536, 131118, 0, 65536, 196608, 0, 65536, 196609, 0, 65536, 196610, 0, 65536, 196611, 0, 65536, 196612, 1, 65536, 196613, 1, 65537, 196614, 1, 65537, 196615, 1, 65537, 196616, 1, 65537, 196617, 1, 65537, 196618, 1, 65537, 196619, 1, 65537, 196620, 1, 65537, 196621, 1, 65537, 196622, 1, 65537, 196623, 1, 65537, 196624, 1, 65537, 196625, 1, 65537, 196626, 1, 65537, 196627, 1, 65538, 196628, 0, 65536, 196629, 0, 65536, 196630, 0, 2, 196631, 0, 65536, 196632, 0, 65536, 196633, 0, 65536, 196634, 0, 65536, 196635, 0, 65536, 196636, 0, 65536, 196637, 0, 65536, 196638, 0, 65536, 196639, 0, 65536, 196640, 0, 65536, 196641, 0, 65536, 196642, 0, 65536, 196643, 0, 65536, 196644, 0, 65536, 196645, 0, 65536, 196646, 0, 65536, 196647, 0, 65536, 196648, 0, 65536, 196649, 0, 65536, 196650, 0, 65536, 196651, 0, 65536, 196652, 0, 65536, 196653, 0, 65536, 196654, 0, 65536, 262144, 0, 65536, 262145, 0, 65536, 262146, 0, 65536, 262147, 1, 0, 262148, 1, 65540, 262149, 1, 65537, 262150, 1, 65537, 262151, 1, 65537, 262152, 1, 65537, 262153, 1, 65537, 262154, 1, 65537, 262155, 1, 65537, 262156, 1, 65537, 262157, 1, 65537, 262158, 1, 65537, 262159, 1, 65537, 262160, 1, 65537, 262161, 1, 65537, 262162, 1, 65537, 262163, 1, 65538, 262164, 0, 65536, 262165, 0, 65536, 262166, 0, 65536, 262167, 0, 65536, 262168, 0, 65536, 262169, 0, 65536, 262170, 0, 65536, 262171, 0, 65536, 262172, 0, 65536, 262173, 0, 65536, 262174, 0, 65536, 262175, 0, 65536, 262176, 0, 65536, 262177, 0, 65536, 262178, 0, 65536, 262179, 0, 65536, 262180, 0, 65536, 262181, 0, 65536, 262182, 0, 65536, 262183, 0, 65536, 262184, 0, 65536, 262185, 0, 65536, 262186, 0, 0, 262187, 0, 65536, 262188, 0, 65536, 262189, 0, 65536, 262190, 0, 65536, 327680, 0, 65536, 327681, 0, 65536, 327682, 0, 65536, 327683, 1, 65536, 327684, 1, 65537, 327685, 1, 65537, 327686, 1, 65537, 327687, 1, 65537, 327688, 1, 65537, 327689, 1, 196609, 327690, 1, 65537, 327691, 1, 65537, 327692, 1, 65537, 327693, 1, 65537, 327694, 1, 65537, 327695, 1, 65537, 327696, 1, 65537, 327697, 1, 65537, 327698, 1, 65537, 327699, 1, 65538, 327700, 0, 65536, 327701, 0, 0, 327702, 0, 65536, 327703, 0, 0, 327704, 0, 65536, 327705, 0, 65536, 327706, 0, 65536, 327707, 0, 65536, 327708, 0, 65536, 327709, 0, 65536, 327710, 0, 65536, 327711, 0, 65536, 327712, 0, 65536, 327713, 0, 65536, 327714, 0, 65536, 327715, 0, 65536, 327716, 0, 65536, 327717, 0, 65536, 327718, 0, 65536, 327719, 0, 65536, 327720, 0, 65536, 327721, 0, 65536, 327722, 0, 65536, 327723, 0, 65536, 327724, 0, 65536, 327725, 0, 2, 327726, 0, 65536, 393216, 0, 65536, 393217, 0, 65536, 393218, 1, 0, 393219, 1, 65540, 393220, 1, 65537, 393221, 1, 65537, 393222, 1, 65537, 393223, 1, 65537, 393224, 1, 65537, 393225, 1, 65537, 393226, 1, 65537, 393227, 1, 65537, 393228, 1, 65537, 393229, 1, 65537, 393230, 1, 65537, 393231, 1, 65537, 393232, 1, 65537, 393233, 1, 65537, 393234, 1, 65537, 393235, 1, 65538, 393236, 0, 65536, 393237, 0, 65536, 393238, 0, 65536, 393239, 0, 65536, 393240, 0, 65536, 393241, 0, 65536, 393242, 0, 65536, 393243, 0, 65536, 393244, 0, 65536, 393245, 0, 65536, 393246, 0, 65536, 393247, 0, 65536, 393248, 0, 0, 393249, 0, 65536, 393250, 0, 65536, 393251, 0, 65536, 393252, 0, 65536, 393253, 0, 2, 393254, 0, 65536, 393255, 0, 65536, 393256, 0, 65536, 393257, 0, 65536, 393258, 0, 65536, 393259, 0, 65536, 393260, 0, 65536, 393261, 0, 65536, 393262, 0, 65536, 458752, 0, 65536, 458753, 0, 65536, 458754, 1, 65536, 458755, 1, 65537, 458756, 1, 65537, 458757, 1, 65537, 458758, 1, 65537, 458759, 1, 65537, 458760, 1, 65537, 458761, 1, 65537, 458762, 1, 65537, 458763, 1, 65537, 458764, 1, 65537, 458765, 1, 65537, 458766, 1, 65537, 458767, 1, 65537, 458768, 1, 65537, 458769, 1, 65537, 458770, 1, 65537, 458771, 1, 65538, 458772, 0, 65536, 458773, 0, 65536, 458774, 0, 65536, 458775, 0, 65536, 458776, 0, 65536, 458777, 0, 65536, 458778, 0, 65536, 458779, 0, 65536, 458780, 0, 65536, 458781, 0, 65536, 458782, 0, 65536, 458783, 0, 65536, 458784, 0, 65536, 458785, 0, 65536, 458786, 0, 65536, 458787, 0, 65536, 458788, 0, 65536, 458789, 0, 65536, 458790, 0, 65536, 458791, 0, 65536, 458792, 0, 65536, 458793, 0, 65536, 458794, 0, 65536, 458795, 0, 65536, 458796, 0, 65536, 458797, 0, 65536, 458798, 0, 65536, 524288, 0, 65536, 524289, 1, 0, 524290, 1, 65540, 524291, 1, 65537, 524292, 1, 65537, 524293, 1, 65537, 524294, 1, 65537, 524295, 1, 65537, 524296, 1, 65537, 524297, 1, 65537, 524298, 1, 65537, 524299, 1, 65537, 524300, 1, 65537, 524301, 1, 65537, 524302, 1, 65537, 524303, 1, 65537, 524304, 1, 65537, 524305, 1, 65537, 524306, 1, 65537, 524307, 1, 65539, 524308, 1, 1, 524309, 1, 1, 524310, 1, 2, 524311, 0, 65536, 524312, 0, 65536, 524313, 0, 65536, 524314, 0, 2, 524315, 0, 65536, 524316, 0, 65536, 524317, 0, 65536, 524318, 0, 65536, 524319, 0, 65536, 524320, 0, 1, 524321, 0, 65536, 524322, 0, 65536, 524323, 0, 65536, 524324, 0, 65536, 524325, 0, 65536, 524326, 0, 65536, 524327, 0, 65536, 524328, 0, 65536, 524329, 0, 65536, 524330, 0, 65536, 524331, 0, 65536, 524332, 0, 65536, 524333, 0, 65536, 524334, 0, 65536, 589824, 0, 65536, 589825, 1, 65536, 589826, 1, 65537, 589827, 1, 65537, 589828, 1, 65537, 589829, 1, 65537, 589830, 1, 65537, 589831, 1, 65537, 589832, 1, 65537, 589833, 1, 65537, 589834, 1, 65537, 589835, 1, 65537, 589836, 1, 65537, 589837, 1, 65537, 589838, 1, 65537, 589839, 1, 196609, 589840, 1, 65537, 589841, 1, 65537, 589842, 1, 65537, 589843, 1, 65537, 589844, 1, 65537, 589845, 1, 65537, 589846, 1, 65538, 589847, 0, 65536, 589848, 0, 65536, 589849, 0, 65536, 589850, 0, 65536, 589851, 0, 65536, 589852, 0, 65536, 589853, 0, 65536, 589854, 0, 65536, 589855, 0, 65536, 589856, 0, 65536, 589857, 0, 65536, 589858, 5, 0, 589859, 5, 1, 589860, 5, 1, 589861, 5, 1, 589862, 5, 1, 589863, 5, 2, 589864, 0, 65536, 589865, 0, 65536, 589866, 0, 0, 589867, 0, 65536, 589868, 0, 65536, 589869, 0, 65536, 589870, 0, 65536, 655360, 0, 65536, 655361, 1, 65536, 655362, 1, 65537, 655363, 1, 196610, 655364, 1, 65537, 655365, 1, 65537, 655366, 1, 65537, 655367, 1, 65537, 655368, 1, 65537, 655369, 1, 65537, 655370, 1, 65537, 655371, 1, 65537, 655372, 1, 65537, 655373, 1, 65537, 655374, 1, 65537, 655375, 1, 65537, 655376, 1, 65537, 655377, 1, 3, 655378, 1, 131073, 655379, 1, 131073, 655380, 1, 131073, 655381, 1, 131073, 655382, 1, 131074, 655383, 0, 65536, 655384, 0, 0, 655385, 0, 65536, 655386, 0, 65536, 655387, 0, 65536, 655388, 0, 65536, 655389, 0, 65536, 655390, 0, 65536, 655391, 0, 65536, 655392, 0, 65536, 655393, 0, 65536, 655394, 5, 131072, 655395, 5, 4, 655396, 5, 65537, 655397, 5, 65537, 655398, 5, 65537, 655399, 5, 65538, 655400, 0, 65536, 655401, 0, 65536, 655402, 0, 65536, 655403, 0, 65536, 655404, 0, 65536, 655405, 0, 65536, 655406, 0, 65536, 720896, 0, 65536, 720897, 1, 65536, 720898, 1, 65537, 720899, 1, 65537, 720900, 1, 65537, 720901, 1, 65537, 720902, 1, 65537, 720903, 1, 65537, 720904, 1, 65537, 720905, 1, 65537, 720906, 1, 196608, 720907, 1, 65537, 720908, 1, 65537, 720909, 1, 65537, 720910, 1, 65537, 720911, 1, 65537, 720912, 1, 65537, 720913, 1, 65538, 720914, 0, 65536, 720915, 0, 65536, 720916, 0, 65536, 720917, 0, 65536, 720918, 0, 65536, 720919, 0, 65536, 720920, 0, 65536, 720921, 0, 65536, 720922, 0, 65536, 720923, 0, 65536, 720924, 0, 65536, 720925, 0, 65536, 720926, 0, 65536, 720927, 0, 65536, 720928, 0, 65536, 720929, 0, 65536, 720930, 0, 65536, 720931, 5, 65536, 720932, 5, 65537, 720933, 5, 65537, 720934, 5, 65537, 720935, 5, 65539, 720936, 5, 1, 720937, 5, 2, 720938, 0, 65536, 720939, 0, 65536, 720940, 0, 65536, 720941, 0, 2, 720942, 0, 65536, 786432, 0, 65536, 786433, 1, 65536, 786434, 1, 65537, 786435, 1, 65537, 786436, 1, 65537, 786437, 1, 65537, 786438, 1, 196609, 786439, 1, 65537, 786440, 1, 65537, 786441, 1, 65537, 786442, 1, 65537, 786443, 1, 3, 786444, 1, 131073, 786445, 1, 131073, 786446, 1, 131073, 786447, 1, 4, 786448, 1, 65537, 786449, 1, 65538, 786450, 0, 65536, 786451, 0, 65536, 786452, 0, 65536, 786453, 0, 65536, 786454, 0, 65536, 786455, 0, 65536, 786456, 0, 65536, 786457, 0, 65536, 786458, 0, 65536, 786459, 0, 65536, 786460, 0, 65536, 786461, 0, 65536, 786462, 0, 65536, 786463, 0, 65536, 786464, 0, 65536, 786465, 0, 65536, 786466, 0, 65536, 786467, 5, 131072, 786468, 5, 131073, 786469, 5, 131073, 786470, 5, 4, 786471, 5, 65537, 786472, 5, 65537, 786473, 5, 65538, 786474, 0, 65536, 786475, 0, 65536, 786476, 0, 65536, 786477, 0, 65536, 786478, 0, 65536, 851968, 0, 65536, 851969, 1, 65536, 851970, 1, 65537, 851971, 1, 65537, 851972, 1, 65537, 851973, 1, 65537, 851974, 1, 65537, 851975, 1, 65537, 851976, 1, 65537, 851977, 1, 65537, 851978, 1, 65537, 851979, 1, 65538, 851980, 0, 65536, 851981, 0, 65536, 851982, 0, 65536, 851983, 1, 65536, 851984, 1, 65537, 851985, 1, 65538, 851986, 0, 65536, 851987, 0, 65536, 851988, 0, 65536, 851989, 0, 65536, 851990, 0, 65536, 851991, 0, 65536, 851992, 0, 65536, 851993, 0, 65536, 851994, 0, 65536, 851995, 0, 65536, 851996, 0, 65536, 851997, 0, 65536, 851998, 0, 0, 851999, 0, 65536, 852000, 0, 65536, 852001, 0, 65536, 852002, 0, 65536, 852003, 0, 65536, 852004, 0, 65536, 852005, 0, 65536, 852006, 5, 131072, 852007, 5, 131073, 852008, 5, 131073, 852009, 5, 131074, 852010, 0, 65536, 852011, 0, 65536, 852012, 0, 65536, 852013, 0, 65536, 852014, 0, 65536, 917504, 0, 65536, 917505, 1, 131072, 917506, 1, 131073, 917507, 1, 131073, 917508, 1, 131073, 917509, 1, 131073, 917510, 1, 131073, 917511, 1, 131073, 917512, 1, 131073, 917513, 1, 131073, 917514, 1, 131073, 917515, 1, 131074, 917516, 0, 65536, 917517, 0, 65536, 917518, 0, 65536, 917519, 1, 131072, 917520, 1, 131073, 917521, 1, 131074, 917522, 0, 65536, 917523, 0, 65536, 917524, 0, 65536, 917525, 0, 65536, 917526, 0, 65536, 917527, 0, 65536, 917528, 0, 65536, 917529, 0, 65536, 917530, 0, 65536, 917531, 0, 65536, 917532, 0, 0, 917533, 0, 2, 917534, 0, 65536, 917535, 0, 0, 917536, 0, 65536, 917537, 0, 65536, 917538, 0, 65536, 917539, 0, 65536, 917540, 0, 65536, 917541, 0, 65536, 917542, 0, 65536, 917543, 0, 65536, 917544, 0, 65536, 917545, 0, 65536, 917546, 0, 65536, 917547, 0, 65536, 917548, 0, 65536, 917549, 0, 65536, 917550, 0, 65536, 983040, 0, 65536, 983041, 0, 65536, 983042, 0, 65536, 983043, 0, 65536, 983044, 0, 65536, 983045, 0, 65536, 983046, 0, 65536, 983047, 0, 65536, 983048, 0, 65536, 983049, 0, 65536, 983050, 0, 65536, 983051, 0, 65536, 983052, 0, 65536, 983053, 0, 65536, 983054, 0, 65536, 983055, 0, 65536, 983056, 0, 65536, 983057, 0, 65536, 983058, 0, 65536, 983059, 0, 65536, 983060, 0, 65536, 983061, 0, 65536, 983062, 0, 65536, 983063, 0, 65536, 983064, 0, 65536, 983065, 0, 65536, 983066, 0, 65536, 983067, 0, 65536, 983068, 0, 65536, 983069, 0, 65536, 983070, 0, 65536, 983071, 0, 65536, 983072, 0, 65536, 983073, 0, 65536, 983074, 0, 65536, 983075, 0, 65536, 983076, 0, 0, 983077, 0, 65536, 983078, 0, 65536, 983079, 0, 65536, 983080, 0, 65536, 983081, 0, 65536, 983082, 0, 65536, 983083, 0, 65536, 983084, 0, 65536, 983085, 0, 65536, 983086, 0, 65536, 1048576, 0, 65536, 1048577, 0, 65536, 1048578, 0, 2, 1048579, 0, 65536, 1048580, 0, 65536, 1048581, 0, 1, 1048582, 0, 65536, 1048583, 0, 65536, 1048584, 0, 65536, 1048585, 0, 65536, 1048586, 0, 65536, 1048587, 0, 65536, 1048588, 0, 65536, 1048589, 0, 65536, 1048590, 0, 65536, 1048591, 0, 65536, 1048592, 0, 65536, 1048593, 0, 65536, 1048594, 0, 65536, 1048595, 0, 1, 1048596, 0, 1, 1048597, 0, 65536, 1048598, 0, 65536, 1048599, 0, 65536, 1048600, 0, 65536, 1048601, 0, 0, 1048602, 0, 65536, 1048603, 0, 65536, 1048604, 0, 65536, 1048605, 0, 65536, 1048606, 0, 65536, 1048607, 0, 2, 1048608, 0, 65536, 1048609, 0, 65536, 1048610, 0, 65536, 1048611, 0, 65536, 1048612, 0, 65536, 1048613, 0, 65536, 1048614, 0, 65536, 1048615, 0, 65536, 1048616, 0, 65536, 1048617, 0, 65536, 1048618, 0, 65536, 1048619, 0, 65536, 1048620, 0, 65536, 1048621, 0, 65536, 1048622, 0, 65536, 1114112, 0, 65536, 1114113, 0, 65536, 1114114, 0, 65536, 1114115, 0, 65536, 1114116, 0, 65536, 1114117, 0, 65536, 1114118, 0, 65536, 1114119, 0, 65536, 1114120, 0, 65536, 1114121, 0, 65536, 1114122, 0, 65536, 1114123, 0, 65536, 1114124, 0, 65536, 1114125, 0, 65536, 1114126, 0, 65536, 1114127, 0, 65536, 1114128, 0, 0, 1114129, 0, 65536, 1114130, 0, 0, 1114131, 0, 65536, 1114132, 0, 65536, 1114133, 0, 65536, 1114134, 0, 0, 1114135, 0, 65536, 1114136, 0, 0, 1114137, 0, 65536, 1114138, 0, 1, 1114139, 0, 65536, 1114140, 0, 65536, 1114141, 0, 65536, 1114142, 0, 0, 1114143, 0, 65536, 1114144, 0, 65536, 1114145, 0, 65536, 1114146, 0, 65536, 1114147, 0, 65536, 1114148, 0, 65536, 1114149, 0, 65536, 1114150, 0, 65536, 1114151, 0, 65536, 1114152, 0, 65536, 1114153, 0, 65536, 1114154, 0, 65536, 1114155, 0, 65536, 1114156, 0, 65536, 1114157, 0, 65536, 1114158, 0, 65536, 1179648, 0, 65536, 1179649, 0, 65536, 1179650, 0, 65536, 1179651, 0, 65536, 1179652, 0, 65536, 1179653, 0, 65536, 1179654, 0, 65536, 1179655, 0, 65536, 1179656, 0, 65536, 1179657, 0, 65536, 1179658, 0, 65536, 1179659, 0, 65536, 1179660, 0, 65536, 1179661, 0, 65536, 1179662, 0, 65536, 1179663, 0, 65536, 1179664, 0, 65536, 1179665, 0, 65536, 1179666, 0, 65536, 1179667, 0, 65536, 1179668, 0, 65536, 1179669, 0, 65536, 1179670, 0, 65536, 1179671, 0, 65536, 1179672, 0, 65536, 1179673, 0, 65536, 1179674, 0, 65536, 1179675, 0, 65536, 1179676, 0, 65536, 1179677, 0, 65536, 1179678, 0, 65536, 1179679, 0, 65536, 1179680, 0, 65536, 1179681, 0, 65536, 1179682, 0, 65536, 1179683, 0, 65536, 1179684, 0, 65536, 1179685, 0, 65536, 1179686, 0, 65536, 1179687, 0, 65536, 1179688, 0, 65536, 1179689, 0, 0, 1179690, 0, 2, 1179691, 0, 65536, 1179692, 0, 65536, 1179693, 0, 65536, 1179694, 0, 65536, 1245184, 0, 65536, 1245185, 0, 65536, 1245186, 0, 65536, 1245187, 0, 65536, 1245188, 0, 65536, 1245189, 0, 65536, 1245190, 0, 65536, 1245191, 0, 65536, 1245192, 0, 65536, 1245193, 0, 65536, 1245194, 0, 65536, 1245195, 0, 65536, 1245196, 0, 65536, 1245197, 0, 65536, 1245198, 0, 65536, 1245199, 0, 65536, 1245200, 0, 65536, 1245201, 0, 65536, 1245202, 0, 65536, 1245203, 0, 0, 1245204, 0, 65536, 1245205, 0, 65536, 1245206, 0, 65536, 1245207, 0, 65536, 1245208, 0, 65536, 1245209, 0, 65536, 1245210, 0, 65536, 1245211, 0, 65536, 1245212, 0, 65536, 1245213, 0, 65536, 1245214, 0, 65536, 1245215, 0, 1, 1245216, 0, 65536, 1245217, 0, 65536, 1245218, 0, 65536, 1245219, 0, 65536, 1245220, 0, 65536, 1245221, 0, 65536, 1245222, 0, 65536, 1245223, 0, 65536, 1245224, 0, 65536, 1245225, 0, 65536, 1245226, 0, 65536, 1245227, 0, 65536, 1245228, 0, 65536, 1245229, 0, 65536, 1245230, 0, 65536, 1310720, 0, 65536, 1310721, 0, 65536, 1310722, 0, 65536, 1310723, 0, 65536, 1310724, 0, 65536, 1310725, 0, 0, 1310726, 0, 65536, 1310727, 0, 65536, 1310728, 0, 65536, 1310729, 0, 1, 1310730, 0, 65536, 1310731, 0, 65536, 1310732, 0, 65536, 1310733, 0, 65536, 1310734, 0, 2, 1310735, 0, 65536, 1310736, 0, 65536, 1310737, 0, 65536, 1310738, 0, 65536, 1310739, 0, 65536, 1310740, 0, 65536, 1310741, 0, 65536, 1310742, 0, 65536, 1310743, 0, 65536, 1310744, 0, 65536, 1310745, 0, 65536, 1310746, 0, 65536, 1310747, 0, 65536, 1310748, 0, 65536, 1310749, 0, 65536, 1310750, 0, 0, 1310751, 0, 65536, 1310752, 0, 65536, 1310753, 0, 65536, 1310754, 0, 65536, 1310755, 0, 1, 1310756, 0, 65536, 1310757, 0, 65536, 1310758, 0, 0, 1310759, 0, 65536, 1310760, 0, 65536, 1310761, 0, 65536, 1310762, 0, 65536, 1310763, 0, 65536, 1310764, 0, 65536, 1310765, 0, 65536, 1310766, 0, 65536, 1376256, 0, 65536, 1376257, 0, 65536, 1376258, 0, 65536, 1376259, 0, 65536, 1376260, 0, 1, 1376261, 0, 65536, 1376262, 0, 65536, 1376263, 0, 65536, 1376264, 0, 65536, 1376265, 0, 65536, 1376266, 0, 65536, 1376267, 0, 65536, 1376268, 0, 65536, 1376269, 0, 65536, 1376270, 0, 65536, 1376271, 0, 65536, 1376272, 0, 65536, 1376273, 0, 65536, 1376274, 0, 65536, 1376275, 0, 65536, 1376276, 0, 65536, 1376277, 0, 65536, 1376278, 0, 65536, 1376279, 0, 2, 1376280, 0, 65536, 1376281, 0, 65536, 1376282, 0, 65536, 1376283, 0, 65536, 1376284, 0, 65536, 1376285, 0, 65536, 1376286, 0, 65536, 1376287, 0, 65536, 1376288, 0, 65536, 1376289, 0, 65536, 1376290, 0, 65536, 1376291, 0, 0, 1376292, 0, 2, 1376293, 0, 65536, 1376294, 0, 65536, 1376295, 0, 65536, 1376296, 0, 65536, 1376297, 0, 65536, 1376298, 0, 65536, 1376299, 0, 65536, 1376300, 0, 65536, 1376301, 0, 65536, 1376302, 0, 65536, 1441792, 0, 65536, 1441793, 0, 2, 1441794, 0, 65536, 1441795, 0, 65536, 1441796, 0, 65536, 1441797, 0, 65536, 1441798, 0, 65536, 1441799, 0, 65536, 1441800, 0, 65536, 1441801, 0, 65536, 1441802, 0, 65536, 1441803, 0, 0, 1441804, 0, 65536, 1441805, 0, 65536, 1441806, 0, 65536, 1441807, 0, 65536, 1441808, 0, 65536, 1441809, 0, 65536, 1441810, 0, 65536, 1441811, 0, 65536, 1441812, 0, 65536, 1441813, 0, 65536, 1441814, 0, 65536, 1441815, 0, 1, 1441816, 0, 65536, 1441817, 0, 65536, 1441818, 0, 65536, 1441819, 0, 65536, 1441820, 0, 65536, 1441821, 0, 65536, 1441822, 0, 65536, 1441823, 0, 65536, 1441824, 0, 65536, 1441825, 0, 65536, 1441826, 0, 65536, 1441827, 0, 65536, 1441828, 0, 65536, 1441829, 0, 65536, 1441830, 0, 65536, 1441831, 0, 65536, 1441832, 0, 65536, 1441833, 0, 65536, 1441834, 0, 65536, 1441835, 0, 65536, 1441836, 0, 65536, 1441837, 0, 65536, 1441838, 0, 65536, 1507328, 0, 65536, 1507329, 0, 65536, 1507330, 0, 65536, 1507331, 0, 65536, 1507332, 0, 65536, 1507333, 0, 65536, 1507334, 0, 65536, 1507335, 0, 65536, 1507336, 0, 65536, 1507337, 0, 65536, 1507338, 0, 65536, 1507339, 0, 1, 1507340, 0, 65536, 1507341, 0, 65536, 1507342, 0, 65536, 1507343, 0, 65536, 1507344, 0, 65536, 1507345, 0, 65536, 1507346, 0, 65536, 1507347, 0, 65536, 1507348, 0, 65536, 1507349, 0, 65536, 1507350, 0, 65536, 1507351, 0, 65536, 1507352, 0, 65536, 1507353, 0, 65536, 1507354, 0, 65536, 1507355, 0, 65536, 1507356, 0, 65536, 1507357, 0, 65536, 1507358, 0, 1, 1507359, 0, 65536, 1507360, 0, 65536, 1507361, 0, 65536, 1507362, 0, 65536, 1507363, 0, 65536, 1507364, 0, 65536, 1507365, 0, 65536, 1507366, 0, 65536, 1507367, 0, 65536, 1507368, 0, 65536, 1507369, 0, 65536, 1507370, 0, 65536, 1507371, 0, 65536, 1507372, 0, 65536, 1507373, 0, 0, 1507374, 0, 65536, 1572864, 0, 65536, 1572865, 0, 65536, 1572866, 0, 65536, 1572867, 0, 65536, 1572868, 0, 65536, 1572869, 0, 65536, 1572870, 0, 65536, 1572871, 0, 65536, 1572872, 0, 65536, 1572873, 0, 65536, 1572874, 0, 65536, 1572875, 0, 65536, 1572876, 0, 65536, 1572877, 0, 65536, 1572878, 0, 0, 1572879, 0, 65536, 1572880, 0, 65536, 1572881, 0, 65536, 1572882, 0, 65536, 1572883, 0, 65536, 1572884, 0, 65536, 1572885, 0, 65536, 1572886, 0, 0, 1572887, 0, 65536, 1572888, 0, 65536, 1572889, 0, 65536, 1572890, 0, 65536, 1572891, 0, 65536, 1572892, 0, 65536, 1572893, 0, 65536, 1572894, 0, 65536, 1572895, 0, 65536, 1572896, 0, 65536, 1572897, 0, 65536, 1572898, 0, 2, 1572899, 0, 65536, 1572900, 0, 65536, 1572901, 0, 65536, 1572902, 0, 65536, 1572903, 0, 65536, 1572904, 0, 65536, 1572905, 0, 65536, 1572906, 0, 65536, 1572907, 0, 0, 1572908, 0, 65536, 1572909, 0, 65536, 1572910, 0, 65536, 1638400, 0, 65536, 1638401, 0, 65536, 1638402, 0, 65536, 1638403, 0, 65536, 1638404, 0, 65536, 1638405, 0, 65536, 1638406, 0, 65536, 1638407, 0, 65536, 1638408, 0, 65536, 1638409, 0, 65536, 1638410, 0, 65536, 1638411, 0, 65536, 1638412, 0, 65536, 1638413, 0, 65536, 1638414, 0, 65536, 1638415, 0, 65536, 1638416, 0, 65536, 1638417, 0, 65536, 1638418, 0, 65536, 1638419, 0, 65536, 1638420, 0, 65536, 1638421, 0, 65536, 1638422, 0, 65536, 1638423, 0, 65536, 1638424, 0, 65536, 1638425, 0, 65536, 1638426, 0, 65536, 1638427, 0, 65536, 1638428, 0, 65536, 1638429, 0, 65536, 1638430, 0, 65536, 1638431, 0, 65536, 1638432, 0, 65536, 1638433, 0, 65536, 1638434, 0, 65536, 1638435, 0, 65536, 1638436, 0, 65536, 1638437, 0, 65536, 1638438, 0, 65536, 1638439, 0, 65536, 1638440, 0, 65536, 1638441, 0, 65536, 1638442, 0, 65536, 1638443, 0, 65536, 1638444, 0, 65536, 1638445, 0, 65536, 1638446, 0, 65536 )\n_sections_unfolded = [ \"Cell\" ]\n\n[node name=\"Props\" type=\"TileMap\" parent=\".\" index=\"1\"]\n\nmode = 0\ntile_set = ExtResource( 2 )\ncell_size = Vector2( 128, 128 )\ncell_quadrant_size = 16\ncell_custom_transform = Transform2D( 1, 0, 0, 1, 0, 0 )\ncell_half_offset = 2\ncell_tile_origin = 0\ncell_y_sort = false\ncell_clip_uv = false\ncollision_use_kinematic = false\ncollision_friction = 1.0\ncollision_bounce = 0.0\ncollision_layer = 1\ncollision_mask = 1\noccluder_light_mask = 1\nformat = 1\ntile_data = PoolIntArray( 0, 4, 6, 1, 4, 131073, 2, 4, 1, 3, 4, 1, 4, 4, 1, 5, 4, 1, 6, 4, 131073, 7, 4, 1, 8, 4, 1, 9, 4, 131073, 10, 4, 1, 11, 4, 131073, 12, 4, 1, 13, 4, 131073, 14, 4, 131073, 15, 4, 1, 16, 4, 1, 17, 4, 131073, 18, 4, 131073, 19, 4, 131073, 20, 4, 65540, 21, 4, 131073, 22, 4, 131073, 23, 4, 1, 24, 4, 131073, 25, 4, 131073, 26, 4, 1, 27, 4, 131073, 28, 4, 131073, 29, 4, 1, 30, 4, 1, 31, 4, 1, 32, 4, 1, 33, 4, 131073, 34, 4, 131073, 35, 4, 1, 36, 4, 131073, 37, 4, 131073, 38, 4, 1, 39, 4, 1, 40, 4, 131073, 41, 4, 131073, 42, 4, 131073, 43, 4, 1, 44, 4, 1, 45, 4, 131073, 46, 4, 2, 65536, 4, 65536, 65556, 4, 65536, 65582, 4, 65536, 131072, 4, 65538, 131092, 4, 65536, 131118, 4, 65538, 196608, 4, 65536, 196628, 4, 65538, 196654, 4, 65536, 262144, 4, 65536, 262164, 4, 65536, 262190, 4, 65538, 327680, 4, 65536, 327700, 4, 131072, 327701, 4, 1, 327702, 4, 7, 327726, 4, 65538, 393216, 4, 65536, 393223, 2, 0, 393238, 4, 65539, 393262, 4, 65536, 458752, 4, 65538, 458798, 4, 65536, 524288, 4, 65536, 524306, 2, 0, 524334, 4, 65536, 589824, 4, 65536, 589870, 4, 65536, 655360, 4, 65536, 655406, 4, 65538, 720896, 4, 65538, 720942, 4, 65536, 786432, 4, 65538, 786454, 4, 3, 786478, 4, 65538, 851968, 4, 65536, 851984, 2, 0, 851988, 4, 0, 851989, 4, 131073, 851990, 4, 131074, 852014, 4, 65538, 917504, 4, 65538, 917524, 4, 65538, 917550, 4, 65538, 983040, 4, 4, 983041, 4, 131073, 983042, 4, 1, 983043, 4, 1, 983044, 4, 131073, 983045, 4, 1, 983046, 4, 131073, 983047, 4, 131073, 983048, 4, 131073, 983049, 4, 131073, 983050, 4, 1, 983051, 4, 1, 983052, 4, 131073, 983053, 4, 131073, 983054, 4, 131073, 983055, 4, 1, 983056, 4, 131073, 983057, 4, 131073, 983058, 4, 1, 983059, 4, 1, 983060, 4, 65543, 983086, 4, 65536, 1048576, 4, 65538, 1048622, 4, 65536, 1114112, 4, 65536, 1114127, 5, 0, 1114128, 5, 1, 1114129, 5, 1, 1114130, 5, 2, 1114158, 4, 65536, 1179648, 4, 65536, 1179663, 5, 65536, 1179664, 5, 65537, 1179665, 5, 65537, 1179666, 5, 65539, 1179667, 5, 2, 1179694, 4, 65538, 1245184, 4, 65536, 1245198, 5, 0, 1245199, 5, 65540, 1245200, 5, 65537, 1245201, 5, 65537, 1245202, 5, 65537, 1245203, 5, 65538, 1245230, 4, 65536, 1310720, 4, 65536, 1310734, 5, 65536, 1310735, 5, 65537, 1310736, 5, 65537, 1310737, 5, 65537, 1310738, 5, 65537, 1310739, 5, 65539, 1310740, 5, 2, 1310766, 4, 65536, 1376256, 4, 65536, 1376270, 5, 65536, 1376271, 5, 65537, 1376272, 5, 65537, 1376273, 5, 65537, 1376274, 5, 65537, 1376275, 5, 3, 1376276, 5, 131074, 1376302, 4, 65536, 1441792, 4, 65536, 1441806, 5, 65536, 1441807, 5, 65537, 1441808, 5, 3, 1441809, 5, 131073, 1441810, 5, 131073, 1441811, 5, 131074, 1441838, 4, 65538, 1507328, 4, 65538, 1507342, 5, 65536, 1507343, 5, 65537, 1507344, 5, 65538, 1507374, 4, 65538, 1572864, 4, 65538, 1572878, 5, 131072, 1572879, 5, 131073, 1572880, 5, 131074, 1572910, 4, 65536, 1638400, 4, 131072, 1638401, 4, 1, 1638402, 4, 1, 1638403, 4, 1, 1638404, 4, 1, 1638405, 4, 1, 1638406, 4, 131073, 1638407, 4, 131073, 1638408, 4, 131073, 1638409, 4, 1, 1638410, 4, 131073, 1638411, 4, 1, 1638412, 4, 131073, 1638413, 4, 131073, 1638414, 4, 131073, 1638415, 4, 1, 1638416, 4, 131073, 1638417, 4, 131073, 1638418, 4, 131073, 1638419, 4, 1, 1638420, 4, 1, 1638421, 4, 131073, 1638422, 4, 131073, 1638423, 4, 131073, 1638424, 4, 131073, 1638425, 4, 131073, 1638426, 4, 131073, 1638427, 4, 131073, 1638428, 4, 1, 1638429, 4, 131073, 1638430, 4, 1, 1638431, 4, 1, 1638432, 4, 1, 1638433, 4, 1, 1638434, 4, 131073, 1638435, 4, 1, 1638436, 4, 131073, 1638437, 4, 131073, 1638438, 4, 1, 1638439, 4, 131073, 1638440, 4, 131073, 1638441, 4, 1, 1638442, 4, 1, 1638443, 4, 131073, 1638444, 4, 1, 1638445, 4, 131073, 1638446, 4, 131074 )\n_sections_unfolded = [ \"Cell\" ]\n\n[node name=\"Gap\" parent=\".\" index=\"2\" instance=ExtResource( 3 )]\n\nposition = Vector2( 1744, 944 )\n\n[node name=\"Gap2\" parent=\".\" index=\"3\" instance=ExtResource( 3 )]\n\nposition = Vector2( 432, 1440 )\n\n[node name=\"Gap3\" parent=\".\" index=\"4\" instance=ExtResource( 3 )]\n\nposition = Vector2( 4624, 2272 )\n\n[node name=\"Gap4\" parent=\".\" index=\"5\" instance=ExtResource( 3 )]\n\nposition = Vector2( 5664, 1424 )\n\n[node name=\"Gap5\" parent=\".\" index=\"6\" instance=ExtResource( 3 )]\n\nposition = Vector2( 3152, 1696 )\n\n[node name=\"YSort\" type=\"YSort\" parent=\".\" index=\"7\"]\n\neditor/display_folded = true\nsort_enabled = true\n\n[node name=\"Porcupine\" parent=\"YSort\" index=\"0\" instance=ExtResource( 4 )]\n\nposition = Vector2( 576, 768 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Porcupine2\" parent=\"YSort\" index=\"1\" instance=ExtResource( 4 )]\n\nposition = Vector2( 2176, 656 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Porcupine3\" parent=\"YSort\" index=\"2\" instance=ExtResource( 4 )]\n\nposition = Vector2( 816, 1728 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Porcupine4\" parent=\"YSort\" index=\"3\" instance=ExtResource( 4 )]\n\nposition = Vector2( 464, 2976 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Porcupine5\" parent=\"YSort\" index=\"4\" instance=ExtResource( 4 )]\n\nposition = Vector2( 4752, 640 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Nest\" parent=\"YSort\" index=\"5\" instance=ExtResource( 5 )]\n\nposition = Vector2( 1936, 1520 )\n\n[node name=\"Nest2\" parent=\"YSort\" index=\"6\" instance=ExtResource( 5 )]\n\nposition = Vector2( 384, 912 )\n\n[node name=\"Nest3\" parent=\"YSort\" index=\"7\" instance=ExtResource( 5 )]\n\nposition = Vector2( 1088, 2576 )\n\n[node name=\"Seller\" parent=\"YSort\" index=\"8\" instance=ExtResource( 6 )]\n\nposition = Vector2( 3056, 1232 )\n\n[node name=\"PlayerSpawningPoint\" parent=\".\" index=\"8\" instance=ExtResource( 7 )]\n\nposition = Vector2( 5440, 2896 )\n\n[node name=\"Door\" parent=\".\" index=\"9\" instance=ExtResource( 8 )]\n\nposition = Vector2( 304, 432 )\nscale = Vector2( 0.8125, 0.8125 )\nmap_path = \"res://levels/Cave.tscn\"\nACTIVE_AT_START = true\n\n[node name=\"SecretDrop\" type=\"Node2D\" parent=\".\" index=\"10\"]\n\nposition = Vector2( 448, 2560 )\n\n[node name=\"Walls\" type=\"StaticBody2D\" parent=\".\" index=\"11\"]\n\ninput_pickable = false\ncollision_layer = 1\ncollision_mask = 1\nconstant_linear_velocity = Vector2( 0, 0 )\nconstant_angular_velocity = 0.0\nfriction = 1.0\nbounce = 0.0\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\"Walls\" index=\"0\"]\n\nbuild_mode = 1\npolygon = PoolVector2Array( 96, 2048, 2592, 2048, 2656, 2048, 2656, 1936, 2656, 1792, 2848, 1792, 2912, 1792, 2912, 1680, 2912, 1552, 2848, 1552, 2848, 1680, 2655.43, 1680, 2592, 1680, 2592, 1792, 2592, 1936, 96, 1936 )\n\n[node name=\"CollisionPolygon2D2\" type=\"CollisionPolygon2D\" parent=\"Walls\" index=\"1\"]\n\nbuild_mode = 1\npolygon = PoolVector2Array( 2912, 896, 2848, 896, 2848, 768, 2656, 768, 2592, 768, 2592, 656, 2592, 128, 96, 128, 96, 16, 2591.58, 16, 2656, 16, 2656, 128, 2656, 656, 2848, 656, 2912, 656, 2912, 768 )\n\n[node name=\"CollisionPolygon2D3\" type=\"CollisionPolygon2D\" parent=\"Walls\" index=\"2\"]\n\nbuild_mode = 1\npolygon = PoolVector2Array( 32, 16, 96, 16, 96, 3216, 5920, 3216, 5920, 3328, 96, 3328, 32, 3328, 32, 3216 )\n\n[node name=\"CollisionPolygon2D4\" type=\"CollisionPolygon2D\" parent=\"Walls\" index=\"3\"]\n\nbuild_mode = 1\npolygon = PoolVector2Array( 5984, 3328, 5920, 3328, 5920, 128, 2656, 128, 2656, 16, 5984, 16 )\n\n\n"
  },
  {
    "path": "levels/Level.gd",
    "content": "extends Node\n\nexport(bool) var fog = false\n\nfunc get_ysort_node():\n\treturn $YSort\n\nfunc initialize():\n\treturn\n"
  },
  {
    "path": "levels/TestLevel.tscn",
    "content": "[gd_scene load_steps=11 format=2]\n\n[ext_resource path=\"res://core/world/tilesets/outdoor/outdoor.tres\" type=\"TileSet\" id=1]\n[ext_resource path=\"res://levels/Level.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://core/world/PlayerSpawningPoint.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://core/world/Gap.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://core/world/Door.tscn\" type=\"PackedScene\" id=5]\n[ext_resource path=\"res://actors/characters/seller/Seller.tscn\" type=\"PackedScene\" id=6]\n[ext_resource path=\"res://monsters/mosquito/Nest.tscn\" type=\"PackedScene\" id=7]\n[ext_resource path=\"res://monsters/porcupine/Porcupine.tscn\" type=\"PackedScene\" id=8]\n[ext_resource path=\"res://core/world/Rock.tscn\" type=\"PackedScene\" id=9]\n[ext_resource path=\"res://core/inventory/items/Coins.tscn\" type=\"PackedScene\" id=10]\n\n[node name=\"TestLevel\" type=\"TileMap\"]\n\nmode = 0\ntile_set = ExtResource( 1 )\ncell_size = Vector2( 128, 128 )\ncell_quadrant_size = 16\ncell_custom_transform = Transform2D( 1, 0, 0, 1, 0, 0 )\ncell_half_offset = 2\ncell_tile_origin = 0\ncell_y_sort = false\ncell_clip_uv = false\ncollision_use_kinematic = true\ncollision_friction = 1.0\ncollision_bounce = 0.0\ncollision_layer = 1\ncollision_mask = 1\noccluder_light_mask = 1\nformat = 1\ntile_data = PoolIntArray( 0, 0, 65536, 1, 0, 65536, 2, 1, 0, 3, 1, 2, 4, 0, 65536, 5, 0, 65536, 6, 0, 65536, 7, 0, 65536, 8, 0, 65536, 9, 0, 65536, 10, 0, 65536, 11, 0, 65536, 12, 0, 65536, 13, 0, 65536, 14, 0, 65536, 15, 0, 65536, 16, 0, 65536, 17, 0, 65536, 18, 0, 65536, 19, 0, 65536, 20, 0, 65536, 65536, 0, 65536, 65537, 0, 65536, 65538, 1, 65536, 65539, 1, 65538, 65540, 5, 0, 65541, 5, 2, 65542, 0, 65536, 65543, 5, 0, 65544, 5, 1, 65545, 5, 2, 65546, 0, 65536, 65547, 0, 65536, 65548, 0, 65536, 65549, 0, 65536, 65550, 0, 65536, 65551, 0, 65536, 65552, 0, 65536, 65553, 0, 65536, 65554, 0, 65536, 65555, 0, 65536, 65556, 0, 65536, 131072, 0, 65536, 131073, 0, 65536, 131074, 1, 65536, 131075, 1, 65538, 131076, 5, 65536, 131077, 5, 65539, 131078, 5, 1, 131079, 5, 65540, 131080, 5, 3, 131081, 5, 131074, 131082, 0, 65536, 131083, 0, 65536, 131084, 1, 0, 131085, 1, 1, 131086, 1, 2, 131087, 0, 65536, 131088, 0, 65536, 131089, 0, 65536, 131090, 0, 65536, 131091, 0, 65536, 131092, 0, 65536, 196608, 0, 65536, 196609, 0, 65536, 196610, 1, 65536, 196611, 1, 65538, 196612, 5, 65536, 196613, 5, 65537, 196614, 5, 65537, 196615, 5, 65537, 196616, 5, 65538, 196617, 0, 65536, 196618, 1, 0, 196619, 1, 1, 196620, 1, 65540, 196621, 1, 65537, 196622, 1, 65539, 196623, 1, 1, 196624, 1, 1, 196625, 1, 1, 196626, 1, 2, 196627, 0, 65536, 196628, 0, 65536, 262144, 0, 65536, 262145, 0, 65536, 262146, 1, 65536, 262147, 1, 65538, 262148, 5, 131072, 262149, 5, 131073, 262150, 5, 4, 262151, 5, 65537, 262152, 5, 65539, 262153, 5, 2, 262154, 1, 65536, 262155, 1, 65537, 262156, 1, 65537, 262157, 1, 65537, 262158, 1, 65537, 262159, 1, 65537, 262160, 1, 65537, 262161, 1, 65537, 262162, 1, 65538, 262163, 0, 65536, 262164, 0, 65536, 327680, 0, 65536, 327681, 0, 65536, 327682, 1, 65536, 327683, 1, 65539, 327684, 1, 2, 327685, 0, 65536, 327686, 5, 131072, 327687, 5, 131073, 327688, 5, 131073, 327689, 5, 131074, 327690, 1, 65536, 327691, 1, 65537, 327692, 1, 65537, 327693, 1, 65537, 327694, 1, 65537, 327695, 1, 65537, 327696, 1, 65537, 327697, 1, 65537, 327698, 1, 65538, 327699, 0, 65536, 327700, 0, 65536, 393216, 0, 65536, 393217, 0, 65536, 393218, 1, 131072, 393219, 1, 4, 393220, 1, 65539, 393221, 1, 2, 393222, 0, 65536, 393223, 0, 65536, 393224, 0, 65536, 393225, 0, 65536, 393226, 1, 65536, 393227, 1, 65537, 393228, 1, 65537, 393229, 1, 65537, 393230, 1, 65537, 393231, 1, 65537, 393232, 1, 65537, 393233, 1, 65537, 393234, 1, 65538, 393235, 0, 65536, 393236, 0, 65536, 458752, 0, 65536, 458753, 0, 65536, 458754, 0, 65536, 458755, 1, 131072, 458756, 1, 4, 458757, 1, 65539, 458758, 1, 1, 458759, 1, 1, 458760, 1, 1, 458761, 1, 1, 458762, 1, 65540, 458763, 1, 65537, 458764, 1, 65537, 458765, 1, 65537, 458766, 1, 3, 458767, 1, 131073, 458768, 1, 131073, 458769, 1, 4, 458770, 1, 65538, 458771, 0, 65536, 458772, 0, 65536, 524288, 0, 65536, 524289, 0, 65536, 524290, 0, 65536, 524291, 0, 65536, 524292, 1, 131072, 524293, 1, 131073, 524294, 1, 131073, 524295, 1, 131073, 524296, 1, 131073, 524297, 1, 4, 524298, 1, 3, 524299, 1, 131073, 524300, 1, 131073, 524301, 1, 131073, 524302, 1, 131074, 524303, 0, 65536, 524304, 0, 65536, 524305, 1, 131072, 524306, 1, 131074, 524307, 0, 65536, 524308, 0, 65536, 589824, 0, 65536, 589825, 0, 65536, 589826, 0, 65536, 589827, 0, 65536, 589828, 0, 65536, 589829, 0, 65536, 589830, 0, 65536, 589831, 0, 65536, 589832, 0, 65536, 589833, 1, 65536, 589834, 1, 65538, 589835, 0, 65536, 589836, 0, 65536, 589837, 0, 65536, 589838, 0, 65536, 589839, 0, 65536, 589840, 0, 65536, 589841, 0, 65536, 589842, 0, 65536, 589843, 0, 65536, 589844, 0, 65536, 655360, 0, 65536, 655361, 0, 65536, 655362, 0, 65536, 655363, 0, 65536, 655364, 0, 2, 655365, 0, 65536, 655366, 0, 65536, 655367, 0, 65536, 655368, 0, 65536, 655369, 1, 65536, 655370, 1, 65538, 655371, 0, 65536, 655372, 0, 65536, 655373, 0, 65536, 655374, 0, 65536, 655375, 0, 65536, 655376, 0, 1, 655377, 0, 65536, 655378, 0, 65536, 655379, 0, 65536, 655380, 0, 65536, 720896, 0, 65536, 720897, 0, 65536, 720898, 0, 65536, 720899, 0, 65536, 720900, 0, 65536, 720901, 0, 65536, 720902, 0, 65536, 720903, 0, 65536, 720904, 0, 65536, 720905, 1, 131072, 720906, 1, 131074, 720907, 0, 65536, 720908, 0, 65536, 720909, 0, 65536, 720910, 0, 65536, 720911, 0, 65536, 720912, 0, 65536, 720913, 0, 65536, 720914, 0, 65536, 720915, 0, 65536, 720916, 0, 65536 )\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Cell\", \"Collision\" ]\nfog = false\n\n[node name=\"PlayerSpawningPoint\" parent=\".\" index=\"0\" instance=ExtResource( 3 )]\n\nposition = Vector2( 603.07, 1200 )\n\n[node name=\"Gap\" parent=\".\" index=\"1\" instance=ExtResource( 4 )]\n\nposition = Vector2( 1658, 902 )\n\n[node name=\"Door\" parent=\".\" index=\"2\" instance=ExtResource( 5 )]\n\nposition = Vector2( 2006, 722 )\nscale = Vector2( 0.8125, 0.8125 )\nmap_path = \"res://levels/Cave.tscn\"\nACTIVE_AT_START = true\n\n[node name=\"YSort\" type=\"YSort\" parent=\".\" index=\"3\"]\n\nsort_enabled = true\n\n[node name=\"Seller\" parent=\"YSort\" index=\"0\" instance=ExtResource( 6 )]\n\nposition = Vector2( 466, 1213 )\n\n[node name=\"Nest\" parent=\"YSort\" index=\"1\" instance=ExtResource( 7 )]\n\nposition = Vector2( 1635, 455 )\n\n[node name=\"Porcupine\" parent=\"YSort\" index=\"2\" instance=ExtResource( 8 )]\n\nposition = Vector2( 2086.01, 1288.82 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Porcupine2\" parent=\"YSort\" index=\"3\" instance=ExtResource( 8 )]\n\nposition = Vector2( 2546.01, 728.82 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nMAX_ROAM_SPEED = 200.0\nMAX_FOLLOW_SPEED = 400.0\nMAX_CHARGE_SPEED = 900.0\nSPOT_RANGE = 460.0\nFOLLOW_RANGE = 700.0\nBUMP_RANGE = 90.0\nCHARGE_RANGE = 340.0\nPREPARE_TO_CHARGE_WAIT_TIME = 0.9\nROAM_RADIUS = 140.0\nBUMP_DISTANCE = 60.0\nBUMP_DURATION = 0.2\nMAX_BUMP_HEIGHT = 50.0\nBUMP_COOLDOWN_DURATION = 0.6\n\n[node name=\"Rock\" parent=\"YSort\" index=\"4\" instance=ExtResource( 9 )]\n\nposition = Vector2( 1162, 801 )\n\n[node name=\"Coins\" parent=\"YSort\" index=\"5\" instance=ExtResource( 10 )]\n\nposition = Vector2( 472.412, 993.695 )\n\n[node name=\"Coins2\" parent=\"YSort\" index=\"6\" instance=ExtResource( 10 )]\n\nposition = Vector2( 781.924, 811.246 )\n\n[node name=\"Coins3\" parent=\"YSort\" index=\"7\" instance=ExtResource( 10 )]\n\nposition = Vector2( 1153.34, 1179.4 )\n\n[node name=\"Coins4\" parent=\"YSort\" index=\"8\" instance=ExtResource( 10 )]\n\nposition = Vector2( 1062.11, 1485.65 )\n\n\n"
  },
  {
    "path": "monsters/BossShakingCamera.gd",
    "content": "tool\nextends \"res://actors/camera/ShakingCamera.gd\"\n\nonready var tween = $Tween\n\nexport(float) var AMPLITUDE_HIT_WALL = 30.0\n\nvar start_global_position = Vector2()\nonready var _start_amplitude = amplitude\n\nfunc _ready():\n\tstart_global_position = global_position\n\nfunc initialize(player):\n\tglobal_position = player.camera.global_position\n\tplayer.get_health_node().connect('damage_taken', self, '_on_Player_damage_taken')\n\tcurrent = true\n\nfunc move_to_room_center():\n\ttween.interpolate_property(self, 'global_position', global_position, start_global_position, 1.0, Tween.TRANS_QUART, Tween.EASE_IN)\n\ttween.start()\n\tyield(tween, \"tween_completed\")\n\nfunc _on_WildBoar_hit_wall():\n\tamplitude = AMPLITUDE_HIT_WALL\n\tself.shake = true\n\nfunc _on_Player_damage_taken(new_health):\n\tamplitude = _start_amplitude\n\tself.shake = true\n"
  },
  {
    "path": "monsters/BossShakingCamera.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://actors/camera/ShakingCamera.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://monsters/BossShakingCamera.gd\" type=\"Script\" id=2]\n\n\n[node name=\"BossShakingCamera\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\namplitude = 10.0\nAMPLITUDE_HIT_WALL = 30.0\n\n[node name=\"Tween\" type=\"Tween\" parent=\".\" index=\"1\"]\n\nrepeat = false\nplayback_process_mode = 1\nplayback_speed = 1.0\nplayback/active = false\nplayback/repeat = false\nplayback/speed = 1.0\n\n\n"
  },
  {
    "path": "monsters/Monster.gd",
    "content": "extends KinematicBody2D\n\nsignal died\n\nvar state\nvar active\n\nexport(float) var ARRIVE_DISTANCE = 6.0\nexport(float) var DEFAULT_SLOW_RADIUS = 200.0\nexport(float) var DEFAULT_MAX_SPEED = 300.0\nexport(float) var MASS = 8.0\n\nonready var stats = $Stats\n\nconst Actor = preload(\"res://actors/Actor.gd\")\nvar target = null # Actor\n\nvar start_position = Vector2()\nvar velocity = Vector2()\n\nfunc _ready():\n\tset_as_toplevel(true)\n\tstart_position = global_position\n\nfunc initialize(target_actor):\n\tif not target_actor is Actor:\n\t\treturn\n\ttarget = target_actor\n\ttarget.connect('died', self, '_on_target_died')\n\tset_active(true)\n\nfunc _on_target_died():\n\ttarget = null\n\nfunc take_damage_from(damage_source):\n\tstats.take_damage(damage_source.damage)\n\nfunc set_active(value):\n\tactive = value\n\tset_physics_process(value)\n\t$HitBox.set_active(value)\n\t$DamageSource.set_active(value)\n"
  },
  {
    "path": "monsters/Monster.tscn",
    "content": "[gd_scene load_steps=8 format=2]\n\n[ext_resource path=\"res://monsters/Monster.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://actors/health/Stats.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://actors/hit_box/HitBox.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://interface/gui/lifebar/InterfaceAnchor.tscn\" type=\"PackedScene\" id=4]\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Skin:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, 0 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Skin:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Skin:scale\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Skin:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\"Skin:visible\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/5/type = \"value\"\ntracks/5/path = NodePath(\"Skin/BodyPivot:modulate\")\ntracks/5/interp = 1\ntracks/5/loop_wrap = true\ntracks/5/imported = false\ntracks/5/enabled = true\ntracks/5/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\ntracks/6/type = \"value\"\ntracks/6/path = NodePath(\"Skin/BodyPivot:position\")\ntracks/6/interp = 1\ntracks/6/loop_wrap = true\ntracks/6/imported = false\ntracks/6/enabled = true\ntracks/6/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, 0 ) ]\n}\ntracks/7/type = \"value\"\ntracks/7/path = NodePath(\"Skin/BodyPivot:rotation_degrees\")\ntracks/7/interp = 1\ntracks/7/loop_wrap = true\ntracks/7/imported = false\ntracks/7/enabled = true\ntracks/7/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/8/type = \"value\"\ntracks/8/path = NodePath(\"Skin/BodyPivot:scale\")\ntracks/8/interp = 1\ntracks/8/loop_wrap = true\ntracks/8/imported = false\ntracks/8/enabled = true\ntracks/8/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"die\"\nlength = 0.4\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Skin/BodyPivot:scale\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.4 ),\n\"transitions\": PoolRealArray( 0.27058, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 0.1, 0.1 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Skin/BodyPivot:modulate\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.4 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\n\n[sub_resource type=\"Animation\" id=3]\n\nresource_name = \"stagger\"\nlength = 0.6\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Skin/BodyPivot:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.5 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Skin/BodyPivot:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ Vector2( 1, 1 ) ]\n}\n\n[node name=\"Monster\" type=\"KinematicBody2D\" index=\"0\"]\n\ninput_pickable = false\ncollision_layer = 1\ncollision_mask = 1\ncollision/safe_margin = 0.08\nscript = ExtResource( 1 )\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\n\n[node name=\"Stats\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\n[node name=\"HitBox\" parent=\".\" index=\"1\" instance=ExtResource( 3 )]\n\n[node name=\"Skin\" type=\"Position2D\" parent=\".\" index=\"2\"]\n\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"BodyPivot\" type=\"Position2D\" parent=\"Skin\" index=\"0\"]\n\n_sections_unfolded = [ \"Transform\", \"Visibility\" ]\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"3\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/die = SubResource( 2 )\nanims/stagger = SubResource( 3 )\nblend_times = [  ]\n\n[node name=\"InterfaceAnchor\" parent=\".\" index=\"4\" instance=ExtResource( 4 )]\n\nposition = Vector2( 0, -150.219 )\n\n\n"
  },
  {
    "path": "monsters/ObstacleDetector.gd",
    "content": "# Detects collisions with the environment using raycasts\n# If collisions happen, emits a signal with a list of collision points\nextends Node2D\n\nsignal rays_collided\n\nvar rays = []\nconst RAYS_COUNT = 12\nconst RAYS_RADIUS = 100\n\nfunc _ready():\n\tfor i in range(RAYS_COUNT):\n\t\tvar new_ray = RayCast2D.new()\n\t\tvar angle = 2 * PI * i / RAYS_COUNT\n\t\tnew_ray.cast_to = Vector2(cos(angle), sin(angle)) * RAYS_RADIUS\n\t\tadd_child(new_ray)\n\t\tnew_ray.add_exception(get_parent().get_parent())\n\t\tnew_ray.enabled = true\n\t\tnew_ray.collision_mask = 2\n\n\nfunc _physics_process(delta):\n\tvar collision_points = []\n\tfor ray in get_children():\n\t\tif not ray.is_colliding():\n\t\t\tcontinue\n\t\tcollision_points.append(ray.get_collision_point())\n\tif collision_points == []:\n\t\treturn\n\temit_signal('rays_collided', collision_points)\n"
  },
  {
    "path": "monsters/bosses/wild_boar/WildBoar.gd",
    "content": "extends \"res://monsters/Monster.gd\"\n\nsignal hit_wall()\n\nonready var state_machine = $StateMachine\nonready var lifebar = $BossLifebar\nonready var health_node = $Stats\nonready var tween_node = $Tween\n\nvar start_global_position\n\nfunc _ready():\n\tvisible = false\n\tset_invincible(true)\n\tstart_global_position = global_position\n\tlifebar.initialize(health_node)\n\nfunc start():\n\tlifebar.appear()\n\tstate_machine.start()\n\nfunc _on_Health_health_depleted():\n\tset_invincible(true)\n\tlifebar.disappear()\n\nfunc _on_Health_health_changed(new_health):\n\ttween_node.interpolate_property($Pivot, 'scale', Vector2(0.92, 1.12), Vector2(1.0, 1.0), 0.3, Tween.TRANS_ELASTIC, Tween.EASE_IN_OUT)\n\ttween_node.interpolate_property($Pivot/Body, 'modulate', Color('#ff48de'), Color('#ffffff'), 0.2, Tween.TRANS_QUINT, Tween.EASE_IN)\n\ttween_node.start()\n\tmatch state_machine.phase:\n\t\t1:\n\t\t\tif new_health < 100:\n\t\t\t\tstate_machine.phase = 2\n\t\t2:\n\t\t\tif new_health < 50:\n\t\t\t\tstate_machine.phase = 3\n\nfunc set_particles_active(value):\n\t$DustPuffsLarge.emitting = value\n\nfunc set_invincible(value):\n\t$CollisionPolygon2D.disabled = value\n\t$HitBox/CollisionShape2D.disabled = value\n\t$DamageSource/CollisionShape2D.disabled = value\n\t$DamageSource.monitorable = not value\n\nfunc take_damage_from(attacker):\n\thealth_node.take_damage(attacker.damage)\n\nfunc _on_Die_finished():\n\tstate_machine.set_active(false)\n\temit_signal('died')\n\tqueue_free()\n\nfunc _on_target_died():\n\t._on_target_died()\n\tstate_machine.change_phase(4)\n\tstate_machine.go_to_next_state()\n\nfunc _on_Sprint_hit_wall():\n\temit_signal('hit_wall')\n"
  },
  {
    "path": "monsters/bosses/wild_boar/WildBoar.tscn",
    "content": "[gd_scene load_steps=35 format=2]\n\n[ext_resource path=\"res://monsters/bosses/wild_boar/WildBoar.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://vfx/particles/dust_puffs/DustPuffsLarge.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://monsters/bosses/wild_boar/sprites/front.png\" type=\"Texture\" id=3]\n[ext_resource path=\"res://monsters/bosses/wild_boar/sprites/wild_boar_stomp_2.png\" type=\"Texture\" id=4]\n[ext_resource path=\"res://monsters/bosses/wild_boar/sprites/wild_boar_stomp_1.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://actors/health/Stats.tscn\" type=\"PackedScene\" id=6]\n[ext_resource path=\"res://monsters/bosses/wild_boar/WildBoarFSM.gd\" type=\"Script\" id=7]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/Spawn.gd\" type=\"Script\" id=8]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/roam/RoamSequence.gd\" type=\"Script\" id=9]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/roam/Wait.gd\" type=\"Script\" id=10]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/roam/MoveToRandomPosition.gd\" type=\"Script\" id=11]\n[ext_resource path=\"res://utils/state/Sequence.gd\" type=\"Script\" id=12]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/charge/Prepare.gd\" type=\"Script\" id=13]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/charge/Sprint.gd\" type=\"Script\" id=14]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/charge/BumpWildBoar.gd\" type=\"Script\" id=15]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/ReturnToCenter.gd\" type=\"Script\" id=16]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/stomp/Stomp.gd\" type=\"Script\" id=17]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/Die.gd\" type=\"Script\" id=18]\n[ext_resource path=\"res://vfx/particles/explosions/Explosion.tscn\" type=\"PackedScene\" id=19]\n[ext_resource path=\"res://actors/DamageSource.tscn\" type=\"PackedScene\" id=20]\n[ext_resource path=\"res://actors/hit_box/HitBox.tscn\" type=\"PackedScene\" id=21]\n[ext_resource path=\"res://interface/gui/boss/BossLifebar.tscn\" type=\"PackedScene\" id=22]\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.05\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Pivot/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Pivot/Body:scale\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Pivot/Body:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\"Pivot/Body:modulate\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\ntracks/5/type = \"value\"\ntracks/5/path = NodePath(\"Pivot/Body:texture\")\ntracks/5/interp = 1\ntracks/5/loop_wrap = true\ntracks/5/imported = false\ntracks/5/enabled = true\ntracks/5/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ ExtResource( 3 ) ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"bump\"\nlength = 1.4\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.3, 0.55, 0.7, 0.85, 0.95, 1.05, 1.1, 1.15 ),\n\"transitions\": PoolRealArray( 0.225072, 1.67946, 0.367583, 1, 0.367583, 1, 0.367583, 1, 0.367583 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, -37.6635 ), Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, -6.75531 ), Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, 8.69879 ), Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, 17.8458 ), Vector2( 3.57628e-007, 17.6051 ) ]\n}\n\n[sub_resource type=\"Animation\" id=3]\n\nlength = 3.0\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.15, 0.3, 1.25, 1.6, 2.05, 2.25, 2.3, 2.35, 2.4, 2.45, 2.6, 2.75, 2.95 ),\n\"transitions\": PoolRealArray( 0.307901, 2.62585, 1, 0.307901, 2.62585, 1, 1, 1, 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 10, 10, 10, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 10, 10, 10, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Pivot/Body:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.5, 2.25, 2.6, 2.7, 2.9 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 2.94246, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 0.812022, 1.23284 ), Vector2( 2.7717, 0.0452506 ) ]\n}\n\n[sub_resource type=\"Animation\" id=4]\n\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ) ]\n}\n\n[sub_resource type=\"Animation\" id=5]\n\nresource_name = \"move\"\nlength = 0.3\nloop = true\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.15 ),\n\"transitions\": PoolRealArray( 0.367583, 1.73627 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, 0.113144 ) ]\n}\n\n[sub_resource type=\"Animation\" id=6]\n\nresource_name = \"prepare\"\nlength = 1.3\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:scale\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.8 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1.08725, 0.772716 ) ]\n}\n\n[sub_resource type=\"Animation\" id=7]\n\nresource_name = \"spawn\"\nlength = 3.1\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.5, 2.9 ),\n\"transitions\": PoolRealArray( 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( -477.666, -688.279 ), Vector2( -477.666, -688.279 ), Vector2( 0, 0 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Pivot:position\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.5, 0.65, 0.8, 0.95, 1.1, 1.25, 1.4, 1.55, 1.7, 1.85, 2, 2.15, 2.3, 2.45, 2.6, 2.75, 2.9 ),\n\"transitions\": PoolRealArray( 1, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967, 2.00422, 0.342967 ),\n\"update\": 0,\n\"values\": [ Vector2( 0, 0 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ), Vector2( 0, -45 ), Vector2( 0, 0 ) ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\".:visible\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\n\n[sub_resource type=\"Animation\" id=8]\n\nlength = 0.9\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Pivot/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\n\n[sub_resource type=\"Animation\" id=9]\n\nlength = 0.1\nloop = true\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:scale\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05 ),\n\"transitions\": PoolRealArray( 0.550489, 0.550489 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1.08725, 0.772716 ) ]\n}\n\n[sub_resource type=\"Animation\" id=10]\n\nlength = 0.3\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.3 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=11]\n\nresource_name = \"stomp\"\nlength = 3.0\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"Pivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.25, 0.3, 1, 1.1, 1.2 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, 23.1995 ), Vector2( 3.57628e-007, 17.6051 ), Vector2( 3.57628e-007, 17.6051 ), Vector2( 0.260636, 30.418 ), Vector2( 3.57628e-007, 17.6051 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Pivot/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.3, 0.45, 0.65, 0.85, 1 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ 0.0, 0.0, -4.36329, 1.8451, -4.4684, 0.333169 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"Pivot/Body:scale\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0, 0.25, 0.3, 1, 1.1, 1.2 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1.14791, 0.896572 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1.16872, 0.836578 ), Vector2( 1, 1 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"Pivot/Body:texture\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0, 0.3, 1.1, 1.25 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1 ),\n\"update\": 1,\n\"values\": [ ExtResource( 4 ), ExtResource( 5 ), ExtResource( 4 ), ExtResource( 3 ) ]\n}\ntracks/4/type = \"method\"\ntracks/4/path = NodePath(\"StateMachine/Stomp\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 1.15 ),\n\"transitions\": PoolRealArray( 1 ),\n\"values\": [ {\n\"args\": [  ],\n\"method\": \"stomp\"\n} ]\n}\n\n[sub_resource type=\"CircleShape2D\" id=12]\n\ncustom_solver_bias = 0.0\nradius = 50.0\n\n[node name=\"WildBoar\" type=\"KinematicBody2D\" index=\"0\" groups=[\n\"monster\",\n]]\n\ninput_pickable = false\ncollision_layer = 1\ncollision_mask = 2\ncollision/safe_margin = 0.08\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Transform\", \"Visibility\", \"Z Index\" ]\n__meta__ = {\n\"_edit_group_\": true\n}\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 1.4\n\n[node name=\"DustPuffsLarge\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\nemitting = false\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"1\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/bump = SubResource( 2 )\nanims/die = SubResource( 3 )\nanims/idle = SubResource( 4 )\nanims/move = SubResource( 5 )\nanims/prepare = SubResource( 6 )\nanims/spawn = SubResource( 7 )\nanims/spot = SubResource( 8 )\nanims/sprint = SubResource( 9 )\nanims/stagger = SubResource( 10 )\nanims/stomp = SubResource( 11 )\nblend_times = [  ]\n\n[node name=\"Tween\" type=\"Tween\" parent=\".\" index=\"2\"]\n\nrepeat = false\nplayback_process_mode = 1\nplayback_speed = 1.0\nplayback/active = false\nplayback/repeat = false\nplayback/speed = 1.0\n\n[node name=\"Stats\" parent=\".\" index=\"3\" instance=ExtResource( 6 )]\n\nmax_health = 120\n\n[node name=\"StateMachine\" type=\"Node\" parent=\".\" index=\"4\"]\n\nscript = ExtResource( 7 )\nactive = false\nphase = 1\n\n[node name=\"Spawn\" type=\"Node\" parent=\"StateMachine\" index=\"0\"]\n\nscript = ExtResource( 8 )\n\n[node name=\"RoamSequence\" type=\"Node\" parent=\"StateMachine\" index=\"1\"]\n\nscript = ExtResource( 9 )\n\n[node name=\"Wait\" type=\"Node\" parent=\"StateMachine/RoamSequence\" index=\"0\"]\n\neditor/display_folded = true\nscript = ExtResource( 10 )\n\n[node name=\"Timer\" type=\"Timer\" parent=\"StateMachine/RoamSequence/Wait\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 1.0\none_shot = true\nautostart = false\n\n[node name=\"MoveTo\" type=\"Node\" parent=\"StateMachine/RoamSequence\" index=\"1\"]\n\nscript = ExtResource( 11 )\nARRIVE_DISTANCE = 6.0\nSLOW_RADIUS = 200.0\nMASS = 4.0\nMAX_SPEED = 300.0\nROAM_RADIUS = 150.0\n\n[node name=\"ChargeSequence\" type=\"Node\" parent=\"StateMachine\" index=\"2\"]\n\nscript = ExtResource( 12 )\n\n[node name=\"Prepare\" type=\"Node\" parent=\"StateMachine/ChargeSequence\" index=\"0\"]\n\nscript = ExtResource( 13 )\n\n[node name=\"Sprint\" type=\"Node\" parent=\"StateMachine/ChargeSequence\" index=\"1\"]\n\nscript = ExtResource( 14 )\nSPEED = 1000.0\nMAX_DISTANCE = 1200.0\n\n[node name=\"Bump\" type=\"Node\" parent=\"StateMachine/ChargeSequence\" index=\"2\"]\n\nscript = ExtResource( 15 )\nSPEED = 100.0\n\n[node name=\"ReturnToCenter\" type=\"Node\" parent=\"StateMachine/ChargeSequence\" index=\"3\"]\n\nscript = ExtResource( 16 )\nMASS = 4.0\nSLOW_RADIUS = 200.0\nMAX_SPEED = 300.0\nARRIVE_DISTANCE = 6.0\n\n[node name=\"Stomp\" type=\"Node\" parent=\"StateMachine\" index=\"3\"]\n\neditor/display_folded = true\nscript = ExtResource( 17 )\n\n[node name=\"ExplodeTimer\" type=\"Timer\" parent=\"StateMachine/Stomp\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 0.2\none_shot = false\nautostart = false\n\n[node name=\"Die\" type=\"Node\" parent=\"StateMachine\" index=\"4\"]\n\neditor/display_folded = true\nscript = ExtResource( 18 )\nMAX_RADIUS = 180.0\nExplosion = ExtResource( 19 )\n\n[node name=\"ExplodeTimer\" type=\"Timer\" parent=\"StateMachine/Die\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 0.15\none_shot = false\nautostart = false\n\n[node name=\"Pivot\" type=\"Position2D\" parent=\".\" index=\"5\"]\n\n_sections_unfolded = [ \"Transform\", \"Visibility\", \"Z Index\" ]\n\n[node name=\"Body\" type=\"Sprite\" parent=\"Pivot\" index=\"0\"]\n\nposition = Vector2( -477.666, -688.279 )\nrotation = 0.0058149\ntexture = ExtResource( 3 )\noffset = Vector2( -1.98642, -55.6066 )\n_sections_unfolded = [ \"Offset\", \"Transform\", \"Visibility\", \"Z Index\" ]\n\n[node name=\"DamageSource\" parent=\".\" index=\"6\" instance=ExtResource( 20 )]\n\nposition = Vector2( 0, -27.075 )\nmonitorable = false\ndamage = 4\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\"DamageSource\" index=\"0\"]\n\nposition = Vector2( 0, -17.075 )\nshape = SubResource( 12 )\n\n[node name=\"HitBox\" parent=\".\" index=\"7\" instance=ExtResource( 21 )]\n\ncollision_layer = 8\ncollision_mask = 16\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\".\" index=\"8\"]\n\nposition = Vector2( 0, 21.5742 )\nbuild_mode = 0\npolygon = PoolVector2Array( -36, -96, 36, -96, 36, -24, -36, -24 )\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"BossLifebar\" parent=\".\" index=\"9\" instance=ExtResource( 22 )]\n\nmargin_top = -153.0\nmargin_bottom = -60.0\nboss_name = \"Wild Boar\"\n\n[connection signal=\"animation_finished\" from=\"AnimationPlayer\" to=\"StateMachine\" method=\"_on_animation_finished\"]\n\n[connection signal=\"health_changed\" from=\"Stats\" to=\".\" method=\"_on_Health_health_changed\"]\n\n[connection signal=\"health_depleted\" from=\"Stats\" to=\"StateMachine\" method=\"_on_Health_health_depleted\"]\n\n[connection signal=\"health_depleted\" from=\"Stats\" to=\".\" method=\"_on_Health_health_depleted\"]\n\n[connection signal=\"charge_direction_set\" from=\"StateMachine/ChargeSequence/Sprint\" to=\"StateMachine/ChargeSequence/Bump\" method=\"_on_Sprint_charge_direction_set\"]\n\n[connection signal=\"hit_wall\" from=\"StateMachine/ChargeSequence/Sprint\" to=\".\" method=\"_on_Sprint_hit_wall\"]\n\n[connection signal=\"finished\" from=\"StateMachine/Die\" to=\".\" method=\"_on_Die_finished\"]\n\n[connection signal=\"timeout\" from=\"StateMachine/Die/ExplodeTimer\" to=\"StateMachine/Die\" method=\"_on_ExplodeTimer_timeout\"]\n\n\n"
  },
  {
    "path": "monsters/bosses/wild_boar/WildBoarFSM.gd",
    "content": "extends \"res://utils/state/StateMachine.gd\"\n\nsignal phase_changed(number)\n\nvar sequence_cycles = 0\nexport(int, 1, 3) var phase = 1\n\nfunc _ready():\n\tfor child in get_children():\n\t\tchild.connect(\"finished\", self, \"go_to_next_state\")\n\nfunc initialize():\n\tchange_phase(phase)\n\nfunc _on_active_state_finished():\n\tgo_to_next_state()\n\nfunc go_to_next_state(state_override=null):\n\tif not active:\n\t\treturn\n\tcurrent_state.exit()\n\tcurrent_state = _decide_on_next_state() if state_override == null else state_override\n\temit_signal(\"state_changed\", current_state)\n\tcurrent_state.enter()\n\nfunc _decide_on_next_state():\n\t# Battle start\n\tif current_state == null:\n\t\treturn $Spawn\n\tif current_state == $Spawn:\n\t\treturn $RoamSequence\n\n\tif phase == 1:\n\t\tif current_state == $RoamSequence:\n\t\t\tsequence_cycles += 1\n\t\t\tif sequence_cycles < 2:\n\t\t\t\treturn $RoamSequence\n\t\t\telse:\n\t\t\t\tsequence_cycles = 0\n\t\t\t\treturn $Stomp\n\t\tif current_state == $Stomp:\n\t\t\treturn $RoamSequence\n\n\telif phase == 2:\n\t\tif current_state == $RoamSequence:\n\t\t\treturn $Stomp\n\t\tif current_state == $Stomp:\n\t\t\tif sequence_cycles < 2:\n\t\t\t\tsequence_cycles += 1\n\t\t\t\treturn $Stomp\n\t\t\telse:\n\t\t\t\tsequence_cycles = 0\n\t\t\t\treturn $ChargeSequence\n\t\tif current_state == $ChargeSequence:\n\t\t\treturn $RoamSequence\n\n\telif phase == 3:\n\t\tif current_state == $RoamSequence:\n\t\t\treturn $Stomp\n\t\tif current_state == $Stomp:\n\t\t\tif sequence_cycles < 2:\n\t\t\t\tsequence_cycles += 1\n\t\t\t\treturn $Stomp\n\t\t\telse:\n\t\t\t\tsequence_cycles = 0\n\t\t\t\treturn $ChargeSequence\n\t\tif current_state == $ChargeSequence:\n\t\t\tif sequence_cycles < 2:\n\t\t\t\tsequence_cycles += 1\n\t\t\t\treturn $ChargeSequence\n\t\t\telse:\n\t\t\t\tsequence_cycles = 0\n\t\t\t\treturn $Stomp\n\telif phase == 4:\n\t\treturn $RoamSequence\n\nfunc change_phase(new_phase):\n\tphase = new_phase\n\tvar anim_player = owner.get_node('AnimationPlayer')\n\tmatch new_phase:\n\t\t1:\n\t\t\tanim_player.playback_speed = 1.0\n\t\t2:\n\t\t\tanim_player.playback_speed = 1.4\n\t\t3:\n\t\t\tanim_player.playback_speed = 1.8\n\t\t4:\n\t\t\tanim_player.playback_speed = 1.0\n\temit_signal(\"phase_changed\", new_phase)\n\nfunc _on_Health_health_depleted():\n\tgo_to_next_state($Die)\n"
  },
  {
    "path": "monsters/bosses/wild_boar/debug/BossStatesDisplayer.gd",
    "content": "tool\nextends Panel\n\nfunc _ready():\n\tset_as_toplevel(true)\n\nfunc _on_WildBoar_state_changed(new_state_name):\n\t$State.text = new_state_name\n\nfunc _on_WildBoar_phase_changed(new_phase_name):\n\t$Phase.text = \"Phase: \" + new_phase_name\n"
  },
  {
    "path": "monsters/bosses/wild_boar/debug/StatesStackDiplayer.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://debug/states_stack_displayer.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://debug/fonts/stack_state_displayer_font.tres\" type=\"DynamicFont\" id=2]\n\n[node name=\"StatesStackDiplayer\" type=\"Panel\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 210.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = ExtResource( 1 )\n__meta__ = {\n\"_edit_group_\": true\n}\n\n[node name=\"Title\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.5\nanchor_top = 0.0\nanchor_right = 0.5\nanchor_bottom = 0.0\nmargin_left = -105.0\nmargin_right = 105.0\nmargin_bottom = 40.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 2 )\ntext = \"Player\"\nalign = 1\nvalign = 1\nuppercase = true\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n[node name=\"States\" type=\"Label\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 20.0\nmargin_top = 50.0\nmargin_right = 190.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 2 )\ntext = \"Jump\nTest\"\nalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n[node name=\"Numbers\" type=\"Label\" parent=\".\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 20.0\nmargin_top = 50.0\nmargin_right = 190.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 2 )\ntext = \"1.\n2.\"\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n\n"
  },
  {
    "path": "monsters/bosses/wild_boar/debug/StatesStackDisplayer.gd",
    "content": "tool\nextends Panel\n\nfunc _ready():\n\tset_as_toplevel(true)\n\nfunc _on_Player_state_changed(states_stack):\n\tvar states_names = ''\n\tvar numbers = ''\n\tvar index = 0\n\tfor state in states_stack:\n\t\tstates_names += state.get_name() + '\\n'\n\t\tnumbers += str(index) + '\\n'\n\t\tindex += 1\n\n\t$States.text = states_names\n\t$Numbers.text = numbers\n\n"
  },
  {
    "path": "monsters/bosses/wild_boar/sprites/front.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/front.png-057d3dd7010286ac73782a3387387e0a.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/bosses/wild_boar/sprites/front.png\"\ndest_files=[ \"res://.import/front.png-057d3dd7010286ac73782a3387387e0a.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/bosses/wild_boar/sprites/wild_boar_stomp_1.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/wild_boar_stomp_1.png-d07b8919e74a2c01fc887ee3913e97cc.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/bosses/wild_boar/sprites/wild_boar_stomp_1.png\"\ndest_files=[ \"res://.import/wild_boar_stomp_1.png-d07b8919e74a2c01fc887ee3913e97cc.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/bosses/wild_boar/sprites/wild_boar_stomp_2.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/wild_boar_stomp_2.png-17bc22f03cf0802ac3e65515e42132c8.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/bosses/wild_boar/sprites/wild_boar_stomp_2.png\"\ndest_files=[ \"res://.import/wild_boar_stomp_2.png-17bc22f03cf0802ac3e65515e42132c8.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/Die.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nexport(float) var MAX_RADIUS = 300.0\nexport(PackedScene) var Explosion\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('die')\n\t$ExplodeTimer.start()\n\nfunc _on_ExplodeTimer_timeout():\n\tspawn_explosion()\n\nfunc spawn_explosion():\n\tvar explosion_node = Explosion.instance()\n\texplosion_node.position = owner.position + calculate_random_offset()\n\tadd_child(explosion_node)\n\nfunc calculate_random_offset():\n\trandomize()\n\tvar random_angle = randf() * 2 * PI\n\trandomize()\n\tvar random_radius = (randf() * MAX_RADIUS) / 2 + MAX_RADIUS / 2\n\treturn Vector2(cos(random_angle) * random_radius, sin(random_angle) * random_radius)\n\nfunc _on_animation_finished(anim_name):\n\t$ExplodeTimer.stop()\n\tassert(anim_name == 'die')\n\tget_tree().create_timer(0.6).connect(\"timeout\", self, 'emit_signal', ['finished'])\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/Follow.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('stomp')\n\nfunc _on_animation_finished(anim_name):\n\temit_signal('finished')"
  },
  {
    "path": "monsters/bosses/wild_boar/states/ReturnToCenter.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nexport(float) var MASS = 4.0\nexport(float) var SLOW_RADIUS = 200.0\nexport(float) var MAX_SPEED = 300.0\nexport(float) var ARRIVE_DISTANCE = 6.0\n\nvar velocity = Vector2()\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('move')\n\nfunc update(delta):\n\tvelocity = Steering.arrive_to(velocity,\n\t\t\t\t\t\t\t\t  owner.global_position,\n\t\t\t\t\t\t\t\t  owner.start_global_position,\n\t\t\t\t\t\t\t\t  MASS,\n\t\t\t\t\t\t\t\t  SLOW_RADIUS,\n\t\t\t\t\t\t\t\t  MAX_SPEED)\n\towner.move_and_slide(velocity)\n\tif owner.global_position.distance_to(owner.start_global_position) < ARRIVE_DISTANCE:\n\t\temit_signal('finished')\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/Spawn.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.set_invincible(true)\n\towner.get_node('AnimationPlayer').play('spawn')\n\nfunc exit():\n\towner.set_invincible(false)\n\nfunc _on_animation_finished(anim_name):\n\tassert(anim_name == 'spawn')\n\temit_signal('finished')\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/charge/BumpWildBoar.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nexport(float) var SPEED = 60.0\nvar direction = Vector2(-1.0, 0.0)\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('bump')\n\towner.get_node('Pivot/Body').scale = Vector2(1.0, 1.0)\n\nfunc update(delta):\n\towner.move_and_slide(direction * SPEED)\n\nfunc _on_animation_finished(anim_name):\n\temit_signal('finished')\n\nfunc _on_Sprint_charge_direction_set(charge_direction):\n\tdirection = -charge_direction\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/charge/Prepare.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('prepare')\n\nfunc _on_animation_finished(anim_name):\n\temit_signal('finished')\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/charge/Sprint.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nsignal charge_direction_set(direction)\nsignal hit_wall()\n\nexport(float) var SPEED = 1000.0\nexport(float) var MAX_DISTANCE = 1200.0\n\nvar direction = Vector2()\nvar distance = 0.0\n\nconst DirectionalRock = preload(\"res://vfx/particles/rocks/DirectionalRock.tscn\")\nconst PlayerController = preload(\"res://actors/player/PlayerController.gd\")\n\nfunc enter():\n\tdistance = 0.0\n\tdirection = (owner.target.global_position - owner.global_position).normalized()\n\towner.get_node('AnimationPlayer').play('sprint')\n\towner.set_particles_active(true)\n\nfunc exit():\n\towner.set_particles_active(false)\n\nfunc update(delta):\n\tvar velocity = SPEED * direction\n\towner.move_and_slide(velocity)\n\tdistance += velocity.length() * delta\n\n\tif owner.get_slide_count() > 0:\n\t\tvar collision = owner.get_slide_collision(0)\n\t\tif not collision.collider is PlayerController:\n\t\t\tspawn_rock_particles(collision)\n\t\t\temit_signal('hit_wall')\n\t\temit_signal('charge_direction_set', direction)\n\t\temit_signal('finished')\n\telif distance > MAX_DISTANCE:\n\t\temit_signal('charge_direction_set', Vector2())\n\nfunc spawn_rock_particles(collision):\n\tvar rock_particles = DirectionalRock.instance()\n\tadd_child(rock_particles)\n\trock_particles.initialize(collision.position, collision.normal.angle())\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/roam/MoveToRandomPosition.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nexport(float) var ARRIVE_DISTANCE = 6.0\nexport(float) var SLOW_RADIUS = 200.0\nexport(float) var MASS = 4.0\nexport(float) var MAX_SPEED = 300.0\nexport(float) var ROAM_RADIUS = 150.0\n\nvar target_position = Vector2()\nvar start_position = Vector2()\nvar velocity = Vector2()\n\nfunc enter():\n\tstart_position = get_parent().start_position\n\ttarget_position = calculate_new_target_position()\n\towner.get_node('AnimationPlayer').play('move')\n\nfunc update(delta):\n\tvelocity = Steering.arrive_to(velocity, owner.global_position, target_position, MASS, SLOW_RADIUS, MAX_SPEED)\n\towner.move_and_slide(velocity)\n\tif owner.get_slide_count() > 0:\n\t\temit_signal('finished')\n\telif owner.global_position.distance_to(target_position) < ARRIVE_DISTANCE:\n\t\temit_signal('finished')\n\nfunc calculate_new_target_position():\n\trandomize()\n\tvar random_angle = randf() * 2 * PI\n\trandomize()\n\tvar random_radius = (randf() * ROAM_RADIUS) / 2 + ROAM_RADIUS / 2\n\treturn start_position + Vector2(cos(random_angle) * random_radius, sin(random_angle) * random_radius)\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/roam/RoamSequence.gd",
    "content": "extends \"res://utils/state/Sequence.gd\"\n\nvar start_position = Vector2()\n\nfunc enter():\n\tstart_position = owner.global_position\n\t.enter()\n\nfunc exit():\n\t.exit()\n\nfunc update(delta):\n\t.update(delta)\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/roam/Wait.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nfunc enter():\n\towner.get_node('AnimationPlayer').play('idle')\n\t$Timer.start()\n\nfunc update(delta):\n\tif $Timer.time_left <= 0.0:\n\t\temit_signal('finished')\n\nfunc exit():\n\t$Timer.stop()\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/stomp/GroundExplosion.gd",
    "content": "extends \"res://actors/DamageSource.gd\"\n\nfunc _ready():\n\t$AnimationPlayer.play('explode')\n\nfunc _physics_process(delta):\n\tposition = position\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/stomp/GroundExplosion.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://actors/DamageSource.tscn\" type=\"PackedScene\" id=1]\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/stomp/GroundExplosion.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://core/inventory/items/usable/scroll_fireball/fireball/particles/explosions/Explosion.tscn\" type=\"PackedScene\" id=3]\n\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 45.1559\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"explode\"\nlength = 0.5\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"CollisionShape2D:disabled\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.4 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 1,\n\"values\": [ false, true ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"Explosion:emitting\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.4 ),\n\"transitions\": PoolRealArray( 0, 0 ),\n\"update\": 1,\n\"values\": [ true, false ]\n}\ntracks/2/type = \"method\"\ntracks/2/path = NodePath(\".\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0.4 ),\n\"transitions\": PoolRealArray( 1 ),\n\"values\": [ {\n\"args\": [  ],\n\"method\": \"queue_free\"\n} ]\n}\n\n[node name=\"GroundExplosion\" instance=ExtResource( 1 )]\n\nscript = ExtResource( 2 )\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\" index=\"0\"]\n\nshape = SubResource( 1 )\ndisabled = true\n\n[node name=\"Explosion\" parent=\".\" index=\"1\" instance=ExtResource( 3 )]\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"2\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/explode = SubResource( 2 )\nblend_times = [  ]\n\n\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/stomp/Stomp.gd",
    "content": "extends \"res://utils/state/State.gd\"\n\nvar explosion_scene = preload(\"GroundExplosion.tscn\")\nvar explosion_count = 0\nvar direction = Vector2()\n\nfunc _ready():\n\t$ExplodeTimer.connect(\"timeout\", self, \"_on_ExplodeTimer_timeout\")\n\nfunc enter():\n\texplosion_count = 0\n\towner.get_node('AnimationPlayer').play('stomp')\n\nfunc _on_animation_finished(anim_name):\n\t$ExplodeTimer.stop()\n\temit_signal('finished')\n\nfunc stomp():\n\tdirection = (owner.target.position - owner.global_position).normalized()\n\t$ExplodeTimer.start()\n\texplode()\n\nfunc _on_ExplodeTimer_timeout():\n\texplode()\n\nfunc explode():\n\texplosion_count += 1\n\n\tvar new_explosion = explosion_scene.instance()\n\tnew_explosion.position = owner.position + explosion_count * direction * 80.0\n\tself.add_child(new_explosion)\n"
  },
  {
    "path": "monsters/bosses/wild_boar/states/stomp/Stomp.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://monsters/bosses/wild_boar/states/stomp/Stomp.gd\" type=\"Script\" id=1]\n\n\n\n\n\n[node name=\"Stomp\" type=\"Node\"]\n\nscript = ExtResource( 1 )\n\n[node name=\"ExplodeTimer\" type=\"Timer\" parent=\".\" index=\"0\"]\n\nprocess_mode = 1\nwait_time = 0.2\none_shot = false\nautostart = false\n\n\n"
  },
  {
    "path": "monsters/exclamation-mark.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/exclamation-mark.png-71455c01c46e91dfa6565f7fa57a362a.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/exclamation-mark.png\"\ndest_files=[ \"res://.import/exclamation-mark.png-71455c01c46e91dfa6565f7fa57a362a.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/exclamation-mark.svg.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/exclamation-mark.svg-17d593f918361282d38491dd92cc9311.stex\"\n\n[deps]\n\nsource_file=\"res://monsters/exclamation-mark.svg\"\nsource_md5=\"8148dc8f2a7d33524acc8429e13b1cf5\"\n\ndest_files=[ \"res://.import/exclamation-mark.svg-17d593f918361282d38491dd92cc9311.stex\" ]\ndest_md5=\"3647bb80cc90a5818d62bf39516420e2\"\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/mosquito/Mosquito.gd",
    "content": "extends '../Monster.gd'\n\nenum { IDLE, RETURN, SPOT, FOLLOW, DIE}\n\nexport(float) var FOLLOW_RANGE = 300.0\nexport(float) var MAX_FLY_SPEED = 360.0\n\nfunc _ready():\n\t_change_state(IDLE)\n\nfunc _change_state(new_state):\n\tmatch new_state:\n\t\tIDLE:\n\t\t\tpass\n\t\tDIE:\n\t\t\tqueue_free()\n\t\t\temit_signal('died')\n\tstate = new_state\n\nfunc _physics_process(delta):\n\tvar current_state = state\n\tmatch current_state:\n\t\tIDLE:\n\t\t\tif not target:\n\t\t\t\treturn\n\t\t\tif position.distance_to(target.position) <= FOLLOW_RANGE:\n\t\t\t\t_change_state(FOLLOW)\n\t\tFOLLOW:\n\t\t\tif not target:\n\t\t\t\treturn\n\t\t\tif position.distance_to(target.position) > FOLLOW_RANGE:\n\t\t\t\t_change_state(RETURN)\n\t\t\t\treturn\n\n\t\t\tvelocity = Steering.follow(velocity, position, target.position, MAX_FLY_SPEED)\n\t\t\tmove_and_slide(velocity)\n\t\t\trotation = velocity.angle()\n\t\tRETURN:\n\t\t\tvelocity = Steering.arrive_to(velocity, position, start_position)\n\t\t\tmove_and_slide(velocity)\n\t\t\trotation = velocity.angle()\n\n\t\t\tif position.distance_to(start_position) < ARRIVE_DISTANCE:\n\t\t\t\t_change_state(IDLE)\n\nfunc _on_DamageSource_area_entered(area):\n\t_change_state(DIE)\n\nfunc _on_Stats_damage_taken(new_health):\n\t_change_state(DIE)\n"
  },
  {
    "path": "monsters/mosquito/Mosquito.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://monsters/mosquito/Mosquito.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://actors/health/Stats.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://actors/hit_box/HitBox.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://actors/DamageSource.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://monsters/exclamation-mark.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://monsters/mosquito/mosquito.png\" type=\"Texture\" id=6]\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 38.4768\n\n[sub_resource type=\"CircleShape2D\" id=2]\n\ncustom_solver_bias = 0.0\nradius = 24.9469\n\n[node name=\"Mosquito\" type=\"KinematicBody2D\" groups=[\n\"character\",\n]]\n\nposition = Vector2( -1.98642, 0.817726 )\ninput_pickable = false\ncollision_layer = 2\ncollision_mask = 1\ncollision/safe_margin = 0.08\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\", \"Z Index\" ]\nARRIVE_DISTANCE = 6.0\nDEFAULT_SLOW_RADIUS = 200.0\nDEFAULT_MAX_SPEED = 300.0\nMASS = 8.0\nFOLLOW_RANGE = 300.0\nMAX_FLY_SPEED = 360.0\n\n[node name=\"Stats\" parent=\".\" index=\"0\" instance=ExtResource( 2 )]\n\nmax_health = 1\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\".\" index=\"1\"]\n\nposition = Vector2( -3.01358, 49.1823 )\nbuild_mode = 0\npolygon = PoolVector2Array( -18.0136, -69.4669, -18.0136, -29.4669, 31.9864, -29.4669, 31.9864, -69.4669 )\ndisabled = true\n_sections_unfolded = [ \"Transform\" ]\n\n[node name=\"HitBox\" parent=\".\" index=\"2\" instance=ExtResource( 3 )]\n\neditor/display_folded = true\ncollision_layer = 8\ncollision_mask = 16\n\n[node name=\"CollisionShape2D\" parent=\"HitBox\" index=\"0\"]\n\nposition = Vector2( 6, -2.42273 )\nshape = SubResource( 1 )\n\n[node name=\"DamageSource\" parent=\".\" index=\"3\" instance=ExtResource( 4 )]\n\neditor/display_folded = true\nmonitoring = true\n_sections_unfolded = [ \"Audio Bus\", \"Collision\" ]\ndamage = 3\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\"DamageSource\" index=\"0\"]\n\nposition = Vector2( 6, 0 )\nshape = SubResource( 2 )\n\n[node name=\"BodyPivot\" type=\"Position2D\" parent=\".\" index=\"4\"]\n\neditor/display_folded = true\nz_index = 2\n_sections_unfolded = [ \"Transform\", \"Visibility\", \"Z Index\" ]\n\n[node name=\"exclamation-mark\" type=\"Sprite\" parent=\"BodyPivot\" index=\"0\"]\n\nself_modulate = Color( 1, 1, 1, 0 )\nposition = Vector2( 74.8139, -90 )\nrotation = 0.253141\ntexture = ExtResource( 5 )\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"Sprite\" type=\"Sprite\" parent=\"BodyPivot\" index=\"1\"]\n\nposition = Vector2( 1.40846, -1.88954 )\ntexture = ExtResource( 6 )\noffset = Vector2( 15.695, 0.889542 )\n\n[node name=\"Timer\" type=\"Timer\" parent=\".\" index=\"5\"]\n\nprocess_mode = 1\nwait_time = 1.0\none_shot = false\nautostart = false\n\n[node name=\"RayCast2D\" type=\"RayCast2D\" parent=\".\" index=\"6\"]\n\nvisible = false\nenabled = false\nexclude_parent = true\ncast_to = Vector2( 0, 50 )\ncollision_mask = 1\n\n[connection signal=\"damage_taken\" from=\"Stats\" to=\".\" method=\"_on_Stats_damage_taken\"]\n\n[connection signal=\"area_entered\" from=\"DamageSource\" to=\".\" method=\"_on_DamageSource_area_entered\"]\n\n\n[editable path=\"HitBox\"]\n"
  },
  {
    "path": "monsters/mosquito/Nest.gd",
    "content": "extends Node2D\n\nexport(int) var MAX_MOSQUITO_COUNT = 2\n\nvar Mosquito = preload(\"Mosquito.tscn\")\n\nonready var timer = $SpawnTimer\nonready var collider = $SpawnArea/CollisionShape2D\nonready var mosquitos = $Mosquitos\n\nvar target\n\nfunc initialize(actor):\n\ttarget = actor\n\nfunc _on_SpawnTimer_timeout():\n\tif mosquitos.get_child_count() < MAX_MOSQUITO_COUNT:\n\t\tspawn_mosquito()\n\nfunc spawn_mosquito():\n\tvar new_mosquito = Mosquito.instance()\n\tnew_mosquito.global_position = calculate_random_spawn_position()\n\tnew_mosquito.initialize(target)\n\tmosquitos.add_child(new_mosquito)\n\nfunc calculate_random_spawn_position():\n\tvar spawn_radius = collider.shape.radius\n\n\tvar random_angle = randf() * 2 * PI\n\tvar random_radius = randf() * spawn_radius / 2 + spawn_radius / 2\n\n\treturn collider.global_position + Vector2(cos(random_angle) * random_radius, sin(random_angle) * random_radius)\n"
  },
  {
    "path": "monsters/mosquito/Nest.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://monsters/mosquito/Nest.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://monsters/mosquito/nest.png\" type=\"Texture\" id=2]\n\n[sub_resource type=\"CircleShape2D\" id=1]\n\ncustom_solver_bias = 0.0\nradius = 40.0\n\n[sub_resource type=\"GDScript\" id=2]\n\nscript/source = \"extends Timer\n\nfunc _ready():\n\twait_time = randf() *1.5 + 2.0\n\"\n\n[node name=\"Nest\" type=\"Node2D\" index=\"0\" groups=[\n\"monster\",\n]]\n\nposition = Vector2( 468, 202 )\nscript = ExtResource( 1 )\nMAX_MOSQUITO_COUNT = 2\n\n[node name=\"Sprite\" type=\"Sprite\" parent=\".\" index=\"0\"]\n\nposition = Vector2( 0, 10 )\ntexture = ExtResource( 2 )\n\n[node name=\"SpawnArea\" type=\"Area2D\" parent=\".\" index=\"1\"]\n\ninput_pickable = true\ngravity_vec = Vector2( 0, 1 )\ngravity = 98.0\nlinear_damp = 0.1\nangular_damp = 1.0\nmonitoring = false\nmonitorable = false\naudio_bus_override = false\naudio_bus_name = \"Master\"\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\"SpawnArea\" index=\"0\"]\n\nposition = Vector2( 0, -6.43921 )\nshape = SubResource( 1 )\n\n[node name=\"SpawnTimer\" type=\"Timer\" parent=\".\" index=\"2\"]\n\nprocess_mode = 1\nwait_time = 2.0\none_shot = false\nautostart = true\nscript = SubResource( 2 )\n\n[node name=\"Mosquitos\" type=\"Node\" parent=\".\" index=\"3\"]\n\n[connection signal=\"timeout\" from=\"SpawnTimer\" to=\".\" method=\"_on_SpawnTimer_timeout\"]\n\n\n"
  },
  {
    "path": "monsters/mosquito/mosquito.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/mosquito.png-321e9de6070b983093d0eeac1e99b420.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/mosquito/mosquito.png\"\ndest_files=[ \"res://.import/mosquito.png-321e9de6070b983093d0eeac1e99b420.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/mosquito/nest.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/nest.png-b3e74c0f42f31be173ab28e91ca5d1a6.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/mosquito/nest.png\"\ndest_files=[ \"res://.import/nest.png-b3e74c0f42f31be173ab28e91ca5d1a6.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "monsters/porcupine/Porcupine.gd",
    "content": "extends '../Monster.gd'\n\nenum { IDLE, ROAM, RETURN, SPOT, FOLLOW, STAGGER, PREPARE_TO_CHARGE, CHARGE, BUMP, BUMP_COOLDOWN, HIT_PLAYER_COOLDOWN, DIE, DEAD}\n\nexport(float) var MAX_ROAM_SPEED = 200.0\nexport(float) var MAX_FOLLOW_SPEED = 400.0\nexport(float) var MAX_CHARGE_SPEED = 900.0\n\nexport(float) var SPOT_RANGE = 460.0\nexport(float) var FOLLOW_RANGE = 700.0\nexport(float) var BUMP_RANGE = 90.0\n\nexport(float) var CHARGE_RANGE = 340.0\nexport(float) var PREPARE_TO_CHARGE_WAIT_TIME = 0.9\n\nonready var timer = $Timer\nonready var body_pivot = $BodyPivot\nonready var dust_puffs = $DustPuffs\nonready var anim_player = $AnimationPlayer\nonready var tween = $Tween\n\nvar charge_direction = Vector2()\nvar charge_distance = 0.0\n\nexport(float) var ROAM_RADIUS = 140.0\n\nvar roam_target_position = Vector2()\nvar roam_slow_radius = 0.0\n\nexport(float) var BUMP_DISTANCE = 60.0\nexport(float) var BUMP_DURATION = 0.2\nexport(float) var MAX_BUMP_HEIGHT = 50.0\n\nexport(float) var BUMP_COOLDOWN_DURATION = 0.6\n\nfunc initialize(target_actor):\n\t.initialize(target_actor)\n\ttween.connect('tween_completed', self, '_on_tween_completed')\n\tanim_player.connect('animation_finished', self, '_on_animation_finished')\n\ttimer.connect('timeout', self, '_on_Timer_timeout')\n\t_change_state(IDLE)\n\nfunc _change_state(new_state):\n\tif not active:\n\t\treturn\n\tmatch state:\n\t\tIDLE:\n\t\t\ttimer.stop()\n\t\tCHARGE:\n\t\t\tdust_puffs.emitting = false\n\tmatch new_state:\n\t\tIDLE:\n\t\t\trandomize()\n\t\t\ttimer.wait_time = randf() * 2 + 1.0\n\t\t\ttimer.start()\n\t\tROAM:\n\t\t\trandomize()\n\t\t\tvar random_angle = randf() * 2 * PI\n\t\t\trandomize()\n\t\t\tvar random_radius = (randf() * ROAM_RADIUS) / 2 + ROAM_RADIUS / 2\n\t\t\troam_target_position = start_position + Vector2(cos(random_angle) * random_radius, sin(random_angle) * random_radius)\n\t\t\troam_slow_radius = roam_target_position.distance_to(start_position) / 2\n\t\tSTAGGER:\n\t\t\tanim_player.play(\"stagger\")\n\t\tSPOT:\n\t\t\tanim_player.play('spot')\n\t\tPREPARE_TO_CHARGE:\n\t\t\ttimer.wait_time = PREPARE_TO_CHARGE_WAIT_TIME\n\t\t\ttimer.start()\n\t\tCHARGE:\n\t\t\tif not target:\n\t\t\t\treturn\n\t\t\tcharge_direction = (target.position - position).normalized()\n\t\t\tcharge_distance = 0.0\n\t\t\tdust_puffs.emitting = true\n\t\tBUMP:\n\t\t\tanim_player.stop()\n\t\t\tvar bump_direction = - velocity.normalized()\n\t\t\ttween.interpolate_property(self, 'position', position, position + BUMP_DISTANCE * bump_direction, BUMP_DURATION, Tween.TRANS_LINEAR, Tween.EASE_IN)\n\t\t\ttween.interpolate_method(self, '_animate_bump_height', 0, 1, BUMP_DURATION, Tween.TRANS_LINEAR, Tween.EASE_IN)\n\t\t\ttween.start()\n\t\tBUMP_COOLDOWN:\n\t\t\trandomize()\n\t\t\tget_tree().create_timer(BUMP_COOLDOWN_DURATION).connect('timeout', self, '_change_state', [FOLLOW])\n\t\tDEAD:\n\t\t\tanim_player.play(\"die\")\n\t\t\tset_active(false)\n\t\t\tyield(anim_player, \"animation_finished\")\n\t\t\tqueue_free()\n\tstate = new_state\n\nfunc _physics_process(delta):\n\tvar current_state = state\n\tmatch current_state:\n\t\tIDLE:\n\t\t\tif not target:\n\t\t\t\treturn\n\t\t\tif position.distance_to(target.position) < SPOT_RANGE:\n\t\t\t\t_change_state(SPOT)\n\t\tROAM:\n\t\t\tvelocity = Steering.arrive_to(velocity, position, roam_target_position, roam_slow_radius, MAX_ROAM_SPEED)\n\t\t\tmove_and_slide(velocity)\n\t\t\tif position.distance_to(roam_target_position) < ARRIVE_DISTANCE:\n\t\t\t\t_change_state(IDLE)\n\t\t\tif not target:\n\t\t\t\treturn\n\t\t\telif position.distance_to(target.position) < SPOT_RANGE:\n\t\t\t\t_change_state(SPOT)\n\t\tRETURN:\n\t\t\tvelocity = Steering.arrive_to(velocity, position, start_position, roam_slow_radius, MAX_ROAM_SPEED)\n\t\t\tmove_and_slide(velocity)\n\t\t\tif position.distance_to(start_position) < ARRIVE_DISTANCE:\n\t\t\t\t_change_state(IDLE)\n\t\t\telif not target:\n\t\t\t\treturn\n\t\t\telif position.distance_to(target.position) < SPOT_RANGE:\n\t\t\t\t_change_state(SPOT)\n\t\tFOLLOW:\n\t\t\tif not target:\n\t\t\t\t_change_state(RETURN)\n\t\t\t\treturn\n\t\t\tvelocity = Steering.follow(velocity, position, target.position, MAX_FOLLOW_SPEED)\n\t\t\tmove_and_slide(velocity)\n\n\t\t\tif position.distance_to(target.position) < CHARGE_RANGE:\n\t\t\t\t_change_state(PREPARE_TO_CHARGE)\n\n\t\t\tif position.distance_to(target.position) > FOLLOW_RANGE:\n\t\t\t\t_change_state(RETURN)\n\t\tCHARGE:\n\t\t\tif charge_distance > 800.0 or not target:\n\t\t\t\t_change_state(BUMP_COOLDOWN)\n\t\t\t\treturn\n\n\t\t\tvelocity = charge_direction * MAX_CHARGE_SPEED\n\t\t\tcharge_distance += velocity.length() * delta\n\t\t\tmove_and_slide(velocity)\n\t\t\tif get_slide_count() > 0:\n\t\t\t\t_change_state(BUMP)\n\nfunc _on_animation_finished(anim_name):\n\tmatch anim_name:\n\t\t'spot':\n\t\t\t_change_state(FOLLOW)\n\t\t'stagger':\n\t\t\t_change_state(IDLE)\n\nfunc _animate_bump_height(progress):\n\tbody_pivot.position.y = -pow(sin(progress * PI), 0.4) * MAX_BUMP_HEIGHT\n\nfunc _on_tween_completed(object, key):\n\t_change_state(BUMP_COOLDOWN)\n\nfunc _on_Timer_timeout():\n\tmatch state:\n\t\tIDLE:\n\t\t\t_change_state(ROAM)\n\t\tPREPARE_TO_CHARGE:\n\t\t\t_change_state(CHARGE)\n\nfunc _on_Stats_damage_taken(new_health):\n\t_change_state(STAGGER)\n\nfunc _on_Stats_health_depleted():\n\t_change_state(DEAD)\n"
  },
  {
    "path": "monsters/porcupine/Porcupine.tscn",
    "content": "[gd_scene load_steps=16 format=2]\n\n[ext_resource path=\"res://monsters/porcupine/Porcupine.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://actors/health/Stats.tscn\" type=\"PackedScene\" id=2]\n[ext_resource path=\"res://actors/hit_box/HitBox.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://actors/DamageSource.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://monsters/porcupine/porcupine.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://monsters/exclamation-mark.png\" type=\"Texture\" id=6]\n[ext_resource path=\"res://vfx/particles/dust_puffs/DustPuffs.tscn\" type=\"PackedScene\" id=7]\n[ext_resource path=\"res://interface/gui/lifebar/InterfaceAnchor.tscn\" type=\"PackedScene\" id=8]\n\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"BodyPivot/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"BodyPivot/Body:scale\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ) ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"die\"\nlength = 0.7\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.35, 0.5, 0.7 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"BodyPivot/Body:scale\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.35, 0.45, 0.65 ),\n\"transitions\": PoolRealArray( 1, 1, 2.94246, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 0.812022, 1.23284 ), Vector2( 2.7717, 0.0452506 ) ]\n}\n\n[sub_resource type=\"Animation\" id=3]\n\nresource_name = \"idle\"\nlength = 1.0\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ) ]\n}\n\n[sub_resource type=\"Animation\" id=4]\n\nresource_name = \"spot\"\nlength = 0.9\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ) ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\"BodyPivot/Body:rotation_degrees\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\ntracks/2/type = \"value\"\ntracks/2/path = NodePath(\"BodyPivot/exclamation-mark:visible\")\ntracks/2/interp = 1\ntracks/2/loop_wrap = true\ntracks/2/imported = false\ntracks/2/enabled = true\ntracks/2/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 1,\n\"values\": [ true ]\n}\ntracks/3/type = \"value\"\ntracks/3/path = NodePath(\"BodyPivot/exclamation-mark:position\")\ntracks/3/interp = 1\ntracks/3/loop_wrap = true\ntracks/3/imported = false\ntracks/3/enabled = true\ntracks/3/keys = {\n\"times\": PoolRealArray( 0, 0.2, 0.25 ),\n\"transitions\": PoolRealArray( 0.382544, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 54.0852, -65 ), Vector2( 74.1273, -90 ), Vector2( 74.8139, -90 ) ]\n}\ntracks/4/type = \"value\"\ntracks/4/path = NodePath(\"BodyPivot/exclamation-mark:rotation_degrees\")\ntracks/4/interp = 1\ntracks/4/loop_wrap = true\ntracks/4/imported = false\ntracks/4/enabled = true\ntracks/4/keys = {\n\"times\": PoolRealArray( 0, 0.2, 0.25 ),\n\"transitions\": PoolRealArray( 0.382544, 1, 1 ),\n\"update\": 0,\n\"values\": [ 3.97992, 12.3991, 14.5039 ]\n}\ntracks/5/type = \"value\"\ntracks/5/path = NodePath(\"BodyPivot/exclamation-mark:scale\")\ntracks/5/interp = 1\ntracks/5/loop_wrap = true\ntracks/5/imported = false\ntracks/5/enabled = true\ntracks/5/keys = {\n\"times\": PoolRealArray( 0, 0.2, 0.25 ),\n\"transitions\": PoolRealArray( 0.382544, 1, 1 ),\n\"update\": 0,\n\"values\": [ Vector2( 0.315916, 0.315916 ), Vector2( 1.05264, 1.05264 ), Vector2( 1, 1 ) ]\n}\ntracks/6/type = \"value\"\ntracks/6/path = NodePath(\"BodyPivot/exclamation-mark:self_modulate\")\ntracks/6/interp = 1\ntracks/6/loop_wrap = true\ntracks/6/imported = false\ntracks/6/enabled = true\ntracks/6/keys = {\n\"times\": PoolRealArray( 0, 0.5, 0.7 ),\n\"transitions\": PoolRealArray( 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]\n}\n\n[sub_resource type=\"Animation\" id=5]\n\nlength = 0.5\nloop = false\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.4 ),\n\"transitions\": PoolRealArray( 1, 1, 1, 1, 1, 1 ),\n\"update\": 0,\n\"values\": [ Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0.296875, 0.296875, 1 ), Color( 1, 1, 1, 1 ) ]\n}\n\n[sub_resource type=\"Animation\" id=6]\n\nlength = 0.3\nloop = true\nstep = 0.05\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\"BodyPivot/Body:position\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.15 ),\n\"transitions\": PoolRealArray( 0.367583, 1.73627 ),\n\"update\": 0,\n\"values\": [ Vector2( 3.57628e-007, 17.6051 ), Vector2( 0, 0.113144 ) ]\n}\n\n[sub_resource type=\"CircleShape2D\" id=7]\n\ncustom_solver_bias = 0.0\nradius = 35.906\n\n[node name=\"Porcupine\" type=\"KinematicBody2D\" groups=[\n\"monster\",\n]]\n\nposition = Vector2( -1.98642, 0.817726 )\ninput_pickable = false\ncollision_layer = 2\ncollision_mask = 3\ncollision/safe_margin = 0.08\nscript = ExtResource( 1 )\n_sections_unfolded = [ \"Collision\", \"Z Index\" ]\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"0\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/SETUP = SubResource( 1 )\nanims/die = SubResource( 2 )\nanims/idle = SubResource( 3 )\nanims/spot = SubResource( 4 )\nanims/stagger = SubResource( 5 )\nanims/walk = SubResource( 6 )\nblend_times = [  ]\n\n[node name=\"Tween\" type=\"Tween\" parent=\".\" index=\"1\"]\n\nrepeat = false\nplayback_process_mode = 1\nplayback_speed = 1.0\nplayback/active = false\nplayback/repeat = false\nplayback/speed = 1.0\n\n[node name=\"CollisionPolygon2D\" type=\"CollisionPolygon2D\" parent=\".\" index=\"2\"]\n\nposition = Vector2( 0, 48.6492 )\nbuild_mode = 0\npolygon = PoolVector2Array( -36, -96, 36, -96, 36, -24, -36, -24 )\n\n[node name=\"Stats\" parent=\".\" index=\"3\" instance=ExtResource( 2 )]\n\nmax_health = 5\n\n[node name=\"HitBox\" parent=\".\" index=\"4\" instance=ExtResource( 3 )]\n\ncollision_layer = 8\ncollision_mask = 16\n\n[node name=\"DamageSource\" parent=\".\" index=\"5\" instance=ExtResource( 4 )]\n\neditor/display_folded = true\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\"DamageSource\" index=\"0\"]\n\nposition = Vector2( -1.19209e-007, -14 )\nshape = SubResource( 7 )\n\n[node name=\"BodyPivot\" type=\"Position2D\" parent=\".\" index=\"6\"]\n\neditor/display_folded = true\nz_index = 2\n_sections_unfolded = [ \"Transform\", \"Visibility\", \"Z Index\" ]\n\n[node name=\"Body\" type=\"Sprite\" parent=\"BodyPivot\" index=\"0\"]\n\nposition = Vector2( 3.57628e-007, 17.6051 )\ntexture = ExtResource( 5 )\noffset = Vector2( 0.0850579, -32.8777 )\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"exclamation-mark\" type=\"Sprite\" parent=\"BodyPivot\" index=\"1\"]\n\nself_modulate = Color( 1, 1, 1, 0 )\nposition = Vector2( 74.8139, -90 )\nrotation = 0.253141\ntexture = ExtResource( 6 )\n_sections_unfolded = [ \"Visibility\" ]\n\n[node name=\"Timer\" type=\"Timer\" parent=\".\" index=\"7\"]\n\nprocess_mode = 1\nwait_time = 1.0\none_shot = false\nautostart = false\n\n[node name=\"DustPuffs\" parent=\".\" index=\"8\" instance=ExtResource( 7 )]\n\nemitting = false\n\n[node name=\"InterfaceAnchor\" parent=\".\" index=\"9\" instance=ExtResource( 8 )]\n\nposition = Vector2( 0, -106.219 )\n_sections_unfolded = [ \"Transform\" ]\n\n[connection signal=\"damage_taken\" from=\"Stats\" to=\".\" method=\"_on_Stats_damage_taken\"]\n\n[connection signal=\"health_depleted\" from=\"Stats\" to=\".\" method=\"_on_Stats_health_depleted\"]\n\n\n"
  },
  {
    "path": "monsters/porcupine/porcupine.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/porcupine.png-8034b65048f25f0e61302d6bff865dcc.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://monsters/porcupine/porcupine.png\"\ndest_files=[ \"res://.import/porcupine.png-8034b65048f25f0e61302d6bff865dcc.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "project.godot",
    "content": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go here are not all obvious.\n;\n; Format:\n;   [section] ; section goes between []\n;   param=value ; assign values to parameters\n\nconfig_version=4\n\n_global_script_classes=[ {\n\"base\": \"Control\",\n\"class\": \"Menu\",\n\"language\": \"GDScript\",\n\"path\": \"res://interface/menus/Menu.gd\"\n} ]\n_global_script_class_icons={\n\"Menu\": \"\"\n}\n\n[Colors]\n\nblue=\"#2196F3\"\npink=\"#C23A61\"\npurple=\"#6200EA\"\nyellow=\"#FFCA28\"\n\n[application]\n\nconfig/name=\"Make Pro 2D Games with Godot\"\nrun/main_scene=\"res://Demo.tscn\"\nconfig/icon=\"res://icon.png\"\nrun/debug=true\n\n[autoload]\n\nSteering=\"*res://utils/autoload/Steering.gd\"\nItemDatabase=\"*res://core/inventory/ItemDatabase.tscn\"\n\n[display]\n\nwindow/size/width=1920\nwindow/size/height=1080\nwindow/size/fullscreen=true\nwindow/stretch/mode=\"2d\"\nwindow/stretch/aspect=\"keep\"\n\n[input]\n\nfire={\n\"deadzone\": 0.5,\n\"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)\n, Object(InputEventJoypadButton,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"button_index\":2,\"pressure\":0.0,\"pressed\":false,\"script\":null)\n ]\n}\nrun={\n\"deadzone\": 0.5,\n\"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\":16777237,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventJoypadButton,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"button_index\":7,\"pressure\":0.0,\"pressed\":false,\"script\":null)\n ]\n}\njump={\n\"deadzone\": 0.5,\n\"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\":32,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventJoypadButton,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"button_index\":0,\"pressure\":0.0,\"pressed\":false,\"script\":null)\n ]\n}\nsimulate_damage={\n\"deadzone\": 0.5,\n\"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\":88,\"unicode\":0,\"echo\":false,\"script\":null)\n ]\n}\nattack={\n\"deadzone\": 0.5,\n\"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)\n ]\n}\npause={\n\"deadzone\": 0.5,\n\"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\":16777217,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventJoypadButton,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"button_index\":11,\"pressure\":0.0,\"pressed\":false,\"script\":null)\n ]\n}\ntoggle_fullscreen={\n\"deadzone\": 0.5,\n\"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\":16777254,\"unicode\":0,\"echo\":false,\"script\":null)\n ]\n}\ndiscrete_move_left={\n\"deadzone\": 0.5,\n\"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\":65,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"command\":false,\"pressed\":false,\"scancode\":16777231,\"unicode\":0,\"echo\":false,\"script\":null)\n ]\n}\ndiscrete_move_right={\n\"deadzone\": 0.5,\n\"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\":68,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"command\":false,\"pressed\":false,\"scancode\":16777233,\"unicode\":0,\"echo\":false,\"script\":null)\n ]\n}\ndiscrete_move_down={\n\"deadzone\": 0.5,\n\"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\":83,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"command\":false,\"pressed\":false,\"scancode\":16777234,\"unicode\":0,\"echo\":false,\"script\":null)\n ]\n}\ndiscrete_move_up={\n\"deadzone\": 0.5,\n\"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\":87,\"unicode\":0,\"echo\":false,\"script\":null)\n, Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"command\":false,\"pressed\":false,\"scancode\":16777232,\"unicode\":0,\"echo\":false,\"script\":null)\n ]\n}\njoy_move_left={\n\"deadzone\": 0.5,\n\"events\": [ Object(InputEventJoypadMotion,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"axis\":0,\"axis_value\":-1.0,\"script\":null)\n ]\n}\njoy_move_right={\n\"deadzone\": 0.5,\n\"events\": [ Object(InputEventJoypadMotion,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"axis\":0,\"axis_value\":1.0,\"script\":null)\n ]\n}\njoy_move_up={\n\"deadzone\": 0.5,\n\"events\": [ Object(InputEventJoypadMotion,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"axis\":1,\"axis_value\":-1.0,\"script\":null)\n ]\n}\njoy_move_down={\n\"deadzone\": 0.5,\n\"events\": [ Object(InputEventJoypadMotion,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":0,\"axis\":1,\"axis_value\":1.0,\"script\":null)\n ]\n}\n\n[layer_names]\n\n2d_physics/layer_1=\"motion\"\n2d_physics/layer_2=\"environment\"\n2d_physics/layer_3=\"hitbox_characters\"\n2d_physics/layer_4=\"hitbox_monsters\"\n2d_physics/layer_5=\"weapon\"\n2d_physics/layer_6=\"damager_area\"\n2d_physics/layer_7=\"collectibles\"\n2d_physics/layer_8=\"collector\"\n\n[rendering]\n\nquality/2d/use_pixel_snap=true\nenvironment/default_environment=\"res://default_env.tres\"\n"
  },
  {
    "path": "utils/autoload/Steering.gd",
    "content": "extends Node\n\nconst DEFAULT_MASS = 2.0\nconst DEFAULT_SLOW_RADIUS = 200.0\nconst DEFAULT_MAX_SPEED = 300.0\n\nfunc arrive_to(velocity,\n\t\t\t   position,\n\t\t\t   target_position,\n\t\t\t   mass=DEFAULT_MASS,\n\t\t\t   slow_radius=DEFAULT_SLOW_RADIUS,\n\t\t\t   max_speed=DEFAULT_MAX_SPEED):\n\t\"\"\"\n\tCalculates and returns a new velocity with the arrive steering behavior arrived based on\n\tan existing velocity (Vector2), the object's current and target positions (Vector2)\n\t\"\"\"\n\tvar distance_to_target = position.distance_to(target_position)\n\n\tvar desired_velocity = (target_position - position).normalized() * max_speed\n\tif distance_to_target < slow_radius:\n\t\tdesired_velocity *= (distance_to_target / slow_radius) * .75 + .25\n\tvar steering = (desired_velocity - velocity) / mass\n\n\treturn velocity + steering\n\nfunc follow(velocity, \n\t\t\tposition,\n\t\t\ttarget_position,\n\t\t\tmax_speed,\n\t\t\tmass=DEFAULT_MASS):\n\tvar desired_velocity = (target_position - position).normalized() * max_speed\n\n#\tvar push = calculate_avoid_force(desired_velocity)\n#\tvar steering = (desired_velocity - velocity + push) / mass\n\tvar steering = (desired_velocity - velocity) / mass\n\n\treturn velocity + steering\n"
  },
  {
    "path": "utils/debug/ControlsPanel.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://utils/debug/TopLevelUI.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/fonts/source_code_pro_explanations.tres\" type=\"DynamicFont\" id=2]\n\n\n\n\n[node name=\"ControlsPanel\" type=\"Panel\" index=\"0\"]\n\nanchor_left = 1.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 0.0\nmargin_left = -220.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = ExtResource( 1 )\n\n[node name=\"Keys\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 10.0\nmargin_top = 10.0\nmargin_right = -10.0\nmargin_bottom = -10.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 2 )\ntext = \"Shoot:\nAttack:\nStagger:\nJump:\nSprint:\"\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"BBCode\", \"custom_fonts\" ]\n\n[node name=\"Keys2\" type=\"Label\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 10.0\nmargin_top = 10.0\nmargin_right = -10.0\nmargin_bottom = -10.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = ExtResource( 2 )\ntext = \"R\nF\nX\nSpace\nShift\"\nalign = 2\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"BBCode\", \"custom_fonts\" ]\n\n\n"
  },
  {
    "path": "utils/debug/Explanations.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://interface/fonts/source_code_pro_explanations_bold.tres\" type=\"DynamicFont\" id=1]\n[ext_resource path=\"res://interface/fonts/source_code_pro_explanations.tres\" type=\"DynamicFont\" id=2]\n[ext_resource path=\"res://utils/debug/TopLevelUI.gd\" type=\"Script\" id=3]\n\n\n\n\n\n[node name=\"Explanations\" type=\"RichTextLabel\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nmargin_left = 10.0\nmargin_top = -370.0\nmargin_right = -10.0\nmargin_bottom = -730.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/bold_font = ExtResource( 1 )\ncustom_fonts/normal_font = ExtResource( 2 )\nbbcode_enabled = true\nbbcode_text = \"This example shows how to apply the State programming pattern in GDscript, including Hierarchical States, and a pushdown automaton. \n\nStates are common in games. You can use the pattern to:\n\n1. Separate each behavior and transitions between behaviors, thus make scripts shorter and easier to manage\n2. Respect the Single Responsibility Principle. Each State object represents [b]one[/b] action\n3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.\n\nYou can read more about States in the excellent [url=http://gameprogrammingpatterns.com/state.html]Game Programming Patterns ebook[/url].\"\nvisible_characters = -1\npercent_visible = 1.0\nmeta_underlined = true\ntab_size = 4\ntext = \"This example shows how to apply the State programming pattern in GDscript, including Hierarchical States, and a pushdown automaton. \n\nStates are common in games. You can use the pattern to:\n\n1. Separate each behavior and transitions between behaviors, thus make scripts shorter and easier to manage\n2. Respect the Single Responsibility Principle. Each State object represents one action\n3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.\n\nYou can read more about States in the excellent Game Programming Patterns ebook.\"\nscroll_active = true\nscroll_following = false\nselection_enabled = false\noverride_selected_font_color = false\nscript = ExtResource( 3 )\n_sections_unfolded = [ \"BBCode\", \"custom_fonts\" ]\n__meta__ = {\n\"_edit_lock_\": true\n}\n\n\n"
  },
  {
    "path": "utils/debug/StatesStackDiplayer.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://utils/debug/StatesStackDisplayer.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://interface/fonts/SourceCodePro-Bold.ttf\" type=\"DynamicFontData\" id=2]\n\n\n\n\n[sub_resource type=\"DynamicFont\" id=1]\n\nsize = 20\nuse_mipmaps = false\nuse_filter = true\nfont_data = ExtResource( 2 )\n_sections_unfolded = [ \"Font\", \"Settings\" ]\n\n[node name=\"StatesStackDiplayer\" type=\"Panel\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_right = 210.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\nscript = ExtResource( 1 )\n__meta__ = {\n\"_edit_group_\": true\n}\n\n[node name=\"Title\" type=\"Label\" parent=\".\" index=\"0\"]\n\nanchor_left = 0.5\nanchor_top = 0.0\nanchor_right = 0.5\nanchor_bottom = 0.0\nmargin_left = -105.0\nmargin_right = 105.0\nmargin_bottom = 40.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = SubResource( 1 )\ntext = \"Pushown\"\nalign = 1\nvalign = 1\nuppercase = true\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n[node name=\"States\" type=\"Label\" parent=\".\" index=\"1\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 20.0\nmargin_top = 50.0\nmargin_right = 190.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = SubResource( 1 )\ntext = \"Jump\nTest\"\nalign = 1\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n[node name=\"Numbers\" type=\"Label\" parent=\".\" index=\"2\"]\n\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_left = 20.0\nmargin_top = 50.0\nmargin_right = 190.0\nmargin_bottom = 170.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 2\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 4\ncustom_fonts/font = SubResource( 1 )\ntext = \"1.\n2.\"\npercent_visible = 1.0\nlines_skipped = 0\nmax_lines_visible = -1\n_sections_unfolded = [ \"custom_fonts\" ]\n\n\n"
  },
  {
    "path": "utils/debug/StatesStackDisplayer.gd",
    "content": "tool\nextends Panel\n\nfunc _ready():\n\tset_as_toplevel(true)\n\nfunc _on_Player_state_changed(states_stack):\n\tvar states_names = ''\n\tvar numbers = ''\n\tvar index = 0\n\tfor state in states_stack:\n\t\tstates_names += state.get_name() + '\\n'\n\t\tnumbers += str(index) + '\\n'\n\t\tindex += 1\n\n\t$States.text = states_names\n\t$Numbers.text = numbers\n\n"
  },
  {
    "path": "utils/debug/TopLevelUI.gd",
    "content": "tool\nextends Control\n\nfunc _ready():\n\tset_as_toplevel(true)\n"
  },
  {
    "path": "utils/state/Sequence.gd",
    "content": "\"\"\"\nSequence is a State that delegates calls to one of its children\nat the time, in the tree order\nIt automates the creation of new sequences of behaviors,\na bit as in a behavior tree, although in this case each sub-state\nhas to finish its job\nTo tell the state machine when a sequence is over\n\"\"\"\nextends 'State.gd'\n\nvar state_active = null\n\nfunc _ready():\n\tfor child in get_children():\n\t\tchild.connect('finished', self, '_on_state_active_finished')\n\t\tif child.owner != owner:\n\t\t\tchild.set_owner(owner)\n\nfunc enter():\n\tstate_active = get_child(0)\n\tstate_active.enter()\n\nfunc exit():\n\tstate_active = null\n\nfunc update(delta):\n\tstate_active.update(delta)\n\nfunc _on_animation_finished(anim_name):\n\tstate_active._on_animation_finished(anim_name)\n\nfunc _on_state_active_finished():\n\tgo_to_next_state_in_sequence()\n\nfunc go_to_next_state_in_sequence():\n\tstate_active.exit()\n\t\n\tvar new_state_index = (state_active.get_index() + 1) % get_child_count()\n\tif new_state_index == 0:\n\t\temit_signal('finished')\n\t\treturn\n\tstate_active = get_child(new_state_index)\n\t\n\tstate_active.enter()\n"
  },
  {
    "path": "utils/state/Sequence.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://utils/state/Sequence.gd\" type=\"Script\" id=1]\n\n[node name=\"Sequence\" type=\"Node\" index=\"0\"]\n\nscript = ExtResource( 1 )\n\n\n"
  },
  {
    "path": "utils/state/State.gd",
    "content": "\"\"\"\nBase interface for all states: it doesn't do anything in itself\nbut forces us to pass the right arguments to the methods below\nand makes sure every State object had all of these methods.\n\"\"\"\nextends Node\n\nsignal finished(next_state_name)\n\nfunc enter():\n\treturn\n\nfunc exit():\n\treturn\n\nfunc handle_input(event):\n\treturn\n\nfunc update(delta):\n\treturn\n\nfunc _on_animation_finished(anim_name):\n\treturn\n"
  },
  {
    "path": "utils/state/StateMachine.gd",
    "content": "\"\"\"\nBase interface for a generic state machine\nIt handles initializing, setting the machine active or not\ndelegating _physics_process, _input calls to the State nodes,\nand changing the current/active state.\n\"\"\"\nextends Node\n\nsignal state_changed(current_state)\n\nvar states_map = {}\n\nvar states_stack = []\nvar current_state = null\nexport(bool) var active = false setget set_active\n\nfunc _ready():\n\tstates_stack.push_front(get_child(0))\n\tcurrent_state = states_stack[0]\n\tif active:\n\t\tstart()\n\nfunc start():\n\tcurrent_state.enter()\n\tset_active(true)\n\nfunc set_active(value):\n\tactive = value\n\tset_physics_process(value)\n\tset_process_input(value)\n\tif not active:\n\t\tstates_stack = []\n\t\tcurrent_state = null\n\nfunc _unhandled_input(event):\n\tcurrent_state.handle_input(event)\n\nfunc _physics_process(delta):\n\tcurrent_state.update(delta)\n\nfunc _on_animation_finished(anim_name):\n\tif not active:\n\t\treturn\n\tcurrent_state._on_animation_finished(anim_name)\n\nfunc _change_state(state_name):\n\tif not active:\n\t\treturn\n\tcurrent_state.exit()\n\t\n\tif state_name == \"previous\":\n\t\tstates_stack.pop_front()\n\telse:\n\t\tstates_stack[0] = states_map[state_name]\n\t\n\tcurrent_state = states_stack[0]\n\temit_signal(\"state_changed\", current_state)\n\tcurrent_state.enter()\n"
  },
  {
    "path": "utils/state/StateMachine.tscn",
    "content": "[gd_scene load_steps=2 format=2]\n\n[ext_resource path=\"res://utils/state/StateMachine.gd\" type=\"Script\" id=1]\n\n[node name=\"StateMachine\" type=\"Node\" index=\"0\"]\n\nscript = ExtResource( 1 )\nSTART_STATE = null\n\n\n"
  },
  {
    "path": "vfx/Fog.gd",
    "content": "extends ColorRect\n\nfunc _on_LevelLoader_loaded(level):\n\tvisible = level.fog\n"
  },
  {
    "path": "vfx/TransitionColor.gd",
    "content": "extends ColorRect\n\nonready var anim_player = $AnimationPlayer\n\nfunc fade_to_color():\n\tshow()\n\tanim_player.play(\"to_color\")\n\tyield(anim_player, \"animation_finished\")\n\thide()\n\nfunc fade_from_color():\n\tshow()\n\tanim_player.play(\"to_transparent\")\n\tyield(anim_player, \"animation_finished\")\n\thide()\n"
  },
  {
    "path": "vfx/TransitionColor.tscn",
    "content": "[gd_scene load_steps=6 format=2]\n\n[ext_resource path=\"res://vfx/transition.material\" type=\"Material\" id=1]\n[ext_resource path=\"res://vfx/TransitionColor.gd\" type=\"Script\" id=2]\n\n\n[sub_resource type=\"Animation\" id=1]\n\nresource_name = \"_SETUP\"\nlength = 0.01\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:material:shader_param/cutoff\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0 ),\n\"transitions\": PoolRealArray( 1 ),\n\"update\": 0,\n\"values\": [ 0.0 ]\n}\n\n[sub_resource type=\"Animation\" id=3]\n\nresource_name = \"to_color\"\nlength = 0.7\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:material:shader_param/cutoff\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.7 ),\n\"transitions\": PoolRealArray( 0.27058, 0.307901 ),\n\"update\": 0,\n\"values\": [ 1.0, 0.0 ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\".:material:shader_param/smooth_size\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.7 ),\n\"transitions\": PoolRealArray( 0.27058, 1 ),\n\"update\": 0,\n\"values\": [ 0.941, 0.161 ]\n}\n\n[sub_resource type=\"Animation\" id=2]\n\nresource_name = \"to_transparent\"\nlength = 0.7\nloop = false\nstep = 0.1\ntracks/0/type = \"value\"\ntracks/0/path = NodePath(\".:material:shader_param/cutoff\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/keys = {\n\"times\": PoolRealArray( 0, 0.7 ),\n\"transitions\": PoolRealArray( 0.307901, 1 ),\n\"update\": 0,\n\"values\": [ 0.0, 1.0 ]\n}\ntracks/1/type = \"value\"\ntracks/1/path = NodePath(\".:material:shader_param/smooth_size\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/keys = {\n\"times\": PoolRealArray( 0, 0.7 ),\n\"transitions\": PoolRealArray( 1, 1 ),\n\"update\": 0,\n\"values\": [ 0.161, 0.941 ]\n}\n\n[node name=\"TransitionColor\" type=\"ColorRect\"]\n\nmaterial = ExtResource( 1 )\nanchor_left = 0.0\nanchor_top = 0.0\nanchor_right = 1.0\nanchor_bottom = 1.0\nrect_pivot_offset = Vector2( 0, 0 )\nrect_clip_content = false\nmouse_filter = 0\nmouse_default_cursor_shape = 0\nsize_flags_horizontal = 1\nsize_flags_vertical = 1\ncolor = Color( 1, 1, 1, 1 )\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Material\" ]\n\n[node name=\"AnimationPlayer\" type=\"AnimationPlayer\" parent=\".\" index=\"0\"]\n\nroot_node = NodePath(\"..\")\nautoplay = \"\"\nplayback_process_mode = 1\nplayback_default_blend_time = 0.0\nplayback_speed = 1.0\nanims/_SETUP = SubResource( 1 )\nanims/to_color = SubResource( 3 )\nanims/to_transparent = SubResource( 2 )\nblend_times = [  ]\n_sections_unfolded = [ \"Playback Options\" ]\n\n\n"
  },
  {
    "path": "vfx/fog.shader",
    "content": "shader_type canvas_item;\n\nuniform vec4 color : hint_color = vec4(0.35, 0.48, 0.95, 1.0);\nuniform float noise_scale = 20.0;\nuniform float alpha_power = 2.0;\nuniform int OCTAVES = 1;\n\nfloat rand(vec2 coord){\n\treturn fract(sin(dot(coord, vec2(56, 78)) * 1000.0) * 1000.0);\n}\n\nfloat noise(vec2 coord){\n\tvec2 i = floor(coord);\n\tvec2 f = fract(coord);\n\n\t// 4 corners of a rectangle surrounding our point\n\tfloat a = rand(i);\n\tfloat b = rand(i + vec2(1.0, 0.0));\n\tfloat c = rand(i + vec2(0.0, 1.0));\n\tfloat d = rand(i + vec2(1.0, 1.0));\n\n\tvec2 cubic = f * f * (3.0 - 2.0 * f);\n\n\treturn mix(a, b, cubic.x) + (c - a) * cubic.y * (1.0 - cubic.x) + (d - b) * cubic.x * cubic.y;\n}\n\nfloat fbm(vec2 coord){\n\tfloat value = 0.0;\n\tfloat scale = 0.5;\n\n\tfor(int i = 0; i < OCTAVES; i++){\n\t\tvalue += noise(coord) * scale;\n\t\tcoord *= 2.0;\n\t\tscale *= 0.5;\n\t}\n\treturn value;\n}\n\nvoid fragment() {\n\tvec2 coord = UV * noise_scale;\n\tvec2 motion = vec2( fbm(coord + vec2(TIME * -0.5, TIME * 0.5)) );\n\tfloat final = fbm(coord + motion);\n\tCOLOR = vec4(color.rgb, pow(final, alpha_power) * color.a);\n}\n"
  },
  {
    "path": "vfx/masks/curtain.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/curtain.png-3af2c44df15fd54790d255ef204f96fe.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/masks/curtain.png\"\ndest_files=[ \"res://.import/curtain.png-3af2c44df15fd54790d255ef204f96fe.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/SelfDestructingParticles.gd",
    "content": "extends Particles2D\n\nfunc start():\n\temitting = true\n\tyield(get_tree().create_timer(lifetime * speed_scale * 1.2), \"timeout\")\n\tqueue_free()\n"
  },
  {
    "path": "vfx/particles/assets/gradient_ramps/fire_to_black.tres",
    "content": "[gd_resource type=\"Gradient\" format=2]\n\n[resource]\n\noffsets = PoolRealArray( 0, 0.0358056, 0.480818, 0.915601, 1 )\ncolors = PoolColorArray( 1, 0.773438, 0, 0, 1, 0.726563, 0, 1, 1, 0.304688, 0, 1, 0.160156, 0.115112, 0.115112, 1, 0, 0, 0, 0 )\n\n"
  },
  {
    "path": "vfx/particles/assets/gradient_ramps/sparkles.tres",
    "content": "[gd_resource type=\"Gradient\" format=2]\n\n[resource]\n\noffsets = PoolRealArray( 0, 0.0613811, 0.84399, 1 )\ncolors = PoolColorArray( 1, 0.846985, 0.148438, 0, 1, 0.820313, 0, 1, 1, 0.398438, 0, 1, 0.964844, 0, 0, 0 )\n\n"
  },
  {
    "path": "vfx/particles/assets/gradient_ramps/sparkles_small.tres",
    "content": "[gd_resource type=\"Gradient\" format=2]\n\n[resource]\n\noffsets = PoolRealArray( 0, 0.0971867, 0.751918, 1 )\ncolors = PoolColorArray( 0.980469, 0.878616, 0.413635, 0, 1, 0.820313, 0, 1, 1, 0.257813, 0, 1, 0, 0, 0, 0 )\n\n"
  },
  {
    "path": "vfx/particles/dust_charge/DustCharge.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://dust_charge/puffs.png\" type=\"Texture\" id=1]\n\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0, 0.0710059, 0.887574, 1 )\ncolors = PoolColorArray( 0.834469, 0.650242, 0.192065, 0, 0.84375, 0.699554, 0.316406, 1, 0.824219, 0.595778, 0.0547333, 1, 0.826506, 0.607932, 0.0853797, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.166992 ), 0.0, 0.0, 0, 0, Vector2( 0.378064, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 45.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 100.0\ninitial_velocity_random = 0.0\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.8\nscale_random = 0.2\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 1.0\nhue_variation_curve = SubResource( 4 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Hue Variation\" ]\n\n[node name=\"DustCharge\" type=\"Particles2D\" index=\"0\"]\n\nposition = Vector2( 1, 3 )\nrotation = -1.5708\nemitting = true\namount = 16\nlifetime = 1.0\none_shot = false\npreprocess = 0.0\nspeed_scale = 2.0\nexplosiveness = 0.2\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 7 )\ntexture = ExtResource( 1 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\", \"Transform\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/dust_charge/DustChargeLarge.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://dust_charge/DustCharge.tscn\" type=\"PackedScene\" id=1]\n\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0, 0.0710059, 0.887574, 1 )\ncolors = PoolColorArray( 0.834469, 0.650242, 0.192065, 0, 0.84375, 0.699554, 0.316406, 1, 0.824219, 0.595778, 0.0547333, 1, 0.826506, 0.607932, 0.0853797, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.166992 ), 0.0, 0.0, 0, 0, Vector2( 0.378064, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 60.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 160.0\ninitial_velocity_random = 0.7\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 1.4\nscale_random = 0.3\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 1.0\nhue_variation_curve = SubResource( 4 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Hue Variation\", \"Initial Velocity\", \"Scale\", \"Spread\" ]\n\n[node name=\"DustChargeLarge\" index=\"0\" instance=ExtResource( 1 )]\n\namount = 40\nlifetime = 1.4\nexplosiveness = 0.1\nrandomness = 0.6\nprocess_material = SubResource( 7 )\n\n\n"
  },
  {
    "path": "vfx/particles/dust_charge/puffs.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/puffs.png-5a8f7bae06bf0d22084af1f35563a1df.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/dust_charge/puffs.png\"\ndest_files=[ \"res://.import/puffs.png-5a8f7bae06bf0d22084af1f35563a1df.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/dust_puffs/DustPuffs.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://vfx/particles/dust_charge/puffs.png\" type=\"Texture\" id=1]\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0, 0.0710059, 0.887574, 1 )\ncolors = PoolColorArray( 0.834469, 0.650242, 0.192065, 0, 0.84375, 0.699554, 0.316406, 1, 0.824219, 0.595778, 0.0547333, 1, 0.826506, 0.607932, 0.0853797, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.166992 ), 0.0, 0.0, 0, 0, Vector2( 0.378064, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 45.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 100.0\ninitial_velocity_random = 0.0\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.8\nscale_random = 0.2\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 1.0\nhue_variation_curve = SubResource( 4 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Hue Variation\" ]\n\n[node name=\"DustPuffs\" type=\"Particles2D\" index=\"0\"]\n\nposition = Vector2( 1, 3 )\nrotation = -1.5708\nemitting = true\namount = 16\nlifetime = 1.0\none_shot = false\npreprocess = 0.0\nspeed_scale = 2.0\nexplosiveness = 0.2\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 7 )\ntexture = ExtResource( 1 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\", \"Transform\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/dust_puffs/DustPuffsLarge.tscn",
    "content": "[gd_scene load_steps=9 format=2]\n\n[ext_resource path=\"res://vfx/particles/dust_puffs/DustPuffs.tscn\" type=\"PackedScene\" id=1]\n\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0, 0.0710059, 0.887574, 1 )\ncolors = PoolColorArray( 0.834469, 0.650242, 0.192065, 0, 0.84375, 0.699554, 0.316406, 1, 0.824219, 0.595778, 0.0547333, 1, 0.826506, 0.607932, 0.0853797, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.166992 ), 0.0, 0.0, 0, 0, Vector2( 0.378064, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 60.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 160.0\ninitial_velocity_random = 0.7\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 1.4\nscale_random = 0.3\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 1.0\nhue_variation_curve = SubResource( 4 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Hue Variation\", \"Initial Velocity\", \"Scale\", \"Spread\" ]\n\n[node name=\"DustPuffsLarge\" index=\"0\" instance=ExtResource( 1 )]\n\namount = 40\nlifetime = 1.4\nexplosiveness = 0.1\nrandomness = 0.6\nprocess_material = SubResource( 7 )\n\n\n"
  },
  {
    "path": "vfx/particles/dust_puffs/DustRun.tscn",
    "content": "[gd_scene load_steps=8 format=2]\n\n[ext_resource path=\"res://vfx/particles/dust_puffs/puff_stylized.png\" type=\"Texture\" id=1]\n[ext_resource path=\"res://vfx/particles/SelfDestructingParticles.gd\" type=\"Script\" id=2]\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0, 0.0602007, 0.769231, 1 )\ncolors = PoolColorArray( 0.308594, 0.233027, 0.144653, 0, 0.574219, 0.435676, 0.273651, 1, 0.598236, 0.472648, 0.325774, 1, 0.596078, 0.470588, 0.32549, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 256\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.349609 ), 0.0, 1.47649, 0, 0, Vector2( 0.908748, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 0.628906 ), -4.5017, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"ParticlesMaterial\" id=5]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 10.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 1.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 30.0\ninitial_velocity_random = 0.4\nangular_velocity = 120.0\nangular_velocity_random = 0.7\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = -10.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.6\nscale_random = 0.1\nscale_curve = SubResource( 4 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Scale\" ]\n\n[node name=\"DustRun\" type=\"Particles2D\" index=\"0\"]\n\nshow_behind_parent = true\nposition = Vector2( 1, 0 )\nrotation = -1.5708\nemitting = false\namount = 12\nlifetime = 1.0\none_shot = true\npreprocess = 0.0\nspeed_scale = 2.0\nexplosiveness = 0.95\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 5 )\ntexture = ExtResource( 1 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Drawing\", \"Material\", \"Process Material\", \"Textures\", \"Time\", \"Transform\", \"Visibility\", \"Z Index\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/dust_puffs/DustWalk.tscn",
    "content": "[gd_scene load_steps=4 format=2]\n\n[ext_resource path=\"res://vfx/particles/dust_puffs/dust_puffs_particle.tres\" type=\"Material\" id=1]\n[ext_resource path=\"res://vfx/particles/dust_puffs/puff_stylized.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://vfx/particles/SelfDestructingParticles.gd\" type=\"Script\" id=3]\n\n\n[node name=\"DustWalk\" type=\"Particles2D\" index=\"0\"]\n\nshow_behind_parent = true\nposition = Vector2( 1, 0 )\nrotation = -1.5708\nemitting = false\namount = 8\nlifetime = 1.0\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.4\nexplosiveness = 0.95\nrandomness = 0.3\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = ExtResource( 1 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\nscript = ExtResource( 3 )\n_sections_unfolded = [ \"Drawing\", \"Material\", \"Time\", \"Transform\", \"Visibility\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/dust_puffs/dust_puffs_particle.tres",
    "content": "[gd_resource type=\"ParticlesMaterial\" load_steps=5 format=2]\n\n[sub_resource type=\"Gradient\" id=1]\noffsets = PoolRealArray( 0, 0.112532, 0.869565, 1 )\ncolors = PoolColorArray( 0.308594, 0.233027, 0.144653, 0, 0.574219, 0.435676, 0.273651, 1, 0.598236, 0.472648, 0.325774, 1, 0.596078, 0.470588, 0.32549, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\ngradient = SubResource( 1 )\nwidth = 256\n\n[sub_resource type=\"Curve\" id=3]\n_data = [ Vector2( 0, 0.349609 ), 0.0, 1.47649, 0, 0, Vector2( 0.908748, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 0.628906 ), -4.5017, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\ncurve = SubResource( 3 )\n\n[resource]\nemission_shape = 1\nemission_sphere_radius = 5.0\nflag_disable_z = true\nspread = 120.0\nflatness = 1.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 30.0\ninitial_velocity_random = 0.4\nangular_velocity = 120.0\nangular_velocity_random = 0.7\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = -10.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.5\nscale_curve = SubResource( 4 )\ncolor_ramp = SubResource( 2 )\nanim_offset = 1.0\nanim_offset_random = 1.0\n\n"
  },
  {
    "path": "vfx/particles/dust_puffs/puff_stylized.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/puff_stylized.png-76fe5696970602731dcc9616af628ed6.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/dust_puffs/puff_stylized.png\"\ndest_files=[ \"res://.import/puff_stylized.png-76fe5696970602731dcc9616af628ed6.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/dust_puffs/puffs.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/puffs.png-647a0897f9b56787d9f19dffab574e9f.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/dust_puffs/puffs.png\"\ndest_files=[ \"res://.import/puffs.png-647a0897f9b56787d9f19dffab574e9f.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/explosions/Explosion.gd",
    "content": "extends Particles2D\n\nfunc _ready():\n\tget_tree().create_timer(lifetime).connect('timeout', self, 'stop_emitting')\n\tget_tree().create_timer(lifetime * 2.0).connect('timeout', self, 'queue_free')\n\nfunc stop_emitting():\n\temitting = false\n"
  },
  {
    "path": "vfx/particles/explosions/Explosion.tscn",
    "content": "[gd_scene load_steps=10 format=2]\n\n[ext_resource path=\"res://vfx/particles/dust_charge/puffs.png\" type=\"Texture\" id=1]\n[ext_resource path=\"res://vfx/particles/explosions/Explosion.gd\" type=\"Script\" id=2]\n\n\n\n\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0.226293, 0.545259, 0.898707, 1 )\ncolors = PoolColorArray( 0.953125, 0.907313, 0.785583, 1, 0.953125, 0.850099, 0.0111694, 1, 0.921875, 0.450078, 0.219666, 1, 0.826506, 0.607932, 0.0853797, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.166992 ), 0.0, 1.80027, 0, 0, Vector2( 1, 1 ), 0.121391, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 20.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 180.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 160.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 1.0\nscale_random = 0.6\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 1.0\nhue_variation_curve = SubResource( 4 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Emission Shape\", \"Gravity\", \"Initial Velocity\", \"Scale\", \"Spread\" ]\n\n[node name=\"Explosion\" type=\"Particles2D\" index=\"0\"]\n\nposition = Vector2( 13.6701, 0 )\nrotation = -1.5708\nz_index = 20\nemitting = true\namount = 80\nlifetime = 0.3\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.4\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 7 )\ntexture = ExtResource( 1 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Time\", \"Transform\", \"Z Index\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/explosions/ExplosionFlash.tscn",
    "content": "[gd_scene load_steps=10 format=2]\n\n[ext_resource path=\"res://vfx/particles/explosions/circle.png\" type=\"Texture\" id=1]\n[ext_resource path=\"res://explosions/explosion.gd\" type=\"Script\" id=2]\n\n\n\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0, 0.0946746, 0.414201, 0.650888, 0.87574, 1 )\ncolors = PoolColorArray( 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = -0.2\nmax_value = 0.2\nbake_resolution = 100\n_data = [ Vector2( 0, 0.0277257 ), 0.0, 0.0, 0, 0, Vector2( 1, -0.0310864 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.790039 ), 0.0, -0.433343, 0, 0, Vector2( 0.413238, 0.811523 ), 0.775457, 3.68342, 0, 0, Vector2( 1, 1 ), 0.121391, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"ParticlesMaterial\" id=7]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 44.04\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 180.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.0\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 1.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 1.0\nscale_random = 0.4\nscale_curve = SubResource( 6 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 1.0\nhue_variation_curve = SubResource( 4 )\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 1.0\nanim_offset_random = 1.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Damping\", \"Emission Shape\", \"Flags\", \"Initial Velocity\", \"Scale\", \"Spread\" ]\n\n[node name=\"ExplosionFlash\" type=\"Particles2D\" index=\"0\"]\n\nz_index = 20\nemitting = false\namount = 10\nlifetime = 0.6\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.3\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 7 )\ntexture = ExtResource( 1 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\nscript = ExtResource( 2 )\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/explosions/circle.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/circle.png-206ef6dbbb41f3edbef77fad323ed599.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/explosions/circle.png\"\ndest_files=[ \"res://.import/circle.png-206ef6dbbb41f3edbef77fad323ed599.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/fiery_cloud/FieryCloud.tscn",
    "content": "[gd_scene load_steps=17 format=2]\n\n[ext_resource path=\"res://assets/gradient_ramps/fire_to_black.tres\" type=\"Gradient\" id=1]\n[ext_resource path=\"res://dust_charge/puffs.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://fiery_cloud/fiery_cloud.gd\" type=\"Script\" id=3]\n[ext_resource path=\"res://assets/gradient_ramps/sparkles_small.tres\" type=\"Gradient\" id=4]\n[ext_resource path=\"res://explosions/circle.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://assets/gradient_ramps/sparkles.tres\" type=\"Gradient\" id=6]\n\n[sub_resource type=\"GradientTexture\" id=1]\n\nflags = 4\ngradient = ExtResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=2]\n\nmin_value = 0.0\nmax_value = 1.6\nbake_resolution = 100\n_data = [ Vector2( 0.00254472, 0.414062 ), 0.0, 0.0, 0, 0, Vector2( 0.195613, 0.650391 ), 1.7438, 1.7438, 0, 0, Vector2( 1, 1.59062 ), 4.80181, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=3]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 2 )\n\n[sub_resource type=\"ParticlesMaterial\" id=4]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 0, 0 )\ninitial_velocity = 120.0\ninitial_velocity_random = 0.0\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.4\nscale_random = 1.0\nscale_curve = SubResource( 3 )\ncolor_ramp = SubResource( 1 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Angle\", \"Color\", \"Scale\" ]\n\n[sub_resource type=\"GradientTexture\" id=5]\n\nflags = 4\ngradient = ExtResource( 4 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=6]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.399763 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=7]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 6 )\n\n[sub_resource type=\"ParticlesMaterial\" id=8]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 200, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.04\nscale_random = 0.0\nscale_curve = SubResource( 7 )\ncolor_ramp = SubResource( 5 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Emission Shape\", \"Gravity\", \"Initial Velocity\", \"Scale\", \"Spread\", \"Tangential Accel\" ]\n\n[sub_resource type=\"GradientTexture\" id=9]\n\nflags = 4\ngradient = ExtResource( 6 )\nwidth = 2048\n\n[sub_resource type=\"ParticlesMaterial\" id=10]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 200, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.04\nscale_random = 0.0\nscale_curve = SubResource( 7 )\ncolor_ramp = SubResource( 9 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\" ]\n\n[node name=\"FieryCloud\" type=\"Particles2D\" index=\"0\"]\n\nemitting = false\namount = 40\nlifetime = 0.6\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.0\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 4 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\nscript = ExtResource( 3 )\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Time\" ]\nTIME_SCALE = 2.0\nRADIUS = 160.0\nOFFSET = Vector2( 0, 0 )\nactive = false\n\n[node name=\"SmallSparkles\" type=\"Particles2D\" parent=\".\" index=\"0\"]\n\nvisible = false\nrotation = -1.61079\nemitting = true\namount = 40\nlifetime = 1.0\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 8 )\ntexture = ExtResource( 5 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\" ]\n\n[node name=\"TinySparkles\" type=\"Particles2D\" parent=\".\" index=\"1\"]\n\nvisible = false\nrotation = -1.61079\nemitting = true\namount = 60\nlifetime = 1.0\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 10 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/fiery_cloud/Fireball.tscn",
    "content": "[gd_scene load_steps=17 format=2]\n\n[ext_resource path=\"res://assets/gradient_ramps/fire_to_black.tres\" type=\"Gradient\" id=1]\n[ext_resource path=\"res://dust_charge/puffs.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://fiery_cloud/fiery_cloud.gd\" type=\"Script\" id=3]\n[ext_resource path=\"res://assets/gradient_ramps/sparkles_small.tres\" type=\"Gradient\" id=4]\n[ext_resource path=\"res://explosions/circle.png\" type=\"Texture\" id=5]\n[ext_resource path=\"res://assets/gradient_ramps/sparkles.tres\" type=\"Gradient\" id=6]\n\n\n\n[sub_resource type=\"GradientTexture\" id=1]\n\nflags = 4\ngradient = ExtResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=2]\n\nmin_value = 0.0\nmax_value = 3.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.645313 ), 0.0, 2.139, 0, 0, Vector2( 1, 2.55371 ), 2.94849, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=3]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 2 )\n\n[sub_resource type=\"ParticlesMaterial\" id=4]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 10.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 180.0\nflatness = 0.0\ngravity = Vector3( 0, 98, 0 )\ninitial_velocity = 120.0\ninitial_velocity_random = 0.0\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 360.0\nangle_random = 1.0\nscale = 0.4\nscale_random = 1.0\nscale_curve = SubResource( 3 )\ncolor_ramp = SubResource( 1 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Emission Shape\", \"Hue Variation\", \"Scale\", \"Spread\", \"Trail\" ]\n\n[sub_resource type=\"GradientTexture\" id=5]\n\nflags = 4\ngradient = ExtResource( 4 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=6]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.399763 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=7]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 6 )\n\n[sub_resource type=\"ParticlesMaterial\" id=8]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 500, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.04\nscale_random = 0.0\nscale_curve = SubResource( 7 )\ncolor_ramp = SubResource( 5 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Gravity\", \"Tangential Accel\" ]\n\n[sub_resource type=\"GradientTexture\" id=9]\n\nflags = 4\ngradient = ExtResource( 6 )\nwidth = 2048\n\n[sub_resource type=\"ParticlesMaterial\" id=10]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 24.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 120.0\nflatness = 0.0\ngravity = Vector3( 0, 450, 0 )\ninitial_velocity = 200.0\ninitial_velocity_random = 0.6\nangular_velocity = 0.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 100.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 0.0\nscale = 0.04\nscale_random = 0.0\nscale_curve = SubResource( 7 )\ncolor_ramp = SubResource( 9 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Gravity\" ]\n\n[node name=\"Fireball\" type=\"Particles2D\" index=\"0\"]\n\nposition = Vector2( 274.321, -72.4055 )\nemitting = true\namount = 120\nlifetime = 0.8\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.0\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 1\nprocess_material = SubResource( 4 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\nscript = ExtResource( 3 )\n_sections_unfolded = [ \"Process Material\", \"Textures\", \"Time\", \"Transform\" ]\nTIME_SCALE = 3.0\nRADIUS = 300.0\nOFFSET = Vector2( 400, 200 )\nactive = true\n\n[node name=\"SmallSparkles\" type=\"Particles2D\" parent=\".\" index=\"0\"]\n\nrotation = -1.61079\nemitting = true\namount = 40\nlifetime = 1.0\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 8 )\ntexture = ExtResource( 5 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\" ]\n\n[node name=\"TinySparkles\" type=\"Particles2D\" parent=\".\" index=\"1\"]\n\nrotation = -1.61079\nemitting = true\namount = 60\nlifetime = 1.0\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.2\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -400, -400, 800, 800 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = SubResource( 10 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 2\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/fiery_cloud/FireryCloud.gd",
    "content": "tool\nextends Particles2D\n\nexport(float) var TIME_SCALE = 1.0\nexport(float) var RADIUS = 200.0\nexport(Vector2) var OFFSET = Vector2()\n\nexport(bool) var active = false setget set_active\n\nvar time = 0.0\n\nfunc _process(delta):\n\ttime += delta\n\tvar time_scaled = TIME_SCALE * time\n\tposition = Vector2(\n\t\tcos(time_scaled) * RADIUS, \n\t\tsin(time_scaled) * RADIUS\n\t) \n\tposition += OFFSET\n\nfunc set_active(value):\n\tactive = value\n\tset_process(active)\n\tif not active:\n\t\tposition = Vector2()"
  },
  {
    "path": "vfx/particles/rocks/DirectionalRock.tscn",
    "content": "[gd_scene load_steps=5 format=2]\n\n[ext_resource path=\"res://vfx/particles/rocks/rocks_particle.tres\" type=\"Material\" id=1]\n[ext_resource path=\"res://vfx/particles/rocks/rocks.png\" type=\"Texture\" id=2]\n[ext_resource path=\"res://vfx/particles/rocks/crumbs_particle.tres\" type=\"Material\" id=3]\n\n\n[sub_resource type=\"GDScript\" id=1]\n\nscript/source = \"extends Particles2D\n\nfunc initialize(position, angle):\n\tglobal_position = position\n\trotation = angle\n\tyield(get_tree().create_timer(lifetime / speed_scale), \\\"timeout\\\")\n\tqueue_free()\n\"\n\n[node name=\"DirectionalRock\" type=\"Particles2D\"]\n\nmodulate = Color( 0.691406, 0.486124, 0.132339, 1 )\nrotation = -1.5708\nemitting = false\namount = 20\nlifetime = 0.7\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.5\nexplosiveness = 0.9\nrandomness = 0.9\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = ExtResource( 1 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\nscript = SubResource( 1 )\n_sections_unfolded = [ \"Material\", \"Process Material\", \"Time\", \"Visibility\" ]\n\n[node name=\"Pebbles2\" type=\"Particles2D\" parent=\".\" index=\"0\"]\n\nself_modulate = Color( 0.744278, 0.768273, 0.832031, 1 )\nshow_behind_parent = true\nscale = Vector2( 1.3383, 1.50043 )\nemitting = true\namount = 20\nlifetime = 0.7\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = ExtResource( 3 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Process Material\", \"Time\", \"Visibility\" ]\n\n[node name=\"Pebbles\" type=\"Particles2D\" parent=\".\" index=\"1\"]\n\nshow_behind_parent = true\nscale = Vector2( 1.01931, 1.27982 )\nemitting = true\namount = 20\nlifetime = 0.7\none_shot = false\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = ExtResource( 3 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Process Material\", \"Time\", \"Visibility\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/rocks/crumbs.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/crumbs.png-0cfbcc76d6de4ba75de4c089e6c455de.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/rocks/crumbs.png\"\ndest_files=[ \"res://.import/crumbs.png-0cfbcc76d6de4ba75de4c089e6c455de.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/rocks/crumbs_particle.tres",
    "content": "[gd_resource type=\"ParticlesMaterial\" load_steps=3 format=2]\n\n[sub_resource type=\"Curve\" id=1]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 1 ), 0.0, -5.56082, 0, 0, Vector2( 0.502916, 0 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=2]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 1 )\n\n[resource]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 180.0\nflatness = 0.0\ngravity = Vector3( 0, 200, 0 )\ninitial_velocity = 140.0\ninitial_velocity_random = 0.4\nangular_velocity = 180.0\nangular_velocity_random = 1.0\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = -60.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 80.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 1.0\nscale = 0.15\nscale_random = 0.3\nscale_curve = SubResource( 2 )\ncolor = Color( 0.816406, 0.816406, 0.816406, 1 )\nhue_variation = 1.0\nhue_variation_random = 0.0\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Emission Shape\", \"Trail\" ]\n\n"
  },
  {
    "path": "vfx/particles/rocks/rocks.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/rocks.png-55d7ebb59a35e3e8e667f24e321f9c1b.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/rocks/rocks.png\"\ndest_files=[ \"res://.import/rocks.png-55d7ebb59a35e3e8e667f24e321f9c1b.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/rocks/rocks_particle.tres",
    "content": "[gd_resource type=\"ParticlesMaterial\" load_steps=9 format=2]\n\n[sub_resource type=\"Curve\" id=1]\n\nmin_value = 0.0\nmax_value = 200.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0 ), 0.0, 53.531, 0, 0, Vector2( 0.249193, 0 ), -8.39704, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=2]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 1 )\n\n[sub_resource type=\"Gradient\" id=3]\n\noffsets = PoolRealArray( 0.881657, 1 )\ncolors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0 )\n\n[sub_resource type=\"GradientTexture\" id=4]\n\nflags = 4\ngradient = SubResource( 3 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=5]\n\nmin_value = -200.0\nmax_value = 200.0\nbake_resolution = 100\n_data = [ Vector2( 0, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, -55.8594 ), 0.0, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=6]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 5 )\n\n[sub_resource type=\"Curve\" id=7]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.446289 ), 0.0, 8.58244, 0, 0, Vector2( 0.410727, 1 ), -1.18141, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=8]\n\nflags = 4\nwidth = 32\ncurve = SubResource( 7 )\n\n[resource]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 30.0\nflatness = 0.0\ngravity = Vector3( 0, 500, 0 )\ninitial_velocity = 500.0\ninitial_velocity_random = 0.5\nangular_velocity = 360.0\nangular_velocity_random = 0.53\norbit_velocity = 0.0\norbit_velocity_random = 0.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nlinear_accel_curve = SubResource( 6 )\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 0.0\ntangential_accel_random = 0.0\ndamping = 100.0\ndamping_random = 0.0\nangle = 0.0\nangle_random = 1.0\nscale = 0.1\nscale_random = 0.7\nscale_curve = SubResource( 8 )\ncolor_ramp = SubResource( 4 )\nhue_variation = 1.0\nhue_variation_random = 0.02\nanim_speed = 0.0\nanim_speed_random = 0.0\nanim_speed_curve = SubResource( 2 )\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Color\", \"Scale\" ]\n\n"
  },
  {
    "path": "vfx/particles/smoke/EnemySmokeScreen.tscn",
    "content": "[gd_scene load_steps=3 format=2]\n\n[ext_resource path=\"res://vfx/particles/smoke/smoke_screen_particle.tres\" type=\"Material\" id=1]\n[ext_resource path=\"res://vfx/particles/smoke/smoke.png\" type=\"Texture\" id=2]\n\n\n[node name=\"EnemySmokeScreen\" type=\"Particles2D\" index=\"0\"]\n\nself_modulate = Color( 0.90831, 0.918911, 0.941406, 1 )\nemitting = false\namount = 10\nlifetime = 0.9\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 1.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = false\ndraw_order = 0\nprocess_material = ExtResource( 1 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Drawing\", \"Process Material\", \"Textures\", \"Time\" ]\n\n[node name=\"SmokeDarker\" type=\"Particles2D\" parent=\".\" index=\"0\"]\n\nself_modulate = Color( 0.632904, 0.671685, 0.726563, 1 )\nshow_behind_parent = true\nscale = Vector2( 1.20092, 1.32186 )\nemitting = false\namount = 20\nlifetime = 0.7\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = true\ndraw_order = 0\nprocess_material = ExtResource( 1 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Material\", \"Process Material\", \"Textures\", \"Time\", \"Visibility\" ]\n\n[node name=\"SmokeGrey\" type=\"Particles2D\" parent=\".\" index=\"1\"]\n\nself_modulate = Color( 0.789703, 0.828256, 0.882813, 1 )\nshow_behind_parent = true\nscale = Vector2( 1.05668, 1.05668 )\nemitting = false\namount = 20\nlifetime = 0.8\none_shot = true\npreprocess = 0.0\nspeed_scale = 1.0\nexplosiveness = 0.8\nrandomness = 0.0\nfixed_fps = 0\nfract_delta = true\nvisibility_rect = Rect2( -100, -100, 200, 200 )\nlocal_coords = true\ndraw_order = 0\nprocess_material = ExtResource( 1 )\ntexture = ExtResource( 2 )\nnormal_map = null\nh_frames = 1\nv_frames = 1\n_sections_unfolded = [ \"Material\", \"Process Material\", \"Textures\", \"Time\", \"Visibility\" ]\n\n\n"
  },
  {
    "path": "vfx/particles/smoke/ParticlesPlayer.gd",
    "content": "extends Particles2D\n\nfunc play():\n\temitting = true\n\tfor child in get_children():\n\t\tif not child.get_class() == \"Particles2D\":\n\t\t\tcontinue\n\t\tchild.emitting = true\n"
  },
  {
    "path": "vfx/particles/smoke/smoke.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/smoke.png-510677d7daa804cf41c380a0acf068c5.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://vfx/particles/smoke/smoke.png\"\ndest_files=[ \"res://.import/smoke.png-510677d7daa804cf41c380a0acf068c5.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "vfx/particles/smoke/smoke_screen_particle.tres",
    "content": "[gd_resource type=\"ParticlesMaterial\" load_steps=5 format=2]\n\n[sub_resource type=\"Gradient\" id=1]\n\noffsets = PoolRealArray( 0.912387, 1 )\ncolors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0 )\n\n[sub_resource type=\"GradientTexture\" id=2]\n\nflags = 4\ngradient = SubResource( 1 )\nwidth = 2048\n\n[sub_resource type=\"Curve\" id=3]\n\nmin_value = 0.0\nmax_value = 1.0\nbake_resolution = 100\n_data = [ Vector2( 0, 0.136789 ), 0.0, 3.12433, 0, 0, Vector2( 0.469416, 1 ), 0.0, 0.0, 0, 0, Vector2( 0.998443, 0.728062 ), -0.801458, 0.0, 0, 0 ]\n\n[sub_resource type=\"CurveTexture\" id=4]\n\nflags = 4\nwidth = 2048\ncurve = SubResource( 3 )\n\n[resource]\n\nrender_priority = 0\ntrail_divisor = 1\nemission_shape = 1\nemission_sphere_radius = 12.0\nflag_align_y = false\nflag_rotate_y = false\nflag_disable_z = true\nspread = 180.0\nflatness = 0.0\ngravity = Vector3( 0, -20, 0 )\ninitial_velocity = 40.0\ninitial_velocity_random = 0.2\nangular_velocity = 80.0\nangular_velocity_random = 0.0\norbit_velocity = 0.0\norbit_velocity_random = 1.0\nlinear_accel = 0.0\nlinear_accel_random = 0.0\nradial_accel = 0.0\nradial_accel_random = 0.0\ntangential_accel = 20.0\ntangential_accel_random = 0.0\ndamping = 0.0\ndamping_random = 0.4\nangle = 360.0\nangle_random = 1.0\nscale = 0.4\nscale_random = 0.6\nscale_curve = SubResource( 4 )\ncolor_ramp = SubResource( 2 )\nhue_variation = 0.0\nhue_variation_random = 0.0\nanim_speed = 1.0\nanim_speed_random = 0.5\nanim_offset = 0.0\nanim_offset_random = 0.0\nanim_loop = false\n_sections_unfolded = [ \"Scale\" ]\n\n"
  },
  {
    "path": "vfx/transition.shader",
    "content": "shader_type canvas_item;\nrender_mode unshaded;\n\nuniform float cutoff : hint_range(0.0, 1.0);\nuniform float smooth_size : hint_range(0.0, 1.0);\nuniform sampler2D mask : hint_albedo;\n\nuniform vec4 color : hint_color;\n\nvoid fragment()\n{\n\tfloat value = texture(mask, UV).r;\n\tfloat alpha = smoothstep(cutoff, cutoff + smooth_size, value * (1.0 - smooth_size) + smooth_size);\n\tCOLOR = vec4(color.rgb, alpha);\n}\n"
  }
]