/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.worldpainter.layers.plants;
import org.pepsoft.worldpainter.exporting.LayerExporter;
import org.pepsoft.worldpainter.layers.CustomLayer;
import org.pepsoft.worldpainter.layers.bo2.Bo2ObjectProvider;
import org.pepsoft.worldpainter.objects.WPObject;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Random;
/**
*
* @author pepijn
*/
public class PlantLayer extends CustomLayer {
public PlantLayer(String name, String description, int colour) {
super(name, description, DataSize.BIT, 35, colour);
}
public PlantSettings getSettings(int plantIndex) {
return settings[plantIndex];
}
public void setSettings(int plantIndex, PlantSettings settings) {
this.settings[plantIndex] = settings;
}
public boolean isGenerateTilledDirt() {
return generateTilledDirt;
}
public void setGenerateTilledDirt(boolean generateTilledDirt) {
this.generateTilledDirt = generateTilledDirt;
}
public Bo2ObjectProvider getObjectProvider() {
int total = 0;
for (PlantSettings setting: settings) {
if (setting != null) {
total += setting.occurrence;
}
}
final byte[] pool = new byte[total], growthOffset = new byte[total], growthRange = new byte[total];
int index = 0;
for (byte i = 0; i < settings.length; i++) {
if (settings[i] != null) {
for (short j = 0; j < settings[i].occurrence; j++) {
growthOffset[index] = settings[i].dataValueFrom;
growthRange[index] = (byte) (settings[i].dataValueTo - settings[i].dataValueFrom);
pool[index++] = i;
}
}
}
return new Bo2ObjectProvider() {
@Override
public String getName() {
return PlantLayer.this.getName();
}
@Override
public WPObject getObject() {
final int index = random.nextInt(pool.length);
final Plant plant = Plant.ALL_PLANTS[pool[index]];
if (growthRange[index] == 0) {
return plant.withGrowth(growthOffset[index]);
} else {
return plant.withGrowth(growthOffset[index] + random.nextInt(growthRange[index] + 1));
}
}
@Override
public List<WPObject> getAllObjects() {
throw new UnsupportedOperationException("Not supported");
}
@Override
public void setSeed(long seed) {
random.setSeed(seed);
}
private final Random random = new Random();
};
}
// Layer
@Override
public PlantLayerExporter getExporter() {
return new PlantLayerExporter(this);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
// Legacy
if (settings.length < Plant.ALL_PLANTS.length) {
// (A) new plant(s) has been added
PlantSettings[] newSettings = new PlantSettings[Plant.ALL_PLANTS.length];
System.arraycopy(settings, 0, newSettings, 0, settings.length);
settings = newSettings;
}
}
public static class PlantSettings implements Serializable {
short occurrence;
byte dataValueFrom, dataValueTo;
private static final long serialVersionUID = 1L;
}
private PlantSettings[] settings = new PlantSettings[Plant.ALL_PLANTS.length];
private boolean generateTilledDirt = true;
private static final long serialVersionUID = -2758775044863488107L;
}