This commit is contained in:
2026-01-24 16:34:15 -05:00
commit c23bf51490
3996 changed files with 657568 additions and 0 deletions

View File

@@ -0,0 +1,250 @@
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Tries to shoot a target at range.
- type: htnCompound
id: GunCombatCompound
branches:
# Pick target, then move into range and shoot them.
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyGunTargets
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
shutdownState: PlanFinished
pathfindInPlanning: true
removeKeyOnFinish: false
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
stopOnLineOfSight: true
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
operator: !type:JukeOperator
jukeType: AdjacentTile
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: Target
operator: !type:GunOperator
targetKey: Target
services:
- !type:UtilityService
id: RangedService
proto: NearbyGunTargets
key: Target
# Selects ammo in range, then moves to it and picks it up
- type: htnCompound
id: PickupAmmoCompound
branches:
# Find ammo then pick it up.
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyAmmo
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
- !type:HTNPrimitiveTask
preconditions:
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: InteractRange
operator: !type:InteractWithOperator
targetKey: Target
# TODO: Prioritise ammo for weapon we have equipped, otherwise grab anything if we don't have any.
# TODO: Only works on ballistic
# Selects a gun in range, then moves to it and picks it up.
- type: htnCompound
id: PickupGunCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyGuns
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandFreePrecondition
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: InteractRange
operator: !type:InteractWithOperator
targetKey: Target
# TODO: Need a thing to recharge a laser gun
# TODO: When selecting pickup guns also add chargers or easy container grabs.
# Shorted version of RangedCombatCompound for entities that are guns themselves.
- type: htnCompound
id: InnateRangedCombatCompound
branches:
- preconditions:
- !type:GunAmmoPrecondition
minPercent: 0.001
- !type:GunCanFirePrecondition # Goobstation
tasks:
- !type:HTNCompoundTask
task: GunCombatCompound
- type: htnCompound
id: RangedCombatCompound
branches:
# Goobstation - drop a gun if it can't be wielded and wielding is required
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- type: GunRequiresWield
- !type:UnwieldedEntityInHandsPrecondition
- !type:CanWieldPrecondition
invert: true
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandEntityPrecondition
operator: !type:DropOperator
# Goobstation - wield an item if it's wieldable
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- type: Wieldable
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:UnwieldedEntityInHandsPrecondition
operator: !type:WieldOperator
# Goobstation start - Cycle/Rack/Empty a gun if it can't shoot
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- type: BallisticAmmoProvider
- !type:GunCanFirePrecondition
invert: true
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandEntityPrecondition
operator: !type:InteractWithOperator
targetKey: ActiveHandEntity
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- type: MagazineAmmoProvider
- !type:GunCanFirePrecondition
invert: true
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandEntityPrecondition
operator: !type:InteractWithOperator
targetKey: ActiveHandEntity
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- type: ChamberMagazineAmmoProvider
- !type:GunCanFirePrecondition
invert: true
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandEntityPrecondition
operator: !type:InteractWithOperator
targetKey: ActiveHandEntity
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- type: RevolverAmmoProvider
- !type:GunCanFirePrecondition
invert: true
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandEntityPrecondition
operator: !type:AltInteractOperator
targetKey: ActiveHandEntity
# Goobstation end
# Move to target and shoot them if ammo
- preconditions:
- !type:GunAmmoPrecondition
minPercent: 0.001
tasks:
- !type:HTNCompoundTask
task: GunCombatCompound
# Reload gun
# TODO
# Equip a gun from inventory if one found, preferring over pickup.
# TODO: Doing inventory cleanly will be a PITA so deferring to later
# The issue is recursively checking items but also ignoring some recursive entities
# i.e. we need to recursively go into storage containers.
#- tasks:
# - !type:HTNCompoundTask
# task: ClearActiveHandCompound
#
# - !type:HTNPrimitiveTask
# operator: !type:UtilityOperator
# proto: InventoryGuns
#
# - !type:HTNPrimitiveTask
# operator: !type:EquipOperator
# Pickup ammo if any nearby
#- preconditions:
# - !type:GunAmmoPrecondition
# maxPercent: 0.0
# tasks:
# - !type:HTNCompoundTask
# task: ClearActiveHandCompound
#
# - !type:HTNCompoundTask
# task: PickupAmmoCompound
# Pickup gun with ammo if we have no ammo
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
invert: true
tasks:
- !type:HTNCompoundTask
task: PickupGunCompound
# Discard gun if no ammo
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Gun
- !type:GunAmmoPrecondition
maxPercent: 0.001
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandEntityPrecondition
operator: !type:DropOperator
# TODO: Reload a nearby gun

