/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.grid;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.happydroids.droidtowers.entities.Elevator;
import com.happydroids.droidtowers.entities.GridObject;
import com.happydroids.droidtowers.entities.Stair;
import com.happydroids.droidtowers.math.GridPoint;
import static com.happydroids.droidtowers.TowerConsts.GRID_UNIT_SIZE;
public class GridPosition {
public final int x;
public final int y;
private final Vector2 worldVector;
private Array<GridObject> objects = new Array<GridObject>();
public Elevator elevator;
public Stair stair;
public boolean connectedToTransit;
public float distanceFromTransit;
public float normalizedDistanceFromTransit;
public boolean connectedToSecurity;
public float distanceFromSecurity;
public float normalizedDistanceFromSecurity;
private float maxNoiseLevel;
private float maxCrimeLevel;
private float noiseLevel;
private float crimeLevel;
public GridPosition(int x, int y) {
this.x = x;
this.y = y;
worldVector = new Vector2(x * GRID_UNIT_SIZE, y * GRID_UNIT_SIZE);
}
public Array<GridObject> getObjects() {
return objects;
}
public void add(GridObject gridObject) {
if (!objects.contains(gridObject, true)) {
objects.add(gridObject);
if (gridObject instanceof Elevator) {
GridPoint position = gridObject.getPosition();
GridPoint size = gridObject.getSize();
if (position.x == x && (position.y == y || position.y + size.y == y)) {
return;
}
elevator = (Elevator) gridObject;
} else if (gridObject instanceof Stair) {
stair = (Stair) gridObject;
}
}
}
public void remove(GridObject gridObject) {
if (objects.contains(gridObject, true)) {
objects.removeValue(gridObject, true);
if (gridObject instanceof Elevator) {
elevator = null;
} else if (gridObject instanceof Stair) {
stair = null;
}
}
}
public int size() {
return objects.size;
}
public boolean isEmpty() {
return objects.size == 0;
}
public boolean contains(GridObject gridObject) {
return objects.contains(gridObject, true);
}
public Vector2 worldPoint() {
return worldVector;
}
public void findMaxValues() {
maxNoiseLevel = 0;
maxCrimeLevel = 0;
for (GridObject gridObject : objects) {
maxNoiseLevel = Math.max(gridObject.getNoiseLevel(), maxNoiseLevel);
maxCrimeLevel = Math.max(gridObject.getCrimeLevel(), maxCrimeLevel);
}
}
public void calculateValuesForPosition(GridPosition[][] gridPositions) {
noiseLevel = 0;
crimeLevel = 0;
float totalNoise = 0f;
float totalCrime = 0f;
int distance = 2;
for (int xx = x - distance; xx < x + distance; xx++) {
for (int yy = y - distance; yy < y + distance; yy++) {
if (xx < 0 || yy < 0 || xx >= gridPositions.length || yy >= gridPositions[xx].length) {
continue;
}
if (xx == x && yy == y) {
continue;
}
totalNoise += gridPositions[xx][yy].maxNoiseLevel;
totalCrime += gridPositions[xx][yy].maxCrimeLevel;
}
}
noiseLevel = Math.min(1f, maxNoiseLevel + totalNoise / 8);
crimeLevel = Math.min(1f, maxCrimeLevel + totalCrime / 8);
}
public float getNoiseLevel() {
return noiseLevel;
}
public float getCrimeLevel() {
return crimeLevel;
}
@SuppressWarnings("RedundantIfStatement")
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof GridPosition)) {
return false;
}
GridPosition that = (GridPosition) o;
if (connectedToTransit != that.connectedToTransit) {
return false;
}
if (x != that.x) {
return false;
}
if (y != that.y) {
return false;
}
if (elevator != null ? !elevator.equals(that.elevator) : that.elevator != null) {
return false;
}
if (objects != null ? !objects.equals(that.objects) : that.objects != null) {
return false;
}
if (stair != null ? !stair.equals(that.stair) : that.stair != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
result = 31 * result + (objects != null ? objects.hashCode() : 0);
result = 31 * result + (connectedToTransit ? 1 : 0);
result = 31 * result + (elevator != null ? elevator.hashCode() : 0);
result = 31 * result + (stair != null ? stair.hashCode() : 0);
return result;
}
}