diff --git a/FactorioDataWrapper/src/com/demod/factorio/DataTable.java b/FactorioDataWrapper/src/com/demod/factorio/DataTable.java index 49d3665..43557aa 100644 --- a/FactorioDataWrapper/src/com/demod/factorio/DataTable.java +++ b/FactorioDataWrapper/src/com/demod/factorio/DataTable.java @@ -57,6 +57,7 @@ public class DataTable { private final Map itemSubGroups = new LinkedHashMap<>(); private final Map> craftingCategories = new LinkedHashMap<>(); + private final Set characterCraftingCategories = new LinkedHashSet<>(); private final ListMultimap recipesByInput = MultimapBuilder.hashKeys().arrayListValues() .build(); @@ -117,6 +118,12 @@ public DataTable(TypeHierarchy typeHierarchy, LuaTable rawLua, JSONObject exclud }); }); + LuaValue characterCraftingCategoriesLua = entities.get("character").lua().get("crafting_categories"); + if (!characterCraftingCategoriesLua.isnil()) { + Utils.forEach(characterCraftingCategoriesLua.checktable(), + categoryLua -> characterCraftingCategories.add(categoryLua.tojstring())); + } + for (Map protos : Arrays.asList(items, recipes, entities, fluids, technologies, equipments, tiles, achievements, itemGroups, itemSubGroups)) { protos.values().forEach(p -> { @@ -249,6 +256,10 @@ public Map> getCraftingCategories() { return craftingCategories; } + public Set getCharacterCraftingCategories() { + return characterCraftingCategories; + } + public FactorioData getData() { return data; } diff --git a/FactorioDataWrapper/src/com/demod/factorio/prototype/RecipePrototype.java b/FactorioDataWrapper/src/com/demod/factorio/prototype/RecipePrototype.java index 08ed51c..52ce9d6 100644 --- a/FactorioDataWrapper/src/com/demod/factorio/prototype/RecipePrototype.java +++ b/FactorioDataWrapper/src/com/demod/factorio/prototype/RecipePrototype.java @@ -1,10 +1,13 @@ package com.demod.factorio.prototype; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.Map; +import java.util.Set; import org.json.JSONArray; +import com.demod.factorio.DataTable; import com.demod.factorio.Utils; import com.demod.factorio.fakelua.LuaTable; import com.demod.factorio.fakelua.LuaValue; @@ -12,10 +15,11 @@ public class RecipePrototype extends DataPrototype { private final String category; + private final Set categories = new LinkedHashSet<>(); private final Map inputs = new LinkedHashMap<>(); private final Map outputs = new LinkedHashMap<>(); private final double energyRequired; - private final boolean handCraftable; + private boolean handCraftable; private final boolean recycling; public RecipePrototype(LuaTable lua) { @@ -47,12 +51,14 @@ public RecipePrototype(LuaTable lua) { } energyRequired = lua.get("energy_required").optdouble(0.5); - category = lua.get("category").optjstring("crafting"); - // FIXME get these from the character prototype - handCraftable = category.equals("crafting") || category.equals("electronics") || category.equals("pressing") - || category.equals("recycling-or-hand-crafing") || category.equals("organic-or-hand-crafing") - || category.equals("organic-or-assembling"); - recycling = category.equals("recycling"); + LuaValue categoriesLua = lua.get("categories"); + if (categoriesLua.isnil()) { + categories.add(lua.get("category").optjstring("crafting")); + } else { + Utils.forEach(categoriesLua.checktable(), categoryLua -> categories.add(categoryLua.tojstring())); + } + category = categories.iterator().next(); + recycling = categories.contains("recycling"); } public String getCategory() { @@ -79,6 +85,12 @@ public boolean isRecycling() { return recycling; } + @Override + public void setTable(DataTable table) { + super.setTable(table); + handCraftable = categories.stream().anyMatch(table.getCharacterCraftingCategories()::contains); + } + @Override public String toString() { StringBuilder sb = new StringBuilder();