View File

@@ -0,0 +1,206 @@
# SPDX-FileCopyrightText: 2023 Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 Tayrtahn <tayrtahn@gmail.com>
# SPDX-FileCopyrightText: 2024 Vigers Ray <60344369+VigersRay@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 metalgearsloth <comedian_vs_clown@hotmail.com>
# SPDX-FileCopyrightText: 2024 osjarw <62134478+osjarw@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
# SPDX-FileCopyrightText: 2025 Ilya246 <ilyukarno@gmail.com>
# SPDX-FileCopyrightText: 2025 SX-7 <sn1.test.preria.2002@gmail.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# -- Melee --
# Selects a target in melee and tries to attack it.
- type: htnCompound
id: MeleeCombatCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyMeleeTargets
- !type:HTNCompoundTask
task: BeforeMeleeAttackTargetCompound
- type: htnCompound
id: BeforeMeleeAttackTargetCompound
branches:
- preconditions:
- !type:BuckledPrecondition
isBuckled: true
tasks:
- !type:HTNPrimitiveTask
operator: !type:UnbuckleOperator
shutdownState: TaskFinished
- preconditions:
- !type:PulledPrecondition
isPulled: true
tasks:
- !type:HTNPrimitiveTask
operator: !type:UnPullOperator
shutdownState: TaskFinished
- preconditions:
- !type:InContainerPrecondition
isInContainer: true
tasks:
- !type:HTNCompoundTask
task: EscapeCompound
# Pickup weapon if we don't have one.
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
# Just serializer things
- type: MeleeWeapon
damage:
types:
Blunt: 0
invert: true
tasks:
- !type:HTNCompoundTask
task: PickupMeleeCompound
# Goobstation - wield an item if it's wieldable
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: Wieldable
tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:UnwieldedEntityInHandsPrecondition
operator: !type:WieldOperator
# Melee combat (unarmed or otherwise)
- tasks:
- !type:HTNCompoundTask
task: MeleeAttackTargetCompound
- type: htnCompound
id: RatServantCombatCompound
branches:
- preconditions:
- !type:ActiveHandComponentPrecondition
components:
- type: MeleeWeapon
damage:
types:
Blunt: 0
invert: true
tasks:
- !type:HTNCompoundTask
task: PickupMeleeCompound
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: OrderedTargets
- !type:HTNCompoundTask
task: MeleeAttackOrderedTargetCompound
- type: htnCompound
id: PickupMeleeCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyMeleeWeapons
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
- !type:HTNPrimitiveTask
preconditions:
- !type:ActiveHandFreePrecondition
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: InteractRange
operator: !type:InteractWithOperator
targetKey: Target
# Tries to melee attack our target.
- type: htnCompound
id: MeleeAttackTargetCompound
branches:
- preconditions:
- !type:KeyExistsPrecondition
key: Target
tasks:
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
shutdownState: PlanFinished
pathfindInPlanning: true
removeKeyOnFinish: false
brakeMaxVelocity: null # Goobstation - no braking
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
operator: !type:JukeOperator
jukeType: Away
- !type:HTNPrimitiveTask
operator: !type:MeleeOperator
targetKey: Target
preconditions:
- !type:KeyExistsPrecondition
key: Target
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: MeleeRange
services:
- !type:UtilityService
id: MeleeService
proto: NearbyMeleeTargets
key: Target
- type: htnCompound
id: EscapeCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:ContainerOperator
targetKey: Target
shutdownState: TaskFinished
- !type:HTNPrimitiveTask
operator: !type:EscapeOperator
targetKey: Target
preconditions:
- !type:InContainerPrecondition
isInContainer: true
- type: htnCompound
id: MeleeAttackOrderedTargetCompound
branches:
- preconditions:
- !type:KeyExistsPrecondition
key: Target
tasks:
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
shutdownState: PlanFinished
pathfindInPlanning: true
removeKeyOnFinish: false
brakeMaxVelocity: null # Goobstation - no braking
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
operator: !type:JukeOperator
jukeType: Away
- !type:HTNPrimitiveTask
operator: !type:MeleeOperator
targetKey: Target
preconditions:
- !type:KeyExistsPrecondition
key: Target
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: MeleeRange
services:
- !type:UtilityService
id: MeleeService
proto: OrderedTargets
key: Target

