/* https://github.com/peterix/dfhack Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #pragma once #ifndef CL_MOD_MATERIALS #define CL_MOD_MATERIALS /** * \defgroup grp_materials Materials module - used for reading raws mostly * @ingroup grp_modules */ #include "Export.h" #include "Module.h" #include "Types.h" #include "BitArray.h" #include "DataDefs.h" #include "df/material.h" #include #include namespace df { struct item; struct inorganic_raw; struct plant_raw; struct creature_raw; struct historical_figure; union job_material_category; } namespace DFHack { struct DFHACK_EXPORT MaterialInfo { static const int NUM_BUILTIN = 19; static const int GROUP_SIZE = 200; static const int CREATURE_BASE = NUM_BUILTIN; static const int FIGURE_BASE = NUM_BUILTIN + GROUP_SIZE; static const int PLANT_BASE = NUM_BUILTIN + GROUP_SIZE*2; static const int END_BASE = NUM_BUILTIN + GROUP_SIZE*3; int16_t type; int32_t index; df::material *material; enum Mode { Builtin, Inorganic, Creature, Plant }; Mode mode; int16_t subtype; df::inorganic_raw *inorganic; df::creature_raw *creature; df::plant_raw *plant; df::historical_figure *figure; public: MaterialInfo(int16_t type = -1, int32_t index = -1) { decode(type, index); } MaterialInfo(df::item *item) { decode(item); } bool isValid() const { return material != NULL; } bool decode(int16_t type, int32_t index = -1); bool decode(df::item *item); bool find(const std::string &token, const std::string &subtoken = std::string()); bool findBuiltin(const std::string &token); bool findInorganic(const std::string &token); bool findPlant(const std::string &token, const std::string &subtoken); bool findCreature(const std::string &token, const std::string &subtoken); std::string toString(uint16_t temp = 10015, bool named = true); df::craft_material_class getCraftClass(); bool matches(const df::job_material_category &cat); }; inline bool operator== (const MaterialInfo &a, const MaterialInfo &b) { return a.type == b.type && a.index == b.index; } inline bool operator!= (const MaterialInfo &a, const MaterialInfo &b) { return a.type != b.type || a.index != b.index; } typedef int32_t t_materialIndex; typedef int16_t t_materialType, t_itemType, t_itemSubtype; struct t_syndrome { // it's lonely here... }; /** * \ingroup grp_materials */ enum e_matter_state { state_solid, state_liquid, state_gas, state_powder, state_paste, state_pressed, NUM_MATTER_STATES }; /** * \ingroup grp_materials */ enum material_flags { MATERIAL_BONE = 0, MATERIAL_MEAT, MATERIAL_EDIBLE_VERMIN, MATERIAL_EDIBLE_RAW, MATERIAL_EDIBLE_COOKED, MATERIAL_UNK5, MATERIAL_ITEMS_METAL, MATERIAL_ITEMS_BARRED, MATERIAL_ITEMS_SCALED = 8, MATERIAL_ITEMS_LEATHER, MATERIAL_ITEMS_SOFT, MATERIAL_ITEMS_HARD, MATERIAL_IMPLIES_ANIMAL_KILL, MATERIAL_ALCOHOL_PLANT, MATERIAL_ALCOHOL_CREATURE, MATERIAL_CHEESE_PLANT, MATERIAL_CHEESE_CREATURE = 16, MATERIAL_POWDER_MISC_PLANT, MATERIAL_POWDER_MISC_CREATURE, MATERIAL_STOCKPILE_GLOB, MATERIAL_LIQUID_MISC_PLANT, MATERIAL_LIQUID_MISC_CREATURE, MATERIAL_LIQUID_MISC_OTHER, MATERIAL_WOOD, MATERIAL_THREAD_PLANT = 24, MATERIAL_TOOTH, MATERIAL_HORN, MATERIAL_PEARL, MATERIAL_SHELL, MATERIAL_LEATHER, MATERIAL_SILK, MATERIAL_SOAP, MATERIAL_ROTS = 32, MATERIAL_UNK33, MATERIAL_UNK34, MATERIAL_UNK35, MATERIAL_STRUCTURAL_PLANT_MAT, MATERIAL_SEED_MAT, MATERIAL_LEAF_MAT, MATERIAL_UNK39, MATERIAL_ENTERS_BLOOD = 40, MATERIAL_BLOOD_MAP_DESCRIPTOR, MATERIAL_ICHOR_MAP_DESCRIPTOR, MATERIAL_GOO_MAP_DESCRIPTOR, MATERIAL_SLIME_MAP_DESCRIPTOR, MATERIAL_PUS_MAP_DESCRIPTOR, MATERIAL_GENERATES_MIASMA, MATERIAL_IS_METAL, MATERIAL_IS_GEM = 48, MATERIAL_IS_GLASS, MATERIAL_CRYSTAL_GLASSABLE, MATERIAL_ITEMS_WEAPON, MATERIAL_ITEMS_WEAPON_RANGED, MATERIAL_ITEMS_ANVIL, MATERIAL_ITEMS_AMMO, MATERIAL_ITEMS_DIGGER, MATERIAL_ITEMS_ARMOR = 56, MATERIAL_ITEMS_DELICATE, MATERIAL_ITEMS_SIEGE_ENGINE, MATERIAL_ITEMS_QUERN, MATERIAL_IS_STONE, MATERIAL_UNDIGGABLE, MATERIAL_YARN, MATERIAL_STOCKPILE_GLOB_PASTE, MATERIAL_STOCKPILE_GLOB_PRESSED = 64, MATERIAL_DISPLAY_UNGLAZED, MATERIAL_DO_NOT_CLEAN_GLOB, MATERIAL_NO_STONE_STOCKPILE, MATERIAL_STOCKPILE_THREAD_METAL, MATERIAL_UNK69, MATERIAL_UNK70, MATERIAL_UNK71, MATERIAL_UNK72 = 72, MATERIAL_UNK73, MATERIAL_UNK74, MATERIAL_UNK75, MATERIAL_UNK76, MATERIAL_UNK77, MATERIAL_UNK78, MATERIAL_UNK79, }; /** * \ingroup grp_materials */ enum inorganic_flags { INORGANIC_LAVA = 0, INORGANIC_UNK1, INORGANIC_UNK2, INORGANIC_SEDIMENTARY, INORGANIC_SEDIMENTARY_OCEAN_SHALLOW, INORGANIC_IGNEOUS_INTRUSIVE, INORGANIC_IGNEOUS_EXTRUSIVE, INORGANIC_METAMORPHIC, INORGANIC_DEEP_SURFACE = 8, INORGANIC_METAL_ORE, // maybe INORGANIC_AQUIFER, INORGANIC_SOIL_ANY, // any soil INORGANIC_SOIL_OCEAN, INORGANIC_SOIL_SAND, INORGANIC_SEDIMENTARY_OCEAN_DEEP, INORGANIC_THREAD_METAL, // maybe INORGANIC_DEEP = 16, // in general INORGANIC_SOIL, // specific soil INORGANIC_DEEP_SPECIAL, INORGANIC_UNK19, INORGANIC_UNK20, INORGANIC_UNK21, INORGANIC_UNK22, INORGANIC_UNK23, INORGANIC_UNK24 = 24, INORGANIC_WAFERS, INORGANIC_UNK26, INORGANIC_UNK27, INORGANIC_UNK28, INORGANIC_UNK29, INORGANIC_UNK30, INORGANIC_UNK31, }; /** * Environment locations * \ingroup grp_materials */ enum environment_location { ENV_SOIL, ENV_SOIL_OCEAN, ENV_SOIL_SAND, ENV_METAMORPHIC, ENV_SEDIMENTARY, ENV_IGNEOUS_INTRUSIVE, ENV_IGNEOUS_EXTRUSIVE, ENV_ALLUVIAL, }; /** * Inclusion types * \ingroup grp_materials */ enum inclusion_type { INCLUSION_NONE, // maybe INCLUSION_VEIN, INCLUSION_CLUSTER, INCLUSION_CLUSTER_SMALL, INCLUSION_CLUSTER_ONE, }; /** * The reversed generic material struct * Research by Quietust * \ingroup grp_materials */ struct df_material { std::string Material_ID; std::string IS_GEM_singular; std::string IS_GEM_plural; std::string STONE_NAME; int16_t SPEC_HEAT; int16_t HEATDAM_POINT; int16_t COLDDAM_POINT; int16_t IGNITE_POINT; int16_t MELTING_POINT; int16_t BOILING_POINT; int16_t MAT_FIXED_TEMP; //int16_t padding; // added by compiler automatically int32_t SOLID_DENSITY; int32_t LIQUID_DENSITY; int32_t MOLAR_MASS; int32_t state_color[NUM_MATTER_STATES]; // color token indexes std::string state_name[NUM_MATTER_STATES]; std::string state_adj[NUM_MATTER_STATES]; int32_t ABSORPTION; int32_t BENDING_YIELD; int32_t SHEAR_YIELD; int32_t TORSION_YIELD; int32_t IMPACT_YIELD; int32_t TENSILE_YIELD; int32_t COMPRESSIVE_YIELD; int32_t BENDING_FRACTURE; int32_t SHEAR_FRACTURE; int32_t TORSION_FRACTURE; int32_t IMPACT_FRACTURE; int32_t TENSILE_FRACTURE; int32_t COMPRESSIVE_FRACTURE; int32_t BENDING_STRAIN_AT_YIELD; int32_t SHEAR_STRAIN_AT_YIELD; int32_t TORSION_STRAIN_AT_YIELD; int32_t IMPACT_STRAIN_AT_YIELD; int32_t TENSILE_STRAIN_AT_YIELD; int32_t COMPRESSIVE_STRAIN_AT_YIELD; int32_t MAX_EDGE; int32_t MATERIAL_VALUE; BitArray mat_flags; t_itemType EXTRACT_STORAGE; t_itemType BUTCHER_SPECIAL_type; t_itemSubtype BUTCHER_SPECIAL_subtype; //int16_t padding; // added by compiler std::string MEAT_NAME_1st_parm; // (adj) std::string MEAT_NAME_2nd_parm; std::string MEAT_NAME_3rd_parm; std::string BLOCK_NAME_1st_parm; std::string BLOCK_NAME_2nd_parm; std::vector MATERIAL_REACTION_PRODUCT_1st_parm;// (e.g. TAN_MAT) std::vector unknown1; std::vector unknown2; std::vector MATERIAL_REACTION_PRODUCT_2nd_parm;// (e.g. LOCAL_CREATURE_MAT) std::vector MATERIAL_REACTION_PRODUCT_3rd_parm;// (e.g. LEATHER) std::vector MATERIAL_REACTION_PRODUCT_4th_parm;// (if you used CREATURE_MAT or PLANT_MAT) int16_t unknown3; //int16_t padding; // added by compiler int32_t unknown4; std::string HARDENS_WITH_WATER_1st_parm;// (e.g. INORGANIC) std::string HARDENS_WITH_WATER_2nd_parm;// (e.g. GYPSUM) std::string HARDENS_WITH_WATER_3rd_parm;// (if you used CREATURE_MAT or PLANT_MAT) std::vector REACTION_CLASS; int8_t TILE; // Tile when material is a natural wall int16_t BASIC_COLOR_foreground; int16_t BASIC_COLOR_bright; // what exactly ARE those colors? int16_t BUILD_COLOR_foreground; int16_t BUILD_COLOR_background; int16_t BUILD_COLOR_bright; // same... int16_t TILE_COLOR_foreground; int16_t TILE_COLOR_background; int16_t TILE_COLOR_bright; int8_t ITEM_SYMBOL; // Tile when material is a dug out stone int16_t POWDER_DYE; // (color token index) int16_t TEMP_DIET_INFO;// (whatever it means) std::vector SYNDROME; int32_t SOAP_LEVEL; std::string PREFIX; // etc... bool isGem() { return mat_flags.is_set(MATERIAL_IS_GEM); }; bool isStone() { return mat_flags.is_set(MATERIAL_IS_STONE); }; }; /** * The reversed inorganic material struct * Research by Quietust * \ingroup grp_materials */ struct df_inorganic_type { std::string ID; BitArray inorg_flags; std::vector empty1; std::vector METAL_ORE_matID; // Vector of indexes of metals produced when ore is smelted std::vector METAL_ORE_prob; // Vector of percent chance of each type of metal being produced on smelting std::vector empty2; std::vector THREAD_METAL_matID;// Vector of indexes of metals produced when ore undergoes strand extraction std::vector THREAD_METAL_prob; // Vector of percent chance of each type of metal being produced on strand extraction std::vector unknown_in_1; std::vector empty3; std::vector ENVIRONMENT_SPEC_matID; std::vector ENVIRONMENT_SPEC_inclusion_type; std::vector ENVIRONMENT_SPEC_prob; std::vector ENVIRONMENT_location; std::vector ENVIRONMENT_inclusion_type; std::vector ENVIRONMENT_prob; int32_t unknown_in_2; df_material mat; bool isOre() { if(!METAL_ORE_matID.empty()) return true; if(!THREAD_METAL_matID.empty()) return true; return false; } }; /** * A copy of the game's material data. * \ingroup grp_materials */ class DFHACK_EXPORT t_matgloss { public: std::string id; // raw name std::string name; // a sensible human-readable name uint8_t fore; uint8_t back; uint8_t bright; int32_t value; // Material value uint8_t wall_tile; // Tile when a natural wall uint8_t boulder_tile; // Tile when a dug-out stone; bool is_gem; public: t_matgloss(); }; /** * A copy of the game's inorganic material data. * \ingroup grp_materials */ class DFHACK_EXPORT t_matglossInorganic : public t_matgloss { public: // Types of metals the ore will produce when smelted. Each number // is an index into the inorganic matglass vector. std::vector ore_types; // Percent chance that the ore will produce each type of metal // when smelted. std::vector ore_chances; // Types of metals the ore will produce from strand extraction. // Each number is an index into the inorganic matglass vector. std::vector strand_types; // Percent chance that the ore will produce each type of metal // fram strand extraction. std::vector strand_chances; public: //t_matglossInorganic(); bool isOre(); bool isGem(); }; /** * The plant flags * \ingroup grp_materials */ enum plant_flags { // byte 0 PLANT_SPRING, PLANT_SUMMER, PLANT_AUTUMN, PLANT_WINTER, PLANT_UNK1, PLANT_SEED, PLANT_LEAVES, PLANT_DRINK, // byte 1 PLANT_EXTRACT_BARREL, PLANT_EXTRACT_VIAL, PLANT_EXTRACT_STILL_VIAL, PLANT_UNK2, PLANT_THREAD, PLANT_MILL, PLANT_UNK3, PLANT_UNK4, // byte 2 PLANT_UNK5, PLANT_UNK6, PLANT_UNK7, PLANT_UNK8, PLANT_WET, PLANT_DRY, PLANT_BIOME_MOUNTAIN, PLANT_BIOME_GLACIER, // byte 3 PLANT_BIOME_TUNDRA, PLANT_BIOME_SWAMP_TEMPERATE_FRESHWATER, PLANT_BIOME_SWAMP_TEMPERATE_SALTWATER, PLANT_BIOME_MARSH_TEMPERATE_FRESHWATER, PLANT_BIOME_MARSH_TEMPERATE_SALTWATER, PLANT_BIOME_SWAMP_TROPICAL_FRESHWATER, PLANT_BIOME_SWAMP_TROPICAL_SALTWATER, PLANT_BIOME_SWAMP_MANGROVE, // byte 4 PLANT_BIOME_MARSH_TROPICAL_FRESHWATER, PLANT_BIOME_MARSH_TROPICAL_SALTWATER, PLANT_BIOME_FOREST_TAIGA, PLANT_BIOME_FOREST_TEMPERATE_CONIFER, PLANT_BIOME_FOREST_TEMPERATE_BROADLEAF, PLANT_BIOME_FOREST_TROPICAL_CONIFER, PLANT_BIOME_FOREST_TROPICAL_DRY_BROADLEAF, PLANT_BIOME_FOREST_TROPICAL_MOIST_BROADLEAF, // byte 5 PLANT_BIOME_GRASSLAND_TEMPERATE, PLANT_BIOME_SAVANNA_TEMPERATE, PLANT_BIOME_SHRUBLAND_TEMPERATE, PLANT_BIOME_GRASSLAND_TROPICAL, PLANT_BIOME_SAVANNA_TROPICAL, PLANT_BIOME_SHRUBLAND_TROPICAL, PLANT_BIOME_DESERT_BADLAND, PLANT_BIOME_DESERT_ROCK, // byte 6 PLANT_BIOME_DESERT_SAND, PLANT_BIOME_OCEAN_TROPICAL, PLANT_BIOME_OCEAN_TEMPERATE, PLANT_BIOME_OCEAN_ARCTIC, PLANT_BIOME_POOL_TEMPERATE_FRESHWATER, PLANT_BIOME_SUBTERRANEAN_WATER, PLANT_BIOME_SUBTERRANEAN_CHASM, PLANT_BIOME_SUBTERRANEAN_LAVA, // byte 7 PLANT_GOOD, PLANT_EVIL, PLANT_SAVAGE, PLANT_BIOME_POOL_TEMPERATE_BRACKISHWATER, PLANT_BIOME_POOL_TEMPERATE_SALTWATER, PLANT_BIOME_POOL_TROPICAL_FRESHWATER, PLANT_BIOME_POOL_TROPICAL_BRACKISHWATER, PLANT_BIOME_POOL_TROPICAL_SALTWATER, // byte 8 PLANT_BIOME_LAKE_TEMPERATE_FRESHWATER, PLANT_BIOME_LAKE_TEMPERATE_BRACKISHWATER, PLANT_BIOME_LAKE_TEMPERATE_SALTWATER, PLANT_BIOME_LAKE_TROPICAL_FRESHWATER, PLANT_BIOME_LAKE_TROPICAL_BRACKISHWATER, PLANT_BIOME_LAKE_TROPICAL_SALTWATER, PLANT_BIOME_RIVER_TEMPERATE_FRESHWATER, PLANT_BIOME_RIVER_TEMPERATE_BRACKISHWATER, // byte 9 PLANT_BIOME_RIVER_TEMPERATE_SALTWATER, PLANT_BIOME_RIVER_TROPICAL_FRESHWATER, PLANT_BIOME_RIVER_TROPICAL_BRACKISHWATER, PLANT_BIOME_RIVER_TROPICAL_SALTWATER, PLANT_AUTUMNCOLOR, PLANT_SAPLING, PLANT_TREE, PLANT_GRASS, }; /** * The plant RAWs in memory * \ingroup grp_materials */ struct df_plant_type { std::string ID; BitArray flags; std::string name, name_plural, adj; std::string seed_singular, seed_plural; std::string leaves_singular, leaves_plural; uint8_t unk1; uint8_t unk2; char picked_tile, dead_picked_tile; char shrub_tile, dead_shrub_tile; char leaves_tile; char tree_tile, dead_tree_tile; char sapling_tile, dead_sapling_tile; char grass_tiles[16]; char alt_grass_tiles[12]; int32_t growdur; int32_t value; int8_t picked_color[3], dead_picked_color[3]; int8_t shrub_color[3], dead_shrub_color[3]; int8_t seed_color[3]; int8_t leaves_color[3], dead_leaves_color[3]; int8_t tree_color[3], dead_tree_color[3]; int8_t sapling_color[3], dead_sapling_color[3]; int8_t grass_colors_0[20], grass_colors_1[20], grass_colors_2[20]; int32_t alt_period[2]; int8_t shrub_drown_level; int8_t tree_drown_level; int8_t sapling_drown_level; int16_t frequency; int16_t clustersize; std::vector prefstring; std::vector materials; // materials and material indexes - only valid when appropriate flags in the BitArray are set int16_t material_type_basic_mat; int16_t material_type_tree; int16_t material_type_drink; int16_t material_type_seed; int16_t material_type_thread; int16_t material_type_mill; int16_t material_type_extract_vial; int16_t material_type_extract_barrel; int16_t material_type_extract_still_vial; int16_t material_type_leaves; int32_t material_idx_basic_mat; int32_t material_idx_tree; int32_t material_idx_drink; int32_t material_idx_seed; int32_t material_idx_thread; int32_t material_idx_mill; int32_t material_idx_extract_vial; int32_t material_idx_extract_barrel; int32_t material_idx_extract_still_vial; int32_t material_idx_leaves; std::string material_str_basic_mat[3]; std::string material_str_tree[3]; std::string material_str_drink[3]; std::string material_str_seed[3]; std::string material_str_thread[3]; std::string material_str_mill[3]; std::string material_str_extract_vial[3]; std::string material_str_extract_barrel[3]; std::string material_str_extract_still_vial[3]; std::string material_str_leaves[3]; int32_t underground_depth[2]; }; /** * \ingroup grp_materials */ struct t_descriptor_color { std::string id; std::string name; float red; float green; float blue; }; /** * \ingroup grp_materials */ struct t_matglossPlant { std::string id; std::string name; uint8_t fore; uint8_t back; uint8_t bright; std::string drink_name; std::string food_name; std::string extract_name; }; /** * \ingroup grp_materials */ struct t_bodypart { std::string id; std::string category; std::string singular; std::string plural; }; /** * \ingroup grp_materials */ struct t_colormodifier { std::string part; std::vector colorlist; uint32_t startdate; /* in days */ uint32_t enddate; /* in days */ }; /** * \ingroup grp_materials */ struct t_creaturecaste { std::string id; std::string singular; std::string plural; std::string adjective; std::vector ColorModifier; std::vector bodypart; t_attrib strength; t_attrib agility; t_attrib toughness; t_attrib endurance; t_attrib recuperation; t_attrib disease_resistance; t_attrib analytical_ability; t_attrib focus; t_attrib willpower; t_attrib creativity; t_attrib intuition; t_attrib patience; t_attrib memory; t_attrib linguistic_ability; t_attrib spatial_sense; t_attrib musicality; t_attrib kinesthetic_sense; }; #define NUM_CREAT_ATTRIBS 17 /** * \ingroup grp_materials */ struct t_matglossOther { std::string id; }; /** * \ingroup grp_materials */ struct t_creatureextract { std::string id; }; /** * \ingroup grp_materials */ struct t_creaturetype { std::string id; std::vector castes; std::vector extract; uint8_t tile_character; struct { uint16_t fore; uint16_t back; uint16_t bright; } tilecolor; }; /** * this structure describes what are things made of in the DF world * \ingroup grp_materials */ struct t_material { t_itemType itemType; t_itemSubtype subType; t_materialType material; t_materialIndex index; uint32_t flags; }; /** * The Materials module * \ingroup grp_modules * \ingroup grp_materials */ class DFHACK_EXPORT Materials : public Module { public: Materials(); ~Materials(); bool Finish(); enum base_material { INORGANIC, AMBER, CORAL, GLASS_GREEN, GLASS_CLEAR, GLASS_CRYSTAL, WATER, COAL, POTASH, ASH, PEARLASH, LYE, MUD, VOMIT, SALT, FILTH_B, FILTH_Y, UNKNOWN_SUBSTANCE, GRIME }; std::vector* df_inorganic; std::vector* df_organic; std::vector* df_trees; std::vector* df_plants; std::vector race; std::vector raceEx; std::vector color; std::vector other; std::vector alldesc; bool CopyInorganicMaterials (std::vector & inorganic); bool CopyOrganicMaterials (std::vector & organic); bool CopyWoodMaterials (std::vector & tree); bool CopyPlantMaterials (std::vector & plant); bool ReadCreatureTypes (void); bool ReadCreatureTypesEx (void); bool ReadDescriptorColors(void); bool ReadOthers (void); bool ReadAllMaterials(void); std::string getType(const t_material & mat); std::string getDescription(const t_material & mat); private: class Private; Private* d; }; } #endif