diff --git a/.github/workflows/godot.yml b/.github/workflows/godot.yml new file mode 100644 index 0000000..b3c4412 --- /dev/null +++ b/.github/workflows/godot.yml @@ -0,0 +1,32 @@ +name: Build Godot Project + +on: + push: + branches: [main, develop, "releases/**"] + pull_request: + branches: [main, develop, "releases/**"] + +jobs: + Godot: + timeout-minutes: 15 + continue-on-error: true + runs-on: ubuntu-latest + strategy: + matrix: + platform: [linux, windows] + steps: + - uses: actions/checkout@v2 + with: + lfs: true + - name: Build + id: build + uses: manleydev/build-godot-action@v1.4.1 + with: + name: My Simulation + preset: ${{ matrix.platform }} + debugMode: "true" + # - name: Upload Artifact + # uses: actions/upload-artifact@v2 + # with: + # name: Client - ${{ matrix.platform }} + # path: ${{ github.workspace }}/${{ steps.build.outputs.build }} diff --git a/.gitignore b/.gitignore index f868dda..26147bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,6 @@ # File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig -# Created by https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,macos,linux,godot,executable,backup,archives -# Edit at https://www.toptal.com/developers/gitignore?templates=windows,visualstudiocode,macos,linux,godot,executable,backup,archives - -### Archives ### -# It's better to unpack these files and commit the raw source because -# git has its own built in compression methods. -*.7z -*.jar -*.rar -*.zip -*.gz -*.gzip -*.tgz -*.bzip -*.bzip2 -*.bz2 -*.xz -*.lzma -*.cab -*.xar - -# Packing-only formats -*.iso -*.tar - -# Package management formats -*.dmg -*.xpi -*.gem -*.egg -*.deb -*.rpm -*.msi -*.msm -*.msp -*.txz +# Created by https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,macos,linux,godot,executable,backup +# Edit at https://www.toptal.com/developers/gitignore?templates=windows,visualstudiocode,macos,linux,godot,executable,backup ### Backup ### *.bak @@ -50,6 +16,7 @@ *.com *.exe *.gadget +*.jar *.pif *.vb *.wsf @@ -89,7 +56,8 @@ data_*/ .LSOverride # Icon must end with two \r -Icon +Icon + # Thumbnails ._* @@ -133,12 +101,6 @@ Temporary Items .history .ionide -# Support for Project snippet scope -.vscode/*.code-snippets - -# Ignore code-workspaces -*.code-workspace - ### Windows ### # Windows thumbnail cache files Thumbs.db @@ -156,13 +118,17 @@ ehthumbs_vista.db $RECYCLE.BIN/ # Windows Installer files +*.cab +*.msi *.msix +*.msm +*.msp # Windows shortcuts *.lnk -# End of https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,macos,linux,godot,executable,backup,archives +# End of https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,macos,linux,godot,executable,backup # Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) -export/** +!export_presets.cfg \ No newline at end of file diff --git a/addons/beehave/blackboard.gd b/addons/beehave/blackboard.gd new file mode 100644 index 0000000..4cff1ce --- /dev/null +++ b/addons/beehave/blackboard.gd @@ -0,0 +1,24 @@ +extends Reference + +var blackboard = {} + +func set(key, value, blackboard_name = 'default'): + if not blackboard.has(blackboard_name): + blackboard[blackboard_name] = {} + + blackboard[blackboard_name][key] = value + + +func get(key, default_value = null, blackboard_name = 'default'): + if has(key, blackboard_name): + return blackboard[blackboard_name].get(key, default_value) + return default_value + + +func has(key, blackboard_name = 'default'): + return blackboard.has(blackboard_name) and blackboard[blackboard_name].has(key) and blackboard[blackboard_name][key] != null + + +func erase(key, blackboard_name = 'default'): + if blackboard.has(blackboard_name): + blackboard[blackboard_name][key] = null diff --git a/addons/beehave/icons/action.svg b/addons/beehave/icons/action.svg new file mode 100644 index 0000000..7c224d5 --- /dev/null +++ b/addons/beehave/icons/action.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/action.svg.import b/addons/beehave/icons/action.svg.import new file mode 100644 index 0000000..ee085b3 --- /dev/null +++ b/addons/beehave/icons/action.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/action.svg-e8a91246d0ba9ba3cf84290d65648f06.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/action.svg" +dest_files=[ "res://.import/action.svg-e8a91246d0ba9ba3cf84290d65648f06.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/blackboard.svg b/addons/beehave/icons/blackboard.svg new file mode 100644 index 0000000..af009c6 --- /dev/null +++ b/addons/beehave/icons/blackboard.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/blackboard.svg.import b/addons/beehave/icons/blackboard.svg.import new file mode 100644 index 0000000..fd5d540 --- /dev/null +++ b/addons/beehave/icons/blackboard.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/blackboard.svg-18d4dfd4f6de558de250b67251ff1e69.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/blackboard.svg" +dest_files=[ "res://.import/blackboard.svg-18d4dfd4f6de558de250b67251ff1e69.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/category_bt.svg b/addons/beehave/icons/category_bt.svg new file mode 100644 index 0000000..ab92d03 --- /dev/null +++ b/addons/beehave/icons/category_bt.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/category_bt.svg.import b/addons/beehave/icons/category_bt.svg.import new file mode 100644 index 0000000..f8400a5 --- /dev/null +++ b/addons/beehave/icons/category_bt.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/category_bt.svg-8537bebd1c5f62dca3d7ee7f17efeed4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/category_bt.svg" +dest_files=[ "res://.import/category_bt.svg-8537bebd1c5f62dca3d7ee7f17efeed4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/category_composite.svg b/addons/beehave/icons/category_composite.svg new file mode 100644 index 0000000..0f157de --- /dev/null +++ b/addons/beehave/icons/category_composite.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/category_composite.svg.import b/addons/beehave/icons/category_composite.svg.import new file mode 100644 index 0000000..75f2a39 --- /dev/null +++ b/addons/beehave/icons/category_composite.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/category_composite.svg-43f66e63a7ccfa5ac8ec6da0583b3246.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/category_composite.svg" +dest_files=[ "res://.import/category_composite.svg-43f66e63a7ccfa5ac8ec6da0583b3246.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/category_decorator.svg b/addons/beehave/icons/category_decorator.svg new file mode 100644 index 0000000..02c0375 --- /dev/null +++ b/addons/beehave/icons/category_decorator.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/category_decorator.svg.import b/addons/beehave/icons/category_decorator.svg.import new file mode 100644 index 0000000..b4687fd --- /dev/null +++ b/addons/beehave/icons/category_decorator.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/category_decorator.svg-79d598d6456f32724156248e09d6eaf3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/category_decorator.svg" +dest_files=[ "res://.import/category_decorator.svg-79d598d6456f32724156248e09d6eaf3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/condition.svg b/addons/beehave/icons/condition.svg new file mode 100644 index 0000000..5d7bbb0 --- /dev/null +++ b/addons/beehave/icons/condition.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/condition.svg.import b/addons/beehave/icons/condition.svg.import new file mode 100644 index 0000000..9e499d7 --- /dev/null +++ b/addons/beehave/icons/condition.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/condition.svg-57892684b10a64086f68c09c388b17e5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/condition.svg" +dest_files=[ "res://.import/condition.svg-57892684b10a64086f68c09c388b17e5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/fail.svg b/addons/beehave/icons/fail.svg new file mode 100644 index 0000000..d96bb98 --- /dev/null +++ b/addons/beehave/icons/fail.svg @@ -0,0 +1,66 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/fail.svg.import b/addons/beehave/icons/fail.svg.import new file mode 100644 index 0000000..103fcc3 --- /dev/null +++ b/addons/beehave/icons/fail.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fail.svg-85247bd8065819a11b971d222d3d43bb.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/fail.svg" +dest_files=[ "res://.import/fail.svg-85247bd8065819a11b971d222d3d43bb.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/inverter.svg b/addons/beehave/icons/inverter.svg new file mode 100644 index 0000000..45b8e97 --- /dev/null +++ b/addons/beehave/icons/inverter.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/inverter.svg.import b/addons/beehave/icons/inverter.svg.import new file mode 100644 index 0000000..a3b53d7 --- /dev/null +++ b/addons/beehave/icons/inverter.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/inverter.svg-1f1b976d95de42c4ad99a92fa9a6c5d0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/inverter.svg" +dest_files=[ "res://.import/inverter.svg-1f1b976d95de42c4ad99a92fa9a6c5d0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/limiter.svg b/addons/beehave/icons/limiter.svg new file mode 100644 index 0000000..2d6bbb6 --- /dev/null +++ b/addons/beehave/icons/limiter.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/limiter.svg.import b/addons/beehave/icons/limiter.svg.import new file mode 100644 index 0000000..8a02cf0 --- /dev/null +++ b/addons/beehave/icons/limiter.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/limiter.svg-b4c7646605c46f53c5e403fe21d8f584.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/limiter.svg" +dest_files=[ "res://.import/limiter.svg-b4c7646605c46f53c5e403fe21d8f584.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/selector.svg b/addons/beehave/icons/selector.svg new file mode 100644 index 0000000..01b107a --- /dev/null +++ b/addons/beehave/icons/selector.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/selector.svg.import b/addons/beehave/icons/selector.svg.import new file mode 100644 index 0000000..05bed9c --- /dev/null +++ b/addons/beehave/icons/selector.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/selector.svg-78bccfc448bd1676b5a29bfde4b08e5b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/selector.svg" +dest_files=[ "res://.import/selector.svg-78bccfc448bd1676b5a29bfde4b08e5b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/selector_star.svg b/addons/beehave/icons/selector_star.svg new file mode 100644 index 0000000..e112337 --- /dev/null +++ b/addons/beehave/icons/selector_star.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/beehave/icons/selector_star.svg.import b/addons/beehave/icons/selector_star.svg.import new file mode 100644 index 0000000..2b6ac98 --- /dev/null +++ b/addons/beehave/icons/selector_star.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/selector_star.svg-368af7abfb9842c3f4258786871d1f03.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/selector_star.svg" +dest_files=[ "res://.import/selector_star.svg-368af7abfb9842c3f4258786871d1f03.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/addons/beehave/icons/sequencer.svg b/addons/beehave/icons/sequencer.svg new file mode 100644 index 0000000..1304ab0 --- /dev/null +++ b/addons/beehave/icons/sequencer.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/sequencer.svg.import b/addons/beehave/icons/sequencer.svg.import new file mode 100644 index 0000000..c4358f4 --- /dev/null +++ b/addons/beehave/icons/sequencer.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/sequencer.svg-a7b0e1cc6b00c0067836f9a81d0b2f9b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/sequencer.svg" +dest_files=[ "res://.import/sequencer.svg-a7b0e1cc6b00c0067836f9a81d0b2f9b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/sequencer_star.svg b/addons/beehave/icons/sequencer_star.svg new file mode 100644 index 0000000..66efd5c --- /dev/null +++ b/addons/beehave/icons/sequencer_star.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/beehave/icons/sequencer_star.svg.import b/addons/beehave/icons/sequencer_star.svg.import new file mode 100644 index 0000000..6bfbf77 --- /dev/null +++ b/addons/beehave/icons/sequencer_star.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/sequencer_star.svg-2385cbba0c38b4d4ec43e0996f8a3493.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/sequencer_star.svg" +dest_files=[ "res://.import/sequencer_star.svg-2385cbba0c38b4d4ec43e0996f8a3493.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/addons/beehave/icons/succeed.svg b/addons/beehave/icons/succeed.svg new file mode 100644 index 0000000..d8c5133 --- /dev/null +++ b/addons/beehave/icons/succeed.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/succeed.svg.import b/addons/beehave/icons/succeed.svg.import new file mode 100644 index 0000000..0b98563 --- /dev/null +++ b/addons/beehave/icons/succeed.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/succeed.svg-c70f0a6f3d9b2864e4771942f0762307.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/succeed.svg" +dest_files=[ "res://.import/succeed.svg-c70f0a6f3d9b2864e4771942f0762307.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/icons/tree.svg b/addons/beehave/icons/tree.svg new file mode 100644 index 0000000..26dac9f --- /dev/null +++ b/addons/beehave/icons/tree.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/beehave/icons/tree.svg.import b/addons/beehave/icons/tree.svg.import new file mode 100644 index 0000000..028a5a1 --- /dev/null +++ b/addons/beehave/icons/tree.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/tree.svg-c0b20ed88b2fe300c0296f7236049076.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/beehave/icons/tree.svg" +dest_files=[ "res://.import/tree.svg-c0b20ed88b2fe300c0296f7236049076.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/beehave/nodes/beehave_node.gd b/addons/beehave/nodes/beehave_node.gd new file mode 100644 index 0000000..d52e67b --- /dev/null +++ b/addons/beehave/nodes/beehave_node.gd @@ -0,0 +1,8 @@ +extends BeehaveTree + +class_name BeehaveNode, "../icons/action.svg" + +enum { SUCCESS, FAILURE, RUNNING } + +func tick(actor, blackboard): + pass diff --git a/addons/beehave/nodes/beehave_root.gd b/addons/beehave/nodes/beehave_root.gd new file mode 100644 index 0000000..5201cc7 --- /dev/null +++ b/addons/beehave/nodes/beehave_root.gd @@ -0,0 +1,84 @@ +extends BeehaveTree + +class_name BeehaveRoot, "../icons/tree.svg" + +const Blackboard = preload("../blackboard.gd") +const SUCCESS = 0 +const FAILURE = 1 +const RUNNING = 2 + +enum ProcessMode { + PHYSICS_PROCESS, + IDLE, + MANUAL +} + +export (ProcessMode) var process_mode = ProcessMode.PHYSICS_PROCESS setget set_process_mode +export (bool) var enabled = true + +export (NodePath) var actor_node_path + +var actor : Node + +onready var blackboard = Blackboard.new() + +func _ready(): + if self.get_child_count() != 1: + push_error("Beehave error: Root %s should have one child (NodePath: %s)" % [self.name, self.get_path()]) + disable() + return + + actor = get_parent() + if actor_node_path: + actor = get_node(actor_node_path) + + set_process_mode(self.process_mode) + +func _process(delta): + tick(delta) + +func _physics_process(delta): + tick(delta) + +func tick(delta): + blackboard.set("delta", delta) + + var status = self.get_child(0).tick(actor, blackboard) + + if status != RUNNING: + blackboard.set("running_action", null) + +func get_running_action(): + if blackboard.has("running_action"): + return blackboard.get("running_action") + return null + +func get_last_condition(): + if blackboard.has("last_condition"): + return blackboard.get("last_condition") + return null + +func get_last_condition_status(): + if blackboard.has("last_condition_status"): + var status = blackboard.get("last_condition_status") + if status == SUCCESS: + return "SUCCESS" + elif status == FAILURE: + return "FAILURE" + else: + return "RUNNING" + return "" + +func enable(): + self.enabled = true + set_process_mode(self.process_mode) + +func disable(): + self.enabled = false + set_process(self.enabled) + set_physics_process(self.enabled) + +func set_process_mode(value): + process_mode = value + set_process(process_mode == ProcessMode.IDLE) + set_physics_process(process_mode == ProcessMode.PHYSICS_PROCESS) diff --git a/addons/beehave/nodes/beehave_tree.gd b/addons/beehave/nodes/beehave_tree.gd new file mode 100644 index 0000000..9def663 --- /dev/null +++ b/addons/beehave/nodes/beehave_tree.gd @@ -0,0 +1,3 @@ +extends Node + +class_name BeehaveTree diff --git a/addons/beehave/nodes/composites/composite.gd b/addons/beehave/nodes/composites/composite.gd new file mode 100644 index 0000000..5a691f9 --- /dev/null +++ b/addons/beehave/nodes/composites/composite.gd @@ -0,0 +1,8 @@ +extends BeehaveNode + +class_name Composite, "../../icons/category_composite.svg" + + +func _ready(): + if self.get_child_count() < 1: + push_error("BehaviorTree Error: Composite %s should have at least one child (NodePath: %s)" % [self.name, self.get_path()]) diff --git a/addons/beehave/nodes/composites/selector.gd b/addons/beehave/nodes/composites/selector.gd new file mode 100644 index 0000000..f78be66 --- /dev/null +++ b/addons/beehave/nodes/composites/selector.gd @@ -0,0 +1,18 @@ +extends Composite + +class_name SelectorComposite, "../../icons/selector.svg" + +func tick(actor, blackboard): + for c in get_children(): + var response = c.tick(actor, blackboard) + + if c is ConditionLeaf: + blackboard.set("last_condition", c) + blackboard.set("last_condition_status", response) + + if response != FAILURE: + if c is ActionLeaf and response == RUNNING: + blackboard.set("running_action", c) + return response + + return FAILURE diff --git a/addons/beehave/nodes/composites/selector_star.gd b/addons/beehave/nodes/composites/selector_star.gd new file mode 100644 index 0000000..0a272b5 --- /dev/null +++ b/addons/beehave/nodes/composites/selector_star.gd @@ -0,0 +1,33 @@ +# Special implementation of a selector that will +# "wait" for running nodes and will not re-attempt +# to execute previous nodes until that node is either +# FAILED or SUCCEEDED +extends Composite + +class_name SelectorStarComposite, "../../icons/selector_star.svg" + + +var last_execution_index = 0 + +func tick(actor, blackboard): + for c in get_children(): + if c.get_index() < last_execution_index: + continue + + var response = c.tick(actor, blackboard) + + if c is ConditionLeaf: + blackboard.set("last_condition", c) + blackboard.set("last_condition_status", response) + + if response != FAILURE: + if c is ActionLeaf and response == RUNNING: + blackboard.set("running_action", c) + if response == SUCCESS: + last_execution_index = 0 + return response + else: + last_execution_index += 1 + + last_execution_index = 0 + return FAILURE diff --git a/addons/beehave/nodes/composites/sequence.gd b/addons/beehave/nodes/composites/sequence.gd new file mode 100644 index 0000000..52d401d --- /dev/null +++ b/addons/beehave/nodes/composites/sequence.gd @@ -0,0 +1,18 @@ +extends Composite + +class_name SequenceComposite, "../../icons/sequencer.svg" + +func tick(actor, blackboard): + for c in get_children(): + var response = c.tick(actor, blackboard) + + if c is ConditionLeaf: + blackboard.set("last_condition", c) + blackboard.set("last_condition_status", response) + + if response != SUCCESS: + if c is ActionLeaf and response == RUNNING: + blackboard.set("running_action", c) + return response + + return SUCCESS diff --git a/addons/beehave/nodes/composites/sequence_star.gd b/addons/beehave/nodes/composites/sequence_star.gd new file mode 100644 index 0000000..f0ae03f --- /dev/null +++ b/addons/beehave/nodes/composites/sequence_star.gd @@ -0,0 +1,35 @@ +# Special implementation of sequencer who will execute +# successful nodes only once until all nodes were successful + +extends Composite + +class_name SequenceStarComposite, "../../icons/sequencer_star.svg" + +var successful_index = 0 + +func tick(actor, blackboard): + for c in get_children(): + if c.get_index() < successful_index: + continue + + var response = c.tick(actor, blackboard) + + if c is ConditionLeaf: + blackboard.set("last_condition", c) + blackboard.set("last_condition_status", response) + + if response != SUCCESS: + if response == FAILURE: + successful_index = 0 + if c is ActionLeaf and response == RUNNING: + blackboard.set("running_action", c) + return response + else: + successful_index += 1 + + if successful_index == get_child_count(): + successful_index = 0 + return SUCCESS + else: + successful_index = 0 + return FAILURE diff --git a/addons/beehave/nodes/decorators/decorator.gd b/addons/beehave/nodes/decorators/decorator.gd new file mode 100644 index 0000000..b0568d5 --- /dev/null +++ b/addons/beehave/nodes/decorators/decorator.gd @@ -0,0 +1,8 @@ +extends BeehaveNode + +class_name Decorator, "../../icons/category_decorator.svg" + + +func _ready(): + if self.get_child_count() != 1: + push_error("Beehave Error: Decorator %s should have only one child (NodePath: %s)" % [self.name, self.get_path()]) diff --git a/addons/beehave/nodes/decorators/failer.gd b/addons/beehave/nodes/decorators/failer.gd new file mode 100644 index 0000000..15dfef4 --- /dev/null +++ b/addons/beehave/nodes/decorators/failer.gd @@ -0,0 +1,11 @@ +extends Decorator + +class_name AlwaysFailDecorator, "../../icons/fail.svg" + + +func tick(action, blackboard): + for c in get_children(): + var response = c.tick(action, blackboard) + if response == RUNNING: + return RUNNING + return FAILURE diff --git a/addons/beehave/nodes/decorators/inverter.gd b/addons/beehave/nodes/decorators/inverter.gd new file mode 100644 index 0000000..e1e70ea --- /dev/null +++ b/addons/beehave/nodes/decorators/inverter.gd @@ -0,0 +1,17 @@ +extends Decorator + +class_name InverterDecorator, "../../icons/inverter.svg" + + +func tick(action, blackboard): + for c in get_children(): + var response = c.tick(action, blackboard) + + if response == SUCCESS: + return FAILURE + if response == FAILURE: + return SUCCESS + + if c is Leaf and response == RUNNING: + blackboard.set("running_action", c) + return RUNNING diff --git a/addons/beehave/nodes/decorators/limiter.gd b/addons/beehave/nodes/decorators/limiter.gd new file mode 100644 index 0000000..725f784 --- /dev/null +++ b/addons/beehave/nodes/decorators/limiter.gd @@ -0,0 +1,19 @@ +extends Decorator + +class_name LimiterDecorator, "../../icons/limiter.svg" + +onready var cache_key = 'limiter_%s' % self.get_instance_id() + +export (float) var max_count = 0 + +func tick(actor, blackboard): + var current_count = blackboard.get(cache_key) + + if current_count == null: + current_count = 0 + + if current_count <= max_count: + blackboard.set(cache_key, current_count + 1) + return self.get_child(0).tick(actor, blackboard) + else: + return FAILED diff --git a/addons/beehave/nodes/decorators/succeeder.gd b/addons/beehave/nodes/decorators/succeeder.gd new file mode 100644 index 0000000..1a7bacf --- /dev/null +++ b/addons/beehave/nodes/decorators/succeeder.gd @@ -0,0 +1,11 @@ +extends Decorator + +class_name AlwaysSucceedDecorator, "../../icons/succeed.svg" + + +func tick(action, blackboard): + for c in get_children(): + var response = c.tick(action, blackboard) + if response == RUNNING: + return RUNNING + return SUCCESS diff --git a/addons/beehave/nodes/leaves/action.gd b/addons/beehave/nodes/leaves/action.gd new file mode 100644 index 0000000..a30041d --- /dev/null +++ b/addons/beehave/nodes/leaves/action.gd @@ -0,0 +1,3 @@ +extends Leaf + +class_name ActionLeaf, "../../icons/action.svg" diff --git a/addons/beehave/nodes/leaves/condition.gd b/addons/beehave/nodes/leaves/condition.gd new file mode 100644 index 0000000..d91ff37 --- /dev/null +++ b/addons/beehave/nodes/leaves/condition.gd @@ -0,0 +1,3 @@ +extends Leaf + +class_name ConditionLeaf, "../../icons/condition.svg" diff --git a/addons/beehave/nodes/leaves/leaf.gd b/addons/beehave/nodes/leaves/leaf.gd new file mode 100644 index 0000000..503fa1b --- /dev/null +++ b/addons/beehave/nodes/leaves/leaf.gd @@ -0,0 +1,3 @@ +extends BeehaveNode + +class_name Leaf, "../../icons/action.svg" diff --git a/addons/beehave/plugin.cfg b/addons/beehave/plugin.cfg new file mode 100644 index 0000000..7a1b19b --- /dev/null +++ b/addons/beehave/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Beehave" +description="🐝 Behaviour Tree addon for Godot Engine" +author="bitbrain" +version="1.2.0" +script="plugin.gd" diff --git a/addons/beehave/plugin.gd b/addons/beehave/plugin.gd new file mode 100644 index 0000000..d670e1b --- /dev/null +++ b/addons/beehave/plugin.gd @@ -0,0 +1,5 @@ +tool +extends EditorPlugin + +func _init(): + print("Beehave initialized!") diff --git a/addons/godot-version-management/LICENSE b/addons/godot-version-management/LICENSE new file mode 100644 index 0000000..743520c --- /dev/null +++ b/addons/godot-version-management/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Tomek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/addons/godot-version-management/README.md b/addons/godot-version-management/README.md new file mode 100644 index 0000000..40a0123 --- /dev/null +++ b/addons/godot-version-management/README.md @@ -0,0 +1,70 @@ +# Godot Version Manager + + + +This addon is for developpers that want a centralized place for version naming / build number and then display it in game. + +It allow you to configure version and build in project settings. + +These configurations are synchronized to all existing export of your project. + +Moreover configurations can be loaded for in game display. + +## How to install it + +You can find this addon in Godot AssetLibrary +See the Godot Addon install section : https://docs.godotengine.org/en/stable/tutorials/plugins/editor/installing_plugins.html + +## How to use it for exports + +Once the addon activated it add two entry in your project configuration: + +- Application / Config / Version as String (application/config/version default to 0.0.1) +- Application / Config / Build as Integer (application/config/build default to 1) + +You can change the version and the build numbers. +It will update all your exports versions value to the project config value. +Then you need to reload the project (Project / Reload current project). + +See below section to know why you need to reload project. + +For Android exports: +* version is version/name +* build is version/code + +For iOS and MacOS exports: +* version is application/short_version +* build is application/version + +For Windows Desktop exports: +* version is application/file_version and application/product_version + +For HTML5 and UWP exports no versions specified. + +## How to use it for in game display + +The version and build numbers can be accessed for in game use like that: + + +```GDScript + # To get version string + var version = ProjectSettings.get_setting("application/config/version") + # To get build number + var build = ProjectSettings.get_setting("application/config/build") +``` + + + + +## Why I need to reload project ? + +The GodotVersionManager addon update the export-presets.cfg file. + +Because of Godot keep in memory ExportsSettings and do not reload it from export-presets.cfg file you will need to reload your project. + +When project is loaded Godot load in memory the export-presets.cfg . + +## Support Me + +You to buy me a coffee ? +Buy Me a Coffee diff --git a/addons/godot-version-management/godot_version_manager.gd b/addons/godot-version-management/godot_version_manager.gd new file mode 100644 index 0000000..d7fea72 --- /dev/null +++ b/addons/godot-version-management/godot_version_manager.gd @@ -0,0 +1,78 @@ +# By Erasor +tool +extends EditorPlugin + +const PLUGIN_NAME = "Godot-Version-Manager" +const DEBUG = true +# Use same name as https://github.com/godotengine/godot/pull/35555 +const PROJECT_VERSION_SETTING = "application/config/version" +const PROJECT_BUILD_SETTING = "application/config/build" +const EXPORT_PRESETS_FILE = "res://export_presets.cfg" +var current_version +var current_build + +func _enter_tree(): + if not ProjectSettings.has_setting(PROJECT_VERSION_SETTING): + ProjectSettings.set_setting(PROJECT_VERSION_SETTING, "0.0.1") + if not ProjectSettings.has_setting(PROJECT_BUILD_SETTING): + ProjectSettings.set_setting(PROJECT_BUILD_SETTING, 1) + current_version = ProjectSettings.get_setting(PROJECT_VERSION_SETTING) + current_build = ProjectSettings.get_setting(PROJECT_BUILD_SETTING) + + +func _exit_tree(): + # Do not remove the verson config, may conflict with https://github.com/godotengine/godot/pull/35555 + pass + + +func apply_changes(): + _update_export_presets() + + +func save_external_data(): + _update_export_presets() + + +func _update_export_presets(): + # If config version changed, update all exports + if ProjectSettings.get_setting(PROJECT_VERSION_SETTING) != current_version: + var export_config: ConfigFile = ConfigFile.new() + var err = export_config.load(EXPORT_PRESETS_FILE) + if err == OK: + # Loop limited to 100 exports + for i in range(0, 100): + var section = "preset." + str(i) + if export_config.has_section(section): + plugin_log("Update Export " + export_config.get_value(section, "platform")) + # Update Android exports configs + if export_config.get_value(section, "platform") == "Android": + export_config.set_value(section + ".options", 'version/name', ProjectSettings.get_setting(PROJECT_VERSION_SETTING)) + export_config.set_value(section + ".options", 'version/code', ProjectSettings.get_setting(PROJECT_BUILD_SETTING)) + if export_config.get_value(section, "platform") == "iOS" or export_config.get_value(section, "platform") == "Mac OSX": + export_config.set_value(section + ".options", 'application/short_version', ProjectSettings.get_setting(PROJECT_VERSION_SETTING)) + export_config.set_value(section + ".options", 'application/version', ProjectSettings.get_setting(PROJECT_BUILD_SETTING)) + if export_config.get_value(section, "platform") == "UWP": + # TODO parsing of version to minor/major + pass + if export_config.get_value(section, "platform") == "Windows Desktop": + export_config.set_value(section + ".options", 'application/file_version', ProjectSettings.get_setting(PROJECT_VERSION_SETTING)) + export_config.set_value(section + ".options", 'application/product_version', ProjectSettings.get_setting(PROJECT_VERSION_SETTING)) + else: + break + err = export_config.save(EXPORT_PRESETS_FILE) + ProjectSettings.save() + if err == OK: + plugin_log("All exports updated") + else: + plugin_log("Error saving " + EXPORT_PRESETS_FILE + ", exports not updated") + else: + plugin_log('Error open ' + EXPORT_PRESETS_FILE) + + +func plugin_log(message): + if (DEBUG): + var time : Dictionary = OS.get_datetime() + var date_string : String = "%02d:%02d" % [time.hour, time.minute] + print(date_string, " - ", PLUGIN_NAME, " - ", message) + + diff --git a/addons/godot-version-management/plugin.cfg b/addons/godot-version-management/plugin.cfg new file mode 100644 index 0000000..52c8d5a --- /dev/null +++ b/addons/godot-version-management/plugin.cfg @@ -0,0 +1,8 @@ +[plugin] + +name="Godot-Version-Manager" +description="Godot plugin to manage versions for exports. +It centralize the version number in project." +author="Erasor" +version="1.0.0" +script="godot_version_manager.gd" diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..d740d50 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,141 @@ +[preset.0] + +name="windows" +platform="Windows Desktop" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="" +script_export_mode=1 +script_encryption_key="" + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +binary_format/64_bits=true +binary_format/embed_pck=false +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true +codesign/enable=false +codesign/identity_type=0 +codesign/identity="" +codesign/password="" +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PoolStringArray( ) +application/modify_resources=true +application/icon="" +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" + +[preset.1] + +name="mac" +platform="Mac OSX" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="" +script_export_mode=1 +script_encryption_key="" + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +application/name="" +application/info="Made with Godot Engine" +application/icon="" +application/identifier="com.tonybark.mysim" +application/signature="" +application/app_category="Simulation-games" +application/short_version="1.0" +application/version="1.0" +application/copyright="" +display/high_res=false +privacy/microphone_usage_description="" +privacy/camera_usage_description="" +privacy/location_usage_description="" +privacy/address_book_usage_description="" +privacy/calendar_usage_description="" +privacy/photos_library_usage_description="" +privacy/desktop_folder_usage_description="" +privacy/documents_folder_usage_description="" +privacy/downloads_folder_usage_description="" +privacy/network_volumes_usage_description="" +privacy/removable_volumes_usage_description="" +codesign/enable=true +codesign/identity="" +codesign/timestamp=true +codesign/hardened_runtime=true +codesign/replace_existing_signature=true +codesign/entitlements/custom_file="" +codesign/entitlements/allow_jit_code_execution=false +codesign/entitlements/allow_unsigned_executable_memory=false +codesign/entitlements/allow_dyld_environment_variables=false +codesign/entitlements/disable_library_validation=false +codesign/entitlements/audio_input=false +codesign/entitlements/camera=false +codesign/entitlements/location=false +codesign/entitlements/address_book=false +codesign/entitlements/calendars=false +codesign/entitlements/photos_library=false +codesign/entitlements/apple_events=false +codesign/entitlements/debugging=false +codesign/entitlements/app_sandbox/enabled=false +codesign/entitlements/app_sandbox/network_server=false +codesign/entitlements/app_sandbox/network_client=false +codesign/entitlements/app_sandbox/device_usb=false +codesign/entitlements/app_sandbox/device_bluetooth=false +codesign/entitlements/app_sandbox/files_downloads=0 +codesign/entitlements/app_sandbox/files_pictures=0 +codesign/entitlements/app_sandbox/files_music=0 +codesign/entitlements/app_sandbox/files_movies=0 +codesign/custom_options=PoolStringArray( ) +notarization/enable=false +notarization/apple_id_name="" +notarization/apple_id_password="" +notarization/apple_team_id="" +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false + +[preset.2] + +name="linux" +platform="Linux/X11" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="" +script_export_mode=1 +script_encryption_key="" + +[preset.2.options] + +custom_template/debug="" +custom_template/release="" +binary_format/64_bits=true +binary_format/embed_pck=false +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true diff --git a/project.godot b/project.godot index 9db388f..40e806f 100644 --- a/project.godot +++ b/project.godot @@ -8,6 +8,106 @@ config_version=4 +_global_script_classes=[ { +"base": "Leaf", +"class": "ActionLeaf", +"language": "GDScript", +"path": "res://addons/beehave/nodes/leaves/action.gd" +}, { +"base": "Decorator", +"class": "AlwaysFailDecorator", +"language": "GDScript", +"path": "res://addons/beehave/nodes/decorators/failer.gd" +}, { +"base": "Decorator", +"class": "AlwaysSucceedDecorator", +"language": "GDScript", +"path": "res://addons/beehave/nodes/decorators/succeeder.gd" +}, { +"base": "BeehaveTree", +"class": "BeehaveNode", +"language": "GDScript", +"path": "res://addons/beehave/nodes/beehave_node.gd" +}, { +"base": "BeehaveTree", +"class": "BeehaveRoot", +"language": "GDScript", +"path": "res://addons/beehave/nodes/beehave_root.gd" +}, { +"base": "Node", +"class": "BeehaveTree", +"language": "GDScript", +"path": "res://addons/beehave/nodes/beehave_tree.gd" +}, { +"base": "BeehaveNode", +"class": "Composite", +"language": "GDScript", +"path": "res://addons/beehave/nodes/composites/composite.gd" +}, { +"base": "Leaf", +"class": "ConditionLeaf", +"language": "GDScript", +"path": "res://addons/beehave/nodes/leaves/condition.gd" +}, { +"base": "BeehaveNode", +"class": "Decorator", +"language": "GDScript", +"path": "res://addons/beehave/nodes/decorators/decorator.gd" +}, { +"base": "Decorator", +"class": "InverterDecorator", +"language": "GDScript", +"path": "res://addons/beehave/nodes/decorators/inverter.gd" +}, { +"base": "BeehaveNode", +"class": "Leaf", +"language": "GDScript", +"path": "res://addons/beehave/nodes/leaves/leaf.gd" +}, { +"base": "Decorator", +"class": "LimiterDecorator", +"language": "GDScript", +"path": "res://addons/beehave/nodes/decorators/limiter.gd" +}, { +"base": "Composite", +"class": "SelectorComposite", +"language": "GDScript", +"path": "res://addons/beehave/nodes/composites/selector.gd" +}, { +"base": "Composite", +"class": "SelectorStarComposite", +"language": "GDScript", +"path": "res://addons/beehave/nodes/composites/selector_star.gd" +}, { +"base": "Composite", +"class": "SequenceComposite", +"language": "GDScript", +"path": "res://addons/beehave/nodes/composites/sequence.gd" +}, { +"base": "Composite", +"class": "SequenceStarComposite", +"language": "GDScript", +"path": "res://addons/beehave/nodes/composites/sequence_star.gd" +} ] +_global_script_class_icons={ +"ActionLeaf": "res://addons/beehave/icons/action.svg", +"AlwaysFailDecorator": "res://addons/beehave/icons/fail.svg", +"AlwaysSucceedDecorator": "res://addons/beehave/icons/succeed.svg", +"BeehaveNode": "res://addons/beehave/icons/action.svg", +"BeehaveRoot": "res://addons/beehave/icons/tree.svg", +"BeehaveTree": "", +"Composite": "res://addons/beehave/icons/category_composite.svg", +"ConditionLeaf": "res://addons/beehave/icons/condition.svg", +"Decorator": "res://addons/beehave/icons/category_decorator.svg", +"InverterDecorator": "res://addons/beehave/icons/inverter.svg", +"Leaf": "res://addons/beehave/icons/action.svg", +"LimiterDecorator": "res://addons/beehave/icons/limiter.svg", +"SelectorComposite": "res://addons/beehave/icons/selector.svg", +"SelectorStarComposite": "res://addons/beehave/icons/selector_star.svg", +"SequenceComposite": "res://addons/beehave/icons/sequencer.svg", +"SequenceStarComposite": "res://addons/beehave/icons/sequencer_star.svg" +} + [application] config/name="City Limits" @@ -15,6 +115,8 @@ run/main_scene="res://scenes/Game.tscn" config/icon="res://icon.png" config/macos_native_icon="res://icon.icns" config/windows_native_icon="res://icon.ico" +config/version="0.0.1" +config/build=1000 [autoload] @@ -32,7 +134,7 @@ window/stretch/aspect="keep" [editor_plugins] -enabled=PoolStringArray( ) +enabled=PoolStringArray( "res://addons/beehave/plugin.cfg", "res://addons/godot-version-management/plugin.cfg" ) [gdnative] @@ -66,8 +168,8 @@ ui_down={ } ui_cheats={ "deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":true,"command":true,"pressed":false,"scancode":67,"physical_scancode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":true,"command":true,"pressed":false,"scancode":88,"physical_scancode":0,"unicode":0,"echo":false,"script":null) +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":true,"meta":true,"command":true,"pressed":false,"scancode":67,"physical_scancode":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":true,"command":true,"pressed":false,"scancode":88,"physical_scancode":0,"unicode":0,"echo":false,"script":null) ] } diff --git a/scenes/deparments/CoalPlant.tscn b/scenes/deparments/CoalPlant.tscn index f072987..6729fa6 100644 --- a/scenes/deparments/CoalPlant.tscn +++ b/scenes/deparments/CoalPlant.tscn @@ -1,7 +1,10 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=8 format=2] -[ext_resource path="res://scripts/power_station.gd" type="Script" id=1] +[ext_resource path="res://scripts/simtactics/turn_on.gd" type="Script" id=1] [ext_resource path="res://assets/coal.png" type="Texture" id=2] +[ext_resource path="res://addons/beehave/nodes/composites/sequence.gd" type="Script" id=3] +[ext_resource path="res://scripts/simtactics/zone.gd" type="Script" id=4] +[ext_resource path="res://addons/beehave/nodes/beehave_root.gd" type="Script" id=6] [sub_resource type="RectangleShape2D" id=1] extents = Vector2( 32.2297, 31.8602 ) @@ -26,9 +29,19 @@ tracks/0/keys = { [node name="PowerStation" type="KinematicBody2D"] input_pickable = true + +[node name="BeehaveRoot" type="Node" parent="."] +script = ExtResource( 6 ) + +[node name="SequenceComposite" type="Node" parent="BeehaveRoot"] +script = ExtResource( 3 ) + +[node name="TurnOn" type="Node" parent="BeehaveRoot/SequenceComposite"] script = ExtResource( 1 ) -income = 0 -expense = 250 + +[node name="ActionLeaf" type="Node" parent="BeehaveRoot/SequenceComposite"] +script = ExtResource( 4 ) +zone_texture = "res://assets/res_houses.png" [node name="Quarters" type="Timer" parent="."] wait_time = 10.0 @@ -44,5 +57,3 @@ playback_speed = 5.0 anims/Animante = SubResource( 2 ) [node name="RayCast2D" type="RayCast2D" parent="."] - -[connection signal="timeout" from="Quarters" to="." method="_on_Quarters_timeout"] diff --git a/scenes/deparments/Zone.tscn b/scenes/deparments/Zone.tscn index f37acc0..7899a9a 100644 --- a/scenes/deparments/Zone.tscn +++ b/scenes/deparments/Zone.tscn @@ -1,14 +1,17 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://scripts/zone.gd" type="Script" id=1] [ext_resource path="res://assets/res_zones.png" type="Texture" id=2] +[ext_resource path="res://scripts/simtactics/has_power.gd" type="Script" id=4] +[ext_resource path="res://addons/beehave/nodes/beehave_root.gd" type="Script" id=5] +[ext_resource path="res://addons/beehave/nodes/composites/selector.gd" type="Script" id=7] [sub_resource type="Animation" id=2] resource_name = "Animante" length = 5.0 step = 1.0 tracks/0/type = "value" -tracks/0/path = NodePath("../Sprite:frame") +tracks/0/path = NodePath("Sprite:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/imported = false @@ -17,7 +20,22 @@ tracks/0/keys = { "times": PoolRealArray( 0, 1, 2, 3, 4 ), "transitions": PoolRealArray( 1, 1, 1, 1, 1 ), "update": 1, -"values": [ 1, 2, 3, 4, 6 ] +"values": [ 0, 1, 2, 3, 4 ] +} + +[sub_resource type="Animation" id=4] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 1 ] } [sub_resource type="CircleShape2D" id=3] @@ -26,15 +44,26 @@ radius = 34.955 [node name="Zone" type="Area2D"] script = ExtResource( 1 ) -[node name="Quarters" type="Timer" parent="."] -wait_time = 10.0 - [node name="Sprite" type="Sprite" parent="."] texture = ExtResource( 2 ) vframes = 19 +frame = 1 + +[node name="BeehaveRoot" type="Node" parent="."] +script = ExtResource( 5 ) + +[node name="SelectorComposite" type="Node" parent="BeehaveRoot"] +script = ExtResource( 7 ) + +[node name="HasPower" type="Node" parent="BeehaveRoot/SelectorComposite"] +script = ExtResource( 4 ) + +[node name="Quarters" type="Timer" parent="."] +wait_time = 10.0 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] anims/Animante = SubResource( 2 ) +anims/RESET = SubResource( 4 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource( 3 ) diff --git a/scenes/game.tscn b/scenes/game.tscn index 217a1a7..e471677 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=45 format=2] +[gd_scene load_steps=50 format=2] [ext_resource path="res://scenes/maps/MapOne.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/beehave/nodes/composites/selector.gd" type="Script" id=2] [ext_resource path="res://assets/symbols/fontawesome/population.svg" type="Texture" id=3] [ext_resource path="res://scenes/windows/Advisor.tscn" type="PackedScene" id=4] [ext_resource path="res://assets/ui/iccom.png" type="Texture" id=5] @@ -44,16 +45,22 @@ [ext_resource path="res://assets/symbols/fontawesome/envelope.svg" type="Texture" id=43] [ext_resource path="res://scenes/windows/Ordinance.tscn" type="PackedScene" id=44] [ext_resource path="res://scripts/ticker.gd" type="Script" id=45] +[ext_resource path="res://addons/beehave/nodes/beehave_root.gd" type="Script" id=46] +[ext_resource path="res://scenes/deparments/CoalPlant.tscn" type="PackedScene" id=47] +[ext_resource path="res://addons/beehave/nodes/beehave_node.gd" type="Script" id=48] +[ext_resource path="res://scenes/deparments/Zone.tscn" type="PackedScene" id=49] [node name="Game" type="Node2D"] script = ExtResource( 20 ) -[node name="DayCycle" type="Timer" parent="."] -wait_time = 12.0 -autostart = true -__meta__ = { -"_editor_description_": "Calculation based on: https://gaming.stackexchange.com/questions/110529/real-world-time-in-a-simcity-day-on-various-speeds" -} +[node name="BeehaveRoot" type="Node" parent="."] +script = ExtResource( 46 ) + +[node name="DayCycle" type="Node" parent="BeehaveRoot"] +script = ExtResource( 2 ) + +[node name="BeehaveNode" type="Node" parent="BeehaveRoot/DayCycle"] +script = ExtResource( 48 ) [node name="MapOne" parent="." instance=ExtResource( 1 )] @@ -286,6 +293,16 @@ __meta__ = { "_edit_use_anchors_": true } +[node name="VersionLbl" type="Label" parent="Controls/Control Panel/Windows"] +anchor_left = 0.0146199 +anchor_top = 0.0271318 +anchor_right = 0.182261 +anchor_bottom = 0.0542636 +text = "Version" +__meta__ = { +"_edit_use_anchors_": true +} + [node name="Status" type="Panel" parent="Controls/Control Panel"] anchor_top = 12.95 anchor_right = 25.65 @@ -294,10 +311,6 @@ __meta__ = { "_edit_use_anchors_": true } -[node name="RotateNews" type="Timer" parent="Controls/Control Panel/Status"] -wait_time = 5.0 -autostart = true - [node name="SettingsBtn" type="Button" parent="Controls/Control Panel/Status"] anchor_left = 0.0115391 anchor_top = 0.0555202 @@ -466,6 +479,8 @@ __meta__ = { "_edit_use_anchors_": true } -[connection signal="timeout" from="DayCycle" to="." method="_on_DayCycle_timeout"] -[connection signal="timeout" from="Controls/Control Panel/Status/RotateNews" to="Controls/Control Panel" method="_on_RotateNews_timeout"] -[connection signal="pressed" from="Controls/Control Panel/Status/NewsBtn" to="Controls/Control Panel" method="_on_NewsBtn_pressed"] +[node name="Zone" parent="." instance=ExtResource( 49 )] +position = Vector2( 650, 351 ) + +[node name="PowerStation" parent="." instance=ExtResource( 47 )] +position = Vector2( 758, 277 ) diff --git a/scripts/Zone.gd b/scripts/Zone.gd index c885d74..f59c823 100644 --- a/scripts/Zone.gd +++ b/scripts/Zone.gd @@ -1,12 +1,5 @@ extends Area2D -signal grabbed -signal has_power - -export var cost: int = 10000 -export var income: int = 100 -export var expense: int = 0 - onready var zone = $Sprite onready var quarters = $Quarters onready var animator = $AnimationPlayer @@ -15,48 +8,32 @@ var can_grab = false var grabbed_offset = Vector2() func _ready(): - SimEvents.connect("budget", self, "_get_budget") - connect("grabbed", self, "_grab_zone") + zone.frame = 0 + +#func _drag_drop(event): +# if event is InputEventMouseButton and can_grab: +# # Substract from the player's budget and disable grabbing +# if SimData.budget >= cost: +# SimData.budget -= cost +# can_grab = false +# grabbed_offset = position - get_global_mouse_position() -func _drag_drop(event): - if event is InputEventMouseButton and can_grab: - # Substract from the player's budget and disable grabbing - if SimData.budget >= cost: - SimData.budget -= cost - can_grab = false - grabbed_offset = position - get_global_mouse_position() - -func _input(event): - _drag_drop(event) +#func _input(event): +# _drag_drop(event) func _process(delta): - if can_grab: - position = get_global_mouse_position() + grabbed_offset - -func _animante_sprite(animante: bool = true): - if zone.hframes > 1 or zone.vframes > 1 and animante: + if SimData.has_power == true: animator.play("Animante") else: animator.stop() +# if can_grab: +# position = get_global_mouse_position() + grabbed_offset + +#func _animante_sprite(animante: bool = true): +# if zone.hframes > 1 or zone.vframes > 1 and animante: +# animator.play("Animante") +# else: +# animator.stop() -func _grab_zone(): - can_grab = true - -func _get_budget(): - if SimData.budget >= expense and SimData.has_power: - SimData.budget -= expense - SimData.expenses = expense - - if SimData.has_power: - var total_income = SimData.res_tax * income - SimData.budget += total_income - SimData.res_income = total_income - -func _on_Zone_body_entered(body: Node): - if SimData.has_power and can_grab == false: - quarters.start() - _animante_sprite() - -func _on_Zone_body_exited(body: Node): - quarters.stop() - _animante_sprite(false) +#func _grab_zone(): +# can_grab = true diff --git a/scripts/autoload/sim_data.gd b/scripts/autoload/sim_data.gd index d924d9e..baf0e19 100644 --- a/scripts/autoload/sim_data.gd +++ b/scripts/autoload/sim_data.gd @@ -17,6 +17,9 @@ var current_power_cap: int var prev_power_cap: int var has_power: bool +var res_tax: int = 5 +var res_income: int + var ticker_files: Array = [ "adverts.json", "sammy.json" diff --git a/scripts/simtactics/has_power.gd b/scripts/simtactics/has_power.gd new file mode 100644 index 0000000..7427664 --- /dev/null +++ b/scripts/simtactics/has_power.gd @@ -0,0 +1,20 @@ +extends ConditionLeaf + +export var cost: int = 10000 +export var income: int = 100 +export var expense: int = 0 + +func tick(actor, blackboard): + if SimData.has_power: + if SimData.budget >= expense: + SimData.budget -= expense + SimData.expenses = expense + + if SimData.has_power: + var total_income = SimData.res_tax * income + SimData.budget += total_income + SimData.res_income = total_income + + return SUCCESS + + return FAILURE diff --git a/scripts/simtactics/turn_on.gd b/scripts/simtactics/turn_on.gd new file mode 100644 index 0000000..a45af1f --- /dev/null +++ b/scripts/simtactics/turn_on.gd @@ -0,0 +1,5 @@ +extends ConditionLeaf + +func tick(actor, blackboard): + SimData.has_power = true + return RUNNING diff --git a/scripts/simtactics/zone.gd b/scripts/simtactics/zone.gd new file mode 100644 index 0000000..1d6d575 --- /dev/null +++ b/scripts/simtactics/zone.gd @@ -0,0 +1,18 @@ +extends ConditionLeaf + +export var cost: int = 10000 +export var income: int = 100 +export var expense: int = 0 + +func tick(actor, blackboard): + if SimData.has_power: + if SimData.budget >= expense: + SimData.budget -= expense + SimData.expenses = expense + + if SimData.has_power: + var total_income = SimData.res_tax * income + SimData.budget += total_income + SimData.res_income = total_income + + return RUNNING diff --git a/scripts/ticker.gd b/scripts/ticker.gd index 7405cdd..1c99bdc 100644 --- a/scripts/ticker.gd +++ b/scripts/ticker.gd @@ -1,42 +1,42 @@ extends Control -const TICKER_PATH = "res://json/ticker/" -const FNN_LOGO = "res://assets/ticker/fnn.png" -const CONFIG_FILE = "config.json" - -onready var ticker_text = $Status/NewsBtn -onready var ticker_box = $Windows/NewsWindow/News -onready var ticker_window = $Windows/NewsWindow - -var news_file: String = "" -var rng = RandomNumberGenerator.new() -var all_news: Array = [] -var speices: Array = [ - "Cat", - "Fennec", - "Fox" -] - -var json_files: Array = [] - -func _load_json(): - var file = File.new() - if file.file_exists(news_file): - file.open(news_file, file.READ) - var result = parse_json(file.get_as_text()) - return result - -func _index_news(): - var news = _load_json() - all_news.clear() - all_news = news["ticker"] - randomize() - all_news.shuffle() - -func _ready(): - ticker_window.window_title = JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "outlet") - - _randomize_news(json_files) +#const TICKER_PATH = "res://json/ticker/" +#const FNN_LOGO = "res://assets/ticker/fnn.png" +#const CONFIG_FILE = "config.json" +# +#onready var ticker_text = $Status/NewsBtn +#onready var ticker_box = $Windows/NewsWindow/News +#onready var ticker_window = $Windows/NewsWindow +# +#var news_file: String = "" +#var rng = RandomNumberGenerator.new() +#var all_news: Array = [] +#var speices: Array = [ +# "Cat", +# "Fennec", +# "Fox" +#] +# +#var json_files: Array = [] +# +#func _load_json(): +# var file = File.new() +# if file.file_exists(news_file): +# file.open(news_file, file.READ) +# var result = parse_json(file.get_as_text()) +# return result +# +#func _index_news(): +# var news = _load_json() +# all_news.clear() +# all_news = news["ticker"] +# randomize() +# all_news.shuffle() +# +#func _ready(): +# ticker_window.window_title = JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "outlet") +# +# _randomize_news(json_files) #func _process(delta): # var prev_json_Files = json_files @@ -60,73 +60,64 @@ func _ready(): # for files in city_life: # json_files.append(files) -func _array_check(list1, list2): - for item in list1: - if item in list2: - return true - - return false - -func _start_alert(message): -# if ticker_text.items.size() > 1: -# ticker_text.clear() +#func _array_check(list1, list2): +# for item in list1: +# if item in list2: +# return true +# +# return false +# +#func _start_alert(message): +## if ticker_text.items.size() > 1: +## ticker_text.clear() +## +## SimData.on_alert = true +## news_file = str(TICKER_PATH + "ticker_alerts.json") +## ticker_text.add_item(all_news) +# +# pass +# +#func _randomize_news(files: Array): +# if all_news == null: +# json_files = JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "ticker_files") +# +# for file in files: +# news_file = str(TICKER_PATH + file) +# _load_json() +# _index_news() +# +# rng.randomize() +# randomize() +# files.shuffle() +# +# var news_range = rng.randi_range(0, all_news.size() - 1) +# var news_text: String = all_news[news_range] +# +# if "[competing_outlet]" in news_text: +# news_text = news_text.replace("[competing_outlet]", JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "competing_outlet")) +# +# if "[outlet]" in news_text: +# news_text = news_text.replace("[outlet]", JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "outlet")) +# +# if "[species]" in news_text: +# speices.shuffle() +# var speices_range = rng.randi_range(speices.size() - 1) +# news_text = news_text.replace("[species]", speices[speices_range]) +# +# if "[city]" in news_text: +# news_text = news_text.replace("[city]", SimData.city_name) +# +# if "[mayor]" in news_text: +# news_text = news_text.replace("[mayor]", SimData.mayor_name) +# +# # Prevent stack overflaw +# if ticker_box.items.size() > 10: +# ticker_box.clear() +# +# _randomize_news(json_files) +# _add_news(news_text) +# +#func _add_news(news_item): +# ticker_text.text = news_item +# ticker_box.add_item(news_item) # -# SimData.on_alert = true -# news_file = str(TICKER_PATH + "ticker_alerts.json") -# ticker_text.add_item(all_news) - - pass - -func _randomize_news(files: Array): - if all_news == null: - json_files = JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "ticker_files") - - for file in files: - news_file = str(TICKER_PATH + file) - _load_json() - _index_news() - - rng.randomize() - randomize() - files.shuffle() - - var news_range = rng.randi_range(0, all_news.size() - 1) - var news_text: String = all_news[news_range] - - if "[competing_outlet]" in news_text: - news_text = news_text.replace("[competing_outlet]", JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "competing_outlet")) - - if "[outlet]" in news_text: - news_text = news_text.replace("[outlet]", JsonHelper.key_value(TICKER_PATH, CONFIG_FILE, "outlet")) - - if "[species]" in news_text: - speices.shuffle() - var speices_range = rng.randi_range(speices.size() - 1) - news_text = news_text.replace("[species]", speices[speices_range]) - - if "[city]" in news_text: - news_text = news_text.replace("[city]", SimData.city_name) - - if "[mayor]" in news_text: - news_text = news_text.replace("[mayor]", SimData.mayor_name) - - # Prevent stack overflaw - if ticker_box.items.size() > 10: - ticker_box.clear() - - _randomize_news(json_files) - _add_news(news_text) - -func _add_news(news_item): - ticker_text.text = news_item - ticker_box.add_item(news_item) - -func _on_NewsBtn_pressed(): - ticker_window.show() - -func _on_RotateNews_timeout(): - rng.randomize() - randomize() - all_news.shuffle() - json_files.shuffle() - _randomize_news(json_files) diff --git a/scripts/windows.gd b/scripts/windows.gd index 7044d86..c7b6dcd 100644 --- a/scripts/windows.gd +++ b/scripts/windows.gd @@ -5,7 +5,16 @@ onready var tax_window = $TaxWindow onready var advsior_meet_window = $AdvisorMeet onready var tools_window = $ToolsWindow +onready var verLabel = $VersionLbl + func _ready(): + # To get version string + var version = ProjectSettings.get_setting("application/config/version") + # To get build number + var build = ProjectSettings.get_setting("application/config/build") + + verLabel.text = version + " (Build " + str(build) + ")" + SimData.city_name = SimData.city_name.capitalize() SimData.mayor_name = SimData.mayor_name.capitalize()