/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.entities;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.SpriteCache;
import com.badlogic.gdx.math.MathUtils;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.happydroids.droidtowers.TowerAssetManager;
import com.happydroids.droidtowers.grid.GameGrid;
import com.happydroids.droidtowers.gui.GridObjectPopOver;
import com.happydroids.droidtowers.gui.RoomPopOver;
import com.happydroids.droidtowers.math.GridPoint;
import com.happydroids.droidtowers.types.RoomType;
import java.util.Set;
import static com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
public class Room extends GridObject {
private static BitmapFont labelFont;
public static final String DECAL_COUSIN_VINNIE = "cousin-vinnie";
public static final String DECAL_TRANSPORT_DISCONNECTED = "transport-disconnected";
public static final String DECAL_NEEDS_DROIDS = "needs-droids";
public static final String DECAL_DIRTY = "dirty";
private Sprite sprite;
private static final int UPDATE_FREQUENCY = 10000;
private long lastUpdateTime;
private int populationRequired;
private Set<Avatar> residents;
private float timeUntilDecalCheck = 0.05f;
public Room(RoomType roomType, GameGrid gameGrid) {
super(roomType, gameGrid);
if (availableDecals == null) {
availableDecals = Maps.newHashMap();
for (AtlasRegion region : TowerAssetManager.textureAtlas("rooms/decals.txt").getRegions()) {
availableDecals.put(region.name, region);
}
}
sprite = new Sprite(roomType.getTextureRegion(getVariationId()));
residents = Sets.newHashSet();
}
@Override
public Sprite getSprite() {
return sprite;
}
@Override
public void updateSprite() {
sprite.setRegion(gridObjectType.getTextureRegion(getVariationId()));
}
@Override
public void render(SpriteBatch spriteBatch, SpriteCache spriteCache, Color renderTintColor) {
super.render(spriteBatch, spriteCache, renderTintColor);
renderDecals(spriteBatch);
}
@Override
public void update(float deltaTime) {
super.update(deltaTime);
timeUntilDecalCheck -= deltaTime;
if (timeUntilDecalCheck <= 0) {
timeUntilDecalCheck = 2.5f;
checkDecals();
}
}
protected void checkDecals() {
if (loanFromCousinVinnie > 0) {
decalsToDraw.add(DECAL_COUSIN_VINNIE);
} else {
decalsToDraw.remove(DECAL_COUSIN_VINNIE);
}
if (!connectedToTransport) {
decalsToDraw.add(DECAL_TRANSPORT_DISCONNECTED);
} else {
decalsToDraw.remove(DECAL_TRANSPORT_DISCONNECTED);
}
if (needsDroids()) {
decalsToDraw.add(DECAL_NEEDS_DROIDS);
} else {
decalsToDraw.remove(DECAL_NEEDS_DROIDS);
}
}
public int getNumResidents() {
return residents.size();
}
@Override
public int getCoinsEarned() {
if (getNumResidents() > 0 && isConnectedToTransport()) {
return Math.round(gridObjectType.getCoinsEarned() * getNumResidents() * getResidencyLevel());
}
return 0;
}
@Override
public float getNoiseLevel() {
if (((RoomType) gridObjectType).getPopulationMax() > 0) {
return super.getNoiseLevel() * (getNumResidents() / ((RoomType) gridObjectType).getPopulationMax());
}
return 0;
}
@Override
public float getDesirability() {
if (placed && connectedToTransport) {
float value = 1f;
value -= getSurroundingNoiseLevel() * 0.5f;
value -= getTransportModifier() * 0.5f;
value -= getSecurityModifier() * 0.5f;
value -= getSurroundingCrimeLevel() * 0.5f;
return MathUtils.clamp(value, 0, 1f);
}
return 0f;
}
private float getSecurityModifier() {
float minDist = Float.MAX_VALUE;
for (GridPoint gridPoint : getGridPointsTouched()) {
minDist = Math.min(gameGrid.positionCache().getPosition(gridPoint).normalizedDistanceFromSecurity, minDist);
}
return minDist;
}
@Override
public GridObjectPopOver makePopOver() {
return new RoomPopOver(this);
}
@Override
protected boolean hasPopOver() {
return true;
}
@Override public boolean needsDroids() {
return residents.size() == 0;
}
private float getTransportModifier() {
float minDist = Float.MAX_VALUE;
for (GridPoint gridPoint : getGridPointsTouched()) {
minDist = Math.min(gameGrid.positionCache().getPosition(gridPoint).normalizedDistanceFromTransit, minDist);
}
return minDist;
}
public float getResidencyLevel() {
int populationMax = ((RoomType) gridObjectType).getPopulationMax();
if (populationMax == 0) {
return 0;
}
return residents.size() / (float) populationMax;
}
public Set<Avatar> getResidents() {
return residents;
}
@Override
public String toString() {
return "Room{" +
"name=" + getName() +
", supportedResidency=" + getNumSupportedResidents() +
", populationRequired=" + populationRequired +
", residents=" + residents +
'}';
}
public boolean addResident(Avatar avatar) {
if (getNumResidents() < getNumSupportedResidents()) {
residents.add(avatar);
decalsToDraw.remove(DECAL_NEEDS_DROIDS);
return true;
}
return false;
}
public boolean hasResidents() {
return !residents.isEmpty();
}
public int getNumSupportedResidents() {
int populationMax = ((RoomType) gridObjectType).getPopulationMax();
float desirability = getDesirability();
if (desirability > 0.75f) {
return populationMax;
}
return (int) Math.ceil(populationMax * desirability);
}
public void removeResident(Avatar avatar) {
residents.remove(avatar);
}
}