Compare commits

..

7 Commits

Author SHA1 Message Date
Serhii Snitsaruk d3d32953f7
Bump version to 1.2.2 2024-09-15 17:15:47 +02:00
Serhii Snitsaruk a5c318bbf2
Update class docs
(cherry picked from commit 0e4c06f3b8)
2024-09-15 17:10:53 +02:00
Serhii Snitsaruk 576692294b
Use different prefetch root for the base plan in BTPlayer and BTState
(cherry picked from commit ac2d734122)
2024-09-15 17:10:48 +02:00
Serhii Snitsaruk 65a1a3d46b
BlackboardPlan: Allow passing different prefetch root for the base plan
(cherry picked from commit a8a0f24492)
2024-09-15 17:10:00 +02:00
Serhii Snitsaruk 5ac6cda415
Fix `BTSetAgentProperty` name generation
(cherry picked from commit da2bc5e3bb)
2024-09-15 15:15:19 +02:00
Serhii Snitsaruk fd1ac1cbb8
Fix `BBNode::get_value()` crash with a freed object in GDExtension
It may be a bug in GDExtension. I optimized the code, and, as a workaround, removed casting to Object* from Variant. This fixed the issue. The same code worked well using module.

(cherry picked from commit 689c8fab6f)
2024-09-15 15:15:10 +02:00
Serhii Snitsaruk 644c589705
Fix BTForEach crash if elements are removed from the array during iteration
(cherry picked from commit b8c9db0d44)
2024-09-15 15:14:34 +02:00
418 changed files with 1449 additions and 3503 deletions

View File

@ -8,9 +8,6 @@ inputs:
- linuxbsd - linuxbsd
- windows - windows
- macos - macos
bin:
required: true
type: string
runs: runs:
using: "composite" using: "composite"
@ -25,7 +22,7 @@ runs:
- name: Generate C# glue - name: Generate C# glue
shell: bash shell: bash
run: | run: |
./bin/${{inputs.bin}} --headless --generate-mono-glue ./modules/mono/glue || true ./bin/${BIN} --headless --generate-mono-glue ./modules/mono/glue || true
- name: Build .NET assemblies - name: Build .NET assemblies
shell: bash shell: bash

View File

@ -5,7 +5,7 @@ on:
godot-ref: godot-ref:
description: A tag, branch or commit hash in the Godot repository. description: A tag, branch or commit hash in the Godot repository.
type: string type: string
default: master default: 4.3-stable
limboai-ref: limboai-ref:
description: A tag, branch or commit hash in the LimboAI repository. description: A tag, branch or commit hash in the LimboAI repository.
type: string type: string
@ -13,7 +13,7 @@ on:
godot-cpp-ref: godot-cpp-ref:
description: A tag, branch or commit hash in the godot-cpp repository. description: A tag, branch or commit hash in the godot-cpp repository.
type: string type: string
default: master default: godot-4.3-stable
jobs: jobs:
cache-sha: cache-sha:

View File

@ -165,16 +165,15 @@ jobs:
python --version python --version
scons --version scons --version
# ! Note: we stopped using the scons cache in release builds. - name: Set up scons cache
# - name: Set up scons cache uses: actions/cache@v4
# uses: actions/cache@v4 with:
# with: path: ${{github.workspace}}/.scons_cache/
# path: ${{github.workspace}}/.scons_cache/ key: ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# key: ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}} restore-keys: |
# restore-keys: | ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}} ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}
# ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}} ${{env.BIN}}-${{inputs.godot-ref}}
# ${{env.BIN}}-${{inputs.godot-ref}}
- name: Compilation - name: Compilation
env: env:

View File