View File

@@ -0,0 +1,22 @@
- type: htnCompound
id: BasiliskCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: BasiliskMeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: InnateRangedCombatCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: BasiliskMeleeCombatCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyColdMeleeTargets
- !type:HTNCompoundTask
task: BeforeMeleeAttackTargetCompound

View File

@@ -0,0 +1,44 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: CleanbotCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: BufferNearbyPuddlesCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
# Picks a random puddle in range to move to and idle
- type: htnCompound
id: BufferNearbyPuddlesCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyPuddles
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: true
removeKeyOnFinish: false
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
preconditions:
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: InteractRange
operator: !type:InteractWithOperator
targetKey: Target
services:
- !type:UtilityService
id: PuddleService
proto: NearbyPuddles
key: Target

View File

@@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
# Generic pickups to not be naked.
# TODO: Armor / Pressure pickups.
# TODO: Preferred slots
#- type: htnCompound
# id:

95
Prototypes/NPCs/debug.yml Normal file
View File

@@ -0,0 +1,95 @@
# SPDX-FileCopyrightText: 2024 Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
- type: htnCompound
id: DebugCounterCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:AddFloatOperator
targetKey: Count
amount: 1
- !type:HTNPrimitiveTask
operator: !type:SayKeyOperator
key: Count
- !type:HTNPrimitiveTask
operator: !type:RandomOperator
targetKey: IdleTime
minKey: MinimumIdleTime
maxKey: MaximumIdleTime
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
- type: htnCompound
id: DebugRandomCounterCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:SetRandomFloatOperator
targetKey: Count
minAmount: 0
maxAmount: 100
- !type:HTNPrimitiveTask
operator: !type:SayKeyOperator
key: Count
- !type:HTNPrimitiveTask
operator: !type:RandomOperator
targetKey: IdleTime
minKey: MinimumIdleTime
maxKey: MaximumIdleTime
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
- type: htnCompound
id: DebugRandomLessCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:SetRandomFloatOperator
targetKey: Count
minAmount: 0
maxAmount: 100
- !type:HTNPrimitiveTask
operator: !type:SayKeyOperator
key: Count
preconditions:
- !type:KeyFloatLessPrecondition
key: Count
value: 50
- !type:HTNPrimitiveTask
operator: !type:RandomOperator
targetKey: IdleTime
minKey: MinimumIdleTime
maxKey: MaximumIdleTime
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
- tasks:
- !type:HTNPrimitiveTask
operator: !type:SpeakOperator
speech: "fuck!"

View File

