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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 ?
+
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()