package com.volmit.iris.object; import com.volmit.iris.Iris; import com.volmit.iris.scaffold.cache.AtomicCache; import com.volmit.iris.util.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor @DontObfuscate @Desc("Represents a jigsaw structure") @Data @EqualsAndHashCode(callSuper = false) public class IrisJigsawStructure extends IrisRegistrant { @RegistryListJigsawPiece @Required @DontObfuscate @ArrayType(min = 1,type = String.class) @Desc("The starting pieces. Randomly chooses a starting piece, then connects pieces using the pools define in the starting piece.") private KList pieces = new KList<>(); @MaxNumber(32) @MinNumber(1) @DontObfuscate @Desc("The maximum pieces that can step out from the center piece") private int maxDepth = 9; @DontObfuscate @Desc("If set to true, iris will look for any pieces with only one connector in valid pools for edge connectors and attach them to 'terminate' the paths/piece connectors. Essentially it caps off ends. For example in a village, Iris would add houses to the ends of roads where possible. For terminators to be selected, they can only have one connector or they wont be chosen.") private boolean terminate = true; private transient AtomicCache maxDimension = new AtomicCache<>(); private void loadPool(String p, KList pools, KList pieces) { IrisJigsawPool pool = getLoader().getJigsawPoolLoader().load(p); if(pool == null) { Iris.warn("Can't find jigsaw pool: " + p); return; } for(String i : pool.getPieces()) { if(pieces.addIfMissing(i)) { loadPiece(i, pools, pieces); } } } private void loadPiece(String p, KList pools, KList pieces) { IrisJigsawPiece piece = getLoader().getJigsawPieceLoader().load(p); if(piece == null) { Iris.warn("Can't find jigsaw piece: " + p); return; } for(IrisJigsawPieceConnector i : piece.getConnectors()) { for(String j : i.getPools()) { if(pools.addIfMissing(j)) { loadPool(j, pools, pieces); } } } } public int getMaxDimension() { return maxDimension.aquire(() -> { int max = 0; KList pools = new KList<>(); KList pieces = new KList<>(); for(String i : getPieces()) { loadPiece(i, pools, pieces); } for(String i : pieces) { max = Math.max(max, getLoader().getJigsawPieceLoader().load(i).getMax3dDimension()); } return max; }); } }