@@ -0,0 +1,62 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 Golinth <amh2023@gmail.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
- type: htnCompound
id: FirebotCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: DouseFireTargetCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: DouseFireTargetCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyOnFire
- !type:HTNPrimitiveTask
operator: !type:SpeakOperator
speech: firebot-fire-detected
hidden: true
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: true
removeKeyOnFinish: false
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: InteractRange
- !type:HTNPrimitiveTask
operator: !type:SetFloatOperator
targetKey: WaitTime
amount: 1
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: WaitTime
preconditions:
- !type:KeyExistsPrecondition
key: WaitTime
- !type:HTNPrimitiveTask
preconditions:
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: InteractRange
operator: !type:InteractWithOperator
targetKey: Target
services:
- !type:UtilityService
id: FireService
proto: NearbyOnFire
key: Target

View File

@@ -0,0 +1,64 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
# There are limitations to this ATM. The pathfinder is too slow to check accessibility well
# and reachable only takes in an entity so sometimes the follow idle spot is outside of the follow range
# Follows the specified target.
- type: htnCompound
id: FollowCompound
branches:
# Head to follow target
- tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:CoordinatesNotInRangePrecondition
targetKey: FollowTarget
rangeKey: FollowRange
operator: !type:MoveToOperator
pathfindInPlanning: true
targetKey: FollowTarget
rangeKey: FollowCloseRange
removeKeyOnFinish: false
# Keep idling near follow target
- tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
- !type:CoordinatesInRangePrecondition
targetKey: FollowTarget
rangeKey: FollowRange
operator: !type:WaitOperator
key: IdleTime
# Pick a new idle spot near the follow target
- tasks:
- !type:HTNPrimitiveTask
operator: !type:PickAccessibleOperator
# originKey: FollowTarget
rangeKey: FollowCloseRange
targetCoordinates: FollowIdleTarget
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
targetKey: FollowIdleTarget
- !type:HTNPrimitiveTask
operator: !type:RandomOperator
targetKey: IdleTime
minKey: MinimumIdleTime
maxKey: MaximumIdleTime
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
- !type:CoordinatesInRangePrecondition
targetKey: FollowTarget
rangeKey: FollowRange
operator: !type:WaitOperator
key: IdleTime

View File

@@ -0,0 +1,30 @@
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: ClearActiveHandCompound
branches:
# Do nothing
- preconditions:
- !type:ActiveHandFreePrecondition
tasks:
- !type:HTNPrimitiveTask
operator: !type:NoOperator
# Swap to another free hand
- tasks:
- !type:HTNPrimitiveTask
operator: !type:SwapToFreeHandOperator
# TODO: Need to make sure this works with blackboard and handles storage + pockets + inventory slots
# Put active hand into storage
#- tasks:
# - !type:HTNPrimitiveTask
# operator: !type:StashActiveHandOperator
# Drop active hand
- tasks:
- !type:HTNPrimitiveTask
operator: !type:DropOperator

View File

@@ -0,0 +1,80 @@
# SPDX-FileCopyrightText: 2024 Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
- type: htnCompound
id: GoliathCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: GoliathMeleeCombatPrecondition
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: GoliathMeleeCombatPrecondition
branches:
- preconditions:
- !type:BuckledPrecondition
isBuckled: true
tasks:
- !type:HTNPrimitiveTask
operator: !type:UnbuckleOperator
shutdownState: TaskFinished
- preconditions:
- !type:InContainerPrecondition
isInContainer: true
tasks:
- !type:HTNCompoundTask
task: EscapeCompound
- preconditions:
- !type:PulledPrecondition
isPulled: true
tasks:
- !type:HTNPrimitiveTask
operator: !type:UnPullOperator
shutdownState: TaskFinished
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyMeleeTargets
- !type:HTNCompoundTask
task: GoliathAttackTargetCompound
- type: htnCompound
id: GoliathAttackTargetCompound
branches:
- preconditions:
- !type:KeyExistsPrecondition
key: Target
tasks:
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
shutdownState: PlanFinished
pathfindInPlanning: true
removeKeyOnFinish: false
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
operator: !type:JukeOperator
jukeType: AdjacentTile
- !type:HTNPrimitiveTask
operator: !type:MeleeOperator
targetKey: Target
preconditions:
- !type:KeyExistsPrecondition
key: Target
- !type:TargetInRangePrecondition
targetKey: Target
rangeKey: MeleeRange
services:
- !type:UtilityService
id: MeleeService
proto: NearbyMeleeTargets
key: Target