@ -11,11 +11,7 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean
default: false
debug-symbols:
description: Build with debug symbols
type: boolean type: boolean
default: false default: false
@ -30,22 +26,17 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean
default: false
debug-symbols:
description: Build with debug symbols
type: boolean type: boolean
default: false default: false
# Global Settings # Global Settings
env: env:
SCONS_CACHE_LIMIT: 4096 SCONS_CACHE_LIMIT: 4096
SCONSFLAGS: use_mingw=yes dev_build=no SCONSFLAGS: dev_build=no debug_symbols=no
EM_VERSION: 3.1.45 EM_VERSION: 3.1.45
EM_CACHE_FOLDER: "emsdk-cache" EM_CACHE_FOLDER: "emsdk-cache"
GODOT_VERSION: 4.4-beta3 GODOT_VERSION: 4.3-stable
GODOT_REPO: godotengine/godot-builds
jobs: jobs:
gdextension: gdextension:
@ -109,7 +100,7 @@ jobs:
- name: 🌐 Web (wasm32, debug) - name: 🌐 Web (wasm32, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: web platform: web
target: editor target: template_debug
arch: wasm32 arch: wasm32
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -123,7 +114,7 @@ jobs:
- name: 🤖 Android (arm64, debug) - name: 🤖 Android (arm64, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: editor target: template_debug
arch: arm64 arch: arm64
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -137,7 +128,7 @@ jobs:
- name: 🤖 Android (arm32, debug) - name: 🤖 Android (arm32, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: editor target: template_debug
arch: arm32 arch: arm32
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -151,7 +142,7 @@ jobs:
- name: 🤖 Android (x86_64, debug) - name: 🤖 Android (x86_64, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: editor target: template_debug
arch: x86_64 arch: x86_64
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -165,40 +156,10 @@ jobs:
- name: 🤖 Android (x86_32, debug) - name: 🤖 Android (x86_32, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: editor target: template_debug
arch: x86_32 arch: x86_32
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (arm64, release)
runner: macos-latest
platform: ios
target: template_release
arch: arm64
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (arm64, debug)
runner: macos-latest
platform: ios
target: editor
arch: arm64
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (simulator, release)
runner: macos-latest
platform: ios
target: template_release
arch: universal
scons-flags: ios_simulator=yes
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (simulator, debug)
runner: macos-latest
platform: ios
target: editor
arch: universal
scons-flags: ios_simulator=yes
should-build: ${{ !inputs.test-build }}
exclude: exclude:
- { opts: { should-build: false } } - { opts: { should-build: false } }
@ -286,29 +247,26 @@ jobs:
uses: ammaraskar/msvc-problem-matcher@master uses: ammaraskar/msvc-problem-matcher@master
- name: Set up scons cache - name: Set up scons cache
if: inputs.test-build # ! Only cache test/PR builds
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ${{github.workspace}}/.scons_cache/ path: ${{github.workspace}}/.scons_cache/
key: ${{env.BIN}}-${{inputs.debug-symbols}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}} key: ${{env.BIN}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
restore-keys: | restore-keys: |
${{env.BIN}}-${{inputs.debug-symbols}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}} ${{env.BIN}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
${{env.BIN}}-${{inputs.debug-symbols}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}} ${{env.BIN}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}
${{env.BIN}}-${{inputs.debug-symbols}}-${{inputs.godot-cpp-ref}} ${{env.BIN}}-${{inputs.godot-cpp-ref}}
- name: Compilation - name: Compilation
shell: bash shell: bash
env: env:
SCONS_CACHE: ${{github.workspace}}/.scons_cache/ SCONS_CACHE: ${{github.workspace}}/.scons_cache/
DEBUG_FLAGS: ${{ inputs.debug-symbols && 'debug_symbols=yes symbols_visibility=visible' || 'debug_symbols=no' }}
run: | run: |
PATH=${GITHUB_WORKSPACE}/buildroot/bin:$PATH PATH=${GITHUB_WORKSPACE}/buildroot/bin:$PATH
scons platform=${{matrix.opts.platform}} target=${{matrix.opts.target}} arch=${{matrix.opts.arch}} ${{env.DEBUG_FLAGS}} ${{matrix.opts.scons-flags}} ${{env.SCONSFLAGS}} scons platform=${{matrix.opts.platform}} target=${{matrix.opts.target}} arch=${{matrix.opts.arch}} ${{env.SCONSFLAGS}}
- name: Prepare artifact - name: Prepare artifact
shell: bash shell: bash
run: | run: |
ls -R demo/addons/limboai/
mkdir out mkdir out
mv demo/addons/ out/ mv demo/addons/ out/
cp {README,LICENSE,LOGO_LICENSE}.md out/addons/limboai/ cp {README,LICENSE,LOGO_LICENSE}.md out/addons/limboai/
@ -352,7 +310,7 @@ jobs:
echo "Downloading Godot ${GODOT_VERSION}" echo "Downloading Godot ${GODOT_VERSION}"
mkdir bin mkdir bin
cd bin cd bin
wget "https://github.com/${GODOT_REPO}/releases/download/${GODOT_VERSION}/Godot_v${GODOT_VERSION}_linux.x86_64.zip" -O godot.zip wget "https://github.com/godotengine/godot/releases/download/${GODOT_VERSION}/Godot_v${GODOT_VERSION}_linux.x86_64.zip" -O godot.zip
unzip godot.zip unzip godot.zip
rm godot.zip rm godot.zip
mv Godot_* godot mv Godot_* godot

View File

@ -136,25 +136,17 @@ jobs:
- name: Set up Vulkan SDK - name: Set up Vulkan SDK
run: | run: |
# ! Note: Vulkan SDK changed packaging, so we need to inline these steps for the time being. sh misc/scripts/install_vulkan_sdk_macos.sh
#sh misc/scripts/install_vulkan_sdk_macos.sh
curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.zip" -o /tmp/vulkan-sdk.zip - name: Set up scons cache
unzip /tmp/vulkan-sdk.zip -d /tmp uses: actions/cache@v4
/tmp/InstallVulkan.app/Contents/MacOS/InstallVulkan --accept-licenses --default-answer --confirm-command install with:
rm -Rf /tmp/InstallVulkan.app path: ${{github.workspace}}/.scons_cache/
rm -f /tmp/vulkan-sdk.zip key: ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
restore-keys: |
# ! Note: we stopped using the scons cache in release builds. ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# - name: Set up scons cache ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}
# uses: actions/cache@v4 ${{env.BIN}}-${{inputs.godot-ref}}
# with:
# path: ${{github.workspace}}/.scons_cache/
# key: ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# restore-keys: |
# ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}
# ${{env.BIN}}-${{inputs.godot-ref}}
- name: Compilation - name: Compilation
env: env:
@ -200,14 +192,7 @@ jobs:
- name: Set up Vulkan SDK - name: Set up Vulkan SDK
run: | run: |
# ! Note: Vulkan SDK changed packaging, so we need to inline these steps for the time being. sh misc/scripts/install_vulkan_sdk_macos.sh
#sh misc/scripts/install_vulkan_sdk_macos.sh
curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.zip" -o /tmp/vulkan-sdk.zip
unzip /tmp/vulkan-sdk.zip -d /tmp
/tmp/InstallVulkan.app/Contents/MacOS/InstallVulkan --accept-licenses --default-answer --confirm-command install
rm -Rf /tmp/InstallVulkan.app
rm -f /tmp/vulkan-sdk.zip
- name: Download templates artifact - name: Download templates artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4

View File

@ -11,7 +11,7 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean type: boolean
default: false default: false
@ -26,7 +26,7 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean type: boolean
default: false default: false
@ -227,7 +227,6 @@ jobs:
sudo apt-get install libwayland-dev sudo apt-get install libwayland-dev
- name: Set up scons cache - name: Set up scons cache
if: inputs.test-build # ! Only cache test/PR builds
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ${{github.workspace}}/.scons_cache/ path: ${{github.workspace}}/.scons_cache/
@ -249,7 +248,6 @@ jobs:
uses: ./modules/limboai/.github/actions/build-dotnet-assemblies uses: ./modules/limboai/.github/actions/build-dotnet-assemblies
with: with:
platform: linuxbsd platform: linuxbsd
bin: ${{env.BIN}}
- name: Prepare artifact - name: Prepare artifact
env: env:

View File

@ -11,7 +11,7 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean type: boolean
default: false default: false
@ -26,7 +26,7 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean type: boolean
default: false default: false
@ -165,19 +165,9 @@ jobs:
- name: Set up Vulkan SDK - name: Set up Vulkan SDK
run: | run: |
# ! Note: Vulkan SDK changed packaging, so we need to inline these steps for the time being. sh misc/scripts/install_vulkan_sdk_macos.sh
#sh misc/scripts/install_vulkan_sdk_macos.sh
curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/config.json" -o /tmp/vulkan-sdk.json
sdk_version=`jq -r '.version' /tmp/vulkan-sdk.json`
curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.zip" -o /tmp/vulkan-sdk.zip
unzip /tmp/vulkan-sdk.zip -d /tmp
/tmp/InstallVulkan-${sdk_version}.app/Contents/MacOS/InstallVulkan-${sdk_version} --accept-licenses --default-answer --confirm-command install
rm -Rf /tmp/InstallVulkan-${sdk_version}.app
rm -f /tmp/vulkan-sdk.zip
- name: Set up scons cache - name: Set up scons cache
if: inputs.test-build # ! Only cache test/PR builds
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ${{github.workspace}}/.scons_cache/ path: ${{github.workspace}}/.scons_cache/
@ -198,7 +188,6 @@ jobs:
uses: ./modules/limboai/.github/actions/build-dotnet-assemblies uses: ./modules/limboai/.github/actions/build-dotnet-assemblies
with: with:
platform: macos platform: macos
bin: ${{env.BIN}}
- name: Prepare artifact - name: Prepare artifact
run: | run: |

View File

@ -26,8 +26,8 @@ concurrency:
# Global Settings. # Global Settings.
env: env:
GODOT_REF: "master" GODOT_REF: "4.3-stable"
GODOT_CPP_REF: "master" GODOT_CPP_REF: "godot-4.3-stable"
jobs: jobs:
unit-tests: unit-tests:
@ -36,7 +36,7 @@ jobs:
# Settings # Settings
env: env:
SCONSFLAGS: platform=linuxbsd target=editor arch=x86_64 production=false dev_build=true tests=true verbose=yes warnings=extra werror=yes strict_checks=yes SCONSFLAGS: platform=linuxbsd target=editor arch=x86_64 production=false dev_build=true tests=true verbose=yes warnings=extra werror=yes
SCONS_CACHE_LIMIT: 7168 SCONS_CACHE_LIMIT: 7168
BIN: godot.linuxbsd.editor.dev.x86_64 BIN: godot.linuxbsd.editor.dev.x86_64
@ -101,18 +101,6 @@ jobs:
run: | run: |
bin/${{ env.BIN }} --test --headless bin/${{ env.BIN }} --test --headless
static-checks:
name: ⚙️ Static checks
runs-on: ubuntu-20.04
steps:
- name: Clone LimboAI module
uses: actions/checkout@v4
- name: Code style checks
uses: pre-commit/action@v3.0.1
with:
extra_args: --all-files
cache-env: cache-env:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:

View File

@ -120,16 +120,15 @@ jobs:
python --version python --version
scons --version scons --version
# ! Note: we stopped using the scons cache in release builds. - name: Set up scons cache
# - name: Set up scons cache uses: actions/cache@v4
# uses: actions/cache@v4 with:
# with: path: ${{github.workspace}}/.scons_cache/
# path: ${{github.workspace}}/.scons_cache/ key: ${{env.CACHE_NAME}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# key: ${{env.CACHE_NAME}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}} restore-keys: |
# restore-keys: | ${{env.CACHE_NAME}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
# ${{env.CACHE_NAME}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}} ${{env.CACHE_NAME}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}
# ${{env.CACHE_NAME}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}} ${{env.CACHE_NAME}}-${{inputs.godot-ref}}
# ${{env.CACHE_NAME}}-${{inputs.godot-ref}}
- name: Compilation - name: Compilation
env: env:

View File

@ -11,7 +11,7 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean type: boolean
default: false default: false
@ -26,23 +26,22 @@ on:
type: string type: string
default: master default: master
test-build: test-build:
description: Limit to pre-defined test builds description: Should we perform only a limited number of test builds?
type: boolean type: boolean
default: false default: false
# Global Settings # Global Settings
env: env:
BUILD_IMAGE_VERSION: 4.3-f40 SCONS_CACHE_MSVC_CONFIG: true
MESA_VERSION: 23.1.9-1
SCONS_CACHE_LIMIT: 4096 SCONS_CACHE_LIMIT: 4096
SCONSFLAGS: production=yes use_mingw=yes verbose=yes warnings=no progress=no d3d12=yes SCONSFLAGS: production=yes tests=no verbose=yes warnings=extra werror=yes
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
jobs: jobs:
windows-builds: windows-builds:
runs-on: "ubuntu-24.04" runs-on: "windows-latest"
name: ${{ matrix.opts.name }} name: ${{ matrix.opts.name }}
outputs:
built-dotnet-editor: ${{ steps.mark-dotnet-editor.outputs.built-dotnet-editor }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -52,21 +51,18 @@ jobs:
- name: Editor (x86_64, release) - name: Editor (x86_64, release)
target: editor target: editor
arch: x86_64 arch: x86_64
llvm: false
dotnet: false dotnet: false
should-build: true should-build: true
- name: Template (x86_64, release) - name: Template (x86_64, release)
target: template_release target: template_release
arch: x86_64 arch: x86_64
llvm: false
dotnet: false dotnet: false
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template (x86_64, debug) - name: Template (x86_64, debug)
target: template_debug target: template_debug
arch: x86_64 arch: x86_64
llvm: false
dotnet: false dotnet: false
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -75,21 +71,18 @@ jobs:
# - name: Editor (x86_32, release) # - name: Editor (x86_32, release)
# target: editor # target: editor
# arch: x86_32 # arch: x86_32
# llvm: false
# dotnet: false # dotnet: false
# should-build: ${{ !inputs.test-build }} # should-build: ${{ !inputs.test-build }}
- name: Template (x86_32, release) - name: Template (x86_32, release)
target: template_release target: template_release
arch: x86_32 arch: x86_32
llvm: false
dotnet: false dotnet: false
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template (x86_32, debug) - name: Template (x86_32, debug)
target: template_debug target: template_debug
arch: x86_32 arch: x86_32
llvm: false
dotnet: false dotnet: false
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -98,24 +91,19 @@ jobs:
# - name: Editor (arm64, release) # - name: Editor (arm64, release)
# target: editor # target: editor
# arch: arm64 # arch: arm64
# llvm: true
# dotnet: false # dotnet: false
# should-build: ${{ !inputs.test-build }} # should-build: ${{ !inputs.test-build }}
- name: Template (arm64, release) - name: Template (arm64, release)
target: template_release target: template_release
arch: arm64 arch: arm64
llvm: true
dotnet: false dotnet: false
scons-flags: mingw_prefix=/root/llvm-mingw
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template (arm64, debug) - name: Template (arm64, debug)
target: template_debug target: template_debug
arch: arm64 arch: arm64
llvm: true
dotnet: false dotnet: false
scons-flags: mingw_prefix=/root/llvm-mingw
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
# * .NET x86_64 # * .NET x86_64
@ -123,21 +111,18 @@ jobs:
- name: Editor .NET (x86_64, release) - name: Editor .NET (x86_64, release)
target: editor target: editor
arch: x86_64 arch: x86_64
llvm: false
dotnet: true dotnet: true
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template .NET (x86_64, release) - name: Template .NET (x86_64, release)
target: template_release target: template_release
arch: x86_64 arch: x86_64
llvm: false
dotnet: true dotnet: true
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template .NET (x86_64, debug) - name: Template .NET (x86_64, debug)
target: template_debug target: template_debug
arch: x86_64 arch: x86_64
llvm: false
dotnet: true dotnet: true
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -146,54 +131,46 @@ jobs:
# - name: Editor .NET (x86_32, release) # - name: Editor .NET (x86_32, release)
# target: editor # target: editor
# arch: x86_32 # arch: x86_32
# llvm: false
# dotnet: true # dotnet: true
# should-build: ${{ !inputs.test-build }} # should-build: ${{ !inputs.test-build }}
- name: Template .NET (x86_32, release) - name: Template .NET (x86_32, release)
target: template_release target: template_release
arch: x86_32 arch: x86_32
llvm: false
dotnet: true dotnet: true
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template .NET (x86_32, debug) - name: Template .NET (x86_32, debug)
target: template_debug target: template_debug
arch: x86_32 arch: x86_32
llvm: false
dotnet: true dotnet: true
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
# * .NET arm64 # * .NET arm64
# - name: Editor .NET (arm64, release) # - name: Editor (arm64, release)
# target: editor # target: editor
# arch: arm64 # arch: arm64
# llvm: true
# dotnet: true # dotnet: true
# should-build: ${{ !inputs.test-build }} # should-build: ${{ !inputs.test-build }}
- name: Template .NET (arm64, release) - name: Template (arm64, release)
target: template_release target: template_release
arch: arm64 arch: arm64
llvm: true
dotnet: true dotnet: true
scons-flags: mingw_prefix=/root/llvm-mingw
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
- name: Template .NET (arm64, debug) - name: Template (arm64, debug)
target: template_debug target: template_debug
arch: arm64 arch: arm64
llvm: true
dotnet: true dotnet: true
scons-flags: mingw_prefix=/root/llvm-mingw
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
exclude: exclude:
- { opts: { should-build: false } } - { opts: { should-build: false } }
env: env:
BIN: godot.windows.${{matrix.opts.target}}.${{matrix.opts.arch}}${{matrix.opts.llvm && '.llvm' || ''}}${{matrix.opts.dotnet == true && '.mono' || ''}} BIN: godot.windows.${{matrix.opts.target}}.${{matrix.opts.arch}}${{ matrix.opts.dotnet == true && '.mono' || '' }}
steps: steps:
- name: Clone Godot - name: Clone Godot
@ -208,11 +185,26 @@ jobs:
path: modules/limboai path: modules/limboai
ref: ${{ inputs.limboai-ref }} ref: ${{ inputs.limboai-ref }}
# Inits GODOT_VERSION, LIMBOAI_VERSION, NAME_PREFIX, GODOT_VERSION_STATUS, BUILD_NAME environment variables. # Inits GODOT_VERSION, LIMBOAI_VERSION and NAME_PREFIX environment variables.
- uses: ./modules/limboai/.github/actions/init-version - uses: ./modules/limboai/.github/actions/init-version
- name: Set up Python 3.x
uses: actions/setup-python@v5
with:
python-version: "3.x"
architecture: "x64"
- name: Set up scons
run: |
python -c "import sys; print(sys.version)"
python -m pip install scons==4.4.0
python --version
scons --version
- name: Set up MSVC problem matcher
uses: ammaraskar/msvc-problem-matcher@master
- name: Set up scons cache - name: Set up scons cache
if: inputs.test-build # ! Only cache test/PR builds
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ${{github.workspace}}/.scons_cache/ path: ${{github.workspace}}/.scons_cache/
@ -222,54 +214,17 @@ jobs:
${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}} ${{env.BIN}}-${{inputs.godot-ref}}-${{inputs.limboai-ref}}
${{env.BIN}}-${{inputs.godot-ref}} ${{env.BIN}}-${{inputs.godot-ref}}
- name: Static ANGLE libs - name: Compilation
env:
SCONS_CACHE: ${{github.workspace}}/.scons_cache/
run: | run: |
mkdir -p deps/angle scons -j2 platform=windows target=${{matrix.opts.target}} arch=${{matrix.opts.arch}} module_mono_enabled=${{matrix.opts.dotnet}} ${{env.SCONSFLAGS}}
cd deps/angle
url=https://github.com/godotengine/godot-angle-static/releases/download/chromium%2F6601.2/godot-angle-static
curl -L -o windows_${{matrix.opts.arch}}.zip $url-${{matrix.opts.arch}}-${{matrix.opts.llvm && 'llvm' || 'gcc'}}-release.zip
unzip windows_${{matrix.opts.arch}}.zip
rm windows_${{matrix.opts.arch}}.zip
- name: Mesa libs - name: Build .NET assemblies
run: | if: matrix.opts.dotnet && matrix.opts.target == 'editor'
mkdir -p deps/mesa uses: ./modules/limboai/.github/actions/build-dotnet-assemblies
cd deps/mesa with:
curl -L -o mesa_${{matrix.opts.arch}}.zip https://github.com/godotengine/godot-nir-static/releases/download/${{env.MESA_VERSION}}/godot-nir-static-${{matrix.opts.arch}}-${{matrix.opts.llvm && 'llvm' || 'gcc'}}-release.zip platform: windows
unzip -o mesa_${{matrix.opts.arch}}.zip
rm -f mesa_${{matrix.opts.arch}}.zip
- name: Pull build container
run: |
podman pull ghcr.io/limbonaut/godot-windows:${{env.BUILD_IMAGE_VERSION}}
- name: Build using container
shell: bash
run: |
scons_command="scons \
platform=windows \
target=${{matrix.opts.target}} \
arch=${{matrix.opts.arch}} \
use_llvm=${{matrix.opts.llvm}} \
module_mono_enabled=${{matrix.opts.dotnet}} \
${{env.SCONSFLAGS}} \
${{matrix.opts.scons-flags}} \
angle_libs=/build/deps/angle \
mesa_libs=/build/deps/mesa \
"
podman_run="podman run -it --rm \
--env GODOT_VERSION_STATUS=${GODOT_VERSION_STATUS} \
--env BUILD_NAME=${BUILD_NAME} \
--env NUM_CORES=$(nproc --all) \
--env DOTNET_NOLOGO=true \
--env DOTNET_CLI_TELEMETRY_OPTOUT=true \
--env SCONS_CACHE=/build/.scons_cache/ \
--env SCONS_CACHE_LIMIT=${SCONS_CACHE_LIMIT} \
-v ${GITHUB_WORKSPACE}/:/build/ \
-w /build godot-windows:${{env.BUILD_IMAGE_VERSION}} bash -c \
"
echo "Running ${podman_run} \"${scons_command}\""
${podman_run} "${scons_command}"
- name: Prepare artifact - name: Prepare artifact
shell: bash shell: bash
@ -297,62 +252,3 @@ jobs:
with: with:
name: ${{env.NAME_PREFIX}}${{matrix.opts.dotnet == true && '.dotnet' || ''}}.${{matrix.opts.target}}.windows.${{matrix.opts.arch}} name: ${{env.NAME_PREFIX}}${{matrix.opts.dotnet == true && '.dotnet' || ''}}.${{matrix.opts.target}}.windows.${{matrix.opts.arch}}
path: out/* path: out/*
- name: Mark .NET editor as built
if: matrix.opts.dotnet && matrix.opts.target == 'editor'
id: mark-dotnet-editor
run: echo "built-dotnet-editor=true" >> $GITHUB_OUTPUT
dotnet-assemblies:
name: .NET assembly for ${{matrix.opts.arch}}
needs: windows-builds
if: always() && needs.windows-builds.outputs.built-dotnet-editor == 'true'
runs-on: "windows-latest"
strategy:
fail-fast: false
matrix:
opts:
- arch: x86_64
llvm: false
env:
BIN: godot.windows.editor.${{matrix.opts.arch}}${{matrix.opts.llvm && '.llvm' || ''}}.mono
steps:
- name: Clone Godot
uses: actions/checkout@v4
with:
repository: godotengine/godot
ref: ${{ inputs.godot-ref }}
- name: Clone LimboAI module
uses: actions/checkout@v4
with:
path: modules/limboai
ref: ${{ inputs.limboai-ref }}
# Inits GODOT_VERSION, LIMBOAI_VERSION and NAME_PREFIX environment variables.
- uses: ./modules/limboai/.github/actions/init-version
- name: Reconstruct artifact name
shell: bash
run: |
echo "ARTIFACT=${{env.NAME_PREFIX}}.dotnet.editor.windows.${{matrix.opts.arch}}" >> $GITHUB_ENV
- name: Download editor artifact
uses: actions/download-artifact@v4
with:
name: ${{env.ARTIFACT}}
path: bin/
- name: Build .NET assemblies
uses: ./modules/limboai/.github/actions/build-dotnet-assemblies
with:
platform: windows
bin: ${{env.BIN}}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{env.ARTIFACT}}
overwrite: true
path: bin/*

View File

@ -1,4 +1,4 @@
Copyright (c) 2023-2025 Serhii Snitsaruk and the LimboAI contributors. Copyright 2021-2024 Serhii Snitsaruk
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: 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:

View File

@ -16,7 +16,7 @@
**LimboAI** is an open-source C++ plugin for **Godot Engine 4** providing a combination of **LimboAI** is an open-source C++ plugin for **Godot Engine 4** providing a combination of
**Behavior Trees** and **State Machines**, which can be used together to create complex AI behaviors. **Behavior Trees** and **State Machines**, which can be used together to create complex AI behaviors.
It comes with a behavior tree editor, built-in documentation, visual debugger, extensive demo project with a tutorial, and more! It comes with a behavior tree editor, built-in documentation, visual debugger, extensive demo project with a tutorial, and more!
While it is implemented in C++, it fully supports GDScript for [creating your own tasks](https://limboai.readthedocs.io/en/stable/behavior-trees/custom-tasks.html) and [states](https://limboai.readthedocs.io/en/stable/hierarchical-state-machines/create-hsm.html). While it is implemented in C++, it fully supports GDScript for [creating your own tasks](https://limboai.readthedocs.io/en/stable/getting-started/custom-tasks.html) and [states](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html).
If you enjoy using LimboAI, please **consider supporting** my efforts with a donation on Ko-fi 😊 Your contribution will help me continue developing and improving it. If you enjoy using LimboAI, please **consider supporting** my efforts with a donation on Ko-fi 😊 Your contribution will help me continue developing and improving it.
@ -24,7 +24,7 @@ If you enjoy using LimboAI, please **consider supporting** my efforts with a don
![Textured screenshot](doc/images/behavior-tree-editor-debugger.png) ![Textured screenshot](doc/images/behavior-tree-editor-debugger.png)
Behavior Trees are powerful hierarchical structures used to model and control the behavior of agents in a game (e.g., characters, enemies). They are designed to make it easier to create rich and highly modular behaviors for your games. To learn more about behavior trees, check out [Introduction to Behavior Trees](https://limboai.readthedocs.io/en/stable/behavior-trees/introduction.html) and our demo project, which includes a tutorial. Behavior Trees are powerful hierarchical structures used to model and control the behavior of agents in a game (e.g., characters, enemies). They are designed to make it easier to create rich and highly modular behaviors for your games. To learn more about behavior trees, check out [Introduction to Behavior Trees](https://limboai.readthedocs.io/en/stable/getting-started/introduction.html) and our demo project, which includes a tutorial.
## Demonstration ## Demonstration
@ -50,13 +50,13 @@ Behavior Trees are powerful hierarchical structures used to model and control th
- Execute `BehaviorTree` resources using the `BTPlayer` node. - Execute `BehaviorTree` resources using the `BTPlayer` node.
- Create complex behaviors by combining and nesting tasks in a hierarchy. - Create complex behaviors by combining and nesting tasks in a hierarchy.
- Control execution flow using composite, decorator, and condition tasks. - Control execution flow using composite, decorator, and condition tasks.
- [Create custom tasks](https://limboai.readthedocs.io/en/stable/behavior-trees/custom-tasks.html) by extending core classes: `BTAction`, `BTCondition`, `BTDecorator`, and `BTComposite`. - [Create custom tasks](https://limboai.readthedocs.io/en/stable/getting-started/custom-tasks.html) by extending core classes: `BTAction`, `BTCondition`, `BTDecorator`, and `BTComposite`.
- Built-in class documentation. - Built-in class documentation.
- Blackboard system: Share data seamlessly between tasks using the `Blackboard`. - Blackboard system: Share data seamlessly between tasks using the `Blackboard`.
- Blackboard plans: Define variables in the BehaviorTree resource and override their values in the BTPlayer node. - Blackboard plans: Define variables in the BehaviorTree resource and override their values in the BTPlayer node.
- Plan editor: Manage variables, their data types and property hints. - Plan editor: Manage variables, their data types and property hints.
- Blackboard scopes: Prevent name conflicts and enable advanced techniques like [sharing data between several agents](https://limboai.readthedocs.io/en/stable/behavior-trees/using-blackboard.html#sharing-data-between-several-agents). - Blackboard scopes: Prevent name conflicts and enable advanced techniques like [sharing data between several agents](https://limboai.readthedocs.io/en/stable/getting-started/using-blackboard.html#sharing-data-between-several-agents).
- Blackboard parameters: [Export a BB parameter](https://limboai.readthedocs.io/en/stable/behavior-trees/using-blackboard.html#task-parameters), for which user can provide a value or bind it to a blackboard variable (can be used in custom tasks). - Blackboard parameters: [Export a BB parameter](https://limboai.readthedocs.io/en/stable/getting-started/using-blackboard.html#task-parameters), for which user can provide a value or bind it to a blackboard variable (can be used in custom tasks).
- Inspector support for specifying blackboard variables (custom editor for exported `StringName` properties ending with "_var"). - Inspector support for specifying blackboard variables (custom editor for exported `StringName` properties ending with "_var").
- Use the `BTSubtree` task to execute a tree from a different resource file, promoting organization and reusability. - Use the `BTSubtree` task to execute a tree from a different resource file, promoting organization and reusability.
- Visual Debugger: Inspect the execution of any BT in a running scene to identify and troubleshoot issues. - Visual Debugger: Inspect the execution of any BT in a running scene to identify and troubleshoot issues.
@ -67,24 +67,24 @@ Behavior Trees are powerful hierarchical structures used to model and control th
- Extend the `LimboState` class to implement state logic. - Extend the `LimboState` class to implement state logic.
- `LimboHSM` node serves as a state machine that manages `LimboState` instances and transitions. - `LimboHSM` node serves as a state machine that manages `LimboState` instances and transitions.
- `LimboHSM` is a state itself and can be nested within other `LimboHSM` instances. - `LimboHSM` is a state itself and can be nested within other `LimboHSM` instances.
- [Event-based](https://limboai.readthedocs.io/en/stable/hierarchical-state-machines/create-hsm.html#events-and-transitions): Transitions are associated with events and are triggered by the state machine when the relevant event is dispatched, allowing for better decoupling of transitions from state logic. - [Event-based](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html#events-and-transitions): Transitions are associated with events and are triggered by the state machine when the relevant event is dispatched, allowing for better decoupling of transitions from state logic.
- Combine state machines with behavior trees using `BTState` for advanced reactive AI. - Combine state machines with behavior trees using `BTState` for advanced reactive AI.
- Delegation Option: Using the vanilla `LimboState`, [delegate the implementation](https://limboai.readthedocs.io/en/stable/hierarchical-state-machines/create-hsm.html#single-file-state-machine-setup) to your callback functions, making it perfect for rapid prototyping and game jams. - Delegation Option: Using the vanilla `LimboState`, [delegate the implementation](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html#single-file-state-machine-setup) to your callback functions, making it perfect for rapid prototyping and game jams.
- 🛈 Note: State machine setup and initialization require code; there is no GUI editor. - 🛈 Note: State machine setup and initialization require code; there is no GUI editor.
- **Tested:** Behavior tree tasks and HSM are covered by unit tests. - **Tested:** Behavior tree tasks and HSM are covered by unit tests.
- **GDExtension:** LimboAI can be [used as extension](https://limboai.readthedocs.io/en/stable/getting-started/getting-limboai.html#get-gdextension-version). Custom engine builds are not necessary. - **GDExtension:** LimboAI can be [used as extension](https://limboai.readthedocs.io/en/stable/getting-started/gdextension.html). Custom engine builds are not necessary.
- **Demo + Tutorial:** Check out our extensive demo project, which includes an introduction to behavior trees using examples. - **Demo + Tutorial:** Check out our extensive demo project, which includes an introduction to behavior trees using examples.
## First steps ## First steps
Follow the [Getting started](https://limboai.readthedocs.io/en/stable/getting-started/getting-limboai.html) guide to learn how to get started with LimboAI and the demo project. Follow the [First steps](https://limboai.readthedocs.io/en/stable/index.html#first-steps) guide to learn how to get started with LimboAI and the demo project.
## Getting LimboAI ## Getting LimboAI
LimboAI can be used as either a C++ module or as a GDExtension shared library. GDExtension version is more convenient to use but somewhat limited in features. Whichever you choose to use, your project will stay compatible with both and you can switch from one to the other any time. See [Using GDExtension](https://limboai.readthedocs.io/en/stable/getting-started/getting-limboai.html#get-gdextension-version). LimboAI can be used as either a C++ module or as a GDExtension shared library. GDExtension version is more convenient to use but somewhat limited in features. Whichever you choose to use, your project will stay compatible with both and you can switch from one to the other any time. See [Using GDExtension](https://limboai.readthedocs.io/en/stable/getting-started/gdextension.html).
### Precompiled builds ### Precompiled builds
@ -109,20 +109,19 @@ LimboAI can be used as either a C++ module or as a GDExtension shared library. G
## Using the plugin ## Using the plugin
- Online Documentation: [stable](https://limboai.readthedocs.io/en/stable/index.html), [latest](https://limboai.readthedocs.io/en/latest/index.html) - Online Documentation: [stable](https://limboai.readthedocs.io/en/stable/index.html), [latest](https://limboai.readthedocs.io/en/latest/index.html)
- [Getting started](https://limboai.readthedocs.io/en/stable/getting-started/getting-limboai.html) - [First steps](https://limboai.readthedocs.io/en/stable/index.html#first-steps)
- [Introduction to Behavior Trees](https://limboai.readthedocs.io/en/stable/behavior-trees/introduction.html) - [Introduction to Behavior Trees](https://limboai.readthedocs.io/en/stable/getting-started/introduction.html)
- [Creating custom tasks in GDScript](https://limboai.readthedocs.io/en/stable/behavior-trees/custom-tasks.html) - [Creating custom tasks in GDScript](https://limboai.readthedocs.io/en/stable/getting-started/custom-tasks.html)
- [Sharing data using Blackboard](https://limboai.readthedocs.io/en/stable/behavior-trees/using-blackboard.html) - [Sharing data using Blackboard](https://limboai.readthedocs.io/en/stable/getting-started/using-blackboard.html)
- [Accessing nodes in the scene tree](https://limboai.readthedocs.io/en/stable/behavior-trees/accessing-nodes.html) - [Accessing nodes in the scene tree](https://limboai.readthedocs.io/en/stable/getting-started/accessing-nodes.html)
- [State machines](https://limboai.readthedocs.io/en/stable/hierarchical-state-machines/create-hsm.html) - [State machines](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html)
- [Using GDExtension](https://limboai.readthedocs.io/en/stable/getting-started/getting-limboai.html#get-gdextension-version) - [Using GDExtension](https://limboai.readthedocs.io/en/stable/getting-started/gdextension.html)
- [Using LimboAI with C#](https://limboai.readthedocs.io/en/stable/getting-started/c-sharp.html) - [Using LimboAI with C#](https://limboai.readthedocs.io/en/stable/getting-started/c-sharp.html)
- [Class reference](https://limboai.readthedocs.io/en/stable/classes/featured-classes.html) - [Class reference](https://limboai.readthedocs.io/en/stable/getting-started/featured-classes.html)
## Contributing ## Contributing
Contributions are welcome! Please open issues for bug reports, feature requests, or code changes. Contributions are welcome! Please open issues for bug reports, feature requests, or code changes. Keep the minor versions backward-compatible when submitting pull requests.
For detailed guidelines on contributing to code or documentation, check out our [Contributing](https://limboai.readthedocs.io/en/latest/getting-started/contributing.html) page.
If you have an idea for a behavior tree task or a feature that could be useful in a variety of projects, open an issue to discuss it. If you have an idea for a behavior tree task or a feature that could be useful in a variety of projects, open an issue to discuss it.

View File

@ -1,7 +1,7 @@
/** /**
* bb_aabb.h * bb_aabb.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_array.h * bb_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_basis.h * bb_basis.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_bool.h * bb_bool.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_byte_array.h * bb_byte_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_color.h * bb_color.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_color_array.h * bb_color_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_dictionary.h * bb_dictionary.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_float.h * bb_float.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_float32_array.h * bb_float32_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_float64_array.h * bb_float64_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_int.h * bb_int.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_int32_array.h * bb_int32_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_int64_array.h * bb_int64_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_node.cpp * bb_node.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -13,7 +13,7 @@
Variant BBNode::get_value(Node *p_scene_root, const Ref<Blackboard> &p_blackboard, const Variant &p_default) { Variant BBNode::get_value(Node *p_scene_root, const Ref<Blackboard> &p_blackboard, const Variant &p_default) {
ERR_FAIL_NULL_V_MSG(p_scene_root, Variant(), "BBNode: get_value() failed - scene_root is null."); ERR_FAIL_NULL_V_MSG(p_scene_root, Variant(), "BBNode: get_value() failed - scene_root is null.");
ERR_FAIL_COND_V_MSG(p_blackboard.is_null(), Variant(), "BBNode: get_value() failed - blackboard is null."); ERR_FAIL_NULL_V_MSG(p_blackboard, Variant(), "BBNode: get_value() failed - blackboard is null.");
Variant val; Variant val;
if (get_value_source() == SAVED_VALUE) { if (get_value_source() == SAVED_VALUE) {

View File

@ -1,7 +1,7 @@
/** /**
* bb_node.h * bb_node.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_param.cpp * bb_param.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_param.h * bb_param.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_plane.h * bb_plane.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_projection.h * bb_projection.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_quaternion.h * bb_quaternion.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_rect2.h * bb_rect2.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_rect2i.h * bb_rect2i.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_string.h * bb_string.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_string_array.h * bb_string_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_string_name.h * bb_string_name.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_transform2d.h * bb_transform2d.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_transform3d.h * bb_transform3d.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_variant.cpp * bb_variant.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_variant.h * bb_variant.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector2.h * bb_vector2.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector2_array.h * bb_vector2_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector2i.h * bb_vector2i.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector3.h * bb_vector3.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector3_array.h * bb_vector3_array.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector3i.h * bb_vector3i.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector4.h * bb_vector4.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_vector4i.h * bb_vector4i.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_variable.cpp * bb_variable.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bb_variable.h * bb_variable.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* blackboard.cpp * blackboard.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -10,7 +10,6 @@
*/ */
#include "blackboard.h" #include "blackboard.h"
#include "../util/limbo_compat.h"
#ifdef LIMBOAI_MODULE #ifdef LIMBOAI_MODULE
#include "core/variant/variant.h" #include "core/variant/variant.h"
@ -76,26 +75,6 @@ TypedArray<StringName> Blackboard::list_vars() const {
return var_names; return var_names;
} }
void Blackboard::print_state() const {
Ref<Blackboard> bb{ this };
int scope_idx = 0;
while (bb.is_valid()) {
int i = 0;
String line = "Scope " + itos(scope_idx) + ": { ";
for (const KeyValue<StringName, BBVariable> &kv : bb->data) {
if (i > 0) {
line += ", ";
}
line += String(kv.key) + ": " + String(kv.value.get_value());
i++;
}
line += " }";
PRINT_LINE(line);
bb = bb->get_parent();
scope_idx++;
}
}
Dictionary Blackboard::get_vars_as_dict() const { Dictionary Blackboard::get_vars_as_dict() const {
Dictionary dict; Dictionary dict;
for (const KeyValue<StringName, BBVariable> &kv : data) { for (const KeyValue<StringName, BBVariable> &kv : data) {
@ -157,7 +136,6 @@ void Blackboard::_bind_methods() {
ClassDB::bind_method(D_METHOD("erase_var", "var_name"), &Blackboard::erase_var); ClassDB::bind_method(D_METHOD("erase_var", "var_name"), &Blackboard::erase_var);
ClassDB::bind_method(D_METHOD("clear"), &Blackboard::clear); ClassDB::bind_method(D_METHOD("clear"), &Blackboard::clear);
ClassDB::bind_method(D_METHOD("list_vars"), &Blackboard::list_vars); ClassDB::bind_method(D_METHOD("list_vars"), &Blackboard::list_vars);
ClassDB::bind_method(D_METHOD("print_state"), &Blackboard::print_state);
ClassDB::bind_method(D_METHOD("get_vars_as_dict"), &Blackboard::get_vars_as_dict); ClassDB::bind_method(D_METHOD("get_vars_as_dict"), &Blackboard::get_vars_as_dict);
ClassDB::bind_method(D_METHOD("populate_from_dict", "dictionary"), &Blackboard::populate_from_dict); ClassDB::bind_method(D_METHOD("populate_from_dict", "dictionary"), &Blackboard::populate_from_dict);
ClassDB::bind_method(D_METHOD("top"), &Blackboard::top); ClassDB::bind_method(D_METHOD("top"), &Blackboard::top);

View File

@ -1,7 +1,7 @@
/** /**
* blackboard.h * blackboard.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -57,7 +57,6 @@ public:
void erase_var(const StringName &p_name); void erase_var(const StringName &p_name);
void clear() { data.clear(); } void clear() { data.clear(); }
TypedArray<StringName> list_vars() const; TypedArray<StringName> list_vars() const;
void print_state() const;
Dictionary get_vars_as_dict() const; Dictionary get_vars_as_dict() const;
void populate_from_dict(const Dictionary &p_dictionary); void populate_from_dict(const Dictionary &p_dictionary);

View File

@ -1,7 +1,7 @@
/** /**
* blackboard_plan.cpp * blackboard_plan.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -13,20 +13,9 @@
#include "../util/limbo_utility.h" #include "../util/limbo_utility.h"
#ifdef LIMBOAI_MODULE
#include "editor/editor_inspector.h"
#include "editor/editor_interface.h"
#elif LIMBOAI_GDEXTENSION
#include <godot_cpp/classes/editor_inspector.hpp>
#include <godot_cpp/classes/editor_interface.hpp>
#include <godot_cpp/classes/engine.hpp>
#include <godot_cpp/classes/scene_tree.hpp>
#endif
bool BlackboardPlan::_set(const StringName &p_name, const Variant &p_value) { bool BlackboardPlan::_set(const StringName &p_name, const Variant &p_value) {
String name_str = p_name; String name_str = p_name;
#ifdef TOOLS_ENABLED
// * Editor // * Editor
if (var_map.has(p_name)) { if (var_map.has(p_name)) {
BBVariable &var = var_map[p_name]; BBVariable &var = var_map[p_name];
@ -37,51 +26,29 @@ bool BlackboardPlan::_set(const StringName &p_name, const Variant &p_value) {
} }
return true; return true;
} }
#endif // TOOLS_ENABLED
// * Mapping // * Mapping
if (name_str.begins_with("mapping/")) { if (name_str.begins_with("mapping/")) {
StringName mapped_var_name = name_str.get_slicec('/', 1); StringName mapped_var_name = name_str.get_slicec('/', 1);
StringName value = p_value; StringName value = p_value;
bool prop_list_changed = false; bool properties_changed = false;
if (value == StringName()) { if (value == StringName()) {
if (parent_scope_mapping.has(mapped_var_name)) { if (parent_scope_mapping.has(mapped_var_name)) {
prop_list_changed = true; properties_changed = true;
parent_scope_mapping.erase(mapped_var_name); parent_scope_mapping.erase(mapped_var_name);
} }
} else { } else {
if (!parent_scope_mapping.has(mapped_var_name)) { if (!parent_scope_mapping.has(mapped_var_name)) {
prop_list_changed = true; properties_changed = true;
} }
parent_scope_mapping[mapped_var_name] = value; parent_scope_mapping[mapped_var_name] = value;
} }
if (prop_list_changed) { if (properties_changed) {
notify_property_list_changed(); notify_property_list_changed();
} }
return true; return true;
} }
// * Binding
if (name_str.begins_with("binding/")) {
StringName bound_var = name_str.get_slicec('/', 1);
NodePath value = p_value;
bool prop_list_changed = false;
if (value.is_empty()) {
if (property_bindings.has(bound_var)) {
prop_list_changed = true;
property_bindings.erase(bound_var);
}
} else {
if (!property_bindings.has(bound_var)) {
prop_list_changed = true;
}
property_bindings[bound_var] = value;
}
if (prop_list_changed) {
notify_property_list_changed();
}
}
// * Storage // * Storage
if (name_str.begins_with("var/")) { if (name_str.begins_with("var/")) {
StringName var_name = name_str.get_slicec('/', 1); StringName var_name = name_str.get_slicec('/', 1);
@ -99,8 +66,6 @@ bool BlackboardPlan::_set(const StringName &p_name, const Variant &p_value) {
var_map[var_name].set_hint((PropertyHint)(int)p_value); var_map[var_name].set_hint((PropertyHint)(int)p_value);
} else if (what == "hint_string") { } else if (what == "hint_string") {
var_map[var_name].set_hint_string(p_value); var_map[var_name].set_hint_string(p_value);
} else if (what == "property_binding") {
property_bindings[var_name] = NodePath(p_value);
} else { } else {
return false; return false;
} }
@ -113,64 +78,28 @@ bool BlackboardPlan::_set(const StringName &p_name, const Variant &p_value) {
bool BlackboardPlan::_get(const StringName &p_name, Variant &r_ret) const { bool BlackboardPlan::_get(const StringName &p_name, Variant &r_ret) const {
String name_str = p_name; String name_str = p_name;
#ifdef TOOLS_ENABLED
// * Editor // * Editor
if (var_map.has(p_name)) { if (var_map.has(p_name)) {
if (has_mapping(p_name)) { if (has_mapping(p_name)) {
r_ret = "Mapped to " + LimboUtility::get_singleton()->decorate_var(parent_scope_mapping[p_name]); r_ret = "Mapped to " + LimboUtility::get_singleton()->decorate_var(parent_scope_mapping[p_name]);
} else if (has_property_binding(p_name)) {
const NodePath &binding = property_bindings[p_name];
Node *edited_node = Object::cast_to<Node>(EditorInterface::get_singleton()->get_inspector()->get_edited_object());
if (!edited_node) {
edited_node = SCENE_TREE()->get_edited_scene_root();
}
Node *bound_node = edited_node ? edited_node->get_node_or_null(binding) : nullptr;
String shortened_path;
if (bound_node) {
shortened_path = (String)bound_node->get_name() +
":" + (String)binding.get_concatenated_subnames();
} else {
shortened_path = (String)binding.get_name(binding.get_name_count() - 1) +
":" + (String)binding.get_concatenated_subnames();
}
r_ret = String::utf8("🔗 ") + shortened_path;
} else { } else {
r_ret = var_map[p_name].get_value(); r_ret = var_map[p_name].get_value();
} }
return true; return true;
} }
#endif // TOOLS_ENABLED
// * Mapping // * Mapping
if (name_str.begins_with("mapping/")) { if (name_str.begins_with("mapping/")) {
StringName mapped_var_name = name_str.get_slicec('/', 1); StringName mapped_var_name = name_str.get_slicec('/', 1);
ERR_FAIL_COND_V(mapped_var_name == StringName(), false); ERR_FAIL_COND_V(mapped_var_name == StringName(), false);
if (has_mapping(mapped_var_name)) { if (parent_scope_mapping.has(mapped_var_name)) {
r_ret = parent_scope_mapping[mapped_var_name]; r_ret = parent_scope_mapping[mapped_var_name];
} else if (has_property_binding(mapped_var_name)) {
r_ret = RTR("Already bound to property.");
} else { } else {
r_ret = StringName(); r_ret = StringName();
} }
return true; return true;
} }
// * Binding
if (name_str.begins_with("binding/")) {
StringName bound_var = name_str.get_slicec('/', 1);
ERR_FAIL_COND_V(bound_var == StringName(), false);
if (has_property_binding(bound_var)) {
r_ret = property_bindings[bound_var];
} else if (has_mapping(bound_var)) {
r_ret = RTR("Already mapped to variable.");
} else {
r_ret = NodePath();
}
return true;
}
// * Storage // * Storage
if (!name_str.begins_with("var/")) { if (!name_str.begins_with("var/")) {
return false; return false;
@ -198,16 +127,14 @@ void BlackboardPlan::_get_property_list(List<PropertyInfo> *p_list) const {
String var_name = p.first; String var_name = p.first;
BBVariable var = p.second; BBVariable var = p.second;
#ifdef TOOLS_ENABLED
// * Editor // * Editor
if (!_is_var_nil(var) && !_is_var_private(var_name, var)) { if (var.get_type() != Variant::NIL && (!is_derived() || !var_name.begins_with("_"))) {
if (has_mapping(var_name) || has_property_binding(var_name)) { if (has_mapping(var_name)) {
p_list->push_back(PropertyInfo(Variant::STRING, var_name, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY)); p_list->push_back(PropertyInfo(Variant::STRING, var_name, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY));
} else { } else {
p_list->push_back(PropertyInfo(var.get_type(), var_name, var.get_hint(), var.get_hint_string(), PROPERTY_USAGE_EDITOR)); p_list->push_back(PropertyInfo(var.get_type(), var_name, var.get_hint(), var.get_hint_string(), PROPERTY_USAGE_EDITOR));
} }
} }
#endif // TOOLS_ENABLED
// * Storage // * Storage
if (is_derived() && (!var.is_value_changed() || var.get_value() == base->var_map[var_name].get_value())) { if (is_derived() && (!var.is_value_changed() || var.get_value() == base->var_map[var_name].get_value())) {
@ -226,32 +153,9 @@ void BlackboardPlan::_get_property_list(List<PropertyInfo> *p_list) const {
if (is_mapping_enabled()) { if (is_mapping_enabled()) {
p_list->push_back(PropertyInfo(Variant::NIL, "Mapping", PROPERTY_HINT_NONE, "mapping/", PROPERTY_USAGE_GROUP)); p_list->push_back(PropertyInfo(Variant::NIL, "Mapping", PROPERTY_HINT_NONE, "mapping/", PROPERTY_USAGE_GROUP));
for (const Pair<StringName, BBVariable> &p : var_list) { for (const Pair<StringName, BBVariable> &p : var_list) {
if (_is_var_private(p.first, p.second)) { // Serialize only non-empty mappings.
continue; PropertyUsageFlags usage = has_mapping(p.first) ? PROPERTY_USAGE_DEFAULT : PROPERTY_USAGE_EDITOR;
} p_list->push_back(PropertyInfo(Variant::STRING_NAME, "mapping/" + p.first, PROPERTY_HINT_NONE, "", usage));
if (unlikely(has_property_binding(p.first))) {
p_list->push_back(PropertyInfo(Variant::STRING, "mapping/" + p.first, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY));
} else {
// Serialize only non-empty mappings.
PropertyUsageFlags usage = has_mapping(p.first) ? PROPERTY_USAGE_DEFAULT : PROPERTY_USAGE_EDITOR;
p_list->push_back(PropertyInfo(Variant::STRING_NAME, "mapping/" + p.first, PROPERTY_HINT_NONE, "", usage));
}
}
}
// * Binding
p_list->push_back(PropertyInfo(Variant::NIL, "Binding", PROPERTY_HINT_NONE, "binding/", PROPERTY_USAGE_GROUP));
for (const Pair<StringName, BBVariable> &p : var_list) {
if (_is_var_nil(p.second) || _is_var_private(p.first, p.second)) {
continue;
}
if (unlikely(has_mapping(p.first))) {
p_list->push_back(PropertyInfo(Variant::STRING, "binding/" + p.first, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY));
} else {
PropertyUsageFlags usage = has_property_binding(p.first) ? PROPERTY_USAGE_DEFAULT : PROPERTY_USAGE_EDITOR;
// PROPERTY_HINT_LINK is used to signal that NodePath should point to a property.
// Our inspector plugin will know how to handle it.
p_list->push_back(PropertyInfo(Variant::NODE_PATH, "binding/" + p.first, PROPERTY_HINT_LINK, itos(p.second.get_type()), usage));
} }
} }
} }
@ -295,11 +199,6 @@ bool BlackboardPlan::has_mapping(const StringName &p_name) const {
return is_mapping_enabled() && parent_scope_mapping.has(p_name) && parent_scope_mapping[p_name] != StringName(); return is_mapping_enabled() && parent_scope_mapping.has(p_name) && parent_scope_mapping[p_name] != StringName();
} }
void BlackboardPlan::set_property_binding(const StringName &p_name, const NodePath &p_path) {
property_bindings[p_name] = p_path;
emit_changed();
}
void BlackboardPlan::set_prefetch_nodepath_vars(bool p_enable) { void BlackboardPlan::set_prefetch_nodepath_vars(bool p_enable) {
prefetch_nodepath_vars = p_enable; prefetch_nodepath_vars = p_enable;
emit_changed(); emit_changed();
@ -511,9 +410,8 @@ void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bo
#endif #endif
continue; continue;
} }
bool is_bound = has_property_binding(p.first) || (is_derived() && get_base_plan()->has_property_binding(p.first));
bool has_mapping = parent_scope_mapping.has(p.first); bool has_mapping = parent_scope_mapping.has(p.first);
bool do_prefetch = !is_bound && !has_mapping && prefetch_nodepath_vars; bool do_prefetch = !has_mapping && prefetch_nodepath_vars;
// Add a variable duplicate to the blackboard, optionally with NodePath prefetch. // Add a variable duplicate to the blackboard, optionally with NodePath prefetch.
BBVariable var = p.second.duplicate(true); BBVariable var = p.second.duplicate(true);
@ -532,27 +430,9 @@ void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bo
if (has_mapping) { if (has_mapping) {
StringName target_var = parent_scope_mapping[p.first]; StringName target_var = parent_scope_mapping[p.first];
if (target_var != StringName()) { if (target_var != StringName()) {
ERR_CONTINUE_MSG(p_blackboard->get_parent().is_null(), vformat("BlackboardPlan: Cannot link variable %s to parent scope because the parent scope is not set.", LimboUtility::get_singleton()->decorate_var(p.first))); ERR_CONTINUE_MSG(p_blackboard->get_parent() == nullptr, vformat("BlackboardPlan: Cannot link variable %s to parent scope because the parent scope is not set.", LimboUtility::get_singleton()->decorate_var(p.first)));
p_blackboard->link_var(p.first, p_blackboard->get_parent(), target_var); p_blackboard->link_var(p.first, p_blackboard->get_parent(), target_var);
} }
} else if (is_bound) {
// Bind variable to a property of a scene node.
NodePath binding_path;
Node *binding_root;
if (has_property_binding(p.first)) {
binding_path = property_bindings[p.first];
binding_root = p_prefetch_root;
} else {
binding_path = get_base_plan()->property_bindings[p.first];
binding_root = p_prefetch_root_for_base_plan;
}
ERR_CONTINUE_MSG(binding_path.get_subname_count() != 1, vformat("BlackboardPlan: Can't bind variable %s using property path that contains multiple sub-names: %s", LimboUtility::get_singleton()->decorate_var(p.first), binding_path));
NodePath node_path{ binding_path.get_concatenated_names() };
StringName prop_name = binding_path.get_subname(0);
// TODO: Implement binding for base plan as well.
Node *n = binding_root->get_node_or_null(node_path);
ERR_CONTINUE_MSG(n == nullptr, vformat("BlackboardPlan: Binding failed for variable %s using property path: %s", LimboUtility::get_singleton()->decorate_var(p.first), binding_path));
var.bind(n, prop_name);
} }
} }
} }

View File

@ -1,7 +1,7 @@
/** /**
* blackboard_plan.h * blackboard_plan.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -34,26 +34,18 @@ private:
// When base is not null, the plan is considered to be derived from the base plan. // When base is not null, the plan is considered to be derived from the base plan.
// A derived plan can only have variables that exist in the base plan, // A derived plan can only have variables that exist in the base plan,
// and only the values can be different in those variables. // and only the values can be different in those variables.
// The derived plan is synced with the base plan to maintain consistency.
Ref<BlackboardPlan> base; Ref<BlackboardPlan> base;
// Mapping between variables in this plan and their parent scope names. // Mapping between variables in this plan and their parent scope names.
// Used for linking variables to their parent scope counterparts upon Blackboard creation/population. // Used for linking variables to their parent scope counterparts upon Blackboard creation/population.
HashMap<StringName, StringName> parent_scope_mapping; HashMap<StringName, StringName> parent_scope_mapping;
// Fetcher function for the parent scope plan. Function should return a Ref<BlackboardPlan>. // Fetcher function for the parent scope plan. Funtion should return a Ref<BlackboardPlan>.
// Used in the inspector: enables mapping feature when set. // Used in the inspector. When set, mapping feature becomes available.
Callable parent_scope_plan_provider; Callable parent_scope_plan_provider;
// Bindings to properties in the scene to which this plan belongs.
HashMap<StringName, NodePath> property_bindings;
bool property_binding_enabled = false;
// If true, NodePath variables will be prefetched, so that the vars will contain node pointers instead (upon BB creation/population). // If true, NodePath variables will be prefetched, so that the vars will contain node pointers instead (upon BB creation/population).
bool prefetch_nodepath_vars = true; bool prefetch_nodepath_vars = true;
_FORCE_INLINE_ bool _is_var_nil(const BBVariable &p_var) const { return p_var.get_type() == Variant::NIL; }
_FORCE_INLINE_ bool _is_var_private(const String &p_name, const BBVariable &p_var) const { return is_derived() && p_name.begins_with("_"); }
protected: protected:
static void _bind_methods(); static void _bind_methods();
@ -77,10 +69,6 @@ public:
bool is_mapping_enabled() const { return parent_scope_plan_provider.is_valid() && (parent_scope_plan_provider.call() != Ref<BlackboardPlan>()); } bool is_mapping_enabled() const { return parent_scope_plan_provider.is_valid() && (parent_scope_plan_provider.call() != Ref<BlackboardPlan>()); }
bool has_mapping(const StringName &p_name) const; bool has_mapping(const StringName &p_name) const;
bool has_property_binding(const StringName &p_name) const { return property_bindings.has(p_name); }
void set_property_binding(const StringName &p_name, const NodePath &p_path);
NodePath get_property_binding(const StringName &p_name) const { return property_bindings.has(p_name) ? property_bindings[p_name] : NodePath(); }
void set_prefetch_nodepath_vars(bool p_enable); void set_prefetch_nodepath_vars(bool p_enable);
bool is_prefetching_nodepath_vars() const; bool is_prefetching_nodepath_vars() const;

View File

@ -1,7 +1,7 @@
/** /**
* behavior_tree.cpp * behavior_tree.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -78,10 +78,10 @@ void BehaviorTree::copy_other(const Ref<BehaviorTree> &p_other) {
} }
Ref<BTInstance> BehaviorTree::instantiate(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_instance_owner, Node *p_custom_scene_root) const { Ref<BTInstance> BehaviorTree::instantiate(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_instance_owner, Node *p_custom_scene_root) const {
ERR_FAIL_COND_V_MSG(root_task.is_null(), nullptr, "BehaviorTree: Instantiation failed - BT has no valid root task."); ERR_FAIL_COND_V_MSG(root_task == nullptr, nullptr, "BehaviorTree: Instantiation failed - BT has no valid root task.");
ERR_FAIL_NULL_V_MSG(p_agent, nullptr, "BehaviorTree: Instantiation failed - agent can't be null."); ERR_FAIL_NULL_V_MSG(p_agent, nullptr, "BehaviorTree: Instantiation failed - agent can't be null.");
ERR_FAIL_NULL_V_MSG(p_instance_owner, nullptr, "BehaviorTree: Instantiation failed -- instance owner can't be null."); ERR_FAIL_NULL_V_MSG(p_instance_owner, nullptr, "BehaviorTree: Instantiation failed -- instance owner can't be null.");
ERR_FAIL_COND_V_MSG(p_blackboard.is_null(), nullptr, "BehaviorTree: Instantiation failed - blackboard can't be null."); ERR_FAIL_NULL_V_MSG(p_blackboard, nullptr, "BehaviorTree: Instantiation failed - blackboard can't be null.");
Node *scene_root = p_custom_scene_root ? p_custom_scene_root : p_instance_owner->get_owner(); Node *scene_root = p_custom_scene_root ? p_custom_scene_root : p_instance_owner->get_owner();
ERR_FAIL_NULL_V_MSG(scene_root, nullptr, "BehaviorTree: Instantiation failed - unable to establish scene root. This is likely due to the instance owner not being owned by a scene node and custom_scene_root being null."); ERR_FAIL_NULL_V_MSG(scene_root, nullptr, "BehaviorTree: Instantiation failed - unable to establish scene root. This is likely due to the instance owner not being owned by a scene node and custom_scene_root being null.");
Ref<BTTask> root_copy = root_task->clone(); Ref<BTTask> root_copy = root_task->clone();

View File

@ -1,7 +1,7 @@
/** /**
* behavior_tree.h * behavior_tree.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_instance.cpp * bt_instance.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -25,7 +25,7 @@
#endif #endif
Ref<BTInstance> BTInstance::create(Ref<BTTask> p_root_task, String p_source_bt_path, Node *p_owner_node) { Ref<BTInstance> BTInstance::create(Ref<BTTask> p_root_task, String p_source_bt_path, Node *p_owner_node) {
ERR_FAIL_COND_V(p_root_task.is_null(), nullptr); ERR_FAIL_NULL_V(p_root_task, nullptr);
ERR_FAIL_NULL_V(p_owner_node, nullptr); ERR_FAIL_NULL_V(p_owner_node, nullptr);
Ref<BTInstance> inst; Ref<BTInstance> inst;
inst.instantiate(); inst.instantiate();
@ -42,7 +42,6 @@ BT::Status BTInstance::update(double p_delta) {
double start = Time::get_singleton()->get_ticks_usec(); double start = Time::get_singleton()->get_ticks_usec();
#endif #endif
const Ref<BTInstance> keep_alive{ this }; // keep instance alive until update is finished
last_status = root_task->execute(p_delta); last_status = root_task->execute(p_delta);
emit_signal(LW_NAME(updated), last_status); emit_signal(LW_NAME(updated), last_status);
@ -83,7 +82,7 @@ void BTInstance::register_with_debugger() {
void BTInstance::unregister_with_debugger() { void BTInstance::unregister_with_debugger() {
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (LimboDebugger::get_singleton() && LimboDebugger::get_singleton()->is_active()) { if (LimboDebugger::get_singleton()->is_active()) {
LimboDebugger::get_singleton()->unregister_bt_instance(get_instance_id()); LimboDebugger::get_singleton()->unregister_bt_instance(get_instance_id());
} }
#endif #endif
@ -103,7 +102,7 @@ double BTInstance::_get_mean_update_time_msec_and_reset() {
void BTInstance::_add_custom_monitor() { void BTInstance::_add_custom_monitor() {
ERR_FAIL_NULL(get_owner_node()); ERR_FAIL_NULL(get_owner_node());
ERR_FAIL_COND(root_task.is_null()); ERR_FAIL_NULL(root_task);
ERR_FAIL_NULL(root_task->get_agent()); ERR_FAIL_NULL(root_task->get_agent());
if (monitor_id == StringName()) { if (monitor_id == StringName()) {
@ -151,6 +150,5 @@ BTInstance::~BTInstance() {
emit_signal(LW_NAME(freed)); emit_signal(LW_NAME(freed));
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
_remove_custom_monitor(); _remove_custom_monitor();
unregister_with_debugger();
#endif #endif
} }

View File

@ -1,7 +1,7 @@
/** /**
* bt_instance.h * bt_instance.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_player.cpp * bt_player.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -42,7 +42,7 @@
VARIANT_ENUM_CAST(BTPlayer::UpdateMode); VARIANT_ENUM_CAST(BTPlayer::UpdateMode);
void BTPlayer::_instantiate_bt() { void BTPlayer::_load_tree() {
bt_instance.unref(); bt_instance.unref();
ERR_FAIL_COND_MSG(!behavior_tree.is_valid(), "BTPlayer: Initialization failed - needs a valid behavior tree."); ERR_FAIL_COND_MSG(!behavior_tree.is_valid(), "BTPlayer: Initialization failed - needs a valid behavior tree.");
ERR_FAIL_COND_MSG(!behavior_tree->get_root_task().is_valid(), "BTPlayer: Initialization failed - behavior tree has no valid root task."); ERR_FAIL_COND_MSG(!behavior_tree->get_root_task().is_valid(), "BTPlayer: Initialization failed - behavior tree has no valid root task.");
@ -70,19 +70,6 @@ void BTPlayer::_update_blackboard_plan() {
blackboard_plan->set_base_plan(behavior_tree.is_valid() ? behavior_tree->get_blackboard_plan() : nullptr); blackboard_plan->set_base_plan(behavior_tree.is_valid() ? behavior_tree->get_blackboard_plan() : nullptr);
} }
void BTPlayer::_initialize() {
if (blackboard.is_null()) {
blackboard = Ref<Blackboard>(memnew(Blackboard));
}
if (blackboard_plan.is_valid()) {
// Don't overwrite existing blackboard values as they may be initialized from code.
blackboard_plan->populate_blackboard(blackboard, false, this, _get_scene_root());
}
if (behavior_tree.is_valid()) {
_instantiate_bt();
}
}
void BTPlayer::set_bt_instance(const Ref<BTInstance> &p_bt_instance) { void BTPlayer::set_bt_instance(const Ref<BTInstance> &p_bt_instance) {
ERR_FAIL_COND_MSG(p_bt_instance.is_null(), "BTPlayer: Failed to set behavior tree instance - instance is null."); ERR_FAIL_COND_MSG(p_bt_instance.is_null(), "BTPlayer: Failed to set behavior tree instance - instance is null.");
ERR_FAIL_COND_MSG(!p_bt_instance->is_instance_valid(), "BTPlayer: Failed to set behavior tree instance - instance is not valid."); ERR_FAIL_COND_MSG(!p_bt_instance->is_instance_valid(), "BTPlayer: Failed to set behavior tree instance - instance is not valid.");
@ -91,11 +78,6 @@ void BTPlayer::set_bt_instance(const Ref<BTInstance> &p_bt_instance) {
blackboard = p_bt_instance->get_blackboard(); blackboard = p_bt_instance->get_blackboard();
agent_node = p_bt_instance->get_agent()->get_path(); agent_node = p_bt_instance->get_agent()->get_path();
#ifdef DEBUG_ENABLED
bt_instance->set_monitor_performance(monitor_performance);
bt_instance->register_with_debugger();
#endif // DEBUG_ENABLED
blackboard_plan.unref(); blackboard_plan.unref();
behavior_tree.unref(); behavior_tree.unref();
} }
@ -122,8 +104,7 @@ void BTPlayer::set_behavior_tree(const Ref<BehaviorTree> &p_tree) {
} else { } else {
behavior_tree = p_tree; behavior_tree = p_tree;
if (get_owner() && is_inside_tree()) { if (get_owner() && is_inside_tree()) {
_update_blackboard_plan(); _load_tree();
_initialize();
} }
} }
} }
@ -198,7 +179,16 @@ void BTPlayer::_notification(int p_notification) {
} break; } break;
case NOTIFICATION_READY: { case NOTIFICATION_READY: {
if (!Engine::get_singleton()->is_editor_hint()) { if (!Engine::get_singleton()->is_editor_hint()) {
_initialize(); if (blackboard.is_null()) {
blackboard = Ref<Blackboard>(memnew(Blackboard));
}
if (blackboard_plan.is_valid()) {
// Don't overwrite existing blackboard values as they may be initialized from code.
blackboard_plan->populate_blackboard(blackboard, false, this, _get_scene_root());
}
if (behavior_tree.is_valid()) {
_load_tree();
}
} else { } else {
_update_blackboard_plan(); _update_blackboard_plan();
} }

View File

@ -1,7 +1,7 @@
/** /**
* bt_player.h * bt_player.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -48,9 +48,8 @@ private:
Ref<BTInstance> bt_instance; Ref<BTInstance> bt_instance;
void _instantiate_bt(); void _load_tree();
void _update_blackboard_plan(); void _update_blackboard_plan();
void _initialize();
_FORCE_INLINE_ Node *_get_scene_root() const { return scene_root_hint ? scene_root_hint : get_owner(); } _FORCE_INLINE_ Node *_get_scene_root() const { return scene_root_hint ? scene_root_hint : get_owner(); }
protected: protected:

View File

@ -1,7 +1,7 @@
/** /**
* bt_state.cpp * bt_state.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -98,7 +98,7 @@ void BTState::_update(double p_delta) {
// Bail out if a transition happened in the meantime. // Bail out if a transition happened in the meantime.
return; return;
} }
ERR_FAIL_COND(bt_instance.is_null()); ERR_FAIL_NULL(bt_instance);
BT::Status status = bt_instance->update(p_delta); BT::Status status = bt_instance->update(p_delta);
if (status == BTTask::SUCCESS) { if (status == BTTask::SUCCESS) {
get_root()->dispatch(success_event, Variant()); get_root()->dispatch(success_event, Variant());

View File

@ -1,7 +1,7 @@
/** /**
* bt_state.h * bt_state.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_check_trigger.cpp * bt_check_trigger.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_check_trigger.h * bt_check_trigger.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_check_var.cpp * bt_check_var.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_check_var.h * bt_check_var.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_set_var.cpp * bt_set_var.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_set_var.h * bt_set_var.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_action.cpp * bt_action.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_action.h * bt_action.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_comment.cpp * bt_comment.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -30,7 +30,7 @@ PackedStringArray BTComment::get_configuration_warnings() {
if (get_child_count_excluding_comments() > 0) { if (get_child_count_excluding_comments() > 0) {
warnings.append("Can only have other comment tasks as children."); warnings.append("Can only have other comment tasks as children.");
} }
if (get_parent().is_null()) { if (get_parent() == nullptr) {
warnings.append("Can't be the root task."); warnings.append("Can't be the root task.");
} }
return warnings; return warnings;

View File

@ -1,7 +1,7 @@
/** /**
* bt_comment.h * bt_comment.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_composite.cpp * bt_composite.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_composite.h * bt_composite.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_condition.cpp * bt_condition.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_condition.h * bt_condition.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_decorator.cpp * bt_decorator.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_decorator.h * bt_decorator.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_task.cpp * bt_task.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
@ -163,7 +163,7 @@ void BTTask::set_custom_name(const String &p_name) {
void BTTask::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) { void BTTask::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) {
ERR_FAIL_NULL(p_agent); ERR_FAIL_NULL(p_agent);
ERR_FAIL_COND(p_blackboard.is_null()); ERR_FAIL_NULL(p_blackboard);
ERR_FAIL_NULL(p_scene_root); ERR_FAIL_NULL(p_scene_root);
data.agent = p_agent; data.agent = p_agent;
data.blackboard = p_blackboard; data.blackboard = p_blackboard;
@ -172,8 +172,9 @@ void BTTask::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node
get_child(i)->initialize(p_agent, p_blackboard, p_scene_root); get_child(i)->initialize(p_agent, p_blackboard, p_scene_root);
} }
_setup(); if (!GDVIRTUAL_CALL(_setup)) {
GDVIRTUAL_CALL(_setup); _setup();
}
} }
Ref<BTTask> BTTask::clone() const { Ref<BTTask> BTTask::clone() const {
@ -181,47 +182,60 @@ Ref<BTTask> BTTask::clone() const {
// * Children are duplicated via children property. See _set_children(). // * Children are duplicated via children property. See _set_children().
// * Make BBParam properties unique.
HashMap<Ref<Resource>, Ref<Resource>> duplicates;
#ifdef LIMBOAI_MODULE #ifdef LIMBOAI_MODULE
// Make BBParam properties unique.
List<PropertyInfo> props; List<PropertyInfo> props;
inst->get_property_list(&props); inst->get_property_list(&props);
HashMap<Ref<Resource>, Ref<Resource>> duplicates;
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
PropertyInfo prop = E->get(); if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
#elif LIMBOAI_GDEXTENSION
TypedArray<Dictionary> props = inst->get_property_list();
for (int i = 0; i < props.size(); i++) {
PropertyInfo prop = PropertyInfo::from_dict(props[i]);
#endif
if (!(prop.usage & PROPERTY_USAGE_STORAGE)) {
continue; continue;
} }
Variant prop_value = inst->get(prop.name); Variant v = inst->get(E->get().name);
Ref<Resource> res = prop_value;
if (res.is_valid() && res->is_class("BBParam")) { if (v.is_ref_counted()) {
// Duplicate BBParam Ref<RefCounted> ref = v;
if (!duplicates.has(res)) { if (ref.is_valid()) {
duplicates[res] = res->duplicate(); Ref<Resource> res = ref;
} if (res.is_valid() && res->is_class("BBParam")) {
res = duplicates[res]; if (!duplicates.has(res)) {
inst->set(prop.name, res); duplicates[res] = res->duplicate();
} else if (prop_value.get_type() == Variant::ARRAY) {
// Duplicate BBParams instances inside an array.
// - This code doesn't handle arrays of arrays.
// - A partial workaround for: https://github.com/godotengine/godot/issues/74918
// - We actually don't want to duplicate resources in clone() except for BBParam subtypes.
Array arr = prop_value;
if (arr.is_typed() && ClassDB::is_parent_class(arr.get_typed_class_name(), LW_NAME(BBParam))) {
for (int j = 0; j < arr.size(); j++) {
Ref<Resource> bb_param = arr[j];
if (bb_param.is_valid()) {
arr[j] = bb_param->duplicate();
} }
res = duplicates[res];
inst->set(E->get().name, res);
} }
} }
} }
} }
#elif LIMBOAI_GDEXTENSION
// Make BBParam properties unique.
TypedArray<Dictionary> props = inst->get_property_list();
HashMap<Ref<Resource>, Ref<Resource>> duplicates;
for (int i = 0; i < props.size(); i++) {
Dictionary prop = props[i];
if (!(int(prop["usage"]) & PROPERTY_USAGE_STORAGE)) {
continue;
}
StringName prop_name = prop["name"];
Variant v = inst->get(prop_name);
if (v.get_type() == Variant::OBJECT && int(prop["hint"]) == PROPERTY_HINT_RESOURCE_TYPE) {
Ref<RefCounted> ref = v;
if (ref.is_valid()) {
Ref<Resource> res = ref;
if (res.is_valid() && res->is_class("BBParam")) {
if (!duplicates.has(res)) {
duplicates[res] = res->duplicate();
}
res = duplicates[res];
inst->set(prop_name, res);
}
}
}
}
#endif // LIMBOAI_MODULE & LIMBOAI_GDEXTENSION
return inst; return inst;
} }
@ -234,9 +248,9 @@ BT::Status BTTask::execute(double p_delta) {
data.children.get(i)->abort(); data.children.get(i)->abort();
} }
} }
// First native, then script. if (!GDVIRTUAL_CALL(_enter)) {
_enter(); _enter();
GDVIRTUAL_CALL(_enter); }
} else { } else {
data.elapsed += p_delta; data.elapsed += p_delta;
} }
@ -246,9 +260,9 @@ BT::Status BTTask::execute(double p_delta) {
} }
if (data.status != RUNNING) { if (data.status != RUNNING) {
// First script, then native. if (!GDVIRTUAL_CALL(_exit)) {
GDVIRTUAL_CALL(_exit); _exit();
_exit(); }
data.elapsed = 0.0; data.elapsed = 0.0;
} }
return data.status; return data.status;
@ -259,9 +273,9 @@ void BTTask::abort() {
get_child(i)->abort(); get_child(i)->abort();
} }
if (data.status == RUNNING) { if (data.status == RUNNING) {
// First script, then native. if (!GDVIRTUAL_CALL(_exit)) {
GDVIRTUAL_CALL(_exit); _exit();
_exit(); }
} }
data.status = FRESH; data.status = FRESH;
data.elapsed = 0.0; data.elapsed = 0.0;

View File

@ -1,7 +1,7 @@
/** /**
* bt_task.h * bt_task.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_dynamic_selector.cpp * bt_dynamic_selector.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_dynamic_selector.h * bt_dynamic_selector.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_dynamic_sequence.cpp * bt_dynamic_sequence.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_dynamic_sequence.h * bt_dynamic_sequence.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_parallel.cpp * bt_parallel.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_parallel.h * bt_parallel.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_probability_selector.cpp * bt_probability_selector.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_probability_selector.h * bt_probability_selector.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_random_selector.cpp * bt_random_selector.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_random_selector.h * bt_random_selector.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_random_sequence.cpp * bt_random_sequence.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_random_sequence.h * bt_random_sequence.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_selector.cpp * bt_selector.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_selector.h * bt_selector.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_sequence.cpp * bt_sequence.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_sequence.h * bt_sequence.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_always_fail.cpp * bt_always_fail.cpp
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

View File

@ -1,7 +1,7 @@
/** /**
* bt_always_fail.h * bt_always_fail.h
* ============================================================================= * =============================================================================
* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. * Copyright 2021-2024 Serhii Snitsaruk
* *
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at

Some files were not shown because too many files have changed in this diff Show More