package StevenDimDoors.mod_pocketDim.dungeon.pack; import java.util.ArrayList; import java.util.HashMap; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonChainRule { private final int[] condition; private final ArrayList> products; public DungeonChainRule(DungeonChainRuleDefinition source, HashMap nameToTypeMapping) { ArrayList conditionNames = source.getCondition(); ArrayList> productNames = source.getProducts(); //Obtain the IDs of dungeon types in reverse order. Reverse order makes comparing against chain histories easy. condition = new int[conditionNames.size()]; for (int src = 0, dst = condition.length - 1; src < condition.length; src++, dst--) { condition[dst] = nameToTypeMapping.get(conditionNames.get(src)).ID; } products = new ArrayList>(productNames.size()); for (WeightedContainer product : productNames) { products.add(new WeightedContainer(nameToTypeMapping.get(product.getData()), product.itemWeight )); } } public int length() { return condition.length; } public boolean evaluate(int[] typeHistory) { if (typeHistory.length >= condition.length) { for (int k = 0; k < condition.length; k++) { if (condition[k] != 0 && typeHistory[k] != condition[k]) { return false; } } return true; } else { return false; } } public ArrayList> products() { //Create a deep copy of the internal list of products. That way, if the list is modified externally, //it won't affect the reference copy inside this rule. ArrayList> copy = new ArrayList>(products.size()); for (WeightedContainer container : products) { copy.add(container.clone()); } return copy; } }