View File

@@ -0,0 +1,14 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 Tayrtahn <tayrtahn@gmail.com>
# SPDX-FileCopyrightText: 2024 superjj18 <gagnonjake@gmail.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: HonkbotCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: IdleCompound

82
Prototypes/NPCs/idle.yml Normal file
View File

@@ -0,0 +1,82 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 PopGamer46 <yt1popgamer@gmail.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
# SPDX-FileCopyrightText: 2025 Ilya246 <ilyukarno@gmail.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Picks a random location for the NPC to move to and idle.
- type: htnCompound
id: IdleCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
# Pick a new spot and wait there.
- preconditions:
- !type:BuckledPrecondition
isBuckled: false
- !type:PulledPrecondition
isPulled: false
tasks:
- !type:HTNPrimitiveTask
operator: !type:PickAccessibleOperator
rangeKey: IdleRange
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: false
- !type:HTNPrimitiveTask
operator: !type:RandomOperator
targetKey: IdleTime
minKey: MinimumIdleTime
maxKey: MaximumIdleTime
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
# Spin to a random rotation and idle.
- type: htnCompound
id: IdleSpinCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
# Pick a new angle and spin there
- tasks:
- !type:HTNPrimitiveTask
operator: !type:PickRandomRotationOperator
targetKey: RotateTarget
- !type:HTNPrimitiveTask
operator: !type:RotateToTargetOperator
targetKey: RotateTarget
- !type:HTNPrimitiveTask
operator: !type:RandomOperator
targetKey: IdleTime
minKey: MinimumIdleTime
maxKey: MaximumIdleTime
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime

View File

@@ -0,0 +1,55 @@
# SPDX-FileCopyrightText: 2022 Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 Arendian <137322659+Arendian@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 deltanedas <39013340+deltanedas@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 deltanedas <@deltanedas:kde.org>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: MedibotCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: InjectNearbyCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: InjectNearbyCompound
branches:
- tasks:
# TODO: Kill this shit
- !type:HTNPrimitiveTask
operator: !type:PickNearbyInjectableOperator
targetKey: InjectTarget
targetMoveKey: TargetCoordinates
- !type:HTNPrimitiveTask
operator: !type:SpeakOperator
speech: medibot-start-inject
hidden: true
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: false
- !type:HTNPrimitiveTask
operator: !type:SetFloatOperator
targetKey: IdleTime
amount: 3
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
# TODO: Kill this
- !type:HTNPrimitiveTask
operator: !type:MedibotInjectOperator
targetKey: InjectTarget

126
Prototypes/NPCs/mob.yml Normal file
View File

@@ -0,0 +1,126 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 Kara <lunarautomaton6@gmail.com>
# SPDX-FileCopyrightText: 2023 Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 lzk <124214523+lzk228@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 potato1234_x <79580518+potato1234x@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 Ed <96445749+TheShuEd@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 PopGamer46 <yt1popgamer@gmail.com>
# SPDX-FileCopyrightText: 2024 faint <46868845+ficcialfaint@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 metalgearsloth <comedian_vs_clown@hotmail.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Really you should write your own
- type: htnCompound
id: SimpleHostileCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: RatServantTargetAttackCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: RatServantCombatCompound
- tasks:
- !type:HTNCompoundTask
task: FollowCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: MouseCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: FoodCompound
# Goobstation - for retaliation; yes, they care about food more
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: MoproachCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: FoodCompound
- tasks:
- !type:HTNCompoundTask
task: BufferNearbyPuddlesCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: GlockroachCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: InnateRangedCombatCompound
- tasks:
- !type:HTNCompoundTask
task: FoodCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: RuminantCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: FoodCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: RuminantHostileCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: FoodCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: DragonCarpCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: FollowCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: KillerTomatoCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: FollowCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound

