From f06925cd3c01f16b69b6dcc430df4fff97d1b9f8 Mon Sep 17 00:00:00 2001 From: Arthur Casals Date: Sat, 22 Jun 2019 11:57:42 +0200 Subject: [PATCH] Fixed stray loop and added probabilistic movement --- assets/behaviors/common/doRandomMove.behavior | 4 +- .../move/SetTargetToNearbyBlockNode.java | 37 ++++++++++--------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/assets/behaviors/common/doRandomMove.behavior b/assets/behaviors/common/doRandomMove.behavior index d411b4cf..b674529a 100644 --- a/assets/behaviors/common/doRandomMove.behavior +++ b/assets/behaviors/common/doRandomMove.behavior @@ -1,6 +1,8 @@ { sequence : [ - set_target_nearby_block, + { + set_target_nearby_block : { moveProbability: 65 } + }, move_to ] } diff --git a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java index 4ccfa44e..559832a7 100644 --- a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java +++ b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java @@ -32,40 +32,41 @@ @BehaviorAction(name = "set_target_nearby_block") public class SetTargetToNearbyBlockNode extends BaseAction { - private static final int RANDOM_BLOCK_ITERATIONS = 10; private static final Logger logger = LoggerFactory.getLogger(SetTargetToNearbyBlockNode.class); private transient Random random = new Random(); @In private PathfinderSystem pathfinderSystem; + private int moveProbability = 100; @Override public BehaviorState modify(Actor actor, BehaviorState result) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.currentBlock != null) { - WalkableBlock target = findRandomNearbyBlock(moveComponent.currentBlock); - moveComponent.target = target.getBlockPosition().toVector3f(); - actor.save(moveComponent); - } else { - return BehaviorState.FAILURE; + if (random.nextInt(100) > (99 - moveProbability)) { + MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); + if (moveComponent.currentBlock != null) { + WalkableBlock target = findRandomNearbyBlock(moveComponent.currentBlock); + moveComponent.target = target.getBlockPosition().toVector3f(); + actor.save(moveComponent); + } else { + return BehaviorState.FAILURE; + } } return BehaviorState.SUCCESS; } private WalkableBlock findRandomNearbyBlock(WalkableBlock startBlock) { WalkableBlock currentBlock = startBlock; - for (int i = 0; i < RANDOM_BLOCK_ITERATIONS; i++) { - WalkableBlock[] neighbors = currentBlock.neighbors; - List existingNeighbors = Lists.newArrayList(); - for (WalkableBlock neighbor : neighbors) { - if (neighbor != null) { - existingNeighbors.add(neighbor); - } - } - if (existingNeighbors.size() > 0) { - currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); + + WalkableBlock[] neighbors = currentBlock.neighbors; + List existingNeighbors = Lists.newArrayList(); + for (WalkableBlock neighbor : neighbors) { + if (neighbor != null) { + existingNeighbors.add(neighbor); } } + if (existingNeighbors.size() > 0) { + currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); + } logger.debug(String.format("Looking for a block: my block is %s, found destination %s", startBlock.getBlockPosition(), currentBlock.getBlockPosition())); return currentBlock;