use of eidolons.entity.obj.unit.Unit in project Eidolons by IDemiurge.
the class AtomicAi method getHotZoneCell.
private Coordinates getHotZoneCell(UnitAI ai, Boolean approach_retreat_search) {
ATOMIC_LOGIC logic = getAtomicLogic(ai);
List<Unit> enemies = Analyzer.getVisibleEnemies(ai);
List<Unit> allies = Analyzer.getAllies(ai);
float greatest = 0;
Coordinates pick = null;
for (Coordinates c : ai.getUnit().getCoordinates().getAdjacentCoordinates()) {
float i = 0;
i += getCellPriority(c, ai);
if (BooleanMaster.isFalse(approach_retreat_search)) {
for (Unit a : allies) {
i += getAllyPriority(c, a, ai, logic) + RandomWizard.getRandomInt(10);
}
}
for (Unit e : enemies) {
i = i + ((approach_retreat_search ? 1 : -1) * getEnemyPriority(c, e, ai, logic)) + RandomWizard.getRandomInt(10);
}
i = i * getCellPriorityMod(c, ai) / 100;
if (i > greatest) {
greatest = i;
pick = c;
}
}
return pick;
}
use of eidolons.entity.obj.unit.Unit in project Eidolons by IDemiurge.
the class AtomicAi method getApproachCoordinate.
private Coordinates getApproachCoordinate(UnitAI ai) {
Collection<Unit> units = getAnalyzer().getVisibleEnemies(ai);
if (units.isEmpty())
return null;
FACING_DIRECTION facing = FacingMaster.getOptimalFacingTowardsUnits(getUnit().getCoordinates(), units, t -> getThreatAnalyzer().getThreat(ai, (Unit) t));
if (facing == null)
return null;
Coordinates c = getUnit().getCoordinates().getAdjacentCoordinate(facing.getDirection());
return Positioner.adjustCoordinate(ai.getUnit(), c, ai.getUnit().getFacing());
}
use of eidolons.entity.obj.unit.Unit in project Eidolons by IDemiurge.
the class AiScriptExecutor method executeCommand.
private void executeCommand(Unit unit, COMBAT_SCRIPT_FUNCTION function, String arg, boolean free, boolean immediate, String... args) {
ActionSequence sequence = null;
GOAL_TYPE goal = getGoalType(function);
Task task = new Task(true, unit.getAI(), goal, arg);
UnitAI ai = unit.getAI();
switch(function) {
case MOVE_TO:
// via a path!
ActionPath path = getPathSequenceConstructor().getOptimalPathSequence(unit.getAI(), new Coordinates(arg.toString()));
sequence = new ActionSequence(path.getActions(), task, unit.getAI());
break;
case TURN_TO:
// cell id
sequence = new ActionSequence(getTurnSequenceConstructor().getTurnSequence(FACING_SINGLE.IN_FRONT, unit, new Coordinates(arg.toString())), task, unit.getAI());
break;
case ACTION:
Action action = AiActionFactory.newAction(arg.toString(), ai);
// new ActionSequence();
sequence = getActionSequenceConstructor().constructSingleActionSequence(action, new Task(ai, goal, args[0]));
break;
case ATTACK:
break;
case FREEZE:
break;
case UNFREEZE:
break;
case ORDER:
// OrderFactory.getOrder();
Order a = new Order(arg.toString());
unit.getAI().setCurrentOrder(a);
return;
}
if (immediate) {
unit.getAI().setStandingOrders(sequence);
unit.getAI().setFree(free);
} else
sequence.getActions().forEach(// TODO wait?
action -> getExecutor().execute(action, free));
}
use of eidolons.entity.obj.unit.Unit in project Eidolons by IDemiurge.
the class AiScriptExecutor method execute.
@Override
public boolean execute(COMBAT_SCRIPT_FUNCTION function, Ref ref, String... args) {
if (args[0].equalsIgnoreCase("group")) {
}
int i = 0;
Unit unit = (Unit) ref.getObj(args[0]);
if (unit == null) {
String name = args[i];
if (DataManager.isTypeName(name))
i++;
else
name = null;
AI_ARG arg = new EnumMaster<AI_ARG>().retrieveEnumConst(AI_ARG.class, args[i]);
unit = getUnit(arg);
if (unit == null) {
// getPower(arg);
Boolean power = null;
Boolean distance = getDistance(arg);
Boolean ownership = getOwnership(arg);
unit = getGame().getMaster().getUnitByName(name, ref, ownership, distance, power);
}
}
i++;
// group?
// with frozen gameLoop?
String arg = null;
boolean free = false;
boolean immediate = false;
if (args.length > i) {
String options = args[i + 1];
i++;
// if (StringMaster.contains(options, FREE)
free = true;
immediate = true;
arg = options;
}
String[] additionalArgs = null;
if (args.length > i) {
additionalArgs = new String[args.length - i];
for (int j = 0; j < args.length; j++) {
additionalArgs[j] = args[i + j];
}
}
executeCommand(unit, function, arg, free, immediate, additionalArgs);
return true;
}
use of eidolons.entity.obj.unit.Unit in project Eidolons by IDemiurge.
the class TurnSequenceConstructor method getTurnSequence.
public List<Action> getTurnSequence(Action action) {
Conditions conditions = (action.getTargeting().getFilter().getConditions());
FacingCondition condition = null;
FACING_SINGLE template = null;
DC_Obj target = action.getTarget();
Unit source = (Unit) action.getRef().getSourceObj();
for (Condition c : conditions) {
if (c instanceof FacingCondition) {
condition = (FacingCondition) c;
break;
}
List<Object> list = ClassMaster.getInstances(c, FacingCondition.class);
if (!list.isEmpty()) {
List<Action> front_sequence = getTurnSequence(FACING_SINGLE.IN_FRONT, source, target.getCoordinates());
List<Action> side_sequence = null;
if (action.getSource().hasBroadReach() || action.getActive().checkPassive(UnitEnums.STANDARD_PASSIVES.BROAD_REACH)) // front_sequence.remove(front_sequence.size() - 1);
{
side_sequence = getTurnSequence(FACING_SINGLE.TO_THE_SIDE, source, target.getCoordinates());
}
List<Action> hind_sequence = null;
if (action.getSource().hasHindReach() || action.getActive().checkPassive(UnitEnums.STANDARD_PASSIVES.HIND_REACH)) {
hind_sequence = getTurnSequence(FACING_SINGLE.BEHIND, source, target.getCoordinates());
}
return new ListMaster<Action>().getSmallest(front_sequence, hind_sequence, side_sequence);
}
}
// }
if (condition == null) {
return new ArrayList<>();
}
if (ArrayMaster.isNotEmpty(condition.getTemplate())) {
template = condition.getTemplate()[0];
}
return getTurnSequence(template, source, target.getCoordinates());
}
Aggregations