View File

@@ -0,0 +1,70 @@
# SPDX-FileCopyrightText: 2023 deltanedas <39013340+deltanedas@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 deltanedas <@deltanedas:kde.org>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 778b <33431126+778b@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: FoodCompound
branches:
# Picks a nearby food, moves into range, then eats it and waits the idle time.
- tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:HungryPrecondition
minHungerState: Starving # See HungerThreshold enum
operator: !type:UtilityOperator
proto: NearbyFood
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: true
removeKeyOnFinish: false
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: Target
operator: !type:AltInteractOperator
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
operator: !type:WaitOperator
key: IdleTime
# Picks nearby drink then consumes it and waits idle time
- tasks:
- !type:HTNPrimitiveTask
preconditions:
- !type:ThirstyPrecondition
minThirstState: Parched # See ThirstThreshold enum
operator: !type:UtilityOperator
proto: NearbyDrink
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: true
removeKeyOnFinish: false
targetKey: TargetCoordinates
pathfindKey: TargetPathfind
rangeKey: MeleeRange
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: Target
operator: !type:AltInteractOperator
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
operator: !type:WaitOperator
key: IdleTime

View File

@@ -0,0 +1,32 @@
# SPDX-FileCopyrightText: 2023 Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: RatServantCompound
branches:
- preconditions:
- !type:HasOrdersPrecondition
orders: enum.RatKingOrderType.Stay
tasks:
- !type:HTNCompoundTask
task: IdleCompound
- preconditions:
- !type:HasOrdersPrecondition
orders: enum.RatKingOrderType.Follow
tasks:
- !type:HTNCompoundTask
task: FollowCompound
- preconditions:
- !type:HasOrdersPrecondition
orders: enum.RatKingOrderType.CheeseEm
tasks:
- !type:HTNCompoundTask
task: RatServantTargetAttackCompound
- preconditions:
- !type:HasOrdersPrecondition
orders: enum.RatKingOrderType.Loose
tasks:
- !type:HTNCompoundTask
task: SimpleHostileCompound

98
Prototypes/NPCs/root.yml Normal file
View File

@@ -0,0 +1,98 @@
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Specific Root compound tasks being used for NPCs.
# Tries to shoot a target in LOS in range.
- type: htnCompound
id: TurretCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyGunTargets
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: Target
- !type:TargetInRangePrecondition
targetKey: Target
# TODO: Non-scuffed
rangeKey: RangedRange
- !type:TargetInLOSPrecondition
targetKey: Target
rangeKey: RangedRange
operator: !type:GunOperator
targetKey: Target
requireLOS: true
services:
- !type:UtilityService
id: RangedService
proto: NearbyGunTargets
key: Target
- tasks:
- !type:HTNCompoundTask
task: IdleSpinCompound
- type: htnCompound
id: EnergyTurretCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:UtilityOperator
proto: NearbyGunTargets
- !type:HTNPrimitiveTask
preconditions:
- !type:KeyExistsPrecondition
key: Target
- !type:TargetInRangePrecondition
targetKey: Target
# TODO: Non-scuffed
rangeKey: RangedRange
- !type:TargetInLOSPrecondition
targetKey: Target
rangeKey: RangedRange
opaqueKey: true
operator: !type:GunOperator
targetKey: Target
opaqueKey: true
services:
- !type:UtilityService
id: RangedService
proto: NearbyGunTargets
key: Target
- tasks:
- !type:HTNCompoundTask
task: IdleSpinCompound
- type: htnCompound
id: SimpleRangedHostileCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: InnateRangedCombatCompound
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: SimpleHumanoidHostileCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: RangedCombatCompound
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound

