package com.bioxx.tfc2.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.minecraft.entity.EntityLiving;
import com.bioxx.jmapgen.IslandMap;
import com.bioxx.jmapgen.IslandParameters;
import com.bioxx.jmapgen.graph.Center;
import com.bioxx.jmapgen.graph.Center.Marker;
import com.bioxx.tfc2.api.types.ClimateTemp;
import com.bioxx.tfc2.api.types.Moisture;
public class AnimalSpawnRegistry
{
private static AnimalSpawnRegistry instance = new AnimalSpawnRegistry();
public static AnimalSpawnRegistry getInstance()
{
return instance;
}
public Map<String, SpawnGroup> entityMap = new HashMap<String, SpawnGroup>();
public void register(SpawnGroup group)
{
entityMap.put(group.getGroupName(), group);
}
public ArrayList<SpawnGroup> getValidSpawnGroups(IslandParameters map)
{
ArrayList<SpawnGroup> outList = new ArrayList<SpawnGroup>();
Iterator iter = entityMap.values().iterator();
while(iter.hasNext())
{
SpawnGroup group = (SpawnGroup)iter.next();
if(group.getSpawnParams().isIslandValid(map))
outList.add(group);
}
return outList;
}
public SpawnGroup getGroupFromName(String groupName)
{
return entityMap.get(groupName);
}
public static class SpawnGroup
{
String groupName;
Class<?extends EntityLiving> entityClass;
int minSpawnGroupSize;
int maxSpawnGroupSize;
int maxPopulation;
int maxConcurrent;
SpawnParameters spawnParams;
public SpawnGroup(String name, Class<?extends EntityLiving> c, int minGroup, int maxGroup, int maxtotal, int maxConcurrent, SpawnParameters parameters)
{
groupName = name;
entityClass = c;
minSpawnGroupSize = minGroup;
maxSpawnGroupSize = maxGroup;
maxPopulation = maxtotal;
spawnParams = parameters;
this.maxConcurrent = maxConcurrent;
}
/**
* Should be overriden to setup the entity
*/
public void onSpawn(EntityLiving e){}
public String getGroupName() {
return groupName;
}
public Class<? extends EntityLiving> getEntityClass() {
return entityClass;
}
public int getMinGroupSpawn() {
return minSpawnGroupSize;
}
public int getMaxGroupSpawn() {
return maxSpawnGroupSize;
}
public int getMaxPopulation() {
return maxPopulation;
}
public int getMaxConcurrent() {
return maxConcurrent;
}
public SpawnParameters getSpawnParams()
{
return spawnParams;
}
}
public static class SpawnParameters
{
ClimateTemp minTemp, maxTemp;
Moisture minMoisture, maxMoisture;
EntityLiving.SpawnPlacementType placementType;
public SpawnParameters(ClimateTemp minTemp, ClimateTemp maxTemp, Moisture minMoisture, Moisture maxMoisture)
{
this.minTemp = minTemp;
this.maxTemp = maxTemp;
this.minMoisture = minMoisture;
this.maxMoisture = maxMoisture;
placementType = EntityLiving.SpawnPlacementType.ON_GROUND;
}
public SpawnParameters(ClimateTemp minTemp, ClimateTemp maxTemp, Moisture minMoisture, Moisture maxMoisture, EntityLiving.SpawnPlacementType placement)
{
this(minTemp, maxTemp, minMoisture, maxMoisture);
placementType = placement;
}
public boolean isIslandValid(IslandParameters map)
{
Moisture m = map.getIslandMoisture();
ClimateTemp temp = map.getIslandTemp();
if(m.isLessThan(minMoisture) || m.isGreaterThan(maxMoisture))
return false;
if(temp.isLessThan(minTemp) || temp.isGreaterThan(maxTemp))
return false;
return true;
}
/**
* This is used when the island tick is looking for a hex to queue spawning. This is NOT used during the actual entity spawning.
*/
public boolean canSpawnHere(IslandMap map, Center closest)
{
if(placementType == EntityLiving.SpawnPlacementType.ON_GROUND && closest.hasMarker(Marker.Water))
return false;
else if(placementType == EntityLiving.SpawnPlacementType.IN_WATER && !closest.hasMarker(Marker.Water))
return false;
return true;
}
public EntityLiving.SpawnPlacementType getPlacementType()
{
return placementType;
}
public boolean canSpawnInDesert()
{
return false;
}
}
public static class SpawnEntry
{
private String groupName;
private int totalPopulation;//Current total island population, including unplaced animals
private int availablePopulation;//Amount waiting to be placed
public SpawnEntry(String name, int total)
{
groupName = name;
totalPopulation = total;
availablePopulation = 0;
}
public SpawnEntry(String name, int avail, int total)
{
groupName = name;
totalPopulation = total;
availablePopulation = avail;
}
public int getTotalPopulation()
{
return totalPopulation;
}
public String getGroupName()
{
return groupName;
}
/**
* Removes an animal from the total poplation counter and makes a slot available for placing a new animal on the island
*/
public void removeAnimal()
{
totalPopulation--;
availablePopulation++;
}
/**
* Simply adds a new animal to the total population count
*/
public void addNewAnimal(int amt)
{
totalPopulation+=amt;
}
public boolean hasRoomForNewSpawns()
{
return availablePopulation > 0;
}
public int getAmountToSpawn()
{
return availablePopulation;
}
}
}