/******************************************************************************* * Copyright (c) 2015, 2016 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ package jsettlers.logic.movable.strategies; import jsettlers.common.material.ESearchType; import jsettlers.common.movable.EDirection; import jsettlers.common.position.ShortPoint2D; import jsettlers.logic.constants.Constants; import jsettlers.logic.constants.MatchConstants; import jsettlers.logic.movable.EGoInDirectionMode; import jsettlers.logic.movable.Movable; import jsettlers.logic.movable.MovableStrategy; /** * * @author Andreas Eberle * */ public class FleeStrategy extends MovableStrategy { private static final long serialVersionUID = -7693464085159449304L; private int searchesCounter = 0; private boolean turnNextTime; private int lastCheckedPathStep; private byte pathStepCheckedCounter; public FleeStrategy(Movable movable) { super(movable); } @Override protected void action() { ShortPoint2D position = movable.getPos(); if (!super.isValidPosition(position)) { if (searchesCounter > 120) { movable.kill(); return; } if (super.preSearchPath(true, position.x, position.y, Constants.MOVABLE_FLEEING_DIJKSTRA_RADIUS, ESearchType.VALID_FREE_POSITION) || super.preSearchPath(false, position.x, position.y, Constants.MOVABLE_FLEEING_MAX_RADIUS, ESearchType.VALID_FREE_POSITION)) { lastCheckedPathStep = Integer.MIN_VALUE; super.followPresearchedPath(); } else { EDirection currentDirection = movable.getDirection(); EDirection newDirection; if (turnNextTime || MatchConstants.random().nextFloat() < 0.10) { turnNextTime = false; newDirection = currentDirection.getNeighbor(MatchConstants.random().nextInt(-1, 1)); } else { newDirection = currentDirection; } ShortPoint2D newPos = newDirection.getNextHexPoint(position); if (super.goInDirection(newDirection, EGoInDirectionMode.GO_IF_FREE)) { turnNextTime = MatchConstants.random().nextInt(7) == 0; } else { super.lookInDirection(newDirection); turnNextTime = true; } } searchesCounter++; } else { movable.convertTo(movable.getMovableType()); } } @Override protected boolean checkPathStepPreconditions(ShortPoint2D pathTarget, int step) { if (lastCheckedPathStep == step) { pathStepCheckedCounter++; searchesCounter++; } else { pathStepCheckedCounter = 0; lastCheckedPathStep = (short) step; } return !super.isValidPosition(movable.getPos()) && pathStepCheckedCounter < 5; } }