28
Prototypes/NPCs/test.yml Normal file
View File

@@ -0,0 +1,28 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 degradka <69397649+degradka@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
# Selects a random pathfind point and tries to move there.
- type: htnCompound
id: MoveToPathfindPointCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:PickPathfindPointOperator
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: false
- type: entity
id: MobPathfindDummy
name: pathfind dummy
suffix: NPC
parent: MobSpiderAngryBase
components:
- type: HTN
rootTask:
task: MoveToPathfindPointCompound

View File

@@ -0,0 +1,283 @@
# SPDX-FileCopyrightText: 2023 Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 deltanedas <39013340+deltanedas@users.noreply.github.com>
# SPDX-FileCopyrightText: 2023 deltanedas <@deltanedas:kde.org>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2024 Golinth <amh2023@gmail.com>
# SPDX-FileCopyrightText: 2024 Tayrtahn <tayrtahn@gmail.com>
# SPDX-FileCopyrightText: 2024 osjarw <62134478+osjarw@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
# SPDX-FileCopyrightText: 2025 Ilya246 <ilyukarno@gmail.com>
# SPDX-FileCopyrightText: 2025 chromiumboy <50505512+chromiumboy@users.noreply.github.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
- type: utilityQuery
id: InventoryGuns
query:
- !type:InventoryQuery
- !type:ComponentFilter
components:
- type: Gun
considerations:
- !type:TargetAmmoCon
curve: !type:QuadraticCurve
- type: utilityQuery
id: NearbyAmmo
query:
- !type:ComponentQuery
components:
- type: Ammo
- type: Item
considerations:
- !type:TargetAmmoMatchesCon
curve: !type:BoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
# TODO: Get ammo count.
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyFood
query:
- !type:ComponentQuery
components:
- type: Food
considerations:
- !type:TargetIsAliveCon
curve: !type:InverseBoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:FoodValueCon
curve: !type:QuadraticCurve
slope: 1.0
exponent: 0.4
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyDrink
query:
- !type:ComponentQuery
components:
- type: Drink
considerations:
- !type:TargetIsAliveCon
curve: !type:InverseBoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:DrinkValueCon
curve: !type:QuadraticCurve
slope: 1.0
exponent: 0.4
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyGuns
query:
- !type:ComponentQuery
components:
- type: Gun
- type: Item
considerations:
# TODO: Prefer highest DPC probably?
- !type:TargetAmmoCon
curve: !type:BoolCurve
- !type:TargetRequiresWieldAndCanWieldCon # Goobstation
curve: !type:BoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyMeleeTargets
query:
- !type:NearbyHostilesQuery
considerations:
# Goobstation - check is dead instead so we can target non-living stuff
- !type:TargetIsDeadCon
curve: !type:InverseBoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetHealthCon
curve: !type:PresetCurve
preset: TargetHealth
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- !type:TargetInLOSOrCurrentCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyColdMeleeTargets
query:
- !type:NearbyHostilesQuery
considerations:
- !type:TargetLowTempCon
curve: !type:BoolCurve
minTemp: 250
- !type:TargetIsAliveCon
curve: !type:BoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetHealthCon
curve: !type:PresetCurve
preset: TargetHealth
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- !type:TargetInLOSOrCurrentCon
curve: !type:BoolCurve
- type: utilityQuery
id: OrderedTargets
query:
- !type:NearbyHostilesQuery
considerations:
# Goobstation - check is dead instead so we can target non-living stuff
- !type:TargetIsDeadCon
curve: !type:InverseBoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetHealthCon
curve: !type:PresetCurve
preset: TargetHealth
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- !type:TargetInLOSOrCurrentCon
curve: !type:BoolCurve
# they gotta be what we ordered
- !type:OrderedTargetCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyMeleeWeapons
query:
- !type:ComponentQuery
components:
# Just serializer things
- type: MeleeWeapon
damage:
types:
Blunt: 0
- type: Item
- !type:ComponentFilter
components:
- type: Gun
invert: true
- !type:RemoveAnchoredFilter
considerations:
- !type:TargetMeleeCon
curve: !type:QuadraticCurve
slope: 0.5
exponent: 0.5
yOffset: 0
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyOnFire
query:
- !type:ComponentQuery
components:
- type: Flammable
# why does Flammable even have a required damage
damage:
types:
burn: 0
considerations:
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- !type:TargetInLOSOrCurrentCon
curve: !type:BoolCurve
- !type:TargetOnFireCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyPuddles
query:
- !type:ComponentQuery
components:
- type: Puddle
- !type:PuddleFilter
considerations:
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- !type:TargetInLOSOrCurrentCon
curve: !type:BoolCurve
- type: utilityQuery
id: NearbyGunTargets
query:
- !type:NearbyHostilesQuery
considerations:
# Goobstation - check is dead instead so we can target non-living stuff
- !type:TargetIsDeadCon
curve: !type:InverseBoolCurve
- !type:TargetIsCritCon
curve: !type:InverseBoolCurve
- !type:TargetIsStunnedCon
curve: !type:InverseBoolCurve
- !type:TurretTargetingCon
curve: !type:BoolCurve
- !type:TargetDistanceCon
curve: !type:PresetCurve
preset: TargetDistance
- !type:TargetHealthCon
curve: !type:PresetCurve
preset: TargetHealth
- !type:TargetAccessibleCon
curve: !type:BoolCurve
- !type:TargetInLOSOrCurrentCon
curve: !type:BoolCurve
#- type: utilityQuery
# id: NearbyShoes
# query:
# - !type:ComponentQuery
# components:
# - type: Clothing
# - !type:ClothingSlotFilter
# slotFlags: Feet
# considerations:
# - !type:TargetDistanceCon
# curve: !type:PresetCurve
# preset: TargetDistance
# - !type:TargetAccessibleCon
# curve: !type:BoolCurve
# Presets
- type: utilityCurvePreset
id: TargetDistance
curve: !type:QuadraticCurve
slope: -1
exponent: 1
yOffset: 1
xOffset: 0
- type: utilityCurvePreset
id: TargetHealth
curve: !type:QuadraticCurve
slope: 1.0
exponent: 0.4
xOffset: -0.02

