use of main.entity.obj.Obj in project Eidolons by IDemiurge.
the class PathChoiceMaster method getChoices.
List<Choice> getChoices(ActionPath path, Coordinates c_coordinate, Coordinates targetCoordinate, FACING_DIRECTION c_facing) {
Chronos.mark("Finding choices for " + path);
pathBuilder.adjustUnit();
List<Choice> choices = new ArrayList<>();
for (Coordinates c : getDefaultCoordinateTargets(path, c_coordinate)) {
Choice stdMoveChoice = constructStdMoveChoice(c, c_coordinate, c_facing);
if (stdMoveChoice != null) {
choices.add(stdMoveChoice);
}
}
Chronos.mark("Finding custom choices for " + path);
List<Choice> specialChoices = new ArrayList<>();
if (ListMaster.isNotEmpty(moveActions)) {
for (DC_ActiveObj a : moveActions) {
if (!a.canBeActivated()) {
if (firstStep) {
if (!ReasonMaster.checkReasonCannotActivate(a, PARAMS.C_N_OF_ACTIONS.getName())) {
// exception for AP TODO
continue;
}
}
}
if (path.hasAction(a)) {
if (a.getIntParam(PARAMS.COOLDOWN) >= 0) {
continue;
}
}
Targeting targeting = a.getTargeting();
Collection<Obj> objects = null;
if (targeting instanceof FixedTargeting) {
Targeting t = a.getAbilities().getTargeting();
if (t != null) {
objects = t.getFilter().getObjects(a.getRef());
}
Effect e = a.getAbilities().getEffects().getEffects().get(0);
e.setRef(unit.getRef());
if (e instanceof SelfMoveEffect) {
try {
Coordinates coordinates = ((SelfMoveEffect) e).getCoordinates();
if (coordinates != null) {
objects = new ArrayList<>(Arrays.asList(unit.getGame().getCellByCoordinate(coordinates)));
}
} catch (Exception ex) {
main.system.ExceptionMaster.printStackTrace(ex);
}
}
} else {
pathBuilder.adjustUnit();
objects = targeting.getFilter().getObjects(a.getRef());
}
if (objects != null) {
List<Choice> choicesForAction = new ArrayList<>();
for (Object obj : objects) {
if (obj instanceof DC_Cell) {
Coordinates coordinates = ((DC_Cell) obj).getCoordinates();
// if (a.getName().equals("Clumsy Leap"))
if (PositionMaster.getDistance(coordinates, c_coordinate) > Math.max(1, a.getIntParam(PARAMS.RANGE))) {
continue;
}
if (PositionMaster.getDistance(coordinates, targetCoordinate) > PositionMaster.getDistance(c_coordinate, targetCoordinate)) {
// TODO will this not eliminate good
continue;
}
// choices?
Ref ref = unit.getRef().getCopy();
ref.setTarget(((DC_Cell) obj).getId());
Choice choice = new Choice(coordinates, c_coordinate, new Action(a, ref));
choicesForAction.add(choice);
}
}
Chronos.mark("Filter custom choices for " + a);
specialChoices.addAll(filterSpecialMoveChoices(choicesForAction, a, c_coordinate, path));
Chronos.logTimeElapsedForMark("Filter custom choices for " + a);
}
// if (choices.size() > 1)
}
}
Chronos.logTimeElapsedForMark("Finding custom choices for " + path);
choices.addAll(specialChoices);
Chronos.mark("Sort choices");
sortChoices(choices);
Chronos.logTimeElapsedForMark("Sort choices");
// resetUnit();// TODO is that right?
Chronos.logTimeElapsedForMark("Finding choices for " + path);
// Chronos.logTimeElapsedForMark("Sorting choices for " + path);
return choices;
}
use of main.entity.obj.Obj in project Eidolons by IDemiurge.
the class DC_BattleFieldManager method resetWalls.
public void resetWalls() {
doorMap.clear();
Map<Coordinates, BattleFieldObject> wallObjects = new HashMap<>();
for (Obj obj : game.getObjects(DC_TYPE.BF_OBJ)) {
BattleFieldObject bfObj = (BattleFieldObject) obj;
if (bfObj.getZ() == game.getDungeon().getZ()) {
if (bfObj.isWall()) {
wallObjects.put(obj.getCoordinates(), bfObj);
}
if (bfObj instanceof Door) {
doorMap.put(obj.getCoordinates(), ((Door) bfObj).getState());
}
}
}
if (wallMap == null) {
wallMap = new HashMap<>();
}
wallMap.clear();
ArrayList<Coordinates> coordinates = new ArrayList<>(wallObjects.keySet());
for (Coordinates coordinate : coordinates) {
BattleFieldObject wall = wallObjects.get(coordinate);
if (wall.isDead()) {
continue;
}
List<DIRECTION> list = new ArrayList<>();
for (Coordinates c : coordinate.getAdjacent(false)) {
BattleFieldObject adjWall = wallObjects.get(c);
if (adjWall != null) {
if (adjWall.isWall() && !adjWall.isDead()) {
DIRECTION side = DirectionMaster.getRelativeDirection(coordinate, c);
list.add(side);
}
}
}
adjacent: for (Coordinates c : coordinate.getAdjacent(true)) {
BattleFieldObject adjWall = wallObjects.get(c);
if (adjWall != null) {
if (adjWall.isWall() && !adjWall.isDead()) {
DIRECTION side = DirectionMaster.getRelativeDirection(coordinate, c);
if (!side.isDiagonal()) {
continue;
}
for (DIRECTION s : list) {
if (s.isDiagonal()) {
continue;
}
if (side.getXDirection() == s) {
continue adjacent;
}
if (side.getYDirection() == s) {
continue adjacent;
}
}
list.add(side);
}
}
}
if (!list.isEmpty()) {
if (coordinate == null)
continue;
wallMap.put(coordinate, list);
}
}
if (diagonalJoints == null) {
diagonalJoints = new HashMap<>();
}
diagonalJoints.clear();
loop: for (Coordinates c : wallMap.keySet()) {
for (DIRECTION s : wallMap.get(c)) {
if (s.isDiagonal()) {
// for (Coordinates c :
// o.getCoordinates().getAdjacentCoordinates(null)) {
// if (wallObjects.get(c) != null) {
// if (containsAdjacentDiagonal in X direction
// }
// }
List<DIRECTION> list = diagonalJoints.get(c);
if (list == null) {
list = new ArrayList<>();
}
diagonalJoints.put(c, list);
if (list.size() == 1) {
DIRECTION d = list.get(0);
if (s.growX)
if (!d.growX)
continue;
else if (d.growX)
continue;
if (s.growY)
if (!d.growY)
continue;
else if (d.growY)
continue;
}
list.add(s);
continue loop;
}
}
}
wallResetRequired = false;
}
use of main.entity.obj.Obj in project Eidolons by IDemiurge.
the class DC_GraveyardManager method addCorpse.
@Override
public void addCorpse(Obj unit) {
graveMap.get(getZCoordinate(unit.getCoordinates())).push(unit);
Obj cell = game.getCellByCoordinate(getZCoordinate(unit.getCoordinates()));
cell.setParam(G_PARAMS.N_OF_CORPSES, graveMap.get(getZCoordinate(unit.getCoordinates())).size());
if (game.getObjectByCoordinate(getZCoordinate(unit.getCoordinates())) != null) {
game.getObjectByCoordinate(getZCoordinate(unit.getCoordinates())).setParam(G_PARAMS.N_OF_CORPSES, graveMap.get(getZCoordinate(unit.getCoordinates())).size());
}
GuiEventManager.trigger(UPDATE_GRAVEYARD, unit.getCoordinates());
}
use of main.entity.obj.Obj in project Eidolons by IDemiurge.
the class DC_ObjInitializer method initializePartyPositions.
public static void initializePartyPositions(String playerPartyData, Collection<? extends Obj> units) {
List<String> items = Arrays.asList(playerPartyData.split(OBJ_SEPARATOR));
for (String item : items) {
Coordinates c = getCoordinatesFromObjString(item);
String typeName = item.split(COORDINATES_OBJ_SEPARATOR)[1];
for (Obj unit : units) {
if (unit.getType().getName().equals(typeName)) {
if (!DC_Game.game.getRules().getStackingRule().canBeMovedOnto(unit, c)) {
// TODO tactics?
// direction
c = Positioner.adjustCoordinate(c, FacingMaster.getRandomFacing());
// preference?
}
unit.setCoordinates(c);
}
}
}
}
use of main.entity.obj.Obj in project Eidolons by IDemiurge.
the class DroppedItemManager method findDroppedItem.
public DC_HeroItemObj findDroppedItem(String typeName, Coordinates coordinates) {
Obj cell = game.getCellByCoordinate(coordinates);
Obj item = new ListMaster<Obj>().findType(typeName, new ArrayList<>(getDroppedItems(cell)));
return (DC_HeroItemObj) item;
}
Aggregations