package ttftcuts.physis.common.block.tile; import java.util.ArrayList; import java.util.List; import java.util.Random; import ttftcuts.physis.puzzle.oddoneout.OddOneOutOption; import ttftcuts.physis.puzzle.oddoneout.OddOneOutPuzzle; import ttftcuts.physis.utils.TPair; import net.minecraft.nbt.NBTTagCompound; public class DigSiteLayer { private static final String BUILTTAG = "built"; private static final String PUZZLETAG = "puzzle"; public boolean built = false; public OddOneOutPuzzle puzzle; public DigSiteLayer() {} public DigSiteLayer(NBTTagCompound tag) { this(); this.readFromNBT(tag); } public void buildRenderData(List<DigSiteRenderLayer> renderlayers, TileEntityDigSite site) { if (this.puzzle == null) { return; } long seed = site.xCoord * 11092001 + site.yCoord * 12121787 + site.zCoord * 23456789 + site.currentlayer * 56598313; Random rand = new Random(seed); for(int i=0; i<6; i++) { OddOneOutOption o = this.puzzle.options.get(i); symbolLoop: for(int j=0; j<o.symbols.size(); j++) { TPair<Integer> s = o.symbols.get(j); for(int l=0; l<renderlayers.size(); l++) { DigSiteRenderLayer layer = renderlayers.get(l); if (layer.colour == s.val1) { if (layer.shapes[i] == -1) { layer.setSymbol(i, s.val2, getSlotPos(rand, renderlayers, i)); continue symbolLoop; } } } DigSiteRenderLayer layer = new DigSiteRenderLayer(s.val1); layer.setSymbol(i, s.val2, getSlotPos(rand, renderlayers, i)); renderlayers.add(layer); } } //Physis.logger.info(renderlayers); } private int getSlotPos(Random rand, List<DigSiteRenderLayer> data, int slot) { List<Integer> whitelist = new ArrayList<Integer>(); whitelist.add(0); whitelist.add(1); whitelist.add(2); whitelist.add(3); whitelist.add(4); whitelist.add(5); whitelist.add(6); whitelist.add(7); for (int i=0; i<data.size(); i++) { DigSiteRenderLayer l = data.get(i); if (l.shapes[slot] != -1) { whitelist.remove(l.positions[slot]); } } if (whitelist.size() == 0) { return 0; } return whitelist.get(rand.nextInt(whitelist.size())); } public NBTTagCompound writeToNBT() { NBTTagCompound tag = new NBTTagCompound(); tag.setBoolean(BUILTTAG, built); if (this.puzzle != null) { //Physis.logger.info("Saving puzzle: "+this.puzzle); NBTTagCompound ptag = new NBTTagCompound(); ptag.setInteger("answer", this.puzzle.solution); for (int i=0; i<6; i++) { NBTTagCompound otag = new NBTTagCompound(); OddOneOutOption option = this.puzzle.options.get(i); int symbols = option.symbols.size(); otag.setInteger("symbols", symbols); for (int j=0; j<symbols; j++) { NBTTagCompound stag = new NBTTagCompound(); TPair<Integer> symbol = option.symbols.get(j); //Physis.logger.info(symbol); stag.setInteger("colour", symbol.val1); stag.setInteger("shape", symbol.val2); otag.setTag("symbol"+j, stag); } ptag.setTag("option"+i, otag); } tag.setTag(PUZZLETAG, ptag); } return tag; } public void readFromNBT(NBTTagCompound tag) { if (tag.hasKey(BUILTTAG)) { this.built = tag.getBoolean(BUILTTAG); } if (tag.hasKey(PUZZLETAG)) { NBTTagCompound ptag = tag.getCompoundTag(PUZZLETAG); int answer = ptag.getInteger("answer"); List<OddOneOutOption> options = new ArrayList<OddOneOutOption>(); for (int i=0; i<6; i++) { NBTTagCompound otag = ptag.getCompoundTag("option"+i); int symbols = otag.getInteger("symbols"); OddOneOutOption option = new OddOneOutOption(); for (int j=0; j<symbols; j++) { NBTTagCompound stag = otag.getCompoundTag("symbol"+j); int col = stag.getInteger("colour"); int shape = stag.getInteger("shape"); option.addSymbol(new TPair<Integer>(col, shape)); } options.add(option); } this.puzzle = new OddOneOutPuzzle(options, answer); //Physis.logger.info("Loaded puzzle: "+this.puzzle); } } public void setPuzzle(OddOneOutPuzzle puzzle) { //Physis.logger.info("Layer receieved puzzle: "+puzzle); this.puzzle = puzzle; this.built = true; } }