View File

@@ -0,0 +1,43 @@
- type: htnCompound
id: WeldbotCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: WeldNearbyCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound
- type: htnCompound
id: WeldNearbyCompound
branches:
- tasks:
- !type:HTNPrimitiveTask
operator: !type:PickNearbyWeldableOperator
targetKey: WeldTarget
targetMoveKey: TargetCoordinates
- !type:HTNPrimitiveTask
operator: !type:SpeakOperator
speech: weldbot-start-weld
hidden: true
- !type:HTNPrimitiveTask
operator: !type:MoveToOperator
pathfindInPlanning: false
- !type:HTNPrimitiveTask
operator: !type:SetFloatOperator
targetKey: IdleTime
amount: 3
- !type:HTNPrimitiveTask
operator: !type:WaitOperator
key: IdleTime
preconditions:
- !type:KeyExistsPrecondition
key: IdleTime
- !type:HTNPrimitiveTask
operator: !type:WeldbotWeldOperator
targetKey: WeldTarget

15
Prototypes/NPCs/xeno.yml Normal file
View File

@@ -0,0 +1,15 @@
# SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
# SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
#
# SPDX-License-Identifier: MIT
- type: htnCompound
id: XenoCompound
branches:
- tasks:
- !type:HTNCompoundTask
task: MeleeCombatCompound
- tasks:
- !type:HTNCompoundTask
task: IdleCompound