├── .import ├── Falcon9.png-18216e77b577f3eb8ea3b62aa010eabc.md5 ├── Falcon9.png-18216e77b577f3eb8ea3b62aa010eabc.stex ├── Falcon9.png-5b2c6f84545b16a709040590677c6eef.md5 ├── Falcon9.png-5b2c6f84545b16a709040590677c6eef.stex ├── Falcon9.png-de506611085c2e65e45b4bfbc89b58b8.md5 ├── Falcon9.png-de506611085c2e65e45b4bfbc89b58b8.stex ├── Mouse_Curser.png-2da34aea292dce2e0f0ef8449823edf4.md5 ├── Mouse_Curser.png-2da34aea292dce2e0f0ef8449823edf4.stex ├── Mouse_Curser.png-66c3bea41cab5a7421473ccc27262e82.md5 ├── Mouse_Curser.png-f075d56f2cb8f87eca022d6296da2cba.md5 ├── Mouse_Curser.png-f075d56f2cb8f87eca022d6296da2cba.stex ├── Mouse_Curser2.png-a325d038b0a5cbd60d10b59f4ce84664.md5 ├── Mouse_Curser2.png-a325d038b0a5cbd60d10b59f4ce84664.stex ├── Mouse_Curser24px.png-086c05ccb16f99fb3f2d201ccdb3a5b2.md5 ├── Mouse_Curser24px.png-086c05ccb16f99fb3f2d201ccdb3a5b2.stex ├── Mouse_Curser24px.png-3658c9afc25ecc0326d1aa8793d8f80a.md5 ├── Mouse_Curser24px.png-3658c9afc25ecc0326d1aa8793d8f80a.stex ├── Mouse_Curser24px.png-f11413d7f6cfe62979bade05f6d5129d.md5 ├── Mouse_Curser24px.png-f11413d7f6cfe62979bade05f6d5129d.stex ├── Mouse_Curser64px.png-57969dc9d45a14031edf26dad2fcc9ce.md5 ├── Mouse_Curser64px.png-5ae0f0282871cbde75b9599e403888a0.md5 ├── Mouse_Curser64px.png-5ae0f0282871cbde75b9599e403888a0.stex ├── Mouse_Curser64px.png-5d677c882d21ce8b0ea4869a864282a0.md5 ├── Mouse_Curser64px.png-5d677c882d21ce8b0ea4869a864282a0.stex ├── Sky.jpg-15f50a37135c9cac38112f9308f7fc68.md5 ├── Sky.jpg-15f50a37135c9cac38112f9308f7fc68.stex ├── Sky.jpg-4150e2aaeab55242ef068f3a28d7f3f5.md5 ├── Sky.jpg-4150e2aaeab55242ef068f3a28d7f3f5.stex ├── Sky.jpg-419fbb27475dfe8c5f4699b022a7b25d.md5 ├── Sky.jpg-419fbb27475dfe8c5f4699b022a7b25d.stex ├── Sphere.obj-096614370fc39042f347a7c2da27bce8.md5 ├── Sphere.obj-096614370fc39042f347a7c2da27bce8.mesh ├── Sphere.obj-305cf02e68450e9fa1ef81d04f3a60db.md5 ├── Sphere.obj-305cf02e68450e9fa1ef81d04f3a60db.mesh ├── Sphere.obj-61d1119484b00cdb649a1f750f345c6a.md5 ├── Sphere.obj-61d1119484b00cdb649a1f750f345c6a.mesh ├── Sphere.obj-76cc8f1f496956c938cabbef7d48ab66.md5 ├── Sphere.obj-76cc8f1f496956c938cabbef7d48ab66.mesh ├── Sphere.obj-d0fb45b1b81fc4f4bb1255756c78937b.md5 ├── Sphere.obj-d0fb45b1b81fc4f4bb1255756c78937b.mesh ├── Sphere.obj-e550e1e2a80a3c6982930b9f04eedc53.md5 ├── Sphere.obj-e550e1e2a80a3c6982930b9f04eedc53.mesh ├── angel.png-98eb72da45f31f89457b86d4886d4c02.md5 ├── black_sigil_icon.png-1efbdf34f053ee7444454b4af931dbdc.md5 ├── black_sigil_icon.png-1efbdf34f053ee7444454b4af931dbdc.stex ├── black_sigil_icon.png-7799fff15e440ac8ebe466570c623dc6.md5 ├── black_sigil_icon.png-7799fff15e440ac8ebe466570c623dc6.stex ├── black_sigil_icon.png-7cb9f09e856aede16653e8b77e527d9c.md5 ├── black_sigil_icon.png-7cb9f09e856aede16653e8b77e527d9c.stex ├── icon.png-487276ed1e3a0c39cad0279d744ee560.md5 ├── icon.png-487276ed1e3a0c39cad0279d744ee560.stex ├── white_sigil_icon.png-09a5adad0d7cb819d735b1d4c1900339.md5 ├── white_sigil_icon.png-09a5adad0d7cb819d735b1d4c1900339.stex ├── white_sigil_icon.png-81aa7dd04e62533ae6458727a18ac389.md5 ├── white_sigil_icon.png-81aa7dd04e62533ae6458727a18ac389.stex ├── white_sigil_icon.png-fb37aaf05bd9c587a97ef0a813727b28.md5 └── white_sigil_icon.png-fb37aaf05bd9c587a97ef0a813727b28.stex ├── DaveTheDev Tutorials ├── 10 Using Multimeshes │ ├── Demo │ │ ├── Game.tscn │ │ ├── Sphere.obj │ │ ├── Sphere.obj.import │ │ └── vortex.shader │ └── Tutorial │ │ ├── Game.tscn │ │ ├── MultiMeshInstance.gd │ │ ├── Sphere.obj │ │ ├── Sphere.obj.import │ │ └── sphere.material ├── 11 Using Shape Keys │ ├── Demo │ │ ├── Cube.mesh │ │ ├── Game.tscn │ │ ├── Spider.escn │ │ ├── Spider.escn.import │ │ ├── Spider.gd │ │ ├── Spider.mesh │ │ ├── spider.material │ │ ├── spider.png │ │ └── spider.png.import │ └── Tutorial │ │ ├── Game.tscn │ │ ├── Sphere.escn │ │ ├── Sphere.escn.import │ │ ├── Sphere.gd │ │ ├── Sphere.mesh │ │ └── sphere.material ├── 12 Dialog Player │ ├── Dialog_Player.gd │ ├── Dialog_Player.tscn │ ├── Simulated_Registry.gd │ ├── fonts │ │ ├── Cave-Story.ttf │ │ └── Cave-Story_Credit │ ├── scenes │ │ ├── Option.gd │ │ └── Option.tscn │ ├── stories │ │ ├── Example_Story.tres │ │ └── Example_Story_Baked.tres │ └── textures │ │ ├── characters │ │ ├── emi.png │ │ ├── emi.png.import │ │ ├── haruko.png │ │ ├── haruko.png.import │ │ ├── mrpettles.png │ │ ├── mrpettles.png.import │ │ ├── nez.png │ │ ├── nez.png.import │ │ ├── shin.png │ │ └── shin.png.import │ │ ├── menu_section_9patch.png │ │ └── menu_section_9patch.png.import ├── 6 Make better games using Curves in Godot │ └── Demo │ │ ├── Falcon9.png │ │ ├── Falcon9.png.import │ │ ├── Fire.tscn │ │ ├── Game.gd │ │ ├── Game.tscn │ │ ├── Sky.jpg │ │ ├── Sky.jpg.import │ │ └── landing_curve.tres ├── 7 Custom Mouse Cursors │ └── Demo │ │ ├── Game.tscn │ │ ├── Mouse_Curser24px.png │ │ ├── Mouse_Curser24px.png.import │ │ ├── Mouse_Curser64px.png │ │ ├── Mouse_Curser64px.png.import │ │ ├── Mouse_Cursor.gd │ │ ├── Mouse_Cursor.tscn │ │ ├── black_sigil_icon.png │ │ ├── black_sigil_icon.png.import │ │ ├── white_sigil_icon.png │ │ └── white_sigil_icon.png.import ├── 8 Clicking 3D Objects │ ├── Demo │ │ ├── Game.tscn │ │ ├── Sphere.gd │ │ ├── Sphere.tscn │ │ └── Sphere_Origin.gd │ ├── Sphere.obj │ ├── Sphere.obj.import │ └── Tutorial │ │ ├── Game.tscn │ │ └── Sphere.gd └── 9 Using Perlin Noise │ ├── Demo │ ├── Game.gd │ ├── Game.tscn │ ├── Sphere.gd │ ├── Sphere.obj │ ├── Sphere.obj.import │ └── Sphere.tscn │ └── Tutorial │ ├── Game.gd │ ├── Game.tscn │ ├── Sphere.obj │ └── Sphere.obj.import ├── Fonts └── FreeUniversal-Regular.ttf ├── LICENSE.txt ├── Miscellaneous Demos └── (kedalovo) Clicking Objects through Viewports │ ├── Demo.tscn │ ├── demo.gd │ └── spatialroot.gd ├── README.md ├── addons └── EXP-System-Dialog │ ├── Dialog Editor │ ├── Dialog_Editor.tscn │ ├── Editor │ │ ├── Editor.tscn │ │ └── editor.gd │ ├── Nodes │ │ └── Line │ │ │ ├── Line_Node.tscn │ │ │ ├── icon_distraction_free.svg │ │ │ ├── icon_distraction_free.svg.import │ │ │ └── line_node.gd │ └── dialog_editor.gd │ ├── Reference_StoryReader │ └── EXP_StoryReader.gd │ ├── Resource_BakedStory │ └── EXP_BakedStory.gd │ ├── Resource_EditorStory │ └── EXP_EditorStory.gd │ ├── Resource_NodeTemplate │ └── EXP_NodeTemplate.gd │ ├── Story Editor │ ├── Dialog Record │ │ ├── Dialog_Record.tscn │ │ └── dialog_record.gd │ ├── Rename Record Box │ │ ├── Rename_Record_Box.tscn │ │ └── rename_record_box.gd │ ├── Story_Editor.tscn │ └── story_editor.gd │ ├── plugin.cfg │ └── plugin.gd ├── export_presets.cfg ├── icon.png ├── icon.png.import └── project.godot /.import/Falcon9.png-18216e77b577f3eb8ea3b62aa010eabc.md5: -------------------------------------------------------------------------------- 1 | source_md5="3fe663120c3195b3277d4bc488bb911b" 2 | dest_md5="a86252eba165d5619ba253929e97bb40" 3 | 4 | -------------------------------------------------------------------------------- /.import/Falcon9.png-18216e77b577f3eb8ea3b62aa010eabc.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Falcon9.png-18216e77b577f3eb8ea3b62aa010eabc.stex -------------------------------------------------------------------------------- /.import/Falcon9.png-5b2c6f84545b16a709040590677c6eef.md5: -------------------------------------------------------------------------------- 1 | source_md5="3fe663120c3195b3277d4bc488bb911b" 2 | dest_md5="a86252eba165d5619ba253929e97bb40" 3 | 4 | -------------------------------------------------------------------------------- /.import/Falcon9.png-5b2c6f84545b16a709040590677c6eef.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Falcon9.png-5b2c6f84545b16a709040590677c6eef.stex -------------------------------------------------------------------------------- /.import/Falcon9.png-de506611085c2e65e45b4bfbc89b58b8.md5: -------------------------------------------------------------------------------- 1 | source_md5="3fe663120c3195b3277d4bc488bb911b" 2 | dest_md5="a86252eba165d5619ba253929e97bb40" 3 | 4 | -------------------------------------------------------------------------------- /.import/Falcon9.png-de506611085c2e65e45b4bfbc89b58b8.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Falcon9.png-de506611085c2e65e45b4bfbc89b58b8.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser.png-2da34aea292dce2e0f0ef8449823edf4.md5: -------------------------------------------------------------------------------- 1 | source_md5="f6f037e0dfcaa4296c90018ba2ffdee4" 2 | dest_md5="5cfe9926d769f87e16f4b5b3c9a57250" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser.png-2da34aea292dce2e0f0ef8449823edf4.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser.png-2da34aea292dce2e0f0ef8449823edf4.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser.png-66c3bea41cab5a7421473ccc27262e82.md5: -------------------------------------------------------------------------------- 1 | source_md5="f6f037e0dfcaa4296c90018ba2ffdee4" 2 | dest_md5="5cfe9926d769f87e16f4b5b3c9a57250" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser.png-f075d56f2cb8f87eca022d6296da2cba.md5: -------------------------------------------------------------------------------- 1 | source_md5="f6f037e0dfcaa4296c90018ba2ffdee4" 2 | dest_md5="5cfe9926d769f87e16f4b5b3c9a57250" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser.png-f075d56f2cb8f87eca022d6296da2cba.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser.png-f075d56f2cb8f87eca022d6296da2cba.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser2.png-a325d038b0a5cbd60d10b59f4ce84664.md5: -------------------------------------------------------------------------------- 1 | source_md5="d065a0f0a0fcc293865e222d57840bc6" 2 | dest_md5="42f52d37fa5577524a71dd3fb4eb2464" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser2.png-a325d038b0a5cbd60d10b59f4ce84664.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser2.png-a325d038b0a5cbd60d10b59f4ce84664.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser24px.png-086c05ccb16f99fb3f2d201ccdb3a5b2.md5: -------------------------------------------------------------------------------- 1 | source_md5="d065a0f0a0fcc293865e222d57840bc6" 2 | dest_md5="42f52d37fa5577524a71dd3fb4eb2464" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser24px.png-086c05ccb16f99fb3f2d201ccdb3a5b2.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser24px.png-086c05ccb16f99fb3f2d201ccdb3a5b2.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser24px.png-3658c9afc25ecc0326d1aa8793d8f80a.md5: -------------------------------------------------------------------------------- 1 | source_md5="d065a0f0a0fcc293865e222d57840bc6" 2 | dest_md5="42f52d37fa5577524a71dd3fb4eb2464" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser24px.png-3658c9afc25ecc0326d1aa8793d8f80a.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser24px.png-3658c9afc25ecc0326d1aa8793d8f80a.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser24px.png-f11413d7f6cfe62979bade05f6d5129d.md5: -------------------------------------------------------------------------------- 1 | source_md5="d065a0f0a0fcc293865e222d57840bc6" 2 | dest_md5="42f52d37fa5577524a71dd3fb4eb2464" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser24px.png-f11413d7f6cfe62979bade05f6d5129d.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser24px.png-f11413d7f6cfe62979bade05f6d5129d.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser64px.png-57969dc9d45a14031edf26dad2fcc9ce.md5: -------------------------------------------------------------------------------- 1 | source_md5="f6f037e0dfcaa4296c90018ba2ffdee4" 2 | dest_md5="5cfe9926d769f87e16f4b5b3c9a57250" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser64px.png-5ae0f0282871cbde75b9599e403888a0.md5: -------------------------------------------------------------------------------- 1 | source_md5="f6f037e0dfcaa4296c90018ba2ffdee4" 2 | dest_md5="5cfe9926d769f87e16f4b5b3c9a57250" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser64px.png-5ae0f0282871cbde75b9599e403888a0.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser64px.png-5ae0f0282871cbde75b9599e403888a0.stex -------------------------------------------------------------------------------- /.import/Mouse_Curser64px.png-5d677c882d21ce8b0ea4869a864282a0.md5: -------------------------------------------------------------------------------- 1 | source_md5="f6f037e0dfcaa4296c90018ba2ffdee4" 2 | dest_md5="5cfe9926d769f87e16f4b5b3c9a57250" 3 | 4 | -------------------------------------------------------------------------------- /.import/Mouse_Curser64px.png-5d677c882d21ce8b0ea4869a864282a0.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Mouse_Curser64px.png-5d677c882d21ce8b0ea4869a864282a0.stex -------------------------------------------------------------------------------- /.import/Sky.jpg-15f50a37135c9cac38112f9308f7fc68.md5: -------------------------------------------------------------------------------- 1 | source_md5="0c1361e3841ea795be6feac243a1ea9b" 2 | dest_md5="713412044a1f0ec48ab5eb18200883f1" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sky.jpg-15f50a37135c9cac38112f9308f7fc68.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sky.jpg-15f50a37135c9cac38112f9308f7fc68.stex -------------------------------------------------------------------------------- /.import/Sky.jpg-4150e2aaeab55242ef068f3a28d7f3f5.md5: -------------------------------------------------------------------------------- 1 | source_md5="0c1361e3841ea795be6feac243a1ea9b" 2 | dest_md5="713412044a1f0ec48ab5eb18200883f1" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sky.jpg-4150e2aaeab55242ef068f3a28d7f3f5.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sky.jpg-4150e2aaeab55242ef068f3a28d7f3f5.stex -------------------------------------------------------------------------------- /.import/Sky.jpg-419fbb27475dfe8c5f4699b022a7b25d.md5: -------------------------------------------------------------------------------- 1 | source_md5="0c1361e3841ea795be6feac243a1ea9b" 2 | dest_md5="713412044a1f0ec48ab5eb18200883f1" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sky.jpg-419fbb27475dfe8c5f4699b022a7b25d.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sky.jpg-419fbb27475dfe8c5f4699b022a7b25d.stex -------------------------------------------------------------------------------- /.import/Sphere.obj-096614370fc39042f347a7c2da27bce8.md5: -------------------------------------------------------------------------------- 1 | source_md5="c569967eda0b9fe727d32cf38cb1415c" 2 | dest_md5="d5bc7ca295635b640ae2b29bc7598d1c" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sphere.obj-096614370fc39042f347a7c2da27bce8.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sphere.obj-096614370fc39042f347a7c2da27bce8.mesh -------------------------------------------------------------------------------- /.import/Sphere.obj-305cf02e68450e9fa1ef81d04f3a60db.md5: -------------------------------------------------------------------------------- 1 | source_md5="c569967eda0b9fe727d32cf38cb1415c" 2 | dest_md5="d5bc7ca295635b640ae2b29bc7598d1c" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sphere.obj-305cf02e68450e9fa1ef81d04f3a60db.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sphere.obj-305cf02e68450e9fa1ef81d04f3a60db.mesh -------------------------------------------------------------------------------- /.import/Sphere.obj-61d1119484b00cdb649a1f750f345c6a.md5: -------------------------------------------------------------------------------- 1 | source_md5="c569967eda0b9fe727d32cf38cb1415c" 2 | dest_md5="d5bc7ca295635b640ae2b29bc7598d1c" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sphere.obj-61d1119484b00cdb649a1f750f345c6a.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sphere.obj-61d1119484b00cdb649a1f750f345c6a.mesh -------------------------------------------------------------------------------- /.import/Sphere.obj-76cc8f1f496956c938cabbef7d48ab66.md5: -------------------------------------------------------------------------------- 1 | source_md5="c569967eda0b9fe727d32cf38cb1415c" 2 | dest_md5="d5bc7ca295635b640ae2b29bc7598d1c" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sphere.obj-76cc8f1f496956c938cabbef7d48ab66.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sphere.obj-76cc8f1f496956c938cabbef7d48ab66.mesh -------------------------------------------------------------------------------- /.import/Sphere.obj-d0fb45b1b81fc4f4bb1255756c78937b.md5: -------------------------------------------------------------------------------- 1 | source_md5="c569967eda0b9fe727d32cf38cb1415c" 2 | dest_md5="d5bc7ca295635b640ae2b29bc7598d1c" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sphere.obj-d0fb45b1b81fc4f4bb1255756c78937b.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sphere.obj-d0fb45b1b81fc4f4bb1255756c78937b.mesh -------------------------------------------------------------------------------- /.import/Sphere.obj-e550e1e2a80a3c6982930b9f04eedc53.md5: -------------------------------------------------------------------------------- 1 | source_md5="c569967eda0b9fe727d32cf38cb1415c" 2 | dest_md5="d5bc7ca295635b640ae2b29bc7598d1c" 3 | 4 | -------------------------------------------------------------------------------- /.import/Sphere.obj-e550e1e2a80a3c6982930b9f04eedc53.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/Sphere.obj-e550e1e2a80a3c6982930b9f04eedc53.mesh -------------------------------------------------------------------------------- /.import/angel.png-98eb72da45f31f89457b86d4886d4c02.md5: -------------------------------------------------------------------------------- 1 | source_md5="91f95bb826caaef4141babb73062296f" 2 | dest_md5="ad610a4cdf8c813a7e8346de32a7bc05" 3 | 4 | -------------------------------------------------------------------------------- /.import/black_sigil_icon.png-1efbdf34f053ee7444454b4af931dbdc.md5: -------------------------------------------------------------------------------- 1 | source_md5="dfb96ef82ed8850310f67e6758d8d20c" 2 | dest_md5="77fc9cc67d353ef06e0c4644287c6f1b" 3 | 4 | -------------------------------------------------------------------------------- /.import/black_sigil_icon.png-1efbdf34f053ee7444454b4af931dbdc.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/black_sigil_icon.png-1efbdf34f053ee7444454b4af931dbdc.stex -------------------------------------------------------------------------------- /.import/black_sigil_icon.png-7799fff15e440ac8ebe466570c623dc6.md5: -------------------------------------------------------------------------------- 1 | source_md5="dfb96ef82ed8850310f67e6758d8d20c" 2 | dest_md5="77fc9cc67d353ef06e0c4644287c6f1b" 3 | 4 | -------------------------------------------------------------------------------- /.import/black_sigil_icon.png-7799fff15e440ac8ebe466570c623dc6.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/black_sigil_icon.png-7799fff15e440ac8ebe466570c623dc6.stex -------------------------------------------------------------------------------- /.import/black_sigil_icon.png-7cb9f09e856aede16653e8b77e527d9c.md5: -------------------------------------------------------------------------------- 1 | source_md5="dfb96ef82ed8850310f67e6758d8d20c" 2 | dest_md5="77fc9cc67d353ef06e0c4644287c6f1b" 3 | 4 | -------------------------------------------------------------------------------- /.import/black_sigil_icon.png-7cb9f09e856aede16653e8b77e527d9c.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/black_sigil_icon.png-7cb9f09e856aede16653e8b77e527d9c.stex -------------------------------------------------------------------------------- /.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5: -------------------------------------------------------------------------------- 1 | source_md5="bed5bbb55ecca8aeae68e95eea2857fa" 2 | dest_md5="d4515c85f0b014156cd73e3effd93ceb" 3 | 4 | -------------------------------------------------------------------------------- /.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex -------------------------------------------------------------------------------- /.import/white_sigil_icon.png-09a5adad0d7cb819d735b1d4c1900339.md5: -------------------------------------------------------------------------------- 1 | source_md5="2d44eb11b0d9c3cc31fbdb706e5fa611" 2 | dest_md5="8828b8af79409db01a283c26e3c80dcc" 3 | 4 | -------------------------------------------------------------------------------- /.import/white_sigil_icon.png-09a5adad0d7cb819d735b1d4c1900339.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/white_sigil_icon.png-09a5adad0d7cb819d735b1d4c1900339.stex -------------------------------------------------------------------------------- /.import/white_sigil_icon.png-81aa7dd04e62533ae6458727a18ac389.md5: -------------------------------------------------------------------------------- 1 | source_md5="2d44eb11b0d9c3cc31fbdb706e5fa611" 2 | dest_md5="8828b8af79409db01a283c26e3c80dcc" 3 | 4 | -------------------------------------------------------------------------------- /.import/white_sigil_icon.png-81aa7dd04e62533ae6458727a18ac389.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/white_sigil_icon.png-81aa7dd04e62533ae6458727a18ac389.stex -------------------------------------------------------------------------------- /.import/white_sigil_icon.png-fb37aaf05bd9c587a97ef0a813727b28.md5: -------------------------------------------------------------------------------- 1 | source_md5="2d44eb11b0d9c3cc31fbdb706e5fa611" 2 | dest_md5="8828b8af79409db01a283c26e3c80dcc" 3 | 4 | -------------------------------------------------------------------------------- /.import/white_sigil_icon.png-fb37aaf05bd9c587a97ef0a813727b28.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/.import/white_sigil_icon.png-fb37aaf05bd9c587a97ef0a813727b28.stex -------------------------------------------------------------------------------- /DaveTheDev Tutorials/10 Using Multimeshes/Demo/Sphere.obj.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="wavefront_obj" 4 | type="Mesh" 5 | path="res://.import/Sphere.obj-9353544a4251a86c6925f63f2e74f28c.mesh" 6 | 7 | [deps] 8 | 9 | files=[ "res://.import/Sphere.obj-9353544a4251a86c6925f63f2e74f28c.mesh" ] 10 | 11 | source_file="res://DaveTheDev Tutorials/10 Using Multimeshes/Demo/Sphere.obj" 12 | dest_files=[ "res://.import/Sphere.obj-9353544a4251a86c6925f63f2e74f28c.mesh", "res://.import/Sphere.obj-9353544a4251a86c6925f63f2e74f28c.mesh" ] 13 | 14 | [params] 15 | 16 | generate_tangents=true 17 | scale_mesh=Vector3( 1, 1, 1 ) 18 | offset_mesh=Vector3( 0, 0, 0 ) 19 | optimize_mesh=true 20 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/10 Using Multimeshes/Demo/vortex.shader: -------------------------------------------------------------------------------- 1 | shader_type spatial; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D perlin_texture; 5 | 6 | void vertex() 7 | { 8 | float radius_amplitude = 2.0; 9 | float procession_amplitude = 20.0; 10 | 11 | float procession_level = (float(INSTANCE_ID) / 1080.0) * 128.0; 12 | 13 | float procession_x = texture(perlin_texture, vec2(TIME / 64.0, procession_level / 1080.0)).x * procession_amplitude; 14 | float procession_z = texture(perlin_texture, vec2(TIME / 64.0, 0.2 + procession_level / 1080.0)).x * procession_amplitude; 15 | 16 | float radius = abs(texture(perlin_texture, vec2(TIME, float(INSTANCE_ID) / 1080.0)).x * radius_amplitude); 17 | float rotation_base_angle = texture(perlin_texture, vec2(float(INSTANCE_ID) / 1080.0, float(INSTANCE_ID) / 1080.0)).x * 8.0; 18 | float rotation_angle = (rotation_base_angle * 3.14) + TIME * 32.0; 19 | radius = radius + (float(INSTANCE_ID) / 1080.0) * (float(INSTANCE_ID) / 1080.0) * 10.0; 20 | 21 | VERTEX.y = VERTEX.y + float(INSTANCE_ID) * 0.03; 22 | VERTEX.x = VERTEX.x + radius * cos(rotation_angle + (VERTEX.z / 0.5)) + procession_x; 23 | VERTEX.z = VERTEX.z + radius * sin(rotation_angle + (VERTEX.z / 0.5)) + procession_z; 24 | 25 | float color = texture(perlin_texture, vec2(TIME / 64.0, ( procession_level / 1080.0))).x - 0.4; 26 | COLOR = vec4(color, color, color, 1.0); 27 | } 28 | 29 | void fragment() 30 | { 31 | ALBEDO = COLOR.rgb; 32 | } -------------------------------------------------------------------------------- /DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/sphere.material" type="Material" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/Sphere.obj" type="ArrayMesh" id=2] 5 | [ext_resource path="res://DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/MultiMeshInstance.gd" type="Script" id=3] 6 | 7 | 8 | [sub_resource type="MultiMesh" id=1] 9 | transform_format = 1 10 | instance_count = 400 11 | mesh = ExtResource( 2 ) 12 | transform_array = PoolVector3Array( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) 13 | 14 | [node name="Game" type="Spatial"] 15 | 16 | [node name="Camera" type="Camera" parent="."] 17 | transform = Transform( 0.707107, 0.183013, -0.683013, 0, 0.965926, 0.258819, 0.707107, -0.183013, 0.683013, -3, 3, 3 ) 18 | 19 | [node name="MultiMeshInstance" type="MultiMeshInstance" parent="."] 20 | material_override = ExtResource( 1 ) 21 | multimesh = SubResource( 1 ) 22 | script = ExtResource( 3 ) 23 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/MultiMeshInstance.gd: -------------------------------------------------------------------------------- 1 | extends MultiMeshInstance 2 | 3 | func _ready(): 4 | for x in range(20): 5 | for z in range(20): 6 | self.multimesh.set_instance_transform(z * 20 + x, Transform(Basis(), Vector3(x, 0.0, -z))) -------------------------------------------------------------------------------- /DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/Sphere.obj.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="wavefront_obj" 4 | type="Mesh" 5 | path="res://.import/Sphere.obj-c8c2f98fd187ef47c6cbade32955bba0.mesh" 6 | 7 | [deps] 8 | 9 | files=[ "res://.import/Sphere.obj-c8c2f98fd187ef47c6cbade32955bba0.mesh" ] 10 | 11 | source_file="res://DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/Sphere.obj" 12 | dest_files=[ "res://.import/Sphere.obj-c8c2f98fd187ef47c6cbade32955bba0.mesh", "res://.import/Sphere.obj-c8c2f98fd187ef47c6cbade32955bba0.mesh" ] 13 | 14 | [params] 15 | 16 | generate_tangents=true 17 | scale_mesh=Vector3( 1, 1, 1 ) 18 | offset_mesh=Vector3( 0, 0, 0 ) 19 | optimize_mesh=true 20 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/sphere.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/10 Using Multimeshes/Tutorial/sphere.material -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/Cube.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/11 Using Shape Keys/Demo/Cube.mesh -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/11 Using Shape Keys/Demo/Spider.mesh" type="ArrayMesh" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.material" type="Material" id=2] 5 | [ext_resource path="res://DaveTheDev Tutorials/11 Using Shape Keys/Demo/Spider.gd" type="Script" id=3] 6 | 7 | 8 | [sub_resource type="OpenSimplexNoise" id=1] 9 | 10 | [node name="Game" type="Spatial"] 11 | 12 | [node name="Spider" type="MeshInstance" parent="."] 13 | transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 ) 14 | mesh = ExtResource( 1 ) 15 | blend_shapes/Abdomin_Size = 0.0 16 | blend_shapes/Eyes_Size = 0.0 17 | blend_shapes/Legs_Length = 0.0 18 | blend_shapes/Legs_Thickness = 0.0 19 | blend_shapes/Mandables_Length = 0.0 20 | blend_shapes/Mandables_Size = 0.0 21 | material/0 = ExtResource( 2 ) 22 | script = ExtResource( 3 ) 23 | perlin_noise = SubResource( 1 ) 24 | 25 | [node name="Camera" type="Camera" parent="."] 26 | transform = Transform( 0.979289, -0.054537, 0.194982, -0.0452031, 0.879836, 0.473123, -0.197355, -0.472138, 0.859149, 0.431353, 1.618, 2.42832 ) 27 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/Spider.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | export(OpenSimplexNoise) var perlin_noise : OpenSimplexNoise 4 | export(float) var speed = 0.5 5 | export(float) var perlin_offset = 314.0 6 | 7 | var time = 0.0 8 | 9 | func _process(delta): 10 | 11 | self.time += self.speed 12 | 13 | var abdomin_size = (self.perlin_noise.get_noise_2d(self.time, 1.0) + 1.0) / 2.0 14 | var eyes_size = (self.perlin_noise.get_noise_2d(self.time + self.perlin_offset, 1.0)) + 1.0 / 2.0 15 | var legs_length = (self.perlin_noise.get_noise_2d(self.time + self.perlin_offset * 2.0, 1.0) + 1.0) / 2.0 16 | var legs_thickness = (self.perlin_noise.get_noise_2d(self.time + self.perlin_offset * 3.0, 1.0) + 1.0) / 2.0 17 | var mandables_length = (self.perlin_noise.get_noise_2d(self.time + self.perlin_offset * 4.0, 1.0) + 1.0) / 2.0 18 | var mandables_size = (self.perlin_noise.get_noise_2d(self.time + self.perlin_offset * 5.0, 1.0) + 1.0) / 2.0 19 | 20 | self.set("blend_shapes/Abdomin_Size", abdomin_size) 21 | self.set("blend_shapes/Eyes_Size", eyes_size) 22 | self.set("blend_shapes/Legs_Length", legs_length) 23 | self.set("blend_shapes/Legs_Thickness", legs_thickness) 24 | self.set("blend_shapes/Mandables_Length", mandables_length) 25 | self.set("blend_shapes/Mandables_Size", mandables_size) 26 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/Spider.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/11 Using Shape Keys/Demo/Spider.mesh -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.material -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/spider.png-6a22d8d475015e7ae0a8b344b3eb5c52.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/11 Using Shape Keys/Demo/spider.png" 13 | dest_files=[ "res://.import/spider.png-6a22d8d475015e7ae0a8b344b3eb5c52.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=1 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/Sphere.mesh" type="ArrayMesh" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/sphere.material" type="Material" id=2] 5 | [ext_resource path="res://DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/Sphere.gd" type="Script" id=3] 6 | 7 | 8 | [node name="Game" type="Spatial"] 9 | 10 | [node name="Camera" type="Camera" parent="."] 11 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3.26218 ) 12 | 13 | [node name="Sphere" type="MeshInstance" parent="."] 14 | mesh = ExtResource( 1 ) 15 | "blend_shapes/Morphed Sphere" = 0.0 16 | material/0 = ExtResource( 2 ) 17 | script = ExtResource( 3 ) 18 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/Sphere.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | func _ready(): 4 | randomize() 5 | self.set("blend_shapes/Morphed Sphere", randf()) 6 | 7 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/Sphere.mesh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/Sphere.mesh -------------------------------------------------------------------------------- /DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/sphere.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/11 Using Shape Keys/Tutorial/sphere.material -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/Dialog_Player.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | onready var _Body_AnimationPlayer = find_node("Body_AnimationPlayer") 4 | onready var _Body_LBL = find_node("Body_Label") 5 | onready var _Character_Texture = find_node("Character_Texture") 6 | onready var _Dialog_Box = find_node("Dialog_Box") 7 | onready var _Option_List = find_node("Option_List") 8 | onready var _Registry = find_node("Simulated_Registry") 9 | onready var _SelectChoice_Icon = find_node("SelectChoice_NinePatchRect") 10 | onready var _Speaker_LBL = find_node("Speaker_Label") 11 | onready var _SpaceBar_Icon = find_node("SpaceBar_NinePatchRect") 12 | 13 | onready var _Option_Button_Scene = load("res://DaveTheDev Tutorials/12 Dialog Player/scenes/Option.tscn") 14 | 15 | var _did = 0 16 | var _nid = 0 17 | var _final_nid = 0 18 | var _Story_Reader 19 | var _texture_library : Dictionary = {} 20 | 21 | # Virtual Methods 22 | 23 | func _ready(): 24 | var Story_Reader_Class = load("res://addons/EXP-System-Dialog/Reference_StoryReader/EXP_StoryReader.gd") 25 | _Story_Reader = Story_Reader_Class.new() 26 | 27 | var story = load("res://DaveTheDev Tutorials/12 Dialog Player/stories/Example_Story_Baked.tres") 28 | _Story_Reader.read(story) 29 | 30 | _load_textures() 31 | 32 | _Dialog_Box.visible = false 33 | _SpaceBar_Icon.visible = false 34 | _SelectChoice_Icon.visible = false 35 | _Option_List.visible = false 36 | 37 | _clear_options() 38 | 39 | play_dialog("DialogPlayer/CharacterTextures") 40 | 41 | 42 | func _input(event): 43 | if event is InputEventKey: 44 | if event.scancode == KEY_SPACE and event.pressed == true: 45 | _on_Dialog_Player_pressed_spacebar() 46 | 47 | # Callback Methods 48 | 49 | func _on_Body_AnimationPlayer_animation_finished(anim_name): 50 | if _Option_List.get_child_count() == 0: 51 | _SpaceBar_Icon.visible = true 52 | else: 53 | _SelectChoice_Icon.visible = true 54 | _Option_List.visible = true 55 | 56 | 57 | func _on_Dialog_Player_pressed_spacebar(): 58 | if _is_waiting(): 59 | _SpaceBar_Icon.visible = false 60 | _Character_Texture.visible = false 61 | _get_next_node() 62 | if _is_playing(): 63 | _play_node() 64 | 65 | 66 | func _on_Option_clicked(slot): 67 | _SelectChoice_Icon.visible = false 68 | _Option_List.visible = false 69 | _Character_Texture.visible = false 70 | _get_next_node(slot) 71 | _clear_options() 72 | if _is_playing(): 73 | _play_node() 74 | 75 | # Public Methods 76 | 77 | func play_dialog(record_name : String): 78 | _did = _Story_Reader.get_did_via_record_name(record_name) 79 | _nid = _Story_Reader.get_nid_via_exact_text(_did, "") 80 | _final_nid = _Story_Reader.get_nid_via_exact_text(_did, "") 81 | _get_next_node() 82 | _play_node() 83 | _Dialog_Box.visible = true 84 | 85 | # Private Methods 86 | 87 | func _clear_options(): 88 | var children = _Option_List.get_children() 89 | for child in children: 90 | _Option_List.remove_child(child) 91 | child.queue_free() 92 | 93 | 94 | func _display_image(key : String): 95 | _Character_Texture.texture = _texture_library[key] 96 | _Character_Texture.visible = true 97 | 98 | 99 | func _get_next_node(slot : int = 0): 100 | _nid = _Story_Reader.get_nid_from_slot(_did, _nid, slot) 101 | 102 | if _nid == _final_nid: 103 | _Dialog_Box.visible = false 104 | 105 | 106 | func _get_tagged_text(tag : String, text : String) -> String: 107 | var start_tag = "<" + tag + ">" 108 | var end_tag = "" 109 | var start_index = text.find(start_tag) + start_tag.length() 110 | var end_index = text.find(end_tag) 111 | var substr_length = end_index - start_index 112 | return text.substr(start_index, substr_length) 113 | 114 | 115 | func _inject_variables(text : String) -> String: 116 | var variable_count = text.count("") 117 | 118 | for i in range(variable_count): 119 | var variable_name = _get_tagged_text("variable", text) 120 | var variable_value = _Registry.lookup(variable_name) 121 | var start_index = text.find("") 122 | var end_index = text.find("") + "".length() 123 | var substr_length = end_index - start_index 124 | text.erase(start_index, substr_length) 125 | text = text.insert(start_index, str(variable_value)) 126 | 127 | return text 128 | 129 | 130 | func _is_playing() -> bool: 131 | return _Dialog_Box.visible 132 | 133 | 134 | func _is_waiting() -> bool: 135 | return _SpaceBar_Icon.visible 136 | 137 | 138 | func _load_textures(): 139 | var did = _Story_Reader.get_did_via_record_name("DialogPlayer/TextureLibrary") 140 | var json_text = _Story_Reader.get_text(did, 1) 141 | var raw_texture_library : Dictionary = parse_json(json_text) 142 | 143 | for key in raw_texture_library: 144 | var texture_path = raw_texture_library[key] 145 | var loaded_texture = load(texture_path) 146 | _texture_library[key] = loaded_texture 147 | 148 | 149 | 150 | func _play_node(): 151 | var text = _Story_Reader.get_text(_did, _nid) 152 | text = _inject_variables(text) 153 | var speaker = _get_tagged_text("speaker", text) 154 | var dialog = _get_tagged_text("dialog", text) 155 | if "" in text: 156 | var options = _get_tagged_text("choiceJSON", text) 157 | _populate_choices(options) 158 | if "" in text: 159 | var library_key = _get_tagged_text("image", text) 160 | _display_image(library_key) 161 | 162 | _Speaker_LBL.text = speaker 163 | _Body_LBL.text = dialog 164 | _Body_AnimationPlayer.play("TextDisplay") 165 | 166 | 167 | func _populate_choices(JSONtext : String): 168 | var choices : Dictionary = parse_json(JSONtext) 169 | 170 | for text in choices: 171 | var slot = choices[text] 172 | var new_option_button = _Option_Button_Scene.instance() 173 | _Option_List.add_child(new_option_button) 174 | new_option_button.slot = slot 175 | new_option_button.set_text(text) 176 | new_option_button.connect("clicked", self, "_on_Option_clicked") 177 | 178 | 179 | 180 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/Dialog_Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=12 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/textures/menu_section_9patch.png" type="Texture" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/fonts/Cave-Story.ttf" type="DynamicFontData" id=2] 5 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/Dialog_Player.gd" type="Script" id=3] 6 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/Simulated_Registry.gd" type="Script" id=4] 7 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/scenes/Option.tscn" type="PackedScene" id=5] 8 | 9 | [sub_resource type="DynamicFont" id=1] 10 | size = 38 11 | font_data = ExtResource( 2 ) 12 | 13 | [sub_resource type="Animation" id=2] 14 | resource_name = "TextDisplay" 15 | tracks/0/type = "value" 16 | tracks/0/path = NodePath(".:percent_visible") 17 | tracks/0/interp = 1 18 | tracks/0/loop_wrap = true 19 | tracks/0/imported = false 20 | tracks/0/enabled = true 21 | tracks/0/keys = { 22 | "times": PoolRealArray( 0, 1 ), 23 | "transitions": PoolRealArray( 1, 1 ), 24 | "update": 0, 25 | "values": [ 0.0, 1.0 ] 26 | } 27 | 28 | [sub_resource type="DynamicFont" id=3] 29 | size = 36 30 | font_data = ExtResource( 2 ) 31 | 32 | [sub_resource type="DynamicFont" id=4] 33 | size = 38 34 | font_data = ExtResource( 2 ) 35 | 36 | [sub_resource type="Animation" id=5] 37 | resource_name = "PressSpaceBar" 38 | loop = true 39 | tracks/0/type = "value" 40 | tracks/0/path = NodePath(".:rect_scale") 41 | tracks/0/interp = 1 42 | tracks/0/loop_wrap = true 43 | tracks/0/imported = false 44 | tracks/0/enabled = true 45 | tracks/0/keys = { 46 | "times": PoolRealArray( 0, 0.5, 1 ), 47 | "transitions": PoolRealArray( 1, 1, 1 ), 48 | "update": 0, 49 | "values": [ Vector2( 1, 1 ), Vector2( 1.1, 1.1 ), Vector2( 1, 1 ) ] 50 | } 51 | 52 | [sub_resource type="Animation" id=6] 53 | resource_name = "PressSpaceBar" 54 | loop = true 55 | tracks/0/type = "value" 56 | tracks/0/path = NodePath(".:rect_scale") 57 | tracks/0/interp = 1 58 | tracks/0/loop_wrap = true 59 | tracks/0/imported = false 60 | tracks/0/enabled = true 61 | tracks/0/keys = { 62 | "times": PoolRealArray( 0, 0.5, 1 ), 63 | "transitions": PoolRealArray( 1, 1, 1 ), 64 | "update": 0, 65 | "values": [ Vector2( 1, 1 ), Vector2( 1.1, 1.1 ), Vector2( 1, 1 ) ] 66 | } 67 | 68 | [node name="Dialog_Player" type="Node"] 69 | script = ExtResource( 3 ) 70 | 71 | [node name="Dialog_Box" type="Control" parent="."] 72 | anchor_right = 1.0 73 | anchor_bottom = 1.0 74 | __meta__ = { 75 | "_edit_use_anchors_": false 76 | } 77 | 78 | [node name="Body_NinePatchRect" type="NinePatchRect" parent="Dialog_Box"] 79 | anchor_left = 0.5 80 | anchor_top = 0.5 81 | anchor_right = 0.5 82 | anchor_bottom = 0.5 83 | margin_left = -360.0 84 | margin_top = -128.0 85 | margin_right = 360.0 86 | margin_bottom = 128.0 87 | rect_min_size = Vector2( 720, 256 ) 88 | texture = ExtResource( 1 ) 89 | patch_margin_left = 3 90 | patch_margin_top = 3 91 | patch_margin_right = 3 92 | patch_margin_bottom = 3 93 | __meta__ = { 94 | "_edit_use_anchors_": false 95 | } 96 | 97 | [node name="MarginContainer" type="MarginContainer" parent="Dialog_Box/Body_NinePatchRect"] 98 | anchor_right = 1.0 99 | anchor_bottom = 1.0 100 | margin_left = 14.6395 101 | margin_top = 48.0 102 | margin_right = -17.3605 103 | margin_bottom = -48.0 104 | size_flags_horizontal = 3 105 | size_flags_vertical = 3 106 | __meta__ = { 107 | "_edit_use_anchors_": false 108 | } 109 | 110 | [node name="Body_Label" type="Label" parent="Dialog_Box/Body_NinePatchRect/MarginContainer"] 111 | margin_right = 688.0 112 | margin_bottom = 160.0 113 | size_flags_horizontal = 3 114 | size_flags_vertical = 3 115 | custom_fonts/font = SubResource( 1 ) 116 | text = "This is where the body of the dialog text goes. 117 | Press F6 to play! ^_^" 118 | autowrap = true 119 | 120 | [node name="Body_AnimationPlayer" type="AnimationPlayer" parent="Dialog_Box/Body_NinePatchRect/MarginContainer/Body_Label"] 121 | anims/TextDisplay = SubResource( 2 ) 122 | 123 | [node name="Speaker_NinePatchRect" type="NinePatchRect" parent="Dialog_Box/Body_NinePatchRect"] 124 | margin_left = -17.4952 125 | margin_top = -24.4934 126 | margin_right = 162.505 127 | margin_bottom = 23.5066 128 | rect_min_size = Vector2( 180, 48 ) 129 | texture = ExtResource( 1 ) 130 | patch_margin_left = 3 131 | patch_margin_top = 3 132 | patch_margin_right = 3 133 | patch_margin_bottom = 3 134 | __meta__ = { 135 | "_edit_use_anchors_": false 136 | } 137 | 138 | [node name="Speaker_Label" type="Label" parent="Dialog_Box/Body_NinePatchRect/Speaker_NinePatchRect"] 139 | anchor_right = 1.0 140 | anchor_bottom = 1.0 141 | custom_fonts/font = SubResource( 3 ) 142 | text = "Speaker" 143 | align = 1 144 | valign = 1 145 | __meta__ = { 146 | "_edit_use_anchors_": false 147 | } 148 | 149 | [node name="SpaceBar_NinePatchRect" type="NinePatchRect" parent="Dialog_Box/Body_NinePatchRect"] 150 | anchor_left = 1.0 151 | anchor_top = 1.0 152 | anchor_right = 1.0 153 | anchor_bottom = 1.0 154 | margin_left = -224.283 155 | margin_top = -37.6673 156 | margin_right = 31.7166 157 | margin_bottom = 10.3327 158 | rect_min_size = Vector2( 256, 48 ) 159 | texture = ExtResource( 1 ) 160 | patch_margin_left = 3 161 | patch_margin_top = 3 162 | patch_margin_right = 3 163 | patch_margin_bottom = 3 164 | __meta__ = { 165 | "_edit_use_anchors_": false 166 | } 167 | 168 | [node name="SpaceBar_Label" type="Label" parent="Dialog_Box/Body_NinePatchRect/SpaceBar_NinePatchRect"] 169 | anchor_right = 1.0 170 | anchor_bottom = 1.0 171 | custom_fonts/font = SubResource( 4 ) 172 | text = "Press Spacebar" 173 | align = 1 174 | valign = 1 175 | __meta__ = { 176 | "_edit_use_anchors_": false 177 | } 178 | 179 | [node name="AnimationPlayer" type="AnimationPlayer" parent="Dialog_Box/Body_NinePatchRect/SpaceBar_NinePatchRect"] 180 | autoplay = "PressSpaceBar" 181 | anims/PressSpaceBar = SubResource( 5 ) 182 | 183 | [node name="SelectChoice_NinePatchRect" type="NinePatchRect" parent="Dialog_Box/Body_NinePatchRect"] 184 | anchor_left = 1.0 185 | anchor_top = 1.0 186 | anchor_right = 1.0 187 | anchor_bottom = 1.0 188 | margin_left = -224.283 189 | margin_top = -37.6673 190 | margin_right = 31.7166 191 | margin_bottom = 10.3327 192 | rect_min_size = Vector2( 256, 48 ) 193 | texture = ExtResource( 1 ) 194 | patch_margin_left = 3 195 | patch_margin_top = 3 196 | patch_margin_right = 3 197 | patch_margin_bottom = 3 198 | __meta__ = { 199 | "_edit_use_anchors_": false 200 | } 201 | 202 | [node name="SelectChoice_Label" type="Label" parent="Dialog_Box/Body_NinePatchRect/SelectChoice_NinePatchRect"] 203 | anchor_right = 1.0 204 | anchor_bottom = 1.0 205 | custom_fonts/font = SubResource( 4 ) 206 | text = "Select Choice" 207 | align = 1 208 | valign = 1 209 | __meta__ = { 210 | "_edit_use_anchors_": false 211 | } 212 | 213 | [node name="AnimationPlayer" type="AnimationPlayer" parent="Dialog_Box/Body_NinePatchRect/SelectChoice_NinePatchRect"] 214 | autoplay = "PressSpaceBar" 215 | anims/PressSpaceBar = SubResource( 6 ) 216 | 217 | [node name="Option_List" type="VBoxContainer" parent="Dialog_Box/Body_NinePatchRect"] 218 | anchor_left = 1.0 219 | anchor_right = 1.0 220 | margin_left = -540.0 221 | margin_top = -60.0 222 | margin_bottom = -12.0 223 | grow_vertical = 0 224 | __meta__ = { 225 | "_edit_use_anchors_": false 226 | } 227 | 228 | [node name="Option" parent="Dialog_Box/Body_NinePatchRect/Option_List" instance=ExtResource( 5 )] 229 | anchor_top = 0.0 230 | anchor_right = 0.0 231 | anchor_bottom = 0.0 232 | margin_right = 540.0 233 | margin_bottom = 48.0 234 | 235 | [node name="Option2" parent="Dialog_Box/Body_NinePatchRect/Option_List" instance=ExtResource( 5 )] 236 | anchor_top = 0.0 237 | anchor_right = 0.0 238 | anchor_bottom = 0.0 239 | margin_top = 52.0 240 | margin_right = 540.0 241 | margin_bottom = 100.0 242 | 243 | [node name="Option3" parent="Dialog_Box/Body_NinePatchRect/Option_List" instance=ExtResource( 5 )] 244 | anchor_top = 0.0 245 | anchor_right = 0.0 246 | anchor_bottom = 0.0 247 | margin_top = 104.0 248 | margin_right = 540.0 249 | margin_bottom = 152.0 250 | 251 | [node name="Character_Texture" type="TextureRect" parent="Dialog_Box/Body_NinePatchRect"] 252 | margin_left = -16.0 253 | margin_top = -200.0 254 | margin_right = 144.0 255 | margin_bottom = -40.0 256 | __meta__ = { 257 | "_edit_use_anchors_": false 258 | } 259 | 260 | [node name="Simulated_Registry" type="Node" parent="."] 261 | script = ExtResource( 4 ) 262 | [connection signal="animation_finished" from="Dialog_Box/Body_NinePatchRect/MarginContainer/Body_Label/Body_AnimationPlayer" to="." method="_on_Body_AnimationPlayer_animation_finished"] 263 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/Simulated_Registry.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var registry = {"Test": "*this*", 4 | "PLAYER/LEVEL": 99, 5 | "PI": PI, 6 | "DATE": OS.get_datetime(), 7 | "SYSTEM": OS.get_name()} 8 | 9 | # Public Methods 10 | 11 | func lookup(name : String): 12 | if registry.has(name): 13 | return registry[name] 14 | else: 15 | return "" 16 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/fonts/Cave-Story.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/fonts/Cave-Story.ttf -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/fonts/Cave-Story_Credit: -------------------------------------------------------------------------------- 1 | https://fontlibrary.org/en/font/cave-story 2 | https://creativecommons.org/licenses/by-sa/3.0/ 3 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/scenes/Option.gd: -------------------------------------------------------------------------------- 1 | extends NinePatchRect 2 | 3 | signal clicked(slot) 4 | 5 | onready var _Button = $Button 6 | 7 | var slot 8 | 9 | # Callback Methods 10 | 11 | func _on_Button_pressed(): 12 | emit_signal("clicked", slot) 13 | 14 | # Public Methods 15 | 16 | func set_text(new_text : String): 17 | _Button.text = new_text 18 | 19 | 20 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/scenes/Option.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/fonts/Cave-Story.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/textures/menu_section_9patch.png" type="Texture" id=2] 5 | [ext_resource path="res://DaveTheDev Tutorials/12 Dialog Player/scenes/Option.gd" type="Script" id=3] 6 | 7 | [sub_resource type="DynamicFont" id=1] 8 | size = 38 9 | font_data = ExtResource( 1 ) 10 | 11 | [node name="Option" type="NinePatchRect"] 12 | anchor_top = 1.0 13 | anchor_right = 1.0 14 | anchor_bottom = 1.0 15 | grow_vertical = 0 16 | rect_min_size = Vector2( 0, 48 ) 17 | size_flags_horizontal = 3 18 | texture = ExtResource( 2 ) 19 | patch_margin_left = 3 20 | patch_margin_top = 3 21 | patch_margin_right = 3 22 | patch_margin_bottom = 3 23 | script = ExtResource( 3 ) 24 | __meta__ = { 25 | "_edit_use_anchors_": false 26 | } 27 | 28 | [node name="Button" type="Button" parent="."] 29 | anchor_right = 1.0 30 | anchor_bottom = 1.0 31 | custom_fonts/font = SubResource( 1 ) 32 | text = "This is a test option." 33 | flat = true 34 | __meta__ = { 35 | "_edit_use_anchors_": false 36 | } 37 | [connection signal="pressed" from="Button" to="." method="_on_Button_pressed"] 38 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/stories/Example_Story.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | TYPE = "EXP_Story_editor" 8 | names = { 9 | "DialogPlayer/CharacterTextures": 5, 10 | "DialogPlayer/ChoiceBranching": 3, 11 | "DialogPlayer/Test": 1, 12 | "DialogPlayer/TextureLibrary": 4, 13 | "DialogPlayer/VariableInjection": 2 14 | } 15 | story = { 16 | 1: { 17 | "available_nid": [ ], 18 | "groups": [ ], 19 | "human_readable_description": "This is the first test of the vanilla dialog player.", 20 | "name": "DialogPlayer/Test", 21 | "nodes": { 22 | 1: { 23 | "graph_offset": Vector2( 120, 100 ), 24 | "links": { 25 | 0: 2 26 | }, 27 | "rect_size": Vector2( 324, 137 ), 28 | "slot_amount": 1, 29 | "text": "", 30 | "type": "line" 31 | }, 32 | 2: { 33 | "graph_offset": Vector2( 200, 280 ), 34 | "links": { 35 | 0: 3 36 | }, 37 | "rect_size": Vector2( 324, 137 ), 38 | "slot_amount": 1, 39 | "text": "Dave the Dev 40 | Thanks to your support, we've surpassed 1,500 subscribers!", 41 | "type": "line" 42 | }, 43 | 3: { 44 | "graph_offset": Vector2( 280, 460 ), 45 | "links": { 46 | 0: 4 47 | }, 48 | "rect_size": Vector2( 324, 137 ), 49 | "slot_amount": 1, 50 | "text": "Dave the Dev 51 | Hit SUBSCRIBE and the BELL to come aboard and add your story to our growing game dev community.", 52 | "type": "line" 53 | }, 54 | 4: { 55 | "graph_offset": Vector2( 800, 100 ), 56 | "links": { 57 | 0: 5 58 | }, 59 | "rect_size": Vector2( 324, 137 ), 60 | "slot_amount": 1, 61 | "text": "Twitter-Kun 62 | Keep up with David's dev logs on Twitter: twitter.com/EXP_Worlds", 63 | "type": "line" 64 | }, 65 | 5: { 66 | "graph_offset": Vector2( 880, 280 ), 67 | "links": { 68 | 0: 6 69 | }, 70 | "rect_size": Vector2( 324, 137 ), 71 | "slot_amount": 1, 72 | "text": "Insta-Chan 73 | Follow David's life through Japan on Instagram: instagram.com/expworlds/", 74 | "type": "line" 75 | }, 76 | 6: { 77 | "graph_offset": Vector2( 960, 460 ), 78 | "links": { 79 | 80 | }, 81 | "rect_size": Vector2( 324, 137 ), 82 | "slot_amount": 1, 83 | "text": "", 84 | "type": "line" 85 | } 86 | } 87 | }, 88 | 2: { 89 | "available_nid": [ ], 90 | "groups": [ ], 91 | "human_readable_description": "This is a test of the variable injection.", 92 | "name": "DialogPlayer/VariableInjection", 93 | "nodes": { 94 | 1: { 95 | "graph_offset": Vector2( 40, 40 ), 96 | "links": { 97 | 0: 3 98 | }, 99 | "rect_size": Vector2( 324, 137 ), 100 | "slot_amount": 1, 101 | "text": "", 102 | "type": "line" 103 | }, 104 | 2: { 105 | "graph_offset": Vector2( 700, 520 ), 106 | "links": { 107 | 108 | }, 109 | "rect_size": Vector2( 324, 137 ), 110 | "slot_amount": 1, 111 | "text": "", 112 | "type": "line" 113 | }, 114 | 3: { 115 | "graph_offset": Vector2( 40, 220 ), 116 | "links": { 117 | 0: 4 118 | }, 119 | "rect_size": Vector2( 324, 137 ), 120 | "slot_amount": 1, 121 | "text": "DaveTheDev 122 | Hello, if variable injection is working Test text string will show up here.", 123 | "type": "line" 124 | }, 125 | 4: { 126 | "graph_offset": Vector2( 40, 400 ), 127 | "links": { 128 | 0: 5 129 | }, 130 | "rect_size": Vector2( 324, 137 ), 131 | "slot_amount": 1, 132 | "text": "Program 133 | Because of variable injection I know the player's level is PLAYER/LEVEL and that PI equals PI.", 134 | "type": "line" 135 | }, 136 | 5: { 137 | "graph_offset": Vector2( 620, 40 ), 138 | "links": { 139 | 0: 6 140 | }, 141 | "rect_size": Vector2( 324, 137 ), 142 | "slot_amount": 1, 143 | "text": "Program 144 | The current date and time is... DATE.", 145 | "type": "line" 146 | }, 147 | 6: { 148 | "graph_offset": Vector2( 620, 240 ), 149 | "links": { 150 | 0: 2 151 | }, 152 | "rect_size": Vector2( 324, 137 ), 153 | "slot_amount": 1, 154 | "text": "Program 155 | and I know the system I'm running on is SYSTEM.", 156 | "type": "line" 157 | } 158 | } 159 | }, 160 | 3: { 161 | "available_nid": [ ], 162 | "groups": [ ], 163 | "human_readable_description": "This is a test of choice branching.", 164 | "name": "DialogPlayer/ChoiceBranching", 165 | "nodes": { 166 | 1: { 167 | "graph_offset": Vector2( 40, 40 ), 168 | "links": { 169 | 0: 3 170 | }, 171 | "rect_size": Vector2( 324, 137 ), 172 | "slot_amount": 1, 173 | "text": "", 174 | "type": "line" 175 | }, 176 | 2: { 177 | "graph_offset": Vector2( 1040, 260 ), 178 | "links": { 179 | 180 | }, 181 | "rect_size": Vector2( 324, 137 ), 182 | "slot_amount": 1, 183 | "text": "", 184 | "type": "line" 185 | }, 186 | 3: { 187 | "graph_offset": Vector2( 40, 300 ), 188 | "links": { 189 | 0: 4, 190 | 1: 5, 191 | 2: 6 192 | }, 193 | "rect_size": Vector2( 324, 137 ), 194 | "slot_amount": 3, 195 | "text": "Wizard 196 | You must choose one of the three potions. 197 | {\"Red Potion\" : 0, \"Blue Potion\" : 1, \"Green Potion\" : 2}", 198 | "type": "line" 199 | }, 200 | 4: { 201 | "graph_offset": Vector2( 520, 60 ), 202 | "links": { 203 | 0: 7 204 | }, 205 | "rect_size": Vector2( 324, 137 ), 206 | "slot_amount": 1, 207 | "text": "Red Potion 208 | HA HA For drinking me, the Romantic Red Potion, everyone will fall in love with you, but you can never love again!", 209 | "type": "line" 210 | }, 211 | 5: { 212 | "graph_offset": Vector2( 520, 240 ), 213 | "links": { 214 | 0: 7 215 | }, 216 | "rect_size": Vector2( 324, 137 ), 217 | "slot_amount": 1, 218 | "text": "Blue Potion 219 | HA HA For drinking me, the Beluga Blue Potion, you are granted the gift of water breathing, but water blinds your eyes!", 220 | "type": "line" 221 | }, 222 | 6: { 223 | "graph_offset": Vector2( 520, 420 ), 224 | "links": { 225 | 0: 7 226 | }, 227 | "rect_size": Vector2( 324, 137 ), 228 | "slot_amount": 1, 229 | "text": "Green Potion 230 | HA HA For drinking me, the Greedy Green Potion, you have all the money in the world, but can only buy things that start with the letter Y!", 231 | "type": "line" 232 | }, 233 | 7: { 234 | "graph_offset": Vector2( 1020, 60 ), 235 | "links": { 236 | 0: 2 237 | }, 238 | "rect_size": Vector2( 324, 137 ), 239 | "slot_amount": 1, 240 | "text": "Wizard 241 | Well, it could be worse, you're not dead after all...", 242 | "type": "line" 243 | } 244 | } 245 | }, 246 | 4: { 247 | "available_nid": [ ], 248 | "groups": [ ], 249 | "human_readable_description": "A list of texture filepaths.", 250 | "name": "DialogPlayer/TextureLibrary", 251 | "nodes": { 252 | 1: { 253 | "graph_offset": Vector2( 40, 40 ), 254 | "links": { 255 | 256 | }, 257 | "rect_size": Vector2( 324, 137 ), 258 | "slot_amount": 1, 259 | "text": "{ 260 | \"emi\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/emi.png\", 261 | \"haruko\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/haruko.png\", 262 | \"mrpettles\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/mrpettles.png\", 263 | \"nez\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/nez.png\", 264 | \"shin\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/shin.png\" 265 | }", 266 | "type": "line" 267 | } 268 | } 269 | }, 270 | 5: { 271 | "available_nid": [ ], 272 | "groups": [ ], 273 | "human_readable_description": "This is a test of the character textures.", 274 | "name": "DialogPlayer/CharacterTextures", 275 | "nodes": { 276 | 1: { 277 | "graph_offset": Vector2( 40, 40 ), 278 | "links": { 279 | 0: 3 280 | }, 281 | "rect_size": Vector2( 324, 137 ), 282 | "slot_amount": 1, 283 | "text": "", 284 | "type": "line" 285 | }, 286 | 2: { 287 | "graph_offset": Vector2( 1020, 760 ), 288 | "links": { 289 | 290 | }, 291 | "rect_size": Vector2( 324, 137 ), 292 | "slot_amount": 1, 293 | "text": "", 294 | "type": "line" 295 | }, 296 | 3: { 297 | "graph_offset": Vector2( 540, 40 ), 298 | "links": { 299 | 0: 4 300 | }, 301 | "rect_size": Vector2( 324, 137 ), 302 | "slot_amount": 1, 303 | "text": "Emi-chan 304 | Hey everyone! Let's have a Sea Day party! 305 | emi", 306 | "type": "line" 307 | }, 308 | 4: { 309 | "graph_offset": Vector2( 1020, 40 ), 310 | "links": { 311 | 0: 5 312 | }, 313 | "rect_size": Vector2( 324, 137 ), 314 | "slot_amount": 1, 315 | "text": "Haruko-chan 316 | Mr. Pettles, what is a Sea Day? 317 | haruko", 318 | "type": "line" 319 | }, 320 | 5: { 321 | "graph_offset": Vector2( 40, 220 ), 322 | "links": { 323 | 0: 6 324 | }, 325 | "rect_size": Vector2( 324, 137 ), 326 | "slot_amount": 1, 327 | "text": "Mr. Pettles 328 | I'm glad you asked Haruko-chan. There are, of course, no dumb questions. 329 | mrpettles", 330 | "type": "line" 331 | }, 332 | 6: { 333 | "graph_offset": Vector2( 540, 220 ), 334 | "links": { 335 | 0: 7 336 | }, 337 | "rect_size": Vector2( 324, 137 ), 338 | "slot_amount": 1, 339 | "text": "Nez-chan 340 | Wait Mr. Pettles! I know about Sea Day, let me explain it. 341 | nez", 342 | "type": "line" 343 | }, 344 | 7: { 345 | "graph_offset": Vector2( 1020, 220 ), 346 | "links": { 347 | 0: 8 348 | }, 349 | "rect_size": Vector2( 324, 137 ), 350 | "slot_amount": 1, 351 | "text": "Mr. Pettles 352 | Well, I suppose Nez-chan, go ahead... 353 | mrpettles", 354 | "type": "line" 355 | }, 356 | 8: { 357 | "graph_offset": Vector2( 40, 400 ), 358 | "links": { 359 | 0: 9 360 | }, 361 | "rect_size": Vector2( 324, 137 ), 362 | "slot_amount": 1, 363 | "text": "Nez-chan 364 | Sea Day is a Japanese holiday on July 23rd. 365 | nez", 366 | "type": "line" 367 | }, 368 | 9: { 369 | "graph_offset": Vector2( 540, 400 ), 370 | "links": { 371 | 0: 10 372 | }, 373 | "rect_size": Vector2( 324, 137 ), 374 | "slot_amount": 1, 375 | "text": "Nez-chan 376 | We all go to the beach and smack Suika with a stick. 377 | nez", 378 | "type": "line" 379 | }, 380 | 10: { 381 | "graph_offset": Vector2( 1020, 400 ), 382 | "links": { 383 | 0: 11 384 | }, 385 | "rect_size": Vector2( 324, 137 ), 386 | "slot_amount": 1, 387 | "text": "Shin-kun 388 | Wait! Suika, what'za Suika? 389 | shin", 390 | "type": "line" 391 | }, 392 | 11: { 393 | "graph_offset": Vector2( 40, 580 ), 394 | "links": { 395 | 0: 12 396 | }, 397 | "rect_size": Vector2( 324, 137 ), 398 | "slot_amount": 1, 399 | "text": "Nez-chan 400 | Suika means watermelon in Japanese. 401 | nez", 402 | "type": "line" 403 | }, 404 | 12: { 405 | "graph_offset": Vector2( 540, 580 ), 406 | "links": { 407 | 0: 13 408 | }, 409 | "rect_size": Vector2( 324, 137 ), 410 | "slot_amount": 1, 411 | "text": "Shin-kun 412 | Oh, that'za relief! I was worried it was my head! 413 | shin", 414 | "type": "line" 415 | }, 416 | 13: { 417 | "graph_offset": Vector2( 1020, 580 ), 418 | "links": { 419 | 0: 2 420 | }, 421 | "rect_size": Vector2( 324, 137 ), 422 | "slot_amount": 1, 423 | "text": "Haruko-chan 424 | We can whack your head too while we're at it! 425 | haruko", 426 | "type": "line" 427 | } 428 | } 429 | } 430 | } 431 | available_dids = [ ] 432 | groups = [ ] 433 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/stories/Example_Story_Baked.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | TYPE = "EXP_Baked_Story" 8 | story = { 9 | 1: { 10 | "nodes": { 11 | 1: { 12 | "links": { 13 | 0: 2 14 | }, 15 | "text": "" 16 | }, 17 | 2: { 18 | "links": { 19 | 0: 3 20 | }, 21 | "text": "Dave the Dev 22 | Thanks to your support, we've surpassed 1,500 subscribers!" 23 | }, 24 | 3: { 25 | "links": { 26 | 0: 4 27 | }, 28 | "text": "Dave the Dev 29 | Hit SUBSCRIBE and the BELL to come aboard and add your story to our growing game dev community." 30 | }, 31 | 4: { 32 | "links": { 33 | 0: 5 34 | }, 35 | "text": "Twitter-Kun 36 | Keep up with David's dev logs on Twitter: twitter.com/EXP_Worlds" 37 | }, 38 | 5: { 39 | "links": { 40 | 0: 6 41 | }, 42 | "text": "Insta-Chan 43 | Follow David's life through Japan on Instagram: instagram.com/expworlds/" 44 | }, 45 | 6: { 46 | "links": { 47 | 48 | }, 49 | "text": "" 50 | } 51 | } 52 | }, 53 | 2: { 54 | "nodes": { 55 | 1: { 56 | "links": { 57 | 0: 3 58 | }, 59 | "text": "" 60 | }, 61 | 2: { 62 | "links": { 63 | 64 | }, 65 | "text": "" 66 | }, 67 | 3: { 68 | "links": { 69 | 0: 4 70 | }, 71 | "text": "DaveTheDev 72 | Hello, if variable injection is working Test text string will show up here." 73 | }, 74 | 4: { 75 | "links": { 76 | 0: 5 77 | }, 78 | "text": "Program 79 | Because of variable injection I know the player's level is PLAYER/LEVEL and that PI equals PI." 80 | }, 81 | 5: { 82 | "links": { 83 | 0: 6 84 | }, 85 | "text": "Program 86 | The current date and time is... DATE." 87 | }, 88 | 6: { 89 | "links": { 90 | 0: 2 91 | }, 92 | "text": "Program 93 | and I know the system I'm running on is SYSTEM." 94 | } 95 | } 96 | }, 97 | 3: { 98 | "nodes": { 99 | 1: { 100 | "links": { 101 | 0: 3 102 | }, 103 | "text": "" 104 | }, 105 | 2: { 106 | "links": { 107 | 108 | }, 109 | "text": "" 110 | }, 111 | 3: { 112 | "links": { 113 | 0: 4, 114 | 1: 5, 115 | 2: 6 116 | }, 117 | "text": "Wizard 118 | You must choose one of the three potions. 119 | {\"Red Potion\" : 0, \"Blue Potion\" : 1, \"Green Potion\" : 2}" 120 | }, 121 | 4: { 122 | "links": { 123 | 0: 7 124 | }, 125 | "text": "Red Potion 126 | HA HA For drinking me, the Romantic Red Potion, everyone will fall in love with you, but you can never love again!" 127 | }, 128 | 5: { 129 | "links": { 130 | 0: 7 131 | }, 132 | "text": "Blue Potion 133 | HA HA For drinking me, the Beluga Blue Potion, you are granted the gift of water breathing, but water blinds your eyes!" 134 | }, 135 | 6: { 136 | "links": { 137 | 0: 7 138 | }, 139 | "text": "Green Potion 140 | HA HA For drinking me, the Greedy Green Potion, you have all the money in the world, but can only buy things that start with the letter Y!" 141 | }, 142 | 7: { 143 | "links": { 144 | 0: 2 145 | }, 146 | "text": "Wizard 147 | Well, it could be worse, you're not dead after all..." 148 | } 149 | } 150 | }, 151 | 4: { 152 | "nodes": { 153 | 1: { 154 | "links": { 155 | 156 | }, 157 | "text": "{ 158 | \"emi\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/emi.png\", 159 | \"haruko\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/haruko.png\", 160 | \"mrpettles\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/mrpettles.png\", 161 | \"nez\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/nez.png\", 162 | \"shin\" : \"res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/shin.png\" 163 | }" 164 | } 165 | } 166 | }, 167 | 5: { 168 | "nodes": { 169 | 1: { 170 | "links": { 171 | 0: 3 172 | }, 173 | "text": "" 174 | }, 175 | 2: { 176 | "links": { 177 | 178 | }, 179 | "text": "" 180 | }, 181 | 3: { 182 | "links": { 183 | 0: 4 184 | }, 185 | "text": "Emi-chan 186 | Hey everyone! Let's have a Sea Day party! 187 | emi" 188 | }, 189 | 4: { 190 | "links": { 191 | 0: 5 192 | }, 193 | "text": "Haruko-chan 194 | Mr. Pettles, what is a Sea Day? 195 | haruko" 196 | }, 197 | 5: { 198 | "links": { 199 | 0: 6 200 | }, 201 | "text": "Mr. Pettles 202 | I'm glad you asked Haruko-chan. There are, of course, no dumb questions. 203 | mrpettles" 204 | }, 205 | 6: { 206 | "links": { 207 | 0: 7 208 | }, 209 | "text": "Nez-chan 210 | Wait Mr. Pettles! I know about Sea Day, let me explain it. 211 | nez" 212 | }, 213 | 7: { 214 | "links": { 215 | 0: 8 216 | }, 217 | "text": "Mr. Pettles 218 | Well, I suppose Nez-chan, go ahead... 219 | mrpettles" 220 | }, 221 | 8: { 222 | "links": { 223 | 0: 9 224 | }, 225 | "text": "Nez-chan 226 | Sea Day is a Japanese holiday on July 23rd. 227 | nez" 228 | }, 229 | 9: { 230 | "links": { 231 | 0: 10 232 | }, 233 | "text": "Nez-chan 234 | We all go to the beach and smack Suika with a stick. 235 | nez" 236 | }, 237 | 10: { 238 | "links": { 239 | 0: 11 240 | }, 241 | "text": "Shin-kun 242 | Wait! Suika, what'za Suika? 243 | shin" 244 | }, 245 | 11: { 246 | "links": { 247 | 0: 12 248 | }, 249 | "text": "Nez-chan 250 | Suika means watermelon in Japanese. 251 | nez" 252 | }, 253 | 12: { 254 | "links": { 255 | 0: 13 256 | }, 257 | "text": "Shin-kun 258 | Oh, that'za relief! I was worried it was my head! 259 | shin" 260 | }, 261 | 13: { 262 | "links": { 263 | 0: 2 264 | }, 265 | "text": "Haruko-chan 266 | We can whack your head too while we're at it! 267 | haruko" 268 | } 269 | } 270 | } 271 | } 272 | names = { 273 | "DialogPlayer/CharacterTextures": 5, 274 | "DialogPlayer/ChoiceBranching": 3, 275 | "DialogPlayer/Test": 1, 276 | "DialogPlayer/TextureLibrary": 4, 277 | "DialogPlayer/VariableInjection": 2 278 | } 279 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/emi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/textures/characters/emi.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/emi.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/emi.png-710523dc0b7bed90fc780fb4a5d054bd.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/emi.png" 13 | dest_files=[ "res://.import/emi.png-710523dc0b7bed90fc780fb4a5d054bd.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/haruko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/textures/characters/haruko.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/haruko.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/haruko.png-4236366947866004571e0504cf9c9a17.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/haruko.png" 13 | dest_files=[ "res://.import/haruko.png-4236366947866004571e0504cf9c9a17.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/mrpettles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/textures/characters/mrpettles.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/mrpettles.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/mrpettles.png-ece8e5408accb59ed2019d4982c2f810.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/mrpettles.png" 13 | dest_files=[ "res://.import/mrpettles.png-ece8e5408accb59ed2019d4982c2f810.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/nez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/textures/characters/nez.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/nez.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/nez.png-408eabf044dce7aea58c0468b8748ac5.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/nez.png" 13 | dest_files=[ "res://.import/nez.png-408eabf044dce7aea58c0468b8748ac5.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/shin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/textures/characters/shin.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/characters/shin.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/shin.png-9e08999409102ff64c9fd35789a6940d.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/12 Dialog Player/textures/characters/shin.png" 13 | dest_files=[ "res://.import/shin.png-9e08999409102ff64c9fd35789a6940d.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/menu_section_9patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/12 Dialog Player/textures/menu_section_9patch.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/12 Dialog Player/textures/menu_section_9patch.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/menu_section_9patch.png-85388ad03f2d82951131599ff28e5f54.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/12 Dialog Player/textures/menu_section_9patch.png" 13 | dest_files=[ "res://.import/menu_section_9patch.png-85388ad03f2d82951131599ff28e5f54.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Falcon9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Falcon9.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Falcon9.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/Falcon9.png-35931e8709ca22a8b9bbee97a3734c5f.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Falcon9.png" 13 | dest_files=[ "res://.import/Falcon9.png-35931e8709ca22a8b9bbee97a3734c5f.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Fire.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [sub_resource type="ShaderMaterial" id=1] 4 | 5 | [sub_resource type="Gradient" id=2] 6 | offsets = PoolRealArray( 0, 0.22963, 0.459259, 1 ) 7 | colors = PoolColorArray( 1, 1, 1, 0.92549, 0.984314, 0.882353, 0.0392157, 0.882353, 0.858824, 0.533333, 0.0705882, 0.854902, 1, 0.0941176, 0, 0.129412 ) 8 | 9 | [sub_resource type="GradientTexture" id=3] 10 | gradient = SubResource( 2 ) 11 | 12 | [sub_resource type="ParticlesMaterial" id=4] 13 | emission_shape = 1 14 | emission_sphere_radius = 7.37 15 | flag_disable_z = true 16 | gravity = Vector3( 0, -98, 0 ) 17 | angular_velocity = 198.65 18 | angular_velocity_random = 0.18 19 | orbit_velocity = 0.0 20 | orbit_velocity_random = 0.0 21 | linear_accel = 6.9 22 | damping = 6.3 23 | angle = 45.0 24 | angle_random = 1.0 25 | scale = 12.49 26 | color_ramp = SubResource( 3 ) 27 | 28 | [node name="Fire" type="Particles2D"] 29 | material = SubResource( 1 ) 30 | position = Vector2( 360, 360 ) 31 | amount = 100 32 | lifetime = 1.5 33 | process_material = SubResource( 4 ) 34 | 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Game.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | onready var Falcon9 = self.get_node("Falcon9") 4 | onready var Info = self.get_node("Label") 5 | 6 | 7 | export(float, 0, 1, 0.001) var landedness 8 | export(Curve) var landing_curve 9 | var curve_output 10 | var height 11 | 12 | var is_auto_landing = false 13 | var auto_landing_speed = 0.01 14 | 15 | 16 | func _process(delta): 17 | if is_auto_landing: 18 | self.handle_auto_landing() 19 | 20 | self.curve_output = self.landing_curve.interpolate(self.landedness) 21 | 22 | 23 | self.height = self.curve_output * 426 + 146 24 | 25 | 26 | self.Falcon9.position.y = self.height 27 | 28 | 29 | self.update_info_label() 30 | 31 | 32 | func update_info_label(): 33 | var new_text = "Landedness: " + str(self.landedness) + "\n" 34 | new_text += "Curve Output: " + str(self.curve_output) + "\n" 35 | new_text += "Height: " + str(572 - self.height) 36 | self.Info.text = new_text 37 | 38 | 39 | func handle_auto_landing(): 40 | self.landedness += self.auto_landing_speed 41 | if self.landedness >= 1.0: 42 | self.landedness = 1.0 43 | self.is_auto_landing = false 44 | 45 | 46 | func _on_Button_pressed(): 47 | self.is_auto_landing = true 48 | self.landedness = 0.0 49 | 50 | 51 | func _on_Reset_Button_pressed(): 52 | self.landedness = 0.0 53 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=10 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Game.gd" type="Script" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/landing_curve.tres" type="Curve" id=2] 5 | [ext_resource path="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Sky.jpg" type="Texture" id=3] 6 | [ext_resource path="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Falcon9.png" type="Texture" id=4] 7 | [ext_resource path="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Fire.tscn" type="PackedScene" id=5] 8 | [ext_resource path="res://Fonts/FreeUniversal-Regular.ttf" type="DynamicFontData" id=6] 9 | 10 | 11 | [sub_resource type="DynamicFont" id=1] 12 | size = 46 13 | font_data = ExtResource( 6 ) 14 | 15 | [sub_resource type="DynamicFont" id=2] 16 | size = 48 17 | font_data = ExtResource( 6 ) 18 | 19 | [sub_resource type="DynamicFont" id=3] 20 | size = 48 21 | font_data = ExtResource( 6 ) 22 | 23 | [node name="Game" type="Control"] 24 | anchor_right = 1.0 25 | anchor_bottom = 1.0 26 | script = ExtResource( 1 ) 27 | __meta__ = { 28 | "_edit_use_anchors_": false 29 | } 30 | landing_curve = ExtResource( 2 ) 31 | 32 | [node name="Sky" type="Sprite" parent="."] 33 | modulate = Color( 0.980392, 0.980392, 0.980392, 1 ) 34 | position = Vector2( 505.217, 379.44 ) 35 | scale = Vector2( 0.94, 0.66 ) 36 | texture = ExtResource( 3 ) 37 | 38 | [node name="Falcon9" type="Sprite" parent="."] 39 | position = Vector2( 214.42, 146 ) 40 | scale = Vector2( 0.5, 0.5 ) 41 | texture = ExtResource( 4 ) 42 | 43 | [node name="Fire" parent="Falcon9" instance=ExtResource( 5 )] 44 | show_behind_parent = true 45 | position = Vector2( -2.33154, 243.119 ) 46 | rotation = 3.14159 47 | 48 | [node name="Ground" type="ColorRect" parent="."] 49 | margin_left = 108.83 50 | margin_top = 710.0 51 | margin_right = 308.83 52 | margin_bottom = 760.0 53 | color = Color( 0, 0, 0, 1 ) 54 | __meta__ = { 55 | "_edit_use_anchors_": false 56 | } 57 | 58 | [node name="Label" type="Label" parent="."] 59 | margin_left = 418.995 60 | margin_top = 102.028 61 | margin_right = 498.995 62 | margin_bottom = 162.028 63 | custom_fonts/font = SubResource( 1 ) 64 | custom_colors/font_color = Color( 0, 0, 0, 1 ) 65 | custom_colors/font_outline_modulate = Color( 1, 1, 1, 1 ) 66 | custom_colors/font_color_shadow = Color( 1, 1, 1, 1 ) 67 | text = "Info" 68 | 69 | [node name="Land_Button" type="Button" parent="."] 70 | margin_left = 418.824 71 | margin_top = 33.1163 72 | margin_right = 652.824 73 | margin_bottom = 99.1163 74 | custom_fonts/font = SubResource( 2 ) 75 | text = "Auto Land" 76 | __meta__ = { 77 | "_edit_use_anchors_": false 78 | } 79 | 80 | [node name="Reset_Button" type="Button" parent="."] 81 | margin_left = 669.552 82 | margin_top = 33.0 83 | margin_right = 813.552 84 | margin_bottom = 102.0 85 | custom_fonts/font = SubResource( 3 ) 86 | text = "Reset" 87 | __meta__ = { 88 | "_edit_use_anchors_": false 89 | } 90 | [connection signal="pressed" from="Land_Button" to="." method="_on_Button_pressed"] 91 | [connection signal="pressed" from="Reset_Button" to="." method="_on_Reset_Button_pressed"] 92 | 93 | [editable path="Falcon9/Fire"] 94 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Sky.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Sky.jpg -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Sky.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/Sky.jpg-af0c87494e19f0a353774805622cd894.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/Sky.jpg" 13 | dest_files=[ "res://.import/Sky.jpg-af0c87494e19f0a353774805622cd894.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/6 Make better games using Curves in Godot/Demo/landing_curve.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Curve" format=2] 2 | 3 | [resource] 4 | _data = [ Vector2( 0, 0 ), 0.0, 1.4, 0, 0, Vector2( 0.647274, 0.984 ), 0.599765, 0.599765, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ] 5 | 6 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Cursor.tscn" type="PackedScene" id=1] 4 | 5 | 6 | [node name="Game" type="Node"] 7 | 8 | [node name="Mouse_Cursor" parent="." instance=ExtResource( 1 )] 9 | 10 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser24px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser24px.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser24px.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/Mouse_Curser24px.png-6a4624858b74405482d43016ad3964c7.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser24px.png" 13 | dest_files=[ "res://.import/Mouse_Curser24px.png-6a4624858b74405482d43016ad3964c7.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser64px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser64px.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser64px.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/Mouse_Curser64px.png-49bc6f7cf9904165e1d77a945a950a2c.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Curser64px.png" 13 | dest_files=[ "res://.import/Mouse_Curser64px.png-49bc6f7cf9904165e1d77a945a950a2c.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Cursor.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | onready var white_cursor = preload("res://7 Custom Mouse Cursors/Demo/white_sigil_icon.png") 4 | onready var black_cursor = preload("res://7 Custom Mouse Cursors/Demo/black_sigil_icon.png") 5 | onready var Icon = self.get_node("Icon") 6 | 7 | func _ready(): 8 | Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) 9 | 10 | func _process(delta): 11 | self.position = self.get_global_mouse_position() 12 | 13 | if self.position.x > 520: 14 | self.Icon.texture = black_cursor 15 | else: 16 | self.Icon.texture = white_cursor -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Cursor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/Mouse_Cursor.gd" type="Script" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/black_sigil_icon.png" type="Texture" id=2] 5 | 6 | 7 | 8 | 9 | [node name="Mouse_Cursor" type="Node2D"] 10 | script = ExtResource( 1 ) 11 | 12 | [node name="Icon" type="Sprite" parent="."] 13 | texture = ExtResource( 2 ) 14 | 15 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/black_sigil_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/black_sigil_icon.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/black_sigil_icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/black_sigil_icon.png-fad190d3e6d85ec07401392361620f6e.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/black_sigil_icon.png" 13 | dest_files=[ "res://.import/black_sigil_icon.png-fad190d3e6d85ec07401392361620f6e.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/white_sigil_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/white_sigil_icon.png -------------------------------------------------------------------------------- /DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/white_sigil_icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/white_sigil_icon.png-0af1c05b7f7e534ede3406b81ce3e5cf.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://DaveTheDev Tutorials/7 Custom Mouse Cursors/Demo/white_sigil_icon.png" 13 | dest_files=[ "res://.import/white_sigil_icon.png-0af1c05b7f7e534ede3406b81ce3e5cf.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Demo/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/8 Clicking 3D Objects/Demo/Sphere.tscn" type="PackedScene" id=1] 4 | 5 | 6 | [sub_resource type="SpatialMaterial" id=1] 7 | flags_unshaded = true 8 | params_cull_mode = 1 9 | params_grow = true 10 | params_grow_amount = 0.02 11 | albedo_color = Color( 0, 0, 0, 1 ) 12 | 13 | [sub_resource type="SpatialMaterial" id=2] 14 | next_pass = SubResource( 1 ) 15 | params_diffuse_mode = 4 16 | roughness = 0.06 17 | 18 | [sub_resource type="SpatialMaterial" id=3] 19 | next_pass = SubResource( 1 ) 20 | params_diffuse_mode = 4 21 | roughness = 0.06 22 | 23 | [sub_resource type="SpatialMaterial" id=4] 24 | next_pass = SubResource( 1 ) 25 | params_diffuse_mode = 4 26 | roughness = 0.06 27 | 28 | [node name="Game" type="Spatial"] 29 | 30 | [node name="DirectionalLight" type="DirectionalLight" parent="."] 31 | transform = Transform( 0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 3, 3, 3 ) 32 | 33 | [node name="Camera" type="Camera" parent="."] 34 | transform = Transform( 1, 0, 0, 0, 0.819152, 0.573577, 0, -0.573577, 0.819152, 0, 1.30327, 2.21711 ) 35 | 36 | [node name="Sphere" parent="." instance=ExtResource( 1 )] 37 | editor/display_folded = true 38 | 39 | [node name="Mesh_Sphere" parent="Sphere" index="0"] 40 | material/0 = SubResource( 2 ) 41 | 42 | [node name="Sphere2" parent="." instance=ExtResource( 1 )] 43 | editor/display_folded = true 44 | transform = Transform( -0.5, 0, 0.866025, 0, 1, 0, -0.866025, 0, -0.5, 0, 0, 0 ) 45 | 46 | [node name="Mesh_Sphere" parent="Sphere2" index="0"] 47 | material/0 = SubResource( 3 ) 48 | 49 | [node name="Sphere3" parent="." instance=ExtResource( 1 )] 50 | editor/display_folded = true 51 | transform = Transform( -0.5, 0, -0.866025, 0, 1, 0, 0.866025, 0, -0.5, 0, 0, 0 ) 52 | 53 | [node name="Mesh_Sphere" parent="Sphere3" index="0"] 54 | material/0 = SubResource( 4 ) 55 | 56 | 57 | [editable path="Sphere"] 58 | 59 | [editable path="Sphere2"] 60 | 61 | [editable path="Sphere3"] 62 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Demo/Sphere.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var Number_Generator = RandomNumberGenerator.new() 4 | var rotation_speed = PI / 2.0 5 | 6 | 7 | func _process(delta): 8 | self.rotate_y(self.rotation_speed * delta) 9 | 10 | 11 | func _on_Area_input_event(camera, event, click_position, click_normal, shape_idx): 12 | if event is InputEventMouseButton: 13 | if event.button_index == BUTTON_LEFT and event.pressed == true: 14 | self.randomize_color() 15 | 16 | 17 | func randomize_color(): 18 | self.Number_Generator.randomize() 19 | var new_red = self.Number_Generator.randf_range(0.0, 1.0) 20 | self.Number_Generator.randomize() 21 | var new_green = self.Number_Generator.randf_range(0.0, 1.0) 22 | self.Number_Generator.randomize() 23 | var new_blue = self.Number_Generator.randf_range(0.0, 1.0) 24 | var new_color = Vector3(new_red, new_green, new_blue).normalized() 25 | var this_material = self.get_node("Mesh_Sphere").get_surface_material(0) 26 | this_material.albedo_color = Color(new_color.x, new_color.y, new_color.z, 1.0) -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Demo/Sphere.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/8 Clicking 3D Objects/Demo/Sphere.gd" type="Script" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/8 Clicking 3D Objects/Sphere.obj" type="ArrayMesh" id=2] 5 | 6 | 7 | 8 | [sub_resource type="SpatialMaterial" id=1] 9 | flags_unshaded = true 10 | params_cull_mode = 1 11 | params_grow = true 12 | params_grow_amount = 0.02 13 | albedo_color = Color( 0, 0, 0, 1 ) 14 | 15 | [sub_resource type="SpatialMaterial" id=2] 16 | next_pass = SubResource( 1 ) 17 | params_diffuse_mode = 4 18 | params_specular_mode = 4 19 | roughness = 0.05 20 | 21 | [sub_resource type="SphereShape" id=3] 22 | radius = 0.5 23 | 24 | [node name="Sphere" type="Spatial"] 25 | script = ExtResource( 1 ) 26 | 27 | [node name="Mesh_Sphere" type="MeshInstance" parent="."] 28 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 ) 29 | mesh = ExtResource( 2 ) 30 | material/0 = SubResource( 2 ) 31 | 32 | [node name="Area" type="Area" parent="Mesh_Sphere"] 33 | input_ray_pickable = true 34 | 35 | [node name="CollisionShape" type="CollisionShape" parent="Mesh_Sphere/Area"] 36 | shape = SubResource( 3 ) 37 | 38 | [connection signal="input_event" from="Mesh_Sphere/Area" to="." method="_on_Area_input_event"] 39 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Demo/Sphere_Origin.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var rotation_speed = PI / 2.0 4 | 5 | func _process(delta): 6 | self.rotate_y(self.rotation_speed * delta) -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Sphere.obj.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="wavefront_obj" 4 | type="Mesh" 5 | path="res://.import/Sphere.obj-0565b19d9e6991b9ec326571b838f6ed.mesh" 6 | 7 | [deps] 8 | 9 | files=[ "res://.import/Sphere.obj-0565b19d9e6991b9ec326571b838f6ed.mesh" ] 10 | 11 | source_file="res://DaveTheDev Tutorials/8 Clicking 3D Objects/Sphere.obj" 12 | dest_files=[ "res://.import/Sphere.obj-0565b19d9e6991b9ec326571b838f6ed.mesh", "res://.import/Sphere.obj-0565b19d9e6991b9ec326571b838f6ed.mesh" ] 13 | 14 | [params] 15 | 16 | generate_tangents=true 17 | scale_mesh=Vector3( 1, 1, 1 ) 18 | offset_mesh=Vector3( 0, 0, 0 ) 19 | optimize_mesh=true 20 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Tutorial/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/8 Clicking 3D Objects/Tutorial/Sphere.gd" type="Script" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/8 Clicking 3D Objects/Sphere.obj" type="ArrayMesh" id=2] 5 | 6 | 7 | [sub_resource type="SphereShape" id=1] 8 | radius = 0.5 9 | 10 | [node name="Game" type="Spatial"] 11 | 12 | [node name="DirectionalLight" type="DirectionalLight" parent="."] 13 | transform = Transform( 0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 3, 3, 3 ) 14 | 15 | [node name="Camera" type="Camera" parent="."] 16 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2.58749 ) 17 | 18 | [node name="Sphere" type="Spatial" parent="."] 19 | script = ExtResource( 1 ) 20 | 21 | [node name="Sphere" type="MeshInstance" parent="Sphere"] 22 | mesh = ExtResource( 2 ) 23 | material/0 = null 24 | 25 | [node name="Area" type="Area" parent="Sphere/Sphere"] 26 | input_ray_pickable = true 27 | 28 | [node name="CollisionShape" type="CollisionShape" parent="Sphere/Sphere/Area"] 29 | shape = SubResource( 1 ) 30 | 31 | [connection signal="input_event" from="Sphere/Sphere/Area" to="Sphere" method="_on_Area_input_event"] 32 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/8 Clicking 3D Objects/Tutorial/Sphere.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | func _on_Area_input_event(camera, event, click_position, click_normal, shape_idx): 5 | if event is InputEventMouseButton: 6 | if event.button_index == BUTTON_LEFT and event.pressed == true: 7 | print("Left Mouse Button Clicked") 8 | if event.button_index == BUTTON_LEFT and event.pressed == false: 9 | print("Left Mouse Button Released") 10 | if event.button_index == BUTTON_RIGHT and event.pressed == true: 11 | print("Right Mouse Button Clicked") 12 | if event.button_index == BUTTON_RIGHT and event.pressed == false: 13 | print("Right Mouse Button Released") 14 | if event.button_index == BUTTON_MIDDLE and event.pressed == true: 15 | print("Middle Mouse Button Clicked") 16 | if event.button_index == BUTTON_MIDDLE and event.pressed == false: 17 | print("Middle Mouse Button Released") 18 | if event.button_index == BUTTON_LEFT and event.doubleclick == true: 19 | print("Left Mouse Button Double Clicked") 20 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Demo/Game.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | onready var Sphere_Root = self.get_node("Sphere_Root") 4 | var Unit_Sphere = preload("res://9 Using Perlin Noise/Demo/Sphere.tscn") 5 | 6 | enum state {RANDOM, PERLIN} 7 | export(state) var current_state = state.PERLIN 8 | export(float) var amplitude = 10.0 9 | export(float) var speed = 0.2 10 | export(OpenSimplexNoise) var perlin_noise 11 | 12 | var time = 0.0 13 | 14 | func _ready(): 15 | for x in range(-20.0, 20.0, 1.0): 16 | for z in range(-20.0, 20.0, 1.0): 17 | var New_Sphere = Unit_Sphere.instance() 18 | self.Sphere_Root.add_child(New_Sphere) 19 | New_Sphere.translation = Vector3(x, 0.0, z) 20 | 21 | 22 | func _process(delta): 23 | time += speed 24 | 25 | var spheres = self.Sphere_Root.get_children() 26 | for sphere in spheres: 27 | 28 | match current_state: 29 | state.RANDOM: 30 | randomize() 31 | var random_value = (randf() * 2.0) - 1.0 32 | var vertical_offset = random_value * amplitude 33 | sphere.translation.y = vertical_offset 34 | sphere.update_color(random_value) 35 | 36 | state.PERLIN: 37 | var perlin_value = perlin_noise.get_noise_2d(sphere.translation.x + time, sphere.translation.z) 38 | var vertical_offset = perlin_value * amplitude 39 | sphere.translation.y = vertical_offset 40 | sphere.update_color(perlin_value) 41 | 42 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Demo/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/9 Using Perlin Noise/Demo/Game.gd" type="Script" id=1] 4 | 5 | 6 | [sub_resource type="OpenSimplexNoise" id=1] 7 | 8 | [node name="Game" type="Spatial"] 9 | script = ExtResource( 1 ) 10 | speed = 1.0 11 | perlin_noise = SubResource( 1 ) 12 | 13 | [node name="Camera" type="Camera" parent="."] 14 | transform = Transform( 1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, 0, 7, 25 ) 15 | 16 | [node name="Sphere_Root" type="Spatial" parent="."] 17 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Demo/Sphere.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | func update_color(perlin_value): 4 | var this_material = self.get_surface_material(0) 5 | if perlin_value < 0: 6 | this_material.albedo_color = Color(1.0, 1.0 + perlin_value, 1.0 + perlin_value, 1.0) 7 | else: 8 | this_material.albedo_color = Color(1.0 - perlin_value, 1.0, 1.0 - perlin_value, 1.0) 9 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Demo/Sphere.obj.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="wavefront_obj" 4 | type="Mesh" 5 | path="res://.import/Sphere.obj-db72b34bb63b8dea5ef5ed42310db4ae.mesh" 6 | 7 | [deps] 8 | 9 | files=[ "res://.import/Sphere.obj-db72b34bb63b8dea5ef5ed42310db4ae.mesh" ] 10 | 11 | source_file="res://DaveTheDev Tutorials/9 Using Perlin Noise/Demo/Sphere.obj" 12 | dest_files=[ "res://.import/Sphere.obj-db72b34bb63b8dea5ef5ed42310db4ae.mesh", "res://.import/Sphere.obj-db72b34bb63b8dea5ef5ed42310db4ae.mesh" ] 13 | 14 | [params] 15 | 16 | generate_tangents=true 17 | scale_mesh=Vector3( 1, 1, 1 ) 18 | offset_mesh=Vector3( 0, 0, 0 ) 19 | optimize_mesh=true 20 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Tutorial/Game.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | onready var Sphere : MeshInstance = self.get_node("Sphere") 4 | 5 | export(OpenSimplexNoise) var perlin_noise 6 | export(float) var amplitude = 5.0 7 | export(float) var speed = 0.2 8 | 9 | var time : float = 0.0 10 | 11 | func _process(delta) -> void: 12 | 13 | self.time += self.speed 14 | var perlin_value = self.perlin_noise.get_noise_2d(self.time, 0.0) 15 | self.Sphere.translation.y = perlin_value * amplitude -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Tutorial/Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://DaveTheDev Tutorials/9 Using Perlin Noise/Tutorial/Game.gd" type="Script" id=1] 4 | [ext_resource path="res://DaveTheDev Tutorials/9 Using Perlin Noise/Tutorial/Sphere.obj" type="ArrayMesh" id=2] 5 | 6 | 7 | [sub_resource type="OpenSimplexNoise" id=1] 8 | 9 | [sub_resource type="SpatialMaterial" id=2] 10 | flags_unshaded = true 11 | params_cull_mode = 1 12 | params_grow = true 13 | params_grow_amount = 0.03 14 | albedo_color = Color( 0, 0, 0, 1 ) 15 | 16 | [sub_resource type="SpatialMaterial" id=3] 17 | next_pass = SubResource( 2 ) 18 | flags_unshaded = true 19 | 20 | [node name="Game" type="Spatial"] 21 | script = ExtResource( 1 ) 22 | perlin_noise = SubResource( 1 ) 23 | 24 | [node name="Camera" type="Camera" parent="."] 25 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5 ) 26 | 27 | [node name="Sphere" type="MeshInstance" parent="."] 28 | mesh = ExtResource( 2 ) 29 | material/0 = SubResource( 3 ) 30 | 31 | -------------------------------------------------------------------------------- /DaveTheDev Tutorials/9 Using Perlin Noise/Tutorial/Sphere.obj.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="wavefront_obj" 4 | type="Mesh" 5 | path="res://.import/Sphere.obj-1d8be9aca9211d747868b17ccec12b2c.mesh" 6 | 7 | [deps] 8 | 9 | files=[ "res://.import/Sphere.obj-1d8be9aca9211d747868b17ccec12b2c.mesh" ] 10 | 11 | source_file="res://DaveTheDev Tutorials/9 Using Perlin Noise/Tutorial/Sphere.obj" 12 | dest_files=[ "res://.import/Sphere.obj-1d8be9aca9211d747868b17ccec12b2c.mesh", "res://.import/Sphere.obj-1d8be9aca9211d747868b17ccec12b2c.mesh" ] 13 | 14 | [params] 15 | 16 | generate_tangents=true 17 | scale_mesh=Vector3( 1, 1, 1 ) 18 | offset_mesh=Vector3( 0, 0, 0 ) 19 | optimize_mesh=true 20 | -------------------------------------------------------------------------------- /Fonts/FreeUniversal-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/Fonts/FreeUniversal-Regular.ttf -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 David E Lipps 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Miscellaneous Demos/(kedalovo) Clicking Objects through Viewports/Demo.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=9 format=2] 2 | 3 | [ext_resource path="res://Miscellaneous Demos/(kedalovo) Clicking Objects through Viewports/demo.gd" type="Script" id=1] 4 | [ext_resource path="res://Miscellaneous Demos/(kedalovo) Clicking Objects through Viewports/spatialroot.gd" type="Script" id=2] 5 | 6 | 7 | 8 | 9 | [sub_resource type="OpenSimplexNoise" id=1] 10 | 11 | [sub_resource type="NoiseTexture" id=2] 12 | width = 1080 13 | height = 768 14 | noise = SubResource( 1 ) 15 | 16 | [sub_resource type="ViewportTexture" id=3] 17 | viewport_path = NodePath("Spacial_Viewport") 18 | 19 | [sub_resource type="SphereShape" id=4] 20 | 21 | [sub_resource type="SphereMesh" id=5] 22 | 23 | [sub_resource type="SpatialMaterial" id=6] 24 | albedo_color = Color( 0.14902, 0.47451, 0.647059, 1 ) 25 | 26 | [node name="Demo_Node2D" type="Node2D"] 27 | script = ExtResource( 1 ) 28 | 29 | [node name="Background" type="TextureRect" parent="."] 30 | anchor_right = 1.0 31 | anchor_bottom = 1.0 32 | texture = SubResource( 2 ) 33 | __meta__ = { 34 | "_edit_use_anchors_": false 35 | } 36 | 37 | [node name="Viewport_TextureRect" type="TextureRect" parent="."] 38 | margin_left = 295.302 39 | margin_top = 171.666 40 | margin_right = 835.302 41 | margin_bottom = 555.666 42 | texture = SubResource( 3 ) 43 | expand = true 44 | flip_v = true 45 | __meta__ = { 46 | "_edit_use_anchors_": false 47 | } 48 | 49 | [node name="Spacial_Viewport" type="Viewport" parent="."] 50 | size = Vector2( 1080, 768 ) 51 | transparent_bg = true 52 | 53 | [node name="SpatialRoot" type="Spatial" parent="Spacial_Viewport"] 54 | script = ExtResource( 2 ) 55 | 56 | [node name="Camera" type="Camera" parent="Spacial_Viewport/SpatialRoot"] 57 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1 ) 58 | 59 | [node name="DirectionalLight" type="DirectionalLight" parent="Spacial_Viewport/SpatialRoot"] 60 | transform = Transform( 0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 3, 3, 3 ) 61 | 62 | [node name="Clickable_Object_Area" type="Area" parent="Spacial_Viewport/SpatialRoot"] 63 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2 ) 64 | 65 | [node name="Sphere_CollisionShape" type="CollisionShape" parent="Spacial_Viewport/SpatialRoot/Clickable_Object_Area"] 66 | shape = SubResource( 4 ) 67 | 68 | [node name="Sphere_MeshInstance" type="MeshInstance" parent="Spacial_Viewport/SpatialRoot/Clickable_Object_Area"] 69 | mesh = SubResource( 5 ) 70 | material/0 = SubResource( 6 ) 71 | [connection signal="gui_input" from="Viewport_TextureRect" to="." method="_on_Viewport_TextureRect_gui_input"] 72 | -------------------------------------------------------------------------------- /Miscellaneous Demos/(kedalovo) Clicking Objects through Viewports/demo.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | onready var _TextureRect = self.find_node("Viewport_TextureRect") 4 | onready var _Spacial_Viewport = self.find_node("Spacial_Viewport") 5 | 6 | func _on_Viewport_TextureRect_gui_input(event): 7 | if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.is_pressed(): 8 | 9 | var texture_position = event.position 10 | var normalized_position = texture_position / self._TextureRect.rect_size 11 | var spacial_viewport_position = normalized_position * self._Spacial_Viewport.size 12 | 13 | var new_event = InputEventMouseButton.new() 14 | new_event.button_index = BUTTON_LEFT 15 | new_event.pressed = true 16 | new_event.position = spacial_viewport_position 17 | 18 | self._Spacial_Viewport.input(new_event) 19 | -------------------------------------------------------------------------------- /Miscellaneous Demos/(kedalovo) Clicking Objects through Viewports/spatialroot.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | onready var _Camera = self.find_node("Camera") 4 | onready var _Clickable_Object = self.find_node("Clickable_Object_Area") 5 | onready var _clickable_object_material = self.find_node("Sphere_MeshInstance").get_surface_material(0) 6 | 7 | const ray_length = 1000 8 | 9 | var from : Vector3 10 | var to : Vector3 11 | var input_captured = false 12 | 13 | func _input(event): 14 | if event is InputEventMouseButton and event.is_pressed() and event.button_index == BUTTON_LEFT: 15 | 16 | from = self._Camera.project_ray_origin(event.position) 17 | to = from + self._Camera.project_ray_normal(event.position) * ray_length 18 | input_captured = true 19 | 20 | 21 | func _physics_process(delta): 22 | if input_captured: 23 | var space_state = self.get_world().direct_space_state 24 | var result = space_state.intersect_ray(from, to, [], 0x7FFFFFFF, false, true) 25 | 26 | if not result.empty() and result["collider"] == self._Clickable_Object: 27 | self._clickable_object_material.albedo_color = Color(randf(), randf(), randf(), 1.0) 28 | 29 | input_captured = false 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/README.md -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd" type="Script" id=1] 4 | 5 | [node name="Dialog_Editor" type="Control"] 6 | anchor_right = 1.0 7 | anchor_bottom = 1.0 8 | rect_min_size = Vector2( 0, 256 ) 9 | script = ExtResource( 1 ) 10 | __meta__ = { 11 | "_edit_use_anchors_": false 12 | } 13 | 14 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 15 | anchor_right = 1.0 16 | anchor_bottom = 1.0 17 | __meta__ = { 18 | "_edit_use_anchors_": false 19 | } 20 | 21 | [node name="VBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 22 | margin_right = 1024.0 23 | margin_bottom = 20.0 24 | 25 | [node name="Close_BTN" type="Button" parent="VBoxContainer/VBoxContainer"] 26 | margin_right = 47.0 27 | margin_bottom = 20.0 28 | hint_tooltip = "Close the Dialog Editor." 29 | text = "Close" 30 | 31 | [node name="Back_BTN" type="Button" parent="VBoxContainer/VBoxContainer"] 32 | margin_left = 51.0 33 | margin_right = 93.0 34 | margin_bottom = 20.0 35 | hint_tooltip = "Return to the Story Editor." 36 | text = "Back" 37 | 38 | [node name="VSeparator" type="VSeparator" parent="VBoxContainer/VBoxContainer"] 39 | margin_left = 97.0 40 | margin_right = 101.0 41 | margin_bottom = 20.0 42 | 43 | [node name="Add_Node_BTN" type="Button" parent="VBoxContainer/VBoxContainer"] 44 | margin_left = 105.0 45 | margin_right = 180.0 46 | margin_bottom = 20.0 47 | hint_tooltip = "Add a new node to the graph." 48 | text = "Add Node" 49 | 50 | [node name="VSeparator2" type="VSeparator" parent="VBoxContainer/VBoxContainer"] 51 | margin_left = 184.0 52 | margin_right = 188.0 53 | margin_bottom = 20.0 54 | 55 | [node name="Human_Readable_LBL" type="Label" parent="VBoxContainer/VBoxContainer"] 56 | margin_left = 192.0 57 | margin_top = 3.0 58 | margin_right = 378.0 59 | margin_bottom = 17.0 60 | text = "Human Readable Description" 61 | 62 | [node name="GraphEdit" type="GraphEdit" parent="VBoxContainer"] 63 | margin_top = 24.0 64 | margin_right = 1024.0 65 | margin_bottom = 600.0 66 | size_flags_horizontal = 3 67 | size_flags_vertical = 3 68 | right_disconnects = true 69 | __meta__ = { 70 | "_edit_use_anchors_": false 71 | } 72 | [connection signal="pressed" from="VBoxContainer/VBoxContainer/Close_BTN" to="." method="_on_Close_BTN_pressed"] 73 | [connection signal="pressed" from="VBoxContainer/VBoxContainer/Back_BTN" to="." method="_on_Back_BTN_pressed"] 74 | [connection signal="pressed" from="VBoxContainer/VBoxContainer/Add_Node_BTN" to="." method="_on_Add_Node_BTN_pressed"] 75 | [connection signal="connection_request" from="VBoxContainer/GraphEdit" to="." method="_on_GraphEdit_connection_request"] 76 | [connection signal="disconnection_request" from="VBoxContainer/GraphEdit" to="." method="_on_GraphEdit_disconnection_request"] 77 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd" type="Script" id=1] 4 | 5 | [node name="WindowDialog" type="WindowDialog"] 6 | anchor_left = 0.5 7 | anchor_top = 0.5 8 | anchor_right = 0.5 9 | anchor_bottom = 0.5 10 | margin_left = -540.0 11 | margin_top = -384.0 12 | margin_right = 540.0 13 | margin_bottom = 384.0 14 | window_title = "Node Editor" 15 | resizable = true 16 | script = ExtResource( 1 ) 17 | __meta__ = { 18 | "_edit_use_anchors_": false 19 | } 20 | 21 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 22 | anchor_right = 1.0 23 | anchor_bottom = 1.0 24 | margin_left = 13.0 25 | margin_top = 13.0 26 | margin_right = -13.0 27 | margin_bottom = -13.0 28 | __meta__ = { 29 | "_edit_use_anchors_": false 30 | } 31 | 32 | [node name="TextEdit" type="TextEdit" parent="VBoxContainer"] 33 | margin_right = 1054.0 34 | margin_bottom = 718.0 35 | size_flags_horizontal = 3 36 | size_flags_vertical = 3 37 | smooth_scrolling = true 38 | __meta__ = { 39 | "_edit_use_anchors_": false 40 | } 41 | 42 | [node name="OK_BTN" type="Button" parent="VBoxContainer"] 43 | margin_left = 503.0 44 | margin_top = 722.0 45 | margin_right = 550.0 46 | margin_bottom = 742.0 47 | hint_tooltip = "Close the node editor." 48 | size_flags_horizontal = 4 49 | size_flags_vertical = 0 50 | text = "Close" 51 | [connection signal="text_changed" from="VBoxContainer/TextEdit" to="." method="_on_TextEdit_text_changed"] 52 | [connection signal="pressed" from="VBoxContainer/OK_BTN" to="." method="_on_OK_BTN_pressed"] 53 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends WindowDialog 3 | 4 | onready var _Text_Editor = self.get_node("VBoxContainer/TextEdit") 5 | 6 | var _Target_Node 7 | 8 | #Public Methods 9 | 10 | func set_target_node(node): 11 | self._Target_Node = node 12 | self._Text_Editor.text = node.get_text() 13 | 14 | #Callback Methods 15 | 16 | func _on_OK_BTN_pressed(): 17 | self.visible = false 18 | 19 | 20 | func _on_TextEdit_text_changed(): 21 | self._Target_Node.set_text(self._Text_Editor.text) 22 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg" type="Texture" id=2] 5 | 6 | 7 | [node name="Line" type="GraphNode"] 8 | margin_right = 324.0 9 | margin_bottom = 137.0 10 | rect_min_size = Vector2( 324, 137 ) 11 | title = "Line" 12 | offset = Vector2( 40, 40 ) 13 | show_close = true 14 | resizable = true 15 | slot/0/left_enabled = true 16 | slot/0/left_type = 0 17 | slot/0/left_color = Color( 1, 1, 1, 1 ) 18 | slot/0/right_enabled = true 19 | slot/0/right_type = 0 20 | slot/0/right_color = Color( 1, 1, 1, 1 ) 21 | slot/1/left_enabled = false 22 | slot/1/left_type = 0 23 | slot/1/left_color = Color( 1, 1, 1, 1 ) 24 | slot/1/right_enabled = false 25 | slot/1/right_type = 0 26 | slot/1/right_color = Color( 1, 1, 1, 1 ) 27 | script = ExtResource( 1 ) 28 | __meta__ = { 29 | "_edit_use_anchors_": false 30 | } 31 | 32 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 33 | margin_left = 16.0 34 | margin_top = 39.0 35 | margin_right = 380.0 36 | margin_bottom = 131.0 37 | size_flags_horizontal = 3 38 | size_flags_vertical = 3 39 | __meta__ = { 40 | "_edit_use_anchors_": false 41 | } 42 | 43 | [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] 44 | margin_right = 364.0 45 | margin_bottom = 64.0 46 | 47 | [node name="TextEdit" type="TextEdit" parent="VBoxContainer/HBoxContainer2"] 48 | margin_right = 328.0 49 | margin_bottom = 64.0 50 | rect_min_size = Vector2( 256, 64 ) 51 | size_flags_horizontal = 3 52 | size_flags_vertical = 3 53 | smooth_scrolling = true 54 | 55 | [node name="Editor_BTN" type="Button" parent="VBoxContainer/HBoxContainer2"] 56 | margin_left = 332.0 57 | margin_right = 364.0 58 | margin_bottom = 64.0 59 | rect_min_size = Vector2( 32, 0 ) 60 | hint_tooltip = "Expand this node's text editor." 61 | icon = ExtResource( 2 ) 62 | expand_icon = true 63 | 64 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 65 | margin_top = 68.0 66 | margin_right = 364.0 67 | margin_bottom = 92.0 68 | alignment = 1 69 | 70 | [node name="Save_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 71 | margin_right = 125.0 72 | margin_bottom = 24.0 73 | hint_tooltip = "Save the current text as a template that can quickly loaded into new nodes." 74 | text = "Save Template As" 75 | 76 | [node name="Load_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 77 | margin_left = 129.0 78 | margin_right = 235.0 79 | margin_bottom = 24.0 80 | hint_tooltip = "Load a template from file." 81 | text = "Load Template" 82 | 83 | [node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer"] 84 | margin_left = 239.0 85 | margin_right = 243.0 86 | margin_bottom = 24.0 87 | 88 | [node name="Link_LBL" type="Label" parent="VBoxContainer/HBoxContainer"] 89 | margin_left = 247.0 90 | margin_top = 5.0 91 | margin_right = 286.0 92 | margin_bottom = 19.0 93 | text = "Slots: " 94 | 95 | [node name="Link_SpinBox" type="SpinBox" parent="VBoxContainer/HBoxContainer"] 96 | margin_left = 290.0 97 | margin_right = 364.0 98 | margin_bottom = 24.0 99 | hint_tooltip = "Change the number of output slots on this node." 100 | min_value = 1.0 101 | value = 1.0 102 | rounded = true 103 | allow_greater = true 104 | [connection signal="close_request" from="." to="." method="_on_Line_close_request"] 105 | [connection signal="offset_changed" from="." to="." method="_on_Line_offset_changed"] 106 | [connection signal="resize_request" from="." to="." method="_on_Line_resize_request"] 107 | [connection signal="text_changed" from="VBoxContainer/HBoxContainer2/TextEdit" to="." method="_on_TextEdit_text_changed"] 108 | [connection signal="pressed" from="VBoxContainer/HBoxContainer2/Editor_BTN" to="." method="_on_Editor_BTN_pressed"] 109 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Save_BTN" to="." method="_on_Save_BTN_pressed"] 110 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Load_BTN" to="." method="_on_Load_BTN_pressed"] 111 | [connection signal="value_changed" from="VBoxContainer/HBoxContainer/Link_SpinBox" to="." method="_on_Link_SpinBox_value_changed"] 112 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon_distraction_free.svg-5120bf5545890a3868c1108c903f7cd9.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg" 13 | dest_files=[ "res://.import/icon_distraction_free.svg-5120bf5545890a3868c1108c903f7cd9.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends GraphNode 3 | 4 | signal changed_offset(nid, vec2) 5 | signal changed_size(this) 6 | signal changed_slots(this) 7 | signal erased(this) 8 | signal pressed_editor(this) 9 | signal pressed_load(this) 10 | signal pressed_save(this) 11 | signal text_changed(nid, new_text) 12 | 13 | onready var _Link_SpinBox = self.get_node("VBoxContainer/HBoxContainer/Link_SpinBox") 14 | onready var _Text_Editor = self.get_node("VBoxContainer/HBoxContainer2/TextEdit") 15 | 16 | var _nid : int = 0 17 | var _slot_amount : int = 1 18 | 19 | #Virtual Methods 20 | 21 | func _ready(): 22 | self._update_slots() 23 | 24 | #Callback Methods 25 | 26 | func _on_Editor_BTN_pressed(): 27 | self.emit_signal("pressed_editor", self) 28 | 29 | 30 | func _on_Line_close_request(): 31 | self.emit_signal("erased", self) 32 | 33 | 34 | func _on_Line_offset_changed(): 35 | self.emit_signal("changed_offset", self._nid, self.offset) 36 | 37 | 38 | func _on_Line_resize_request(new_minsize): 39 | self.rect_size = new_minsize 40 | self.emit_signal("changed_size", self) 41 | 42 | 43 | func _on_Link_SpinBox_value_changed(value): 44 | self._slot_amount = int(self._Link_SpinBox.value) 45 | self._update_slots() 46 | self.emit_signal("changed_slots", self) 47 | 48 | 49 | func _on_Load_BTN_pressed(): 50 | self.emit_signal("pressed_load", self) 51 | 52 | 53 | func _on_Save_BTN_pressed(): 54 | self.emit_signal("pressed_save", self) 55 | 56 | 57 | func _on_TextEdit_text_changed(): 58 | self.emit_signal("text_changed", self._nid, self._Text_Editor.text) 59 | 60 | #Public Methods 61 | 62 | func get_nid() -> int: 63 | return self._nid 64 | 65 | 66 | func get_slot_amount() -> int: 67 | return self._slot_amount 68 | 69 | 70 | func get_text() -> String: 71 | return self._Text_Editor.text 72 | 73 | 74 | func set_nid(new_nid): 75 | self._nid = new_nid 76 | var new_name = "NID " + str(new_nid) 77 | self.title = new_name 78 | self.name = new_name 79 | 80 | 81 | func set_slot_amount(new_amount : int): 82 | self._slot_amount = new_amount 83 | 84 | 85 | func set_text(new_text : String): 86 | self._Text_Editor.text = new_text 87 | self.emit_signal("text_changed", self._nid, new_text) 88 | 89 | #Private Methods 90 | 91 | func _clear_link_labels(): 92 | var children = self.get_children() 93 | for child in children: 94 | if child is Label: 95 | child.free() 96 | 97 | 98 | func _update_slots(): 99 | self.clear_all_slots() 100 | self._clear_link_labels() 101 | self.set_slot(0, true, 0, Color(1.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 1.0, 1.0, 1.0), null, null) 102 | var base_link_label = Label.new() 103 | base_link_label.text = "0" 104 | base_link_label.align = Label.ALIGN_RIGHT 105 | self.add_child(base_link_label) 106 | self.move_child(base_link_label, 0) 107 | var last_output_link_label = base_link_label 108 | for slot in range(1, self._slot_amount): 109 | self.set_slot(slot, false, 0, Color(1.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 1.0, 1.0, 1.0), null, null) 110 | var output_link_label = Label.new() 111 | output_link_label.text = str(slot) 112 | output_link_label.align = Label.ALIGN_RIGHT 113 | self.add_child_below_node(last_output_link_label, output_link_label) 114 | last_output_link_label = output_link_label 115 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Control 3 | 4 | signal back_BTN_pressed 5 | signal close_BTN_pressed 6 | 7 | onready var _Graph = self.get_node("VBoxContainer/GraphEdit") 8 | onready var _Human_Readable_LBL = self.get_node("VBoxContainer/VBoxContainer/Human_Readable_LBL") 9 | 10 | var _Editor_TSCN = preload("res://addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn") 11 | var _LineNode = preload("res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn") 12 | var _NodeTemplate= preload("res://addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd") 13 | 14 | var _did : int = -1 15 | var _Editor 16 | var _Load_Template : EditorFileDialog 17 | var _Save_Template_As : EditorFileDialog 18 | var _Story_Editor 19 | var _Target_Node 20 | 21 | #Virtual Methods 22 | 23 | func _ready(): 24 | self._setup_dialogs() 25 | self._Editor = _Editor_TSCN.instance() 26 | self.add_child(self._Editor) 27 | 28 | #Callback Methods 29 | 30 | func _on_Add_Node_BTN_pressed(): 31 | var new_nid = self._Story_Editor.create_node(self._did, "line") 32 | var new_line_node = self._LineNode.instance() 33 | new_line_node.offset += self._Graph.scroll_offset 34 | new_line_node.set_nid(new_nid) 35 | new_line_node.connect("erased", self, "_on_Node_erased") 36 | new_line_node.connect("changed_offset", self, "_on_Node_changed_offset") 37 | new_line_node.connect("text_changed", self, "_on_Node_text_changed") 38 | new_line_node.connect("pressed_save", self, "_on_Node_pressed_save") 39 | new_line_node.connect("pressed_load", self, "_on_Node_pressed_load") 40 | new_line_node.connect("pressed_editor", self, "_on_Node_pressed_editor") 41 | new_line_node.connect("changed_slots", self, "_on_Node_changed_slots") 42 | new_line_node.connect("changed_size", self, "_on_Node_changed_size") 43 | var slot_count = self._Story_Editor.get_node_property(self._did, new_nid, "slot_amount") 44 | self._Story_Editor.set_node_property(self._did, new_nid, "rect_size", new_line_node.rect_size) 45 | new_line_node.set_slot_amount(slot_count) 46 | self._Graph.add_child(new_line_node) 47 | 48 | 49 | func _on_Back_BTN_pressed(): 50 | self.emit_signal("back_BTN_pressed") 51 | 52 | 53 | func _on_Close_BTN_pressed(): 54 | self.emit_signal("close_BTN_pressed") 55 | 56 | 57 | func _on_GraphEdit_connection_request(from, from_slot, to, to_slot): 58 | self._Graph.connect_node(from, from_slot, to, to_slot) 59 | var from_node = self._Graph.get_node(from) 60 | var to_node = self._Graph.get_node(to) 61 | var from_node_nid = from_node.get_nid() 62 | var to_node_nid = to_node.get_nid() 63 | self._Story_Editor.set_link(self._did, from_node_nid, from_slot, to_node_nid) 64 | 65 | 66 | func _on_GraphEdit_disconnection_request(from, from_slot, to, to_slot): 67 | self._Graph.disconnect_node(from, from_slot, to, to_slot) 68 | var from_node = self._Graph.get_node(from) 69 | var from_node_nid = from_node.get_nid() 70 | self._Story_Editor.erase_link(self._did, from_node_nid, from_slot) 71 | 72 | 73 | func _on_Load_Template_file_selected(filename): 74 | var file_data = load(filename) 75 | if not file_data.TYPE == "EXP_Dialog_Node_Template_editor": 76 | return 77 | 78 | self._Target_Node.set_text(file_data.template) 79 | 80 | 81 | func _on_Node_changed_offset(nid, new_offset): 82 | self._Story_Editor.set_node_property(self._did, nid, "graph_offset", new_offset) 83 | 84 | 85 | func _on_Node_changed_size(changed_node): 86 | var changed_node_nid = changed_node.get_nid() 87 | self._Story_Editor.set_node_property(self._did, changed_node_nid, "rect_size", changed_node.rect_size) 88 | 89 | 90 | func _on_Node_changed_slots(changed_node): 91 | var changed_node_nid = changed_node.get_nid() 92 | self._unlink_nid_from_story(changed_node_nid) 93 | self._disconnect_all_from(changed_node) 94 | self._Story_Editor.set_node_property(self._did, changed_node_nid, "slot_amount", 95 | changed_node.get_slot_amount()) 96 | 97 | 98 | func _on_Node_erased(deleted_node): 99 | var deleted_nid = deleted_node.get_nid() 100 | self._unlink_nid_from_story(deleted_nid) 101 | self._Story_Editor.erase_node(self._did, deleted_nid) 102 | self._disconnect_all_from(deleted_node) 103 | deleted_node.queue_free() 104 | 105 | 106 | func _on_Node_pressed_editor(node): 107 | self._Editor.set_target_node(node) 108 | self._Editor.visible = true 109 | 110 | 111 | func _on_Node_pressed_load(node): 112 | self._Target_Node = node 113 | self._Load_Template.popup_centered_ratio(0.7) 114 | 115 | 116 | func _on_Node_pressed_save(node): 117 | self._Target_Node = node 118 | self._Save_Template_As.popup_centered_ratio(0.7) 119 | 120 | 121 | func _on_Node_text_changed(nid, new_text): 122 | self._Story_Editor.set_node_property(self._did, nid, "text", new_text) 123 | 124 | 125 | func _on_Save_Template_As_file_selected(filename): 126 | var save_file = _NodeTemplate.new() 127 | save_file.template = self._Target_Node.get_text() 128 | ResourceSaver.save(filename, save_file) 129 | 130 | 131 | func _on_Story_Editor_dialog_edit_pressed(story_editor, did : int): 132 | self._Story_Editor = story_editor 133 | self._did = did 134 | self._Human_Readable_LBL.text = self._Story_Editor.get_dialog_property(self._did, "human_readable_description") 135 | self._clear_nodes() 136 | self._populate_graph() 137 | self._link_node_connections() 138 | 139 | #Private Methods 140 | 141 | func _clear_nodes(): 142 | self._Graph.clear_connections() 143 | var children = self._Graph.get_children() 144 | for child in children: 145 | if child is GraphNode: 146 | child.free() 147 | 148 | 149 | func _disconnect_all_from(node): 150 | var node_name = node.name 151 | var connection_list = self._Graph.get_connection_list() 152 | for connection in connection_list: 153 | if connection["from"] == node.name or connection["to"] == node.name: 154 | self._Graph.disconnect_node(connection["from"], connection["from_port"], 155 | connection["to"], connection["to_port"]) 156 | 157 | 158 | func _link_node_connections(): 159 | var node_IDs = self._Story_Editor.get_nids(self._did) 160 | for nID in node_IDs: 161 | var slots = self._Story_Editor.get_link_slots(self._did, nID) 162 | for slot in slots: 163 | var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot) 164 | var to = "NID " + str(to_node_nid) 165 | var from = "NID " + str(nID) 166 | self._Graph.connect_node(from, slot, to, 0) 167 | 168 | 169 | func _populate_graph(): 170 | var node_IDs = self._Story_Editor.get_nids(self._did) 171 | for nID in node_IDs: 172 | var new_node : GraphNode 173 | match self._Story_Editor.get_node_property(self._did, nID, "type"): 174 | "line": 175 | new_node = _LineNode.instance() 176 | var slot_count = self._Story_Editor.get_node_property(self._did, nID, "slot_amount") 177 | new_node.set_slot_amount(slot_count) 178 | self._Graph.add_child(new_node) 179 | new_node.connect("erased", self, "_on_Node_erased") 180 | var new_text = self._Story_Editor.get_node_property(self._did, nID, "text") 181 | var new_rect_size = self._Story_Editor.get_node_property(self._did, nID, "rect_size") 182 | new_node.rect_size = new_rect_size 183 | new_node.set_text(new_text) 184 | new_node.connect("text_changed", self, "_on_Node_text_changed") 185 | new_node.connect("pressed_save", self, "_on_Node_pressed_save") 186 | new_node.connect("pressed_load", self, "_on_Node_pressed_load") 187 | new_node.connect("pressed_editor", self, "_on_Node_pressed_editor") 188 | new_node.connect("changed_slots", self, "_on_Node_changed_slots") 189 | new_node.connect("changed_size", self, "_on_Node_changed_size") 190 | 191 | new_node.set_nid(nID) 192 | new_node.offset = self._Story_Editor.get_node_property(self._did, nID, "graph_offset") 193 | new_node.connect("changed_offset", self, "_on_Node_changed_offset") 194 | 195 | 196 | func _setup_dialogs(): 197 | self._Load_Template = EditorFileDialog.new() 198 | self._Load_Template.mode = EditorFileDialog.MODE_OPEN_FILE 199 | self._Load_Template.add_filter("*.res ; Template files") 200 | self._Load_Template.resizable = true 201 | self._Load_Template.access = EditorFileDialog.ACCESS_RESOURCES 202 | self._Load_Template.current_dir = "res://" 203 | self._Load_Template.connect("file_selected", self, "_on_Load_Template_file_selected") 204 | self.add_child(self._Load_Template) 205 | 206 | self._Save_Template_As = EditorFileDialog.new() 207 | self._Save_Template_As.mode = EditorFileDialog.MODE_SAVE_FILE 208 | self._Save_Template_As.add_filter("*.res ; Template files") 209 | self._Save_Template_As.resizable = true 210 | self._Save_Template_As.access = EditorFileDialog.ACCESS_RESOURCES 211 | self._Save_Template_As.current_dir = "res://" 212 | self._Save_Template_As.connect("file_selected", self, "_on_Save_Template_As_file_selected") 213 | self.add_child(self._Save_Template_As) 214 | 215 | 216 | func _unlink_nid_from_story(removed_nid): 217 | self._Story_Editor.erase_all_links(self._did, removed_nid) 218 | var nIDs = self._Story_Editor.get_nids(self._did) 219 | for nID in nIDs: 220 | var node_slots = self._Story_Editor.get_link_slots(self._did, nID) 221 | for slot in node_slots: 222 | var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot) 223 | if to_node_nid == removed_nid: 224 | self._Story_Editor.erase_link(self._did, nID, slot) 225 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Reference_StoryReader/EXP_StoryReader.gd: -------------------------------------------------------------------------------- 1 | extends Reference 2 | 3 | var _story : Dictionary = {} 4 | var _names : Dictionary = {} 5 | 6 | 7 | func get_dids() -> Array: 8 | return self._story.keys() 9 | 10 | 11 | func get_did_via_record_name(name : String) -> int: 12 | assert(self._names.has(name)) 13 | return self._names[name] 14 | 15 | 16 | func get_nid_from_slot(did : int, nid : int, slot : int) -> int: 17 | assert(self.has_did(did)) 18 | assert(self.has_nid(did, nid)) 19 | assert(self.has_slot(did, nid, slot)) 20 | return self._story[did]["nodes"][nid]["links"][slot] 21 | 22 | 23 | func get_nid_via_exact_text(did : int, query : String) -> int: 24 | assert(self.has_did(did)) 25 | 26 | for nid in self._story[did]["nodes"].keys(): 27 | if self._story[did]["nodes"][nid]["text"] == query: 28 | return nid 29 | return -1 30 | 31 | 32 | func get_nids(did : int) -> Array: 33 | assert(self.has_did(did)) 34 | return self._story[did]["nodes"].keys() 35 | 36 | 37 | func get_slot_count(did : int, nid : int) -> int: 38 | assert(self.has_did(did)) 39 | assert(self.has_nid(did, nid)) 40 | return self._story[did]["nodes"][nid]["links"].size() 41 | 42 | 43 | func get_slots(did : int, nid : int) -> Array: 44 | assert(self.has_did(did)) 45 | assert(self.has_nid(did, nid)) 46 | return self._story[did]["nodes"][nid]["links"].keys() 47 | 48 | 49 | func get_text(did : int, nid : int) -> String: 50 | assert(self.has_did(did)) 51 | assert(self.has_nid(did, nid)) 52 | return self._story[did]["nodes"][nid]["text"] 53 | 54 | 55 | func has_did(did : int) -> bool: 56 | return self._story.has(did) 57 | 58 | 59 | func has_nid(did : int, nid : int) -> bool: 60 | assert(self.has_did(did)) 61 | return self._story[did]["nodes"].has(nid) 62 | 63 | 64 | func has_record_name(name : String) -> bool: 65 | return self._names.has(name) 66 | 67 | 68 | func has_slot(did: int, nid : int, slot : int) -> bool: 69 | assert(self.has_did(did)) 70 | assert(self.has_nid(did, nid)) 71 | return self._story[did]["nodes"][nid]["links"].has(slot) 72 | 73 | 74 | func read(file): 75 | if not "TYPE" in file: 76 | print_debug("Story reader failed to open file: ", str(file.filename)) 77 | return 78 | if not file.TYPE == "EXP_Baked_Story": 79 | print_debug("Story reader failed to open file: ", str(file.filename)) 80 | return 81 | 82 | self._story = file.story 83 | self._names = file.names 84 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Resource 3 | 4 | export(String) var TYPE = "EXP_Baked_Story" 5 | export(Dictionary) var story : Dictionary 6 | export(Dictionary) var names : Dictionary 7 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Resource 3 | 4 | export(String) var TYPE = "EXP_Story_editor" 5 | 6 | export(Dictionary) var names : Dictionary 7 | export(Dictionary) var story : Dictionary 8 | export(Array) var available_dids : Array 9 | export(Array) var groups : Array 10 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Resource 3 | 4 | var TYPE = "EXP_Dialog_Node_Template_editor" 5 | 6 | export(String) var template 7 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd" type="Script" id=1] 4 | 5 | [sub_resource type="StyleBoxFlat" id=1] 6 | bg_color = Color( 0.6, 0.6, 0.6, 0 ) 7 | border_color = Color( 0.8, 0.8, 0.8, 0 ) 8 | shadow_color = Color( 0, 0, 0, 0 ) 9 | 10 | [sub_resource type="StyleBoxFlat" id=2] 11 | bg_color = Color( 0.6, 0.6, 0.6, 0 ) 12 | border_color = Color( 0.8, 0.8, 0.8, 0 ) 13 | shadow_color = Color( 0, 0, 0, 0 ) 14 | 15 | [node name="Dialog_Record" type="Control"] 16 | anchor_right = 1.0 17 | rect_min_size = Vector2( 0, 28 ) 18 | script = ExtResource( 1 ) 19 | __meta__ = { 20 | "_edit_use_anchors_": false 21 | } 22 | 23 | [node name="ColorRect" type="ColorRect" parent="."] 24 | anchor_right = 1.0 25 | anchor_bottom = 1.0 26 | rect_min_size = Vector2( 0, 24 ) 27 | size_flags_horizontal = 3 28 | color = Color( 1, 1, 1, 0.12549 ) 29 | __meta__ = { 30 | "_edit_use_anchors_": false 31 | } 32 | 33 | [node name="HBoxContainer" type="HBoxContainer" parent="ColorRect"] 34 | anchor_right = 1.0 35 | anchor_bottom = 1.0 36 | __meta__ = { 37 | "_edit_use_anchors_": false 38 | } 39 | 40 | [node name="CheckBox" type="CheckBox" parent="ColorRect/HBoxContainer"] 41 | margin_right = 24.0 42 | margin_bottom = 28.0 43 | 44 | [node name="DID_LBL" type="Label" parent="ColorRect/HBoxContainer"] 45 | margin_left = 28.0 46 | margin_top = 7.0 47 | margin_right = 85.0 48 | margin_bottom = 21.0 49 | text = "DID: 101" 50 | 51 | [node name="VSeparator" type="VSeparator" parent="ColorRect/HBoxContainer"] 52 | margin_left = 89.0 53 | margin_right = 93.0 54 | margin_bottom = 28.0 55 | 56 | [node name="Edit_BTN" type="Button" parent="ColorRect/HBoxContainer"] 57 | margin_left = 97.0 58 | margin_right = 138.0 59 | margin_bottom = 28.0 60 | hint_tooltip = "Edit this dialog record in the Dialog Editor." 61 | text = "EDIT" 62 | flat = true 63 | 64 | [node name="VSeparator4" type="VSeparator" parent="ColorRect/HBoxContainer"] 65 | margin_left = 142.0 66 | margin_right = 146.0 67 | margin_bottom = 28.0 68 | 69 | [node name="Name_BTN" type="Button" parent="ColorRect/HBoxContainer"] 70 | margin_left = 150.0 71 | margin_right = 200.0 72 | margin_bottom = 28.0 73 | hint_tooltip = "Edit this dialog record in the Dialog Editor." 74 | text = "NAME" 75 | flat = true 76 | 77 | [node name="VSeparator2" type="VSeparator" parent="ColorRect/HBoxContainer"] 78 | margin_left = 204.0 79 | margin_right = 208.0 80 | margin_bottom = 28.0 81 | 82 | [node name="Group_BTN" type="OptionButton" parent="ColorRect/HBoxContainer"] 83 | margin_left = 212.0 84 | margin_right = 274.0 85 | margin_bottom = 28.0 86 | hint_tooltip = "View groups applied to this dialog record." 87 | text = "TAGS" 88 | flat = true 89 | 90 | [node name="VSeparator3" type="VSeparator" parent="ColorRect/HBoxContainer"] 91 | margin_left = 278.0 92 | margin_right = 282.0 93 | margin_bottom = 28.0 94 | 95 | [node name="Human_Readable_LineEdit" type="LineEdit" parent="ColorRect/HBoxContainer"] 96 | margin_left = 286.0 97 | margin_right = 476.0 98 | margin_bottom = 28.0 99 | custom_styles/focus = SubResource( 1 ) 100 | custom_styles/normal = SubResource( 2 ) 101 | text = "Human Readable Description" 102 | expand_to_text_length = true 103 | context_menu_enabled = false 104 | [connection signal="toggled" from="ColorRect/HBoxContainer/CheckBox" to="." method="_on_CheckBox_toggled"] 105 | [connection signal="pressed" from="ColorRect/HBoxContainer/Edit_BTN" to="." method="_on_Edit_BTN_pressed"] 106 | [connection signal="pressed" from="ColorRect/HBoxContainer/Name_BTN" to="." method="_on_Name_BTN_pressed"] 107 | [connection signal="pressed" from="ColorRect/HBoxContainer/Group_BTN" to="." method="_on_Group_BTN_pressed"] 108 | [connection signal="focus_exited" from="ColorRect/HBoxContainer/Human_Readable_LineEdit" to="." method="_on_Human_Readable_LineEdit_focus_exited"] 109 | [connection signal="text_changed" from="ColorRect/HBoxContainer/Human_Readable_LineEdit" to="." method="_on_Human_Readable_LineEdit_text_changed"] 110 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Control 3 | 4 | signal changed_human_readable_text(did, text) 5 | signal checked(this) 6 | signal edit_pressed(did) 7 | signal rename_pressed(this) 8 | signal unchecked(this) 9 | 10 | onready var _DID_LBL = self.get_node("ColorRect/HBoxContainer/DID_LBL") 11 | onready var _Human_Readable_LineEdit = self.get_node("ColorRect/HBoxContainer/Human_Readable_LineEdit") 12 | onready var _Group_List = self.get_node("ColorRect/HBoxContainer/Group_BTN") 13 | onready var _Name_BTN = self.get_node("ColorRect/HBoxContainer/Name_BTN") 14 | onready var _Select_CheckBox = self.get_node("ColorRect/HBoxContainer/CheckBox") 15 | 16 | var _did : int = -1 17 | var _Story_Editor 18 | 19 | #Virtual Methods 20 | 21 | func _ready(): 22 | self.update_human_readable_description("Human Readable Description") 23 | 24 | #Callback Methods 25 | 26 | func _on_CheckBox_toggled(button_pressed): 27 | if button_pressed: 28 | self.emit_signal("checked", self) 29 | else: 30 | self.emit_signal("unchecked", self) 31 | 32 | 33 | func _on_Edit_BTN_pressed(): 34 | self.emit_signal("edit_pressed", self._did) 35 | 36 | 37 | func _on_Group_BTN_pressed(): 38 | var groups = self._Story_Editor.dialog_get_groups(self._did) 39 | self._Group_List.clear() 40 | self._Group_List.text = "TAGS" 41 | for group in groups: 42 | self._Group_List.get_popup().add_item(group) 43 | for idx in range(self._Group_List.get_item_count()): 44 | self._Group_List.set_item_disabled(idx, true) 45 | 46 | 47 | func _on_Human_Readable_LineEdit_focus_exited(): 48 | self._Human_Readable_LineEdit.deselect() 49 | 50 | 51 | func _on_Human_Readable_LineEdit_text_changed(new_text): 52 | self.emit_signal("changed_human_readable_text", self._did, new_text) 53 | 54 | 55 | func _on_Name_BTN_pressed(): 56 | emit_signal("rename_pressed", self) 57 | 58 | #Public Methods 59 | 60 | func check(): 61 | self._Select_CheckBox.pressed = true 62 | 63 | 64 | func get_did(): 65 | return self._did 66 | 67 | 68 | func get_record_name(): 69 | return self._Name_BTN.text 70 | 71 | 72 | func set_did(new_did : int): 73 | self._did = new_did 74 | self._DID_LBL.text = "DID: " + str(new_did) 75 | 76 | 77 | func set_record_name(rename : String): 78 | self._Name_BTN.text = rename 79 | 80 | 81 | func set_story_editor(editor): 82 | self._Story_Editor = editor 83 | 84 | 85 | func uncheck(): 86 | self._Select_CheckBox.pressed = false 87 | 88 | 89 | func update_human_readable_description(new_text): 90 | self._Human_Readable_LineEdit.text = new_text 91 | self.emit_signal("changed_human_readable_text", self._did, new_text) 92 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd" type="Script" id=1] 4 | 5 | [node name="Record_Rename_Box" type="WindowDialog"] 6 | anchor_left = 0.5 7 | anchor_top = 0.5 8 | anchor_right = 0.5 9 | anchor_bottom = 0.5 10 | margin_left = -193.0 11 | margin_top = -64.0 12 | margin_right = 193.0 13 | margin_bottom = 52.0 14 | rect_min_size = Vector2( 386, 116 ) 15 | size_flags_horizontal = 3 16 | size_flags_vertical = 3 17 | window_title = "Rename Dialog Record" 18 | script = ExtResource( 1 ) 19 | __meta__ = { 20 | "_edit_use_anchors_": false 21 | } 22 | 23 | [node name="MarginContainer" type="MarginContainer" parent="."] 24 | anchor_right = 1.0 25 | anchor_bottom = 1.0 26 | margin_left = 8.0 27 | margin_top = 8.0 28 | margin_right = -8.0 29 | margin_bottom = -8.0 30 | size_flags_horizontal = 3 31 | size_flags_vertical = 3 32 | __meta__ = { 33 | "_edit_use_anchors_": false 34 | } 35 | 36 | [node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] 37 | margin_right = 370.0 38 | margin_bottom = 100.0 39 | size_flags_horizontal = 3 40 | size_flags_vertical = 3 41 | __meta__ = { 42 | "_edit_use_anchors_": false 43 | } 44 | 45 | [node name="Name_LBL" type="Label" parent="MarginContainer/VBoxContainer"] 46 | margin_right = 370.0 47 | margin_bottom = 14.0 48 | text = "Name:" 49 | 50 | [node name="Spacer2" type="Control" parent="MarginContainer/VBoxContainer"] 51 | margin_top = 18.0 52 | margin_right = 370.0 53 | margin_bottom = 22.0 54 | rect_min_size = Vector2( 0, 4 ) 55 | 56 | [node name="Name_LineEdit" type="LineEdit" parent="MarginContainer/VBoxContainer"] 57 | margin_top = 26.0 58 | margin_right = 370.0 59 | margin_bottom = 50.0 60 | 61 | [node name="Spacer3" type="Control" parent="MarginContainer/VBoxContainer"] 62 | margin_top = 54.0 63 | margin_right = 370.0 64 | margin_bottom = 58.0 65 | rect_min_size = Vector2( 0, 4 ) 66 | 67 | [node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] 68 | margin_top = 62.0 69 | margin_right = 370.0 70 | margin_bottom = 82.0 71 | alignment = 1 72 | 73 | [node name="Cancel_BTN" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] 74 | margin_left = 106.0 75 | margin_right = 160.0 76 | margin_bottom = 20.0 77 | text = "Cancel" 78 | 79 | [node name="Spacer" type="Control" parent="MarginContainer/VBoxContainer/HBoxContainer"] 80 | margin_left = 164.0 81 | margin_right = 196.0 82 | margin_bottom = 20.0 83 | rect_min_size = Vector2( 32, 0 ) 84 | 85 | [node name="Rename_BTN" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] 86 | margin_left = 200.0 87 | margin_right = 264.0 88 | margin_bottom = 20.0 89 | text = "Rename" 90 | [connection signal="text_entered" from="MarginContainer/VBoxContainer/Name_LineEdit" to="." method="_on_Name_LineEdit_text_entered"] 91 | [connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Cancel_BTN" to="." method="_on_Cancel_BTN_pressed"] 92 | [connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Rename_BTN" to="." method="_on_Rename_BTN_pressed"] 93 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends WindowDialog 3 | 4 | signal rename_BTN_pressed(text) 5 | 6 | onready var _Name_LineEdit = self.get_node("MarginContainer/VBoxContainer/Name_LineEdit") 7 | 8 | var _Target_Record = null 9 | 10 | #Public Methods 11 | 12 | func get_target_record(): 13 | return self._Target_Record 14 | 15 | 16 | func set_target_record(record): 17 | self._Target_Record = record 18 | self._Name_LineEdit.text = record.get_record_name() 19 | 20 | #Callback Methods 21 | 22 | func _on_Cancel_BTN_pressed(): 23 | self.visible = false 24 | 25 | 26 | func _on_Rename_BTN_pressed(): 27 | self.visible = false 28 | self.emit_signal("rename_BTN_pressed", self._Name_LineEdit.text) 29 | 30 | 31 | func _on_Name_LineEdit_text_entered(new_text): 32 | self._on_Rename_BTN_pressed() 33 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/EXP-System-Dialog/Story Editor/story_editor.gd" type="Script" id=1] 4 | 5 | [node name="Story_Editor" type="Control"] 6 | anchor_right = 1.0 7 | anchor_bottom = 1.0 8 | rect_min_size = Vector2( 0, 256 ) 9 | script = ExtResource( 1 ) 10 | __meta__ = { 11 | "_edit_use_anchors_": false 12 | } 13 | 14 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 15 | anchor_right = 1.0 16 | anchor_bottom = 1.0 17 | __meta__ = { 18 | "_edit_use_anchors_": false 19 | } 20 | 21 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 22 | margin_right = 1024.0 23 | margin_bottom = 20.0 24 | 25 | [node name="Close_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 26 | margin_right = 47.0 27 | margin_bottom = 20.0 28 | text = "Close" 29 | 30 | [node name="VSeparator5" type="VSeparator" parent="VBoxContainer/HBoxContainer"] 31 | margin_left = 51.0 32 | margin_right = 55.0 33 | margin_bottom = 20.0 34 | 35 | [node name="Story" type="MenuButton" parent="VBoxContainer/HBoxContainer"] 36 | margin_left = 59.0 37 | margin_right = 103.0 38 | margin_bottom = 20.0 39 | text = "Story" 40 | items = [ "New Story", null, 0, false, false, 0, 0, null, "", false, "Load Story", null, 0, false, false, 1, 0, null, "", false, "Save Story As", null, 0, false, false, 2, 0, null, "", false, "Bake Story As", null, 0, false, false, 3, 0, null, "", false, "Save CSV As", null, 0, false, false, 4, 0, null, "", false, "Load CSV", null, 0, false, false, 5, 0, null, "", false ] 41 | 42 | [node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer"] 43 | margin_left = 107.0 44 | margin_right = 111.0 45 | margin_bottom = 20.0 46 | 47 | [node name="Label2" type="Label" parent="VBoxContainer/HBoxContainer"] 48 | margin_left = 115.0 49 | margin_top = 3.0 50 | margin_right = 163.0 51 | margin_bottom = 17.0 52 | text = "Dialog: " 53 | 54 | [node name="Create_Dialog_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 55 | margin_left = 167.0 56 | margin_right = 220.0 57 | margin_bottom = 20.0 58 | hint_tooltip = "Create a new dialog record." 59 | text = "Create" 60 | 61 | [node name="Delete_Dialog_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 62 | margin_left = 224.0 63 | margin_right = 279.0 64 | margin_bottom = 20.0 65 | hint_tooltip = "Delete all checked dialog records." 66 | text = "Delete" 67 | 68 | [node name="Check_All_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 69 | margin_left = 283.0 70 | margin_right = 354.0 71 | margin_bottom = 20.0 72 | hint_tooltip = "Check all currently visible dialog records." 73 | text = "Check All" 74 | 75 | [node name="UnCheck_All_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 76 | margin_left = 358.0 77 | margin_right = 447.0 78 | margin_bottom = 20.0 79 | hint_tooltip = "Uncheck all currently visible dialog records." 80 | text = "UnCheck All" 81 | 82 | [node name="VSeparator2" type="VSeparator" parent="VBoxContainer/HBoxContainer"] 83 | margin_left = 451.0 84 | margin_right = 455.0 85 | margin_bottom = 20.0 86 | 87 | [node name="Label3" type="Label" parent="VBoxContainer/HBoxContainer"] 88 | margin_left = 459.0 89 | margin_top = 3.0 90 | margin_right = 495.0 91 | margin_bottom = 17.0 92 | text = "Tags: " 93 | 94 | [node name="Group_Manager_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 95 | margin_left = 499.0 96 | margin_right = 590.0 97 | margin_bottom = 20.0 98 | hint_tooltip = "Toggles the Group Manager open and closed. Use the Group Manager to add and delete groups that can be applied to dialog records in this story project." 99 | toggle_mode = true 100 | text = "Tag Manager" 101 | 102 | [node name="VSeparator3" type="VSeparator" parent="VBoxContainer/HBoxContainer"] 103 | margin_left = 594.0 104 | margin_right = 598.0 105 | margin_bottom = 20.0 106 | 107 | [node name="Apply_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 108 | margin_left = 602.0 109 | margin_right = 650.0 110 | margin_bottom = 20.0 111 | hint_tooltip = "Apply the group selected in the Group selector menu to all checked dialog records." 112 | text = "Apply" 113 | 114 | [node name="Remove_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] 115 | margin_left = 654.0 116 | margin_right = 718.0 117 | margin_bottom = 20.0 118 | hint_tooltip = "Remove the group selected in the Group selector menu from all checked dialog records if the group is applied to them." 119 | text = "Remove" 120 | 121 | [node name="Group_Selector_BTN" type="OptionButton" parent="VBoxContainer/HBoxContainer"] 122 | margin_left = 722.0 123 | margin_right = 779.0 124 | margin_bottom = 20.0 125 | hint_tooltip = "Select a group to apply or remove from dialog records." 126 | text = "Tags" 127 | 128 | [node name="VSeparator4" type="VSeparator" parent="VBoxContainer/HBoxContainer"] 129 | margin_left = 783.0 130 | margin_right = 787.0 131 | margin_bottom = 20.0 132 | 133 | [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"] 134 | margin_top = 24.0 135 | margin_right = 1024.0 136 | margin_bottom = 572.0 137 | size_flags_horizontal = 3 138 | size_flags_vertical = 3 139 | 140 | [node name="Panel" type="Panel" parent="VBoxContainer/HBoxContainer3"] 141 | margin_right = 1024.0 142 | margin_bottom = 548.0 143 | size_flags_horizontal = 3 144 | size_flags_vertical = 3 145 | 146 | [node name="VScrollBar" type="ScrollContainer" parent="VBoxContainer/HBoxContainer3/Panel"] 147 | anchor_right = 1.0 148 | anchor_bottom = 1.0 149 | rect_min_size = Vector2( 0, 128 ) 150 | size_flags_vertical = 3 151 | __meta__ = { 152 | "_edit_use_anchors_": false 153 | } 154 | 155 | [node name="Dialog_Record_Root" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/Panel/VScrollBar"] 156 | margin_right = 1024.0 157 | margin_bottom = 548.0 158 | rect_min_size = Vector2( 0, 128 ) 159 | size_flags_horizontal = 3 160 | size_flags_vertical = 3 161 | __meta__ = { 162 | "_edit_use_anchors_": false 163 | } 164 | 165 | [node name="Group_Manager" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3"] 166 | visible = false 167 | margin_left = 824.0 168 | margin_right = 1080.0 169 | margin_bottom = 716.0 170 | rect_min_size = Vector2( 256, 0 ) 171 | __meta__ = { 172 | "_edit_use_anchors_": false 173 | } 174 | 175 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/Group_Manager"] 176 | margin_right = 256.0 177 | margin_bottom = 24.0 178 | 179 | [node name="Add_Group_LineEdit" type="LineEdit" parent="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer"] 180 | margin_right = 156.0 181 | margin_bottom = 24.0 182 | rect_min_size = Vector2( 128, 0 ) 183 | size_flags_horizontal = 3 184 | 185 | [node name="Add_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer"] 186 | margin_left = 160.0 187 | margin_right = 197.0 188 | margin_bottom = 24.0 189 | hint_tooltip = "Add a group to this story project." 190 | text = "Add" 191 | __meta__ = { 192 | "_edit_use_anchors_": false 193 | } 194 | 195 | [node name="Delete_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer"] 196 | margin_left = 201.0 197 | margin_right = 256.0 198 | margin_bottom = 24.0 199 | hint_tooltip = "Remove the selected group from this story project." 200 | text = "Delete" 201 | 202 | [node name="Group_ItemList" type="ItemList" parent="VBoxContainer/HBoxContainer3/Group_Manager"] 203 | margin_top = 28.0 204 | margin_right = 256.0 205 | margin_bottom = 716.0 206 | size_flags_vertical = 3 207 | 208 | [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] 209 | margin_top = 576.0 210 | margin_right = 1024.0 211 | margin_bottom = 600.0 212 | rect_min_size = Vector2( 0, 24 ) 213 | 214 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"] 215 | margin_top = 5.0 216 | margin_right = 65.0 217 | margin_bottom = 19.0 218 | text = "Search by " 219 | 220 | [node name="Search_OptionButton" type="OptionButton" parent="VBoxContainer/HBoxContainer2"] 221 | margin_left = 69.0 222 | margin_right = 233.0 223 | margin_bottom = 24.0 224 | text = "Human Readable LBL" 225 | items = [ "Human Readable LBL", null, false, 0, null, "DID", null, false, 1, null ] 226 | selected = 0 227 | 228 | [node name="Search_LineEdit" type="LineEdit" parent="VBoxContainer/HBoxContainer2"] 229 | margin_left = 237.0 230 | margin_right = 493.0 231 | margin_bottom = 24.0 232 | rect_min_size = Vector2( 256, 0 ) 233 | 234 | [node name="Filter_MenuButton" type="MenuButton" parent="VBoxContainer/HBoxContainer2"] 235 | margin_left = 497.0 236 | margin_right = 537.0 237 | margin_bottom = 24.0 238 | hint_tooltip = "Select the groups that appear listed in the story editor." 239 | keep_pressed_outside = true 240 | text = "Tags" 241 | flat = false 242 | items = [ "-No Tags-", null, 1, true, false, 0, 0, null, "", false ] 243 | 244 | [node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer2"] 245 | margin_left = 541.0 246 | margin_right = 545.0 247 | margin_bottom = 24.0 248 | 249 | [node name="Filename_LBL" type="Label" parent="VBoxContainer/HBoxContainer2"] 250 | margin_left = 549.0 251 | margin_top = 5.0 252 | margin_right = 640.0 253 | margin_bottom = 19.0 254 | text = "Unsaved Story" 255 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Close_BTN" to="." method="_on_Close_BTN_pressed"] 256 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Create_Dialog_BTN" to="." method="_on_Create_Dialog_BTN_pressed"] 257 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Delete_Dialog_BTN" to="." method="_on_Delete_Dialog_BTN_pressed"] 258 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Check_All_BTN" to="." method="_on_Check_All_BTN_pressed"] 259 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/UnCheck_All_BTN" to="." method="_on_Uncheck_All_BTN_pressed"] 260 | [connection signal="toggled" from="VBoxContainer/HBoxContainer/Group_Manager_BTN" to="." method="_on_Group_Manager_BTN_toggled"] 261 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Apply_Group_BTN" to="." method="_on_Apply_Group_BTN_pressed"] 262 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Remove_Group_BTN" to="." method="_on_Remove_Group_BTN_pressed"] 263 | [connection signal="pressed" from="VBoxContainer/HBoxContainer/Group_Selector_BTN" to="." method="_on_Group_Selector_BTN_pressed"] 264 | [connection signal="text_entered" from="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_LineEdit" to="." method="_on_Add_Group_LineEdit_text_entered"] 265 | [connection signal="pressed" from="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_BTN" to="." method="_on_Add_Group_BTN_pressed"] 266 | [connection signal="pressed" from="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Delete_Group_BTN" to="." method="_on_Delete_Group_BTN_pressed"] 267 | [connection signal="item_selected" from="VBoxContainer/HBoxContainer2/Search_OptionButton" to="." method="_on_Search_OptionButton_item_selected"] 268 | [connection signal="text_changed" from="VBoxContainer/HBoxContainer2/Search_LineEdit" to="." method="_on_Search_LineEdit_text_changed"] 269 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/Story Editor/story_editor.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Control 3 | 4 | signal changed_story 5 | signal close_pressed 6 | signal dialog_edit_pressed(story, did) 7 | 8 | onready var _Dialog_Record_Root = self.get_node("VBoxContainer/HBoxContainer3/Panel/VScrollBar/Dialog_Record_Root") 9 | onready var _Dir = Directory.new() 10 | onready var _Filename_LBL = self.get_node("VBoxContainer/HBoxContainer2/Filename_LBL") 11 | onready var _Filter_Menu = self.get_node("VBoxContainer/HBoxContainer2/Filter_MenuButton") 12 | onready var _Group_List = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager/Group_ItemList") 13 | onready var _Group_Manager_Panel = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager") 14 | onready var _Group_Selector = self.get_node("VBoxContainer/HBoxContainer/Group_Selector_BTN") 15 | onready var _New_Group_LineEdit = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_LineEdit") 16 | onready var _Search_LineEdit = self.get_node("VBoxContainer/HBoxContainer2/Search_LineEdit") 17 | onready var _Search_Option_BTN = self.get_node("VBoxContainer/HBoxContainer2/Search_OptionButton") 18 | onready var _Story_Menu = self.get_node("VBoxContainer/HBoxContainer/Story") 19 | 20 | var _Dialog_Record = preload("res://addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn") 21 | var _EXP_Baked_Story = preload("res://addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd") 22 | var _EXP_Story = preload("res://addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd") 23 | var _Record_Rename_Box_TSCN = preload("res://addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn") 24 | 25 | var _available_dids : Array 26 | var _Bake_Story_As : EditorFileDialog 27 | var _checked_dialogs : Array = [] 28 | var _groups : Array 29 | var _Load_CSV : EditorFileDialog 30 | var _Load_Story : EditorFileDialog 31 | var _record_names : Dictionary 32 | var _Record_Rename_Box 33 | var _Save_CSV_As : EditorFileDialog 34 | var _Save_Story_As : EditorFileDialog 35 | var _story : Dictionary 36 | 37 | #Virtual Methods 38 | 39 | func _ready(): 40 | self._create_rename_box() 41 | self._populate_story_menu() 42 | self._setup_dialogs() 43 | self._Filter_Menu.get_popup().connect("index_pressed", self, "_on_Filter_Menu_index_pressed") 44 | self._Filter_Menu.get_popup().hide_on_checkable_item_selection = false 45 | self._populate_filter_menu() 46 | self._populate_searchby_menu() 47 | 48 | #Callback Methods 49 | 50 | func _on_Add_Group_BTN_pressed(): 51 | self._add_group() 52 | 53 | 54 | func _on_Add_Group_LineEdit_text_entered(new_text): 55 | self._add_group() 56 | 57 | 58 | func _on_Apply_Group_BTN_pressed(): 59 | var id = self._Group_Selector.get_selected_id() 60 | if id == -1: 61 | return 62 | 63 | var idx = self._Group_Selector.get_item_index(id) 64 | var group = self._Group_Selector.get_popup().get_item_text(idx) 65 | for record in self._checked_dialogs.duplicate(): 66 | var did = record.get_did() 67 | self._dialog_apply_group(did, group) 68 | record.uncheck() 69 | self.emit_signal("changed_story") 70 | 71 | 72 | func _on_Bake_Story_As_file_selected(filename : String): 73 | self._bake_data_to(filename) 74 | 75 | 76 | func _on_Bake_Story_BTN_pressed(): 77 | self._Bake_Story_As.popup_centered_ratio(0.7) 78 | 79 | 80 | func _on_Check_All_BTN_pressed(): 81 | var records = self._Dialog_Record_Root.get_children() 82 | for record in records: 83 | if record.visible: 84 | record.check() 85 | 86 | 87 | func _on_Close_BTN_pressed(): 88 | self.emit_signal("close_pressed") 89 | 90 | 91 | func _on_Create_Dialog_BTN_pressed(): 92 | self._create_dialog_record() 93 | 94 | 95 | func _on_Delete_Dialog_BTN_pressed(): 96 | self._delete_checked_dialogs() 97 | 98 | 99 | func _on_Delete_Group_BTN_pressed(): 100 | var idxs = self._Group_List.get_selected_items() 101 | var group 102 | for idx in idxs: 103 | group = self._Group_List.get_item_text(idx) 104 | self._Group_List.remove_item(idx) 105 | self._delete_group(group) 106 | self._populate_group_selector() 107 | self._populate_filter_menu() 108 | 109 | 110 | func _on_Dialog_changed_human_readable_text(did : int, new_text : String): 111 | self.set_dialog_property(did, "human_readable_description", new_text) 112 | self.emit_signal("changed_story") 113 | 114 | 115 | func _on_Dialog_checked(dialog): 116 | self._checked_dialogs.push_front(dialog) 117 | 118 | 119 | func _on_Dialog_edit_pressed(did : int): 120 | self.emit_signal("dialog_edit_pressed", self, did) 121 | 122 | 123 | func _on_Dialog_unchecked(dialog): 124 | self._checked_dialogs.erase(dialog) 125 | 126 | 127 | func _on_Filter_Menu_index_pressed(idx): 128 | var checked = self._Filter_Menu.get_popup().is_item_checked(idx) 129 | if not checked: 130 | self._Filter_Menu.get_popup().set_item_checked(idx, true) 131 | else: 132 | self._Filter_Menu.get_popup().set_item_checked(idx, false) 133 | self._update_filter() 134 | 135 | 136 | func _on_Group_Manager_BTN_toggled(button_pressed : bool): 137 | if button_pressed: 138 | self._Group_Manager_Panel.visible = true 139 | else: 140 | self._Group_Manager_Panel.visible = false 141 | 142 | 143 | func _on_Group_Selector_BTN_pressed(): 144 | self._populate_group_selector() 145 | 146 | 147 | func _on_Load_CSV_BTN_pressed(): 148 | self._Load_CSV.popup_centered_ratio(0.7) 149 | 150 | 151 | func _on_Load_CSV_file_selected(filepath : String): 152 | var csv_file = File.new() 153 | var status = csv_file.open(filepath, File.READ) 154 | 155 | if not status == OK: 156 | print_debug("EXP_Story_Editor: Error loading file \"" + filepath + "\".") 157 | return 158 | 159 | csv_file.get_csv_line() 160 | 161 | while not csv_file.eof_reached(): 162 | var line = csv_file.get_csv_line() 163 | 164 | if line.empty(): 165 | continue 166 | 167 | var did = int(line[0]) 168 | var nid = int(line[1]) 169 | var dialog = String(line[2]) 170 | 171 | if not self._story.has(did): 172 | continue 173 | if not self._story[did]["nodes"].has(nid): 174 | continue 175 | 176 | self._story[did]["nodes"][nid]["text"] = dialog 177 | 178 | csv_file.close() 179 | 180 | 181 | func _on_Load_Story_BTN_pressed(): 182 | self._Load_Story.popup_centered_ratio(0.7) 183 | 184 | 185 | func _on_Load_Story_file_selected(filename : String): 186 | var file_data = load(filename) 187 | if not file_data.TYPE == "EXP_Story_editor": 188 | return 189 | 190 | self._clear_story() 191 | self._load_data_from(file_data) 192 | self._Filename_LBL.text = filename.get_file() 193 | 194 | for group in self._groups: 195 | self._Group_List.add_item(group) 196 | self._populate_filter_menu() 197 | 198 | for did in self.get_dids(): 199 | var new_dialog_record = _Dialog_Record.instance() 200 | self._Dialog_Record_Root.add_child(new_dialog_record) 201 | new_dialog_record.set_story_editor(self) 202 | new_dialog_record.connect("checked", self, "_on_Dialog_checked") 203 | new_dialog_record.connect("unchecked", self, "_on_Dialog_unchecked") 204 | new_dialog_record.connect("changed_human_readable_text", self, 205 | "_on_Dialog_changed_human_readable_text") 206 | new_dialog_record.connect("edit_pressed", self, "_on_Dialog_edit_pressed") 207 | new_dialog_record.connect("rename_pressed", self, "_on_Record_Rename_pressed") 208 | 209 | new_dialog_record.set_did(did) 210 | var human_readable_description = self.get_dialog_property(did, "human_readable_description") 211 | new_dialog_record.update_human_readable_description(human_readable_description) 212 | 213 | if self._story[did].has("name"): 214 | var record_name = self._story[did]["name"] 215 | new_dialog_record.set_record_name(record_name) 216 | 217 | 218 | func _on_New_Story_BTN_pressed(): 219 | self._clear_story() 220 | 221 | 222 | func _on_Record_Rename_pressed(record): 223 | self._Record_Rename_Box.set_target_record(record) 224 | self._Record_Rename_Box.visible = true 225 | 226 | 227 | func _on_Remove_Group_BTN_pressed(): 228 | var id = self._Group_Selector.get_selected_id() 229 | if id == -1: 230 | return 231 | 232 | var idx = self._Group_Selector.get_item_index(id) 233 | var group = self._Group_Selector.get_popup().get_item_text(idx) 234 | for record in self._checked_dialogs.duplicate(): 235 | var did = record.get_did() 236 | self._dialog_remove_group(did, group) 237 | record.uncheck() 238 | self.emit_signal("changed_story") 239 | 240 | 241 | func _on_Rename_Box_Rename(rename : String): 242 | var record = self._Record_Rename_Box.get_target_record() 243 | var old_name = record.get_record_name() 244 | var record_did = record.get_did() 245 | 246 | if rename.empty() or rename == "NAME": 247 | record.set_record_name("NAME") 248 | self._story[record_did].erase("name") 249 | self._record_names.erase(old_name) 250 | return 251 | 252 | if self._record_names.has(rename): 253 | return 254 | 255 | self._record_names.erase(old_name) 256 | 257 | self._record_names[rename] = record_did 258 | self._story[record_did]["name"] = rename 259 | record.set_record_name(rename) 260 | 261 | 262 | func _on_Save_CSV_BTN_pressed(): 263 | self._Save_CSV_As.popup_centered_ratio(0.7) 264 | 265 | 266 | func _on_Save_CVS_As_file_selected(filepath : String): 267 | var csv_file = File.new() 268 | var status = csv_file.open(filepath, File.WRITE) 269 | 270 | if not status == OK: 271 | print_debug("EXP_Story_Editor: Error saving csv file \"" + filepath + "\".") 272 | return 273 | 274 | csv_file.store_csv_line(["DID", "NID", "Dialog"], ",") 275 | 276 | for did in self._story.keys(): 277 | for nid in self._story[did]["nodes"].keys(): 278 | var dialog = self._story[did]["nodes"][nid]["text"] 279 | csv_file.store_csv_line([did, nid, dialog], ",") 280 | 281 | csv_file.close() 282 | 283 | 284 | func _on_Save_Story_As_file_selected(filename : String): 285 | self._save_data_to(filename) 286 | self._Filename_LBL.text = filename.get_file() 287 | 288 | 289 | func _on_Save_Story_BTN_pressed(): 290 | self._Save_Story_As.popup_centered_ratio(0.7) 291 | 292 | 293 | func _on_Search_LineEdit_text_changed(new_text : String): 294 | self._update_filter() 295 | 296 | 297 | func _on_Search_OptionButton_item_selected(id): 298 | self._update_filter() 299 | 300 | 301 | func _on_story_menu_option_pressed(id): 302 | match id: 303 | 0: 304 | self._on_New_Story_BTN_pressed() 305 | 1: 306 | self._on_Load_Story_BTN_pressed() 307 | 2: 308 | self._on_Save_Story_BTN_pressed() 309 | 3: 310 | self._on_Bake_Story_BTN_pressed() 311 | 4: 312 | self._on_Save_CSV_BTN_pressed() 313 | 5: 314 | self._on_Load_CSV_BTN_pressed() 315 | 316 | 317 | func _on_Uncheck_All_BTN_pressed(): 318 | var records = self._Dialog_Record_Root.get_children() 319 | for record in records: 320 | if record.visible: 321 | record.uncheck() 322 | 323 | #Public Methods 324 | 325 | func create_node(did : int, type : String) -> int: 326 | var new_nid = self._generate_nid(did) 327 | var node_data = {"type": type, "text": "", "graph_offset": Vector2(40, 40), 328 | "rect_size": Vector2(0,0) ,"links": {}, "slot_amount": 1} 329 | self._story[did]["nodes"][new_nid] = node_data 330 | return new_nid 331 | 332 | func dialog_get_groups(did : int): 333 | return self._story[did]["groups"] 334 | 335 | 336 | func erase_all_links(did: int, nid : int): 337 | self._story[did]["nodes"][nid]["links"].clear() 338 | 339 | 340 | func erase_dialog(did : int): 341 | self._story.erase(did) 342 | self._make_did_available(did) 343 | 344 | 345 | func erase_link(did : int, nid : int, slot : int): 346 | self._story[did]["nodes"][nid]["links"].erase(slot) 347 | 348 | 349 | func erase_node(did :int, nid :int): 350 | self._story[did]["nodes"].erase(nid) 351 | self._make_nid_available(did, nid) 352 | 353 | 354 | func get_dialog_property(did : int, property: String): 355 | return self._story[did][property] 356 | 357 | 358 | func get_dids(): 359 | return self._story.keys() 360 | 361 | 362 | func get_link_slots(did : int, nid : int): 363 | return self._story[did]["nodes"][nid]["links"].keys() 364 | 365 | 366 | func get_nid_link_from(did : int, nid: int, slot : int): 367 | return self._story[did]["nodes"][nid]["links"][slot] 368 | 369 | 370 | func get_nids(did : int): 371 | return self._story[did]["nodes"].keys() 372 | 373 | 374 | func get_node_property(did : int, nid : int, property: String): 375 | return self._story[did]["nodes"][nid][property] 376 | 377 | 378 | func set_dialog_property(did : int, property : String , data): 379 | self._story[did][property] = data 380 | 381 | 382 | func set_link(did : int, this_nid : int, slot : int, that_nid : int): 383 | self._story[did]["nodes"][this_nid]["links"][slot] = that_nid 384 | 385 | 386 | func set_node_property(did : int, nid : int, property : String , data): 387 | self._story[did]["nodes"][nid][property] = data 388 | 389 | 390 | func set_node_slot_count(did : int, nid : int, amount : int): 391 | self._story[did]["nodes"][nid]["slot_amount"] = amount 392 | 393 | #Private Methods 394 | 395 | func _add_group(): 396 | var new_group_name = self._New_Group_LineEdit.text 397 | if new_group_name == "" or self._groups.has(new_group_name): 398 | return 399 | 400 | self._groups.push_back(new_group_name) 401 | self._New_Group_LineEdit.text = "" 402 | self._Group_List.add_item(new_group_name) 403 | self._populate_filter_menu() 404 | 405 | var sort_list : Array 406 | for idx in range(self._Group_List.get_item_count()): 407 | var group = self._Group_List.get_item_text(idx) 408 | sort_list.push_back(group) 409 | sort_list.sort() 410 | self._Group_List.clear() 411 | for group in sort_list: 412 | self._Group_List.add_item(group) 413 | 414 | 415 | func _bake_data() : 416 | var baked_story = self._story.duplicate(true) 417 | for did in baked_story.keys(): 418 | baked_story[did].erase("name") 419 | baked_story[did].erase("groups") 420 | baked_story[did].erase("available_nid") 421 | baked_story[did].erase("human_readable_description") 422 | for nid in baked_story[did]["nodes"].keys(): 423 | baked_story[did]["nodes"][nid].erase("type") 424 | baked_story[did]["nodes"][nid].erase("graph_offset") 425 | baked_story[did]["nodes"][nid].erase("rect_size") 426 | baked_story[did]["nodes"][nid].erase("slot_amount") 427 | return baked_story.duplicate(true) 428 | 429 | 430 | func _bake_data_to(filename): 431 | var file_data 432 | if self._Dir.file_exists(filename): 433 | file_data = load(filename) 434 | if file_data.TYPE == "EXP_Baked_Story": 435 | file_data.story = self._bake_data() 436 | file_data.names = self._record_names.duplicate(true) 437 | ResourceSaver.save(filename, file_data) 438 | else: 439 | file_data = _EXP_Baked_Story.new() 440 | file_data.story = self._bake_data() 441 | file_data.names = self._record_names.duplicate(true) 442 | ResourceSaver.save(filename, file_data) 443 | 444 | 445 | func _clear_group_manager(): 446 | self._groups.clear() 447 | for idx in range(self._Group_List.get_item_count()): 448 | self._Group_List.remove_item(0) 449 | self._populate_group_selector() 450 | self._Filter_Menu.get_popup().clear() 451 | 452 | 453 | func _clear_story(): 454 | self._remove_all_records() 455 | self._clear_group_manager() 456 | self._populate_filter_menu() 457 | self._story.clear() 458 | self._available_dids.clear() 459 | self._checked_dialogs.clear() 460 | self._record_names.clear() 461 | self._Filename_LBL.text = "Unsaved Story" 462 | self.emit_signal("changed_story") 463 | 464 | 465 | func _create_dialog() -> int: 466 | var new_did = self._generate_did() 467 | var dialog_data = {"human_readable_description": 468 | "New Dialog - Enter Human Readable Description", 469 | "groups": [], 470 | "available_nid": [], 471 | "nodes": {}} 472 | self._story[new_did] = dialog_data 473 | return new_did 474 | 475 | 476 | func _create_dialog_record(): 477 | var new_did = self._create_dialog() 478 | 479 | var new_dialog_record = _Dialog_Record.instance() 480 | self._Dialog_Record_Root.add_child(new_dialog_record) 481 | new_dialog_record.set_story_editor(self) 482 | 483 | new_dialog_record.connect("checked", self, "_on_Dialog_checked") 484 | new_dialog_record.connect("unchecked", self, "_on_Dialog_unchecked") 485 | new_dialog_record.connect("changed_human_readable_text", self, 486 | "_on_Dialog_changed_human_readable_text") 487 | new_dialog_record.connect("edit_pressed", self, "_on_Dialog_edit_pressed") 488 | new_dialog_record.connect("rename_pressed", self, "_on_Record_Rename_pressed") 489 | 490 | new_dialog_record.set_did(new_did) 491 | new_dialog_record.update_human_readable_description( 492 | "New Dialog - Enter Human Readable Description.") 493 | 494 | 495 | func _create_rename_box(): 496 | self._Record_Rename_Box = _Record_Rename_Box_TSCN.instance() 497 | self._Record_Rename_Box.connect("rename_BTN_pressed", self, "_on_Rename_Box_Rename") 498 | self.add_child(self._Record_Rename_Box) 499 | 500 | 501 | func _delete_checked_dialogs(): 502 | for dialog in self._checked_dialogs: 503 | self._delete_dialog(dialog) 504 | self._checked_dialogs.clear() 505 | self.emit_signal("changed_story") 506 | 507 | 508 | func _delete_dialog(dialog): 509 | var did = dialog.get_did() 510 | self.erase_dialog(did) 511 | self._remove_record(dialog) 512 | 513 | 514 | func _delete_group(group): 515 | self._groups.erase(group) 516 | self._remove_group_from_story(group) 517 | 518 | 519 | func _dialog_apply_group(did : int, group : String): 520 | if not self._story[did]["groups"].has(group): 521 | self._story[did]["groups"].push_back(group) 522 | 523 | 524 | func _dialog_remove_group(did : int, group : String): 525 | if self._story[did]["groups"].has(group): 526 | self._story[did]["groups"].erase(group) 527 | 528 | 529 | func _generate_did() -> int: 530 | if not self._available_dids.empty(): 531 | return self._available_dids.pop_front() 532 | else: 533 | return self._story.size() + 1 534 | 535 | 536 | func _generate_nid(did : int) -> int: 537 | if not self._story[did]["available_nid"].empty(): 538 | return self._story[did]["available_nid"].pop_front() 539 | else: 540 | return self._story[did]["nodes"].size() + 1 541 | 542 | 543 | func _load_data_from(new_story): 544 | self._story = new_story.story.duplicate(true) 545 | self._available_dids = new_story.available_dids.duplicate(true) 546 | self._groups = new_story.groups.duplicate(true) 547 | self._record_names = new_story.names.duplicate(true) 548 | 549 | 550 | 551 | func _make_did_available(did : int): 552 | self._available_dids.push_front(did) 553 | self._available_dids.sort() 554 | 555 | 556 | func _make_nid_available(did : int, nid : int): 557 | self._story[did]["available_nid"].push_front(nid) 558 | self._story[did]["available_nid"].sort() 559 | 560 | 561 | func _make_records_visible(): 562 | var children = self._Dialog_Record_Root.get_children() 563 | for child in children: 564 | child.visible = true 565 | 566 | 567 | func _populate_filter_menu(): 568 | self._Filter_Menu.get_popup().clear() 569 | self._Filter_Menu.get_popup().add_check_item("-No Tags-") 570 | for group in self._groups: 571 | self._Filter_Menu.get_popup().add_check_item(group) 572 | for idx in range(self._Filter_Menu.get_popup().get_item_count()): 573 | self._Filter_Menu.get_popup().set_item_checked(idx, true) 574 | 575 | 576 | func _populate_group_selector(): 577 | self._Group_Selector.clear() 578 | self._Group_Selector.text = "Tags" 579 | for group in self._groups: 580 | self._Group_Selector.get_popup().add_item(group) 581 | 582 | 583 | func _populate_searchby_menu(): 584 | self._Search_Option_BTN.clear() 585 | self._Search_Option_BTN.get_popup().add_item("Human Readable LBL", 0) 586 | self._Search_Option_BTN.get_popup().add_item("DID", 1) 587 | self._Search_Option_BTN.get_popup().add_item("Record Name", 2) 588 | self._Search_Option_BTN.select(0) 589 | 590 | func _populate_story_menu(): 591 | self._Story_Menu.get_popup().clear() 592 | self._Story_Menu.get_popup().add_item("New Story", 0) 593 | self._Story_Menu.get_popup().add_item("Load Story", 1) 594 | self._Story_Menu.get_popup().add_item("Save Story As", 2) 595 | self._Story_Menu.get_popup().add_item("Bake Story As", 3) 596 | self._Story_Menu.get_popup().add_item("Save CSV As", 4) 597 | self._Story_Menu.get_popup().add_item("Load CSV", 5) 598 | self._Story_Menu.get_popup().connect("id_pressed", self, "_on_story_menu_option_pressed") 599 | 600 | 601 | func _remove_all_records(): 602 | var dialog_records = self._Dialog_Record_Root.get_children() 603 | for record in dialog_records: 604 | self._remove_record(record) 605 | 606 | 607 | func _remove_group_from_story(group : String): 608 | for did in self._story: 609 | if self._story[did]["groups"].has(group): 610 | self._story[did]["groups"].erase(group) 611 | 612 | 613 | func _remove_record(dialog_record): 614 | dialog_record.disconnect("checked", self, "_on_Dialog_checked") 615 | dialog_record.disconnect("unchecked", self, "_on_Dialog_unchecked") 616 | dialog_record.disconnect("changed_human_readable_text", self, 617 | "_on_Dialog_changed_human_readable_text") 618 | dialog_record.disconnect("rename_pressed", self, "_on_Record_Rename_pressed") 619 | var record_name = dialog_record.get_record_name() 620 | if not record_name == "NAME": 621 | self._record_names.erase(record_name) 622 | 623 | dialog_record.free() 624 | 625 | 626 | func _save_data_to(filename): 627 | var file_data 628 | if self._Dir.file_exists(filename): 629 | file_data = load(filename) 630 | if file_data.TYPE == "EXP_Story_editor": 631 | file_data.names = self._record_names.duplicate(true) 632 | file_data.story = self._story.duplicate(true) 633 | file_data.available_dids = self._available_dids.duplicate(true) 634 | file_data.groups = self._groups.duplicate(true) 635 | ResourceSaver.save(filename, file_data) 636 | else: 637 | file_data = _EXP_Story.new() 638 | file_data.names = self._record_names.duplicate(true) 639 | file_data.story = self._story.duplicate(true) 640 | file_data.available_dids = self._available_dids.duplicate(true) 641 | file_data.groups = self._groups.duplicate(true) 642 | ResourceSaver.save(filename, file_data) 643 | 644 | 645 | func _setup_dialogs(): 646 | self._Load_Story = EditorFileDialog.new() 647 | self._Load_Story.mode = EditorFileDialog.MODE_OPEN_FILE 648 | self._Load_Story.add_filter("*.tres ; Story files") 649 | self._Load_Story.resizable = true 650 | self._Load_Story.access = EditorFileDialog.ACCESS_RESOURCES 651 | self._Load_Story.current_dir = "res://" 652 | self._Load_Story.connect("file_selected", self, "_on_Load_Story_file_selected") 653 | self.add_child(self._Load_Story) 654 | 655 | self._Save_Story_As = EditorFileDialog.new() 656 | self._Save_Story_As.mode = EditorFileDialog.MODE_SAVE_FILE 657 | self._Save_Story_As.add_filter("*.tres ; Story files") 658 | self._Save_Story_As.resizable = true 659 | self._Save_Story_As.access = EditorFileDialog.ACCESS_RESOURCES 660 | self._Save_Story_As.current_dir = "res://" 661 | self._Save_Story_As.connect("file_selected", self, "_on_Save_Story_As_file_selected") 662 | self.add_child(self._Save_Story_As) 663 | 664 | self._Bake_Story_As = EditorFileDialog.new() 665 | self._Bake_Story_As.mode = EditorFileDialog.MODE_SAVE_FILE 666 | self._Bake_Story_As.add_filter("*.tres ; Baked Story files") 667 | self._Bake_Story_As.resizable = true 668 | self._Bake_Story_As.access = EditorFileDialog.ACCESS_RESOURCES 669 | self._Bake_Story_As.current_dir = "res://" 670 | self._Bake_Story_As.connect("file_selected", self, "_on_Bake_Story_As_file_selected") 671 | self.add_child(self._Bake_Story_As) 672 | 673 | self._Save_CSV_As = EditorFileDialog.new() 674 | self._Save_CSV_As.mode = EditorFileDialog.MODE_SAVE_FILE 675 | self._Save_CSV_As.add_filter("*.csv ; CSV files") 676 | self._Save_CSV_As.resizable = true 677 | self._Save_CSV_As.access = EditorFileDialog.ACCESS_FILESYSTEM 678 | self._Save_CSV_As.current_dir = "res://" 679 | self._Save_CSV_As.connect("file_selected", self, "_on_Save_CVS_As_file_selected") 680 | self.add_child(self._Save_CSV_As) 681 | 682 | self._Load_CSV = EditorFileDialog.new() 683 | self._Load_CSV .mode = EditorFileDialog.MODE_OPEN_FILE 684 | self._Load_CSV .add_filter("*.csv ; CSV files") 685 | self._Load_CSV .resizable = true 686 | self._Load_CSV .access = EditorFileDialog.ACCESS_FILESYSTEM 687 | self._Load_CSV .current_dir = "res://" 688 | self._Load_CSV .connect("file_selected", self, "_on_Load_CSV_file_selected") 689 | self.add_child(self._Load_CSV) 690 | 691 | 692 | func _update_filter(): 693 | var new_text = self._Search_LineEdit.text 694 | self._make_records_visible() 695 | 696 | var filter_groups : Array 697 | for idx in range(self._Filter_Menu.get_popup().get_item_count()): 698 | if self._Filter_Menu.get_popup().is_item_checked(idx): 699 | var group = self._Filter_Menu.get_popup().get_item_text(idx) 700 | filter_groups.push_back(group) 701 | 702 | var children = self._Dialog_Record_Root.get_children() 703 | 704 | var search_option = self._Search_Option_BTN.selected 705 | 706 | match search_option: 707 | 0: #Human Readable Search 708 | for child in children: 709 | var did = child.get_did() 710 | var human_readable_description = self.get_dialog_property(did, "human_readable_description") 711 | if human_readable_description.find(new_text) == -1 and not new_text.empty(): 712 | child.visible = false 713 | else: 714 | child.visible = false 715 | if self._Filter_Menu.get_popup().get_item_count() == 0: 716 | child.visible = true 717 | var dialog_groups = self.dialog_get_groups(did) 718 | if dialog_groups.empty() and filter_groups.has("-No Tags-"): 719 | child.visible = true 720 | for group in dialog_groups: 721 | if filter_groups.has(group): 722 | child.visible = true 723 | 1: #DID Search 724 | for child in children: 725 | var did = child.get_did() 726 | if not new_text == str(did) and not new_text.empty(): 727 | child.visible = false 728 | else: 729 | child.visible = false 730 | if self._Filter_Menu.get_popup().get_item_count() == 0: 731 | child.visible = true 732 | var dialog_groups = self.dialog_get_groups(did) 733 | if dialog_groups.empty() and filter_groups.has("-No Tags-"): 734 | child.visible = true 735 | for group in dialog_groups: 736 | if filter_groups.has(group): 737 | child.visible = true 738 | 2: #Record Name Search 739 | for child in children: 740 | var did = child.get_did() 741 | var record_name = child.get_record_name() 742 | if record_name.find(new_text) == -1 and not new_text.empty(): 743 | child.visible = false 744 | else: 745 | child.visible = false 746 | if self._Filter_Menu.get_popup().get_item_count() == 0: 747 | child.visible = true 748 | var dialog_groups = self.dialog_get_groups(did) 749 | if dialog_groups.empty() and filter_groups.has("-No Tags-"): 750 | child.visible = true 751 | for group in dialog_groups: 752 | if filter_groups.has(group): 753 | child.visible = true 754 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="EXP_Dialog" 4 | description="EXPWorld's dialog technology." 5 | author="David Lipps @ EXPWorlds" 6 | version="1.1.0" 7 | script="plugin.gd" 8 | -------------------------------------------------------------------------------- /addons/EXP-System-Dialog/plugin.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends EditorPlugin 3 | 4 | var _Story_Editor = preload("res://addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn") 5 | var _Story_Editor_Instance 6 | var _Story_Editor_BTN : ToolButton 7 | var _Dialog_Editor = preload("res://addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn") 8 | var _Dialog_Editor_Instance 9 | var _Dialog_Editor_BTN : ToolButton 10 | 11 | 12 | func _enter_tree(): 13 | 14 | self._Story_Editor_Instance = self._Story_Editor.instance() 15 | self._Story_Editor_Instance.connect("close_pressed", self, "_on_StoryFile_Editor_close_pressed") 16 | self._Story_Editor_BTN = self.add_control_to_bottom_panel(self._Story_Editor_Instance, "EXP StoryFile Editor") 17 | self._Story_Editor_Instance.visible = false 18 | self._Story_Editor_BTN.visible = false 19 | self.add_tool_menu_item("EXP StoryFile Editor", self, "_on_StoryFile_Editor_opened") 20 | 21 | self._Dialog_Editor_Instance = self._Dialog_Editor.instance() 22 | self._Dialog_Editor_BTN = self.add_control_to_bottom_panel(self._Dialog_Editor_Instance, "EXP Dialog Editor") 23 | self._Dialog_Editor_BTN.visible = false 24 | 25 | self._Story_Editor_Instance.connect("dialog_edit_pressed", 26 | self, "_on_Story_Editor_dialog_edit_pressed") 27 | self._Story_Editor_Instance.connect("dialog_edit_pressed", 28 | self._Dialog_Editor_Instance, "_on_Story_Editor_dialog_edit_pressed") 29 | self._Dialog_Editor_Instance.connect("close_BTN_pressed", self, 30 | "_on_Dialog_Editor_close_BTN_pressed") 31 | self._Dialog_Editor_Instance.connect("back_BTN_pressed", self, 32 | "_on_Dialog_Editor_back_BTN_pressed") 33 | self._Story_Editor_Instance.connect("changed_story", self, 34 | "_on_Story_Editor_changed_story") 35 | 36 | 37 | func _exit_tree(): 38 | 39 | self._Story_Editor_Instance.disconnect("dialog_edit_pressed", 40 | self, "_on_Story_Editor_dialog_edit_pressed") 41 | self._Story_Editor_Instance.disconnect("dialog_edit_pressed", 42 | self._Dialog_Editor_Instance, "_on_Story_Editor_dialog_edit_pressed") 43 | self._Dialog_Editor_Instance.disconnect("close_BTN_pressed", self, 44 | "_on_Dialog_Editor_close_BTN_pressed") 45 | self._Dialog_Editor_Instance.disconnect("back_BTN_pressed", self, 46 | "_on_Dialog_Editor_back_BTN_pressed") 47 | self._Story_Editor_Instance.disconnect("changed_story", self, 48 | "_on_Story_Editor_changed_story") 49 | 50 | self.remove_control_from_bottom_panel(self._Story_Editor_Instance) 51 | self._Story_Editor_Instance.queue_free() 52 | self.remove_control_from_bottom_panel(self._Dialog_Editor_Instance) 53 | self._Dialog_Editor_Instance.queue_free() 54 | self.remove_tool_menu_item("EXP StoryFile Editor") 55 | 56 | 57 | func _on_Story_Editor_dialog_edit_pressed(story, did): 58 | self._Dialog_Editor_BTN.visible = true 59 | self._Story_Editor_BTN.pressed = false 60 | self._Dialog_Editor_BTN.pressed = true 61 | self._Dialog_Editor_BTN.emit_signal("pressed") 62 | 63 | 64 | func _on_Dialog_Editor_close_BTN_pressed(): 65 | self._Dialog_Editor_BTN.pressed = false 66 | self._Dialog_Editor_BTN.visible = false 67 | 68 | 69 | func _on_Story_Editor_changed_story(): 70 | self._Dialog_Editor_BTN.visible = false 71 | 72 | 73 | func _on_Dialog_Editor_back_BTN_pressed(): 74 | self._Story_Editor_BTN.pressed = true 75 | self._Dialog_Editor_BTN.pressed = false 76 | self._Story_Editor_BTN.emit_signal("pressed") 77 | 78 | 79 | func _on_StoryFile_Editor_opened(trash_parameter): 80 | self._Story_Editor_BTN.visible = true 81 | 82 | 83 | func _on_StoryFile_Editor_close_pressed(): 84 | self._Story_Editor_Instance.visible = false 85 | self._Story_Editor_BTN.visible = false 86 | self._Dialog_Editor_Instance.visible = false 87 | self._Dialog_Editor_BTN.visible = false 88 | -------------------------------------------------------------------------------- /export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="HTML5" 4 | platform="HTML5" 5 | runnable=true 6 | custom_features="" 7 | export_filter="all_resources" 8 | include_filter="" 9 | exclude_filter="" 10 | export_path="" 11 | patch_list=PoolStringArray( ) 12 | script_export_mode=1 13 | script_encryption_key="" 14 | 15 | [preset.0.options] 16 | 17 | vram_texture_compression/for_desktop=true 18 | vram_texture_compression/for_mobile=false 19 | html/custom_html_shell="" 20 | html/head_include="" 21 | custom_template/release="" 22 | custom_template/debug="" 23 | 24 | [preset.1] 25 | 26 | name="Linux/X11" 27 | platform="Linux/X11" 28 | runnable=true 29 | custom_features="" 30 | export_filter="all_resources" 31 | include_filter="" 32 | exclude_filter="" 33 | export_path="" 34 | patch_list=PoolStringArray( ) 35 | script_export_mode=1 36 | script_encryption_key="" 37 | 38 | [preset.1.options] 39 | 40 | texture_format/bptc=false 41 | texture_format/s3tc=true 42 | texture_format/etc=false 43 | texture_format/etc2=false 44 | texture_format/no_bptc_fallbacks=true 45 | binary_format/64_bits=true 46 | custom_template/release="" 47 | custom_template/debug="" 48 | 49 | [preset.2] 50 | 51 | name="Windows Desktop" 52 | platform="Windows Desktop" 53 | runnable=true 54 | custom_features="" 55 | export_filter="all_resources" 56 | include_filter="" 57 | exclude_filter="" 58 | export_path="" 59 | patch_list=PoolStringArray( ) 60 | script_export_mode=1 61 | script_encryption_key="" 62 | 63 | [preset.2.options] 64 | 65 | texture_format/bptc=false 66 | texture_format/s3tc=true 67 | texture_format/etc=false 68 | texture_format/etc2=false 69 | texture_format/no_bptc_fallbacks=true 70 | binary_format/64_bits=true 71 | custom_template/release="" 72 | custom_template/debug="" 73 | application/icon="" 74 | application/file_version="" 75 | application/product_version="" 76 | application/company_name="" 77 | application/product_name="" 78 | application/file_description="" 79 | application/copyright="" 80 | application/trademarks="" 81 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EXPWorlds/Godot-Tutorials/05aab338ce88a91a64ca76b85ad9f32ca501242c/icon.png -------------------------------------------------------------------------------- /icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ ] 12 | _global_script_class_icons={ 13 | 14 | } 15 | 16 | [application] 17 | 18 | config/name="Dave the Dev Tutorials" 19 | config/icon="res://icon.png" 20 | 21 | [display] 22 | 23 | window/size/width=1080 24 | window/size/height=768 25 | mouse_cursor/custom_image="res://7 Custom Mouse Cursor/Tutorial/Mouse_Curser.png" 26 | 27 | [editor_plugins] 28 | 29 | enabled=PoolStringArray( "EXP-System-Dialog" ) 30 | 31 | [rendering] 32 | 33 | quality/filters/msaa=2 34 | --------------------------------------------------------------------------------