From 212026861fc9fb80455df21f14ed5a641465bd50 Mon Sep 17 00:00:00 2001 From: Robob27 Date: Tue, 14 Feb 2023 20:33:33 -0500 Subject: [PATCH 001/439] WIP list fix --- library/lua/gui/widgets.lua | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index ffe26936d..9343be548 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1611,6 +1611,15 @@ function List:setChoices(choices, selected) end self:setSelected(selected) + + -- Check if page_top needs to be adjusted + if #self.choices - self.page_size < 0 then + self.page_top = 1 + elseif self.selected <= math.floor(self.page_size / 2) then + self.page_top = 1 + elseif self.selected >= #self.choices - math.floor(self.page_size / 2) then + self.page_top = #self.choices - self.page_size + 1 + end end function List:setSelected(selected) @@ -1651,10 +1660,26 @@ local function update_list_scrollbar(list) end function List:postComputeFrame(body) - self.page_size = math.max(1, math.floor(body.height / self.row_height)) - if #self.choices - self.page_size < 0 then + local row_count = math.floor(body.height / self.row_height) + self.page_size = math.max(1, row_count) + + local num_choices = #self.choices + if num_choices == 0 then self.page_top = 1 + update_list_scrollbar(self) + return end + + local max_page_top = math.max(1, num_choices - row_count + 1) + + if self.selected > num_choices - row_count then + self.page_top = max_page_top + elseif self.selected < self.page_top then + self.page_top = self.selected + else + self.page_top = math.max(1, self.selected - row_count + 1) + end + update_list_scrollbar(self) end From dca19e9dadbc2adcc7c47cc148ae74e95668a06b Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Fri, 3 Mar 2023 11:13:25 -0800 Subject: [PATCH 002/439] Adds more logging for dig-now --- plugins/dig-now.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/dig-now.cpp b/plugins/dig-now.cpp index e94cb41da..037e7ae84 100644 --- a/plugins/dig-now.cpp +++ b/plugins/dig-now.cpp @@ -81,6 +81,7 @@ private: public: void load(MapExtras::MapCache &map) { designations.clear(); + DEBUG(general).print("DesignationJobs: reading jobs list\n"); df::job_list_link* node = df::global::world->jobs.list.next; while (node) { df::job* job = node->item; @@ -134,6 +135,7 @@ public: jobs.emplace(job->pos, job); } } + DEBUG(general).print("DesignationJobs: DONE reading jobs list\n"); } void remove(const df::coord &pos) { if(jobs.count(pos)) { @@ -731,9 +733,11 @@ static void do_dig(color_ostream &out, std::vector &dug_coords, Random::MersenneRNG rng; DesignationJobs jobs; + DEBUG(general).print("do_dig(): starting..\n"); jobs.load(map); rng.init(); + DEBUG(general).print("do_dig(): reading map..\n"); std::unordered_set buffer; // go down levels instead of up so stacked ramps behave as expected for (int16_t z = options.end.z; z >= options.start.z; --z) { @@ -765,6 +769,7 @@ static void do_dig(color_ostream &out, std::vector &dug_coords, } } + DEBUG(general).print("do_dig(): processing designations..\n"); // process designations for(auto &d : buffer) { auto pos = d.pos; @@ -812,6 +817,7 @@ static void do_dig(color_ostream &out, std::vector &dug_coords, } } + DEBUG(general).print("do_dig(): write changes to map..\n"); map.WriteAll(); } From 161f84e7b7b350e5a0f6475f0203dd7cc44fa9c3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 6 Mar 2023 01:27:27 -0800 Subject: [PATCH 003/439] turn down automaterial (superseded by buildingplan) --- docs/about/Removed.rst | 8 + docs/changelog.txt | 1 + docs/plugins/automaterial.rst | 53 -- plugins/CMakeLists.txt | 1 - plugins/automaterial.cpp | 1340 --------------------------------- plugins/lua/automaterial.lua | 23 - 6 files changed, 9 insertions(+), 1417 deletions(-) delete mode 100644 docs/plugins/automaterial.rst delete mode 100644 plugins/automaterial.cpp delete mode 100644 plugins/lua/automaterial.lua diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index 954aa2ce2..eea11b088 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -18,6 +18,14 @@ An automated labor management tool that only addressed hauling labors, leaving t of skilled labors entirely up to the player. Fundamentally incompatible with the work detail system of labor management in v50 of Dwarf Fortress. +.. _automaterial: + +automaterial +============ +Moved frequently used materials to the top of the materials list when building +buildings. Also offered extended options when building constructions. All +functionality has been merged into `buildingplan`. + .. _combine-drinks: combine-drinks diff --git a/docs/changelog.txt b/docs/changelog.txt index 4a3428031..3eb93b1c0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -56,6 +56,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Removed -@ ``gui.THIN_FRAME``: replaced by ``gui.INTERIOR_FRAME`` +- `automaterial`: all functionality has been merged into `buildingplan` # 50.07-alpha2 diff --git a/docs/plugins/automaterial.rst b/docs/plugins/automaterial.rst deleted file mode 100644 index 54653a685..000000000 --- a/docs/plugins/automaterial.rst +++ /dev/null @@ -1,53 +0,0 @@ -automaterial -============ - -.. dfhack-tool:: - :summary: Sorts building materials by recent usage. - :tags: untested fort design productivity buildings map - :no-command: - -This plugin makes building constructions (walls, floors, fortifications, etc) -much easier by saving you from having to trawl through long lists of materials -each time you place one. - -It moves the last used material for a given construction type to the top of the -list, if there are any left. So if you build a wall with chalk blocks, the next -time you place a wall the chalk blocks will be at the top of the list, -regardless of distance (it only does this in "grouped" mode, as individual item -lists could be huge). This means you can place most constructions without having -to search for your preferred material type. - -Usage ------ - -:: - - enable automaterial - -.. image:: ../images/automaterial-mat.png - -Pressing :kbd:`a` while highlighting any material will enable that material for -"auto select" for this construction type. You can enable multiple materials. Now -the next time you place this type of construction, the plugin will automatically -choose materials for you from the kinds you enabled. If there is enough to -satisfy the whole placement, you won't be prompted with the material screen at -all -- the construction will be placed and you will be back in the construction -menu. - -When choosing the construction placement, you will see a couple of options: - -.. image:: ../images/automaterial-pos.png - -Use :kbd:`a` here to temporarily disable the material autoselection, e.g. if you -need to go to the material selection screen so you can toggle some materials on -or off. - -The other option (auto type selection, off by default) can be toggled on with -:kbd:`t`. If you toggle this option on, instead of returning you to the main -construction menu after selecting materials, it returns you back to this screen. -If you use this along with several autoselect enabled materials, you should be -able to place complex constructions more conveniently. - -The ``automaterial`` plugin also enables extra construction placement modes, -such as designating areas larger than 10x10 and allowing you to designate hollow -rectangles instead of the default filled ones. diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index d87b41978..477e83436 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -82,7 +82,6 @@ dfhack_plugin(autodump autodump.cpp) dfhack_plugin(autofarm autofarm.cpp) #dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_static) add_subdirectory(autolabor) -#dfhack_plugin(automaterial automaterial.cpp LINK_LIBRARIES lua) dfhack_plugin(automelt automelt.cpp LINK_LIBRARIES lua) dfhack_plugin(autonestbox autonestbox.cpp LINK_LIBRARIES lua) #dfhack_plugin(autotrade autotrade.cpp) diff --git a/plugins/automaterial.cpp b/plugins/automaterial.cpp deleted file mode 100644 index 9783d28dc..000000000 --- a/plugins/automaterial.cpp +++ /dev/null @@ -1,1340 +0,0 @@ -// Auto Material Select - -#include -#include -#include - -#include "Core.h" -#include "LuaTools.h" -#include -#include -#include -#include - - -// DF data structure definition headers -#include "DataDefs.h" -#include "Debug.h" -#include "MiscUtils.h" -#include "TileTypes.h" -#include "df/build_req_choice_genst.h" -#include "df/build_req_choice_specst.h" -#include "df/construction_type.h" -#include "df/item.h" -#include "df/plotinfost.h" -#include "df/buildreq.h" -#include "df/viewscreen_dwarfmodest.h" -#include "df/items_other_id.h" -#include "df/job.h" -#include "df/world.h" -#include "df/building_constructionst.h" -#include "df/job_item.h" - -#include "modules/Gui.h" -#include "modules/Screen.h" -#include "modules/Items.h" -#include "modules/Constructions.h" -#include "modules/Buildings.h" -#include "modules/Maps.h" -#include "modules/MapCache.h" - -#include "uicommon.h" - -using namespace std; -using std::map; -using std::string; -using std::vector; - -using namespace DFHack; -using namespace df::enums; - -DFHACK_PLUGIN("automaterial"); -REQUIRE_GLOBAL(gps); -REQUIRE_GLOBAL(plotinfo); -REQUIRE_GLOBAL(ui_build_selector); - -namespace DFHack { - DBG_DECLARE(automaterial,log,DebugCategory::LINFO); -} - -struct MaterialDescriptor -{ - df::item_type item_type; - int16_t item_subtype; - int16_t type; - int32_t index; - bool valid; - - bool matches(const MaterialDescriptor &a) const - { - return a.valid && valid && - a.type == type && - a.index == index && - a.item_type == item_type && - a.item_subtype == item_subtype; - } -}; - -DFhackCExport command_result plugin_shutdown ( color_ostream &out ) -{ - return CR_OK; -} - -void AMOutputToggleString(int &x, int &y, const char *text, const char *hotkey, bool state, bool newline = true, int left_margin = 0, int8_t color = COLOR_WHITE) -{ - OutputHotkeyString(x, y, text, hotkey); - OutputString(COLOR_WHITE, x, y, ": "); - if (state) - OutputString(COLOR_GREEN, x, y, "Enabled", newline, left_margin); - else - OutputString(COLOR_GREY, x, y, "Disabled", newline, left_margin); -} - -//START UI Functions - -static enum t_box_select_mode {SELECT_FIRST, SELECT_SECOND, SELECT_MATERIALS, AUTOSELECT_MATERIALS} box_select_mode = SELECT_FIRST; -static coord32_t box_first, box_second; -static bool box_select_enabled = false; -static bool show_box_selection = true; -static bool hollow_selection = false; -static deque box_select_materials; - -#define SELECTION_IGNORE_TICKS 1 -static int ignore_selection = SELECTION_IGNORE_TICKS; - -static map last_used_material; -static map last_moved_material; -static map< int16_t, vector > preferred_materials; -static map< int16_t, df::interface_key > hotkeys; -static bool last_used_moved = false; -static bool auto_choose_materials = true; -static bool revert_to_last_used_type = false; -static bool allow_future_placement = false; - -static inline bool in_material_choice_stage() -{ - return Gui::build_selector_hotkey(Core::getTopViewscreen()) && - ui_build_selector->building_type == df::building_type::Construction && - plotinfo->main.mode == ui_sidebar_mode::Build && - ui_build_selector->stage == 2; -} - -static inline bool in_placement_stage() -{ - return Gui::dwarfmode_hotkey(Core::getTopViewscreen()) && - plotinfo->main.mode == ui_sidebar_mode::Build && - ui_build_selector && - ui_build_selector->building_type == df::building_type::Construction && - ui_build_selector->stage == 1; -} - -static inline bool in_type_choice_stage() -{ - return Gui::dwarfmode_hotkey(Core::getTopViewscreen()) && - plotinfo->main.mode == ui_sidebar_mode::Build && - ui_build_selector && - ui_build_selector->building_type < 0; -} - -static inline vector &get_curr_constr_prefs() -{ - if (preferred_materials.find(ui_build_selector->building_subtype) == preferred_materials.end()) - preferred_materials[ui_build_selector->building_subtype] = vector(); - - return preferred_materials[ui_build_selector->building_subtype]; -} - -static inline MaterialDescriptor &get_last_used_material() -{ - if (last_used_material.find(ui_build_selector->building_subtype) == last_used_material.end()) - last_used_material[ui_build_selector->building_subtype] = MaterialDescriptor(); - - return last_used_material[ui_build_selector->building_subtype]; -} - -static void set_last_used_material(const MaterialDescriptor &matetial) -{ - last_used_material[ui_build_selector->building_subtype] = matetial; -} - -static MaterialDescriptor &get_last_moved_material() -{ - if (last_moved_material.find(ui_build_selector->building_subtype) == last_moved_material.end()) - last_moved_material[ui_build_selector->building_subtype] = MaterialDescriptor(); - - return last_moved_material[ui_build_selector->building_subtype]; -} - -static void set_last_moved_material(const MaterialDescriptor &matetial) -{ - last_moved_material[ui_build_selector->building_subtype] = matetial; -} - -static MaterialDescriptor get_material_in_list(size_t i) -{ - MaterialDescriptor result; - result.valid = false; - - if (VIRTUAL_CAST_VAR(gen, df::build_req_choice_genst, ui_build_selector->choices[i])) - { - result.item_type = gen->item_type; - result.item_subtype = gen->item_subtype; - result.type = gen->mat_type; - result.index = gen->mat_index; - result.valid = true; - } - else if (VIRTUAL_CAST_VAR(spec, df::build_req_choice_specst, ui_build_selector->choices[i])) - { - result.item_type = spec->candidate->getType(); - result.item_subtype = spec->candidate->getSubtype(); - result.type = spec->candidate->getActualMaterial(); - result.index = spec->candidate->getActualMaterialIndex(); - result.valid = true; - } - - return result; -} - -static bool is_material_in_autoselect(size_t &i, MaterialDescriptor &material) -{ - for (i = 0; i < get_curr_constr_prefs().size(); i++) - { - if (get_curr_constr_prefs()[i].matches(material)) - return true; - } - - return false; -} - -static bool is_material_in_list(size_t &i, MaterialDescriptor &material) -{ - const size_t size = ui_build_selector->choices.size(); //Just because material list could be very big - for (i = 0; i < size; i++) - { - if (get_material_in_list(i).matches(material)) - return true; - } - - return false; -} - -static bool move_material_to_top(MaterialDescriptor &material) -{ - size_t i; - if (is_material_in_list(i, material)) - { - auto sel_item = ui_build_selector->choices[i]; - ui_build_selector->choices.erase(ui_build_selector->choices.begin() + i); - ui_build_selector->choices.insert(ui_build_selector->choices.begin(), sel_item); - - ui_build_selector->sel_index = 0; - set_last_moved_material(material); - return true; - } - - set_last_moved_material(MaterialDescriptor()); - return false; -} - -static bool check_autoselect(MaterialDescriptor &material, bool toggle) -{ - size_t idx; - if (is_material_in_autoselect(idx, material)) - { - if (toggle) - vector_erase_at(get_curr_constr_prefs(), idx); - - return true; - } - else - { - if (toggle) - get_curr_constr_prefs().push_back(material); - - return false; - } -} - -static void cancel_box_selection() -{ - if (box_select_mode == SELECT_FIRST) - return; - - box_select_mode = SELECT_FIRST; - box_select_materials.clear(); - if (!show_box_selection) - Gui::setDesignationCoords(-1, -1, -1); -} -//END UI Functions - - -//START Building and Verification -struct building_site -{ - df::coord pos; - bool in_open_air; - - building_site(df::coord pos, bool in_open_air) - { - this->pos = pos; - this->in_open_air = in_open_air; - } - - building_site() {} -}; - -static deque valid_building_sites; -static deque open_air_sites; -static building_site anchor; - -static bool is_orthogonal_to_pending_construction(building_site &site) -{ - for (deque::iterator it = valid_building_sites.begin(); it != valid_building_sites.end(); it++) - { - if ((it->pos.x == site.pos.x && abs(it->pos.y - site.pos.y) == 1) || (it->pos.y == site.pos.y && abs(it->pos.x - site.pos.x) == 1)) - { - site.in_open_air = true; - return true; - } - } - - return false; -} - -static df::building_constructionst *get_construction_on_tile(const df::coord &pos) -{ - auto current = Buildings::findAtTile(pos); - if (current) - return strict_virtual_cast(current); - - return NULL; -} - -static df::tiletype *read_tile_shapes(const df::coord &pos, df::tiletype_shape &shape, df::tiletype_shape_basic &shape_basic) -{ - if (!Maps::isValidTilePos(pos)) - return NULL; - - auto ttype = Maps::getTileType(pos); - - if (!ttype) - return NULL; - - shape = tileShape(*ttype); - shape_basic = tileShapeBasic(shape); - - return ttype; -} - -static bool is_valid_building_site(building_site &site, bool orthogonal_check, bool check_placed_constructions, bool in_future_placement_mode) -{ - df::tiletype_shape shape; - df::tiletype_shape_basic shape_basic; - - auto ttype = read_tile_shapes(site.pos, shape, shape_basic); - if (!ttype) - return false; - - if (shape_basic == tiletype_shape_basic::Open) - { - if (orthogonal_check) - { - // Check if this is a valid tile to have a construction placed orthogonally to it - if (!in_future_placement_mode) - return false; - - df::building_constructionst *cons = get_construction_on_tile(site.pos); - if (cons && cons->type == construction_type::Floor) - { - site.in_open_air = true; - return true; - } - - return false; - } - - // Stairs can be placed in open space, if they can connect to other stairs - df::tiletype_shape shape_s; - df::tiletype_shape_basic shape_basic_s; - - if (ui_build_selector->building_subtype == construction_type::DownStair || - ui_build_selector->building_subtype == construction_type::UpDownStair) - { - df::coord below(site.pos.x, site.pos.y, site.pos.z - 1); - auto ttype_s = read_tile_shapes(below, shape_s, shape_basic_s); - if (ttype_s) - { - if (shape_s == tiletype_shape::STAIR_UP || shape_s == tiletype_shape::STAIR_UPDOWN) - return true; - } - } - - if (ui_build_selector->building_subtype == construction_type::UpStair || - ui_build_selector->building_subtype == construction_type::UpDownStair) - { - df::coord above(site.pos.x, site.pos.y, site.pos.z + 1); - auto ttype_s = read_tile_shapes(above, shape_s, shape_basic_s); - if (ttype_s) - { - if (shape_s == tiletype_shape::STAIR_DOWN || shape_s == tiletype_shape::STAIR_UPDOWN) - return true; - } - } - - // Check if there is a valid tile orthogonally adjacent - bool valid_orthogonal_tile_found = false; - df::coord orthagonal_pos; - orthagonal_pos.z = site.pos.z; - for (orthagonal_pos.x = site.pos.x-1; orthagonal_pos.x <= site.pos.x+1 && !valid_orthogonal_tile_found; orthagonal_pos.x++) - { - for (orthagonal_pos.y = site.pos.y-1; orthagonal_pos.y <= site.pos.y+1; orthagonal_pos.y++) - { - if ((site.pos.x == orthagonal_pos.x) == (site.pos.y == orthagonal_pos.y)) - continue; - - building_site orthogonal_site(orthagonal_pos, false); - if (is_valid_building_site(orthogonal_site, true, check_placed_constructions, in_future_placement_mode)) - { - valid_orthogonal_tile_found = true; - if (orthogonal_site.in_open_air) - site.in_open_air = true; - break; - } - - } - } - - if (!(valid_orthogonal_tile_found || (check_placed_constructions && is_orthogonal_to_pending_construction(site)))) - { - site.in_open_air = true; - return false; - } - } - else if (orthogonal_check) - { - if (shape != tiletype_shape::RAMP && - shape_basic != tiletype_shape_basic::Floor && - shape_basic != tiletype_shape_basic::Stair) - return false; - } - else - { - auto material = tileMaterial(*ttype); - if (shape == tiletype_shape::RAMP) - { - if (material == tiletype_material::CONSTRUCTION) - return false; - } - else - { - if (shape != tiletype_shape::STAIR_DOWN && shape_basic != tiletype_shape_basic::Floor) - return false; - - // Can build on top of a wall, but not on other construction - auto construction = Constructions::findAtTile(site.pos); - if (construction) - { - if (construction->flags.bits.top_of_wall==0) - return false; - } - - if (material == tiletype_material::FIRE || - material == tiletype_material::POOL || - material == tiletype_material::BROOK || - material == tiletype_material::RIVER || - material == tiletype_material::MAGMA || - material == tiletype_material::DRIFTWOOD || - material == tiletype_material::CAMPFIRE - ) - - return false; - } - } - - if (orthogonal_check) - return true; - - auto designation = Maps::getTileDesignation(site.pos); - if (designation->bits.flow_size > 2) - return false; - - auto current = Buildings::findAtTile(site.pos); - if (current) - return false; - - df::coord2d size(1,1); - return Buildings::checkFreeTiles(site.pos, size, NULL, false, false); -} - - -static bool find_anchor_in_spiral(const df::coord &start) -{ - bool found = false; - - for (anchor.pos.z = start.z; anchor.pos.z > start.z - 4; anchor.pos.z--) - { - int x, y, dx, dy; - x = y = dx = 0; - dy = -1; - const int side = 11; - const int maxI = side*side; - for (int i = 0; i < maxI; i++) - { - if (-side/2 < x && x <= side/2 && -side/2 < y && y <= side/2) - { - anchor.pos.x = start.x + x; - anchor.pos.y = start.y + y; - if (is_valid_building_site(anchor, false, false, false)) - { - found = true; - break; - } - } - - if ((x == y) || ((x < 0) && (x == -y)) || ((x > 0) && (x == 1-y))) - { - int tmp = dx; - dx = -dy; - dy = tmp; - } - - x += dx; - y += dy; - } - - if (found) - break; - } - - return found; -} - -static bool find_valid_building_sites(bool in_future_placement_mode, bool use_buildingplan) -{ - valid_building_sites.clear(); - open_air_sites.clear(); - - int xD = (box_second.x > box_first.x) ? 1 : -1; - int yD = (box_second.y > box_first.y) ? 1 : -1; - for (int32_t xB = box_first.x; (xD > 0) ? (xB <= box_second.x) : (xB >= box_second.x); xB += xD) - { - for (int32_t yB = box_first.y; (yD > 0) ? (yB <= box_second.y) : (yB >= box_second.y); yB += yD) - { - if (hollow_selection && !(xB == box_first.x || xB == box_second.x || yB == box_first.y || yB == box_second.y)) - continue; - - building_site site(df::coord(xB, yB, box_second.z), false); - // if we're using buildingplan, it will take care of filtering out bad tiles - if (use_buildingplan || is_valid_building_site(site, false, true, in_future_placement_mode)) - valid_building_sites.push_back(site); - else if (site.in_open_air) - { - if (in_future_placement_mode) - valid_building_sites.push_back(site); - else - open_air_sites.push_back(site); - } - } - } - - if (!use_buildingplan) - { - size_t last_open_air_count = 0; - while (valid_building_sites.size() > 0 && open_air_sites.size() != last_open_air_count) - { - last_open_air_count = open_air_sites.size(); - deque current_open_air_list = open_air_sites; - open_air_sites.clear(); - for (deque::iterator it = current_open_air_list.begin(); it != current_open_air_list.end(); it++) - { - if (is_orthogonal_to_pending_construction(*it)) - valid_building_sites.push_back(*it); - else - open_air_sites.push_back(*it); - } - - } - } - - return valid_building_sites.size() > 0; -} - -static bool is_buildingplan_enabled() -{ - auto L = Lua::Core::State; - color_ostream_proxy out(Core::getInstance().getConsole()); - Lua::StackUnwinder top(L); - - if (!(lua_checkstack(L, 1) && - Lua::PushModulePublic(out, L, "plugins.buildingplan", "isEnabled") && - Lua::SafeCall(out, L, 0, 1))) - { - return false; - } - - return lua_toboolean(L, -1); -} - -static bool is_buildingplan_planmode_enabled( - df::building_type type, int16_t subtype, int32_t custom) -{ - auto L = Lua::Core::State; - color_ostream_proxy out(Core::getInstance().getConsole()); - Lua::StackUnwinder top(L); - - if (!lua_checkstack(L, 4) || - !Lua::PushModulePublic( - out, L, "plugins.buildingplan", "isPlanModeEnabled")) - return false; - - Lua::Push(L, type); - Lua::Push(L, subtype); - Lua::Push(L, custom); - - if (!Lua::SafeCall(out, L, 3, 1)) - return false; - - return lua_toboolean(L, -1); -} - -static bool is_buildingplan_managed() -{ - return is_buildingplan_enabled() && - is_buildingplan_planmode_enabled(ui_build_selector->building_type, - ui_build_selector->building_subtype, - ui_build_selector->custom_type); -} - -static bool build_with_buildingplan_box_select(const df::coord &pos) -{ - auto L = Lua::Core::State; - color_ostream_proxy out(Core::getInstance().getConsole()); - - CoreSuspendClaimer suspend; - Lua::StackUnwinder top(L); - - if (!lua_checkstack(L, 5) || - !Lua::PushModulePublic( - out, L, "plugins.automaterial", - "build_with_buildingplan_box_select")) - { - return false; - } - - Lua::Push(L, ui_build_selector->building_subtype); - Lua::Push(L, pos.x); - Lua::Push(L, pos.y); - Lua::Push(L, pos.z); - - if (!Lua::SafeCall(out, L, 4, 1)) - return false; - - return lua_toboolean(L, -1); -} - -static bool build_with_buildingplan_ui() -{ - auto L = Lua::Core::State; - color_ostream_proxy out(Core::getInstance().getConsole()); - - CoreSuspendClaimer suspend; - Lua::StackUnwinder top(L); - - return lua_checkstack(L, 1) && - Lua::PushModulePublic(out, L, "plugins.automaterial", - "build_with_buildingplan_ui") && - Lua::SafeCall(out, L, 0, 1); -} - -static bool designate_new_construction(df::coord &pos, df::construction_type &type, df::item *item) -{ - auto newinst = Buildings::allocInstance(pos, building_type::Construction, type); - if (!newinst) - return false; - - vector items; - items.push_back(item); - Maps::ensureTileBlock(pos); - - if (!Buildings::constructWithItems(newinst, items)) - { - delete newinst; - return false; - } - - return true; -} -//END Building and Verification - - -//START Viewscreen Hook -struct jobutils_hook : public df::viewscreen_dwarfmodest -{ - //START UI Methods - typedef df::viewscreen_dwarfmodest interpose_base; - - void send_key(const df::interface_key &key) - { - set< df::interface_key > keys; - keys.insert(key); - this->feed(&keys); - } - - bool select_material_at_index(size_t i) - { - ui_build_selector->sel_index = i; - std::set< df::interface_key > keys; - keys.insert(df::interface_key::SELECT_ALL); - this->feed(&keys); - return !in_material_choice_stage(); - } - - bool choose_materials() - { - if (!auto_choose_materials || get_curr_constr_prefs().size() == 0) - return false; - - size_t size = ui_build_selector->choices.size(); - for (size_t i = 0; i < size; i++) - { - MaterialDescriptor material = get_material_in_list(i); - size_t j; - if (is_material_in_autoselect(j, material)) - { - return select_material_at_index(i); - } - } - - return false; - } - - void draw_box_selection() - { - if (!box_select_enabled) - return; - - if (plotinfo->main.mode != df::ui_sidebar_mode::Build || - ui_build_selector->building_type != df::building_type::Construction) - return; - - df::coord vport = Gui::getViewportPos(); - - //Even if selection drawing is disabled, paint a green cursor as we can place box selection anywhere - - if (box_select_mode == SELECT_FIRST || (!show_box_selection && box_select_mode == SELECT_SECOND)) - { - int32_t x, y, z; - if (!Gui::getCursorCoords(x, y, z)) - return; - - x = x - vport.x + 1; - y = y - vport.y + 1; - OutputString(COLOR_GREEN, x, y, "X", false, 0, 0, true /* map */); - } - else if (show_box_selection && box_select_mode == SELECT_SECOND) - { - if (!Gui::getCursorCoords(box_second.x, box_second.y, box_second.z)) - return; - - Gui::DwarfmodeDims dims = Gui::getDwarfmodeViewDims(); - int32_t startx = std::max((int32_t)vport.x, std::min(box_first.x, box_second.x)); - int32_t endx = std::min(vport.x + dims.map_x2 - dims.map_x1, std::max(box_first.x, box_second.x)); - int32_t starty = std::max((int32_t)vport.y, std::min(box_first.y, box_second.y)); - int32_t endy = std::min(vport.y + dims.map_y2 - dims.map_y1, std::max(box_first.y, box_second.y)); - for (int32_t yB = starty; yB <= endy; ++yB) { - for (int32_t xB = startx; xB <= endx; ++xB) { - if (hollow_selection && !(xB == box_first.x || xB == box_second.x || yB == box_first.y || yB == box_second.y)) - continue; - - int8_t color = (xB == box_second.x && yB == box_second.y) ? COLOR_GREEN : COLOR_BROWN; - - int32_t x = xB - vport.x + 1; - int32_t y = yB - vport.y + 1; - OutputString(color, x, y, "X", false, 0, 0, true /* map */); - } - } - } - else if (show_box_selection && box_select_mode == SELECT_MATERIALS) - { - for (deque::iterator it = valid_building_sites.begin(); it != valid_building_sites.end(); it++) - { - int32_t x = it->pos.x - vport.x + 1; - int32_t y = it->pos.y - vport.y + 1; - OutputString(COLOR_GREEN, x, y, "X", false, 0, 0, true /* map */); - } - } - } - - void reset_existing_selection() - { - for (int i = 0; i < 10; i++) - { - send_key(df::interface_key::BUILDING_DIM_Y_DOWN); - send_key(df::interface_key::BUILDING_DIM_X_DOWN); - } - } - - void handle_input(set *input) - { - if (ui_build_selector->building_subtype >= 7) - return; - - if (in_material_choice_stage()) - { - if (input->count(interface_key::LEAVESCREEN)) - { - box_select_mode = SELECT_FIRST; - } - - MaterialDescriptor material = get_material_in_list(ui_build_selector->sel_index); - if (material.valid) - { - if (input->count(interface_key::SELECT) || input->count(interface_key::SELECT_ALL)) - { - if (get_last_moved_material().matches(material)) - last_used_moved = false; //Keep selected material on top - - set_last_used_material(material); - - if (box_select_enabled) - { - auto curr_index = ui_build_selector->sel_index; - vector gen_material; - gen_material.push_back(get_material_in_list(curr_index)); - box_select_materials.clear(); - // Populate material list with selected material - populate_box_materials(gen_material, ((input->count(interface_key::SELECT_ALL) && ui_build_selector->is_grouped) ? -1 : 1)); - - input->clear(); // Let the apply_box_selection routine allocate the construction - input->insert(interface_key::LEAVESCREEN); - } - } - else if (input->count(interface_key::CUSTOM_A)) - { - check_autoselect(material, true); - input->clear(); - } - } - } - else if (in_placement_stage()) - { - bool use_buildingplan = is_buildingplan_managed(); - - if (!use_buildingplan && input->count(interface_key::CUSTOM_A)) - { - auto_choose_materials = !auto_choose_materials; - } - else if (!use_buildingplan && input->count(interface_key::CUSTOM_T)) - { - revert_to_last_used_type = !revert_to_last_used_type; - } - else if (input->count(interface_key::CUSTOM_B)) - { - reset_existing_selection(); - box_select_enabled = !box_select_enabled; - if (!box_select_enabled) - cancel_box_selection(); - - return; - } - else if (!use_buildingplan && input->count(interface_key::CUSTOM_O)) - { - allow_future_placement = !allow_future_placement; - } - else if (input->count(interface_key::LEAVESCREEN)) - { - switch (box_select_mode) - { - case SELECT_FIRST: - case SELECT_SECOND: - cancel_box_selection(); - - default: - break; - } - } - else if (box_select_enabled) - { - if (input->count(interface_key::SELECT)) - { - switch (box_select_mode) - { - case SELECT_FIRST: - if (!Gui::getCursorCoords(box_first.x, box_first.y, box_first.z)) - { - cancel_box_selection(); - return; - } - box_select_mode = SELECT_SECOND; - if (!show_box_selection) - Gui::setDesignationCoords(box_first.x, box_first.y, box_first.z); - input->clear(); - return; - - case SELECT_SECOND: - if (!Gui::getCursorCoords(box_second.x, box_second.y, box_second.z)) - { - cancel_box_selection(); - return; - } - cancel_box_selection(); - input->clear(); - apply_box_selection(true); - return; - - default: - break; - } - } - else if (input->count(interface_key::CUSTOM_X)) - { - show_box_selection = !show_box_selection; - if (box_select_mode == SELECT_SECOND) - { - if (show_box_selection) - { - Gui::setDesignationCoords(-1, -1, -1); - } - else - { - Gui::setDesignationCoords(box_first.x, box_first.y, box_first.z); - } - } - } - else if (input->count(interface_key::CUSTOM_H)) - { - hollow_selection = !hollow_selection; - } - else if (input->count(interface_key::BUILDING_DIM_Y_UP) || - input->count(interface_key::BUILDING_DIM_Y_DOWN) || - input->count(interface_key::BUILDING_DIM_X_UP) || - input->count(interface_key::BUILDING_DIM_X_DOWN)) - { - input->clear(); - return; - } - } - else if (use_buildingplan - && ui_build_selector->errors.size() == 0 - && input->count(interface_key::SELECT)) - { - build_with_buildingplan_ui(); - Gui::refreshSidebar(); - input->clear(); - return; - } - } - } - //END UI Methods - - //START Building Application - bool populate_box_materials(vector &gen_materials, int32_t count = -1) - { - bool result = false; - - if (gen_materials.size() == 0) - return result; - - if (ui_build_selector->is_grouped) - send_key(interface_key::BUILDING_EXPAND_CONTRACT); - - size_t size = ui_build_selector->choices.size(); - vector::iterator gen_material; - for (size_t i = 0; i < size; i++) - { - if (VIRTUAL_CAST_VAR(spec, df::build_req_choice_specst, ui_build_selector->choices[i])) - { - for (gen_material = gen_materials.begin(); gen_material != gen_materials.end(); gen_material++) - { - if (gen_material->item_type == spec->candidate->getType() && - gen_material->item_subtype == spec->candidate->getSubtype() && - gen_material->type == spec->candidate->getActualMaterial() && - gen_material->index == spec->candidate->getActualMaterialIndex()) - { - box_select_materials.push_back(spec->candidate); - if (count > -1) - return true; // Right now we only support 1 or all materials - - result = true; - break; - } - } - } - } - send_key(interface_key::BUILDING_EXPAND_CONTRACT); - - return result; - } - - void move_cursor(df::coord &pos) - { - int32_t x, y, z; - Gui::getCursorCoords(x, y, z); - DEBUG(log).print("moving cursor from %d, %d, %d to %d, %d, %d\n", - x, y, z, pos.x, pos.y, pos.z); - - Gui::setCursorCoords(pos.x, pos.y, pos.z); - Gui::refreshSidebar(); - } - - void move_cursor(coord32_t &pos) - { - df::coord c((int16_t) pos.x, (int16_t) pos.y, (int16_t) pos.z); - move_cursor(c); - } - - void apply_box_selection(bool new_start) - { - static bool saved_revert_setting = false; - static bool auto_select_applied = false; - - bool use_buildingplan = is_buildingplan_managed(); - box_select_mode = SELECT_MATERIALS; - if (new_start) - { - bool ok_to_continue = false; - bool in_future_placement_mode = false; - if (!find_valid_building_sites(false, use_buildingplan)) - { - if (allow_future_placement) - { - in_future_placement_mode = find_valid_building_sites(true, use_buildingplan); - } - } - else - { - ok_to_continue = true; - } - - // if using buildingplan, we don't need an anchor - if (!use_buildingplan) - { - if (in_future_placement_mode) - { - ok_to_continue = - find_anchor_in_spiral(valid_building_sites[0].pos); - } - else if (ok_to_continue) - { - // First valid site is guaranteed to be anchored, either on - // a tile or against a valid orthogonal tile - // Use it as an anchor point to generate materials list - anchor = valid_building_sites.front(); - valid_building_sites.pop_front(); - valid_building_sites.push_back(anchor); - } - } - - if (!ok_to_continue) - { - cancel_box_selection(); - hollow_selection = false; - return; - } - - saved_revert_setting = revert_to_last_used_type; - revert_to_last_used_type = true; - auto_select_applied = false; - box_select_materials.clear(); - - } - - while (valid_building_sites.size() > 0) - { - building_site site = valid_building_sites.front(); - valid_building_sites.pop_front(); - - if (use_buildingplan) - { - // we don't actually care if this fails. buildingplan will return - // false when it filters out bad tiles, and that's ok. - build_with_buildingplan_box_select(site.pos); - continue; - } - - if (box_select_materials.size() > 0) - { - df::construction_type type = (df::construction_type) ui_build_selector->building_subtype; - df::item *item = NULL; - while (box_select_materials.size() > 0) - { - item = box_select_materials.front(); - if (!item->flags.bits.in_job) - break; - box_select_materials.pop_front(); - item = NULL; - } - - if (item != NULL) - { - if (designate_new_construction(site.pos, type, item)) - { - box_select_materials.pop_front(); - box_select_mode = AUTOSELECT_MATERIALS; - send_key(interface_key::LEAVESCREEN); //Must do this to register items in use - send_key(hotkeys[type]); - box_select_mode = SELECT_MATERIALS; - } - continue; - } - } - - // Generate material list using regular construction placement routine - - if (site.in_open_air) - { - // Cannot invoke material selection on an unconnected tile, use anchor instead - move_cursor(anchor.pos); - send_key(df::interface_key::SELECT); - } - - move_cursor(site.pos); - - if (!site.in_open_air) - send_key(df::interface_key::SELECT); - - if (in_material_choice_stage()) - { - valid_building_sites.push_front(site); //Redo current tile with whatever gets selected - if (!auto_select_applied) - { - // See if any auto select materials are available - auto_select_applied = true; - if (auto_choose_materials && populate_box_materials(preferred_materials[ui_build_selector->building_subtype])) - { - continue; - } - } - - last_used_moved = false; - return; // No auto select materials left, ask user - } - } - - // Allocation done, reset - move_cursor(box_second); - - // if we're using buildingplan, we never actually leave the placement - // screen, so there's no need to re-enter the screen - revert_to_last_used_type = saved_revert_setting; - if (!use_buildingplan && !revert_to_last_used_type) - { - send_key(df::interface_key::LEAVESCREEN); - } - - cancel_box_selection(); - hollow_selection = false; - ignore_selection = 0; - } - //END Building Application - - DEFINE_VMETHOD_INTERPOSE(void, feed, (set *input)) - { - if (ignore_selection < SELECTION_IGNORE_TICKS) - { - //FIXME: Sometimes there's an extra ENTER key left over after box selection - ignore_selection = SELECTION_IGNORE_TICKS; - return; - } - - if (box_select_mode != AUTOSELECT_MATERIALS) - handle_input(input); - - int16_t last_used_constr_subtype = (in_material_choice_stage()) ? ui_build_selector->building_subtype : -1; - INTERPOSE_NEXT(feed)(input); - - if (revert_to_last_used_type && - last_used_constr_subtype >= 0 && - in_type_choice_stage() && - hotkeys.find(last_used_constr_subtype) != hotkeys.end()) - { - input->clear(); - input->insert(hotkeys[last_used_constr_subtype]); - INTERPOSE_NEXT(feed)(input); - - if (box_select_mode == SELECT_MATERIALS) - { - apply_box_selection(false); - } - } - } - - DEFINE_VMETHOD_INTERPOSE(void, render, ()) - { - if (ignore_selection < SELECTION_IGNORE_TICKS) - { - ++ignore_selection; - } - - if (in_material_choice_stage()) - { - if (!last_used_moved && ui_build_selector->is_grouped) - { - last_used_moved = true; - if (!box_select_enabled && choose_materials()) - { - return; - } - else - { - move_material_to_top(get_last_used_material()); - } - } - else if (!ui_build_selector->is_grouped) - { - last_used_moved = false; - } - } - else - { - last_used_moved = false; - } - - INTERPOSE_NEXT(render)(); - - draw_box_selection(); - - if (in_type_choice_stage()) - { - cancel_box_selection(); - return; - } - - auto dims = Gui::getDwarfmodeViewDims(); - int left_margin = dims.menu_x1 + 1; - int x = left_margin; - int y = 25; - if (in_material_choice_stage()) - { - MaterialDescriptor material = get_material_in_list(ui_build_selector->sel_index); - if (material.valid) - { - AMOutputToggleString(x, y, "Autoselect", "a", check_autoselect(material, false), true, left_margin); - - if (box_select_mode == SELECT_MATERIALS) - { - ++y; - OutputString(COLOR_BROWN, x, y, "Construction:", true, left_margin); - OutputString(COLOR_WHITE, x, y, int_to_string(valid_building_sites.size()) + " tiles to fill", true, left_margin); - } - } - } - else if (in_placement_stage() && ui_build_selector->building_subtype < 7) - { - bool use_buildingplan = is_buildingplan_managed(); - - OutputString(COLOR_BROWN, x, y, "DFHack Automaterial Options", true, left_margin); - if (use_buildingplan) - { - y += 2; - } - else - { - AMOutputToggleString(x, y, "Auto Mat-select", "a", auto_choose_materials, true, left_margin); - AMOutputToggleString(x, y, "Reselect Type", "t", revert_to_last_used_type, true, left_margin); - } - - ++y; - AMOutputToggleString(x, y, "Box Select", "b", box_select_enabled, true, left_margin); - if (box_select_enabled) - { - AMOutputToggleString(x, y, "Show Box Mask", "x", show_box_selection, true, left_margin); - OutputHotkeyString(x, y, (hollow_selection) ? "Make Solid" : "Make Hollow", "h", true, left_margin); - - if (use_buildingplan) - ++y; - else - AMOutputToggleString(x, y, "Open Placement", "o", allow_future_placement, true, left_margin); - } - else - { - y += 3; - } - y += 2; - if (is_buildingplan_enabled()) - OutputString(COLOR_BROWN, x, y, "DFHack Buildingplan Options", true, left_margin); - - if (box_select_enabled) - { - Screen::Pen pen(' ',COLOR_BLACK); - y = dims.y1 + 2; - Screen::fillRect(pen, x, y, dims.menu_x2, y + 17); - - y += 2; - switch (box_select_mode) - { - case SELECT_FIRST: - OutputString(COLOR_BROWN, x, y, "Choose first corner", true, left_margin); - break; - - case SELECT_SECOND: - { - OutputString(COLOR_GREEN, x, y, "Choose second corner", true, left_margin); - - int32_t curr_x, curr_y, curr_z; - Gui::getCursorCoords(curr_x, curr_y, curr_z); - int dX = abs(box_first.x - curr_x) + 1; - int dY = abs(box_first.y - curr_y) + 1; - stringstream label; - label << "Selection: " << dX << "x" << dY; - OutputString(COLOR_WHITE, x, ++y, label.str(), true, left_margin); - - df::coord vport = Gui::getViewportPos(); - int cx = box_first.x - vport.x + 1; - int cy = box_first.y - vport.y + 1; - - Gui::DwarfmodeDims dims = Gui::getDwarfmodeViewDims(); - if (cx >= 1 && cx <= dims.map_x2 && cy >= 1 && cy <= dims.map_y2) - OutputString(COLOR_BROWN, cx, cy, "X", false, 0, 0, true /* map */); - break; - } - - default: - break; - } - - OutputString(COLOR_BROWN, x, ++y, "Ignore Building Restrictions", true, left_margin); - } - } - } -}; -//END Viewscreen Hook - -color_ostream_proxy console_out(Core::getInstance().getConsole()); - - -IMPLEMENT_VMETHOD_INTERPOSE(jobutils_hook, feed); -IMPLEMENT_VMETHOD_INTERPOSE(jobutils_hook, render); - -DFHACK_PLUGIN_IS_ENABLED(is_enabled); - -DFhackCExport command_result plugin_enable ( color_ostream &out, bool enable) -{ - if (!gps) - return CR_FAILURE; - - if (enable != is_enabled) - { - if (!INTERPOSE_HOOK(jobutils_hook, feed).apply(enable) || - !INTERPOSE_HOOK(jobutils_hook, render).apply(enable)) - return CR_FAILURE; - - is_enabled = enable; - } - - return CR_OK; -} - -DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) -{ - hotkeys[construction_type::Wall] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_WALL; - hotkeys[construction_type::Floor] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_FLOOR; - hotkeys[construction_type::Ramp] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_RAMP; - hotkeys[construction_type::UpStair] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_STAIR_UP; - hotkeys[construction_type::DownStair] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_STAIR_DOWN; - hotkeys[construction_type::UpDownStair] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_STAIR_UPDOWN; - hotkeys[construction_type::Fortification] = df::interface_key::HOTKEY_BUILDING_CONSTRUCTION_FORTIFICATION; - //Ignore tracks, DF already returns to track menu - - return CR_OK; -} diff --git a/plugins/lua/automaterial.lua b/plugins/lua/automaterial.lua deleted file mode 100644 index 1cd7e9faf..000000000 --- a/plugins/lua/automaterial.lua +++ /dev/null @@ -1,23 +0,0 @@ -local _ENV = mkmodule('plugins.automaterial') - -local buildingplan = require('plugins.buildingplan') - --- construct the building and register it with buildingplan for item selection -function build_with_buildingplan_box_select(subtype, x, y, z) - local pos = xyz2pos(x, y, z) - local bld, err = dfhack.buildings.constructBuilding{ - type=df.building_type.Construction, subtype=subtype, pos=pos} - -- it's not a user error if we can't place a building here; just indicate - -- that no building was placed by returning false. - if err then return false end - buildingplan.addPlannedBuilding(bld) - return true -end - -function build_with_buildingplan_ui() - for _,bld in ipairs(buildingplan.construct_buildings_from_ui_state()) do - buildingplan.addPlannedBuilding(bld) - end -end - -return _ENV From da1df122b1228b276366fd2e845646c161ab813a Mon Sep 17 00:00:00 2001 From: Will H Date: Mon, 6 Mar 2023 23:21:28 +1100 Subject: [PATCH 004/439] [quickfort] new alias structure Files created with `savestock` for each existing alias. Some aliases missing (search) currently. --- data/stockpiles/adamantinecloth.dfstock | Bin 0 -> 45 bytes data/stockpiles/adamantinethread.dfstock | Bin 0 -> 45 bytes data/stockpiles/ammo.dfstock | Bin 0 -> 1015 bytes data/stockpiles/animalsprefix.dfstock | 71 + data/stockpiles/armorprefix.dfstock | Bin 0 -> 2040 bytes data/stockpiles/artifactammo.dfstock | Bin 0 -> 33 bytes data/stockpiles/artifactarmor.dfstock | Bin 0 -> 38 bytes data/stockpiles/artifactfinishedgoods.dfstock | Bin 0 -> 33 bytes data/stockpiles/artifactfurniture.dfstock | Bin 0 -> 33 bytes data/stockpiles/artifactweapons.dfstock | Bin 0 -> 38 bytes data/stockpiles/ash.dfstock | Bin 0 -> 28 bytes data/stockpiles/bags.dfstock | Bin 0 -> 34 bytes data/stockpiles/bars.dfstock | Bin 0 -> 803 bytes data/stockpiles/barsprefix.dfstock | Bin 0 -> 3450 bytes data/stockpiles/bauxite.dfstock | Bin 0 -> 42 bytes data/stockpiles/blocks.dfstock | Bin 0 -> 2671 bytes data/stockpiles/bolts.dfstock | Bin 0 -> 45 bytes data/stockpiles/boneammo.dfstock | Bin 0 -> 29 bytes data/stockpiles/bones.dfstock | 0 data/stockpiles/bronzearmor.dfstock | Bin 0 -> 46 bytes data/stockpiles/bronzeweapons.dfstock | Bin 0 -> 46 bytes data/stockpiles/buckets.dfstock | Bin 0 -> 31 bytes data/stockpiles/clay.dfstock | Bin 0 -> 125 bytes data/stockpiles/cloth.dfstock | Bin 0 -> 4919 bytes data/stockpiles/clothprefix.dfstock | 141 + data/stockpiles/coal.dfstock | Bin 0 -> 31 bytes data/stockpiles/coalproducing.dfstock | Bin 0 -> 69 bytes data/stockpiles/coinsprefix.dfstock | Bin 0 -> 7467 bytes data/stockpiles/copperarmor.dfstock | Bin 0 -> 46 bytes data/stockpiles/copperweapons.dfstock | Bin 0 -> 46 bytes data/stockpiles/corpses.dfstock | Bin 0 -> 21 bytes data/stockpiles/corpsesprefix.dfstock | Bin 0 -> 21 bytes data/stockpiles/crafts.dfstock | Bin 0 -> 82 bytes data/stockpiles/cutgems.dfstock | Bin 0 -> 2907 bytes data/stockpiles/cutglass.dfstock | Bin 0 -> 64 bytes data/stockpiles/cutstone.dfstock | Bin 0 -> 1880 bytes data/stockpiles/drinkanimal.dfstock | Bin 0 -> 76 bytes data/stockpiles/drinkplant.dfstock | Bin 0 -> 1780 bytes data/stockpiles/dye.dfstock | Bin 0 -> 127 bytes data/stockpiles/economic.dfstock | Bin 0 -> 266 bytes data/stockpiles/emptyanimaltraps.dfstock | Bin 0 -> 27 bytes data/stockpiles/emptycages.dfstock | Bin 0 -> 27 bytes data/stockpiles/finishedgoodsprefix.dfstock | Bin 0 -> 5995 bytes data/stockpiles/flux.dfstock | Bin 0 -> 118 bytes data/stockpiles/foodprefix.dfstock | 18619 ++++++++++++++++ data/stockpiles/furnitureprefix.dfstock | Bin 0 -> 3259 bytes data/stockpiles/gemsprefix.dfstock | Bin 0 -> 7728 bytes data/stockpiles/goblets.dfstock | Bin 0 -> 31 bytes data/stockpiles/hair.dfstock | 0 data/stockpiles/horns.dfstock | 0 data/stockpiles/iron.dfstock | Bin 0 -> 84 bytes data/stockpiles/ironarmor.dfstock | Bin 0 -> 44 bytes data/stockpiles/ironbars.dfstock | Bin 0 -> 39 bytes data/stockpiles/ironweapons.dfstock | Bin 0 -> 44 bytes data/stockpiles/leatherprefix.dfstock | 1363 ++ data/stockpiles/masterworkammo.dfstock | Bin 0 -> 34 bytes data/stockpiles/masterworkarmor.dfstock | Bin 0 -> 39 bytes .../masterworkfinishedgoods.dfstock | Bin 0 -> 34 bytes data/stockpiles/masterworkfurniture.dfstock | Bin 0 -> 34 bytes data/stockpiles/masterworkweapons.dfstock | Bin 0 -> 39 bytes data/stockpiles/metal.dfstock | Bin 0 -> 389 bytes data/stockpiles/metalammo.dfstock | Bin 0 -> 768 bytes data/stockpiles/metalarmor.dfstock | Bin 0 -> 773 bytes data/stockpiles/metalbars.dfstock | Bin 0 -> 768 bytes data/stockpiles/metalweapons.dfstock | Bin 0 -> 773 bytes data/stockpiles/miscliquid.dfstock | Bin 0 -> 57 bytes data/stockpiles/otherarmor.dfstock | Bin 0 -> 122 bytes data/stockpiles/otherbars.dfstock | Bin 0 -> 715 bytes data/stockpiles/otherstone.dfstock | Bin 0 -> 1123 bytes data/stockpiles/otherweapons.dfstock | Bin 0 -> 122 bytes data/stockpiles/pearlash.dfstock | Bin 0 -> 33 bytes data/stockpiles/pigironbars.dfstock | Bin 0 -> 43 bytes data/stockpiles/plants.dfstock | Bin 0 -> 3177 bytes data/stockpiles/plaster.dfstock | Bin 0 -> 103 bytes data/stockpiles/potash.dfstock | Bin 0 -> 31 bytes data/stockpiles/pots.dfstock | Bin 0 -> 33 bytes data/stockpiles/preparedmeals.dfstock | Bin 0 -> 26 bytes data/stockpiles/rawhides.dfstock | 0 data/stockpiles/refuse.dfstock | 0 data/stockpiles/roughgems.dfstock | Bin 0 -> 2907 bytes data/stockpiles/roughglass.dfstock | Bin 0 -> 64 bytes data/stockpiles/sand.dfstock | Bin 0 -> 29 bytes data/stockpiles/seeds.dfstock | Bin 0 -> 3395 bytes data/stockpiles/sheetprefix.dfstock | Bin 0 -> 21 bytes data/stockpiles/shells.dfstock | 0 data/stockpiles/skulls.dfstock | 0 data/stockpiles/soap.dfstock | Bin 0 -> 29 bytes data/stockpiles/steelarmor.dfstock | Bin 0 -> 45 bytes data/stockpiles/steelbars.dfstock | Bin 0 -> 40 bytes data/stockpiles/steelweapons.dfstock | Bin 0 -> 45 bytes data/stockpiles/stone.dfstock | Bin 0 -> 1832 bytes data/stockpiles/stonetools.dfstock | Bin 0 -> 1886 bytes data/stockpiles/stoneweapons.dfstock | Bin 0 -> 1885 bytes data/stockpiles/tallow.dfstock | 1 + data/stockpiles/tannedhides.dfstock | 0 data/stockpiles/teeth.dfstock | 0 data/stockpiles/thread.dfstock | Bin 0 -> 4919 bytes data/stockpiles/tools.dfstock | Bin 0 -> 29 bytes data/stockpiles/trapcomponents.dfstock | Bin 0 -> 224 bytes data/stockpiles/unpreparedfish.dfstock | Bin 0 -> 1720 bytes data/stockpiles/wax.dfstock | Bin 0 -> 98 bytes data/stockpiles/weaponsprefix.dfstock | Bin 0 -> 3838 bytes data/stockpiles/woodammo.dfstock | Bin 0 -> 29 bytes data/stockpiles/woodentools.dfstock | Bin 0 -> 35 bytes data/stockpiles/woodprefix.dfstock | Bin 0 -> 674 bytes 105 files changed, 20195 insertions(+) create mode 100644 data/stockpiles/adamantinecloth.dfstock create mode 100644 data/stockpiles/adamantinethread.dfstock create mode 100644 data/stockpiles/ammo.dfstock create mode 100644 data/stockpiles/animalsprefix.dfstock create mode 100644 data/stockpiles/armorprefix.dfstock create mode 100644 data/stockpiles/artifactammo.dfstock create mode 100644 data/stockpiles/artifactarmor.dfstock create mode 100644 data/stockpiles/artifactfinishedgoods.dfstock create mode 100644 data/stockpiles/artifactfurniture.dfstock create mode 100644 data/stockpiles/artifactweapons.dfstock create mode 100644 data/stockpiles/ash.dfstock create mode 100644 data/stockpiles/bags.dfstock create mode 100644 data/stockpiles/bars.dfstock create mode 100644 data/stockpiles/barsprefix.dfstock create mode 100644 data/stockpiles/bauxite.dfstock create mode 100644 data/stockpiles/blocks.dfstock create mode 100644 data/stockpiles/bolts.dfstock create mode 100644 data/stockpiles/boneammo.dfstock create mode 100644 data/stockpiles/bones.dfstock create mode 100644 data/stockpiles/bronzearmor.dfstock create mode 100644 data/stockpiles/bronzeweapons.dfstock create mode 100644 data/stockpiles/buckets.dfstock create mode 100644 data/stockpiles/clay.dfstock create mode 100644 data/stockpiles/cloth.dfstock create mode 100644 data/stockpiles/clothprefix.dfstock create mode 100644 data/stockpiles/coal.dfstock create mode 100644 data/stockpiles/coalproducing.dfstock create mode 100644 data/stockpiles/coinsprefix.dfstock create mode 100644 data/stockpiles/copperarmor.dfstock create mode 100644 data/stockpiles/copperweapons.dfstock create mode 100644 data/stockpiles/corpses.dfstock create mode 100644 data/stockpiles/corpsesprefix.dfstock create mode 100644 data/stockpiles/crafts.dfstock create mode 100644 data/stockpiles/cutgems.dfstock create mode 100644 data/stockpiles/cutglass.dfstock create mode 100644 data/stockpiles/cutstone.dfstock create mode 100644 data/stockpiles/drinkanimal.dfstock create mode 100644 data/stockpiles/drinkplant.dfstock create mode 100644 data/stockpiles/dye.dfstock create mode 100644 data/stockpiles/economic.dfstock create mode 100644 data/stockpiles/emptyanimaltraps.dfstock create mode 100644 data/stockpiles/emptycages.dfstock create mode 100644 data/stockpiles/finishedgoodsprefix.dfstock create mode 100644 data/stockpiles/flux.dfstock create mode 100644 data/stockpiles/foodprefix.dfstock create mode 100644 data/stockpiles/furnitureprefix.dfstock create mode 100644 data/stockpiles/gemsprefix.dfstock create mode 100644 data/stockpiles/goblets.dfstock create mode 100644 data/stockpiles/hair.dfstock create mode 100644 data/stockpiles/horns.dfstock create mode 100644 data/stockpiles/iron.dfstock create mode 100644 data/stockpiles/ironarmor.dfstock create mode 100644 data/stockpiles/ironbars.dfstock create mode 100644 data/stockpiles/ironweapons.dfstock create mode 100644 data/stockpiles/leatherprefix.dfstock create mode 100644 data/stockpiles/masterworkammo.dfstock create mode 100644 data/stockpiles/masterworkarmor.dfstock create mode 100644 data/stockpiles/masterworkfinishedgoods.dfstock create mode 100644 data/stockpiles/masterworkfurniture.dfstock create mode 100644 data/stockpiles/masterworkweapons.dfstock create mode 100644 data/stockpiles/metal.dfstock create mode 100644 data/stockpiles/metalammo.dfstock create mode 100644 data/stockpiles/metalarmor.dfstock create mode 100644 data/stockpiles/metalbars.dfstock create mode 100644 data/stockpiles/metalweapons.dfstock create mode 100644 data/stockpiles/miscliquid.dfstock create mode 100644 data/stockpiles/otherarmor.dfstock create mode 100644 data/stockpiles/otherbars.dfstock create mode 100644 data/stockpiles/otherstone.dfstock create mode 100644 data/stockpiles/otherweapons.dfstock create mode 100644 data/stockpiles/pearlash.dfstock create mode 100644 data/stockpiles/pigironbars.dfstock create mode 100644 data/stockpiles/plants.dfstock create mode 100644 data/stockpiles/plaster.dfstock create mode 100644 data/stockpiles/potash.dfstock create mode 100644 data/stockpiles/pots.dfstock create mode 100644 data/stockpiles/preparedmeals.dfstock create mode 100644 data/stockpiles/rawhides.dfstock create mode 100644 data/stockpiles/refuse.dfstock create mode 100644 data/stockpiles/roughgems.dfstock create mode 100644 data/stockpiles/roughglass.dfstock create mode 100644 data/stockpiles/sand.dfstock create mode 100644 data/stockpiles/seeds.dfstock create mode 100644 data/stockpiles/sheetprefix.dfstock create mode 100644 data/stockpiles/shells.dfstock create mode 100644 data/stockpiles/skulls.dfstock create mode 100644 data/stockpiles/soap.dfstock create mode 100644 data/stockpiles/steelarmor.dfstock create mode 100644 data/stockpiles/steelbars.dfstock create mode 100644 data/stockpiles/steelweapons.dfstock create mode 100644 data/stockpiles/stone.dfstock create mode 100644 data/stockpiles/stonetools.dfstock create mode 100644 data/stockpiles/stoneweapons.dfstock create mode 100644 data/stockpiles/tallow.dfstock create mode 100644 data/stockpiles/tannedhides.dfstock create mode 100644 data/stockpiles/teeth.dfstock create mode 100644 data/stockpiles/thread.dfstock create mode 100644 data/stockpiles/tools.dfstock create mode 100644 data/stockpiles/trapcomponents.dfstock create mode 100644 data/stockpiles/unpreparedfish.dfstock create mode 100644 data/stockpiles/wax.dfstock create mode 100644 data/stockpiles/weaponsprefix.dfstock create mode 100644 data/stockpiles/woodammo.dfstock create mode 100644 data/stockpiles/woodentools.dfstock create mode 100644 data/stockpiles/woodprefix.dfstock diff --git a/data/stockpiles/adamantinecloth.dfstock b/data/stockpiles/adamantinecloth.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..e63bd31d021f0d0dce2373a5c6e31b96906b9962 GIT binary patch literal 45 zcmXRCa}x3N^AB=&^z(GKa&&R@b@U7I^mCoS$T)+MaRDR43Py!(qrTnWACxx=IKKB|H5O6br#)*%^Gm1b7@^ zp=5V2<~-=`5gt+JGmE$wY|9OceESa3 zU2drJ#dwLpQrbW&svTWZF=gXq{W_ZgRxFx@b{z%kE1}t;xvPtuzS&M`tf)vvOlLo- zVI|lIsMD(*0KT?E0mXsc7{e@FKgLqNjUuT}jW7T`>F=hA4lIC0<4y6gIU<1ltK@xX z-wYRA(q#QZM+Oom!7vT++{016%!|$d{W2}wPht9_%F4y6aND@7@5gU(KAMGYy5@KZ-kyu P>lqDRQ0otB{Y9<+l)4>` literal 0 HcmV?d00001 diff --git a/data/stockpiles/animalsprefix.dfstock b/data/stockpiles/animalsprefix.dfstock new file mode 100644 index 000000000..e09193a2f --- /dev/null +++ b/data/stockpiles/animalsprefix.dfstock @@ -0,0 +1,71 @@ + +™÷TOADTOAD_MAN +GIANT_TOADWORMWORM_MAN BIRD_BLUEJAY BLUEJAY_MAN GIANT_BLUEJAY BIRD_CARDINAL CARDINAL_MANGIANT_CARDINAL BIRD_GRACKLE GRACKLE_MAN GIANT_GRACKLE BIRD_ORIOLE +ORIOLE_MAN GIANT_ORIOLEBIRD_RW_BLACKBIRDRW_BLACKBIRD_MANGIANT_RW_BLACKBIRD BIRD_PENGUINBIRD_PENGUIN_LITTLEBIRD_PENGUIN_EMPEROR PENGUIN MANBIRD_PENGUIN_GIANTBIRD_FALCON_PEREGRINEPEREGRINE FALCON MANGIANT PEREGRINE FALCON BIRD_KIWIKIWI MANBIRD_KIWI_GIANT BIRD_OSTRICH OSTRICH MANBIRD_OSTRICH_GIANT BIRD_CROWCROW_MAN +GIANT_CROW +BIRD_RAVEN RAVEN_MAN GIANT_RAVENBIRD_CASSOWARY CASSOWARY_MANGIANT_CASSOWARYBIRD_KEAKEA_MAN GIANT_KEABIRD_OWL_SNOWY SNOWY_OWL_MANGIANT_SNOWY_OWLSPARROW SPARROW_MAN GIANT_SPARROWBIRD_STORK_WHITEWHITE_STORK_MANGIANT_WHITE_STORK BIRD_LOONLOON_MAN +GIANT_LOON BIRD_OWL_BARN BARN_OWL_MANGIANT_BARN_OWL BIRD_PARAKEET PARAKEET_MANGIANT_PARAKEET BIRD_KAKAPO +KAKAPO_MAN GIANT_KAKAPOBIRD_PARROT_GREYGREY_PARROT_MANGIANT_GREY_PARROT BIRD_PUFFIN +PUFFIN_MAN GIANT_PUFFIN BIRD_SWANSWAN_MAN +GIANT_SWAN BIRD_LORIKEET LORIKEET_MANGIANT_LORIKEET BIRD_WRENWREN_MAN +GIANT_WREN BIRD_OSPREY +OSPREY_MAN GIANT_OSPREYBIRD_EMUEMU_MAN GIANT_EMUBIRD_COCKATIEL COCKATIEL_MANGIANT_COCKATIELBIRD_LOVEBIRD_PEACH-FACEDPEACH-FACED_LOVEBIRD_MANGIANT_PEACH-FACED_LOVEBIRD BIRD_MAGPIE +MAGPIE_MAN GIANT_MAGPIE BIRD_KESTREL KESTREL_MAN GIANT_KESTRELBIRD_ALBATROSS ALBATROSS_MANGIANT_ALBATROSSBIRD_OWL_GREAT_HORNEDGREAT_HORNED_OWL_MANGIANT_GREAT_HORNED_OWL +BIRD_EAGLE EAGLE_MAN GIANT_EAGLE BIRD_HORNBILL HORNBILL_MANGIANT_HORNBILLBIRD_LOVEBIRD_MASKEDMASKED_LOVEBIRD_MANGIANT_MASKED_LOVEBIRD BIRD_BUSHTIT BUSHTIT_MAN GIANT_BUSHTIT DAMSELFLY DAMSELFLY_MANGIANT_DAMSELFLYMOTHMOTH_MAN +GIANT_MOTH GRASSHOPPERGRASSHOPPER_MANGIANT_GRASSHOPPER BARK_SCORPIONBARK_SCORPION_MANGIANT_BARK_SCORPIONMANTIS +MANTIS_MAN GIANT_MANTISTICKTICK_MAN +GIANT_TICKLOUSE LOUSE_MAN GIANT_LOUSETHRIPS +THRIPS_MAN GIANT_THRIPSSLUGSLUG_MAN +GIANT_SLUGMOSQUITO MOSQUITO_MANGIANT_MOSQUITOSPIDER_JUMPINGJUMPING_SPIDER_MANGIANT_JUMPING_SPIDERTERMITE +MOON_SNAILMOON_SNAIL_MANGIANT_MOON_SNAILSPIDER_BROWN_RECLUSEBROWN_RECLUSE_SPIDER_MANGIANT_BROWN_RECLUSE_SPIDERSNAIL SNAIL_MAN GIANT_SNAIL GECKO_LEOPARDLEOPARD_GECKO_MANGIANT_LEOPARD_GECKODESERT TORTOISEDESERT_TORTOISE_MANGIANT_DESERT_TORTOISE GILA_MONSTERGILA_MONSTER_MANGIANT_GILA_MONSTERDOGCATMULEDONKEYHORSECOWSHEEPPIGGOAT BIRD_CHICKENCAVY BIRD_DUCK WATER_BUFFALOREINDEER +BIRD_GOOSEYAKLLAMAALPACABIRD_GUINEAFOWLBIRD_PEAFOWL_BLUE BIRD_TURKEYRABBITEQUIPMENT_WAGONCHIMERACENTAURGRIFFONFLYFLY_MAN GIANT_FLY ROACH_LARGE ROACH_MAN GIANT_ROACHBEETLE +BEETLE_MAN GIANT_BEETLEANTBUTTERFLY_MONARCHBUTTERFLY_MONARCH_MANGIANT_BUTTERFLY_MONARCHFIREFLY FIREFLY_MAN GIANT_FIREFLY DRAGONFLY DRAGONFLY_MANGIANT_DRAGONFLY HONEY_BEE BUMBLEBEE GOAT_MOUNTAINGOAT_MOUNTAIN_MANGIANT_GOAT_MOUNTAIN MARMOT_HOARYMARMOT_HOARY_MANGIANT_MARMOT_HOARYGNOME_MOUNTAIN +GNOME_DARKWALRUS +WALRUS_MAN GIANT_WALRUSFISH_LAMPREY_SEASHARK_GREAT_WHITE SHARK_FRILLSHARK_SPINY_DOGFISHSHARK_WOBBEGONG_SPOTTED SHARK_WHALE SHARK_BASKING SHARK_NURSESHARK_MAKO_SHORTFINSHARK_MAKO_LONGFIN SHARK_TIGER +SHARK_BULLSHARK_REEF_BLACKTIPSHARK_REEF_WHITETIP +SHARK_BLUESHARK_HAMMERHEAD SHARK_ANGELFISH_SKATE_COMMONFISH_RAY_MANTA FISH_STINGRAYFISH_COELACANTH FISH_STURGEONFISH_CONGER_EEL FISH_MILKFISHFISH_COD FISH_OPAHFISH_GROUPER_GIANT FISH_BLUEFISHFISH_SUNFISH_OCEANFISH_SWORDFISH FISH_MARLIN FISH_HALIBUTFISH_BARRACUDA_GREATFISH_TUNA_BLUEFINNARWHAL NARWHAL MANNARWHAL, GIANTHIPPO HIPPO_MAN GIANT_HIPPOFISH_GAR_LONGNOSE FISH_CARPFISH_TIGERFISH FISH_PIKEPLATYPUS PLATYPUS MANPLATYPUS, GIANT BEAR_GRIZZLYBEAR_GRIZZLY_MANGIANT_BEAR_GRIZZLY +BEAR_BLACKBEAR_BLACK_MANGIANT_BEAR_BLACKDEERDEER_MAN +GIANT_DEERFOXFOX_MAN GIANT_FOXRACCOON RACCOON_MAN GIANT_RACCOONMACAQUE_RHESUSMACAQUE_RHESUS_MANGIANT_MACAQUE_RHESUSCOUGAR +COUGAR_MAN GIANT_COUGARWOLFWOLF_MAN +GIANT_WOLF GROUNDHOG GROUNDHOG_MANGIANT_GROUNDHOG ALLIGATOR ALLIGATOR_MANGIANT_ALLIGATOR BIRD_BUZZARD BUZZARD_MAN GIANT_BUZZARDPANDAPANDA, GIGANTIC PANDA MANCAPYBARACAPYBARA, GIANT CAPYBARA MANBADGER +BADGER MAN BADGER, GIANTMOOSE MOOSE MAN MOOSE, GIANT RED PANDA RED PANDA MANRED PANDA, GIANTELEPHANT ELEPHANT_MANGIANT_ELEPHANTWARTHOG WARTHOG_MAN GIANT_WARTHOGLIONLION_MAN +GIANT_LIONLEOPARD LEOPARD_MAN GIANT_LEOPARDJAGUAR +JAGUAR_MAN GIANT_JAGUARTIGER TIGER_MAN GIANT_TIGERCHEETAH CHEETAH_MAN GIANT_CHEETAHGAZELLE GAZELLE_MAN GIANT_GAZELLEMANDRILL MANDRILL_MANGIANT_MANDRILL +CHIMPANZEEBONOBOGORILLA ORANGUTANGIBBON_SIAMANGGIBBON_WHITE_HANDEDGIBBON_BLACK_HANDED GIBBON_GRAYGIBBON_SILVERYGIBBON_PILEATED GIBBON_BILOUGIBBON_WHITE_BROWEDGIBBON_BLACK_CRESTED CAMEL_1_HUMPCAMEL_1_HUMP_MANGIANT_CAMEL_1_HUMP CAMEL_2_HUMPCAMEL_2_HUMP_MANGIANT_CAMEL_2_HUMPCROCODILE_SALTWATERCROCODILE_SALTWATER_MANGIANT_CROCODILE_SALTWATER BIRD_VULTURE VULTURE_MAN GIANT_VULTURE +RHINOCEROSRHINOCEROS_MANGIANT_RHINOCEROSGIRAFFE GIRAFFE_MAN GIANT_GIRAFFE HONEY BADGERHONEY BADGER MANHONEY BADGER, GIANTGIANT TORTOISEGIANT TORTOISE MANGIGANTIC TORTOISE ARMADILLO ARMADILLO MANARMADILLO, GIANTMUSKOX +MUSKOX_MAN GIANT_MUSKOXELKELK_MAN GIANT_ELK +BEAR_POLARBEAR_POLAR_MANGIANT_BEAR_POLAR WOLVERINE WOLVERINE_MANGIANT_WOLVERINE +CHINCHILLACHINCHILLA_MANGIANT_CHINCHILLA FLOATING_GUTSDRUNIAN CREEPING_EYEVORACIOUS_CAVE_CRAWLERBLIND_CAVE_OGRE +CAP_HOPPER +MAGMA_CRABCRUNDLE HUNGRY_HEAD +FLESH_BALLELK_BIRD HELMET_SNAKEGREEN_DEVOURERRUTHERERCREEPY_CRAWLERDRALTHAGIANT_EARTHWORM BLOOD_MANBUGBATMANERA +MOLEMARIANJABBERER POND_GRABBERBLIND_CAVE_BEAR CAVE_DRAGONREACHERELEMENTMAN_GABBROGORLAK CAVE_FLOATERPLUMP_HELMET_MAN CAVE_BLOBELEMENTMAN_AMETHYSTOCTOPUS OCTOPUS_MAN GIANT_OCTOPUSCRABCRAB_MAN +GIANT_CRAB LEOPARD_SEALLEOPARD_SEAL_MANGIANT_LEOPARD_SEAL +CUTTLEFISHCUTTLEFISH_MANGIANT_CUTTLEFISHORCAORCA_MAN +GIANT_ORCASPONGE +SPONGE_MAN GIANT_SPONGEHORSESHOE_CRABHORSESHOE_CRAB_MANGIANT_HORSESHOE_CRAB SPERM_WHALESPERM_WHALE_MANGIANT_SPERM_WHALE ELEPHANT_SEALELEPHANT_SEAL_MANGIANT_ELEPHANT_SEAL HARP_SEAL HARP_SEAL_MANGIANT_HARP_SEALNAUTILUS NAUTILUS_MANGIANT_NAUTILUS FOXSQUIRREL MOGHOPPER RAT_DEMONWAMBLER_FLUFFYLIZARD_RHINO_TWO_LEGGED WORM_KNUCKLESPIDER_PHANTOM FLY_ACORN +GNAT_BLOODLIZARD +LIZARD_MAN GIANT_LIZARDSKINK SKINK_MAN GIANT_SKINK CHAMELEON CHAMELEON_MANGIANT_CHAMELEONANOLE ANOLE_MAN GIANT_ANOLEIGUANA +IGUANA_MAN GIANT_IGUANA RIVER OTTER SEA OTTER OTTER_MAN GIANT_OTTERSNAPPING TURTLEALLIGATOR SNAPPING TURTLESNAPPING_TURTLE_MANGIANT_SNAPPING_TURTLEBEAVER +BEAVER_MAN GIANT_BEAVERLEECH LEECH_MAN GIANT_LEECHAXOLOTL AXOLOTL_MAN GIANT_AXOLOTLMINKMINK_MAN +GIANT_MINK POND_TURTLEPOND_TURTLE_MANGIANT_POND_TURTLERATRAT_MAN SQUIRREL_GRAYSQUIRREL_GRAY_MANGIANT_SQUIRREL_GRAY SQUIRREL_REDSQUIRREL_RED_MANGIANT_SQUIRREL_REDCHIPMUNK CHIPMUNK_MANGIANT_CHIPMUNKHAMSTER HAMSTER_MAN GIANT_HAMSTERHEDGEHOG HEDGEHOG_MANGIANT_HEDGEHOGSQUIRREL_FLYINGFLYING_SQUIRREL_MANGIANT_FLYING_SQUIRRELMUSSELOYSTER FISH_SALMONFISH_CLOWNFISH FISH_HAGFISHFISH_LAMPREY_BROOK FISH_RAY_BATFISH_RAY_THORNBACKFISH_RATFISH_SPOTTED FISH_HERRING FISH_SHAD FISH_ANCHOVYFISH_TROUT_STEELHEAD FISH_HAKE FISH_SEAHORSE FISH_GLASSEYEFISH_PUFFER_WHITE_SPOTTED FISH_SOLE FISH_FLOUNDER FISH_MACKERELJELLYFISH_SEA_NETTLESQUID SQUID MANGIGANTIC SQUID FISH_LUNGFISHFISH_LOACH_CLOWNFISH_BULLHEAD_BROWNFISH_BULLHEAD_YELLOWFISH_BULLHEAD_BLACKFISH_KNIFEFISH_BANDED FISH_CHARFISH_TROUT_RAINBOWFISH_MOLLY_SAILFIN +FISH_GUPPY +FISH_PERCHDWARFHUMANELFGOBLINKOBOLDGREMLINTROLLOGREUNICORNDRAGONSATYRCOLOSSUS_BRONZEGIANTCYCLOPSETTINMINOTAURYETI SASQUATCH BLIZZARD_MANWOLF_ICEFAIRYPIXIEBEAK_DOG GRIMELING BLENDEC_FOUL STRANGLER NIGHTWINGHARPYHYDRA MERPERSON SEA_SERPENT SEA_MONSTERBIRD_ROCCROCODILE_CAVETOAD_GIANT_CAVE OLM_GIANT BAT_GIANT RAT_GIANT RAT_LARGEMOLE_DOG_NAKED +TROGLODYTE +MOLE_GIANTIMP_FIRESPIDER_CAVE_GIANT SPIDER_CAVE FISH_CAVE CAVE_FISH_MAN LOBSTER_CAVE +SNAKE_FIREOLMOLM_MANBATBAT_MANMAGGOT_PURRINGELEMENTMAN_FIREELEMENTMAN_MAGMAELEMENTMAN_IRONELEMENTMAN_MUDBIRD_SWALLOW_CAVECAVE_SWALLOW_MANBIRD_SWALLOW_CAVE_GIANT AMPHIBIAN_MAN REPTILE_MAN SERPENT_MANANT_MAN +RODENT MAN WILD_BOAR WILD_BOAR_MANGIANT_WILD_BOARCOYOTE +COYOTE_MAN GIANT_COYOTEKANGAROO KANGAROO_MANGIANT_KANGAROOKOALA KOALA_MAN GIANT_KOALAADDER ADDER_MAN GIANT_ADDERECHIDNA ECHIDNA_MAN GIANT_ECHIDNA PORCUPINE PORCUPINE_MANGIANT_PORCUPINE KINGSNAKE KINGSNAKE_MANGIANT_KINGSNAKE GRAY_LANGURGRAY_LANGUR_MANGIANT_GRAY_LANGURBOBCAT +BOBCAT_MAN GIANT_BOBCATSKUNK SKUNK_MAN GIANT_SKUNKGREEN_TREE_FROGGREEN_TREE_FROG_MANGIANT_GREEN_TREE_FROGHAREHARE_MAN +GIANT_HARE RATTLESNAKERATTLESNAKE_MANGIANT_RATTLESNAKEWEASEL +WEASEL_MAN GIANT_WEASELCOPPERHEAD_SNAKECOPPERHEAD_SNAKE_MANGIANT_COPPERHEAD_SNAKEIBEXIBEX_MAN +GIANT_IBEXWOMBAT +WOMBAT_MAN GIANT_WOMBATDINGO DINGO_MAN GIANT_DINGOCOATI COATI_MAN GIANT_COATIOPOSSUM OPOSSUM_MAN GIANT_OPOSSUMMONGOOSE MONGOOSE_MANGIANT_MONGOOSEHYENA HYENA_MAN GIANT_HYENAANACONDA ANACONDA_MANGIANT_ANACONDAMONITOR_LIZARDMONITOR_LIZARD_MANGIANT_MONITOR_LIZARD +KING_COBRAKING_COBRA_MANGIANT_KING_COBRAOCELOT +OCELOT_MAN GIANT_OCELOTJACKAL +JACKAL_MAN GIANT_JACKALCAPUCHIN CAPUCHIN_MANGIANT_CAPUCHINSLOTH SLOTH_MAN GIANT_SLOTH SPIDER_MONKEYSPIDER_MONKEY_MANGIANT_SPIDER_MONKEYPANGOLIN PANGOLIN_MANGIANT_PANGOLIN BLACK_MAMBABLACK_MAMBA_MANGIANT_BLACK_MAMBA +BEAR_SLOTHSLOTH_BEAR_MANGIANT_SLOTH_BEARAYE-AYE AYE-AYE_MAN GIANT_AYE-AYE +BUSHMASTERBUSHMASTER_MANGIANT_BUSHMASTERPYTHON +PYTHON_MAN GIANT_PYTHONTAPIR TAPIR_MAN GIANT_TAPIRIMPALA +IMPALA_MAN GIANT_IMPALAAARDVARK AARDVARK_MANGIANT_AARDVARK LION_TAMARINLION_TAMARIN_MANGIANT_LION_TAMARINSTOAT STOAT_MAN GIANT_STOATLYNXLYNX_MAN +GIANT_LYNXGNOLLNAGAFORGOTTEN_BEAST_1FORGOTTEN_BEAST_2FORGOTTEN_BEAST_3FORGOTTEN_BEAST_4FORGOTTEN_BEAST_5FORGOTTEN_BEAST_6FORGOTTEN_BEAST_7FORGOTTEN_BEAST_8FORGOTTEN_BEAST_9FORGOTTEN_BEAST_10FORGOTTEN_BEAST_11FORGOTTEN_BEAST_12FORGOTTEN_BEAST_13FORGOTTEN_BEAST_14FORGOTTEN_BEAST_15FORGOTTEN_BEAST_16FORGOTTEN_BEAST_17FORGOTTEN_BEAST_18FORGOTTEN_BEAST_19FORGOTTEN_BEAST_20FORGOTTEN_BEAST_21FORGOTTEN_BEAST_22FORGOTTEN_BEAST_23FORGOTTEN_BEAST_24FORGOTTEN_BEAST_25FORGOTTEN_BEAST_26FORGOTTEN_BEAST_27FORGOTTEN_BEAST_28FORGOTTEN_BEAST_29FORGOTTEN_BEAST_30FORGOTTEN_BEAST_31FORGOTTEN_BEAST_32FORGOTTEN_BEAST_33FORGOTTEN_BEAST_34FORGOTTEN_BEAST_35FORGOTTEN_BEAST_36FORGOTTEN_BEAST_37FORGOTTEN_BEAST_38FORGOTTEN_BEAST_39FORGOTTEN_BEAST_40FORGOTTEN_BEAST_41FORGOTTEN_BEAST_42FORGOTTEN_BEAST_43FORGOTTEN_BEAST_44FORGOTTEN_BEAST_45FORGOTTEN_BEAST_46FORGOTTEN_BEAST_47FORGOTTEN_BEAST_48FORGOTTEN_BEAST_49FORGOTTEN_BEAST_50FORGOTTEN_BEAST_51FORGOTTEN_BEAST_52FORGOTTEN_BEAST_53FORGOTTEN_BEAST_54FORGOTTEN_BEAST_55FORGOTTEN_BEAST_56FORGOTTEN_BEAST_57FORGOTTEN_BEAST_58FORGOTTEN_BEAST_59FORGOTTEN_BEAST_60FORGOTTEN_BEAST_61FORGOTTEN_BEAST_62FORGOTTEN_BEAST_63FORGOTTEN_BEAST_64FORGOTTEN_BEAST_65FORGOTTEN_BEAST_66FORGOTTEN_BEAST_67FORGOTTEN_BEAST_68FORGOTTEN_BEAST_69FORGOTTEN_BEAST_70FORGOTTEN_BEAST_71FORGOTTEN_BEAST_72FORGOTTEN_BEAST_73FORGOTTEN_BEAST_74FORGOTTEN_BEAST_75FORGOTTEN_BEAST_76FORGOTTEN_BEAST_77FORGOTTEN_BEAST_78FORGOTTEN_BEAST_79FORGOTTEN_BEAST_80FORGOTTEN_BEAST_81FORGOTTEN_BEAST_82FORGOTTEN_BEAST_83FORGOTTEN_BEAST_84FORGOTTEN_BEAST_85FORGOTTEN_BEAST_86FORGOTTEN_BEAST_87FORGOTTEN_BEAST_88FORGOTTEN_BEAST_89FORGOTTEN_BEAST_90FORGOTTEN_BEAST_91FORGOTTEN_BEAST_92FORGOTTEN_BEAST_93FORGOTTEN_BEAST_94FORGOTTEN_BEAST_95FORGOTTEN_BEAST_96FORGOTTEN_BEAST_97FORGOTTEN_BEAST_98FORGOTTEN_BEAST_99FORGOTTEN_BEAST_100FORGOTTEN_BEAST_101FORGOTTEN_BEAST_102FORGOTTEN_BEAST_103FORGOTTEN_BEAST_104FORGOTTEN_BEAST_105FORGOTTEN_BEAST_106FORGOTTEN_BEAST_107FORGOTTEN_BEAST_108FORGOTTEN_BEAST_109FORGOTTEN_BEAST_110FORGOTTEN_BEAST_111FORGOTTEN_BEAST_112FORGOTTEN_BEAST_113FORGOTTEN_BEAST_114FORGOTTEN_BEAST_115FORGOTTEN_BEAST_116FORGOTTEN_BEAST_117FORGOTTEN_BEAST_118FORGOTTEN_BEAST_119FORGOTTEN_BEAST_120FORGOTTEN_BEAST_121FORGOTTEN_BEAST_122FORGOTTEN_BEAST_123FORGOTTEN_BEAST_124FORGOTTEN_BEAST_125FORGOTTEN_BEAST_126FORGOTTEN_BEAST_127FORGOTTEN_BEAST_128FORGOTTEN_BEAST_129FORGOTTEN_BEAST_130FORGOTTEN_BEAST_131FORGOTTEN_BEAST_132FORGOTTEN_BEAST_133FORGOTTEN_BEAST_134FORGOTTEN_BEAST_135FORGOTTEN_BEAST_136FORGOTTEN_BEAST_137FORGOTTEN_BEAST_138FORGOTTEN_BEAST_139FORGOTTEN_BEAST_140FORGOTTEN_BEAST_141FORGOTTEN_BEAST_142FORGOTTEN_BEAST_143FORGOTTEN_BEAST_144FORGOTTEN_BEAST_145FORGOTTEN_BEAST_146FORGOTTEN_BEAST_147FORGOTTEN_BEAST_148FORGOTTEN_BEAST_149FORGOTTEN_BEAST_150FORGOTTEN_BEAST_151FORGOTTEN_BEAST_152FORGOTTEN_BEAST_153FORGOTTEN_BEAST_154FORGOTTEN_BEAST_155FORGOTTEN_BEAST_156FORGOTTEN_BEAST_157FORGOTTEN_BEAST_158FORGOTTEN_BEAST_159FORGOTTEN_BEAST_160FORGOTTEN_BEAST_161FORGOTTEN_BEAST_162FORGOTTEN_BEAST_163FORGOTTEN_BEAST_164FORGOTTEN_BEAST_165FORGOTTEN_BEAST_166FORGOTTEN_BEAST_167FORGOTTEN_BEAST_168FORGOTTEN_BEAST_169FORGOTTEN_BEAST_170FORGOTTEN_BEAST_171FORGOTTEN_BEAST_172FORGOTTEN_BEAST_173FORGOTTEN_BEAST_174FORGOTTEN_BEAST_175FORGOTTEN_BEAST_176FORGOTTEN_BEAST_177FORGOTTEN_BEAST_178FORGOTTEN_BEAST_179FORGOTTEN_BEAST_180FORGOTTEN_BEAST_181FORGOTTEN_BEAST_182FORGOTTEN_BEAST_183FORGOTTEN_BEAST_184FORGOTTEN_BEAST_185FORGOTTEN_BEAST_186FORGOTTEN_BEAST_187FORGOTTEN_BEAST_188FORGOTTEN_BEAST_189FORGOTTEN_BEAST_190FORGOTTEN_BEAST_191FORGOTTEN_BEAST_192FORGOTTEN_BEAST_193FORGOTTEN_BEAST_194FORGOTTEN_BEAST_195FORGOTTEN_BEAST_196FORGOTTEN_BEAST_197FORGOTTEN_BEAST_198FORGOTTEN_BEAST_199FORGOTTEN_BEAST_200FORGOTTEN_BEAST_201FORGOTTEN_BEAST_202FORGOTTEN_BEAST_203FORGOTTEN_BEAST_204FORGOTTEN_BEAST_205FORGOTTEN_BEAST_206FORGOTTEN_BEAST_207FORGOTTEN_BEAST_208FORGOTTEN_BEAST_209FORGOTTEN_BEAST_210FORGOTTEN_BEAST_211FORGOTTEN_BEAST_212FORGOTTEN_BEAST_213FORGOTTEN_BEAST_214FORGOTTEN_BEAST_215FORGOTTEN_BEAST_216FORGOTTEN_BEAST_217FORGOTTEN_BEAST_218FORGOTTEN_BEAST_219FORGOTTEN_BEAST_220FORGOTTEN_BEAST_221FORGOTTEN_BEAST_222FORGOTTEN_BEAST_223FORGOTTEN_BEAST_224FORGOTTEN_BEAST_225FORGOTTEN_BEAST_226FORGOTTEN_BEAST_227FORGOTTEN_BEAST_228FORGOTTEN_BEAST_229FORGOTTEN_BEAST_230FORGOTTEN_BEAST_231FORGOTTEN_BEAST_232FORGOTTEN_BEAST_233FORGOTTEN_BEAST_234FORGOTTEN_BEAST_235FORGOTTEN_BEAST_236FORGOTTEN_BEAST_237FORGOTTEN_BEAST_238FORGOTTEN_BEAST_239FORGOTTEN_BEAST_240FORGOTTEN_BEAST_241FORGOTTEN_BEAST_242FORGOTTEN_BEAST_243FORGOTTEN_BEAST_244FORGOTTEN_BEAST_245FORGOTTEN_BEAST_246FORGOTTEN_BEAST_247FORGOTTEN_BEAST_248FORGOTTEN_BEAST_249FORGOTTEN_BEAST_250FORGOTTEN_BEAST_251FORGOTTEN_BEAST_252FORGOTTEN_BEAST_253FORGOTTEN_BEAST_254FORGOTTEN_BEAST_255FORGOTTEN_BEAST_256FORGOTTEN_BEAST_257FORGOTTEN_BEAST_258FORGOTTEN_BEAST_259FORGOTTEN_BEAST_260FORGOTTEN_BEAST_261FORGOTTEN_BEAST_262FORGOTTEN_BEAST_263FORGOTTEN_BEAST_264FORGOTTEN_BEAST_265FORGOTTEN_BEAST_266FORGOTTEN_BEAST_267FORGOTTEN_BEAST_268FORGOTTEN_BEAST_269FORGOTTEN_BEAST_270FORGOTTEN_BEAST_271FORGOTTEN_BEAST_272FORGOTTEN_BEAST_273FORGOTTEN_BEAST_274FORGOTTEN_BEAST_275FORGOTTEN_BEAST_276FORGOTTEN_BEAST_277FORGOTTEN_BEAST_278FORGOTTEN_BEAST_279FORGOTTEN_BEAST_280FORGOTTEN_BEAST_281FORGOTTEN_BEAST_282FORGOTTEN_BEAST_283FORGOTTEN_BEAST_284FORGOTTEN_BEAST_285FORGOTTEN_BEAST_286FORGOTTEN_BEAST_287FORGOTTEN_BEAST_288FORGOTTEN_BEAST_289FORGOTTEN_BEAST_290FORGOTTEN_BEAST_291FORGOTTEN_BEAST_292FORGOTTEN_BEAST_293FORGOTTEN_BEAST_294FORGOTTEN_BEAST_295FORGOTTEN_BEAST_296FORGOTTEN_BEAST_297FORGOTTEN_BEAST_298FORGOTTEN_BEAST_299FORGOTTEN_BEAST_300FORGOTTEN_BEAST_301FORGOTTEN_BEAST_302FORGOTTEN_BEAST_303FORGOTTEN_BEAST_304FORGOTTEN_BEAST_305FORGOTTEN_BEAST_306FORGOTTEN_BEAST_307FORGOTTEN_BEAST_308FORGOTTEN_BEAST_309FORGOTTEN_BEAST_310FORGOTTEN_BEAST_311FORGOTTEN_BEAST_312FORGOTTEN_BEAST_313FORGOTTEN_BEAST_314FORGOTTEN_BEAST_315FORGOTTEN_BEAST_316FORGOTTEN_BEAST_317FORGOTTEN_BEAST_318FORGOTTEN_BEAST_319FORGOTTEN_BEAST_320FORGOTTEN_BEAST_321FORGOTTEN_BEAST_322FORGOTTEN_BEAST_323FORGOTTEN_BEAST_324FORGOTTEN_BEAST_325FORGOTTEN_BEAST_326FORGOTTEN_BEAST_327FORGOTTEN_BEAST_328FORGOTTEN_BEAST_329FORGOTTEN_BEAST_330FORGOTTEN_BEAST_331FORGOTTEN_BEAST_332FORGOTTEN_BEAST_333FORGOTTEN_BEAST_334FORGOTTEN_BEAST_335FORGOTTEN_BEAST_336FORGOTTEN_BEAST_337FORGOTTEN_BEAST_338FORGOTTEN_BEAST_339FORGOTTEN_BEAST_340FORGOTTEN_BEAST_341FORGOTTEN_BEAST_342FORGOTTEN_BEAST_343FORGOTTEN_BEAST_344FORGOTTEN_BEAST_345FORGOTTEN_BEAST_346FORGOTTEN_BEAST_347FORGOTTEN_BEAST_348FORGOTTEN_BEAST_349FORGOTTEN_BEAST_350FORGOTTEN_BEAST_351FORGOTTEN_BEAST_352FORGOTTEN_BEAST_353FORGOTTEN_BEAST_354FORGOTTEN_BEAST_355FORGOTTEN_BEAST_356FORGOTTEN_BEAST_357FORGOTTEN_BEAST_358FORGOTTEN_BEAST_359FORGOTTEN_BEAST_360FORGOTTEN_BEAST_361FORGOTTEN_BEAST_362FORGOTTEN_BEAST_363FORGOTTEN_BEAST_364FORGOTTEN_BEAST_365FORGOTTEN_BEAST_366FORGOTTEN_BEAST_367FORGOTTEN_BEAST_368FORGOTTEN_BEAST_369FORGOTTEN_BEAST_370FORGOTTEN_BEAST_371FORGOTTEN_BEAST_372FORGOTTEN_BEAST_373FORGOTTEN_BEAST_374FORGOTTEN_BEAST_375FORGOTTEN_BEAST_376FORGOTTEN_BEAST_377FORGOTTEN_BEAST_378FORGOTTEN_BEAST_379FORGOTTEN_BEAST_380FORGOTTEN_BEAST_381FORGOTTEN_BEAST_382FORGOTTEN_BEAST_383FORGOTTEN_BEAST_384FORGOTTEN_BEAST_385FORGOTTEN_BEAST_386FORGOTTEN_BEAST_387FORGOTTEN_BEAST_388FORGOTTEN_BEAST_389FORGOTTEN_BEAST_390FORGOTTEN_BEAST_391FORGOTTEN_BEAST_392FORGOTTEN_BEAST_393FORGOTTEN_BEAST_394FORGOTTEN_BEAST_395FORGOTTEN_BEAST_396FORGOTTEN_BEAST_397FORGOTTEN_BEAST_398FORGOTTEN_BEAST_399FORGOTTEN_BEAST_400FORGOTTEN_BEAST_401FORGOTTEN_BEAST_402FORGOTTEN_BEAST_403FORGOTTEN_BEAST_404FORGOTTEN_BEAST_405FORGOTTEN_BEAST_406FORGOTTEN_BEAST_407FORGOTTEN_BEAST_408FORGOTTEN_BEAST_409FORGOTTEN_BEAST_410FORGOTTEN_BEAST_411FORGOTTEN_BEAST_412FORGOTTEN_BEAST_413FORGOTTEN_BEAST_414FORGOTTEN_BEAST_415FORGOTTEN_BEAST_416FORGOTTEN_BEAST_417FORGOTTEN_BEAST_418FORGOTTEN_BEAST_419FORGOTTEN_BEAST_420FORGOTTEN_BEAST_421FORGOTTEN_BEAST_422FORGOTTEN_BEAST_423FORGOTTEN_BEAST_424FORGOTTEN_BEAST_425FORGOTTEN_BEAST_426FORGOTTEN_BEAST_427FORGOTTEN_BEAST_428FORGOTTEN_BEAST_429FORGOTTEN_BEAST_430FORGOTTEN_BEAST_431FORGOTTEN_BEAST_432FORGOTTEN_BEAST_433FORGOTTEN_BEAST_434FORGOTTEN_BEAST_435FORGOTTEN_BEAST_436FORGOTTEN_BEAST_437FORGOTTEN_BEAST_438FORGOTTEN_BEAST_439FORGOTTEN_BEAST_440FORGOTTEN_BEAST_441FORGOTTEN_BEAST_442FORGOTTEN_BEAST_443FORGOTTEN_BEAST_444FORGOTTEN_BEAST_445FORGOTTEN_BEAST_446FORGOTTEN_BEAST_447FORGOTTEN_BEAST_448FORGOTTEN_BEAST_449FORGOTTEN_BEAST_450FORGOTTEN_BEAST_451FORGOTTEN_BEAST_452FORGOTTEN_BEAST_453FORGOTTEN_BEAST_454FORGOTTEN_BEAST_455FORGOTTEN_BEAST_456FORGOTTEN_BEAST_457FORGOTTEN_BEAST_458FORGOTTEN_BEAST_459FORGOTTEN_BEAST_460FORGOTTEN_BEAST_461FORGOTTEN_BEAST_462FORGOTTEN_BEAST_463FORGOTTEN_BEAST_464FORGOTTEN_BEAST_465FORGOTTEN_BEAST_466FORGOTTEN_BEAST_467FORGOTTEN_BEAST_468FORGOTTEN_BEAST_469FORGOTTEN_BEAST_470FORGOTTEN_BEAST_471FORGOTTEN_BEAST_472FORGOTTEN_BEAST_473FORGOTTEN_BEAST_474FORGOTTEN_BEAST_475FORGOTTEN_BEAST_476FORGOTTEN_BEAST_477FORGOTTEN_BEAST_478FORGOTTEN_BEAST_479FORGOTTEN_BEAST_480FORGOTTEN_BEAST_481FORGOTTEN_BEAST_482FORGOTTEN_BEAST_483FORGOTTEN_BEAST_484FORGOTTEN_BEAST_485FORGOTTEN_BEAST_486FORGOTTEN_BEAST_487FORGOTTEN_BEAST_488FORGOTTEN_BEAST_489FORGOTTEN_BEAST_490FORGOTTEN_BEAST_491FORGOTTEN_BEAST_492FORGOTTEN_BEAST_493FORGOTTEN_BEAST_494FORGOTTEN_BEAST_495FORGOTTEN_BEAST_496FORGOTTEN_BEAST_497FORGOTTEN_BEAST_498FORGOTTEN_BEAST_499FORGOTTEN_BEAST_500FORGOTTEN_BEAST_501FORGOTTEN_BEAST_502FORGOTTEN_BEAST_503FORGOTTEN_BEAST_504FORGOTTEN_BEAST_505FORGOTTEN_BEAST_506FORGOTTEN_BEAST_507FORGOTTEN_BEAST_508FORGOTTEN_BEAST_509FORGOTTEN_BEAST_510FORGOTTEN_BEAST_511FORGOTTEN_BEAST_512FORGOTTEN_BEAST_513FORGOTTEN_BEAST_514FORGOTTEN_BEAST_515FORGOTTEN_BEAST_516FORGOTTEN_BEAST_517FORGOTTEN_BEAST_518FORGOTTEN_BEAST_519FORGOTTEN_BEAST_520FORGOTTEN_BEAST_521FORGOTTEN_BEAST_522FORGOTTEN_BEAST_523FORGOTTEN_BEAST_524FORGOTTEN_BEAST_525FORGOTTEN_BEAST_526FORGOTTEN_BEAST_527FORGOTTEN_BEAST_528FORGOTTEN_BEAST_529FORGOTTEN_BEAST_530FORGOTTEN_BEAST_531FORGOTTEN_BEAST_532FORGOTTEN_BEAST_533FORGOTTEN_BEAST_534FORGOTTEN_BEAST_535FORGOTTEN_BEAST_536FORGOTTEN_BEAST_537FORGOTTEN_BEAST_538FORGOTTEN_BEAST_539FORGOTTEN_BEAST_540FORGOTTEN_BEAST_541FORGOTTEN_BEAST_542FORGOTTEN_BEAST_543FORGOTTEN_BEAST_544FORGOTTEN_BEAST_545FORGOTTEN_BEAST_546FORGOTTEN_BEAST_547FORGOTTEN_BEAST_548FORGOTTEN_BEAST_549FORGOTTEN_BEAST_550FORGOTTEN_BEAST_551FORGOTTEN_BEAST_552FORGOTTEN_BEAST_553FORGOTTEN_BEAST_554FORGOTTEN_BEAST_555FORGOTTEN_BEAST_556FORGOTTEN_BEAST_557FORGOTTEN_BEAST_558FORGOTTEN_BEAST_559FORGOTTEN_BEAST_560FORGOTTEN_BEAST_561FORGOTTEN_BEAST_562FORGOTTEN_BEAST_563FORGOTTEN_BEAST_564FORGOTTEN_BEAST_565FORGOTTEN_BEAST_566FORGOTTEN_BEAST_567FORGOTTEN_BEAST_568FORGOTTEN_BEAST_569FORGOTTEN_BEAST_570FORGOTTEN_BEAST_571FORGOTTEN_BEAST_572FORGOTTEN_BEAST_573FORGOTTEN_BEAST_574FORGOTTEN_BEAST_575FORGOTTEN_BEAST_576FORGOTTEN_BEAST_577FORGOTTEN_BEAST_578FORGOTTEN_BEAST_579FORGOTTEN_BEAST_580FORGOTTEN_BEAST_581FORGOTTEN_BEAST_582FORGOTTEN_BEAST_583FORGOTTEN_BEAST_584FORGOTTEN_BEAST_585FORGOTTEN_BEAST_586FORGOTTEN_BEAST_587FORGOTTEN_BEAST_588FORGOTTEN_BEAST_589FORGOTTEN_BEAST_590FORGOTTEN_BEAST_591FORGOTTEN_BEAST_592FORGOTTEN_BEAST_593FORGOTTEN_BEAST_594FORGOTTEN_BEAST_595FORGOTTEN_BEAST_596FORGOTTEN_BEAST_597FORGOTTEN_BEAST_598FORGOTTEN_BEAST_599FORGOTTEN_BEAST_600FORGOTTEN_BEAST_601FORGOTTEN_BEAST_602FORGOTTEN_BEAST_603FORGOTTEN_BEAST_604FORGOTTEN_BEAST_605FORGOTTEN_BEAST_606FORGOTTEN_BEAST_607FORGOTTEN_BEAST_608FORGOTTEN_BEAST_609FORGOTTEN_BEAST_610FORGOTTEN_BEAST_611FORGOTTEN_BEAST_612FORGOTTEN_BEAST_613FORGOTTEN_BEAST_614FORGOTTEN_BEAST_615FORGOTTEN_BEAST_616FORGOTTEN_BEAST_617FORGOTTEN_BEAST_618FORGOTTEN_BEAST_619FORGOTTEN_BEAST_620FORGOTTEN_BEAST_621FORGOTTEN_BEAST_622FORGOTTEN_BEAST_623FORGOTTEN_BEAST_624FORGOTTEN_BEAST_625FORGOTTEN_BEAST_626FORGOTTEN_BEAST_627FORGOTTEN_BEAST_628FORGOTTEN_BEAST_629FORGOTTEN_BEAST_630FORGOTTEN_BEAST_631FORGOTTEN_BEAST_632FORGOTTEN_BEAST_633FORGOTTEN_BEAST_634FORGOTTEN_BEAST_635FORGOTTEN_BEAST_636FORGOTTEN_BEAST_637FORGOTTEN_BEAST_638FORGOTTEN_BEAST_639FORGOTTEN_BEAST_640FORGOTTEN_BEAST_641FORGOTTEN_BEAST_642FORGOTTEN_BEAST_643FORGOTTEN_BEAST_644FORGOTTEN_BEAST_645FORGOTTEN_BEAST_646FORGOTTEN_BEAST_647FORGOTTEN_BEAST_648FORGOTTEN_BEAST_649FORGOTTEN_BEAST_650FORGOTTEN_BEAST_651FORGOTTEN_BEAST_652FORGOTTEN_BEAST_653FORGOTTEN_BEAST_654FORGOTTEN_BEAST_655FORGOTTEN_BEAST_656FORGOTTEN_BEAST_657FORGOTTEN_BEAST_658FORGOTTEN_BEAST_659FORGOTTEN_BEAST_660FORGOTTEN_BEAST_661FORGOTTEN_BEAST_662FORGOTTEN_BEAST_663FORGOTTEN_BEAST_664FORGOTTEN_BEAST_665FORGOTTEN_BEAST_666FORGOTTEN_BEAST_667FORGOTTEN_BEAST_668FORGOTTEN_BEAST_669FORGOTTEN_BEAST_670FORGOTTEN_BEAST_671FORGOTTEN_BEAST_672FORGOTTEN_BEAST_673FORGOTTEN_BEAST_674FORGOTTEN_BEAST_675FORGOTTEN_BEAST_676FORGOTTEN_BEAST_677FORGOTTEN_BEAST_678FORGOTTEN_BEAST_679FORGOTTEN_BEAST_680FORGOTTEN_BEAST_681FORGOTTEN_BEAST_682FORGOTTEN_BEAST_683FORGOTTEN_BEAST_684FORGOTTEN_BEAST_685FORGOTTEN_BEAST_686FORGOTTEN_BEAST_687FORGOTTEN_BEAST_688FORGOTTEN_BEAST_689FORGOTTEN_BEAST_690FORGOTTEN_BEAST_691FORGOTTEN_BEAST_692FORGOTTEN_BEAST_693FORGOTTEN_BEAST_694FORGOTTEN_BEAST_695FORGOTTEN_BEAST_696FORGOTTEN_BEAST_697FORGOTTEN_BEAST_698FORGOTTEN_BEAST_699FORGOTTEN_BEAST_700FORGOTTEN_BEAST_701FORGOTTEN_BEAST_702FORGOTTEN_BEAST_703FORGOTTEN_BEAST_704FORGOTTEN_BEAST_705FORGOTTEN_BEAST_706FORGOTTEN_BEAST_707FORGOTTEN_BEAST_708FORGOTTEN_BEAST_709FORGOTTEN_BEAST_710FORGOTTEN_BEAST_711FORGOTTEN_BEAST_712FORGOTTEN_BEAST_713FORGOTTEN_BEAST_714FORGOTTEN_BEAST_715FORGOTTEN_BEAST_716FORGOTTEN_BEAST_717FORGOTTEN_BEAST_718FORGOTTEN_BEAST_719FORGOTTEN_BEAST_720FORGOTTEN_BEAST_721FORGOTTEN_BEAST_722FORGOTTEN_BEAST_723FORGOTTEN_BEAST_724FORGOTTEN_BEAST_725FORGOTTEN_BEAST_726FORGOTTEN_BEAST_727FORGOTTEN_BEAST_728FORGOTTEN_BEAST_729FORGOTTEN_BEAST_730FORGOTTEN_BEAST_731FORGOTTEN_BEAST_732FORGOTTEN_BEAST_733FORGOTTEN_BEAST_734FORGOTTEN_BEAST_735FORGOTTEN_BEAST_736FORGOTTEN_BEAST_737FORGOTTEN_BEAST_738FORGOTTEN_BEAST_739FORGOTTEN_BEAST_740FORGOTTEN_BEAST_741FORGOTTEN_BEAST_742FORGOTTEN_BEAST_743FORGOTTEN_BEAST_744FORGOTTEN_BEAST_745FORGOTTEN_BEAST_746FORGOTTEN_BEAST_747FORGOTTEN_BEAST_748FORGOTTEN_BEAST_749FORGOTTEN_BEAST_750FORGOTTEN_BEAST_751FORGOTTEN_BEAST_752FORGOTTEN_BEAST_753FORGOTTEN_BEAST_754FORGOTTEN_BEAST_755FORGOTTEN_BEAST_756FORGOTTEN_BEAST_757FORGOTTEN_BEAST_758FORGOTTEN_BEAST_759FORGOTTEN_BEAST_760FORGOTTEN_BEAST_761FORGOTTEN_BEAST_762FORGOTTEN_BEAST_763FORGOTTEN_BEAST_764FORGOTTEN_BEAST_765FORGOTTEN_BEAST_766FORGOTTEN_BEAST_767FORGOTTEN_BEAST_768FORGOTTEN_BEAST_769FORGOTTEN_BEAST_770FORGOTTEN_BEAST_771FORGOTTEN_BEAST_772FORGOTTEN_BEAST_773FORGOTTEN_BEAST_774FORGOTTEN_BEAST_775FORGOTTEN_BEAST_776FORGOTTEN_BEAST_777FORGOTTEN_BEAST_778FORGOTTEN_BEAST_779FORGOTTEN_BEAST_780FORGOTTEN_BEAST_781FORGOTTEN_BEAST_782FORGOTTEN_BEAST_783FORGOTTEN_BEAST_784FORGOTTEN_BEAST_785FORGOTTEN_BEAST_786FORGOTTEN_BEAST_787FORGOTTEN_BEAST_788FORGOTTEN_BEAST_789FORGOTTEN_BEAST_790FORGOTTEN_BEAST_791FORGOTTEN_BEAST_792FORGOTTEN_BEAST_793FORGOTTEN_BEAST_794FORGOTTEN_BEAST_795FORGOTTEN_BEAST_796FORGOTTEN_BEAST_797FORGOTTEN_BEAST_798FORGOTTEN_BEAST_799FORGOTTEN_BEAST_800FORGOTTEN_BEAST_801FORGOTTEN_BEAST_802FORGOTTEN_BEAST_803FORGOTTEN_BEAST_804FORGOTTEN_BEAST_805FORGOTTEN_BEAST_806FORGOTTEN_BEAST_807FORGOTTEN_BEAST_808FORGOTTEN_BEAST_809FORGOTTEN_BEAST_810FORGOTTEN_BEAST_811FORGOTTEN_BEAST_812FORGOTTEN_BEAST_813FORGOTTEN_BEAST_814FORGOTTEN_BEAST_815FORGOTTEN_BEAST_816FORGOTTEN_BEAST_817FORGOTTEN_BEAST_818FORGOTTEN_BEAST_819FORGOTTEN_BEAST_820FORGOTTEN_BEAST_821FORGOTTEN_BEAST_822FORGOTTEN_BEAST_823FORGOTTEN_BEAST_824FORGOTTEN_BEAST_825FORGOTTEN_BEAST_826FORGOTTEN_BEAST_827FORGOTTEN_BEAST_828FORGOTTEN_BEAST_829FORGOTTEN_BEAST_830FORGOTTEN_BEAST_831FORGOTTEN_BEAST_832FORGOTTEN_BEAST_833FORGOTTEN_BEAST_834FORGOTTEN_BEAST_835FORGOTTEN_BEAST_836FORGOTTEN_BEAST_837FORGOTTEN_BEAST_838FORGOTTEN_BEAST_839FORGOTTEN_BEAST_840FORGOTTEN_BEAST_841FORGOTTEN_BEAST_842FORGOTTEN_BEAST_843FORGOTTEN_BEAST_844FORGOTTEN_BEAST_845FORGOTTEN_BEAST_846FORGOTTEN_BEAST_847FORGOTTEN_BEAST_848FORGOTTEN_BEAST_849FORGOTTEN_BEAST_850FORGOTTEN_BEAST_851FORGOTTEN_BEAST_852FORGOTTEN_BEAST_853FORGOTTEN_BEAST_854FORGOTTEN_BEAST_855FORGOTTEN_BEAST_856FORGOTTEN_BEAST_857FORGOTTEN_BEAST_858FORGOTTEN_BEAST_859FORGOTTEN_BEAST_860FORGOTTEN_BEAST_861FORGOTTEN_BEAST_862FORGOTTEN_BEAST_863FORGOTTEN_BEAST_864FORGOTTEN_BEAST_865FORGOTTEN_BEAST_866FORGOTTEN_BEAST_867TITAN_1TITAN_2TITAN_3TITAN_4TITAN_5TITAN_6TITAN_7TITAN_8TITAN_9TITAN_10TITAN_11TITAN_12TITAN_13TITAN_14TITAN_15TITAN_16TITAN_17TITAN_18TITAN_19TITAN_20TITAN_21TITAN_22TITAN_23TITAN_24TITAN_25TITAN_26TITAN_27TITAN_28TITAN_29TITAN_30TITAN_31TITAN_32TITAN_33DEMON_1DEMON_2DEMON_3DEMON_4DEMON_5DEMON_6DEMON_7DEMON_8DEMON_9DEMON_10DEMON_11DEMON_12DEMON_13DEMON_14DEMON_15DEMON_16DEMON_17DEMON_18DEMON_19DEMON_20DEMON_21DEMON_22DEMON_23DEMON_24DEMON_25DEMON_26DEMON_27DEMON_28DEMON_29DEMON_30DEMON_31DEMON_32DEMON_33DEMON_34DEMON_35DEMON_36DEMON_37DEMON_38DEMON_39DEMON_40DEMON_41DEMON_42DEMON_43DEMON_44DEMON_45DEMON_46DEMON_47DEMON_48DEMON_49DEMON_50DEMON_51DEMON_52NIGHT_CREATURE_1NIGHT_CREATURE_2NIGHT_CREATURE_3NIGHT_CREATURE_4NIGHT_CREATURE_5NIGHT_CREATURE_6NIGHT_CREATURE_7NIGHT_CREATURE_8NIGHT_CREATURE_9NIGHT_CREATURE_10NIGHT_CREATURE_11NIGHT_CREATURE_12NIGHT_CREATURE_13NIGHT_CREATURE_14NIGHT_CREATURE_15NIGHT_CREATURE_16NIGHT_CREATURE_17NIGHT_CREATURE_18NIGHT_CREATURE_19NIGHT_CREATURE_20NIGHT_CREATURE_21NIGHT_CREATURE_22NIGHT_CREATURE_23NIGHT_CREATURE_24NIGHT_CREATURE_25NIGHT_CREATURE_26NIGHT_CREATURE_27NIGHT_CREATURE_28NIGHT_CREATURE_29NIGHT_CREATURE_30NIGHT_CREATURE_31NIGHT_CREATURE_32NIGHT_CREATURE_33NIGHT_CREATURE_34NIGHT_CREATURE_35NIGHT_CREATURE_36NIGHT_CREATURE_37NIGHT_CREATURE_38NIGHT_CREATURE_39NIGHT_CREATURE_40NIGHT_CREATURE_41NIGHT_CREATURE_42NIGHT_CREATURE_43NIGHT_CREATURE_44NIGHT_CREATURE_45NIGHT_CREATURE_46NIGHT_CREATURE_47NIGHT_CREATURE_48NIGHT_CREATURE_49NIGHT_CREATURE_50NIGHT_CREATURE_51NIGHT_CREATURE_52NIGHT_CREATURE_53NIGHT_CREATURE_54NIGHT_CREATURE_55NIGHT_CREATURE_56NIGHT_CREATURE_57NIGHT_CREATURE_58NIGHT_CREATURE_59NIGHT_CREATURE_60NIGHT_CREATURE_61NIGHT_CREATURE_62NIGHT_CREATURE_63NIGHT_CREATURE_64NIGHT_CREATURE_65NIGHT_CREATURE_66NIGHT_CREATURE_67NIGHT_CREATURE_68NIGHT_CREATURE_69NIGHT_CREATURE_70NIGHT_CREATURE_71NIGHT_CREATURE_72NIGHT_CREATURE_73NIGHT_CREATURE_74NIGHT_CREATURE_75NIGHT_CREATURE_76NIGHT_CREATURE_77NIGHT_CREATURE_78NIGHT_CREATURE_79NIGHT_CREATURE_80NIGHT_CREATURE_81NIGHT_CREATURE_82NIGHT_CREATURE_83NIGHT_CREATURE_84NIGHT_CREATURE_85NIGHT_CREATURE_86NIGHT_CREATURE_87NIGHT_CREATURE_88NIGHT_CREATURE_89NIGHT_CREATURE_90NIGHT_CREATURE_91NIGHT_CREATURE_92NIGHT_CREATURE_93NIGHT_CREATURE_94NIGHT_CREATURE_95NIGHT_CREATURE_96NIGHT_CREATURE_97NIGHT_CREATURE_98NIGHT_CREATURE_99NIGHT_CREATURE_100NIGHT_CREATURE_101NIGHT_CREATURE_102NIGHT_CREATURE_103NIGHT_CREATURE_104HF1248 DIVINE_1HF1248 DIVINE_2HF1248 DIVINE_3HF1108 DIVINE_1HF1108 DIVINE_2HF1108 DIVINE_3HF1249 DIVINE_1HF1249 DIVINE_2HF1249 DIVINE_3HF1345 DIVINE_1HF1345 DIVINE_2HF1345 DIVINE_3˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/armorprefix.dfstock b/data/stockpiles/armorprefix.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..8d69cec678552608e310a1d01ab3fd05581ddda6 GIT binary patch literal 2040 zcmZ{kL2ueH6vv6gv<}pDqbmj4Q;*!*s;Zisojei~Cq}k`wU-RFR6;^+#i+D?g`IZX zamO8Z+;QJzUuBN~O^Uq>*uVet|Jm=^`Re@LsT>j+3+XZqaheTNDuF27<3vN{z))kt zc&b7sb){j59Ec7?kk0th`X;>kJv3M#v`|im4YM< zI8n;2dML`(WZRRMN)x`CmM@7+=v$Tu84!G>E|cQLJP_Qc?{XdO2Ox{Y6TRL`f<6)O zqU#m5pty!&mMfq;xi6MSsUlDs(4&?|^jMH)yDKvM-m#<~7vq3~rzNuOd@Tmiy?ok( zp$3_DSORq4z*@2n2l~MfIJqny3ajcD6BFK#v&|GNm!(L}s!_)AqR?iZ1P?4Z-r;p{ zJ(nmaUWA|ctZ2JAmqJ0Bb?AK#DN}J@hqPg!wL{@##3wOcsYM|QG`mwq1AI2Xxb(Pq z<`p}&urmugx3CLZIMF)Cu??Qu;F%4c+u%iaOU!O2cca-;w>lh8r`~LIJ0IV4w>y)& z@$_ju-BOPa+!>Ua(_3PcHhLK&-3x@_Ho+XBD4AAc62?L&yKR_C|^3t lXGd9dl)0mPcKqmka=tmvcgOkRlzuvmUry<_Q~KkS{sDA}NDlx2 literal 0 HcmV?d00001 diff --git a/data/stockpiles/artifactammo.dfstock b/data/stockpiles/artifactammo.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..874ec21064edbf5f45e96dcb2a57a5a51462099c GIT binary patch literal 33 pcmZ?bQsQtdD#=VsOfH$g$T)+MaRDR43Py@q*wF6SD-&~`Vl3N*hIQkfd0C|`t8GCtReDt;a6R?r$v zOiHEoDe*olq}XL6WEtNne3uRKtKeH0ur>zPq4&5A3N7kx_qv!7I3e36)*)f(jAs|& zt{3r#aMbwf&~ytSkw5jYGh#u=?|TJ;w>T6bRB>aVw%I)rbr^M1IoGp@|P{ zNXYsqehj68pj>r_q1^>;l*MlMLpK2y!Zxj2@=*^R9in7VK?Bl{=OnLPB2n)HDzWyu xZX9Pmut|bV6Ks}Xa~>r+_86z&Bn77_I7`9#2V2tWQMANdieyR3&hTo#EGc)x6=NIR~lD_!S*+`+e_#yqgaFV=E|IULYclomRQkuSIC|tf2 znop;XSHd4dBt3neKU!PmKPh8{UALe!aBD^SkFOf)bgZ^ zz&j;dd6N0hv)3v`P0eAD1Cpg zjLhF};ON!8mie2_fu0I@!3|1F!eMn?3M$54A&IbtWC7fYTO`#djzloS0&o)^G|>415TK_#A};Sus@*E?Zd5$U^&qwaM;*Ysig!I%Z(euQNjWmzsW%2v=I7DmYbBE4) zAvGz3G4OCsGxtd%$c?uJ1DR^jkCHq=;s^p&+HMjAf`x|k!iL~-Zq#|p10|4-XhW-3 zj*?IlVNI=V%V~)cSx{L<6=PsqG}6ZC0guRU)Wz65owl=TUM=BugX&OvLwIaY<3Q&2?mYT5^t7fm9d%$ zWC*(_xJ0V87lJo7UmalR@ANw9OBK^Hv|YebYgG>cg7g#$cOv&f*J6%@GKNa>NKs)+ zCT(&UC>mw-)W~Y>U}L?RwkcMlKDxk`U>WdxNZ=U#C?o23T~+a79$N#(jbpp&UdgIY zuPAh#Y3_!!Las}%+EE46_n_J`t^H*{(+XGXR`HTFGXgDH@3?DCL@Y#A4p+fCQ;_SG z>_F>jbB4Ht@G@DJAp>KT`)pGc>R2#V_x@i13Iv^45=&kMs z2Z88LMbU8Ua9^X}C3T;Y=`D}G?*D_!j4G-S>7Z(X<3Ivx-m-Vk6`+xaKLh!Y)miSO#pJU^2|#h6fE#NU|sBxnkl$t z>yT-VV~YR-IA6nMV6~^m9@Zr!lIJ1U0m7T#iRjVk4Yz|`?_f7O*zFE>hp9N(xY`4+ h_rRMy@OBTp`?Cihn>>H`1p^N|k literal 0 HcmV?d00001 diff --git a/data/stockpiles/bauxite.dfstock b/data/stockpiles/bauxite.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..25524dcb9032e269b96a0f3e161a091056a1c451 GIT binary patch literal 42 ycmXpK<`VSu^AB=&^z(GKa&iof@CWA7%O1IC9Q;EyRa}zHqi(5Xwc?h8@zO_EYTD&zM zZ492j>)@*5#d@BsyVuBw30=2E;ODH4y*yfP_)du^k6L`U`Yj_;WgumRkK5Ivv-L1# z$C#6Bec!U3IyE^0d%oUpINVvU#m@&gM|Q77mH)gY-EwFos3 zh=h({5?@XJ*%Hj=86;V>{bEQ0OO2qZ6vLpM2X`@m=p-()rL(QhmedmyeC$6Dk|x2+{D>QbGhAEjE|nc2=cK1rQ$~PSeh+5;G!X z70P5QE1T~8)}!B#qal@(Fm;=oU2}2!ERtz#%A4%HTFf}r(@HGS6w0B|78AYo4*J7H z4(Ya*=&ert&|G`myEWdE+G;<26!h7uhCDM*?-qp6&BV!8nkXY#I<);t6_RwsJ)PRH_=L5m(jMf3+nIL zw&l1Ew*@V$&F)7fsyHZug%o0ksr8w$lx;a(rRb0#`ZdO((MuP1KSGo_p3QmC=q{c; zi!G8ihSnkMc$t`ueYV@>(@O1iFLcwyd36vG-6aOsPYIIHJDW{|(ZO7E-lg=P$IwR| z{r@)67?&Z+XTFXC@5h&b!jDo};!xpdf$3BvnI?@L2;VsfcrLuLg+-#5+-X;Putk`)YNDWK)57;+5jl-0>?dXVaF7t?x0>IaFnN%I+VW8)d zh{QfbAE><4sB?!Om}+8oc*9vP*xM`EyDQlHE7%97;wi?PYv9{!;Ja(!`)lBbFQ?P* Wr_&#&n?Fyl{yN?KeY*MQbn_n;ywVl` literal 0 HcmV?d00001 diff --git a/data/stockpiles/bolts.dfstock b/data/stockpiles/bolts.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..8f525cf2b4a31813c73d98135cdcfdfe17cee2f2 GIT binary patch literal 45 ycmZ<~;}UW7_4T*%3~}|12eIOv{Cz@#ConS3U}Rjt$gqM@Vgn^FQzJ$?*7|mdMwLGzx#B(5<1H~LjbKu-TEMC1E1HCy$Rd=1O`fF?UU7y55ya5J- z422jBp2AXOgC~d~pr=wI8-y7e*-+3^C6JBO*?1qQ+!H7+s{tzsrZ9XEb7>14#9ZD2 z6z&Qbp!gbxC^RHDKq2gl;?RnQ2eH@{`n)eJfd?^$t#DWX#<9B`HUkqdbxdJjl#`4= zUNr1Frm?%JQ=Y&N86<9n3$3bIh77~_G5bRyyXY~1g5rp%i zZ~<`F2|NR23{xis>|Kc?l6a~~EX`8G0!R(pTWTCMR&R=-FBHRJLow_+!ncvIG*bfg zg|IXezOaPnG-357iL)zVrHSAqAv^;JUp2ywNm#uVZU*IFE9dn^F_;&HE3NSOR0LZ} zVL4P-8I*sL1cJtI5{b=HHaX;p#xEyqVJ!{J2KbY*M zG+(lAd;BZ3_Ryz8XD86s?ivp*hmHC1_e5QJ@L~X4vn$5E4!gCLx$(T$18>us{l4!^ zQT9!-@r#$vh_&m!ts8GBTaG2zZ>?>ztts07z_K(uGl0)WrYRefJM>|H*Vbh@-M^_k Y_$`XQN72t{@hf`yJ6imS7Js9~J!7g}d;kCd literal 0 HcmV?d00001 diff --git a/data/stockpiles/clothprefix.dfstock b/data/stockpiles/clothprefix.dfstock new file mode 100644 index 000000000..62d84c402 --- /dev/null +++ b/data/stockpiles/clothprefix.dfstock @@ -0,0 +1,141 @@ +rêL +"CREATURE:SPIDER_BROWN_RECLUSE:SILK +&CREATURE:BROWN_RECLUSE_SPIDER_MAN:SILK +(CREATURE:GIANT_BROWN_RECLUSE_SPIDER:SILK +CREATURE:SPIDER_PHANTOM:SILK +CREATURE:SPIDER_CAVE_GIANT:SILK +CREATURE:SPIDER_CAVE:SILK +INORGANIC:DIVINE_2 +INORGANIC:DIVINE_4 +INORGANIC:DIVINE_6 +INORGANIC:DIVINE_8 +INORGANIC:DIVINE_10 +INORGANIC:DIVINE_12 +INORGANIC:DIVINE_14 +INORGANIC:DIVINE_16 +INORGANIC:DIVINE_18 +INORGANIC:DIVINE_20 + CREATURE:FORGOTTEN_BEAST_10:SILK + CREATURE:FORGOTTEN_BEAST_12:SILK + CREATURE:FORGOTTEN_BEAST_17:SILK + CREATURE:FORGOTTEN_BEAST_20:SILK + CREATURE:FORGOTTEN_BEAST_29:SILK + CREATURE:FORGOTTEN_BEAST_31:SILK + CREATURE:FORGOTTEN_BEAST_42:SILK + CREATURE:FORGOTTEN_BEAST_55:SILK + CREATURE:FORGOTTEN_BEAST_65:SILK + CREATURE:FORGOTTEN_BEAST_68:SILK + CREATURE:FORGOTTEN_BEAST_71:SILK + CREATURE:FORGOTTEN_BEAST_74:SILK + CREATURE:FORGOTTEN_BEAST_91:SILK +!CREATURE:FORGOTTEN_BEAST_101:SILK +!CREATURE:FORGOTTEN_BEAST_109:SILK +!CREATURE:FORGOTTEN_BEAST_119:SILK +!CREATURE:FORGOTTEN_BEAST_121:SILK +!CREATURE:FORGOTTEN_BEAST_125:SILK +!CREATURE:FORGOTTEN_BEAST_128:SILK +!CREATURE:FORGOTTEN_BEAST_132:SILK +!CREATURE:FORGOTTEN_BEAST_142:SILK +!CREATURE:FORGOTTEN_BEAST_146:SILK +!CREATURE:FORGOTTEN_BEAST_168:SILK +!CREATURE:FORGOTTEN_BEAST_173:SILK +!CREATURE:FORGOTTEN_BEAST_186:SILK +!CREATURE:FORGOTTEN_BEAST_204:SILK +!CREATURE:FORGOTTEN_BEAST_213:SILK +!CREATURE:FORGOTTEN_BEAST_224:SILK +!CREATURE:FORGOTTEN_BEAST_235:SILK +!CREATURE:FORGOTTEN_BEAST_236:SILK +!CREATURE:FORGOTTEN_BEAST_239:SILK +!CREATURE:FORGOTTEN_BEAST_248:SILK +!CREATURE:FORGOTTEN_BEAST_275:SILK +!CREATURE:FORGOTTEN_BEAST_277:SILK +!CREATURE:FORGOTTEN_BEAST_281:SILK +!CREATURE:FORGOTTEN_BEAST_289:SILK +!CREATURE:FORGOTTEN_BEAST_290:SILK +!CREATURE:FORGOTTEN_BEAST_293:SILK +!CREATURE:FORGOTTEN_BEAST_297:SILK +!CREATURE:FORGOTTEN_BEAST_309:SILK +!CREATURE:FORGOTTEN_BEAST_311:SILK +!CREATURE:FORGOTTEN_BEAST_313:SILK +!CREATURE:FORGOTTEN_BEAST_326:SILK +!CREATURE:FORGOTTEN_BEAST_330:SILK +!CREATURE:FORGOTTEN_BEAST_341:SILK +!CREATURE:FORGOTTEN_BEAST_343:SILK +!CREATURE:FORGOTTEN_BEAST_357:SILK +!CREATURE:FORGOTTEN_BEAST_362:SILK +!CREATURE:FORGOTTEN_BEAST_371:SILK +!CREATURE:FORGOTTEN_BEAST_376:SILK +!CREATURE:FORGOTTEN_BEAST_379:SILK +!CREATURE:FORGOTTEN_BEAST_384:SILK +!CREATURE:FORGOTTEN_BEAST_397:SILK +!CREATURE:FORGOTTEN_BEAST_398:SILK +!CREATURE:FORGOTTEN_BEAST_403:SILK +!CREATURE:FORGOTTEN_BEAST_412:SILK +!CREATURE:FORGOTTEN_BEAST_426:SILK +!CREATURE:FORGOTTEN_BEAST_427:SILK +!CREATURE:FORGOTTEN_BEAST_432:SILK +!CREATURE:FORGOTTEN_BEAST_435:SILK +!CREATURE:FORGOTTEN_BEAST_438:SILK +!CREATURE:FORGOTTEN_BEAST_442:SILK +!CREATURE:FORGOTTEN_BEAST_456:SILK +!CREATURE:FORGOTTEN_BEAST_460:SILK +!CREATURE:FORGOTTEN_BEAST_465:SILK +!CREATURE:FORGOTTEN_BEAST_467:SILK +!CREATURE:FORGOTTEN_BEAST_472:SILK +!CREATURE:FORGOTTEN_BEAST_476:SILK +!CREATURE:FORGOTTEN_BEAST_486:SILK +!CREATURE:FORGOTTEN_BEAST_508:SILK +!CREATURE:FORGOTTEN_BEAST_549:SILK +!CREATURE:FORGOTTEN_BEAST_567:SILK +!CREATURE:FORGOTTEN_BEAST_568:SILK +!CREATURE:FORGOTTEN_BEAST_575:SILK +!CREATURE:FORGOTTEN_BEAST_580:SILK +!CREATURE:FORGOTTEN_BEAST_583:SILK +!CREATURE:FORGOTTEN_BEAST_588:SILK +!CREATURE:FORGOTTEN_BEAST_589:SILK +!CREATURE:FORGOTTEN_BEAST_600:SILK +!CREATURE:FORGOTTEN_BEAST_605:SILK +!CREATURE:FORGOTTEN_BEAST_606:SILK +!CREATURE:FORGOTTEN_BEAST_612:SILK +!CREATURE:FORGOTTEN_BEAST_613:SILK +!CREATURE:FORGOTTEN_BEAST_614:SILK +!CREATURE:FORGOTTEN_BEAST_630:SILK +!CREATURE:FORGOTTEN_BEAST_632:SILK +!CREATURE:FORGOTTEN_BEAST_639:SILK +!CREATURE:FORGOTTEN_BEAST_643:SILK +!CREATURE:FORGOTTEN_BEAST_650:SILK +!CREATURE:FORGOTTEN_BEAST_653:SILK +!CREATURE:FORGOTTEN_BEAST_661:SILK +!CREATURE:FORGOTTEN_BEAST_662:SILK +!CREATURE:FORGOTTEN_BEAST_676:SILK +!CREATURE:FORGOTTEN_BEAST_680:SILK +!CREATURE:FORGOTTEN_BEAST_697:SILK +!CREATURE:FORGOTTEN_BEAST_706:SILK +!CREATURE:FORGOTTEN_BEAST_720:SILK +!CREATURE:FORGOTTEN_BEAST_723:SILK +!CREATURE:FORGOTTEN_BEAST_730:SILK +!CREATURE:FORGOTTEN_BEAST_757:SILK +!CREATURE:FORGOTTEN_BEAST_764:SILK +!CREATURE:FORGOTTEN_BEAST_765:SILK +!CREATURE:FORGOTTEN_BEAST_768:SILK +!CREATURE:FORGOTTEN_BEAST_774:SILK +!CREATURE:FORGOTTEN_BEAST_791:SILK +!CREATURE:FORGOTTEN_BEAST_809:SILK +!CREATURE:FORGOTTEN_BEAST_814:SILK +!CREATURE:FORGOTTEN_BEAST_821:SILK +!CREATURE:FORGOTTEN_BEAST_827:SILK +!CREATURE:FORGOTTEN_BEAST_829:SILK +!CREATURE:FORGOTTEN_BEAST_843:SILK +!CREATURE:FORGOTTEN_BEAST_855:SILK +!CREATURE:FORGOTTEN_BEAST_863:SILK +CREATURE:TITAN_4:SILK +CREATURE:TITAN_9:SILK +CREATURE:TITAN_14:SILK +CREATURE:TITAN_15:SILK +CREATURE:TITAN_16:SILK +CREATURE:TITAN_21:SILK +CREATURE:TITAN_22:SILK +CREATURE:TITAN_23:SILK +CREATURE:DEMON_39:SILK +CREATURE:DEMON_42:SILK +CREATURE:DEMON_51:SILKPLANT:FLAX:THREADPLANT:JUTE:THREADPLANT:HEMP:THREADPLANT:COTTON:THREADPLANT:RAMIE:THREADPLANT:KENAF:THREADPLANT:GRASS_TAIL_PIG:THREADPLANT:REED_ROPE:THREADCREATURE:SHEEP:HAIRCREATURE:LLAMA:HAIRCREATURE:ALPACA:HAIRCREATURE:TROLL:HAIRCREATURE:GNOLL:HAIR"INORGANIC:ADAMANTINE*"CREATURE:SPIDER_BROWN_RECLUSE:SILK*&CREATURE:BROWN_RECLUSE_SPIDER_MAN:SILK*(CREATURE:GIANT_BROWN_RECLUSE_SPIDER:SILK*CREATURE:SPIDER_PHANTOM:SILK*CREATURE:SPIDER_CAVE_GIANT:SILK*CREATURE:SPIDER_CAVE:SILK*INORGANIC:DIVINE_2*INORGANIC:DIVINE_4*INORGANIC:DIVINE_6*INORGANIC:DIVINE_8*INORGANIC:DIVINE_10*INORGANIC:DIVINE_12*INORGANIC:DIVINE_14*INORGANIC:DIVINE_16*INORGANIC:DIVINE_18*INORGANIC:DIVINE_20* CREATURE:FORGOTTEN_BEAST_10:SILK* CREATURE:FORGOTTEN_BEAST_12:SILK* CREATURE:FORGOTTEN_BEAST_17:SILK* CREATURE:FORGOTTEN_BEAST_20:SILK* CREATURE:FORGOTTEN_BEAST_29:SILK* CREATURE:FORGOTTEN_BEAST_31:SILK* CREATURE:FORGOTTEN_BEAST_42:SILK* CREATURE:FORGOTTEN_BEAST_55:SILK* CREATURE:FORGOTTEN_BEAST_65:SILK* CREATURE:FORGOTTEN_BEAST_68:SILK* CREATURE:FORGOTTEN_BEAST_71:SILK* CREATURE:FORGOTTEN_BEAST_74:SILK* CREATURE:FORGOTTEN_BEAST_91:SILK*!CREATURE:FORGOTTEN_BEAST_101:SILK*!CREATURE:FORGOTTEN_BEAST_109:SILK*!CREATURE:FORGOTTEN_BEAST_119:SILK*!CREATURE:FORGOTTEN_BEAST_121:SILK*!CREATURE:FORGOTTEN_BEAST_125:SILK*!CREATURE:FORGOTTEN_BEAST_128:SILK*!CREATURE:FORGOTTEN_BEAST_132:SILK*!CREATURE:FORGOTTEN_BEAST_142:SILK*!CREATURE:FORGOTTEN_BEAST_146:SILK*!CREATURE:FORGOTTEN_BEAST_168:SILK*!CREATURE:FORGOTTEN_BEAST_173:SILK*!CREATURE:FORGOTTEN_BEAST_186:SILK*!CREATURE:FORGOTTEN_BEAST_204:SILK*!CREATURE:FORGOTTEN_BEAST_213:SILK*!CREATURE:FORGOTTEN_BEAST_224:SILK*!CREATURE:FORGOTTEN_BEAST_235:SILK*!CREATURE:FORGOTTEN_BEAST_236:SILK*!CREATURE:FORGOTTEN_BEAST_239:SILK*!CREATURE:FORGOTTEN_BEAST_248:SILK*!CREATURE:FORGOTTEN_BEAST_275:SILK*!CREATURE:FORGOTTEN_BEAST_277:SILK*!CREATURE:FORGOTTEN_BEAST_281:SILK*!CREATURE:FORGOTTEN_BEAST_289:SILK*!CREATURE:FORGOTTEN_BEAST_290:SILK*!CREATURE:FORGOTTEN_BEAST_293:SILK*!CREATURE:FORGOTTEN_BEAST_297:SILK*!CREATURE:FORGOTTEN_BEAST_309:SILK*!CREATURE:FORGOTTEN_BEAST_311:SILK*!CREATURE:FORGOTTEN_BEAST_313:SILK*!CREATURE:FORGOTTEN_BEAST_326:SILK*!CREATURE:FORGOTTEN_BEAST_330:SILK*!CREATURE:FORGOTTEN_BEAST_341:SILK*!CREATURE:FORGOTTEN_BEAST_343:SILK*!CREATURE:FORGOTTEN_BEAST_357:SILK*!CREATURE:FORGOTTEN_BEAST_362:SILK*!CREATURE:FORGOTTEN_BEAST_371:SILK*!CREATURE:FORGOTTEN_BEAST_376:SILK*!CREATURE:FORGOTTEN_BEAST_379:SILK*!CREATURE:FORGOTTEN_BEAST_384:SILK*!CREATURE:FORGOTTEN_BEAST_397:SILK*!CREATURE:FORGOTTEN_BEAST_398:SILK*!CREATURE:FORGOTTEN_BEAST_403:SILK*!CREATURE:FORGOTTEN_BEAST_412:SILK*!CREATURE:FORGOTTEN_BEAST_426:SILK*!CREATURE:FORGOTTEN_BEAST_427:SILK*!CREATURE:FORGOTTEN_BEAST_432:SILK*!CREATURE:FORGOTTEN_BEAST_435:SILK*!CREATURE:FORGOTTEN_BEAST_438:SILK*!CREATURE:FORGOTTEN_BEAST_442:SILK*!CREATURE:FORGOTTEN_BEAST_456:SILK*!CREATURE:FORGOTTEN_BEAST_460:SILK*!CREATURE:FORGOTTEN_BEAST_465:SILK*!CREATURE:FORGOTTEN_BEAST_467:SILK*!CREATURE:FORGOTTEN_BEAST_472:SILK*!CREATURE:FORGOTTEN_BEAST_476:SILK*!CREATURE:FORGOTTEN_BEAST_486:SILK*!CREATURE:FORGOTTEN_BEAST_508:SILK*!CREATURE:FORGOTTEN_BEAST_549:SILK*!CREATURE:FORGOTTEN_BEAST_567:SILK*!CREATURE:FORGOTTEN_BEAST_568:SILK*!CREATURE:FORGOTTEN_BEAST_575:SILK*!CREATURE:FORGOTTEN_BEAST_580:SILK*!CREATURE:FORGOTTEN_BEAST_583:SILK*!CREATURE:FORGOTTEN_BEAST_588:SILK*!CREATURE:FORGOTTEN_BEAST_589:SILK*!CREATURE:FORGOTTEN_BEAST_600:SILK*!CREATURE:FORGOTTEN_BEAST_605:SILK*!CREATURE:FORGOTTEN_BEAST_606:SILK*!CREATURE:FORGOTTEN_BEAST_612:SILK*!CREATURE:FORGOTTEN_BEAST_613:SILK*!CREATURE:FORGOTTEN_BEAST_614:SILK*!CREATURE:FORGOTTEN_BEAST_630:SILK*!CREATURE:FORGOTTEN_BEAST_632:SILK*!CREATURE:FORGOTTEN_BEAST_639:SILK*!CREATURE:FORGOTTEN_BEAST_643:SILK*!CREATURE:FORGOTTEN_BEAST_650:SILK*!CREATURE:FORGOTTEN_BEAST_653:SILK*!CREATURE:FORGOTTEN_BEAST_661:SILK*!CREATURE:FORGOTTEN_BEAST_662:SILK*!CREATURE:FORGOTTEN_BEAST_676:SILK*!CREATURE:FORGOTTEN_BEAST_680:SILK*!CREATURE:FORGOTTEN_BEAST_697:SILK*!CREATURE:FORGOTTEN_BEAST_706:SILK*!CREATURE:FORGOTTEN_BEAST_720:SILK*!CREATURE:FORGOTTEN_BEAST_723:SILK*!CREATURE:FORGOTTEN_BEAST_730:SILK*!CREATURE:FORGOTTEN_BEAST_757:SILK*!CREATURE:FORGOTTEN_BEAST_764:SILK*!CREATURE:FORGOTTEN_BEAST_765:SILK*!CREATURE:FORGOTTEN_BEAST_768:SILK*!CREATURE:FORGOTTEN_BEAST_774:SILK*!CREATURE:FORGOTTEN_BEAST_791:SILK*!CREATURE:FORGOTTEN_BEAST_809:SILK*!CREATURE:FORGOTTEN_BEAST_814:SILK*!CREATURE:FORGOTTEN_BEAST_821:SILK*!CREATURE:FORGOTTEN_BEAST_827:SILK*!CREATURE:FORGOTTEN_BEAST_829:SILK*!CREATURE:FORGOTTEN_BEAST_843:SILK*!CREATURE:FORGOTTEN_BEAST_855:SILK*!CREATURE:FORGOTTEN_BEAST_863:SILK*CREATURE:TITAN_4:SILK*CREATURE:TITAN_9:SILK*CREATURE:TITAN_14:SILK*CREATURE:TITAN_15:SILK*CREATURE:TITAN_16:SILK*CREATURE:TITAN_21:SILK*CREATURE:TITAN_22:SILK*CREATURE:TITAN_23:SILK*CREATURE:DEMON_39:SILK*CREATURE:DEMON_42:SILK*CREATURE:DEMON_51:SILK2PLANT:FLAX:THREAD2PLANT:JUTE:THREAD2PLANT:HEMP:THREAD2PLANT:COTTON:THREAD2PLANT:RAMIE:THREAD2PLANT:KENAF:THREAD2PLANT:GRASS_TAIL_PIG:THREAD2PLANT:REED_ROPE:THREAD:CREATURE:SHEEP:HAIR:CREATURE:LLAMA:HAIR:CREATURE:ALPACA:HAIR:CREATURE:TROLL:HAIR:CREATURE:GNOLL:HAIRBINORGANIC:ADAMANTINE˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/coal.dfstock b/data/stockpiles/coal.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..0db45dd7f02fc03b156fcdeec39002e5355f8711 GIT binary patch literal 31 ncmWII;9?8#4{;3kn83(5gOPCoBf|SwY1Z=fx z%FE`zU6(Q~^3yma?T0IFjgw=j(Dzp`Q?Bm2YX32TE*2;ig_ZlC(q-3~Ms6*(#^zEB)PiCVt{O`%zy<>0PzrwS!7Ht5xu?|B zN}opaJO-S2Y?|SX8CM&tkZ)#kUKy*o%*e7lh*ESjUozdx!;2_p$7<0kcYxcyR?ONK zG@et(0|(QJ*-4o;rU<#>^K0W=dVWBI0ZPzWSmkmBPl?ufWd~=X3kjSXtp(H930rW^ zb732)m1sD`GOioeb`Hw@2XXi+3hZrlhfEH&7BR1xcVrW%!iXaiP>$6J@2z^%e zg3^I48twuUCD13Y4GcRkOVkCe%DWzRrWN|a)#fxDzV_huJ9qS}c#GkX*RQBtQcqE5 z2yj^>-mTY^AaVm#ashj(Rjh#WCH;;6Z4B{RE* z4mX|$q~WS5RB4z9*_t z7eSJ50&a3BAV(>Dt79d_l2EYHI1mzsMpNUDHWQ3I7~_x^FX#STI!dhVGlkIxl_B@@ zpsQ)mlm_}3sz4SXa{qJ(ul0$ADNgDDQOmA^5U|q%icw=KK=~-K6Ky~~E@~VUk}7y2 zj;-e;GcTYp@Qk6bV%uRM2uy+ox#dX0-buWY-8s6*B&e2WOp4UH!A2#lmY4)*Di>D3 z)K%C02on}4Ers$-Ek-@?u^04tU}=#xMqfOFXt+eV2Ub&u+oD>e?P4sjfRle&@HHV) zU*Mp5oVv?`S71)Z1&_R3GZkw?XI%UoafeveAsOB71=Ez;_*y`|=xj)(sl61@*?A>xHwT11aZxeX zgbpN0D^$G5zPn0eDKZR`e44F>C=9eK6CnWd35mn(1)peFA;P#$yG-U3ia2`>#cO{N zj>9W=7IRw-I$RKB-{qBpA`ntGQsGTa2=pOCQOJi1*Ky~MBMj*`Avx4AUd0sdSnQq+DlK)zJji_oVy_ zCUA-loPJ7B%T}>cXfT3LGPXt6HXUQGQ(5?wP6q{1FYgkyo*VSpLqtN{6|vFiTfFBK zR0I<-ZB!b^`j08Iw(rzjd}@JiSP~uAV3ZC@gr5L)9~`6#wyMi3v<~{3{mw-H=8sN! z^zFAGQl-pT@y4Gc!1Ln1_Eee9p}#sRVN6iS@`O?_e%GjtsJV*%>Wf>`rEj+561fqqP}ZZBfYO2f z292N6R=){1FplN8{MK2Hu|8t5XASn>jMEH21_K<&uq7JD0xq35;l~k*rIli?J$Nvd z`28;=mH6&CgWm!nu%j{f5swN8?=cjATcH&AaV#y5|Ir}%)wc*OGTv|+ChWL^-L7DF zE7<)C_OOCIu3%3q*k|sKi_f3dz?(JjxCY*?fp=@*{TleN20pHVPix>>M8{8j9brD# zsG{i$l!tB&!jBvH?FN3gf!}Z74;%R72L7~xf9CO-{J;6MwQ#ewaNJtB-CDTYTDad@ zc-UHa+*)|rTG)ylrKZ7+QgYmi{J0hQaVzrUR^-R6$d3;!eZeb>|0jTdbXi~F<2ro1 z4&SZA_v`S6Cy(p9pVr~e2_IuPX`e+r?X!rdeHQVw&mx}oS;W&mi+I{+5l{Op;%T2n zd?Vf!T?zZawWY2^d?Q{kZGHbnyx`gT{)d0O4|aA92yqSKVs#Gk5BK9@0m`~_vAa43ff*c5 gL5|L@K!p<+8D}suE?{I>!6>nTkzofT!vRJH02vz-1ONa4 literal 0 HcmV?d00001 diff --git a/data/stockpiles/cutgems.dfstock b/data/stockpiles/cutgems.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..42949b8dcc2b9070e7c83af389a31a7f3ec5e305 GIT binary patch literal 2907 zcmZuzJF??85PZCV*WdNpYge(D>>Zp9L5Rc(1o#G|^r%Eva_G>ZLx&Ds<%@anVX-A{ zs0KK{?rG@u-}~k(<2?7|jQY*H^{x4O|2=v(-XRjy;Mq3c?{_RIT~kl9Zob>m)-JmK zOr37t@1Uj0gxb<=v8H*q;}cWR7&8I2pXeb|YrXHn?A^oN(T8x%pU@NlinV`)F_XFbzetAVW2k#9WegjES; zR8a@e6$a_(FpgH_oamEl-kk`c<@eL>~i}B80U{I=( z4WG#huFi|?X;C{x1b3bX+%c!l`r0C$|K5pYW(|Z&G)RSDWj}|dM)E?*} z&iW{*p0#!u2b%5lNN)C~!z%L!rFxiG#uICxbrF~Go#zI&N><%;en#hI@vRaPxQ!@C z9g@Y9GAO8*tkl~*Eo{8n3pHV}#JCg5(jYtpirE z)54-l6bf1WCKVMrJO5|U5+AqdiJ=fxvL0o-~tpe|J|ZMR_?;yvfK5hcJs0<*4>(xT3rq9+H<2utj*Y zXCdH*%1J*}H?m^3ob5Jv{De^3~(c^j`ciu>cXo;! zJctos(Ik#B%D)1k4+dLgBjQ6+^B;u+3sH#oDQXgxmrx0CvJ?i4oeq-09MEL9*h#uu z%;erfT%Y(c^)>m9YhDlacp?j<(EQbZXm~2=Uv_q fMjwg|CGhvE`lG7;tX}@AKKxz1{8PRBTfO`bI|&d} literal 0 HcmV?d00001 diff --git a/data/stockpiles/cutglass.dfstock b/data/stockpiles/cutglass.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..7523381b419e564539214d990c8119cf6b4ab40a GIT binary patch literal 64 zcma#j6ykRGaSRTQcMo!P^@DMoeOw)bgm@t`&OwpEA&x#17#U|UGA>|bSivZX*Q%A7b&X0lj{a6FVIN9!Ij%Kub7Fiq0Wy9VhRa^C3Klt5 zQ|(!3$W`na{86Hs*BCQ*x?3q1u)2M*{{D_d){jHik?)t&xL?B}_oZ)y-E{ukE$+vGSW&L9wumEYBgE>E*aR9q?vc uPDD6>^_r7~s}o!&=)l1;qY#qc!w!Eo&9A2U-JJe3_kWwyzvlGRoc;q%bNt@` literal 0 HcmV?d00001 diff --git a/data/stockpiles/drinkanimal.dfstock b/data/stockpiles/drinkanimal.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..f3cfabebf17ec146a46a1e43b5808916d6d4c525 GIT binary patch literal 76 zcmWeKH4=9Ya&-&|4RW>e@b`0#jCXQ%weod!bU~7E3iWmJafM0DU}TuU$T)+MaRH;m R3Py$vj0`&%84fTq008$;6Da@y literal 0 HcmV?d00001 diff --git a/data/stockpiles/drinkplant.dfstock b/data/stockpiles/drinkplant.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..c03acc8bcbe6006b47659f0c9271ce1e85dbd204 GIT binary patch literal 1780 zcmZuyIgZpo6m1^>0mC*dLLwb$E-=}*U2d1UHfrgnN$N_36A}^<5^@j@!|(R{Zo4&d zVCnt+{iSaHJ-hoH47vP}wA&hWzm23_J&cO-Lm#!<-F=+o`QV=rzJ;+L^2!MKNU>kx zFQFfl5&t(6)KWC+h?sAHm2S68<@p51qk`Tmxbty477OqNv~(wGh-yiH7YI?m7VSL2 z5ZI2KJ_z<{au$^9nWajWBL7ENe3+!I@xH&7fwxd%FzQ-(D{i^!YPB&+=z!!f>a5n1 z_mj=QjZ$$fLLP(vmPubZMDc@n+OHYPY8ZfkaEe)Xqu&Wjpt4nSdhezr4%+m!qZqy9 zjaGD&677XOfPrFiI;?39K2w&AKz*cMCm|P1qytB{h88&+h}54;dQ4yV=(`zZG&15ozFMR##ldvxT463nP(?-k%bu*dhYTKliz&BE12; n=iT6!Wj-oswOVG{A5HVvG(Vf$U(M!sv-#6({x+Nc>Qm}N literal 0 HcmV?d00001 diff --git a/data/stockpiles/dye.dfstock b/data/stockpiles/dye.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..e8ef137d85db9a0f916a1bc5c210afb5a2acafaa GIT binary patch literal 127 zcmWg2h>{ENar6tZ@(m642=e#$jduT+{ literal 0 HcmV?d00001 diff --git a/data/stockpiles/economic.dfstock b/data/stockpiles/economic.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..b69a8034c0f694c53da4e9d61fbdc15695d09241 GIT binary patch literal 266 zcmYk0EfNAT3`QGU!=K_BNL*SnC9`R}({u%jDvdQ*NlP=wNmMum4p_z8!A>#I%2s2+yNe7o?u=8Z!jM)Ki^$N-2eap literal 0 HcmV?d00001 diff --git a/data/stockpiles/emptyanimaltraps.dfstock b/data/stockpiles/emptyanimaltraps.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..d9121dc8aa9a79a2205e2a71192d620506ede5bb GIT binary patch literal 27 jcmd;L;b0J8oWRI9gOPCoBf|j literal 0 HcmV?d00001 diff --git a/data/stockpiles/finishedgoodsprefix.dfstock b/data/stockpiles/finishedgoodsprefix.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..556f7d3059b572b2125e96cfb61905a7fce2dd67 GIT binary patch literal 5995 zcmZ`-O>gA38D3*;uRF%J>9kGLX$uT|Dd0nZAP9o=Mp3lH9ZJ-a)QsiJz)ie>0b>)m z4$%CI9&^kw#~yp^f9N0TLrSyrXyhIi-g!m7pU?ZeB>(o`PiH5x6uO?BTp8h4v(v(6 zMupi-*FLzmQgxWU47Qt{2v=D*JMpDees)|cQ(>{OYy3L9(nafZt!Ag9YUB1-UaBT2 zte4Ji>e(^A7PD7Mxb&a1%n7OD!k2}rW+%ah_@@zdfVND?RfB)C)3>c&L&>RcjD{np z(zQXBv*Tc`nH^`=uI9%ZYxDVeW3YECjSb}-A8Iv+()6RWuAZMXFm2}WUKulgWt0e| za`R)a&1!xksti9)q;V_Y$rR#hUX83vB321(~5!Z`f>e{+O z)LQ;kJ6rSb!kT>X(f&IuA|#eb+caYd^sJO&EjPNByeET|8@2e=UN180JqvtL&@tby zXmqhn-m%PxpzF5cb*PJsrC+?>@5Q3U@Af|%wLx*WS19@7_Y-k&`pT%qZzms&=r|~( zHfO`av{iD3RQ9RZPP3M2W02`T?2RB`2bdJQ#UJlKWd?BC4oUmXUhb?{+f<=n?}eH6 zRU691Clk?514SlsQ2}`|5u^fWjNUB%yjLNW6P1=*zzNW+H^QmKAE%#v0CxZ1$HqEz z4Z3wfF$iBqKmrXUghPXnplR#wnn8qq)<_|PQ=(f8R}P6&OHqh0QlFVtE#HV-Ehx!G zG}ms2Xo!NPZN$h@X3)qfe70X%@2B>YG%28%*TQKpH9RGx$`U#~$_J;Ym*VD>;*lNYT-V1+s5WA)pv3h#q!=1quX-V2 zEVS9K1|+@GZYL#!4SHxNrrH4dn;MFJWEui?qh)BJXZS)pd}UYN@@)&a-f)wG?)q@Z z>qxnB2m2}`~yV?0gSq{2TPIV(dCE48l zeiB#m7!|6-Bb_g9;B03XuN-XN3TA6LrI^dFlB8<9*hp7f+E{OW3uP_NQ z1mnRCn*X$K|FyO_oG!tZ9;_Z>s8sh9(NK3{u~l2&9O#j{u0@4L-DifZlxY5LIWS$H z2g>~$FyJsb7`%zd2Ut)p1}#&xN5WP0kY+MIY~T>-G#OBU8%9nN^c5hc8kFp#qr|#4 z(>Sf5GUR?bPA{iDQ&{k0ssd>M$^FGIBiBzf3~^Eih)RVL$8&aCfH5kZ3dS>FfDORM zMePp?lPW|YZkvcnMqZLaLA*1SY%zUE1T&E)y5&gH+JU?#t0lU~PNYVyarmRwO*%?k zZ4|CbBbG~FfYfJQk4KpFf$)~=h}3**IySqLUUf_@s={d&_Zm7}qTC&`smHV^57M?% zmQcXS-+hQRAyDtciSsyhyAP3pIUPHBkIUy&^|c`zJ3qI$**WH+7|=xMk+}X)K{&xqF@Wg-PYJ|S^9d%-7Km5X#- zr&Tud8buskaQd--5RS*ibrf?`b|wu7((h%d!3ZQNYNc^aCJFcf4;~y(iE$jFIr0nX zw<$T)FpYE6vLoXyA z1F$uT>542Z*euf_-m`7%x%x&IDL`61_>9XeCgAvuAPu%`+%VE+0Bv-bAR1I~qE!7X zrZmM@ncYR5s!?=}hb7__ythbxiFkv<7U^%=94C>YZw(^G26k~yR{1twPPmkSIfw~f zQm!+nt6l}wcctUAP{I@$99{?XVXHVL3=qMVtZUGe! z`1y0fFP;;A`JC{pi!=N9&Hek^#~&`vH+K&Y^6~cF)7>{0udnXk-#z@W`+4TS|L*Sb z{@cfkbM=p}@4kDw|Mvau!^JPE+rK~EJ-++?;o?j@KHa~&{rc(hgT_nNcsbU1`9b3) kYrNcRy!@c?pGQYO9v%I3^y25EPyTiE;@?Lv{&V!=f7onI82|tP literal 0 HcmV?d00001 diff --git a/data/stockpiles/flux.dfstock b/data/stockpiles/flux.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..0b074cca483267b074385f1543378ecde4da6ff7 GIT binary patch literal 118 zcmXqt=Mwhx^AB=&^z(GK^6~U_4G!`5bLA332)g+D`1^W>xN`9$#GE}GeZ08@5CXoA oK~6rdT!IJ@XGb4rpsopwj58P+7cercU}V_9$hd=%;Q%8803BT&_W%F@ literal 0 HcmV?d00001 diff --git a/data/stockpiles/foodprefix.dfstock b/data/stockpiles/foodprefix.dfstock new file mode 100644 index 000000000..9333d0c61 --- /dev/null +++ b/data/stockpiles/foodprefix.dfstock @@ -0,0 +1,18619 @@ +©À- +PLANT:WORMY TENDRILS:STRUCTURAL +PLANT:EYEBALL:STRUCTURAL +CREATURE:TOAD:MUSCLE +CREATURE:TOAD:EYE +CREATURE:TOAD:BRAIN +CREATURE:TOAD:LUNG +CREATURE:TOAD:HEART +CREATURE:TOAD:LIVER +CREATURE:TOAD:GUT +CREATURE:TOAD:STOMACH +CREATURE:TOAD:GIZZARD +CREATURE:TOAD:PANCREAS +CREATURE:TOAD:SPLEEN +CREATURE:TOAD:KIDNEY +CREATURE:TOAD_MAN:MUSCLE +CREATURE:TOAD_MAN:EYE +CREATURE:TOAD_MAN:BRAIN +CREATURE:TOAD_MAN:LUNG +CREATURE:TOAD_MAN:HEART +CREATURE:TOAD_MAN:LIVER +CREATURE:TOAD_MAN:GUT +CREATURE:TOAD_MAN:STOMACH +CREATURE:TOAD_MAN:GIZZARD +CREATURE:TOAD_MAN:PANCREAS +CREATURE:TOAD_MAN:SPLEEN +CREATURE:TOAD_MAN:KIDNEY +CREATURE:GIANT_TOAD:MUSCLE +CREATURE:GIANT_TOAD:EYE +CREATURE:GIANT_TOAD:BRAIN +CREATURE:GIANT_TOAD:LUNG +CREATURE:GIANT_TOAD:HEART +CREATURE:GIANT_TOAD:LIVER +CREATURE:GIANT_TOAD:GUT +CREATURE:GIANT_TOAD:STOMACH +CREATURE:GIANT_TOAD:GIZZARD +CREATURE:GIANT_TOAD:PANCREAS +CREATURE:GIANT_TOAD:SPLEEN +CREATURE:GIANT_TOAD:KIDNEY +CREATURE:WORM:MUSCLE +CREATURE:WORM:EYE +CREATURE:WORM:BRAIN +CREATURE:WORM:LUNG +CREATURE:WORM:HEART +CREATURE:WORM:LIVER +CREATURE:WORM:GUT +CREATURE:WORM:STOMACH +CREATURE:WORM:GIZZARD +CREATURE:WORM:PANCREAS +CREATURE:WORM:SPLEEN +CREATURE:WORM:KIDNEY +CREATURE:WORM_MAN:MUSCLE +CREATURE:WORM_MAN:EYE +CREATURE:WORM_MAN:BRAIN +CREATURE:WORM_MAN:LUNG +CREATURE:WORM_MAN:HEART +CREATURE:WORM_MAN:LIVER +CREATURE:WORM_MAN:GUT +CREATURE:WORM_MAN:STOMACH +CREATURE:WORM_MAN:GIZZARD +CREATURE:WORM_MAN:PANCREAS +CREATURE:WORM_MAN:SPLEEN +CREATURE:WORM_MAN:KIDNEY +CREATURE:BIRD_BLUEJAY:MUSCLE +CREATURE:BIRD_BLUEJAY:EYE +CREATURE:BIRD_BLUEJAY:BRAIN +CREATURE:BIRD_BLUEJAY:LUNG +CREATURE:BIRD_BLUEJAY:HEART +CREATURE:BIRD_BLUEJAY:LIVER +CREATURE:BIRD_BLUEJAY:GUT +CREATURE:BIRD_BLUEJAY:STOMACH +CREATURE:BIRD_BLUEJAY:GIZZARD +CREATURE:BIRD_BLUEJAY:PANCREAS +CREATURE:BIRD_BLUEJAY:SPLEEN +CREATURE:BIRD_BLUEJAY:KIDNEY +CREATURE:BLUEJAY_MAN:MUSCLE +CREATURE:BLUEJAY_MAN:EYE +CREATURE:BLUEJAY_MAN:BRAIN +CREATURE:BLUEJAY_MAN:LUNG +CREATURE:BLUEJAY_MAN:HEART +CREATURE:BLUEJAY_MAN:LIVER +CREATURE:BLUEJAY_MAN:GUT +CREATURE:BLUEJAY_MAN:STOMACH +CREATURE:BLUEJAY_MAN:GIZZARD +CREATURE:BLUEJAY_MAN:PANCREAS +CREATURE:BLUEJAY_MAN:SPLEEN +CREATURE:BLUEJAY_MAN:KIDNEY +CREATURE:GIANT_BLUEJAY:MUSCLE +CREATURE:GIANT_BLUEJAY:EYE +CREATURE:GIANT_BLUEJAY:BRAIN +CREATURE:GIANT_BLUEJAY:LUNG +CREATURE:GIANT_BLUEJAY:HEART +CREATURE:GIANT_BLUEJAY:LIVER +CREATURE:GIANT_BLUEJAY:GUT +CREATURE:GIANT_BLUEJAY:STOMACH +CREATURE:GIANT_BLUEJAY:GIZZARD +CREATURE:GIANT_BLUEJAY:PANCREAS +CREATURE:GIANT_BLUEJAY:SPLEEN +CREATURE:GIANT_BLUEJAY:KIDNEY +CREATURE:BIRD_CARDINAL:MUSCLE +CREATURE:BIRD_CARDINAL:EYE +CREATURE:BIRD_CARDINAL:BRAIN +CREATURE:BIRD_CARDINAL:LUNG +CREATURE:BIRD_CARDINAL:HEART +CREATURE:BIRD_CARDINAL:LIVER +CREATURE:BIRD_CARDINAL:GUT +CREATURE:BIRD_CARDINAL:STOMACH +CREATURE:BIRD_CARDINAL:GIZZARD +CREATURE:BIRD_CARDINAL:PANCREAS +CREATURE:BIRD_CARDINAL:SPLEEN +CREATURE:BIRD_CARDINAL:KIDNEY +CREATURE:CARDINAL_MAN:MUSCLE +CREATURE:CARDINAL_MAN:EYE +CREATURE:CARDINAL_MAN:BRAIN +CREATURE:CARDINAL_MAN:LUNG +CREATURE:CARDINAL_MAN:HEART +CREATURE:CARDINAL_MAN:LIVER +CREATURE:CARDINAL_MAN:GUT +CREATURE:CARDINAL_MAN:STOMACH +CREATURE:CARDINAL_MAN:GIZZARD +CREATURE:CARDINAL_MAN:PANCREAS +CREATURE:CARDINAL_MAN:SPLEEN +CREATURE:CARDINAL_MAN:KIDNEY +CREATURE:GIANT_CARDINAL:MUSCLE +CREATURE:GIANT_CARDINAL:EYE +CREATURE:GIANT_CARDINAL:BRAIN +CREATURE:GIANT_CARDINAL:LUNG +CREATURE:GIANT_CARDINAL:HEART +CREATURE:GIANT_CARDINAL:LIVER +CREATURE:GIANT_CARDINAL:GUT +CREATURE:GIANT_CARDINAL:STOMACH +CREATURE:GIANT_CARDINAL:GIZZARD + CREATURE:GIANT_CARDINAL:PANCREAS +CREATURE:GIANT_CARDINAL:SPLEEN +CREATURE:GIANT_CARDINAL:KIDNEY +CREATURE:BIRD_GRACKLE:MUSCLE +CREATURE:BIRD_GRACKLE:EYE +CREATURE:BIRD_GRACKLE:BRAIN +CREATURE:BIRD_GRACKLE:LUNG +CREATURE:BIRD_GRACKLE:HEART +CREATURE:BIRD_GRACKLE:LIVER +CREATURE:BIRD_GRACKLE:GUT +CREATURE:BIRD_GRACKLE:STOMACH +CREATURE:BIRD_GRACKLE:GIZZARD +CREATURE:BIRD_GRACKLE:PANCREAS +CREATURE:BIRD_GRACKLE:SPLEEN +CREATURE:BIRD_GRACKLE:KIDNEY +CREATURE:GRACKLE_MAN:MUSCLE +CREATURE:GRACKLE_MAN:EYE +CREATURE:GRACKLE_MAN:BRAIN +CREATURE:GRACKLE_MAN:LUNG +CREATURE:GRACKLE_MAN:HEART +CREATURE:GRACKLE_MAN:LIVER +CREATURE:GRACKLE_MAN:GUT +CREATURE:GRACKLE_MAN:STOMACH +CREATURE:GRACKLE_MAN:GIZZARD +CREATURE:GRACKLE_MAN:PANCREAS +CREATURE:GRACKLE_MAN:SPLEEN +CREATURE:GRACKLE_MAN:KIDNEY +CREATURE:GIANT_GRACKLE:MUSCLE +CREATURE:GIANT_GRACKLE:EYE +CREATURE:GIANT_GRACKLE:BRAIN +CREATURE:GIANT_GRACKLE:LUNG +CREATURE:GIANT_GRACKLE:HEART +CREATURE:GIANT_GRACKLE:LIVER +CREATURE:GIANT_GRACKLE:GUT +CREATURE:GIANT_GRACKLE:STOMACH +CREATURE:GIANT_GRACKLE:GIZZARD +CREATURE:GIANT_GRACKLE:PANCREAS +CREATURE:GIANT_GRACKLE:SPLEEN +CREATURE:GIANT_GRACKLE:KIDNEY +CREATURE:BIRD_ORIOLE:MUSCLE +CREATURE:BIRD_ORIOLE:EYE +CREATURE:BIRD_ORIOLE:BRAIN +CREATURE:BIRD_ORIOLE:LUNG +CREATURE:BIRD_ORIOLE:HEART +CREATURE:BIRD_ORIOLE:LIVER +CREATURE:BIRD_ORIOLE:GUT +CREATURE:BIRD_ORIOLE:STOMACH +CREATURE:BIRD_ORIOLE:GIZZARD +CREATURE:BIRD_ORIOLE:PANCREAS +CREATURE:BIRD_ORIOLE:SPLEEN +CREATURE:BIRD_ORIOLE:KIDNEY +CREATURE:ORIOLE_MAN:MUSCLE +CREATURE:ORIOLE_MAN:EYE +CREATURE:ORIOLE_MAN:BRAIN +CREATURE:ORIOLE_MAN:LUNG +CREATURE:ORIOLE_MAN:HEART +CREATURE:ORIOLE_MAN:LIVER +CREATURE:ORIOLE_MAN:GUT +CREATURE:ORIOLE_MAN:STOMACH +CREATURE:ORIOLE_MAN:GIZZARD +CREATURE:ORIOLE_MAN:PANCREAS +CREATURE:ORIOLE_MAN:SPLEEN +CREATURE:ORIOLE_MAN:KIDNEY +CREATURE:GIANT_ORIOLE:MUSCLE +CREATURE:GIANT_ORIOLE:EYE +CREATURE:GIANT_ORIOLE:BRAIN +CREATURE:GIANT_ORIOLE:LUNG +CREATURE:GIANT_ORIOLE:HEART +CREATURE:GIANT_ORIOLE:LIVER +CREATURE:GIANT_ORIOLE:GUT +CREATURE:GIANT_ORIOLE:STOMACH +CREATURE:GIANT_ORIOLE:GIZZARD +CREATURE:GIANT_ORIOLE:PANCREAS +CREATURE:GIANT_ORIOLE:SPLEEN +CREATURE:GIANT_ORIOLE:KIDNEY +!CREATURE:BIRD_RW_BLACKBIRD:MUSCLE +CREATURE:BIRD_RW_BLACKBIRD:EYE + CREATURE:BIRD_RW_BLACKBIRD:BRAIN +CREATURE:BIRD_RW_BLACKBIRD:LUNG + CREATURE:BIRD_RW_BLACKBIRD:HEART + CREATURE:BIRD_RW_BLACKBIRD:LIVER +CREATURE:BIRD_RW_BLACKBIRD:GUT +"CREATURE:BIRD_RW_BLACKBIRD:STOMACH +"CREATURE:BIRD_RW_BLACKBIRD:GIZZARD +#CREATURE:BIRD_RW_BLACKBIRD:PANCREAS +!CREATURE:BIRD_RW_BLACKBIRD:SPLEEN +!CREATURE:BIRD_RW_BLACKBIRD:KIDNEY + CREATURE:RW_BLACKBIRD_MAN:MUSCLE +CREATURE:RW_BLACKBIRD_MAN:EYE +CREATURE:RW_BLACKBIRD_MAN:BRAIN +CREATURE:RW_BLACKBIRD_MAN:LUNG +CREATURE:RW_BLACKBIRD_MAN:HEART +CREATURE:RW_BLACKBIRD_MAN:LIVER +CREATURE:RW_BLACKBIRD_MAN:GUT +!CREATURE:RW_BLACKBIRD_MAN:STOMACH +!CREATURE:RW_BLACKBIRD_MAN:GIZZARD +"CREATURE:RW_BLACKBIRD_MAN:PANCREAS + CREATURE:RW_BLACKBIRD_MAN:SPLEEN + CREATURE:RW_BLACKBIRD_MAN:KIDNEY +"CREATURE:GIANT_RW_BLACKBIRD:MUSCLE +CREATURE:GIANT_RW_BLACKBIRD:EYE +!CREATURE:GIANT_RW_BLACKBIRD:BRAIN + CREATURE:GIANT_RW_BLACKBIRD:LUNG +!CREATURE:GIANT_RW_BLACKBIRD:HEART +!CREATURE:GIANT_RW_BLACKBIRD:LIVER +CREATURE:GIANT_RW_BLACKBIRD:GUT +#CREATURE:GIANT_RW_BLACKBIRD:STOMACH +#CREATURE:GIANT_RW_BLACKBIRD:GIZZARD +$CREATURE:GIANT_RW_BLACKBIRD:PANCREAS +"CREATURE:GIANT_RW_BLACKBIRD:SPLEEN +"CREATURE:GIANT_RW_BLACKBIRD:KIDNEY +CREATURE:BIRD_PENGUIN:MUSCLE +CREATURE:BIRD_PENGUIN:EYE +CREATURE:BIRD_PENGUIN:BRAIN +CREATURE:BIRD_PENGUIN:LUNG +CREATURE:BIRD_PENGUIN:HEART +CREATURE:BIRD_PENGUIN:LIVER +CREATURE:BIRD_PENGUIN:GUT +CREATURE:BIRD_PENGUIN:STOMACH +CREATURE:BIRD_PENGUIN:GIZZARD +CREATURE:BIRD_PENGUIN:PANCREAS +CREATURE:BIRD_PENGUIN:SPLEEN +CREATURE:BIRD_PENGUIN:KIDNEY +#CREATURE:BIRD_PENGUIN_LITTLE:MUSCLE + CREATURE:BIRD_PENGUIN_LITTLE:EYE +"CREATURE:BIRD_PENGUIN_LITTLE:BRAIN +!CREATURE:BIRD_PENGUIN_LITTLE:LUNG +"CREATURE:BIRD_PENGUIN_LITTLE:HEART +"CREATURE:BIRD_PENGUIN_LITTLE:LIVER + CREATURE:BIRD_PENGUIN_LITTLE:GUT +$CREATURE:BIRD_PENGUIN_LITTLE:STOMACH +$CREATURE:BIRD_PENGUIN_LITTLE:GIZZARD +%CREATURE:BIRD_PENGUIN_LITTLE:PANCREAS +#CREATURE:BIRD_PENGUIN_LITTLE:SPLEEN +#CREATURE:BIRD_PENGUIN_LITTLE:KIDNEY +$CREATURE:BIRD_PENGUIN_EMPEROR:MUSCLE +!CREATURE:BIRD_PENGUIN_EMPEROR:EYE +#CREATURE:BIRD_PENGUIN_EMPEROR:BRAIN +"CREATURE:BIRD_PENGUIN_EMPEROR:LUNG +#CREATURE:BIRD_PENGUIN_EMPEROR:HEART +#CREATURE:BIRD_PENGUIN_EMPEROR:LIVER +!CREATURE:BIRD_PENGUIN_EMPEROR:GUT +%CREATURE:BIRD_PENGUIN_EMPEROR:STOMACH +%CREATURE:BIRD_PENGUIN_EMPEROR:GIZZARD +&CREATURE:BIRD_PENGUIN_EMPEROR:PANCREAS +$CREATURE:BIRD_PENGUIN_EMPEROR:SPLEEN +$CREATURE:BIRD_PENGUIN_EMPEROR:KIDNEY +CREATURE:PENGUIN MAN:MUSCLE +CREATURE:PENGUIN MAN:EYE +CREATURE:PENGUIN MAN:BRAIN +CREATURE:PENGUIN MAN:LUNG +CREATURE:PENGUIN MAN:HEART +CREATURE:PENGUIN MAN:LIVER +CREATURE:PENGUIN MAN:GUT +CREATURE:PENGUIN MAN:STOMACH +CREATURE:PENGUIN MAN:GIZZARD +CREATURE:PENGUIN MAN:PANCREAS +CREATURE:PENGUIN MAN:SPLEEN +CREATURE:PENGUIN MAN:KIDNEY +"CREATURE:BIRD_PENGUIN_GIANT:MUSCLE +CREATURE:BIRD_PENGUIN_GIANT:EYE +!CREATURE:BIRD_PENGUIN_GIANT:BRAIN + CREATURE:BIRD_PENGUIN_GIANT:LUNG +!CREATURE:BIRD_PENGUIN_GIANT:HEART +!CREATURE:BIRD_PENGUIN_GIANT:LIVER +CREATURE:BIRD_PENGUIN_GIANT:GUT +#CREATURE:BIRD_PENGUIN_GIANT:STOMACH +#CREATURE:BIRD_PENGUIN_GIANT:GIZZARD +$CREATURE:BIRD_PENGUIN_GIANT:PANCREAS +"CREATURE:BIRD_PENGUIN_GIANT:SPLEEN +"CREATURE:BIRD_PENGUIN_GIANT:KIDNEY +%CREATURE:BIRD_FALCON_PEREGRINE:MUSCLE +"CREATURE:BIRD_FALCON_PEREGRINE:EYE +$CREATURE:BIRD_FALCON_PEREGRINE:BRAIN +#CREATURE:BIRD_FALCON_PEREGRINE:LUNG +$CREATURE:BIRD_FALCON_PEREGRINE:HEART +$CREATURE:BIRD_FALCON_PEREGRINE:LIVER +"CREATURE:BIRD_FALCON_PEREGRINE:GUT +&CREATURE:BIRD_FALCON_PEREGRINE:STOMACH +&CREATURE:BIRD_FALCON_PEREGRINE:GIZZARD +'CREATURE:BIRD_FALCON_PEREGRINE:PANCREAS +%CREATURE:BIRD_FALCON_PEREGRINE:SPLEEN +%CREATURE:BIRD_FALCON_PEREGRINE:KIDNEY +$CREATURE:PEREGRINE FALCON MAN:MUSCLE +!CREATURE:PEREGRINE FALCON MAN:EYE +#CREATURE:PEREGRINE FALCON MAN:BRAIN +"CREATURE:PEREGRINE FALCON MAN:LUNG +#CREATURE:PEREGRINE FALCON MAN:HEART +#CREATURE:PEREGRINE FALCON MAN:LIVER +!CREATURE:PEREGRINE FALCON MAN:GUT +%CREATURE:PEREGRINE FALCON MAN:STOMACH +%CREATURE:PEREGRINE FALCON MAN:GIZZARD +&CREATURE:PEREGRINE FALCON MAN:PANCREAS +$CREATURE:PEREGRINE FALCON MAN:SPLEEN +$CREATURE:PEREGRINE FALCON MAN:KIDNEY +&CREATURE:GIANT PEREGRINE FALCON:MUSCLE +#CREATURE:GIANT PEREGRINE FALCON:EYE +%CREATURE:GIANT PEREGRINE FALCON:BRAIN +$CREATURE:GIANT PEREGRINE FALCON:LUNG +%CREATURE:GIANT PEREGRINE FALCON:HEART +%CREATURE:GIANT PEREGRINE FALCON:LIVER +#CREATURE:GIANT PEREGRINE FALCON:GUT +'CREATURE:GIANT PEREGRINE FALCON:STOMACH +'CREATURE:GIANT PEREGRINE FALCON:GIZZARD +(CREATURE:GIANT PEREGRINE FALCON:PANCREAS +&CREATURE:GIANT PEREGRINE FALCON:SPLEEN +&CREATURE:GIANT PEREGRINE FALCON:KIDNEY +CREATURE:BIRD_KIWI:MUSCLE +CREATURE:BIRD_KIWI:EYE +CREATURE:BIRD_KIWI:BRAIN +CREATURE:BIRD_KIWI:LUNG +CREATURE:BIRD_KIWI:HEART +CREATURE:BIRD_KIWI:LIVER +CREATURE:BIRD_KIWI:GUT +CREATURE:BIRD_KIWI:STOMACH +CREATURE:BIRD_KIWI:GIZZARD +CREATURE:BIRD_KIWI:PANCREAS +CREATURE:BIRD_KIWI:SPLEEN +CREATURE:BIRD_KIWI:KIDNEY +CREATURE:KIWI MAN:MUSCLE +CREATURE:KIWI MAN:EYE +CREATURE:KIWI MAN:BRAIN +CREATURE:KIWI MAN:LUNG +CREATURE:KIWI MAN:HEART +CREATURE:KIWI MAN:LIVER +CREATURE:KIWI MAN:GUT +CREATURE:KIWI MAN:STOMACH +CREATURE:KIWI MAN:GIZZARD +CREATURE:KIWI MAN:PANCREAS +CREATURE:KIWI MAN:SPLEEN +CREATURE:KIWI MAN:KIDNEY +CREATURE:BIRD_KIWI_GIANT:MUSCLE +CREATURE:BIRD_KIWI_GIANT:EYE +CREATURE:BIRD_KIWI_GIANT:BRAIN +CREATURE:BIRD_KIWI_GIANT:LUNG +CREATURE:BIRD_KIWI_GIANT:HEART +CREATURE:BIRD_KIWI_GIANT:LIVER +CREATURE:BIRD_KIWI_GIANT:GUT + CREATURE:BIRD_KIWI_GIANT:STOMACH + CREATURE:BIRD_KIWI_GIANT:GIZZARD +!CREATURE:BIRD_KIWI_GIANT:PANCREAS +CREATURE:BIRD_KIWI_GIANT:SPLEEN +CREATURE:BIRD_KIWI_GIANT:KIDNEY +CREATURE:BIRD_OSTRICH:MUSCLE +CREATURE:BIRD_OSTRICH:EYE +CREATURE:BIRD_OSTRICH:BRAIN +CREATURE:BIRD_OSTRICH:LUNG +CREATURE:BIRD_OSTRICH:HEART +CREATURE:BIRD_OSTRICH:LIVER +CREATURE:BIRD_OSTRICH:GUT +CREATURE:BIRD_OSTRICH:STOMACH +CREATURE:BIRD_OSTRICH:GIZZARD +CREATURE:BIRD_OSTRICH:PANCREAS +CREATURE:BIRD_OSTRICH:SPLEEN +CREATURE:BIRD_OSTRICH:KIDNEY +CREATURE:OSTRICH MAN:MUSCLE +CREATURE:OSTRICH MAN:EYE +CREATURE:OSTRICH MAN:BRAIN +CREATURE:OSTRICH MAN:LUNG +CREATURE:OSTRICH MAN:HEART +CREATURE:OSTRICH MAN:LIVER +CREATURE:OSTRICH MAN:GUT +CREATURE:OSTRICH MAN:STOMACH +CREATURE:OSTRICH MAN:GIZZARD +CREATURE:OSTRICH MAN:PANCREAS +CREATURE:OSTRICH MAN:SPLEEN +CREATURE:OSTRICH MAN:KIDNEY +"CREATURE:BIRD_OSTRICH_GIANT:MUSCLE +CREATURE:BIRD_OSTRICH_GIANT:EYE +!CREATURE:BIRD_OSTRICH_GIANT:BRAIN + CREATURE:BIRD_OSTRICH_GIANT:LUNG +!CREATURE:BIRD_OSTRICH_GIANT:HEART +!CREATURE:BIRD_OSTRICH_GIANT:LIVER +CREATURE:BIRD_OSTRICH_GIANT:GUT +#CREATURE:BIRD_OSTRICH_GIANT:STOMACH +#CREATURE:BIRD_OSTRICH_GIANT:GIZZARD +$CREATURE:BIRD_OSTRICH_GIANT:PANCREAS +"CREATURE:BIRD_OSTRICH_GIANT:SPLEEN +"CREATURE:BIRD_OSTRICH_GIANT:KIDNEY +CREATURE:BIRD_CROW:MUSCLE +CREATURE:BIRD_CROW:EYE +CREATURE:BIRD_CROW:BRAIN +CREATURE:BIRD_CROW:LUNG +CREATURE:BIRD_CROW:HEART +CREATURE:BIRD_CROW:LIVER +CREATURE:BIRD_CROW:GUT +CREATURE:BIRD_CROW:STOMACH +CREATURE:BIRD_CROW:GIZZARD +CREATURE:BIRD_CROW:PANCREAS +CREATURE:BIRD_CROW:SPLEEN +CREATURE:BIRD_CROW:KIDNEY +CREATURE:CROW_MAN:MUSCLE +CREATURE:CROW_MAN:EYE +CREATURE:CROW_MAN:BRAIN +CREATURE:CROW_MAN:LUNG +CREATURE:CROW_MAN:HEART +CREATURE:CROW_MAN:LIVER +CREATURE:CROW_MAN:GUT +CREATURE:CROW_MAN:STOMACH +CREATURE:CROW_MAN:GIZZARD +CREATURE:CROW_MAN:PANCREAS +CREATURE:CROW_MAN:SPLEEN +CREATURE:CROW_MAN:KIDNEY +CREATURE:GIANT_CROW:MUSCLE +CREATURE:GIANT_CROW:EYE +CREATURE:GIANT_CROW:BRAIN +CREATURE:GIANT_CROW:LUNG +CREATURE:GIANT_CROW:HEART +CREATURE:GIANT_CROW:LIVER +CREATURE:GIANT_CROW:GUT +CREATURE:GIANT_CROW:STOMACH +CREATURE:GIANT_CROW:GIZZARD +CREATURE:GIANT_CROW:PANCREAS +CREATURE:GIANT_CROW:SPLEEN +CREATURE:GIANT_CROW:KIDNEY +CREATURE:BIRD_RAVEN:MUSCLE +CREATURE:BIRD_RAVEN:EYE +CREATURE:BIRD_RAVEN:BRAIN +CREATURE:BIRD_RAVEN:LUNG +CREATURE:BIRD_RAVEN:HEART +CREATURE:BIRD_RAVEN:LIVER +CREATURE:BIRD_RAVEN:GUT +CREATURE:BIRD_RAVEN:STOMACH +CREATURE:BIRD_RAVEN:GIZZARD +CREATURE:BIRD_RAVEN:PANCREAS +CREATURE:BIRD_RAVEN:SPLEEN +CREATURE:BIRD_RAVEN:KIDNEY +CREATURE:RAVEN_MAN:MUSCLE +CREATURE:RAVEN_MAN:EYE +CREATURE:RAVEN_MAN:BRAIN +CREATURE:RAVEN_MAN:LUNG +CREATURE:RAVEN_MAN:HEART +CREATURE:RAVEN_MAN:LIVER +CREATURE:RAVEN_MAN:GUT +CREATURE:RAVEN_MAN:STOMACH +CREATURE:RAVEN_MAN:GIZZARD +CREATURE:RAVEN_MAN:PANCREAS +CREATURE:RAVEN_MAN:SPLEEN +CREATURE:RAVEN_MAN:KIDNEY +CREATURE:GIANT_RAVEN:MUSCLE +CREATURE:GIANT_RAVEN:EYE +CREATURE:GIANT_RAVEN:BRAIN +CREATURE:GIANT_RAVEN:LUNG +CREATURE:GIANT_RAVEN:HEART +CREATURE:GIANT_RAVEN:LIVER +CREATURE:GIANT_RAVEN:GUT +CREATURE:GIANT_RAVEN:STOMACH +CREATURE:GIANT_RAVEN:GIZZARD +CREATURE:GIANT_RAVEN:PANCREAS +CREATURE:GIANT_RAVEN:SPLEEN +CREATURE:GIANT_RAVEN:KIDNEY +CREATURE:BIRD_CASSOWARY:MUSCLE +CREATURE:BIRD_CASSOWARY:EYE +CREATURE:BIRD_CASSOWARY:BRAIN +CREATURE:BIRD_CASSOWARY:LUNG +CREATURE:BIRD_CASSOWARY:HEART +CREATURE:BIRD_CASSOWARY:LIVER +CREATURE:BIRD_CASSOWARY:GUT +CREATURE:BIRD_CASSOWARY:STOMACH +CREATURE:BIRD_CASSOWARY:GIZZARD + CREATURE:BIRD_CASSOWARY:PANCREAS +CREATURE:BIRD_CASSOWARY:SPLEEN +CREATURE:BIRD_CASSOWARY:KIDNEY +CREATURE:CASSOWARY_MAN:MUSCLE +CREATURE:CASSOWARY_MAN:EYE +CREATURE:CASSOWARY_MAN:BRAIN +CREATURE:CASSOWARY_MAN:LUNG +CREATURE:CASSOWARY_MAN:HEART +CREATURE:CASSOWARY_MAN:LIVER +CREATURE:CASSOWARY_MAN:GUT +CREATURE:CASSOWARY_MAN:STOMACH +CREATURE:CASSOWARY_MAN:GIZZARD +CREATURE:CASSOWARY_MAN:PANCREAS +CREATURE:CASSOWARY_MAN:SPLEEN +CREATURE:CASSOWARY_MAN:KIDNEY +CREATURE:GIANT_CASSOWARY:MUSCLE +CREATURE:GIANT_CASSOWARY:EYE +CREATURE:GIANT_CASSOWARY:BRAIN +CREATURE:GIANT_CASSOWARY:LUNG +CREATURE:GIANT_CASSOWARY:HEART +CREATURE:GIANT_CASSOWARY:LIVER +CREATURE:GIANT_CASSOWARY:GUT + CREATURE:GIANT_CASSOWARY:STOMACH + CREATURE:GIANT_CASSOWARY:GIZZARD +!CREATURE:GIANT_CASSOWARY:PANCREAS +CREATURE:GIANT_CASSOWARY:SPLEEN +CREATURE:GIANT_CASSOWARY:KIDNEY +CREATURE:BIRD_KEA:MUSCLE +CREATURE:BIRD_KEA:EYE +CREATURE:BIRD_KEA:BRAIN +CREATURE:BIRD_KEA:LUNG +CREATURE:BIRD_KEA:HEART +CREATURE:BIRD_KEA:LIVER +CREATURE:BIRD_KEA:GUT +CREATURE:BIRD_KEA:STOMACH +CREATURE:BIRD_KEA:GIZZARD +CREATURE:BIRD_KEA:PANCREAS +CREATURE:BIRD_KEA:SPLEEN +CREATURE:BIRD_KEA:KIDNEY +CREATURE:KEA_MAN:MUSCLE +CREATURE:KEA_MAN:EYE +CREATURE:KEA_MAN:BRAIN +CREATURE:KEA_MAN:LUNG +CREATURE:KEA_MAN:HEART +CREATURE:KEA_MAN:LIVER +CREATURE:KEA_MAN:GUT +CREATURE:KEA_MAN:STOMACH +CREATURE:KEA_MAN:GIZZARD +CREATURE:KEA_MAN:PANCREAS +CREATURE:KEA_MAN:SPLEEN +CREATURE:KEA_MAN:KIDNEY +CREATURE:GIANT_KEA:MUSCLE +CREATURE:GIANT_KEA:EYE +CREATURE:GIANT_KEA:BRAIN +CREATURE:GIANT_KEA:LUNG +CREATURE:GIANT_KEA:HEART +CREATURE:GIANT_KEA:LIVER +CREATURE:GIANT_KEA:GUT +CREATURE:GIANT_KEA:STOMACH +CREATURE:GIANT_KEA:GIZZARD +CREATURE:GIANT_KEA:PANCREAS +CREATURE:GIANT_KEA:SPLEEN +CREATURE:GIANT_KEA:KIDNEY +CREATURE:BIRD_OWL_SNOWY:MUSCLE +CREATURE:BIRD_OWL_SNOWY:EYE +CREATURE:BIRD_OWL_SNOWY:BRAIN +CREATURE:BIRD_OWL_SNOWY:LUNG +CREATURE:BIRD_OWL_SNOWY:HEART +CREATURE:BIRD_OWL_SNOWY:LIVER +CREATURE:BIRD_OWL_SNOWY:GUT +CREATURE:BIRD_OWL_SNOWY:STOMACH +CREATURE:BIRD_OWL_SNOWY:GIZZARD + CREATURE:BIRD_OWL_SNOWY:PANCREAS +CREATURE:BIRD_OWL_SNOWY:SPLEEN +CREATURE:BIRD_OWL_SNOWY:KIDNEY +CREATURE:SNOWY_OWL_MAN:MUSCLE +CREATURE:SNOWY_OWL_MAN:EYE +CREATURE:SNOWY_OWL_MAN:BRAIN +CREATURE:SNOWY_OWL_MAN:LUNG +CREATURE:SNOWY_OWL_MAN:HEART +CREATURE:SNOWY_OWL_MAN:LIVER +CREATURE:SNOWY_OWL_MAN:GUT +CREATURE:SNOWY_OWL_MAN:STOMACH +CREATURE:SNOWY_OWL_MAN:GIZZARD +CREATURE:SNOWY_OWL_MAN:PANCREAS +CREATURE:SNOWY_OWL_MAN:SPLEEN +CREATURE:SNOWY_OWL_MAN:KIDNEY +CREATURE:GIANT_SNOWY_OWL:MUSCLE +CREATURE:GIANT_SNOWY_OWL:EYE +CREATURE:GIANT_SNOWY_OWL:BRAIN +CREATURE:GIANT_SNOWY_OWL:LUNG +CREATURE:GIANT_SNOWY_OWL:HEART +CREATURE:GIANT_SNOWY_OWL:LIVER +CREATURE:GIANT_SNOWY_OWL:GUT + CREATURE:GIANT_SNOWY_OWL:STOMACH + CREATURE:GIANT_SNOWY_OWL:GIZZARD +!CREATURE:GIANT_SNOWY_OWL:PANCREAS +CREATURE:GIANT_SNOWY_OWL:SPLEEN +CREATURE:GIANT_SNOWY_OWL:KIDNEY +CREATURE:SPARROW:MUSCLE +CREATURE:SPARROW:EYE +CREATURE:SPARROW:BRAIN +CREATURE:SPARROW:LUNG +CREATURE:SPARROW:HEART +CREATURE:SPARROW:LIVER +CREATURE:SPARROW:GUT +CREATURE:SPARROW:STOMACH +CREATURE:SPARROW:GIZZARD +CREATURE:SPARROW:PANCREAS +CREATURE:SPARROW:SPLEEN +CREATURE:SPARROW:KIDNEY +CREATURE:SPARROW_MAN:MUSCLE +CREATURE:SPARROW_MAN:EYE +CREATURE:SPARROW_MAN:BRAIN +CREATURE:SPARROW_MAN:LUNG +CREATURE:SPARROW_MAN:HEART +CREATURE:SPARROW_MAN:LIVER +CREATURE:SPARROW_MAN:GUT +CREATURE:SPARROW_MAN:STOMACH +CREATURE:SPARROW_MAN:GIZZARD +CREATURE:SPARROW_MAN:PANCREAS +CREATURE:SPARROW_MAN:SPLEEN +CREATURE:SPARROW_MAN:KIDNEY +CREATURE:GIANT_SPARROW:MUSCLE +CREATURE:GIANT_SPARROW:EYE +CREATURE:GIANT_SPARROW:BRAIN +CREATURE:GIANT_SPARROW:LUNG +CREATURE:GIANT_SPARROW:HEART +CREATURE:GIANT_SPARROW:LIVER +CREATURE:GIANT_SPARROW:GUT +CREATURE:GIANT_SPARROW:STOMACH +CREATURE:GIANT_SPARROW:GIZZARD +CREATURE:GIANT_SPARROW:PANCREAS +CREATURE:GIANT_SPARROW:SPLEEN +CREATURE:GIANT_SPARROW:KIDNEY + CREATURE:BIRD_STORK_WHITE:MUSCLE +CREATURE:BIRD_STORK_WHITE:EYE +CREATURE:BIRD_STORK_WHITE:BRAIN +CREATURE:BIRD_STORK_WHITE:LUNG +CREATURE:BIRD_STORK_WHITE:HEART +CREATURE:BIRD_STORK_WHITE:LIVER +CREATURE:BIRD_STORK_WHITE:GUT +!CREATURE:BIRD_STORK_WHITE:STOMACH +!CREATURE:BIRD_STORK_WHITE:GIZZARD +"CREATURE:BIRD_STORK_WHITE:PANCREAS + CREATURE:BIRD_STORK_WHITE:SPLEEN + CREATURE:BIRD_STORK_WHITE:KIDNEY +CREATURE:WHITE_STORK_MAN:MUSCLE +CREATURE:WHITE_STORK_MAN:EYE +CREATURE:WHITE_STORK_MAN:BRAIN +CREATURE:WHITE_STORK_MAN:LUNG +CREATURE:WHITE_STORK_MAN:HEART +CREATURE:WHITE_STORK_MAN:LIVER +CREATURE:WHITE_STORK_MAN:GUT + CREATURE:WHITE_STORK_MAN:STOMACH + CREATURE:WHITE_STORK_MAN:GIZZARD +!CREATURE:WHITE_STORK_MAN:PANCREAS +CREATURE:WHITE_STORK_MAN:SPLEEN +CREATURE:WHITE_STORK_MAN:KIDNEY +!CREATURE:GIANT_WHITE_STORK:MUSCLE +CREATURE:GIANT_WHITE_STORK:EYE + CREATURE:GIANT_WHITE_STORK:BRAIN +CREATURE:GIANT_WHITE_STORK:LUNG + CREATURE:GIANT_WHITE_STORK:HEART + CREATURE:GIANT_WHITE_STORK:LIVER +CREATURE:GIANT_WHITE_STORK:GUT +"CREATURE:GIANT_WHITE_STORK:STOMACH +"CREATURE:GIANT_WHITE_STORK:GIZZARD +#CREATURE:GIANT_WHITE_STORK:PANCREAS +!CREATURE:GIANT_WHITE_STORK:SPLEEN +!CREATURE:GIANT_WHITE_STORK:KIDNEY +CREATURE:BIRD_LOON:MUSCLE +CREATURE:BIRD_LOON:EYE +CREATURE:BIRD_LOON:BRAIN +CREATURE:BIRD_LOON:LUNG +CREATURE:BIRD_LOON:HEART +CREATURE:BIRD_LOON:LIVER +CREATURE:BIRD_LOON:GUT +CREATURE:BIRD_LOON:STOMACH +CREATURE:BIRD_LOON:GIZZARD +CREATURE:BIRD_LOON:PANCREAS +CREATURE:BIRD_LOON:SPLEEN +CREATURE:BIRD_LOON:KIDNEY +CREATURE:LOON_MAN:MUSCLE +CREATURE:LOON_MAN:EYE +CREATURE:LOON_MAN:BRAIN +CREATURE:LOON_MAN:LUNG +CREATURE:LOON_MAN:HEART +CREATURE:LOON_MAN:LIVER +CREATURE:LOON_MAN:GUT +CREATURE:LOON_MAN:STOMACH +CREATURE:LOON_MAN:GIZZARD +CREATURE:LOON_MAN:PANCREAS +CREATURE:LOON_MAN:SPLEEN +CREATURE:LOON_MAN:KIDNEY +CREATURE:GIANT_LOON:MUSCLE +CREATURE:GIANT_LOON:EYE +CREATURE:GIANT_LOON:BRAIN +CREATURE:GIANT_LOON:LUNG +CREATURE:GIANT_LOON:HEART +CREATURE:GIANT_LOON:LIVER +CREATURE:GIANT_LOON:GUT +CREATURE:GIANT_LOON:STOMACH +CREATURE:GIANT_LOON:GIZZARD +CREATURE:GIANT_LOON:PANCREAS +CREATURE:GIANT_LOON:SPLEEN +CREATURE:GIANT_LOON:KIDNEY +CREATURE:BIRD_OWL_BARN:MUSCLE +CREATURE:BIRD_OWL_BARN:EYE +CREATURE:BIRD_OWL_BARN:BRAIN +CREATURE:BIRD_OWL_BARN:LUNG +CREATURE:BIRD_OWL_BARN:HEART +CREATURE:BIRD_OWL_BARN:LIVER +CREATURE:BIRD_OWL_BARN:GUT +CREATURE:BIRD_OWL_BARN:STOMACH +CREATURE:BIRD_OWL_BARN:GIZZARD +CREATURE:BIRD_OWL_BARN:PANCREAS +CREATURE:BIRD_OWL_BARN:SPLEEN +CREATURE:BIRD_OWL_BARN:KIDNEY +CREATURE:BARN_OWL_MAN:MUSCLE +CREATURE:BARN_OWL_MAN:EYE +CREATURE:BARN_OWL_MAN:BRAIN +CREATURE:BARN_OWL_MAN:LUNG +CREATURE:BARN_OWL_MAN:HEART +CREATURE:BARN_OWL_MAN:LIVER +CREATURE:BARN_OWL_MAN:GUT +CREATURE:BARN_OWL_MAN:STOMACH +CREATURE:BARN_OWL_MAN:GIZZARD +CREATURE:BARN_OWL_MAN:PANCREAS +CREATURE:BARN_OWL_MAN:SPLEEN +CREATURE:BARN_OWL_MAN:KIDNEY +CREATURE:GIANT_BARN_OWL:MUSCLE +CREATURE:GIANT_BARN_OWL:EYE +CREATURE:GIANT_BARN_OWL:BRAIN +CREATURE:GIANT_BARN_OWL:LUNG +CREATURE:GIANT_BARN_OWL:HEART +CREATURE:GIANT_BARN_OWL:LIVER +CREATURE:GIANT_BARN_OWL:GUT +CREATURE:GIANT_BARN_OWL:STOMACH +CREATURE:GIANT_BARN_OWL:GIZZARD + CREATURE:GIANT_BARN_OWL:PANCREAS +CREATURE:GIANT_BARN_OWL:SPLEEN +CREATURE:GIANT_BARN_OWL:KIDNEY +CREATURE:BIRD_PARAKEET:MUSCLE +CREATURE:BIRD_PARAKEET:EYE +CREATURE:BIRD_PARAKEET:BRAIN +CREATURE:BIRD_PARAKEET:LUNG +CREATURE:BIRD_PARAKEET:HEART +CREATURE:BIRD_PARAKEET:LIVER +CREATURE:BIRD_PARAKEET:GUT +CREATURE:BIRD_PARAKEET:STOMACH +CREATURE:BIRD_PARAKEET:GIZZARD +CREATURE:BIRD_PARAKEET:PANCREAS +CREATURE:BIRD_PARAKEET:SPLEEN +CREATURE:BIRD_PARAKEET:KIDNEY +CREATURE:PARAKEET_MAN:MUSCLE +CREATURE:PARAKEET_MAN:EYE +CREATURE:PARAKEET_MAN:BRAIN +CREATURE:PARAKEET_MAN:LUNG +CREATURE:PARAKEET_MAN:HEART +CREATURE:PARAKEET_MAN:LIVER +CREATURE:PARAKEET_MAN:GUT +CREATURE:PARAKEET_MAN:STOMACH +CREATURE:PARAKEET_MAN:GIZZARD +CREATURE:PARAKEET_MAN:PANCREAS +CREATURE:PARAKEET_MAN:SPLEEN +CREATURE:PARAKEET_MAN:KIDNEY +CREATURE:GIANT_PARAKEET:MUSCLE +CREATURE:GIANT_PARAKEET:EYE +CREATURE:GIANT_PARAKEET:BRAIN +CREATURE:GIANT_PARAKEET:LUNG +CREATURE:GIANT_PARAKEET:HEART +CREATURE:GIANT_PARAKEET:LIVER +CREATURE:GIANT_PARAKEET:GUT +CREATURE:GIANT_PARAKEET:STOMACH +CREATURE:GIANT_PARAKEET:GIZZARD + CREATURE:GIANT_PARAKEET:PANCREAS +CREATURE:GIANT_PARAKEET:SPLEEN +CREATURE:GIANT_PARAKEET:KIDNEY +CREATURE:BIRD_KAKAPO:MUSCLE +CREATURE:BIRD_KAKAPO:EYE +CREATURE:BIRD_KAKAPO:BRAIN +CREATURE:BIRD_KAKAPO:LUNG +CREATURE:BIRD_KAKAPO:HEART +CREATURE:BIRD_KAKAPO:LIVER +CREATURE:BIRD_KAKAPO:GUT +CREATURE:BIRD_KAKAPO:STOMACH +CREATURE:BIRD_KAKAPO:GIZZARD +CREATURE:BIRD_KAKAPO:PANCREAS +CREATURE:BIRD_KAKAPO:SPLEEN +CREATURE:BIRD_KAKAPO:KIDNEY +CREATURE:KAKAPO_MAN:MUSCLE +CREATURE:KAKAPO_MAN:EYE +CREATURE:KAKAPO_MAN:BRAIN +CREATURE:KAKAPO_MAN:LUNG +CREATURE:KAKAPO_MAN:HEART +CREATURE:KAKAPO_MAN:LIVER +CREATURE:KAKAPO_MAN:GUT +CREATURE:KAKAPO_MAN:STOMACH +CREATURE:KAKAPO_MAN:GIZZARD +CREATURE:KAKAPO_MAN:PANCREAS +CREATURE:KAKAPO_MAN:SPLEEN +CREATURE:KAKAPO_MAN:KIDNEY +CREATURE:GIANT_KAKAPO:MUSCLE +CREATURE:GIANT_KAKAPO:EYE +CREATURE:GIANT_KAKAPO:BRAIN +CREATURE:GIANT_KAKAPO:LUNG +CREATURE:GIANT_KAKAPO:HEART +CREATURE:GIANT_KAKAPO:LIVER +CREATURE:GIANT_KAKAPO:GUT +CREATURE:GIANT_KAKAPO:STOMACH +CREATURE:GIANT_KAKAPO:GIZZARD +CREATURE:GIANT_KAKAPO:PANCREAS +CREATURE:GIANT_KAKAPO:SPLEEN +CREATURE:GIANT_KAKAPO:KIDNEY + CREATURE:BIRD_PARROT_GREY:MUSCLE +CREATURE:BIRD_PARROT_GREY:EYE +CREATURE:BIRD_PARROT_GREY:BRAIN +CREATURE:BIRD_PARROT_GREY:LUNG +CREATURE:BIRD_PARROT_GREY:HEART +CREATURE:BIRD_PARROT_GREY:LIVER +CREATURE:BIRD_PARROT_GREY:GUT +!CREATURE:BIRD_PARROT_GREY:STOMACH +!CREATURE:BIRD_PARROT_GREY:GIZZARD +"CREATURE:BIRD_PARROT_GREY:PANCREAS + CREATURE:BIRD_PARROT_GREY:SPLEEN + CREATURE:BIRD_PARROT_GREY:KIDNEY +CREATURE:GREY_PARROT_MAN:MUSCLE +CREATURE:GREY_PARROT_MAN:EYE +CREATURE:GREY_PARROT_MAN:BRAIN +CREATURE:GREY_PARROT_MAN:LUNG +CREATURE:GREY_PARROT_MAN:HEART +CREATURE:GREY_PARROT_MAN:LIVER +CREATURE:GREY_PARROT_MAN:GUT + CREATURE:GREY_PARROT_MAN:STOMACH + CREATURE:GREY_PARROT_MAN:GIZZARD +!CREATURE:GREY_PARROT_MAN:PANCREAS +CREATURE:GREY_PARROT_MAN:SPLEEN +CREATURE:GREY_PARROT_MAN:KIDNEY +!CREATURE:GIANT_GREY_PARROT:MUSCLE +CREATURE:GIANT_GREY_PARROT:EYE + CREATURE:GIANT_GREY_PARROT:BRAIN +CREATURE:GIANT_GREY_PARROT:LUNG + CREATURE:GIANT_GREY_PARROT:HEART + CREATURE:GIANT_GREY_PARROT:LIVER +CREATURE:GIANT_GREY_PARROT:GUT +"CREATURE:GIANT_GREY_PARROT:STOMACH +"CREATURE:GIANT_GREY_PARROT:GIZZARD +#CREATURE:GIANT_GREY_PARROT:PANCREAS +!CREATURE:GIANT_GREY_PARROT:SPLEEN +!CREATURE:GIANT_GREY_PARROT:KIDNEY +CREATURE:BIRD_PUFFIN:MUSCLE +CREATURE:BIRD_PUFFIN:EYE +CREATURE:BIRD_PUFFIN:BRAIN +CREATURE:BIRD_PUFFIN:LUNG +CREATURE:BIRD_PUFFIN:HEART +CREATURE:BIRD_PUFFIN:LIVER +CREATURE:BIRD_PUFFIN:GUT +CREATURE:BIRD_PUFFIN:STOMACH +CREATURE:BIRD_PUFFIN:GIZZARD +CREATURE:BIRD_PUFFIN:PANCREAS +CREATURE:BIRD_PUFFIN:SPLEEN +CREATURE:BIRD_PUFFIN:KIDNEY +CREATURE:PUFFIN_MAN:MUSCLE +CREATURE:PUFFIN_MAN:EYE +CREATURE:PUFFIN_MAN:BRAIN +CREATURE:PUFFIN_MAN:LUNG +CREATURE:PUFFIN_MAN:HEART +CREATURE:PUFFIN_MAN:LIVER +CREATURE:PUFFIN_MAN:GUT +CREATURE:PUFFIN_MAN:STOMACH +CREATURE:PUFFIN_MAN:GIZZARD +CREATURE:PUFFIN_MAN:PANCREAS +CREATURE:PUFFIN_MAN:SPLEEN +CREATURE:PUFFIN_MAN:KIDNEY +CREATURE:GIANT_PUFFIN:MUSCLE +CREATURE:GIANT_PUFFIN:EYE +CREATURE:GIANT_PUFFIN:BRAIN +CREATURE:GIANT_PUFFIN:LUNG +CREATURE:GIANT_PUFFIN:HEART +CREATURE:GIANT_PUFFIN:LIVER +CREATURE:GIANT_PUFFIN:GUT +CREATURE:GIANT_PUFFIN:STOMACH +CREATURE:GIANT_PUFFIN:GIZZARD +CREATURE:GIANT_PUFFIN:PANCREAS +CREATURE:GIANT_PUFFIN:SPLEEN +CREATURE:GIANT_PUFFIN:KIDNEY +CREATURE:BIRD_SWAN:MUSCLE +CREATURE:BIRD_SWAN:EYE +CREATURE:BIRD_SWAN:BRAIN +CREATURE:BIRD_SWAN:LUNG +CREATURE:BIRD_SWAN:HEART +CREATURE:BIRD_SWAN:LIVER +CREATURE:BIRD_SWAN:GUT +CREATURE:BIRD_SWAN:STOMACH +CREATURE:BIRD_SWAN:GIZZARD +CREATURE:BIRD_SWAN:PANCREAS +CREATURE:BIRD_SWAN:SPLEEN +CREATURE:BIRD_SWAN:KIDNEY +CREATURE:SWAN_MAN:MUSCLE +CREATURE:SWAN_MAN:EYE +CREATURE:SWAN_MAN:BRAIN +CREATURE:SWAN_MAN:LUNG +CREATURE:SWAN_MAN:HEART +CREATURE:SWAN_MAN:LIVER +CREATURE:SWAN_MAN:GUT +CREATURE:SWAN_MAN:STOMACH +CREATURE:SWAN_MAN:GIZZARD +CREATURE:SWAN_MAN:PANCREAS +CREATURE:SWAN_MAN:SPLEEN +CREATURE:SWAN_MAN:KIDNEY +CREATURE:GIANT_SWAN:MUSCLE +CREATURE:GIANT_SWAN:EYE +CREATURE:GIANT_SWAN:BRAIN +CREATURE:GIANT_SWAN:LUNG +CREATURE:GIANT_SWAN:HEART +CREATURE:GIANT_SWAN:LIVER +CREATURE:GIANT_SWAN:GUT +CREATURE:GIANT_SWAN:STOMACH +CREATURE:GIANT_SWAN:GIZZARD +CREATURE:GIANT_SWAN:PANCREAS +CREATURE:GIANT_SWAN:SPLEEN +CREATURE:GIANT_SWAN:KIDNEY +CREATURE:BIRD_LORIKEET:MUSCLE +CREATURE:BIRD_LORIKEET:EYE +CREATURE:BIRD_LORIKEET:BRAIN +CREATURE:BIRD_LORIKEET:LUNG +CREATURE:BIRD_LORIKEET:HEART +CREATURE:BIRD_LORIKEET:LIVER +CREATURE:BIRD_LORIKEET:GUT +CREATURE:BIRD_LORIKEET:STOMACH +CREATURE:BIRD_LORIKEET:GIZZARD +CREATURE:BIRD_LORIKEET:PANCREAS +CREATURE:BIRD_LORIKEET:SPLEEN +CREATURE:BIRD_LORIKEET:KIDNEY +CREATURE:LORIKEET_MAN:MUSCLE +CREATURE:LORIKEET_MAN:EYE +CREATURE:LORIKEET_MAN:BRAIN +CREATURE:LORIKEET_MAN:LUNG +CREATURE:LORIKEET_MAN:HEART +CREATURE:LORIKEET_MAN:LIVER +CREATURE:LORIKEET_MAN:GUT +CREATURE:LORIKEET_MAN:STOMACH +CREATURE:LORIKEET_MAN:GIZZARD +CREATURE:LORIKEET_MAN:PANCREAS +CREATURE:LORIKEET_MAN:SPLEEN +CREATURE:LORIKEET_MAN:KIDNEY +CREATURE:GIANT_LORIKEET:MUSCLE +CREATURE:GIANT_LORIKEET:EYE +CREATURE:GIANT_LORIKEET:BRAIN +CREATURE:GIANT_LORIKEET:LUNG +CREATURE:GIANT_LORIKEET:HEART +CREATURE:GIANT_LORIKEET:LIVER +CREATURE:GIANT_LORIKEET:GUT +CREATURE:GIANT_LORIKEET:STOMACH +CREATURE:GIANT_LORIKEET:GIZZARD + CREATURE:GIANT_LORIKEET:PANCREAS +CREATURE:GIANT_LORIKEET:SPLEEN +CREATURE:GIANT_LORIKEET:KIDNEY +CREATURE:BIRD_WREN:MUSCLE +CREATURE:BIRD_WREN:EYE +CREATURE:BIRD_WREN:BRAIN +CREATURE:BIRD_WREN:LUNG +CREATURE:BIRD_WREN:HEART +CREATURE:BIRD_WREN:LIVER +CREATURE:BIRD_WREN:GUT +CREATURE:BIRD_WREN:STOMACH +CREATURE:BIRD_WREN:GIZZARD +CREATURE:BIRD_WREN:PANCREAS +CREATURE:BIRD_WREN:SPLEEN +CREATURE:BIRD_WREN:KIDNEY +CREATURE:WREN_MAN:MUSCLE +CREATURE:WREN_MAN:EYE +CREATURE:WREN_MAN:BRAIN +CREATURE:WREN_MAN:LUNG +CREATURE:WREN_MAN:HEART +CREATURE:WREN_MAN:LIVER +CREATURE:WREN_MAN:GUT +CREATURE:WREN_MAN:STOMACH +CREATURE:WREN_MAN:GIZZARD +CREATURE:WREN_MAN:PANCREAS +CREATURE:WREN_MAN:SPLEEN +CREATURE:WREN_MAN:KIDNEY +CREATURE:GIANT_WREN:MUSCLE +CREATURE:GIANT_WREN:EYE +CREATURE:GIANT_WREN:BRAIN +CREATURE:GIANT_WREN:LUNG +CREATURE:GIANT_WREN:HEART +CREATURE:GIANT_WREN:LIVER +CREATURE:GIANT_WREN:GUT +CREATURE:GIANT_WREN:STOMACH +CREATURE:GIANT_WREN:GIZZARD +CREATURE:GIANT_WREN:PANCREAS +CREATURE:GIANT_WREN:SPLEEN +CREATURE:GIANT_WREN:KIDNEY +CREATURE:BIRD_OSPREY:MUSCLE +CREATURE:BIRD_OSPREY:EYE +CREATURE:BIRD_OSPREY:BRAIN +CREATURE:BIRD_OSPREY:LUNG +CREATURE:BIRD_OSPREY:HEART +CREATURE:BIRD_OSPREY:LIVER +CREATURE:BIRD_OSPREY:GUT +CREATURE:BIRD_OSPREY:STOMACH +CREATURE:BIRD_OSPREY:GIZZARD +CREATURE:BIRD_OSPREY:PANCREAS +CREATURE:BIRD_OSPREY:SPLEEN +CREATURE:BIRD_OSPREY:KIDNEY +CREATURE:OSPREY_MAN:MUSCLE +CREATURE:OSPREY_MAN:EYE +CREATURE:OSPREY_MAN:BRAIN +CREATURE:OSPREY_MAN:LUNG +CREATURE:OSPREY_MAN:HEART +CREATURE:OSPREY_MAN:LIVER +CREATURE:OSPREY_MAN:GUT +CREATURE:OSPREY_MAN:STOMACH +CREATURE:OSPREY_MAN:GIZZARD +CREATURE:OSPREY_MAN:PANCREAS +CREATURE:OSPREY_MAN:SPLEEN +CREATURE:OSPREY_MAN:KIDNEY +CREATURE:GIANT_OSPREY:MUSCLE +CREATURE:GIANT_OSPREY:EYE +CREATURE:GIANT_OSPREY:BRAIN +CREATURE:GIANT_OSPREY:LUNG +CREATURE:GIANT_OSPREY:HEART +CREATURE:GIANT_OSPREY:LIVER +CREATURE:GIANT_OSPREY:GUT +CREATURE:GIANT_OSPREY:STOMACH +CREATURE:GIANT_OSPREY:GIZZARD +CREATURE:GIANT_OSPREY:PANCREAS +CREATURE:GIANT_OSPREY:SPLEEN +CREATURE:GIANT_OSPREY:KIDNEY +CREATURE:BIRD_EMU:MUSCLE +CREATURE:BIRD_EMU:EYE +CREATURE:BIRD_EMU:BRAIN +CREATURE:BIRD_EMU:LUNG +CREATURE:BIRD_EMU:HEART +CREATURE:BIRD_EMU:LIVER +CREATURE:BIRD_EMU:GUT +CREATURE:BIRD_EMU:STOMACH +CREATURE:BIRD_EMU:GIZZARD +CREATURE:BIRD_EMU:PANCREAS +CREATURE:BIRD_EMU:SPLEEN +CREATURE:BIRD_EMU:KIDNEY +CREATURE:EMU_MAN:MUSCLE +CREATURE:EMU_MAN:EYE +CREATURE:EMU_MAN:BRAIN +CREATURE:EMU_MAN:LUNG +CREATURE:EMU_MAN:HEART +CREATURE:EMU_MAN:LIVER +CREATURE:EMU_MAN:GUT +CREATURE:EMU_MAN:STOMACH +CREATURE:EMU_MAN:GIZZARD +CREATURE:EMU_MAN:PANCREAS +CREATURE:EMU_MAN:SPLEEN +CREATURE:EMU_MAN:KIDNEY +CREATURE:GIANT_EMU:MUSCLE +CREATURE:GIANT_EMU:EYE +CREATURE:GIANT_EMU:BRAIN +CREATURE:GIANT_EMU:LUNG +CREATURE:GIANT_EMU:HEART +CREATURE:GIANT_EMU:LIVER +CREATURE:GIANT_EMU:GUT +CREATURE:GIANT_EMU:STOMACH +CREATURE:GIANT_EMU:GIZZARD +CREATURE:GIANT_EMU:PANCREAS +CREATURE:GIANT_EMU:SPLEEN +CREATURE:GIANT_EMU:KIDNEY +CREATURE:BIRD_COCKATIEL:MUSCLE +CREATURE:BIRD_COCKATIEL:EYE +CREATURE:BIRD_COCKATIEL:BRAIN +CREATURE:BIRD_COCKATIEL:LUNG +CREATURE:BIRD_COCKATIEL:HEART +CREATURE:BIRD_COCKATIEL:LIVER +CREATURE:BIRD_COCKATIEL:GUT +CREATURE:BIRD_COCKATIEL:STOMACH +CREATURE:BIRD_COCKATIEL:GIZZARD + CREATURE:BIRD_COCKATIEL:PANCREAS +CREATURE:BIRD_COCKATIEL:SPLEEN +CREATURE:BIRD_COCKATIEL:KIDNEY +CREATURE:COCKATIEL_MAN:MUSCLE +CREATURE:COCKATIEL_MAN:EYE +CREATURE:COCKATIEL_MAN:BRAIN +CREATURE:COCKATIEL_MAN:LUNG +CREATURE:COCKATIEL_MAN:HEART +CREATURE:COCKATIEL_MAN:LIVER +CREATURE:COCKATIEL_MAN:GUT +CREATURE:COCKATIEL_MAN:STOMACH +CREATURE:COCKATIEL_MAN:GIZZARD +CREATURE:COCKATIEL_MAN:PANCREAS +CREATURE:COCKATIEL_MAN:SPLEEN +CREATURE:COCKATIEL_MAN:KIDNEY +CREATURE:GIANT_COCKATIEL:MUSCLE +CREATURE:GIANT_COCKATIEL:EYE +CREATURE:GIANT_COCKATIEL:BRAIN +CREATURE:GIANT_COCKATIEL:LUNG +CREATURE:GIANT_COCKATIEL:HEART +CREATURE:GIANT_COCKATIEL:LIVER +CREATURE:GIANT_COCKATIEL:GUT + CREATURE:GIANT_COCKATIEL:STOMACH + CREATURE:GIANT_COCKATIEL:GIZZARD +!CREATURE:GIANT_COCKATIEL:PANCREAS +CREATURE:GIANT_COCKATIEL:SPLEEN +CREATURE:GIANT_COCKATIEL:KIDNEY +)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:MUSCLE +&CREATURE:BIRD_LOVEBIRD_PEACH-FACED:EYE +(CREATURE:BIRD_LOVEBIRD_PEACH-FACED:BRAIN +'CREATURE:BIRD_LOVEBIRD_PEACH-FACED:LUNG +(CREATURE:BIRD_LOVEBIRD_PEACH-FACED:HEART +(CREATURE:BIRD_LOVEBIRD_PEACH-FACED:LIVER +&CREATURE:BIRD_LOVEBIRD_PEACH-FACED:GUT +*CREATURE:BIRD_LOVEBIRD_PEACH-FACED:STOMACH +*CREATURE:BIRD_LOVEBIRD_PEACH-FACED:GIZZARD ++CREATURE:BIRD_LOVEBIRD_PEACH-FACED:PANCREAS +)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:SPLEEN +)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:KIDNEY +(CREATURE:PEACH-FACED_LOVEBIRD_MAN:MUSCLE +%CREATURE:PEACH-FACED_LOVEBIRD_MAN:EYE +'CREATURE:PEACH-FACED_LOVEBIRD_MAN:BRAIN +&CREATURE:PEACH-FACED_LOVEBIRD_MAN:LUNG +'CREATURE:PEACH-FACED_LOVEBIRD_MAN:HEART +'CREATURE:PEACH-FACED_LOVEBIRD_MAN:LIVER +%CREATURE:PEACH-FACED_LOVEBIRD_MAN:GUT +)CREATURE:PEACH-FACED_LOVEBIRD_MAN:STOMACH +)CREATURE:PEACH-FACED_LOVEBIRD_MAN:GIZZARD +*CREATURE:PEACH-FACED_LOVEBIRD_MAN:PANCREAS +(CREATURE:PEACH-FACED_LOVEBIRD_MAN:SPLEEN +(CREATURE:PEACH-FACED_LOVEBIRD_MAN:KIDNEY +*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:MUSCLE +'CREATURE:GIANT_PEACH-FACED_LOVEBIRD:EYE +)CREATURE:GIANT_PEACH-FACED_LOVEBIRD:BRAIN +(CREATURE:GIANT_PEACH-FACED_LOVEBIRD:LUNG +)CREATURE:GIANT_PEACH-FACED_LOVEBIRD:HEART +)CREATURE:GIANT_PEACH-FACED_LOVEBIRD:LIVER +'CREATURE:GIANT_PEACH-FACED_LOVEBIRD:GUT ++CREATURE:GIANT_PEACH-FACED_LOVEBIRD:STOMACH ++CREATURE:GIANT_PEACH-FACED_LOVEBIRD:GIZZARD +,CREATURE:GIANT_PEACH-FACED_LOVEBIRD:PANCREAS +*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:SPLEEN +*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:KIDNEY +CREATURE:BIRD_MAGPIE:MUSCLE +CREATURE:BIRD_MAGPIE:EYE +CREATURE:BIRD_MAGPIE:BRAIN +CREATURE:BIRD_MAGPIE:LUNG +CREATURE:BIRD_MAGPIE:HEART +CREATURE:BIRD_MAGPIE:LIVER +CREATURE:BIRD_MAGPIE:GUT +CREATURE:BIRD_MAGPIE:STOMACH +CREATURE:BIRD_MAGPIE:GIZZARD +CREATURE:BIRD_MAGPIE:PANCREAS +CREATURE:BIRD_MAGPIE:SPLEEN +CREATURE:BIRD_MAGPIE:KIDNEY +CREATURE:MAGPIE_MAN:MUSCLE +CREATURE:MAGPIE_MAN:EYE +CREATURE:MAGPIE_MAN:BRAIN +CREATURE:MAGPIE_MAN:LUNG +CREATURE:MAGPIE_MAN:HEART +CREATURE:MAGPIE_MAN:LIVER +CREATURE:MAGPIE_MAN:GUT +CREATURE:MAGPIE_MAN:STOMACH +CREATURE:MAGPIE_MAN:GIZZARD +CREATURE:MAGPIE_MAN:PANCREAS +CREATURE:MAGPIE_MAN:SPLEEN +CREATURE:MAGPIE_MAN:KIDNEY +CREATURE:GIANT_MAGPIE:MUSCLE +CREATURE:GIANT_MAGPIE:EYE +CREATURE:GIANT_MAGPIE:BRAIN +CREATURE:GIANT_MAGPIE:LUNG +CREATURE:GIANT_MAGPIE:HEART +CREATURE:GIANT_MAGPIE:LIVER +CREATURE:GIANT_MAGPIE:GUT +CREATURE:GIANT_MAGPIE:STOMACH +CREATURE:GIANT_MAGPIE:GIZZARD +CREATURE:GIANT_MAGPIE:PANCREAS +CREATURE:GIANT_MAGPIE:SPLEEN +CREATURE:GIANT_MAGPIE:KIDNEY +CREATURE:BIRD_KESTREL:MUSCLE +CREATURE:BIRD_KESTREL:EYE +CREATURE:BIRD_KESTREL:BRAIN +CREATURE:BIRD_KESTREL:LUNG +CREATURE:BIRD_KESTREL:HEART +CREATURE:BIRD_KESTREL:LIVER +CREATURE:BIRD_KESTREL:GUT +CREATURE:BIRD_KESTREL:STOMACH +CREATURE:BIRD_KESTREL:GIZZARD +CREATURE:BIRD_KESTREL:PANCREAS +CREATURE:BIRD_KESTREL:SPLEEN +CREATURE:BIRD_KESTREL:KIDNEY +CREATURE:KESTREL_MAN:MUSCLE +CREATURE:KESTREL_MAN:EYE +CREATURE:KESTREL_MAN:BRAIN +CREATURE:KESTREL_MAN:LUNG +CREATURE:KESTREL_MAN:HEART +CREATURE:KESTREL_MAN:LIVER +CREATURE:KESTREL_MAN:GUT +CREATURE:KESTREL_MAN:STOMACH +CREATURE:KESTREL_MAN:GIZZARD +CREATURE:KESTREL_MAN:PANCREAS +CREATURE:KESTREL_MAN:SPLEEN +CREATURE:KESTREL_MAN:KIDNEY +CREATURE:GIANT_KESTREL:MUSCLE +CREATURE:GIANT_KESTREL:EYE +CREATURE:GIANT_KESTREL:BRAIN +CREATURE:GIANT_KESTREL:LUNG +CREATURE:GIANT_KESTREL:HEART +CREATURE:GIANT_KESTREL:LIVER +CREATURE:GIANT_KESTREL:GUT +CREATURE:GIANT_KESTREL:STOMACH +CREATURE:GIANT_KESTREL:GIZZARD +CREATURE:GIANT_KESTREL:PANCREAS +CREATURE:GIANT_KESTREL:SPLEEN +CREATURE:GIANT_KESTREL:KIDNEY +CREATURE:BIRD_ALBATROSS:MUSCLE +CREATURE:BIRD_ALBATROSS:EYE +CREATURE:BIRD_ALBATROSS:BRAIN +CREATURE:BIRD_ALBATROSS:LUNG +CREATURE:BIRD_ALBATROSS:HEART +CREATURE:BIRD_ALBATROSS:LIVER +CREATURE:BIRD_ALBATROSS:GUT +CREATURE:BIRD_ALBATROSS:STOMACH +CREATURE:BIRD_ALBATROSS:GIZZARD + CREATURE:BIRD_ALBATROSS:PANCREAS +CREATURE:BIRD_ALBATROSS:SPLEEN +CREATURE:BIRD_ALBATROSS:KIDNEY +CREATURE:ALBATROSS_MAN:MUSCLE +CREATURE:ALBATROSS_MAN:EYE +CREATURE:ALBATROSS_MAN:BRAIN +CREATURE:ALBATROSS_MAN:LUNG +CREATURE:ALBATROSS_MAN:HEART +CREATURE:ALBATROSS_MAN:LIVER +CREATURE:ALBATROSS_MAN:GUT +CREATURE:ALBATROSS_MAN:STOMACH +CREATURE:ALBATROSS_MAN:GIZZARD +CREATURE:ALBATROSS_MAN:PANCREAS +CREATURE:ALBATROSS_MAN:SPLEEN +CREATURE:ALBATROSS_MAN:KIDNEY +CREATURE:GIANT_ALBATROSS:MUSCLE +CREATURE:GIANT_ALBATROSS:EYE +CREATURE:GIANT_ALBATROSS:BRAIN +CREATURE:GIANT_ALBATROSS:LUNG +CREATURE:GIANT_ALBATROSS:HEART +CREATURE:GIANT_ALBATROSS:LIVER +CREATURE:GIANT_ALBATROSS:GUT + CREATURE:GIANT_ALBATROSS:STOMACH + CREATURE:GIANT_ALBATROSS:GIZZARD +!CREATURE:GIANT_ALBATROSS:PANCREAS +CREATURE:GIANT_ALBATROSS:SPLEEN +CREATURE:GIANT_ALBATROSS:KIDNEY +%CREATURE:BIRD_OWL_GREAT_HORNED:MUSCLE +"CREATURE:BIRD_OWL_GREAT_HORNED:EYE +$CREATURE:BIRD_OWL_GREAT_HORNED:BRAIN +#CREATURE:BIRD_OWL_GREAT_HORNED:LUNG +$CREATURE:BIRD_OWL_GREAT_HORNED:HEART +$CREATURE:BIRD_OWL_GREAT_HORNED:LIVER +"CREATURE:BIRD_OWL_GREAT_HORNED:GUT +&CREATURE:BIRD_OWL_GREAT_HORNED:STOMACH +&CREATURE:BIRD_OWL_GREAT_HORNED:GIZZARD +'CREATURE:BIRD_OWL_GREAT_HORNED:PANCREAS +%CREATURE:BIRD_OWL_GREAT_HORNED:SPLEEN +%CREATURE:BIRD_OWL_GREAT_HORNED:KIDNEY +$CREATURE:GREAT_HORNED_OWL_MAN:MUSCLE +!CREATURE:GREAT_HORNED_OWL_MAN:EYE +#CREATURE:GREAT_HORNED_OWL_MAN:BRAIN +"CREATURE:GREAT_HORNED_OWL_MAN:LUNG +#CREATURE:GREAT_HORNED_OWL_MAN:HEART +#CREATURE:GREAT_HORNED_OWL_MAN:LIVER +!CREATURE:GREAT_HORNED_OWL_MAN:GUT +%CREATURE:GREAT_HORNED_OWL_MAN:STOMACH +%CREATURE:GREAT_HORNED_OWL_MAN:GIZZARD +&CREATURE:GREAT_HORNED_OWL_MAN:PANCREAS +$CREATURE:GREAT_HORNED_OWL_MAN:SPLEEN +$CREATURE:GREAT_HORNED_OWL_MAN:KIDNEY +&CREATURE:GIANT_GREAT_HORNED_OWL:MUSCLE +#CREATURE:GIANT_GREAT_HORNED_OWL:EYE +%CREATURE:GIANT_GREAT_HORNED_OWL:BRAIN +$CREATURE:GIANT_GREAT_HORNED_OWL:LUNG +%CREATURE:GIANT_GREAT_HORNED_OWL:HEART +%CREATURE:GIANT_GREAT_HORNED_OWL:LIVER +#CREATURE:GIANT_GREAT_HORNED_OWL:GUT +'CREATURE:GIANT_GREAT_HORNED_OWL:STOMACH +'CREATURE:GIANT_GREAT_HORNED_OWL:GIZZARD +(CREATURE:GIANT_GREAT_HORNED_OWL:PANCREAS +&CREATURE:GIANT_GREAT_HORNED_OWL:SPLEEN +&CREATURE:GIANT_GREAT_HORNED_OWL:KIDNEY +CREATURE:BIRD_EAGLE:MUSCLE +CREATURE:BIRD_EAGLE:EYE +CREATURE:BIRD_EAGLE:BRAIN +CREATURE:BIRD_EAGLE:LUNG +CREATURE:BIRD_EAGLE:HEART +CREATURE:BIRD_EAGLE:LIVER +CREATURE:BIRD_EAGLE:GUT +CREATURE:BIRD_EAGLE:STOMACH +CREATURE:BIRD_EAGLE:GIZZARD +CREATURE:BIRD_EAGLE:PANCREAS +CREATURE:BIRD_EAGLE:SPLEEN +CREATURE:BIRD_EAGLE:KIDNEY +CREATURE:EAGLE_MAN:MUSCLE +CREATURE:EAGLE_MAN:EYE +CREATURE:EAGLE_MAN:BRAIN +CREATURE:EAGLE_MAN:LUNG +CREATURE:EAGLE_MAN:HEART +CREATURE:EAGLE_MAN:LIVER +CREATURE:EAGLE_MAN:GUT +CREATURE:EAGLE_MAN:STOMACH +CREATURE:EAGLE_MAN:GIZZARD +CREATURE:EAGLE_MAN:PANCREAS +CREATURE:EAGLE_MAN:SPLEEN +CREATURE:EAGLE_MAN:KIDNEY +CREATURE:GIANT_EAGLE:MUSCLE +CREATURE:GIANT_EAGLE:EYE +CREATURE:GIANT_EAGLE:BRAIN +CREATURE:GIANT_EAGLE:LUNG +CREATURE:GIANT_EAGLE:HEART +CREATURE:GIANT_EAGLE:LIVER +CREATURE:GIANT_EAGLE:GUT +CREATURE:GIANT_EAGLE:STOMACH +CREATURE:GIANT_EAGLE:GIZZARD +CREATURE:GIANT_EAGLE:PANCREAS +CREATURE:GIANT_EAGLE:SPLEEN +CREATURE:GIANT_EAGLE:KIDNEY +CREATURE:BIRD_HORNBILL:MUSCLE +CREATURE:BIRD_HORNBILL:EYE +CREATURE:BIRD_HORNBILL:BRAIN +CREATURE:BIRD_HORNBILL:LUNG +CREATURE:BIRD_HORNBILL:HEART +CREATURE:BIRD_HORNBILL:LIVER +CREATURE:BIRD_HORNBILL:GUT +CREATURE:BIRD_HORNBILL:STOMACH +CREATURE:BIRD_HORNBILL:GIZZARD +CREATURE:BIRD_HORNBILL:PANCREAS +CREATURE:BIRD_HORNBILL:SPLEEN +CREATURE:BIRD_HORNBILL:KIDNEY +CREATURE:HORNBILL_MAN:MUSCLE +CREATURE:HORNBILL_MAN:EYE +CREATURE:HORNBILL_MAN:BRAIN +CREATURE:HORNBILL_MAN:LUNG +CREATURE:HORNBILL_MAN:HEART +CREATURE:HORNBILL_MAN:LIVER +CREATURE:HORNBILL_MAN:GUT +CREATURE:HORNBILL_MAN:STOMACH +CREATURE:HORNBILL_MAN:GIZZARD +CREATURE:HORNBILL_MAN:PANCREAS +CREATURE:HORNBILL_MAN:SPLEEN +CREATURE:HORNBILL_MAN:KIDNEY +CREATURE:GIANT_HORNBILL:MUSCLE +CREATURE:GIANT_HORNBILL:EYE +CREATURE:GIANT_HORNBILL:BRAIN +CREATURE:GIANT_HORNBILL:LUNG +CREATURE:GIANT_HORNBILL:HEART +CREATURE:GIANT_HORNBILL:LIVER +CREATURE:GIANT_HORNBILL:GUT +CREATURE:GIANT_HORNBILL:STOMACH +CREATURE:GIANT_HORNBILL:GIZZARD + CREATURE:GIANT_HORNBILL:PANCREAS +CREATURE:GIANT_HORNBILL:SPLEEN +CREATURE:GIANT_HORNBILL:KIDNEY +$CREATURE:BIRD_LOVEBIRD_MASKED:MUSCLE +!CREATURE:BIRD_LOVEBIRD_MASKED:EYE +#CREATURE:BIRD_LOVEBIRD_MASKED:BRAIN +"CREATURE:BIRD_LOVEBIRD_MASKED:LUNG +#CREATURE:BIRD_LOVEBIRD_MASKED:HEART +#CREATURE:BIRD_LOVEBIRD_MASKED:LIVER +!CREATURE:BIRD_LOVEBIRD_MASKED:GUT +%CREATURE:BIRD_LOVEBIRD_MASKED:STOMACH +%CREATURE:BIRD_LOVEBIRD_MASKED:GIZZARD +&CREATURE:BIRD_LOVEBIRD_MASKED:PANCREAS +$CREATURE:BIRD_LOVEBIRD_MASKED:SPLEEN +$CREATURE:BIRD_LOVEBIRD_MASKED:KIDNEY +#CREATURE:MASKED_LOVEBIRD_MAN:MUSCLE + CREATURE:MASKED_LOVEBIRD_MAN:EYE +"CREATURE:MASKED_LOVEBIRD_MAN:BRAIN +!CREATURE:MASKED_LOVEBIRD_MAN:LUNG +"CREATURE:MASKED_LOVEBIRD_MAN:HEART +"CREATURE:MASKED_LOVEBIRD_MAN:LIVER + CREATURE:MASKED_LOVEBIRD_MAN:GUT +$CREATURE:MASKED_LOVEBIRD_MAN:STOMACH +$CREATURE:MASKED_LOVEBIRD_MAN:GIZZARD +%CREATURE:MASKED_LOVEBIRD_MAN:PANCREAS +#CREATURE:MASKED_LOVEBIRD_MAN:SPLEEN +#CREATURE:MASKED_LOVEBIRD_MAN:KIDNEY +%CREATURE:GIANT_MASKED_LOVEBIRD:MUSCLE +"CREATURE:GIANT_MASKED_LOVEBIRD:EYE +$CREATURE:GIANT_MASKED_LOVEBIRD:BRAIN +#CREATURE:GIANT_MASKED_LOVEBIRD:LUNG +$CREATURE:GIANT_MASKED_LOVEBIRD:HEART +$CREATURE:GIANT_MASKED_LOVEBIRD:LIVER +"CREATURE:GIANT_MASKED_LOVEBIRD:GUT +&CREATURE:GIANT_MASKED_LOVEBIRD:STOMACH +&CREATURE:GIANT_MASKED_LOVEBIRD:GIZZARD +'CREATURE:GIANT_MASKED_LOVEBIRD:PANCREAS +%CREATURE:GIANT_MASKED_LOVEBIRD:SPLEEN +%CREATURE:GIANT_MASKED_LOVEBIRD:KIDNEY +CREATURE:BIRD_BUSHTIT:MUSCLE +CREATURE:BIRD_BUSHTIT:EYE +CREATURE:BIRD_BUSHTIT:BRAIN +CREATURE:BIRD_BUSHTIT:LUNG +CREATURE:BIRD_BUSHTIT:HEART +CREATURE:BIRD_BUSHTIT:LIVER +CREATURE:BIRD_BUSHTIT:GUT +CREATURE:BIRD_BUSHTIT:STOMACH +CREATURE:BIRD_BUSHTIT:GIZZARD +CREATURE:BIRD_BUSHTIT:PANCREAS +CREATURE:BIRD_BUSHTIT:SPLEEN +CREATURE:BIRD_BUSHTIT:KIDNEY +CREATURE:BUSHTIT_MAN:MUSCLE +CREATURE:BUSHTIT_MAN:EYE +CREATURE:BUSHTIT_MAN:BRAIN +CREATURE:BUSHTIT_MAN:LUNG +CREATURE:BUSHTIT_MAN:HEART +CREATURE:BUSHTIT_MAN:LIVER +CREATURE:BUSHTIT_MAN:GUT +CREATURE:BUSHTIT_MAN:STOMACH +CREATURE:BUSHTIT_MAN:GIZZARD +CREATURE:BUSHTIT_MAN:PANCREAS +CREATURE:BUSHTIT_MAN:SPLEEN +CREATURE:BUSHTIT_MAN:KIDNEY +CREATURE:GIANT_BUSHTIT:MUSCLE +CREATURE:GIANT_BUSHTIT:EYE +CREATURE:GIANT_BUSHTIT:BRAIN +CREATURE:GIANT_BUSHTIT:LUNG +CREATURE:GIANT_BUSHTIT:HEART +CREATURE:GIANT_BUSHTIT:LIVER +CREATURE:GIANT_BUSHTIT:GUT +CREATURE:GIANT_BUSHTIT:STOMACH +CREATURE:GIANT_BUSHTIT:GIZZARD +CREATURE:GIANT_BUSHTIT:PANCREAS +CREATURE:GIANT_BUSHTIT:SPLEEN +CREATURE:GIANT_BUSHTIT:KIDNEY +CREATURE:DAMSELFLY:MUSCLE +CREATURE:DAMSELFLY:EYE +CREATURE:DAMSELFLY:BRAIN +CREATURE:DAMSELFLY:LUNG +CREATURE:DAMSELFLY:HEART +CREATURE:DAMSELFLY:LIVER +CREATURE:DAMSELFLY:GUT +CREATURE:DAMSELFLY:STOMACH +CREATURE:DAMSELFLY:GIZZARD +CREATURE:DAMSELFLY:PANCREAS +CREATURE:DAMSELFLY:SPLEEN +CREATURE:DAMSELFLY:KIDNEY +CREATURE:DAMSELFLY_MAN:MUSCLE +CREATURE:DAMSELFLY_MAN:EYE +CREATURE:DAMSELFLY_MAN:BRAIN +CREATURE:DAMSELFLY_MAN:LUNG +CREATURE:DAMSELFLY_MAN:HEART +CREATURE:DAMSELFLY_MAN:LIVER +CREATURE:DAMSELFLY_MAN:GUT +CREATURE:DAMSELFLY_MAN:STOMACH +CREATURE:DAMSELFLY_MAN:GIZZARD +CREATURE:DAMSELFLY_MAN:PANCREAS +CREATURE:DAMSELFLY_MAN:SPLEEN +CREATURE:DAMSELFLY_MAN:KIDNEY +CREATURE:GIANT_DAMSELFLY:MUSCLE +CREATURE:GIANT_DAMSELFLY:EYE +CREATURE:GIANT_DAMSELFLY:BRAIN +CREATURE:GIANT_DAMSELFLY:LUNG +CREATURE:GIANT_DAMSELFLY:HEART +CREATURE:GIANT_DAMSELFLY:LIVER +CREATURE:GIANT_DAMSELFLY:GUT + CREATURE:GIANT_DAMSELFLY:STOMACH + CREATURE:GIANT_DAMSELFLY:GIZZARD +!CREATURE:GIANT_DAMSELFLY:PANCREAS +CREATURE:GIANT_DAMSELFLY:SPLEEN +CREATURE:GIANT_DAMSELFLY:KIDNEY +CREATURE:MOTH:MUSCLE +CREATURE:MOTH:EYE +CREATURE:MOTH:BRAIN +CREATURE:MOTH:LUNG +CREATURE:MOTH:HEART +CREATURE:MOTH:LIVER +CREATURE:MOTH:GUT +CREATURE:MOTH:STOMACH +CREATURE:MOTH:GIZZARD +CREATURE:MOTH:PANCREAS +CREATURE:MOTH:SPLEEN +CREATURE:MOTH:KIDNEY +CREATURE:MOTH_MAN:MUSCLE +CREATURE:MOTH_MAN:EYE +CREATURE:MOTH_MAN:BRAIN +CREATURE:MOTH_MAN:LUNG +CREATURE:MOTH_MAN:HEART +CREATURE:MOTH_MAN:LIVER +CREATURE:MOTH_MAN:GUT +CREATURE:MOTH_MAN:STOMACH +CREATURE:MOTH_MAN:GIZZARD +CREATURE:MOTH_MAN:PANCREAS +CREATURE:MOTH_MAN:SPLEEN +CREATURE:MOTH_MAN:KIDNEY +CREATURE:GIANT_MOTH:MUSCLE +CREATURE:GIANT_MOTH:EYE +CREATURE:GIANT_MOTH:BRAIN +CREATURE:GIANT_MOTH:LUNG +CREATURE:GIANT_MOTH:HEART +CREATURE:GIANT_MOTH:LIVER +CREATURE:GIANT_MOTH:GUT +CREATURE:GIANT_MOTH:STOMACH +CREATURE:GIANT_MOTH:GIZZARD +CREATURE:GIANT_MOTH:PANCREAS +CREATURE:GIANT_MOTH:SPLEEN +CREATURE:GIANT_MOTH:KIDNEY +CREATURE:GRASSHOPPER:MUSCLE +CREATURE:GRASSHOPPER:EYE +CREATURE:GRASSHOPPER:BRAIN +CREATURE:GRASSHOPPER:LUNG +CREATURE:GRASSHOPPER:HEART +CREATURE:GRASSHOPPER:LIVER +CREATURE:GRASSHOPPER:GUT +CREATURE:GRASSHOPPER:STOMACH +CREATURE:GRASSHOPPER:GIZZARD +CREATURE:GRASSHOPPER:PANCREAS +CREATURE:GRASSHOPPER:SPLEEN +CREATURE:GRASSHOPPER:KIDNEY +CREATURE:GRASSHOPPER_MAN:MUSCLE +CREATURE:GRASSHOPPER_MAN:EYE +CREATURE:GRASSHOPPER_MAN:BRAIN +CREATURE:GRASSHOPPER_MAN:LUNG +CREATURE:GRASSHOPPER_MAN:HEART +CREATURE:GRASSHOPPER_MAN:LIVER +CREATURE:GRASSHOPPER_MAN:GUT + CREATURE:GRASSHOPPER_MAN:STOMACH + CREATURE:GRASSHOPPER_MAN:GIZZARD +!CREATURE:GRASSHOPPER_MAN:PANCREAS +CREATURE:GRASSHOPPER_MAN:SPLEEN +CREATURE:GRASSHOPPER_MAN:KIDNEY +!CREATURE:GIANT_GRASSHOPPER:MUSCLE +CREATURE:GIANT_GRASSHOPPER:EYE + CREATURE:GIANT_GRASSHOPPER:BRAIN +CREATURE:GIANT_GRASSHOPPER:LUNG + CREATURE:GIANT_GRASSHOPPER:HEART + CREATURE:GIANT_GRASSHOPPER:LIVER +CREATURE:GIANT_GRASSHOPPER:GUT +"CREATURE:GIANT_GRASSHOPPER:STOMACH +"CREATURE:GIANT_GRASSHOPPER:GIZZARD +#CREATURE:GIANT_GRASSHOPPER:PANCREAS +!CREATURE:GIANT_GRASSHOPPER:SPLEEN +!CREATURE:GIANT_GRASSHOPPER:KIDNEY +CREATURE:BARK_SCORPION:MUSCLE +CREATURE:BARK_SCORPION:EYE +CREATURE:BARK_SCORPION:BRAIN +CREATURE:BARK_SCORPION:LUNG +CREATURE:BARK_SCORPION:HEART +CREATURE:BARK_SCORPION:LIVER +CREATURE:BARK_SCORPION:GUT +CREATURE:BARK_SCORPION:STOMACH +CREATURE:BARK_SCORPION:GIZZARD +CREATURE:BARK_SCORPION:PANCREAS +CREATURE:BARK_SCORPION:SPLEEN +CREATURE:BARK_SCORPION:KIDNEY +!CREATURE:BARK_SCORPION_MAN:MUSCLE +CREATURE:BARK_SCORPION_MAN:EYE + CREATURE:BARK_SCORPION_MAN:BRAIN +CREATURE:BARK_SCORPION_MAN:LUNG + CREATURE:BARK_SCORPION_MAN:HEART + CREATURE:BARK_SCORPION_MAN:LIVER +CREATURE:BARK_SCORPION_MAN:GUT +"CREATURE:BARK_SCORPION_MAN:STOMACH +"CREATURE:BARK_SCORPION_MAN:GIZZARD +#CREATURE:BARK_SCORPION_MAN:PANCREAS +!CREATURE:BARK_SCORPION_MAN:SPLEEN +!CREATURE:BARK_SCORPION_MAN:KIDNEY +#CREATURE:GIANT_BARK_SCORPION:MUSCLE + CREATURE:GIANT_BARK_SCORPION:EYE +"CREATURE:GIANT_BARK_SCORPION:BRAIN +!CREATURE:GIANT_BARK_SCORPION:LUNG +"CREATURE:GIANT_BARK_SCORPION:HEART +"CREATURE:GIANT_BARK_SCORPION:LIVER + CREATURE:GIANT_BARK_SCORPION:GUT +$CREATURE:GIANT_BARK_SCORPION:STOMACH +$CREATURE:GIANT_BARK_SCORPION:GIZZARD +%CREATURE:GIANT_BARK_SCORPION:PANCREAS +#CREATURE:GIANT_BARK_SCORPION:SPLEEN +#CREATURE:GIANT_BARK_SCORPION:KIDNEY +CREATURE:MANTIS:MUSCLE +CREATURE:MANTIS:EYE +CREATURE:MANTIS:BRAIN +CREATURE:MANTIS:LUNG +CREATURE:MANTIS:HEART +CREATURE:MANTIS:LIVER +CREATURE:MANTIS:GUT +CREATURE:MANTIS:STOMACH +CREATURE:MANTIS:GIZZARD +CREATURE:MANTIS:PANCREAS +CREATURE:MANTIS:SPLEEN +CREATURE:MANTIS:KIDNEY +CREATURE:MANTIS_MAN:MUSCLE +CREATURE:MANTIS_MAN:EYE +CREATURE:MANTIS_MAN:BRAIN +CREATURE:MANTIS_MAN:LUNG +CREATURE:MANTIS_MAN:HEART +CREATURE:MANTIS_MAN:LIVER +CREATURE:MANTIS_MAN:GUT +CREATURE:MANTIS_MAN:STOMACH +CREATURE:MANTIS_MAN:GIZZARD +CREATURE:MANTIS_MAN:PANCREAS +CREATURE:MANTIS_MAN:SPLEEN +CREATURE:MANTIS_MAN:KIDNEY +CREATURE:GIANT_MANTIS:MUSCLE +CREATURE:GIANT_MANTIS:EYE +CREATURE:GIANT_MANTIS:BRAIN +CREATURE:GIANT_MANTIS:LUNG +CREATURE:GIANT_MANTIS:HEART +CREATURE:GIANT_MANTIS:LIVER +CREATURE:GIANT_MANTIS:GUT +CREATURE:GIANT_MANTIS:STOMACH +CREATURE:GIANT_MANTIS:GIZZARD +CREATURE:GIANT_MANTIS:PANCREAS +CREATURE:GIANT_MANTIS:SPLEEN +CREATURE:GIANT_MANTIS:KIDNEY +CREATURE:TICK:MUSCLE +CREATURE:TICK:EYE +CREATURE:TICK:BRAIN +CREATURE:TICK:LUNG +CREATURE:TICK:HEART +CREATURE:TICK:LIVER +CREATURE:TICK:GUT +CREATURE:TICK:STOMACH +CREATURE:TICK:GIZZARD +CREATURE:TICK:PANCREAS +CREATURE:TICK:SPLEEN +CREATURE:TICK:KIDNEY +CREATURE:TICK_MAN:MUSCLE +CREATURE:TICK_MAN:EYE +CREATURE:TICK_MAN:BRAIN +CREATURE:TICK_MAN:LUNG +CREATURE:TICK_MAN:HEART +CREATURE:TICK_MAN:LIVER +CREATURE:TICK_MAN:GUT +CREATURE:TICK_MAN:STOMACH +CREATURE:TICK_MAN:GIZZARD +CREATURE:TICK_MAN:PANCREAS +CREATURE:TICK_MAN:SPLEEN +CREATURE:TICK_MAN:KIDNEY +CREATURE:GIANT_TICK:MUSCLE +CREATURE:GIANT_TICK:EYE +CREATURE:GIANT_TICK:BRAIN +CREATURE:GIANT_TICK:LUNG +CREATURE:GIANT_TICK:HEART +CREATURE:GIANT_TICK:LIVER +CREATURE:GIANT_TICK:GUT +CREATURE:GIANT_TICK:STOMACH +CREATURE:GIANT_TICK:GIZZARD +CREATURE:GIANT_TICK:PANCREAS +CREATURE:GIANT_TICK:SPLEEN +CREATURE:GIANT_TICK:KIDNEY +CREATURE:LOUSE:MUSCLE +CREATURE:LOUSE:EYE +CREATURE:LOUSE:BRAIN +CREATURE:LOUSE:LUNG +CREATURE:LOUSE:HEART +CREATURE:LOUSE:LIVER +CREATURE:LOUSE:GUT +CREATURE:LOUSE:STOMACH +CREATURE:LOUSE:GIZZARD +CREATURE:LOUSE:PANCREAS +CREATURE:LOUSE:SPLEEN +CREATURE:LOUSE:KIDNEY +CREATURE:LOUSE_MAN:MUSCLE +CREATURE:LOUSE_MAN:EYE +CREATURE:LOUSE_MAN:BRAIN +CREATURE:LOUSE_MAN:LUNG +CREATURE:LOUSE_MAN:HEART +CREATURE:LOUSE_MAN:LIVER +CREATURE:LOUSE_MAN:GUT +CREATURE:LOUSE_MAN:STOMACH +CREATURE:LOUSE_MAN:GIZZARD +CREATURE:LOUSE_MAN:PANCREAS +CREATURE:LOUSE_MAN:SPLEEN +CREATURE:LOUSE_MAN:KIDNEY +CREATURE:GIANT_LOUSE:MUSCLE +CREATURE:GIANT_LOUSE:EYE +CREATURE:GIANT_LOUSE:BRAIN +CREATURE:GIANT_LOUSE:LUNG +CREATURE:GIANT_LOUSE:HEART +CREATURE:GIANT_LOUSE:LIVER +CREATURE:GIANT_LOUSE:GUT +CREATURE:GIANT_LOUSE:STOMACH +CREATURE:GIANT_LOUSE:GIZZARD +CREATURE:GIANT_LOUSE:PANCREAS +CREATURE:GIANT_LOUSE:SPLEEN +CREATURE:GIANT_LOUSE:KIDNEY +CREATURE:THRIPS:MUSCLE +CREATURE:THRIPS:EYE +CREATURE:THRIPS:BRAIN +CREATURE:THRIPS:LUNG +CREATURE:THRIPS:HEART +CREATURE:THRIPS:LIVER +CREATURE:THRIPS:GUT +CREATURE:THRIPS:STOMACH +CREATURE:THRIPS:GIZZARD +CREATURE:THRIPS:PANCREAS +CREATURE:THRIPS:SPLEEN +CREATURE:THRIPS:KIDNEY +CREATURE:THRIPS_MAN:MUSCLE +CREATURE:THRIPS_MAN:EYE +CREATURE:THRIPS_MAN:BRAIN +CREATURE:THRIPS_MAN:LUNG +CREATURE:THRIPS_MAN:HEART +CREATURE:THRIPS_MAN:LIVER +CREATURE:THRIPS_MAN:GUT +CREATURE:THRIPS_MAN:STOMACH +CREATURE:THRIPS_MAN:GIZZARD +CREATURE:THRIPS_MAN:PANCREAS +CREATURE:THRIPS_MAN:SPLEEN +CREATURE:THRIPS_MAN:KIDNEY +CREATURE:GIANT_THRIPS:MUSCLE +CREATURE:GIANT_THRIPS:EYE +CREATURE:GIANT_THRIPS:BRAIN +CREATURE:GIANT_THRIPS:LUNG +CREATURE:GIANT_THRIPS:HEART +CREATURE:GIANT_THRIPS:LIVER +CREATURE:GIANT_THRIPS:GUT +CREATURE:GIANT_THRIPS:STOMACH +CREATURE:GIANT_THRIPS:GIZZARD +CREATURE:GIANT_THRIPS:PANCREAS +CREATURE:GIANT_THRIPS:SPLEEN +CREATURE:GIANT_THRIPS:KIDNEY +CREATURE:SLUG:MUSCLE +CREATURE:SLUG:EYE +CREATURE:SLUG:BRAIN +CREATURE:SLUG:LUNG +CREATURE:SLUG:HEART +CREATURE:SLUG:LIVER +CREATURE:SLUG:GUT +CREATURE:SLUG:STOMACH +CREATURE:SLUG:GIZZARD +CREATURE:SLUG:PANCREAS +CREATURE:SLUG:SPLEEN +CREATURE:SLUG:KIDNEY +CREATURE:SLUG_MAN:MUSCLE +CREATURE:SLUG_MAN:EYE +CREATURE:SLUG_MAN:BRAIN +CREATURE:SLUG_MAN:LUNG +CREATURE:SLUG_MAN:HEART +CREATURE:SLUG_MAN:LIVER +CREATURE:SLUG_MAN:GUT +CREATURE:SLUG_MAN:STOMACH +CREATURE:SLUG_MAN:GIZZARD +CREATURE:SLUG_MAN:PANCREAS +CREATURE:SLUG_MAN:SPLEEN +CREATURE:SLUG_MAN:KIDNEY +CREATURE:GIANT_SLUG:MUSCLE +CREATURE:GIANT_SLUG:EYE +CREATURE:GIANT_SLUG:BRAIN +CREATURE:GIANT_SLUG:LUNG +CREATURE:GIANT_SLUG:HEART +CREATURE:GIANT_SLUG:LIVER +CREATURE:GIANT_SLUG:GUT +CREATURE:GIANT_SLUG:STOMACH +CREATURE:GIANT_SLUG:GIZZARD +CREATURE:GIANT_SLUG:PANCREAS +CREATURE:GIANT_SLUG:SPLEEN +CREATURE:GIANT_SLUG:KIDNEY +CREATURE:MOSQUITO:MUSCLE +CREATURE:MOSQUITO:EYE +CREATURE:MOSQUITO:BRAIN +CREATURE:MOSQUITO:LUNG +CREATURE:MOSQUITO:HEART +CREATURE:MOSQUITO:LIVER +CREATURE:MOSQUITO:GUT +CREATURE:MOSQUITO:STOMACH +CREATURE:MOSQUITO:GIZZARD +CREATURE:MOSQUITO:PANCREAS +CREATURE:MOSQUITO:SPLEEN +CREATURE:MOSQUITO:KIDNEY +CREATURE:MOSQUITO_MAN:MUSCLE +CREATURE:MOSQUITO_MAN:EYE +CREATURE:MOSQUITO_MAN:BRAIN +CREATURE:MOSQUITO_MAN:LUNG +CREATURE:MOSQUITO_MAN:HEART +CREATURE:MOSQUITO_MAN:LIVER +CREATURE:MOSQUITO_MAN:GUT +CREATURE:MOSQUITO_MAN:STOMACH +CREATURE:MOSQUITO_MAN:GIZZARD +CREATURE:MOSQUITO_MAN:PANCREAS +CREATURE:MOSQUITO_MAN:SPLEEN +CREATURE:MOSQUITO_MAN:KIDNEY +CREATURE:GIANT_MOSQUITO:MUSCLE +CREATURE:GIANT_MOSQUITO:EYE +CREATURE:GIANT_MOSQUITO:BRAIN +CREATURE:GIANT_MOSQUITO:LUNG +CREATURE:GIANT_MOSQUITO:HEART +CREATURE:GIANT_MOSQUITO:LIVER +CREATURE:GIANT_MOSQUITO:GUT +CREATURE:GIANT_MOSQUITO:STOMACH +CREATURE:GIANT_MOSQUITO:GIZZARD + CREATURE:GIANT_MOSQUITO:PANCREAS +CREATURE:GIANT_MOSQUITO:SPLEEN +CREATURE:GIANT_MOSQUITO:KIDNEY +CREATURE:SPIDER_JUMPING:MUSCLE +CREATURE:SPIDER_JUMPING:EYE +CREATURE:SPIDER_JUMPING:BRAIN +CREATURE:SPIDER_JUMPING:LUNG +CREATURE:SPIDER_JUMPING:HEART +CREATURE:SPIDER_JUMPING:LIVER +CREATURE:SPIDER_JUMPING:GUT +CREATURE:SPIDER_JUMPING:STOMACH +CREATURE:SPIDER_JUMPING:GIZZARD + CREATURE:SPIDER_JUMPING:PANCREAS +CREATURE:SPIDER_JUMPING:SPLEEN +CREATURE:SPIDER_JUMPING:KIDNEY +"CREATURE:JUMPING_SPIDER_MAN:MUSCLE +CREATURE:JUMPING_SPIDER_MAN:EYE +!CREATURE:JUMPING_SPIDER_MAN:BRAIN + CREATURE:JUMPING_SPIDER_MAN:LUNG +!CREATURE:JUMPING_SPIDER_MAN:HEART +!CREATURE:JUMPING_SPIDER_MAN:LIVER +CREATURE:JUMPING_SPIDER_MAN:GUT +#CREATURE:JUMPING_SPIDER_MAN:STOMACH +#CREATURE:JUMPING_SPIDER_MAN:GIZZARD +$CREATURE:JUMPING_SPIDER_MAN:PANCREAS +"CREATURE:JUMPING_SPIDER_MAN:SPLEEN +"CREATURE:JUMPING_SPIDER_MAN:KIDNEY +$CREATURE:GIANT_JUMPING_SPIDER:MUSCLE +!CREATURE:GIANT_JUMPING_SPIDER:EYE +#CREATURE:GIANT_JUMPING_SPIDER:BRAIN +"CREATURE:GIANT_JUMPING_SPIDER:LUNG +#CREATURE:GIANT_JUMPING_SPIDER:HEART +#CREATURE:GIANT_JUMPING_SPIDER:LIVER +!CREATURE:GIANT_JUMPING_SPIDER:GUT +%CREATURE:GIANT_JUMPING_SPIDER:STOMACH +%CREATURE:GIANT_JUMPING_SPIDER:GIZZARD +&CREATURE:GIANT_JUMPING_SPIDER:PANCREAS +$CREATURE:GIANT_JUMPING_SPIDER:SPLEEN +$CREATURE:GIANT_JUMPING_SPIDER:KIDNEY +CREATURE:TERMITE:MUSCLE +CREATURE:TERMITE:EYE +CREATURE:TERMITE:BRAIN +CREATURE:TERMITE:LUNG +CREATURE:TERMITE:HEART +CREATURE:TERMITE:LIVER +CREATURE:TERMITE:GUT +CREATURE:TERMITE:STOMACH +CREATURE:TERMITE:GIZZARD +CREATURE:TERMITE:PANCREAS +CREATURE:TERMITE:SPLEEN +CREATURE:TERMITE:KIDNEY +CREATURE:MOON_SNAIL:MUSCLE +CREATURE:MOON_SNAIL:EYE +CREATURE:MOON_SNAIL:BRAIN +CREATURE:MOON_SNAIL:LUNG +CREATURE:MOON_SNAIL:HEART +CREATURE:MOON_SNAIL:LIVER +CREATURE:MOON_SNAIL:GUT +CREATURE:MOON_SNAIL:STOMACH +CREATURE:MOON_SNAIL:GIZZARD +CREATURE:MOON_SNAIL:PANCREAS +CREATURE:MOON_SNAIL:SPLEEN +CREATURE:MOON_SNAIL:KIDNEY +CREATURE:MOON_SNAIL_MAN:MUSCLE +CREATURE:MOON_SNAIL_MAN:EYE +CREATURE:MOON_SNAIL_MAN:BRAIN +CREATURE:MOON_SNAIL_MAN:LUNG +CREATURE:MOON_SNAIL_MAN:HEART +CREATURE:MOON_SNAIL_MAN:LIVER +CREATURE:MOON_SNAIL_MAN:GUT +CREATURE:MOON_SNAIL_MAN:STOMACH +CREATURE:MOON_SNAIL_MAN:GIZZARD + CREATURE:MOON_SNAIL_MAN:PANCREAS +CREATURE:MOON_SNAIL_MAN:SPLEEN +CREATURE:MOON_SNAIL_MAN:KIDNEY + CREATURE:GIANT_MOON_SNAIL:MUSCLE +CREATURE:GIANT_MOON_SNAIL:EYE +CREATURE:GIANT_MOON_SNAIL:BRAIN +CREATURE:GIANT_MOON_SNAIL:LUNG +CREATURE:GIANT_MOON_SNAIL:HEART +CREATURE:GIANT_MOON_SNAIL:LIVER +CREATURE:GIANT_MOON_SNAIL:GUT +!CREATURE:GIANT_MOON_SNAIL:STOMACH +!CREATURE:GIANT_MOON_SNAIL:GIZZARD +"CREATURE:GIANT_MOON_SNAIL:PANCREAS + CREATURE:GIANT_MOON_SNAIL:SPLEEN + CREATURE:GIANT_MOON_SNAIL:KIDNEY +$CREATURE:SPIDER_BROWN_RECLUSE:MUSCLE +!CREATURE:SPIDER_BROWN_RECLUSE:EYE +#CREATURE:SPIDER_BROWN_RECLUSE:BRAIN +"CREATURE:SPIDER_BROWN_RECLUSE:LUNG +#CREATURE:SPIDER_BROWN_RECLUSE:HEART +#CREATURE:SPIDER_BROWN_RECLUSE:LIVER +!CREATURE:SPIDER_BROWN_RECLUSE:GUT +%CREATURE:SPIDER_BROWN_RECLUSE:STOMACH +%CREATURE:SPIDER_BROWN_RECLUSE:GIZZARD +&CREATURE:SPIDER_BROWN_RECLUSE:PANCREAS +$CREATURE:SPIDER_BROWN_RECLUSE:SPLEEN +$CREATURE:SPIDER_BROWN_RECLUSE:KIDNEY +(CREATURE:BROWN_RECLUSE_SPIDER_MAN:MUSCLE +%CREATURE:BROWN_RECLUSE_SPIDER_MAN:EYE +'CREATURE:BROWN_RECLUSE_SPIDER_MAN:BRAIN +&CREATURE:BROWN_RECLUSE_SPIDER_MAN:LUNG +'CREATURE:BROWN_RECLUSE_SPIDER_MAN:HEART +'CREATURE:BROWN_RECLUSE_SPIDER_MAN:LIVER +%CREATURE:BROWN_RECLUSE_SPIDER_MAN:GUT +)CREATURE:BROWN_RECLUSE_SPIDER_MAN:STOMACH +)CREATURE:BROWN_RECLUSE_SPIDER_MAN:GIZZARD +*CREATURE:BROWN_RECLUSE_SPIDER_MAN:PANCREAS +(CREATURE:BROWN_RECLUSE_SPIDER_MAN:SPLEEN +(CREATURE:BROWN_RECLUSE_SPIDER_MAN:KIDNEY +*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:MUSCLE +'CREATURE:GIANT_BROWN_RECLUSE_SPIDER:EYE +)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:BRAIN +(CREATURE:GIANT_BROWN_RECLUSE_SPIDER:LUNG +)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:HEART +)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:LIVER +'CREATURE:GIANT_BROWN_RECLUSE_SPIDER:GUT ++CREATURE:GIANT_BROWN_RECLUSE_SPIDER:STOMACH ++CREATURE:GIANT_BROWN_RECLUSE_SPIDER:GIZZARD +,CREATURE:GIANT_BROWN_RECLUSE_SPIDER:PANCREAS +*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:SPLEEN +*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:KIDNEY +CREATURE:SNAIL:MUSCLE +CREATURE:SNAIL:EYE +CREATURE:SNAIL:BRAIN +CREATURE:SNAIL:LUNG +CREATURE:SNAIL:HEART +CREATURE:SNAIL:LIVER +CREATURE:SNAIL:GUT +CREATURE:SNAIL:STOMACH +CREATURE:SNAIL:GIZZARD +CREATURE:SNAIL:PANCREAS +CREATURE:SNAIL:SPLEEN +CREATURE:SNAIL:KIDNEY +CREATURE:SNAIL_MAN:MUSCLE +CREATURE:SNAIL_MAN:EYE +CREATURE:SNAIL_MAN:BRAIN +CREATURE:SNAIL_MAN:LUNG +CREATURE:SNAIL_MAN:HEART +CREATURE:SNAIL_MAN:LIVER +CREATURE:SNAIL_MAN:GUT +CREATURE:SNAIL_MAN:STOMACH +CREATURE:SNAIL_MAN:GIZZARD +CREATURE:SNAIL_MAN:PANCREAS +CREATURE:SNAIL_MAN:SPLEEN +CREATURE:SNAIL_MAN:KIDNEY +CREATURE:GIANT_SNAIL:MUSCLE +CREATURE:GIANT_SNAIL:EYE +CREATURE:GIANT_SNAIL:BRAIN +CREATURE:GIANT_SNAIL:LUNG +CREATURE:GIANT_SNAIL:HEART +CREATURE:GIANT_SNAIL:LIVER +CREATURE:GIANT_SNAIL:GUT +CREATURE:GIANT_SNAIL:STOMACH +CREATURE:GIANT_SNAIL:GIZZARD +CREATURE:GIANT_SNAIL:PANCREAS +CREATURE:GIANT_SNAIL:SPLEEN +CREATURE:GIANT_SNAIL:KIDNEY +CREATURE:GECKO_LEOPARD:MUSCLE +CREATURE:GECKO_LEOPARD:EYE +CREATURE:GECKO_LEOPARD:BRAIN +CREATURE:GECKO_LEOPARD:LUNG +CREATURE:GECKO_LEOPARD:HEART +CREATURE:GECKO_LEOPARD:LIVER +CREATURE:GECKO_LEOPARD:GUT +CREATURE:GECKO_LEOPARD:STOMACH +CREATURE:GECKO_LEOPARD:GIZZARD +CREATURE:GECKO_LEOPARD:PANCREAS +CREATURE:GECKO_LEOPARD:SPLEEN +CREATURE:GECKO_LEOPARD:KIDNEY +!CREATURE:LEOPARD_GECKO_MAN:MUSCLE +CREATURE:LEOPARD_GECKO_MAN:EYE + CREATURE:LEOPARD_GECKO_MAN:BRAIN +CREATURE:LEOPARD_GECKO_MAN:LUNG + CREATURE:LEOPARD_GECKO_MAN:HEART + CREATURE:LEOPARD_GECKO_MAN:LIVER +CREATURE:LEOPARD_GECKO_MAN:GUT +"CREATURE:LEOPARD_GECKO_MAN:STOMACH +"CREATURE:LEOPARD_GECKO_MAN:GIZZARD +#CREATURE:LEOPARD_GECKO_MAN:PANCREAS +!CREATURE:LEOPARD_GECKO_MAN:SPLEEN +!CREATURE:LEOPARD_GECKO_MAN:KIDNEY +#CREATURE:GIANT_LEOPARD_GECKO:MUSCLE + CREATURE:GIANT_LEOPARD_GECKO:EYE +"CREATURE:GIANT_LEOPARD_GECKO:BRAIN +!CREATURE:GIANT_LEOPARD_GECKO:LUNG +"CREATURE:GIANT_LEOPARD_GECKO:HEART +"CREATURE:GIANT_LEOPARD_GECKO:LIVER + CREATURE:GIANT_LEOPARD_GECKO:GUT +$CREATURE:GIANT_LEOPARD_GECKO:STOMACH +$CREATURE:GIANT_LEOPARD_GECKO:GIZZARD +%CREATURE:GIANT_LEOPARD_GECKO:PANCREAS +#CREATURE:GIANT_LEOPARD_GECKO:SPLEEN +#CREATURE:GIANT_LEOPARD_GECKO:KIDNEY +CREATURE:DESERT TORTOISE:MUSCLE +CREATURE:DESERT TORTOISE:EYE +CREATURE:DESERT TORTOISE:BRAIN +CREATURE:DESERT TORTOISE:LUNG +CREATURE:DESERT TORTOISE:HEART +CREATURE:DESERT TORTOISE:LIVER +CREATURE:DESERT TORTOISE:GUT + CREATURE:DESERT TORTOISE:STOMACH + CREATURE:DESERT TORTOISE:GIZZARD +!CREATURE:DESERT TORTOISE:PANCREAS +CREATURE:DESERT TORTOISE:SPLEEN +CREATURE:DESERT TORTOISE:KIDNEY +#CREATURE:DESERT_TORTOISE_MAN:MUSCLE + CREATURE:DESERT_TORTOISE_MAN:EYE +"CREATURE:DESERT_TORTOISE_MAN:BRAIN +!CREATURE:DESERT_TORTOISE_MAN:LUNG +"CREATURE:DESERT_TORTOISE_MAN:HEART +"CREATURE:DESERT_TORTOISE_MAN:LIVER + CREATURE:DESERT_TORTOISE_MAN:GUT +$CREATURE:DESERT_TORTOISE_MAN:STOMACH +$CREATURE:DESERT_TORTOISE_MAN:GIZZARD +%CREATURE:DESERT_TORTOISE_MAN:PANCREAS +#CREATURE:DESERT_TORTOISE_MAN:SPLEEN +#CREATURE:DESERT_TORTOISE_MAN:KIDNEY +%CREATURE:GIANT_DESERT_TORTOISE:MUSCLE +"CREATURE:GIANT_DESERT_TORTOISE:EYE +$CREATURE:GIANT_DESERT_TORTOISE:BRAIN +#CREATURE:GIANT_DESERT_TORTOISE:LUNG +$CREATURE:GIANT_DESERT_TORTOISE:HEART +$CREATURE:GIANT_DESERT_TORTOISE:LIVER +"CREATURE:GIANT_DESERT_TORTOISE:GUT +&CREATURE:GIANT_DESERT_TORTOISE:STOMACH +&CREATURE:GIANT_DESERT_TORTOISE:GIZZARD +'CREATURE:GIANT_DESERT_TORTOISE:PANCREAS +%CREATURE:GIANT_DESERT_TORTOISE:SPLEEN +%CREATURE:GIANT_DESERT_TORTOISE:KIDNEY +CREATURE:GILA_MONSTER:MUSCLE +CREATURE:GILA_MONSTER:EYE +CREATURE:GILA_MONSTER:BRAIN +CREATURE:GILA_MONSTER:LUNG +CREATURE:GILA_MONSTER:HEART +CREATURE:GILA_MONSTER:LIVER +CREATURE:GILA_MONSTER:GUT +CREATURE:GILA_MONSTER:STOMACH +CREATURE:GILA_MONSTER:GIZZARD +CREATURE:GILA_MONSTER:PANCREAS +CREATURE:GILA_MONSTER:SPLEEN +CREATURE:GILA_MONSTER:KIDNEY + CREATURE:GILA_MONSTER_MAN:MUSCLE +CREATURE:GILA_MONSTER_MAN:EYE +CREATURE:GILA_MONSTER_MAN:BRAIN +CREATURE:GILA_MONSTER_MAN:LUNG +CREATURE:GILA_MONSTER_MAN:HEART +CREATURE:GILA_MONSTER_MAN:LIVER +CREATURE:GILA_MONSTER_MAN:GUT +!CREATURE:GILA_MONSTER_MAN:STOMACH +!CREATURE:GILA_MONSTER_MAN:GIZZARD +"CREATURE:GILA_MONSTER_MAN:PANCREAS + CREATURE:GILA_MONSTER_MAN:SPLEEN + CREATURE:GILA_MONSTER_MAN:KIDNEY +"CREATURE:GIANT_GILA_MONSTER:MUSCLE +CREATURE:GIANT_GILA_MONSTER:EYE +!CREATURE:GIANT_GILA_MONSTER:BRAIN + CREATURE:GIANT_GILA_MONSTER:LUNG +!CREATURE:GIANT_GILA_MONSTER:HEART +!CREATURE:GIANT_GILA_MONSTER:LIVER +CREATURE:GIANT_GILA_MONSTER:GUT +#CREATURE:GIANT_GILA_MONSTER:STOMACH +#CREATURE:GIANT_GILA_MONSTER:GIZZARD +$CREATURE:GIANT_GILA_MONSTER:PANCREAS +"CREATURE:GIANT_GILA_MONSTER:SPLEEN +"CREATURE:GIANT_GILA_MONSTER:KIDNEY +CREATURE:DOG:MUSCLE +CREATURE:DOG:EYE +CREATURE:DOG:BRAIN +CREATURE:DOG:LUNG +CREATURE:DOG:HEART +CREATURE:DOG:LIVER +CREATURE:DOG:GUT +CREATURE:DOG:STOMACH +CREATURE:DOG:GIZZARD +CREATURE:DOG:PANCREAS +CREATURE:DOG:SPLEEN +CREATURE:DOG:KIDNEY +CREATURE:CAT:MUSCLE +CREATURE:CAT:EYE +CREATURE:CAT:BRAIN +CREATURE:CAT:LUNG +CREATURE:CAT:HEART +CREATURE:CAT:LIVER +CREATURE:CAT:GUT +CREATURE:CAT:STOMACH +CREATURE:CAT:GIZZARD +CREATURE:CAT:PANCREAS +CREATURE:CAT:SPLEEN +CREATURE:CAT:KIDNEY +CREATURE:MULE:MUSCLE +CREATURE:MULE:EYE +CREATURE:MULE:BRAIN +CREATURE:MULE:LUNG +CREATURE:MULE:HEART +CREATURE:MULE:LIVER +CREATURE:MULE:GUT +CREATURE:MULE:STOMACH +CREATURE:MULE:GIZZARD +CREATURE:MULE:PANCREAS +CREATURE:MULE:SPLEEN +CREATURE:MULE:KIDNEY +CREATURE:DONKEY:MUSCLE +CREATURE:DONKEY:EYE +CREATURE:DONKEY:BRAIN +CREATURE:DONKEY:LUNG +CREATURE:DONKEY:HEART +CREATURE:DONKEY:LIVER +CREATURE:DONKEY:GUT +CREATURE:DONKEY:STOMACH +CREATURE:DONKEY:GIZZARD +CREATURE:DONKEY:PANCREAS +CREATURE:DONKEY:SPLEEN +CREATURE:DONKEY:KIDNEY +CREATURE:HORSE:MUSCLE +CREATURE:HORSE:EYE +CREATURE:HORSE:BRAIN +CREATURE:HORSE:LUNG +CREATURE:HORSE:HEART +CREATURE:HORSE:LIVER +CREATURE:HORSE:GUT +CREATURE:HORSE:STOMACH +CREATURE:HORSE:GIZZARD +CREATURE:HORSE:PANCREAS +CREATURE:HORSE:SPLEEN +CREATURE:HORSE:KIDNEY +CREATURE:COW:MUSCLE +CREATURE:COW:EYE +CREATURE:COW:BRAIN +CREATURE:COW:LUNG +CREATURE:COW:HEART +CREATURE:COW:LIVER +CREATURE:COW:GUT +CREATURE:COW:STOMACH +CREATURE:COW:GIZZARD +CREATURE:COW:PANCREAS +CREATURE:COW:SPLEEN +CREATURE:COW:KIDNEY +CREATURE:SHEEP:MUSCLE +CREATURE:SHEEP:EYE +CREATURE:SHEEP:BRAIN +CREATURE:SHEEP:LUNG +CREATURE:SHEEP:HEART +CREATURE:SHEEP:LIVER +CREATURE:SHEEP:GUT +CREATURE:SHEEP:STOMACH +CREATURE:SHEEP:GIZZARD +CREATURE:SHEEP:PANCREAS +CREATURE:SHEEP:SPLEEN +CREATURE:SHEEP:KIDNEY +CREATURE:PIG:MUSCLE +CREATURE:PIG:EYE +CREATURE:PIG:BRAIN +CREATURE:PIG:LUNG +CREATURE:PIG:HEART +CREATURE:PIG:LIVER +CREATURE:PIG:GUT +CREATURE:PIG:STOMACH +CREATURE:PIG:GIZZARD +CREATURE:PIG:PANCREAS +CREATURE:PIG:SPLEEN +CREATURE:PIG:KIDNEY +CREATURE:GOAT:MUSCLE +CREATURE:GOAT:EYE +CREATURE:GOAT:BRAIN +CREATURE:GOAT:LUNG +CREATURE:GOAT:HEART +CREATURE:GOAT:LIVER +CREATURE:GOAT:GUT +CREATURE:GOAT:STOMACH +CREATURE:GOAT:GIZZARD +CREATURE:GOAT:PANCREAS +CREATURE:GOAT:SPLEEN +CREATURE:GOAT:KIDNEY +CREATURE:BIRD_CHICKEN:MUSCLE +CREATURE:BIRD_CHICKEN:EYE +CREATURE:BIRD_CHICKEN:BRAIN +CREATURE:BIRD_CHICKEN:LUNG +CREATURE:BIRD_CHICKEN:HEART +CREATURE:BIRD_CHICKEN:LIVER +CREATURE:BIRD_CHICKEN:GUT +CREATURE:BIRD_CHICKEN:STOMACH +CREATURE:BIRD_CHICKEN:GIZZARD +CREATURE:BIRD_CHICKEN:PANCREAS +CREATURE:BIRD_CHICKEN:SPLEEN +CREATURE:BIRD_CHICKEN:KIDNEY +CREATURE:CAVY:MUSCLE +CREATURE:CAVY:EYE +CREATURE:CAVY:BRAIN +CREATURE:CAVY:LUNG +CREATURE:CAVY:HEART +CREATURE:CAVY:LIVER +CREATURE:CAVY:GUT +CREATURE:CAVY:STOMACH +CREATURE:CAVY:GIZZARD +CREATURE:CAVY:PANCREAS +CREATURE:CAVY:SPLEEN +CREATURE:CAVY:KIDNEY +CREATURE:BIRD_DUCK:MUSCLE +CREATURE:BIRD_DUCK:EYE +CREATURE:BIRD_DUCK:BRAIN +CREATURE:BIRD_DUCK:LUNG +CREATURE:BIRD_DUCK:HEART +CREATURE:BIRD_DUCK:LIVER +CREATURE:BIRD_DUCK:GUT +CREATURE:BIRD_DUCK:STOMACH +CREATURE:BIRD_DUCK:GIZZARD +CREATURE:BIRD_DUCK:PANCREAS +CREATURE:BIRD_DUCK:SPLEEN +CREATURE:BIRD_DUCK:KIDNEY +CREATURE:WATER_BUFFALO:MUSCLE +CREATURE:WATER_BUFFALO:EYE +CREATURE:WATER_BUFFALO:BRAIN +CREATURE:WATER_BUFFALO:LUNG +CREATURE:WATER_BUFFALO:HEART +CREATURE:WATER_BUFFALO:LIVER +CREATURE:WATER_BUFFALO:GUT +CREATURE:WATER_BUFFALO:STOMACH +CREATURE:WATER_BUFFALO:GIZZARD +CREATURE:WATER_BUFFALO:PANCREAS +CREATURE:WATER_BUFFALO:SPLEEN +CREATURE:WATER_BUFFALO:KIDNEY +CREATURE:REINDEER:MUSCLE +CREATURE:REINDEER:EYE +CREATURE:REINDEER:BRAIN +CREATURE:REINDEER:LUNG +CREATURE:REINDEER:HEART +CREATURE:REINDEER:LIVER +CREATURE:REINDEER:GUT +CREATURE:REINDEER:STOMACH +CREATURE:REINDEER:GIZZARD +CREATURE:REINDEER:PANCREAS +CREATURE:REINDEER:SPLEEN +CREATURE:REINDEER:KIDNEY +CREATURE:BIRD_GOOSE:MUSCLE +CREATURE:BIRD_GOOSE:EYE +CREATURE:BIRD_GOOSE:BRAIN +CREATURE:BIRD_GOOSE:LUNG +CREATURE:BIRD_GOOSE:HEART +CREATURE:BIRD_GOOSE:LIVER +CREATURE:BIRD_GOOSE:GUT +CREATURE:BIRD_GOOSE:STOMACH +CREATURE:BIRD_GOOSE:GIZZARD +CREATURE:BIRD_GOOSE:PANCREAS +CREATURE:BIRD_GOOSE:SPLEEN +CREATURE:BIRD_GOOSE:KIDNEY +CREATURE:YAK:MUSCLE +CREATURE:YAK:EYE +CREATURE:YAK:BRAIN +CREATURE:YAK:LUNG +CREATURE:YAK:HEART +CREATURE:YAK:LIVER +CREATURE:YAK:GUT +CREATURE:YAK:STOMACH +CREATURE:YAK:GIZZARD +CREATURE:YAK:PANCREAS +CREATURE:YAK:SPLEEN +CREATURE:YAK:KIDNEY +CREATURE:LLAMA:MUSCLE +CREATURE:LLAMA:EYE +CREATURE:LLAMA:BRAIN +CREATURE:LLAMA:LUNG +CREATURE:LLAMA:HEART +CREATURE:LLAMA:LIVER +CREATURE:LLAMA:GUT +CREATURE:LLAMA:STOMACH +CREATURE:LLAMA:GIZZARD +CREATURE:LLAMA:PANCREAS +CREATURE:LLAMA:SPLEEN +CREATURE:LLAMA:KIDNEY +CREATURE:ALPACA:MUSCLE +CREATURE:ALPACA:EYE +CREATURE:ALPACA:BRAIN +CREATURE:ALPACA:LUNG +CREATURE:ALPACA:HEART +CREATURE:ALPACA:LIVER +CREATURE:ALPACA:GUT +CREATURE:ALPACA:STOMACH +CREATURE:ALPACA:GIZZARD +CREATURE:ALPACA:PANCREAS +CREATURE:ALPACA:SPLEEN +CREATURE:ALPACA:KIDNEY +CREATURE:BIRD_GUINEAFOWL:MUSCLE +CREATURE:BIRD_GUINEAFOWL:EYE +CREATURE:BIRD_GUINEAFOWL:BRAIN +CREATURE:BIRD_GUINEAFOWL:LUNG +CREATURE:BIRD_GUINEAFOWL:HEART +CREATURE:BIRD_GUINEAFOWL:LIVER +CREATURE:BIRD_GUINEAFOWL:GUT + CREATURE:BIRD_GUINEAFOWL:STOMACH + CREATURE:BIRD_GUINEAFOWL:GIZZARD +!CREATURE:BIRD_GUINEAFOWL:PANCREAS +CREATURE:BIRD_GUINEAFOWL:SPLEEN +CREATURE:BIRD_GUINEAFOWL:KIDNEY +!CREATURE:BIRD_PEAFOWL_BLUE:MUSCLE +CREATURE:BIRD_PEAFOWL_BLUE:EYE + CREATURE:BIRD_PEAFOWL_BLUE:BRAIN +CREATURE:BIRD_PEAFOWL_BLUE:LUNG + CREATURE:BIRD_PEAFOWL_BLUE:HEART + CREATURE:BIRD_PEAFOWL_BLUE:LIVER +CREATURE:BIRD_PEAFOWL_BLUE:GUT +"CREATURE:BIRD_PEAFOWL_BLUE:STOMACH +"CREATURE:BIRD_PEAFOWL_BLUE:GIZZARD +#CREATURE:BIRD_PEAFOWL_BLUE:PANCREAS +!CREATURE:BIRD_PEAFOWL_BLUE:SPLEEN +!CREATURE:BIRD_PEAFOWL_BLUE:KIDNEY +CREATURE:BIRD_TURKEY:MUSCLE +CREATURE:BIRD_TURKEY:EYE +CREATURE:BIRD_TURKEY:BRAIN +CREATURE:BIRD_TURKEY:LUNG +CREATURE:BIRD_TURKEY:HEART +CREATURE:BIRD_TURKEY:LIVER +CREATURE:BIRD_TURKEY:GUT +CREATURE:BIRD_TURKEY:STOMACH +CREATURE:BIRD_TURKEY:GIZZARD +CREATURE:BIRD_TURKEY:PANCREAS +CREATURE:BIRD_TURKEY:SPLEEN +CREATURE:BIRD_TURKEY:KIDNEY +CREATURE:RABBIT:MUSCLE +CREATURE:RABBIT:EYE +CREATURE:RABBIT:BRAIN +CREATURE:RABBIT:LUNG +CREATURE:RABBIT:HEART +CREATURE:RABBIT:LIVER +CREATURE:RABBIT:GUT +CREATURE:RABBIT:STOMACH +CREATURE:RABBIT:GIZZARD +CREATURE:RABBIT:PANCREAS +CREATURE:RABBIT:SPLEEN +CREATURE:RABBIT:KIDNEY +CREATURE:FLY:MUSCLE +CREATURE:FLY:EYE +CREATURE:FLY:BRAIN +CREATURE:FLY:LUNG +CREATURE:FLY:HEART +CREATURE:FLY:LIVER +CREATURE:FLY:GUT +CREATURE:FLY:STOMACH +CREATURE:FLY:GIZZARD +CREATURE:FLY:PANCREAS +CREATURE:FLY:SPLEEN +CREATURE:FLY:KIDNEY +CREATURE:FLY_MAN:MUSCLE +CREATURE:FLY_MAN:EYE +CREATURE:FLY_MAN:BRAIN +CREATURE:FLY_MAN:LUNG +CREATURE:FLY_MAN:HEART +CREATURE:FLY_MAN:LIVER +CREATURE:FLY_MAN:GUT +CREATURE:FLY_MAN:STOMACH +CREATURE:FLY_MAN:GIZZARD +CREATURE:FLY_MAN:PANCREAS +CREATURE:FLY_MAN:SPLEEN +CREATURE:FLY_MAN:KIDNEY +CREATURE:GIANT_FLY:MUSCLE +CREATURE:GIANT_FLY:EYE +CREATURE:GIANT_FLY:BRAIN +CREATURE:GIANT_FLY:LUNG +CREATURE:GIANT_FLY:HEART +CREATURE:GIANT_FLY:LIVER +CREATURE:GIANT_FLY:GUT +CREATURE:GIANT_FLY:STOMACH +CREATURE:GIANT_FLY:GIZZARD +CREATURE:GIANT_FLY:PANCREAS +CREATURE:GIANT_FLY:SPLEEN +CREATURE:GIANT_FLY:KIDNEY +CREATURE:ROACH_LARGE:MUSCLE +CREATURE:ROACH_LARGE:EYE +CREATURE:ROACH_LARGE:BRAIN +CREATURE:ROACH_LARGE:LUNG +CREATURE:ROACH_LARGE:HEART +CREATURE:ROACH_LARGE:LIVER +CREATURE:ROACH_LARGE:GUT +CREATURE:ROACH_LARGE:STOMACH +CREATURE:ROACH_LARGE:GIZZARD +CREATURE:ROACH_LARGE:PANCREAS +CREATURE:ROACH_LARGE:SPLEEN +CREATURE:ROACH_LARGE:KIDNEY +CREATURE:ROACH_MAN:MUSCLE +CREATURE:ROACH_MAN:EYE +CREATURE:ROACH_MAN:BRAIN +CREATURE:ROACH_MAN:LUNG +CREATURE:ROACH_MAN:HEART +CREATURE:ROACH_MAN:LIVER +CREATURE:ROACH_MAN:GUT +CREATURE:ROACH_MAN:STOMACH +CREATURE:ROACH_MAN:GIZZARD +CREATURE:ROACH_MAN:PANCREAS +CREATURE:ROACH_MAN:SPLEEN +CREATURE:ROACH_MAN:KIDNEY +CREATURE:GIANT_ROACH:MUSCLE +CREATURE:GIANT_ROACH:EYE +CREATURE:GIANT_ROACH:BRAIN +CREATURE:GIANT_ROACH:LUNG +CREATURE:GIANT_ROACH:HEART +CREATURE:GIANT_ROACH:LIVER +CREATURE:GIANT_ROACH:GUT +CREATURE:GIANT_ROACH:STOMACH +CREATURE:GIANT_ROACH:GIZZARD +CREATURE:GIANT_ROACH:PANCREAS +CREATURE:GIANT_ROACH:SPLEEN +CREATURE:GIANT_ROACH:KIDNEY +CREATURE:BEETLE:MUSCLE +CREATURE:BEETLE:EYE +CREATURE:BEETLE:BRAIN +CREATURE:BEETLE:LUNG +CREATURE:BEETLE:HEART +CREATURE:BEETLE:LIVER +CREATURE:BEETLE:GUT +CREATURE:BEETLE:STOMACH +CREATURE:BEETLE:GIZZARD +CREATURE:BEETLE:PANCREAS +CREATURE:BEETLE:SPLEEN +CREATURE:BEETLE:KIDNEY +CREATURE:BEETLE_MAN:MUSCLE +CREATURE:BEETLE_MAN:EYE +CREATURE:BEETLE_MAN:BRAIN +CREATURE:BEETLE_MAN:LUNG +CREATURE:BEETLE_MAN:HEART +CREATURE:BEETLE_MAN:LIVER +CREATURE:BEETLE_MAN:GUT +CREATURE:BEETLE_MAN:STOMACH +CREATURE:BEETLE_MAN:GIZZARD +CREATURE:BEETLE_MAN:PANCREAS +CREATURE:BEETLE_MAN:SPLEEN +CREATURE:BEETLE_MAN:KIDNEY +CREATURE:GIANT_BEETLE:MUSCLE +CREATURE:GIANT_BEETLE:EYE +CREATURE:GIANT_BEETLE:BRAIN +CREATURE:GIANT_BEETLE:LUNG +CREATURE:GIANT_BEETLE:HEART +CREATURE:GIANT_BEETLE:LIVER +CREATURE:GIANT_BEETLE:GUT +CREATURE:GIANT_BEETLE:STOMACH +CREATURE:GIANT_BEETLE:GIZZARD +CREATURE:GIANT_BEETLE:PANCREAS +CREATURE:GIANT_BEETLE:SPLEEN +CREATURE:GIANT_BEETLE:KIDNEY +CREATURE:ANT:MUSCLE +CREATURE:ANT:EYE +CREATURE:ANT:BRAIN +CREATURE:ANT:LUNG +CREATURE:ANT:HEART +CREATURE:ANT:LIVER +CREATURE:ANT:GUT +CREATURE:ANT:STOMACH +CREATURE:ANT:GIZZARD +CREATURE:ANT:PANCREAS +CREATURE:ANT:SPLEEN +CREATURE:ANT:KIDNEY +!CREATURE:BUTTERFLY_MONARCH:MUSCLE +CREATURE:BUTTERFLY_MONARCH:EYE + CREATURE:BUTTERFLY_MONARCH:BRAIN +CREATURE:BUTTERFLY_MONARCH:LUNG + CREATURE:BUTTERFLY_MONARCH:HEART + CREATURE:BUTTERFLY_MONARCH:LIVER +CREATURE:BUTTERFLY_MONARCH:GUT +"CREATURE:BUTTERFLY_MONARCH:STOMACH +"CREATURE:BUTTERFLY_MONARCH:GIZZARD +#CREATURE:BUTTERFLY_MONARCH:PANCREAS +!CREATURE:BUTTERFLY_MONARCH:SPLEEN +!CREATURE:BUTTERFLY_MONARCH:KIDNEY +%CREATURE:BUTTERFLY_MONARCH_MAN:MUSCLE +"CREATURE:BUTTERFLY_MONARCH_MAN:EYE +$CREATURE:BUTTERFLY_MONARCH_MAN:BRAIN +#CREATURE:BUTTERFLY_MONARCH_MAN:LUNG +$CREATURE:BUTTERFLY_MONARCH_MAN:HEART +$CREATURE:BUTTERFLY_MONARCH_MAN:LIVER +"CREATURE:BUTTERFLY_MONARCH_MAN:GUT +&CREATURE:BUTTERFLY_MONARCH_MAN:STOMACH +&CREATURE:BUTTERFLY_MONARCH_MAN:GIZZARD +'CREATURE:BUTTERFLY_MONARCH_MAN:PANCREAS +%CREATURE:BUTTERFLY_MONARCH_MAN:SPLEEN +%CREATURE:BUTTERFLY_MONARCH_MAN:KIDNEY +'CREATURE:GIANT_BUTTERFLY_MONARCH:MUSCLE +$CREATURE:GIANT_BUTTERFLY_MONARCH:EYE +&CREATURE:GIANT_BUTTERFLY_MONARCH:BRAIN +%CREATURE:GIANT_BUTTERFLY_MONARCH:LUNG +&CREATURE:GIANT_BUTTERFLY_MONARCH:HEART +&CREATURE:GIANT_BUTTERFLY_MONARCH:LIVER +$CREATURE:GIANT_BUTTERFLY_MONARCH:GUT +(CREATURE:GIANT_BUTTERFLY_MONARCH:STOMACH +(CREATURE:GIANT_BUTTERFLY_MONARCH:GIZZARD +)CREATURE:GIANT_BUTTERFLY_MONARCH:PANCREAS +'CREATURE:GIANT_BUTTERFLY_MONARCH:SPLEEN +'CREATURE:GIANT_BUTTERFLY_MONARCH:KIDNEY +CREATURE:FIREFLY:MUSCLE +CREATURE:FIREFLY:EYE +CREATURE:FIREFLY:BRAIN +CREATURE:FIREFLY:LUNG +CREATURE:FIREFLY:HEART +CREATURE:FIREFLY:LIVER +CREATURE:FIREFLY:GUT +CREATURE:FIREFLY:STOMACH +CREATURE:FIREFLY:GIZZARD +CREATURE:FIREFLY:PANCREAS +CREATURE:FIREFLY:SPLEEN +CREATURE:FIREFLY:KIDNEY +CREATURE:FIREFLY_MAN:MUSCLE +CREATURE:FIREFLY_MAN:EYE +CREATURE:FIREFLY_MAN:BRAIN +CREATURE:FIREFLY_MAN:LUNG +CREATURE:FIREFLY_MAN:HEART +CREATURE:FIREFLY_MAN:LIVER +CREATURE:FIREFLY_MAN:GUT +CREATURE:FIREFLY_MAN:STOMACH +CREATURE:FIREFLY_MAN:GIZZARD +CREATURE:FIREFLY_MAN:PANCREAS +CREATURE:FIREFLY_MAN:SPLEEN +CREATURE:FIREFLY_MAN:KIDNEY +CREATURE:GIANT_FIREFLY:MUSCLE +CREATURE:GIANT_FIREFLY:EYE +CREATURE:GIANT_FIREFLY:BRAIN +CREATURE:GIANT_FIREFLY:LUNG +CREATURE:GIANT_FIREFLY:HEART +CREATURE:GIANT_FIREFLY:LIVER +CREATURE:GIANT_FIREFLY:GUT +CREATURE:GIANT_FIREFLY:STOMACH +CREATURE:GIANT_FIREFLY:GIZZARD +CREATURE:GIANT_FIREFLY:PANCREAS +CREATURE:GIANT_FIREFLY:SPLEEN +CREATURE:GIANT_FIREFLY:KIDNEY +CREATURE:DRAGONFLY:MUSCLE +CREATURE:DRAGONFLY:EYE +CREATURE:DRAGONFLY:BRAIN +CREATURE:DRAGONFLY:LUNG +CREATURE:DRAGONFLY:HEART +CREATURE:DRAGONFLY:LIVER +CREATURE:DRAGONFLY:GUT +CREATURE:DRAGONFLY:STOMACH +CREATURE:DRAGONFLY:GIZZARD +CREATURE:DRAGONFLY:PANCREAS +CREATURE:DRAGONFLY:SPLEEN +CREATURE:DRAGONFLY:KIDNEY +CREATURE:DRAGONFLY_MAN:MUSCLE +CREATURE:DRAGONFLY_MAN:EYE +CREATURE:DRAGONFLY_MAN:BRAIN +CREATURE:DRAGONFLY_MAN:LUNG +CREATURE:DRAGONFLY_MAN:HEART +CREATURE:DRAGONFLY_MAN:LIVER +CREATURE:DRAGONFLY_MAN:GUT +CREATURE:DRAGONFLY_MAN:STOMACH +CREATURE:DRAGONFLY_MAN:GIZZARD +CREATURE:DRAGONFLY_MAN:PANCREAS +CREATURE:DRAGONFLY_MAN:SPLEEN +CREATURE:DRAGONFLY_MAN:KIDNEY +CREATURE:GIANT_DRAGONFLY:MUSCLE +CREATURE:GIANT_DRAGONFLY:EYE +CREATURE:GIANT_DRAGONFLY:BRAIN +CREATURE:GIANT_DRAGONFLY:LUNG +CREATURE:GIANT_DRAGONFLY:HEART +CREATURE:GIANT_DRAGONFLY:LIVER +CREATURE:GIANT_DRAGONFLY:GUT + CREATURE:GIANT_DRAGONFLY:STOMACH + CREATURE:GIANT_DRAGONFLY:GIZZARD +!CREATURE:GIANT_DRAGONFLY:PANCREAS +CREATURE:GIANT_DRAGONFLY:SPLEEN +CREATURE:GIANT_DRAGONFLY:KIDNEY +CREATURE:HONEY_BEE:MUSCLE +CREATURE:HONEY_BEE:EYE +CREATURE:HONEY_BEE:BRAIN +CREATURE:HONEY_BEE:LUNG +CREATURE:HONEY_BEE:HEART +CREATURE:HONEY_BEE:LIVER +CREATURE:HONEY_BEE:GUT +CREATURE:HONEY_BEE:STOMACH +CREATURE:HONEY_BEE:GIZZARD +CREATURE:HONEY_BEE:PANCREAS +CREATURE:HONEY_BEE:SPLEEN +CREATURE:HONEY_BEE:KIDNEY +CREATURE:BUMBLEBEE:MUSCLE +CREATURE:BUMBLEBEE:EYE +CREATURE:BUMBLEBEE:BRAIN +CREATURE:BUMBLEBEE:LUNG +CREATURE:BUMBLEBEE:HEART +CREATURE:BUMBLEBEE:LIVER +CREATURE:BUMBLEBEE:GUT +CREATURE:BUMBLEBEE:STOMACH +CREATURE:BUMBLEBEE:GIZZARD +CREATURE:BUMBLEBEE:PANCREAS +CREATURE:BUMBLEBEE:SPLEEN +CREATURE:BUMBLEBEE:KIDNEY +CREATURE:GOAT_MOUNTAIN:MUSCLE +CREATURE:GOAT_MOUNTAIN:EYE +CREATURE:GOAT_MOUNTAIN:BRAIN +CREATURE:GOAT_MOUNTAIN:LUNG +CREATURE:GOAT_MOUNTAIN:HEART +CREATURE:GOAT_MOUNTAIN:LIVER +CREATURE:GOAT_MOUNTAIN:GUT +CREATURE:GOAT_MOUNTAIN:STOMACH +CREATURE:GOAT_MOUNTAIN:GIZZARD +CREATURE:GOAT_MOUNTAIN:PANCREAS +CREATURE:GOAT_MOUNTAIN:SPLEEN +CREATURE:GOAT_MOUNTAIN:KIDNEY +!CREATURE:GOAT_MOUNTAIN_MAN:MUSCLE +CREATURE:GOAT_MOUNTAIN_MAN:EYE + CREATURE:GOAT_MOUNTAIN_MAN:BRAIN +CREATURE:GOAT_MOUNTAIN_MAN:LUNG + CREATURE:GOAT_MOUNTAIN_MAN:HEART + CREATURE:GOAT_MOUNTAIN_MAN:LIVER +CREATURE:GOAT_MOUNTAIN_MAN:GUT +"CREATURE:GOAT_MOUNTAIN_MAN:STOMACH +"CREATURE:GOAT_MOUNTAIN_MAN:GIZZARD +#CREATURE:GOAT_MOUNTAIN_MAN:PANCREAS +!CREATURE:GOAT_MOUNTAIN_MAN:SPLEEN +!CREATURE:GOAT_MOUNTAIN_MAN:KIDNEY +#CREATURE:GIANT_GOAT_MOUNTAIN:MUSCLE + CREATURE:GIANT_GOAT_MOUNTAIN:EYE +"CREATURE:GIANT_GOAT_MOUNTAIN:BRAIN +!CREATURE:GIANT_GOAT_MOUNTAIN:LUNG +"CREATURE:GIANT_GOAT_MOUNTAIN:HEART +"CREATURE:GIANT_GOAT_MOUNTAIN:LIVER + CREATURE:GIANT_GOAT_MOUNTAIN:GUT +$CREATURE:GIANT_GOAT_MOUNTAIN:STOMACH +$CREATURE:GIANT_GOAT_MOUNTAIN:GIZZARD +%CREATURE:GIANT_GOAT_MOUNTAIN:PANCREAS +#CREATURE:GIANT_GOAT_MOUNTAIN:SPLEEN +#CREATURE:GIANT_GOAT_MOUNTAIN:KIDNEY +CREATURE:MARMOT_HOARY:MUSCLE +CREATURE:MARMOT_HOARY:EYE +CREATURE:MARMOT_HOARY:BRAIN +CREATURE:MARMOT_HOARY:LUNG +CREATURE:MARMOT_HOARY:HEART +CREATURE:MARMOT_HOARY:LIVER +CREATURE:MARMOT_HOARY:GUT +CREATURE:MARMOT_HOARY:STOMACH +CREATURE:MARMOT_HOARY:GIZZARD +CREATURE:MARMOT_HOARY:PANCREAS +CREATURE:MARMOT_HOARY:SPLEEN +CREATURE:MARMOT_HOARY:KIDNEY + CREATURE:MARMOT_HOARY_MAN:MUSCLE +CREATURE:MARMOT_HOARY_MAN:EYE +CREATURE:MARMOT_HOARY_MAN:BRAIN +CREATURE:MARMOT_HOARY_MAN:LUNG +CREATURE:MARMOT_HOARY_MAN:HEART +CREATURE:MARMOT_HOARY_MAN:LIVER +CREATURE:MARMOT_HOARY_MAN:GUT +!CREATURE:MARMOT_HOARY_MAN:STOMACH +!CREATURE:MARMOT_HOARY_MAN:GIZZARD +"CREATURE:MARMOT_HOARY_MAN:PANCREAS + CREATURE:MARMOT_HOARY_MAN:SPLEEN + CREATURE:MARMOT_HOARY_MAN:KIDNEY +"CREATURE:GIANT_MARMOT_HOARY:MUSCLE +CREATURE:GIANT_MARMOT_HOARY:EYE +!CREATURE:GIANT_MARMOT_HOARY:BRAIN + CREATURE:GIANT_MARMOT_HOARY:LUNG +!CREATURE:GIANT_MARMOT_HOARY:HEART +!CREATURE:GIANT_MARMOT_HOARY:LIVER +CREATURE:GIANT_MARMOT_HOARY:GUT +#CREATURE:GIANT_MARMOT_HOARY:STOMACH +#CREATURE:GIANT_MARMOT_HOARY:GIZZARD +$CREATURE:GIANT_MARMOT_HOARY:PANCREAS +"CREATURE:GIANT_MARMOT_HOARY:SPLEEN +"CREATURE:GIANT_MARMOT_HOARY:KIDNEY +CREATURE:GNOME_MOUNTAIN:MUSCLE +CREATURE:GNOME_MOUNTAIN:EYE +CREATURE:GNOME_MOUNTAIN:BRAIN +CREATURE:GNOME_MOUNTAIN:LUNG +CREATURE:GNOME_MOUNTAIN:HEART +CREATURE:GNOME_MOUNTAIN:LIVER +CREATURE:GNOME_MOUNTAIN:GUT +CREATURE:GNOME_MOUNTAIN:STOMACH +CREATURE:GNOME_MOUNTAIN:GIZZARD + CREATURE:GNOME_MOUNTAIN:PANCREAS +CREATURE:GNOME_MOUNTAIN:SPLEEN +CREATURE:GNOME_MOUNTAIN:KIDNEY +CREATURE:GNOME_DARK:MUSCLE +CREATURE:GNOME_DARK:EYE +CREATURE:GNOME_DARK:BRAIN +CREATURE:GNOME_DARK:LUNG +CREATURE:GNOME_DARK:HEART +CREATURE:GNOME_DARK:LIVER +CREATURE:GNOME_DARK:GUT +CREATURE:GNOME_DARK:STOMACH +CREATURE:GNOME_DARK:GIZZARD +CREATURE:GNOME_DARK:PANCREAS +CREATURE:GNOME_DARK:SPLEEN +CREATURE:GNOME_DARK:KIDNEY +CREATURE:WALRUS:MUSCLE +CREATURE:WALRUS:EYE +CREATURE:WALRUS:BRAIN +CREATURE:WALRUS:LUNG +CREATURE:WALRUS:HEART +CREATURE:WALRUS:LIVER +CREATURE:WALRUS:GUT +CREATURE:WALRUS:STOMACH +CREATURE:WALRUS:GIZZARD +CREATURE:WALRUS:PANCREAS +CREATURE:WALRUS:SPLEEN +CREATURE:WALRUS:KIDNEY +CREATURE:WALRUS_MAN:MUSCLE +CREATURE:WALRUS_MAN:EYE +CREATURE:WALRUS_MAN:BRAIN +CREATURE:WALRUS_MAN:LUNG +CREATURE:WALRUS_MAN:HEART +CREATURE:WALRUS_MAN:LIVER +CREATURE:WALRUS_MAN:GUT +CREATURE:WALRUS_MAN:STOMACH +CREATURE:WALRUS_MAN:GIZZARD +CREATURE:WALRUS_MAN:PANCREAS +CREATURE:WALRUS_MAN:SPLEEN +CREATURE:WALRUS_MAN:KIDNEY +CREATURE:GIANT_WALRUS:MUSCLE +CREATURE:GIANT_WALRUS:EYE +CREATURE:GIANT_WALRUS:BRAIN +CREATURE:GIANT_WALRUS:LUNG +CREATURE:GIANT_WALRUS:HEART +CREATURE:GIANT_WALRUS:LIVER +CREATURE:GIANT_WALRUS:GUT +CREATURE:GIANT_WALRUS:STOMACH +CREATURE:GIANT_WALRUS:GIZZARD +CREATURE:GIANT_WALRUS:PANCREAS +CREATURE:GIANT_WALRUS:SPLEEN +CREATURE:GIANT_WALRUS:KIDNEY + CREATURE:FISH_LAMPREY_SEA:MUSCLE +CREATURE:FISH_LAMPREY_SEA:EYE +CREATURE:FISH_LAMPREY_SEA:BRAIN +CREATURE:FISH_LAMPREY_SEA:LUNG +CREATURE:FISH_LAMPREY_SEA:HEART +CREATURE:FISH_LAMPREY_SEA:LIVER +CREATURE:FISH_LAMPREY_SEA:GUT +!CREATURE:FISH_LAMPREY_SEA:STOMACH +!CREATURE:FISH_LAMPREY_SEA:GIZZARD +"CREATURE:FISH_LAMPREY_SEA:PANCREAS + CREATURE:FISH_LAMPREY_SEA:SPLEEN + CREATURE:FISH_LAMPREY_SEA:KIDNEY +!CREATURE:SHARK_GREAT_WHITE:MUSCLE +CREATURE:SHARK_GREAT_WHITE:EYE + CREATURE:SHARK_GREAT_WHITE:BRAIN +CREATURE:SHARK_GREAT_WHITE:LUNG + CREATURE:SHARK_GREAT_WHITE:HEART + CREATURE:SHARK_GREAT_WHITE:LIVER +CREATURE:SHARK_GREAT_WHITE:GUT +"CREATURE:SHARK_GREAT_WHITE:STOMACH +"CREATURE:SHARK_GREAT_WHITE:GIZZARD +#CREATURE:SHARK_GREAT_WHITE:PANCREAS +!CREATURE:SHARK_GREAT_WHITE:SPLEEN +!CREATURE:SHARK_GREAT_WHITE:KIDNEY +CREATURE:SHARK_FRILL:MUSCLE +CREATURE:SHARK_FRILL:EYE +CREATURE:SHARK_FRILL:BRAIN +CREATURE:SHARK_FRILL:LUNG +CREATURE:SHARK_FRILL:HEART +CREATURE:SHARK_FRILL:LIVER +CREATURE:SHARK_FRILL:GUT +CREATURE:SHARK_FRILL:STOMACH +CREATURE:SHARK_FRILL:GIZZARD +CREATURE:SHARK_FRILL:PANCREAS +CREATURE:SHARK_FRILL:SPLEEN +CREATURE:SHARK_FRILL:KIDNEY +#CREATURE:SHARK_SPINY_DOGFISH:MUSCLE + CREATURE:SHARK_SPINY_DOGFISH:EYE +"CREATURE:SHARK_SPINY_DOGFISH:BRAIN +!CREATURE:SHARK_SPINY_DOGFISH:LUNG +"CREATURE:SHARK_SPINY_DOGFISH:HEART +"CREATURE:SHARK_SPINY_DOGFISH:LIVER + CREATURE:SHARK_SPINY_DOGFISH:GUT +$CREATURE:SHARK_SPINY_DOGFISH:STOMACH +$CREATURE:SHARK_SPINY_DOGFISH:GIZZARD +%CREATURE:SHARK_SPINY_DOGFISH:PANCREAS +#CREATURE:SHARK_SPINY_DOGFISH:SPLEEN +#CREATURE:SHARK_SPINY_DOGFISH:KIDNEY +'CREATURE:SHARK_WOBBEGONG_SPOTTED:MUSCLE +$CREATURE:SHARK_WOBBEGONG_SPOTTED:EYE +&CREATURE:SHARK_WOBBEGONG_SPOTTED:BRAIN +%CREATURE:SHARK_WOBBEGONG_SPOTTED:LUNG +&CREATURE:SHARK_WOBBEGONG_SPOTTED:HEART +&CREATURE:SHARK_WOBBEGONG_SPOTTED:LIVER +$CREATURE:SHARK_WOBBEGONG_SPOTTED:GUT +(CREATURE:SHARK_WOBBEGONG_SPOTTED:STOMACH +(CREATURE:SHARK_WOBBEGONG_SPOTTED:GIZZARD +)CREATURE:SHARK_WOBBEGONG_SPOTTED:PANCREAS +'CREATURE:SHARK_WOBBEGONG_SPOTTED:SPLEEN +'CREATURE:SHARK_WOBBEGONG_SPOTTED:KIDNEY +CREATURE:SHARK_WHALE:MUSCLE +CREATURE:SHARK_WHALE:EYE +CREATURE:SHARK_WHALE:BRAIN +CREATURE:SHARK_WHALE:LUNG +CREATURE:SHARK_WHALE:HEART +CREATURE:SHARK_WHALE:LIVER +CREATURE:SHARK_WHALE:GUT +CREATURE:SHARK_WHALE:STOMACH +CREATURE:SHARK_WHALE:GIZZARD +CREATURE:SHARK_WHALE:PANCREAS +CREATURE:SHARK_WHALE:SPLEEN +CREATURE:SHARK_WHALE:KIDNEY +CREATURE:SHARK_BASKING:MUSCLE +CREATURE:SHARK_BASKING:EYE +CREATURE:SHARK_BASKING:BRAIN +CREATURE:SHARK_BASKING:LUNG +CREATURE:SHARK_BASKING:HEART +CREATURE:SHARK_BASKING:LIVER +CREATURE:SHARK_BASKING:GUT +CREATURE:SHARK_BASKING:STOMACH +CREATURE:SHARK_BASKING:GIZZARD +CREATURE:SHARK_BASKING:PANCREAS +CREATURE:SHARK_BASKING:SPLEEN +CREATURE:SHARK_BASKING:KIDNEY +CREATURE:SHARK_NURSE:MUSCLE +CREATURE:SHARK_NURSE:EYE +CREATURE:SHARK_NURSE:BRAIN +CREATURE:SHARK_NURSE:LUNG +CREATURE:SHARK_NURSE:HEART +CREATURE:SHARK_NURSE:LIVER +CREATURE:SHARK_NURSE:GUT +CREATURE:SHARK_NURSE:STOMACH +CREATURE:SHARK_NURSE:GIZZARD +CREATURE:SHARK_NURSE:PANCREAS +CREATURE:SHARK_NURSE:SPLEEN +CREATURE:SHARK_NURSE:KIDNEY +#CREATURE:SHARK_MAKO_SHORTFIN:MUSCLE + CREATURE:SHARK_MAKO_SHORTFIN:EYE +"CREATURE:SHARK_MAKO_SHORTFIN:BRAIN +!CREATURE:SHARK_MAKO_SHORTFIN:LUNG +"CREATURE:SHARK_MAKO_SHORTFIN:HEART +"CREATURE:SHARK_MAKO_SHORTFIN:LIVER + CREATURE:SHARK_MAKO_SHORTFIN:GUT +$CREATURE:SHARK_MAKO_SHORTFIN:STOMACH +$CREATURE:SHARK_MAKO_SHORTFIN:GIZZARD +%CREATURE:SHARK_MAKO_SHORTFIN:PANCREAS +#CREATURE:SHARK_MAKO_SHORTFIN:SPLEEN +#CREATURE:SHARK_MAKO_SHORTFIN:KIDNEY +"CREATURE:SHARK_MAKO_LONGFIN:MUSCLE +CREATURE:SHARK_MAKO_LONGFIN:EYE +!CREATURE:SHARK_MAKO_LONGFIN:BRAIN + CREATURE:SHARK_MAKO_LONGFIN:LUNG +!CREATURE:SHARK_MAKO_LONGFIN:HEART +!CREATURE:SHARK_MAKO_LONGFIN:LIVER +CREATURE:SHARK_MAKO_LONGFIN:GUT +#CREATURE:SHARK_MAKO_LONGFIN:STOMACH +#CREATURE:SHARK_MAKO_LONGFIN:GIZZARD +$CREATURE:SHARK_MAKO_LONGFIN:PANCREAS +"CREATURE:SHARK_MAKO_LONGFIN:SPLEEN +"CREATURE:SHARK_MAKO_LONGFIN:KIDNEY +CREATURE:SHARK_TIGER:MUSCLE +CREATURE:SHARK_TIGER:EYE +CREATURE:SHARK_TIGER:BRAIN +CREATURE:SHARK_TIGER:LUNG +CREATURE:SHARK_TIGER:HEART +CREATURE:SHARK_TIGER:LIVER +CREATURE:SHARK_TIGER:GUT +CREATURE:SHARK_TIGER:STOMACH +CREATURE:SHARK_TIGER:GIZZARD +CREATURE:SHARK_TIGER:PANCREAS +CREATURE:SHARK_TIGER:SPLEEN +CREATURE:SHARK_TIGER:KIDNEY +CREATURE:SHARK_BULL:MUSCLE +CREATURE:SHARK_BULL:EYE +CREATURE:SHARK_BULL:BRAIN +CREATURE:SHARK_BULL:LUNG +CREATURE:SHARK_BULL:HEART +CREATURE:SHARK_BULL:LIVER +CREATURE:SHARK_BULL:GUT +CREATURE:SHARK_BULL:STOMACH +CREATURE:SHARK_BULL:GIZZARD +CREATURE:SHARK_BULL:PANCREAS +CREATURE:SHARK_BULL:SPLEEN +CREATURE:SHARK_BULL:KIDNEY +#CREATURE:SHARK_REEF_BLACKTIP:MUSCLE + CREATURE:SHARK_REEF_BLACKTIP:EYE +"CREATURE:SHARK_REEF_BLACKTIP:BRAIN +!CREATURE:SHARK_REEF_BLACKTIP:LUNG +"CREATURE:SHARK_REEF_BLACKTIP:HEART +"CREATURE:SHARK_REEF_BLACKTIP:LIVER + CREATURE:SHARK_REEF_BLACKTIP:GUT +$CREATURE:SHARK_REEF_BLACKTIP:STOMACH +$CREATURE:SHARK_REEF_BLACKTIP:GIZZARD +%CREATURE:SHARK_REEF_BLACKTIP:PANCREAS +#CREATURE:SHARK_REEF_BLACKTIP:SPLEEN +#CREATURE:SHARK_REEF_BLACKTIP:KIDNEY +#CREATURE:SHARK_REEF_WHITETIP:MUSCLE + CREATURE:SHARK_REEF_WHITETIP:EYE +"CREATURE:SHARK_REEF_WHITETIP:BRAIN +!CREATURE:SHARK_REEF_WHITETIP:LUNG +"CREATURE:SHARK_REEF_WHITETIP:HEART +"CREATURE:SHARK_REEF_WHITETIP:LIVER + CREATURE:SHARK_REEF_WHITETIP:GUT +$CREATURE:SHARK_REEF_WHITETIP:STOMACH +$CREATURE:SHARK_REEF_WHITETIP:GIZZARD +%CREATURE:SHARK_REEF_WHITETIP:PANCREAS +#CREATURE:SHARK_REEF_WHITETIP:SPLEEN +#CREATURE:SHARK_REEF_WHITETIP:KIDNEY +CREATURE:SHARK_BLUE:MUSCLE +CREATURE:SHARK_BLUE:EYE +CREATURE:SHARK_BLUE:BRAIN +CREATURE:SHARK_BLUE:LUNG +CREATURE:SHARK_BLUE:HEART +CREATURE:SHARK_BLUE:LIVER +CREATURE:SHARK_BLUE:GUT +CREATURE:SHARK_BLUE:STOMACH +CREATURE:SHARK_BLUE:GIZZARD +CREATURE:SHARK_BLUE:PANCREAS +CREATURE:SHARK_BLUE:SPLEEN +CREATURE:SHARK_BLUE:KIDNEY + CREATURE:SHARK_HAMMERHEAD:MUSCLE +CREATURE:SHARK_HAMMERHEAD:EYE +CREATURE:SHARK_HAMMERHEAD:BRAIN +CREATURE:SHARK_HAMMERHEAD:LUNG +CREATURE:SHARK_HAMMERHEAD:HEART +CREATURE:SHARK_HAMMERHEAD:LIVER +CREATURE:SHARK_HAMMERHEAD:GUT +!CREATURE:SHARK_HAMMERHEAD:STOMACH +!CREATURE:SHARK_HAMMERHEAD:GIZZARD +"CREATURE:SHARK_HAMMERHEAD:PANCREAS + CREATURE:SHARK_HAMMERHEAD:SPLEEN + CREATURE:SHARK_HAMMERHEAD:KIDNEY +CREATURE:SHARK_ANGEL:MUSCLE +CREATURE:SHARK_ANGEL:EYE +CREATURE:SHARK_ANGEL:BRAIN +CREATURE:SHARK_ANGEL:LUNG +CREATURE:SHARK_ANGEL:HEART +CREATURE:SHARK_ANGEL:LIVER +CREATURE:SHARK_ANGEL:GUT +CREATURE:SHARK_ANGEL:STOMACH +CREATURE:SHARK_ANGEL:GIZZARD +CREATURE:SHARK_ANGEL:PANCREAS +CREATURE:SHARK_ANGEL:SPLEEN +CREATURE:SHARK_ANGEL:KIDNEY +!CREATURE:FISH_SKATE_COMMON:MUSCLE +CREATURE:FISH_SKATE_COMMON:EYE + CREATURE:FISH_SKATE_COMMON:BRAIN +CREATURE:FISH_SKATE_COMMON:LUNG + CREATURE:FISH_SKATE_COMMON:HEART + CREATURE:FISH_SKATE_COMMON:LIVER +CREATURE:FISH_SKATE_COMMON:GUT +"CREATURE:FISH_SKATE_COMMON:STOMACH +"CREATURE:FISH_SKATE_COMMON:GIZZARD +#CREATURE:FISH_SKATE_COMMON:PANCREAS +!CREATURE:FISH_SKATE_COMMON:SPLEEN +!CREATURE:FISH_SKATE_COMMON:KIDNEY +CREATURE:FISH_RAY_MANTA:MUSCLE +CREATURE:FISH_RAY_MANTA:EYE +CREATURE:FISH_RAY_MANTA:BRAIN +CREATURE:FISH_RAY_MANTA:LUNG +CREATURE:FISH_RAY_MANTA:HEART +CREATURE:FISH_RAY_MANTA:LIVER +CREATURE:FISH_RAY_MANTA:GUT +CREATURE:FISH_RAY_MANTA:STOMACH +CREATURE:FISH_RAY_MANTA:GIZZARD + CREATURE:FISH_RAY_MANTA:PANCREAS +CREATURE:FISH_RAY_MANTA:SPLEEN +CREATURE:FISH_RAY_MANTA:KIDNEY +CREATURE:FISH_STINGRAY:MUSCLE +CREATURE:FISH_STINGRAY:EYE +CREATURE:FISH_STINGRAY:BRAIN +CREATURE:FISH_STINGRAY:LUNG +CREATURE:FISH_STINGRAY:HEART +CREATURE:FISH_STINGRAY:LIVER +CREATURE:FISH_STINGRAY:GUT +CREATURE:FISH_STINGRAY:STOMACH +CREATURE:FISH_STINGRAY:GIZZARD +CREATURE:FISH_STINGRAY:PANCREAS +CREATURE:FISH_STINGRAY:SPLEEN +CREATURE:FISH_STINGRAY:KIDNEY +CREATURE:FISH_COELACANTH:MUSCLE +CREATURE:FISH_COELACANTH:EYE +CREATURE:FISH_COELACANTH:BRAIN +CREATURE:FISH_COELACANTH:LUNG +CREATURE:FISH_COELACANTH:HEART +CREATURE:FISH_COELACANTH:LIVER +CREATURE:FISH_COELACANTH:GUT + CREATURE:FISH_COELACANTH:STOMACH + CREATURE:FISH_COELACANTH:GIZZARD +!CREATURE:FISH_COELACANTH:PANCREAS +CREATURE:FISH_COELACANTH:SPLEEN +CREATURE:FISH_COELACANTH:KIDNEY +CREATURE:FISH_STURGEON:MUSCLE +CREATURE:FISH_STURGEON:EYE +CREATURE:FISH_STURGEON:BRAIN +CREATURE:FISH_STURGEON:LUNG +CREATURE:FISH_STURGEON:HEART +CREATURE:FISH_STURGEON:LIVER +CREATURE:FISH_STURGEON:GUT +CREATURE:FISH_STURGEON:STOMACH +CREATURE:FISH_STURGEON:GIZZARD +CREATURE:FISH_STURGEON:PANCREAS +CREATURE:FISH_STURGEON:SPLEEN +CREATURE:FISH_STURGEON:KIDNEY +CREATURE:FISH_CONGER_EEL:MUSCLE +CREATURE:FISH_CONGER_EEL:EYE +CREATURE:FISH_CONGER_EEL:BRAIN +CREATURE:FISH_CONGER_EEL:LUNG +CREATURE:FISH_CONGER_EEL:HEART +CREATURE:FISH_CONGER_EEL:LIVER +CREATURE:FISH_CONGER_EEL:GUT + CREATURE:FISH_CONGER_EEL:STOMACH + CREATURE:FISH_CONGER_EEL:GIZZARD +!CREATURE:FISH_CONGER_EEL:PANCREAS +CREATURE:FISH_CONGER_EEL:SPLEEN +CREATURE:FISH_CONGER_EEL:KIDNEY +CREATURE:FISH_MILKFISH:MUSCLE +CREATURE:FISH_MILKFISH:EYE +CREATURE:FISH_MILKFISH:BRAIN +CREATURE:FISH_MILKFISH:LUNG +CREATURE:FISH_MILKFISH:HEART +CREATURE:FISH_MILKFISH:LIVER +CREATURE:FISH_MILKFISH:GUT +CREATURE:FISH_MILKFISH:STOMACH +CREATURE:FISH_MILKFISH:GIZZARD +CREATURE:FISH_MILKFISH:PANCREAS +CREATURE:FISH_MILKFISH:SPLEEN +CREATURE:FISH_MILKFISH:KIDNEY +CREATURE:FISH_COD:MUSCLE +CREATURE:FISH_COD:EYE +CREATURE:FISH_COD:BRAIN +CREATURE:FISH_COD:LUNG +CREATURE:FISH_COD:HEART +CREATURE:FISH_COD:LIVER +CREATURE:FISH_COD:GUT +CREATURE:FISH_COD:STOMACH +CREATURE:FISH_COD:GIZZARD +CREATURE:FISH_COD:PANCREAS +CREATURE:FISH_COD:SPLEEN +CREATURE:FISH_COD:KIDNEY +CREATURE:FISH_OPAH:MUSCLE +CREATURE:FISH_OPAH:EYE +CREATURE:FISH_OPAH:BRAIN +CREATURE:FISH_OPAH:LUNG +CREATURE:FISH_OPAH:HEART +CREATURE:FISH_OPAH:LIVER +CREATURE:FISH_OPAH:GUT +CREATURE:FISH_OPAH:STOMACH +CREATURE:FISH_OPAH:GIZZARD +CREATURE:FISH_OPAH:PANCREAS +CREATURE:FISH_OPAH:SPLEEN +CREATURE:FISH_OPAH:KIDNEY +"CREATURE:FISH_GROUPER_GIANT:MUSCLE +CREATURE:FISH_GROUPER_GIANT:EYE +!CREATURE:FISH_GROUPER_GIANT:BRAIN + CREATURE:FISH_GROUPER_GIANT:LUNG +!CREATURE:FISH_GROUPER_GIANT:HEART +!CREATURE:FISH_GROUPER_GIANT:LIVER +CREATURE:FISH_GROUPER_GIANT:GUT +#CREATURE:FISH_GROUPER_GIANT:STOMACH +#CREATURE:FISH_GROUPER_GIANT:GIZZARD +$CREATURE:FISH_GROUPER_GIANT:PANCREAS +"CREATURE:FISH_GROUPER_GIANT:SPLEEN +"CREATURE:FISH_GROUPER_GIANT:KIDNEY +CREATURE:FISH_BLUEFISH:MUSCLE +CREATURE:FISH_BLUEFISH:EYE +CREATURE:FISH_BLUEFISH:BRAIN +CREATURE:FISH_BLUEFISH:LUNG +CREATURE:FISH_BLUEFISH:HEART +CREATURE:FISH_BLUEFISH:LIVER +CREATURE:FISH_BLUEFISH:GUT +CREATURE:FISH_BLUEFISH:STOMACH +CREATURE:FISH_BLUEFISH:GIZZARD +CREATURE:FISH_BLUEFISH:PANCREAS +CREATURE:FISH_BLUEFISH:SPLEEN +CREATURE:FISH_BLUEFISH:KIDNEY +"CREATURE:FISH_SUNFISH_OCEAN:MUSCLE +CREATURE:FISH_SUNFISH_OCEAN:EYE +!CREATURE:FISH_SUNFISH_OCEAN:BRAIN + CREATURE:FISH_SUNFISH_OCEAN:LUNG +!CREATURE:FISH_SUNFISH_OCEAN:HEART +!CREATURE:FISH_SUNFISH_OCEAN:LIVER +CREATURE:FISH_SUNFISH_OCEAN:GUT +#CREATURE:FISH_SUNFISH_OCEAN:STOMACH +#CREATURE:FISH_SUNFISH_OCEAN:GIZZARD +$CREATURE:FISH_SUNFISH_OCEAN:PANCREAS +"CREATURE:FISH_SUNFISH_OCEAN:SPLEEN +"CREATURE:FISH_SUNFISH_OCEAN:KIDNEY +CREATURE:FISH_SWORDFISH:MUSCLE +CREATURE:FISH_SWORDFISH:EYE +CREATURE:FISH_SWORDFISH:BRAIN +CREATURE:FISH_SWORDFISH:LUNG +CREATURE:FISH_SWORDFISH:HEART +CREATURE:FISH_SWORDFISH:LIVER +CREATURE:FISH_SWORDFISH:GUT +CREATURE:FISH_SWORDFISH:STOMACH +CREATURE:FISH_SWORDFISH:GIZZARD + CREATURE:FISH_SWORDFISH:PANCREAS +CREATURE:FISH_SWORDFISH:SPLEEN +CREATURE:FISH_SWORDFISH:KIDNEY +CREATURE:FISH_MARLIN:MUSCLE +CREATURE:FISH_MARLIN:EYE +CREATURE:FISH_MARLIN:BRAIN +CREATURE:FISH_MARLIN:LUNG +CREATURE:FISH_MARLIN:HEART +CREATURE:FISH_MARLIN:LIVER +CREATURE:FISH_MARLIN:GUT +CREATURE:FISH_MARLIN:STOMACH +CREATURE:FISH_MARLIN:GIZZARD +CREATURE:FISH_MARLIN:PANCREAS +CREATURE:FISH_MARLIN:SPLEEN +CREATURE:FISH_MARLIN:KIDNEY +CREATURE:FISH_HALIBUT:MUSCLE +CREATURE:FISH_HALIBUT:EYE +CREATURE:FISH_HALIBUT:BRAIN +CREATURE:FISH_HALIBUT:LUNG +CREATURE:FISH_HALIBUT:HEART +CREATURE:FISH_HALIBUT:LIVER +CREATURE:FISH_HALIBUT:GUT +CREATURE:FISH_HALIBUT:STOMACH +CREATURE:FISH_HALIBUT:GIZZARD +CREATURE:FISH_HALIBUT:PANCREAS +CREATURE:FISH_HALIBUT:SPLEEN +CREATURE:FISH_HALIBUT:KIDNEY +$CREATURE:FISH_BARRACUDA_GREAT:MUSCLE +!CREATURE:FISH_BARRACUDA_GREAT:EYE +#CREATURE:FISH_BARRACUDA_GREAT:BRAIN +"CREATURE:FISH_BARRACUDA_GREAT:LUNG +#CREATURE:FISH_BARRACUDA_GREAT:HEART +#CREATURE:FISH_BARRACUDA_GREAT:LIVER +!CREATURE:FISH_BARRACUDA_GREAT:GUT +%CREATURE:FISH_BARRACUDA_GREAT:STOMACH +%CREATURE:FISH_BARRACUDA_GREAT:GIZZARD +&CREATURE:FISH_BARRACUDA_GREAT:PANCREAS +$CREATURE:FISH_BARRACUDA_GREAT:SPLEEN +$CREATURE:FISH_BARRACUDA_GREAT:KIDNEY +!CREATURE:FISH_TUNA_BLUEFIN:MUSCLE +CREATURE:FISH_TUNA_BLUEFIN:EYE + CREATURE:FISH_TUNA_BLUEFIN:BRAIN +CREATURE:FISH_TUNA_BLUEFIN:LUNG + CREATURE:FISH_TUNA_BLUEFIN:HEART + CREATURE:FISH_TUNA_BLUEFIN:LIVER +CREATURE:FISH_TUNA_BLUEFIN:GUT +"CREATURE:FISH_TUNA_BLUEFIN:STOMACH +"CREATURE:FISH_TUNA_BLUEFIN:GIZZARD +#CREATURE:FISH_TUNA_BLUEFIN:PANCREAS +!CREATURE:FISH_TUNA_BLUEFIN:SPLEEN +!CREATURE:FISH_TUNA_BLUEFIN:KIDNEY +CREATURE:NARWHAL:MUSCLE +CREATURE:NARWHAL:EYE +CREATURE:NARWHAL:BRAIN +CREATURE:NARWHAL:LUNG +CREATURE:NARWHAL:HEART +CREATURE:NARWHAL:LIVER +CREATURE:NARWHAL:GUT +CREATURE:NARWHAL:STOMACH +CREATURE:NARWHAL:GIZZARD +CREATURE:NARWHAL:PANCREAS +CREATURE:NARWHAL:SPLEEN +CREATURE:NARWHAL:KIDNEY +CREATURE:NARWHAL MAN:MUSCLE +CREATURE:NARWHAL MAN:EYE +CREATURE:NARWHAL MAN:BRAIN +CREATURE:NARWHAL MAN:LUNG +CREATURE:NARWHAL MAN:HEART +CREATURE:NARWHAL MAN:LIVER +CREATURE:NARWHAL MAN:GUT +CREATURE:NARWHAL MAN:STOMACH +CREATURE:NARWHAL MAN:GIZZARD +CREATURE:NARWHAL MAN:PANCREAS +CREATURE:NARWHAL MAN:SPLEEN +CREATURE:NARWHAL MAN:KIDNEY +CREATURE:NARWHAL, GIANT:MUSCLE +CREATURE:NARWHAL, GIANT:EYE +CREATURE:NARWHAL, GIANT:BRAIN +CREATURE:NARWHAL, GIANT:LUNG +CREATURE:NARWHAL, GIANT:HEART +CREATURE:NARWHAL, GIANT:LIVER +CREATURE:NARWHAL, GIANT:GUT +CREATURE:NARWHAL, GIANT:STOMACH +CREATURE:NARWHAL, GIANT:GIZZARD + CREATURE:NARWHAL, GIANT:PANCREAS +CREATURE:NARWHAL, GIANT:SPLEEN +CREATURE:NARWHAL, GIANT:KIDNEY +CREATURE:HIPPO:MUSCLE +CREATURE:HIPPO:EYE +CREATURE:HIPPO:BRAIN +CREATURE:HIPPO:LUNG +CREATURE:HIPPO:HEART +CREATURE:HIPPO:LIVER +CREATURE:HIPPO:GUT +CREATURE:HIPPO:STOMACH +CREATURE:HIPPO:GIZZARD +CREATURE:HIPPO:PANCREAS +CREATURE:HIPPO:SPLEEN +CREATURE:HIPPO:KIDNEY +CREATURE:HIPPO_MAN:MUSCLE +CREATURE:HIPPO_MAN:EYE +CREATURE:HIPPO_MAN:BRAIN +CREATURE:HIPPO_MAN:LUNG +CREATURE:HIPPO_MAN:HEART +CREATURE:HIPPO_MAN:LIVER +CREATURE:HIPPO_MAN:GUT +CREATURE:HIPPO_MAN:STOMACH +CREATURE:HIPPO_MAN:GIZZARD +CREATURE:HIPPO_MAN:PANCREAS +CREATURE:HIPPO_MAN:SPLEEN +CREATURE:HIPPO_MAN:KIDNEY +CREATURE:GIANT_HIPPO:MUSCLE +CREATURE:GIANT_HIPPO:EYE +CREATURE:GIANT_HIPPO:BRAIN +CREATURE:GIANT_HIPPO:LUNG +CREATURE:GIANT_HIPPO:HEART +CREATURE:GIANT_HIPPO:LIVER +CREATURE:GIANT_HIPPO:GUT +CREATURE:GIANT_HIPPO:STOMACH +CREATURE:GIANT_HIPPO:GIZZARD +CREATURE:GIANT_HIPPO:PANCREAS +CREATURE:GIANT_HIPPO:SPLEEN +CREATURE:GIANT_HIPPO:KIDNEY +!CREATURE:FISH_GAR_LONGNOSE:MUSCLE +CREATURE:FISH_GAR_LONGNOSE:EYE + CREATURE:FISH_GAR_LONGNOSE:BRAIN +CREATURE:FISH_GAR_LONGNOSE:LUNG + CREATURE:FISH_GAR_LONGNOSE:HEART + CREATURE:FISH_GAR_LONGNOSE:LIVER +CREATURE:FISH_GAR_LONGNOSE:GUT +"CREATURE:FISH_GAR_LONGNOSE:STOMACH +"CREATURE:FISH_GAR_LONGNOSE:GIZZARD +#CREATURE:FISH_GAR_LONGNOSE:PANCREAS +!CREATURE:FISH_GAR_LONGNOSE:SPLEEN +!CREATURE:FISH_GAR_LONGNOSE:KIDNEY +CREATURE:FISH_CARP:MUSCLE +CREATURE:FISH_CARP:EYE +CREATURE:FISH_CARP:BRAIN +CREATURE:FISH_CARP:LUNG +CREATURE:FISH_CARP:HEART +CREATURE:FISH_CARP:LIVER +CREATURE:FISH_CARP:GUT +CREATURE:FISH_CARP:STOMACH +CREATURE:FISH_CARP:GIZZARD +CREATURE:FISH_CARP:PANCREAS +CREATURE:FISH_CARP:SPLEEN +CREATURE:FISH_CARP:KIDNEY +CREATURE:FISH_TIGERFISH:MUSCLE +CREATURE:FISH_TIGERFISH:EYE +CREATURE:FISH_TIGERFISH:BRAIN +CREATURE:FISH_TIGERFISH:LUNG +CREATURE:FISH_TIGERFISH:HEART +CREATURE:FISH_TIGERFISH:LIVER +CREATURE:FISH_TIGERFISH:GUT +CREATURE:FISH_TIGERFISH:STOMACH +CREATURE:FISH_TIGERFISH:GIZZARD + CREATURE:FISH_TIGERFISH:PANCREAS +CREATURE:FISH_TIGERFISH:SPLEEN +CREATURE:FISH_TIGERFISH:KIDNEY +CREATURE:FISH_PIKE:MUSCLE +CREATURE:FISH_PIKE:EYE +CREATURE:FISH_PIKE:BRAIN +CREATURE:FISH_PIKE:LUNG +CREATURE:FISH_PIKE:HEART +CREATURE:FISH_PIKE:LIVER +CREATURE:FISH_PIKE:GUT +CREATURE:FISH_PIKE:STOMACH +CREATURE:FISH_PIKE:GIZZARD +CREATURE:FISH_PIKE:PANCREAS +CREATURE:FISH_PIKE:SPLEEN +CREATURE:FISH_PIKE:KIDNEY +CREATURE:PLATYPUS:MUSCLE +CREATURE:PLATYPUS:EYE +CREATURE:PLATYPUS:BRAIN +CREATURE:PLATYPUS:LUNG +CREATURE:PLATYPUS:HEART +CREATURE:PLATYPUS:LIVER +CREATURE:PLATYPUS:GUT +CREATURE:PLATYPUS:STOMACH +CREATURE:PLATYPUS:GIZZARD +CREATURE:PLATYPUS:PANCREAS +CREATURE:PLATYPUS:SPLEEN +CREATURE:PLATYPUS:KIDNEY +CREATURE:PLATYPUS MAN:MUSCLE +CREATURE:PLATYPUS MAN:EYE +CREATURE:PLATYPUS MAN:BRAIN +CREATURE:PLATYPUS MAN:LUNG +CREATURE:PLATYPUS MAN:HEART +CREATURE:PLATYPUS MAN:LIVER +CREATURE:PLATYPUS MAN:GUT +CREATURE:PLATYPUS MAN:STOMACH +CREATURE:PLATYPUS MAN:GIZZARD +CREATURE:PLATYPUS MAN:PANCREAS +CREATURE:PLATYPUS MAN:SPLEEN +CREATURE:PLATYPUS MAN:KIDNEY +CREATURE:PLATYPUS, GIANT:MUSCLE +CREATURE:PLATYPUS, GIANT:EYE +CREATURE:PLATYPUS, GIANT:BRAIN +CREATURE:PLATYPUS, GIANT:LUNG +CREATURE:PLATYPUS, GIANT:HEART +CREATURE:PLATYPUS, GIANT:LIVER +CREATURE:PLATYPUS, GIANT:GUT + CREATURE:PLATYPUS, GIANT:STOMACH + CREATURE:PLATYPUS, GIANT:GIZZARD +!CREATURE:PLATYPUS, GIANT:PANCREAS +CREATURE:PLATYPUS, GIANT:SPLEEN +CREATURE:PLATYPUS, GIANT:KIDNEY +CREATURE:BEAR_GRIZZLY:MUSCLE +CREATURE:BEAR_GRIZZLY:EYE +CREATURE:BEAR_GRIZZLY:BRAIN +CREATURE:BEAR_GRIZZLY:LUNG +CREATURE:BEAR_GRIZZLY:HEART +CREATURE:BEAR_GRIZZLY:LIVER +CREATURE:BEAR_GRIZZLY:GUT +CREATURE:BEAR_GRIZZLY:STOMACH +CREATURE:BEAR_GRIZZLY:GIZZARD +CREATURE:BEAR_GRIZZLY:PANCREAS +CREATURE:BEAR_GRIZZLY:SPLEEN +CREATURE:BEAR_GRIZZLY:KIDNEY + CREATURE:BEAR_GRIZZLY_MAN:MUSCLE +CREATURE:BEAR_GRIZZLY_MAN:EYE +CREATURE:BEAR_GRIZZLY_MAN:BRAIN +CREATURE:BEAR_GRIZZLY_MAN:LUNG +CREATURE:BEAR_GRIZZLY_MAN:HEART +CREATURE:BEAR_GRIZZLY_MAN:LIVER +CREATURE:BEAR_GRIZZLY_MAN:GUT +!CREATURE:BEAR_GRIZZLY_MAN:STOMACH +!CREATURE:BEAR_GRIZZLY_MAN:GIZZARD +"CREATURE:BEAR_GRIZZLY_MAN:PANCREAS + CREATURE:BEAR_GRIZZLY_MAN:SPLEEN + CREATURE:BEAR_GRIZZLY_MAN:KIDNEY +"CREATURE:GIANT_BEAR_GRIZZLY:MUSCLE +CREATURE:GIANT_BEAR_GRIZZLY:EYE +!CREATURE:GIANT_BEAR_GRIZZLY:BRAIN + CREATURE:GIANT_BEAR_GRIZZLY:LUNG +!CREATURE:GIANT_BEAR_GRIZZLY:HEART +!CREATURE:GIANT_BEAR_GRIZZLY:LIVER +CREATURE:GIANT_BEAR_GRIZZLY:GUT +#CREATURE:GIANT_BEAR_GRIZZLY:STOMACH +#CREATURE:GIANT_BEAR_GRIZZLY:GIZZARD +$CREATURE:GIANT_BEAR_GRIZZLY:PANCREAS +"CREATURE:GIANT_BEAR_GRIZZLY:SPLEEN +"CREATURE:GIANT_BEAR_GRIZZLY:KIDNEY +CREATURE:BEAR_BLACK:MUSCLE +CREATURE:BEAR_BLACK:EYE +CREATURE:BEAR_BLACK:BRAIN +CREATURE:BEAR_BLACK:LUNG +CREATURE:BEAR_BLACK:HEART +CREATURE:BEAR_BLACK:LIVER +CREATURE:BEAR_BLACK:GUT +CREATURE:BEAR_BLACK:STOMACH +CREATURE:BEAR_BLACK:GIZZARD +CREATURE:BEAR_BLACK:PANCREAS +CREATURE:BEAR_BLACK:SPLEEN +CREATURE:BEAR_BLACK:KIDNEY +CREATURE:BEAR_BLACK_MAN:MUSCLE +CREATURE:BEAR_BLACK_MAN:EYE +CREATURE:BEAR_BLACK_MAN:BRAIN +CREATURE:BEAR_BLACK_MAN:LUNG +CREATURE:BEAR_BLACK_MAN:HEART +CREATURE:BEAR_BLACK_MAN:LIVER +CREATURE:BEAR_BLACK_MAN:GUT +CREATURE:BEAR_BLACK_MAN:STOMACH +CREATURE:BEAR_BLACK_MAN:GIZZARD + CREATURE:BEAR_BLACK_MAN:PANCREAS +CREATURE:BEAR_BLACK_MAN:SPLEEN +CREATURE:BEAR_BLACK_MAN:KIDNEY + CREATURE:GIANT_BEAR_BLACK:MUSCLE +CREATURE:GIANT_BEAR_BLACK:EYE +CREATURE:GIANT_BEAR_BLACK:BRAIN +CREATURE:GIANT_BEAR_BLACK:LUNG +CREATURE:GIANT_BEAR_BLACK:HEART +CREATURE:GIANT_BEAR_BLACK:LIVER +CREATURE:GIANT_BEAR_BLACK:GUT +!CREATURE:GIANT_BEAR_BLACK:STOMACH +!CREATURE:GIANT_BEAR_BLACK:GIZZARD +"CREATURE:GIANT_BEAR_BLACK:PANCREAS + CREATURE:GIANT_BEAR_BLACK:SPLEEN + CREATURE:GIANT_BEAR_BLACK:KIDNEY +CREATURE:DEER:MUSCLE +CREATURE:DEER:EYE +CREATURE:DEER:BRAIN +CREATURE:DEER:LUNG +CREATURE:DEER:HEART +CREATURE:DEER:LIVER +CREATURE:DEER:GUT +CREATURE:DEER:STOMACH +CREATURE:DEER:GIZZARD +CREATURE:DEER:PANCREAS +CREATURE:DEER:SPLEEN +CREATURE:DEER:KIDNEY +CREATURE:DEER_MAN:MUSCLE +CREATURE:DEER_MAN:EYE +CREATURE:DEER_MAN:BRAIN +CREATURE:DEER_MAN:LUNG +CREATURE:DEER_MAN:HEART +CREATURE:DEER_MAN:LIVER +CREATURE:DEER_MAN:GUT +CREATURE:DEER_MAN:STOMACH +CREATURE:DEER_MAN:GIZZARD +CREATURE:DEER_MAN:PANCREAS +CREATURE:DEER_MAN:SPLEEN +CREATURE:DEER_MAN:KIDNEY +CREATURE:GIANT_DEER:MUSCLE +CREATURE:GIANT_DEER:EYE +CREATURE:GIANT_DEER:BRAIN +CREATURE:GIANT_DEER:LUNG +CREATURE:GIANT_DEER:HEART +CREATURE:GIANT_DEER:LIVER +CREATURE:GIANT_DEER:GUT +CREATURE:GIANT_DEER:STOMACH +CREATURE:GIANT_DEER:GIZZARD +CREATURE:GIANT_DEER:PANCREAS +CREATURE:GIANT_DEER:SPLEEN +CREATURE:GIANT_DEER:KIDNEY +CREATURE:FOX:MUSCLE +CREATURE:FOX:EYE +CREATURE:FOX:BRAIN +CREATURE:FOX:LUNG +CREATURE:FOX:HEART +CREATURE:FOX:LIVER +CREATURE:FOX:GUT +CREATURE:FOX:STOMACH +CREATURE:FOX:GIZZARD +CREATURE:FOX:PANCREAS +CREATURE:FOX:SPLEEN +CREATURE:FOX:KIDNEY +CREATURE:FOX_MAN:MUSCLE +CREATURE:FOX_MAN:EYE +CREATURE:FOX_MAN:BRAIN +CREATURE:FOX_MAN:LUNG +CREATURE:FOX_MAN:HEART +CREATURE:FOX_MAN:LIVER +CREATURE:FOX_MAN:GUT +CREATURE:FOX_MAN:STOMACH +CREATURE:FOX_MAN:GIZZARD +CREATURE:FOX_MAN:PANCREAS +CREATURE:FOX_MAN:SPLEEN +CREATURE:FOX_MAN:KIDNEY +CREATURE:GIANT_FOX:MUSCLE +CREATURE:GIANT_FOX:EYE +CREATURE:GIANT_FOX:BRAIN +CREATURE:GIANT_FOX:LUNG +CREATURE:GIANT_FOX:HEART +CREATURE:GIANT_FOX:LIVER +CREATURE:GIANT_FOX:GUT +CREATURE:GIANT_FOX:STOMACH +CREATURE:GIANT_FOX:GIZZARD +CREATURE:GIANT_FOX:PANCREAS +CREATURE:GIANT_FOX:SPLEEN +CREATURE:GIANT_FOX:KIDNEY +CREATURE:RACCOON:MUSCLE +CREATURE:RACCOON:EYE +CREATURE:RACCOON:BRAIN +CREATURE:RACCOON:LUNG +CREATURE:RACCOON:HEART +CREATURE:RACCOON:LIVER +CREATURE:RACCOON:GUT +CREATURE:RACCOON:STOMACH +CREATURE:RACCOON:GIZZARD +CREATURE:RACCOON:PANCREAS +CREATURE:RACCOON:SPLEEN +CREATURE:RACCOON:KIDNEY +CREATURE:RACCOON_MAN:MUSCLE +CREATURE:RACCOON_MAN:EYE +CREATURE:RACCOON_MAN:BRAIN +CREATURE:RACCOON_MAN:LUNG +CREATURE:RACCOON_MAN:HEART +CREATURE:RACCOON_MAN:LIVER +CREATURE:RACCOON_MAN:GUT +CREATURE:RACCOON_MAN:STOMACH +CREATURE:RACCOON_MAN:GIZZARD +CREATURE:RACCOON_MAN:PANCREAS +CREATURE:RACCOON_MAN:SPLEEN +CREATURE:RACCOON_MAN:KIDNEY +CREATURE:GIANT_RACCOON:MUSCLE +CREATURE:GIANT_RACCOON:EYE +CREATURE:GIANT_RACCOON:BRAIN +CREATURE:GIANT_RACCOON:LUNG +CREATURE:GIANT_RACCOON:HEART +CREATURE:GIANT_RACCOON:LIVER +CREATURE:GIANT_RACCOON:GUT +CREATURE:GIANT_RACCOON:STOMACH +CREATURE:GIANT_RACCOON:GIZZARD +CREATURE:GIANT_RACCOON:PANCREAS +CREATURE:GIANT_RACCOON:SPLEEN +CREATURE:GIANT_RACCOON:KIDNEY +CREATURE:MACAQUE_RHESUS:MUSCLE +CREATURE:MACAQUE_RHESUS:EYE +CREATURE:MACAQUE_RHESUS:BRAIN +CREATURE:MACAQUE_RHESUS:LUNG +CREATURE:MACAQUE_RHESUS:HEART +CREATURE:MACAQUE_RHESUS:LIVER +CREATURE:MACAQUE_RHESUS:GUT +CREATURE:MACAQUE_RHESUS:STOMACH +CREATURE:MACAQUE_RHESUS:GIZZARD + CREATURE:MACAQUE_RHESUS:PANCREAS +CREATURE:MACAQUE_RHESUS:SPLEEN +CREATURE:MACAQUE_RHESUS:KIDNEY +"CREATURE:MACAQUE_RHESUS_MAN:MUSCLE +CREATURE:MACAQUE_RHESUS_MAN:EYE +!CREATURE:MACAQUE_RHESUS_MAN:BRAIN + CREATURE:MACAQUE_RHESUS_MAN:LUNG +!CREATURE:MACAQUE_RHESUS_MAN:HEART +!CREATURE:MACAQUE_RHESUS_MAN:LIVER +CREATURE:MACAQUE_RHESUS_MAN:GUT +#CREATURE:MACAQUE_RHESUS_MAN:STOMACH +#CREATURE:MACAQUE_RHESUS_MAN:GIZZARD +$CREATURE:MACAQUE_RHESUS_MAN:PANCREAS +"CREATURE:MACAQUE_RHESUS_MAN:SPLEEN +"CREATURE:MACAQUE_RHESUS_MAN:KIDNEY +$CREATURE:GIANT_MACAQUE_RHESUS:MUSCLE +!CREATURE:GIANT_MACAQUE_RHESUS:EYE +#CREATURE:GIANT_MACAQUE_RHESUS:BRAIN +"CREATURE:GIANT_MACAQUE_RHESUS:LUNG +#CREATURE:GIANT_MACAQUE_RHESUS:HEART +#CREATURE:GIANT_MACAQUE_RHESUS:LIVER +!CREATURE:GIANT_MACAQUE_RHESUS:GUT +%CREATURE:GIANT_MACAQUE_RHESUS:STOMACH +%CREATURE:GIANT_MACAQUE_RHESUS:GIZZARD +&CREATURE:GIANT_MACAQUE_RHESUS:PANCREAS +$CREATURE:GIANT_MACAQUE_RHESUS:SPLEEN +$CREATURE:GIANT_MACAQUE_RHESUS:KIDNEY +CREATURE:COUGAR:MUSCLE +CREATURE:COUGAR:EYE +CREATURE:COUGAR:BRAIN +CREATURE:COUGAR:LUNG +CREATURE:COUGAR:HEART +CREATURE:COUGAR:LIVER +CREATURE:COUGAR:GUT +CREATURE:COUGAR:STOMACH +CREATURE:COUGAR:GIZZARD +CREATURE:COUGAR:PANCREAS +CREATURE:COUGAR:SPLEEN +CREATURE:COUGAR:KIDNEY +CREATURE:COUGAR_MAN:MUSCLE +CREATURE:COUGAR_MAN:EYE +CREATURE:COUGAR_MAN:BRAIN +CREATURE:COUGAR_MAN:LUNG +CREATURE:COUGAR_MAN:HEART +CREATURE:COUGAR_MAN:LIVER +CREATURE:COUGAR_MAN:GUT +CREATURE:COUGAR_MAN:STOMACH +CREATURE:COUGAR_MAN:GIZZARD +CREATURE:COUGAR_MAN:PANCREAS +CREATURE:COUGAR_MAN:SPLEEN +CREATURE:COUGAR_MAN:KIDNEY +CREATURE:GIANT_COUGAR:MUSCLE +CREATURE:GIANT_COUGAR:EYE +CREATURE:GIANT_COUGAR:BRAIN +CREATURE:GIANT_COUGAR:LUNG +CREATURE:GIANT_COUGAR:HEART +CREATURE:GIANT_COUGAR:LIVER +CREATURE:GIANT_COUGAR:GUT +CREATURE:GIANT_COUGAR:STOMACH +CREATURE:GIANT_COUGAR:GIZZARD +CREATURE:GIANT_COUGAR:PANCREAS +CREATURE:GIANT_COUGAR:SPLEEN +CREATURE:GIANT_COUGAR:KIDNEY +CREATURE:WOLF:MUSCLE +CREATURE:WOLF:EYE +CREATURE:WOLF:BRAIN +CREATURE:WOLF:LUNG +CREATURE:WOLF:HEART +CREATURE:WOLF:LIVER +CREATURE:WOLF:GUT +CREATURE:WOLF:STOMACH +CREATURE:WOLF:GIZZARD +CREATURE:WOLF:PANCREAS +CREATURE:WOLF:SPLEEN +CREATURE:WOLF:KIDNEY +CREATURE:WOLF_MAN:MUSCLE +CREATURE:WOLF_MAN:EYE +CREATURE:WOLF_MAN:BRAIN +CREATURE:WOLF_MAN:LUNG +CREATURE:WOLF_MAN:HEART +CREATURE:WOLF_MAN:LIVER +CREATURE:WOLF_MAN:GUT +CREATURE:WOLF_MAN:STOMACH +CREATURE:WOLF_MAN:GIZZARD +CREATURE:WOLF_MAN:PANCREAS +CREATURE:WOLF_MAN:SPLEEN +CREATURE:WOLF_MAN:KIDNEY +CREATURE:GIANT_WOLF:MUSCLE +CREATURE:GIANT_WOLF:EYE +CREATURE:GIANT_WOLF:BRAIN +CREATURE:GIANT_WOLF:LUNG +CREATURE:GIANT_WOLF:HEART +CREATURE:GIANT_WOLF:LIVER +CREATURE:GIANT_WOLF:GUT +CREATURE:GIANT_WOLF:STOMACH +CREATURE:GIANT_WOLF:GIZZARD +CREATURE:GIANT_WOLF:PANCREAS +CREATURE:GIANT_WOLF:SPLEEN +CREATURE:GIANT_WOLF:KIDNEY +CREATURE:GROUNDHOG:MUSCLE +CREATURE:GROUNDHOG:EYE +CREATURE:GROUNDHOG:BRAIN +CREATURE:GROUNDHOG:LUNG +CREATURE:GROUNDHOG:HEART +CREATURE:GROUNDHOG:LIVER +CREATURE:GROUNDHOG:GUT +CREATURE:GROUNDHOG:STOMACH +CREATURE:GROUNDHOG:GIZZARD +CREATURE:GROUNDHOG:PANCREAS +CREATURE:GROUNDHOG:SPLEEN +CREATURE:GROUNDHOG:KIDNEY +CREATURE:GROUNDHOG_MAN:MUSCLE +CREATURE:GROUNDHOG_MAN:EYE +CREATURE:GROUNDHOG_MAN:BRAIN +CREATURE:GROUNDHOG_MAN:LUNG +CREATURE:GROUNDHOG_MAN:HEART +CREATURE:GROUNDHOG_MAN:LIVER +CREATURE:GROUNDHOG_MAN:GUT +CREATURE:GROUNDHOG_MAN:STOMACH +CREATURE:GROUNDHOG_MAN:GIZZARD +CREATURE:GROUNDHOG_MAN:PANCREAS +CREATURE:GROUNDHOG_MAN:SPLEEN +CREATURE:GROUNDHOG_MAN:KIDNEY +CREATURE:GIANT_GROUNDHOG:MUSCLE +CREATURE:GIANT_GROUNDHOG:EYE +CREATURE:GIANT_GROUNDHOG:BRAIN +CREATURE:GIANT_GROUNDHOG:LUNG +CREATURE:GIANT_GROUNDHOG:HEART +CREATURE:GIANT_GROUNDHOG:LIVER +CREATURE:GIANT_GROUNDHOG:GUT + CREATURE:GIANT_GROUNDHOG:STOMACH + CREATURE:GIANT_GROUNDHOG:GIZZARD +!CREATURE:GIANT_GROUNDHOG:PANCREAS +CREATURE:GIANT_GROUNDHOG:SPLEEN +CREATURE:GIANT_GROUNDHOG:KIDNEY +CREATURE:ALLIGATOR:MUSCLE +CREATURE:ALLIGATOR:EYE +CREATURE:ALLIGATOR:BRAIN +CREATURE:ALLIGATOR:LUNG +CREATURE:ALLIGATOR:HEART +CREATURE:ALLIGATOR:LIVER +CREATURE:ALLIGATOR:GUT +CREATURE:ALLIGATOR:STOMACH +CREATURE:ALLIGATOR:GIZZARD +CREATURE:ALLIGATOR:PANCREAS +CREATURE:ALLIGATOR:SPLEEN +CREATURE:ALLIGATOR:KIDNEY +CREATURE:ALLIGATOR_MAN:MUSCLE +CREATURE:ALLIGATOR_MAN:EYE +CREATURE:ALLIGATOR_MAN:BRAIN +CREATURE:ALLIGATOR_MAN:LUNG +CREATURE:ALLIGATOR_MAN:HEART +CREATURE:ALLIGATOR_MAN:LIVER +CREATURE:ALLIGATOR_MAN:GUT +CREATURE:ALLIGATOR_MAN:STOMACH +CREATURE:ALLIGATOR_MAN:GIZZARD +CREATURE:ALLIGATOR_MAN:PANCREAS +CREATURE:ALLIGATOR_MAN:SPLEEN +CREATURE:ALLIGATOR_MAN:KIDNEY +CREATURE:GIANT_ALLIGATOR:MUSCLE +CREATURE:GIANT_ALLIGATOR:EYE +CREATURE:GIANT_ALLIGATOR:BRAIN +CREATURE:GIANT_ALLIGATOR:LUNG +CREATURE:GIANT_ALLIGATOR:HEART +CREATURE:GIANT_ALLIGATOR:LIVER +CREATURE:GIANT_ALLIGATOR:GUT + CREATURE:GIANT_ALLIGATOR:STOMACH + CREATURE:GIANT_ALLIGATOR:GIZZARD +!CREATURE:GIANT_ALLIGATOR:PANCREAS +CREATURE:GIANT_ALLIGATOR:SPLEEN +CREATURE:GIANT_ALLIGATOR:KIDNEY +CREATURE:BIRD_BUZZARD:MUSCLE +CREATURE:BIRD_BUZZARD:EYE +CREATURE:BIRD_BUZZARD:BRAIN +CREATURE:BIRD_BUZZARD:LUNG +CREATURE:BIRD_BUZZARD:HEART +CREATURE:BIRD_BUZZARD:LIVER +CREATURE:BIRD_BUZZARD:GUT +CREATURE:BIRD_BUZZARD:STOMACH +CREATURE:BIRD_BUZZARD:GIZZARD +CREATURE:BIRD_BUZZARD:PANCREAS +CREATURE:BIRD_BUZZARD:SPLEEN +CREATURE:BIRD_BUZZARD:KIDNEY +CREATURE:BUZZARD_MAN:MUSCLE +CREATURE:BUZZARD_MAN:EYE +CREATURE:BUZZARD_MAN:BRAIN +CREATURE:BUZZARD_MAN:LUNG +CREATURE:BUZZARD_MAN:HEART +CREATURE:BUZZARD_MAN:LIVER +CREATURE:BUZZARD_MAN:GUT +CREATURE:BUZZARD_MAN:STOMACH +CREATURE:BUZZARD_MAN:GIZZARD +CREATURE:BUZZARD_MAN:PANCREAS +CREATURE:BUZZARD_MAN:SPLEEN +CREATURE:BUZZARD_MAN:KIDNEY +CREATURE:GIANT_BUZZARD:MUSCLE +CREATURE:GIANT_BUZZARD:EYE +CREATURE:GIANT_BUZZARD:BRAIN +CREATURE:GIANT_BUZZARD:LUNG +CREATURE:GIANT_BUZZARD:HEART +CREATURE:GIANT_BUZZARD:LIVER +CREATURE:GIANT_BUZZARD:GUT +CREATURE:GIANT_BUZZARD:STOMACH +CREATURE:GIANT_BUZZARD:GIZZARD +CREATURE:GIANT_BUZZARD:PANCREAS +CREATURE:GIANT_BUZZARD:SPLEEN +CREATURE:GIANT_BUZZARD:KIDNEY +CREATURE:PANDA:MUSCLE +CREATURE:PANDA:EYE +CREATURE:PANDA:BRAIN +CREATURE:PANDA:LUNG +CREATURE:PANDA:HEART +CREATURE:PANDA:LIVER +CREATURE:PANDA:GUT +CREATURE:PANDA:STOMACH +CREATURE:PANDA:GIZZARD +CREATURE:PANDA:PANCREAS +CREATURE:PANDA:SPLEEN +CREATURE:PANDA:KIDNEY +CREATURE:PANDA, GIGANTIC:MUSCLE +CREATURE:PANDA, GIGANTIC:EYE +CREATURE:PANDA, GIGANTIC:BRAIN +CREATURE:PANDA, GIGANTIC:LUNG +CREATURE:PANDA, GIGANTIC:HEART +CREATURE:PANDA, GIGANTIC:LIVER +CREATURE:PANDA, GIGANTIC:GUT + CREATURE:PANDA, GIGANTIC:STOMACH + CREATURE:PANDA, GIGANTIC:GIZZARD +!CREATURE:PANDA, GIGANTIC:PANCREAS +CREATURE:PANDA, GIGANTIC:SPLEEN +CREATURE:PANDA, GIGANTIC:KIDNEY +CREATURE:PANDA MAN:MUSCLE +CREATURE:PANDA MAN:EYE +CREATURE:PANDA MAN:BRAIN +CREATURE:PANDA MAN:LUNG +CREATURE:PANDA MAN:HEART +CREATURE:PANDA MAN:LIVER +CREATURE:PANDA MAN:GUT +CREATURE:PANDA MAN:STOMACH +CREATURE:PANDA MAN:GIZZARD +CREATURE:PANDA MAN:PANCREAS +CREATURE:PANDA MAN:SPLEEN +CREATURE:PANDA MAN:KIDNEY +CREATURE:CAPYBARA:MUSCLE +CREATURE:CAPYBARA:EYE +CREATURE:CAPYBARA:BRAIN +CREATURE:CAPYBARA:LUNG +CREATURE:CAPYBARA:HEART +CREATURE:CAPYBARA:LIVER +CREATURE:CAPYBARA:GUT +CREATURE:CAPYBARA:STOMACH +CREATURE:CAPYBARA:GIZZARD +CREATURE:CAPYBARA:PANCREAS +CREATURE:CAPYBARA:SPLEEN +CREATURE:CAPYBARA:KIDNEY +CREATURE:CAPYBARA, GIANT:MUSCLE +CREATURE:CAPYBARA, GIANT:EYE +CREATURE:CAPYBARA, GIANT:BRAIN +CREATURE:CAPYBARA, GIANT:LUNG +CREATURE:CAPYBARA, GIANT:HEART +CREATURE:CAPYBARA, GIANT:LIVER +CREATURE:CAPYBARA, GIANT:GUT + CREATURE:CAPYBARA, GIANT:STOMACH + CREATURE:CAPYBARA, GIANT:GIZZARD +!CREATURE:CAPYBARA, GIANT:PANCREAS +CREATURE:CAPYBARA, GIANT:SPLEEN +CREATURE:CAPYBARA, GIANT:KIDNEY +CREATURE:CAPYBARA MAN:MUSCLE +CREATURE:CAPYBARA MAN:EYE +CREATURE:CAPYBARA MAN:BRAIN +CREATURE:CAPYBARA MAN:LUNG +CREATURE:CAPYBARA MAN:HEART +CREATURE:CAPYBARA MAN:LIVER +CREATURE:CAPYBARA MAN:GUT +CREATURE:CAPYBARA MAN:STOMACH +CREATURE:CAPYBARA MAN:GIZZARD +CREATURE:CAPYBARA MAN:PANCREAS +CREATURE:CAPYBARA MAN:SPLEEN +CREATURE:CAPYBARA MAN:KIDNEY +CREATURE:BADGER:MUSCLE +CREATURE:BADGER:EYE +CREATURE:BADGER:BRAIN +CREATURE:BADGER:LUNG +CREATURE:BADGER:HEART +CREATURE:BADGER:LIVER +CREATURE:BADGER:GUT +CREATURE:BADGER:STOMACH +CREATURE:BADGER:GIZZARD +CREATURE:BADGER:PANCREAS +CREATURE:BADGER:SPLEEN +CREATURE:BADGER:KIDNEY +CREATURE:BADGER MAN:MUSCLE +CREATURE:BADGER MAN:EYE +CREATURE:BADGER MAN:BRAIN +CREATURE:BADGER MAN:LUNG +CREATURE:BADGER MAN:HEART +CREATURE:BADGER MAN:LIVER +CREATURE:BADGER MAN:GUT +CREATURE:BADGER MAN:STOMACH +CREATURE:BADGER MAN:GIZZARD +CREATURE:BADGER MAN:PANCREAS +CREATURE:BADGER MAN:SPLEEN +CREATURE:BADGER MAN:KIDNEY +CREATURE:BADGER, GIANT:MUSCLE +CREATURE:BADGER, GIANT:EYE +CREATURE:BADGER, GIANT:BRAIN +CREATURE:BADGER, GIANT:LUNG +CREATURE:BADGER, GIANT:HEART +CREATURE:BADGER, GIANT:LIVER +CREATURE:BADGER, GIANT:GUT +CREATURE:BADGER, GIANT:STOMACH +CREATURE:BADGER, GIANT:GIZZARD +CREATURE:BADGER, GIANT:PANCREAS +CREATURE:BADGER, GIANT:SPLEEN +CREATURE:BADGER, GIANT:KIDNEY +CREATURE:MOOSE:MUSCLE +CREATURE:MOOSE:EYE +CREATURE:MOOSE:BRAIN +CREATURE:MOOSE:LUNG +CREATURE:MOOSE:HEART +CREATURE:MOOSE:LIVER +CREATURE:MOOSE:GUT +CREATURE:MOOSE:STOMACH +CREATURE:MOOSE:GIZZARD +CREATURE:MOOSE:PANCREAS +CREATURE:MOOSE:SPLEEN +CREATURE:MOOSE:KIDNEY +CREATURE:MOOSE MAN:MUSCLE +CREATURE:MOOSE MAN:EYE +CREATURE:MOOSE MAN:BRAIN +CREATURE:MOOSE MAN:LUNG +CREATURE:MOOSE MAN:HEART +CREATURE:MOOSE MAN:LIVER +CREATURE:MOOSE MAN:GUT +CREATURE:MOOSE MAN:STOMACH +CREATURE:MOOSE MAN:GIZZARD +CREATURE:MOOSE MAN:PANCREAS +CREATURE:MOOSE MAN:SPLEEN +CREATURE:MOOSE MAN:KIDNEY +CREATURE:MOOSE, GIANT:MUSCLE +CREATURE:MOOSE, GIANT:EYE +CREATURE:MOOSE, GIANT:BRAIN +CREATURE:MOOSE, GIANT:LUNG +CREATURE:MOOSE, GIANT:HEART +CREATURE:MOOSE, GIANT:LIVER +CREATURE:MOOSE, GIANT:GUT +CREATURE:MOOSE, GIANT:STOMACH +CREATURE:MOOSE, GIANT:GIZZARD +CREATURE:MOOSE, GIANT:PANCREAS +CREATURE:MOOSE, GIANT:SPLEEN +CREATURE:MOOSE, GIANT:KIDNEY +CREATURE:RED PANDA:MUSCLE +CREATURE:RED PANDA:EYE +CREATURE:RED PANDA:BRAIN +CREATURE:RED PANDA:LUNG +CREATURE:RED PANDA:HEART +CREATURE:RED PANDA:LIVER +CREATURE:RED PANDA:GUT +CREATURE:RED PANDA:STOMACH +CREATURE:RED PANDA:GIZZARD +CREATURE:RED PANDA:PANCREAS +CREATURE:RED PANDA:SPLEEN +CREATURE:RED PANDA:KIDNEY +CREATURE:RED PANDA MAN:MUSCLE +CREATURE:RED PANDA MAN:EYE +CREATURE:RED PANDA MAN:BRAIN +CREATURE:RED PANDA MAN:LUNG +CREATURE:RED PANDA MAN:HEART +CREATURE:RED PANDA MAN:LIVER +CREATURE:RED PANDA MAN:GUT +CREATURE:RED PANDA MAN:STOMACH +CREATURE:RED PANDA MAN:GIZZARD +CREATURE:RED PANDA MAN:PANCREAS +CREATURE:RED PANDA MAN:SPLEEN +CREATURE:RED PANDA MAN:KIDNEY + CREATURE:RED PANDA, GIANT:MUSCLE +CREATURE:RED PANDA, GIANT:EYE +CREATURE:RED PANDA, GIANT:BRAIN +CREATURE:RED PANDA, GIANT:LUNG +CREATURE:RED PANDA, GIANT:HEART +CREATURE:RED PANDA, GIANT:LIVER +CREATURE:RED PANDA, GIANT:GUT +!CREATURE:RED PANDA, GIANT:STOMACH +!CREATURE:RED PANDA, GIANT:GIZZARD +"CREATURE:RED PANDA, GIANT:PANCREAS + CREATURE:RED PANDA, GIANT:SPLEEN + CREATURE:RED PANDA, GIANT:KIDNEY +CREATURE:ELEPHANT:MUSCLE +CREATURE:ELEPHANT:EYE +CREATURE:ELEPHANT:BRAIN +CREATURE:ELEPHANT:LUNG +CREATURE:ELEPHANT:HEART +CREATURE:ELEPHANT:LIVER +CREATURE:ELEPHANT:GUT +CREATURE:ELEPHANT:STOMACH +CREATURE:ELEPHANT:GIZZARD +CREATURE:ELEPHANT:PANCREAS +CREATURE:ELEPHANT:SPLEEN +CREATURE:ELEPHANT:KIDNEY +CREATURE:ELEPHANT_MAN:MUSCLE +CREATURE:ELEPHANT_MAN:EYE +CREATURE:ELEPHANT_MAN:BRAIN +CREATURE:ELEPHANT_MAN:LUNG +CREATURE:ELEPHANT_MAN:HEART +CREATURE:ELEPHANT_MAN:LIVER +CREATURE:ELEPHANT_MAN:GUT +CREATURE:ELEPHANT_MAN:STOMACH +CREATURE:ELEPHANT_MAN:GIZZARD +CREATURE:ELEPHANT_MAN:PANCREAS +CREATURE:ELEPHANT_MAN:SPLEEN +CREATURE:ELEPHANT_MAN:KIDNEY +CREATURE:GIANT_ELEPHANT:MUSCLE +CREATURE:GIANT_ELEPHANT:EYE +CREATURE:GIANT_ELEPHANT:BRAIN +CREATURE:GIANT_ELEPHANT:LUNG +CREATURE:GIANT_ELEPHANT:HEART +CREATURE:GIANT_ELEPHANT:LIVER +CREATURE:GIANT_ELEPHANT:GUT +CREATURE:GIANT_ELEPHANT:STOMACH +CREATURE:GIANT_ELEPHANT:GIZZARD + CREATURE:GIANT_ELEPHANT:PANCREAS +CREATURE:GIANT_ELEPHANT:SPLEEN +CREATURE:GIANT_ELEPHANT:KIDNEY +CREATURE:WARTHOG:MUSCLE +CREATURE:WARTHOG:EYE +CREATURE:WARTHOG:BRAIN +CREATURE:WARTHOG:LUNG +CREATURE:WARTHOG:HEART +CREATURE:WARTHOG:LIVER +CREATURE:WARTHOG:GUT +CREATURE:WARTHOG:STOMACH +CREATURE:WARTHOG:GIZZARD +CREATURE:WARTHOG:PANCREAS +CREATURE:WARTHOG:SPLEEN +CREATURE:WARTHOG:KIDNEY +CREATURE:WARTHOG_MAN:MUSCLE +CREATURE:WARTHOG_MAN:EYE +CREATURE:WARTHOG_MAN:BRAIN +CREATURE:WARTHOG_MAN:LUNG +CREATURE:WARTHOG_MAN:HEART +CREATURE:WARTHOG_MAN:LIVER +CREATURE:WARTHOG_MAN:GUT +CREATURE:WARTHOG_MAN:STOMACH +CREATURE:WARTHOG_MAN:GIZZARD +CREATURE:WARTHOG_MAN:PANCREAS +CREATURE:WARTHOG_MAN:SPLEEN +CREATURE:WARTHOG_MAN:KIDNEY +CREATURE:GIANT_WARTHOG:MUSCLE +CREATURE:GIANT_WARTHOG:EYE +CREATURE:GIANT_WARTHOG:BRAIN +CREATURE:GIANT_WARTHOG:LUNG +CREATURE:GIANT_WARTHOG:HEART +CREATURE:GIANT_WARTHOG:LIVER +CREATURE:GIANT_WARTHOG:GUT +CREATURE:GIANT_WARTHOG:STOMACH +CREATURE:GIANT_WARTHOG:GIZZARD +CREATURE:GIANT_WARTHOG:PANCREAS +CREATURE:GIANT_WARTHOG:SPLEEN +CREATURE:GIANT_WARTHOG:KIDNEY +CREATURE:LION:MUSCLE +CREATURE:LION:EYE +CREATURE:LION:BRAIN +CREATURE:LION:LUNG +CREATURE:LION:HEART +CREATURE:LION:LIVER +CREATURE:LION:GUT +CREATURE:LION:STOMACH +CREATURE:LION:GIZZARD +CREATURE:LION:PANCREAS +CREATURE:LION:SPLEEN +CREATURE:LION:KIDNEY +CREATURE:LION_MAN:MUSCLE +CREATURE:LION_MAN:EYE +CREATURE:LION_MAN:BRAIN +CREATURE:LION_MAN:LUNG +CREATURE:LION_MAN:HEART +CREATURE:LION_MAN:LIVER +CREATURE:LION_MAN:GUT +CREATURE:LION_MAN:STOMACH +CREATURE:LION_MAN:GIZZARD +CREATURE:LION_MAN:PANCREAS +CREATURE:LION_MAN:SPLEEN +CREATURE:LION_MAN:KIDNEY +CREATURE:GIANT_LION:MUSCLE +CREATURE:GIANT_LION:EYE +CREATURE:GIANT_LION:BRAIN +CREATURE:GIANT_LION:LUNG +CREATURE:GIANT_LION:HEART +CREATURE:GIANT_LION:LIVER +CREATURE:GIANT_LION:GUT +CREATURE:GIANT_LION:STOMACH +CREATURE:GIANT_LION:GIZZARD +CREATURE:GIANT_LION:PANCREAS +CREATURE:GIANT_LION:SPLEEN +CREATURE:GIANT_LION:KIDNEY +CREATURE:LEOPARD:MUSCLE +CREATURE:LEOPARD:EYE +CREATURE:LEOPARD:BRAIN +CREATURE:LEOPARD:LUNG +CREATURE:LEOPARD:HEART +CREATURE:LEOPARD:LIVER +CREATURE:LEOPARD:GUT +CREATURE:LEOPARD:STOMACH +CREATURE:LEOPARD:GIZZARD +CREATURE:LEOPARD:PANCREAS +CREATURE:LEOPARD:SPLEEN +CREATURE:LEOPARD:KIDNEY +CREATURE:LEOPARD_MAN:MUSCLE +CREATURE:LEOPARD_MAN:EYE +CREATURE:LEOPARD_MAN:BRAIN +CREATURE:LEOPARD_MAN:LUNG +CREATURE:LEOPARD_MAN:HEART +CREATURE:LEOPARD_MAN:LIVER +CREATURE:LEOPARD_MAN:GUT +CREATURE:LEOPARD_MAN:STOMACH +CREATURE:LEOPARD_MAN:GIZZARD +CREATURE:LEOPARD_MAN:PANCREAS +CREATURE:LEOPARD_MAN:SPLEEN +CREATURE:LEOPARD_MAN:KIDNEY +CREATURE:GIANT_LEOPARD:MUSCLE +CREATURE:GIANT_LEOPARD:EYE +CREATURE:GIANT_LEOPARD:BRAIN +CREATURE:GIANT_LEOPARD:LUNG +CREATURE:GIANT_LEOPARD:HEART +CREATURE:GIANT_LEOPARD:LIVER +CREATURE:GIANT_LEOPARD:GUT +CREATURE:GIANT_LEOPARD:STOMACH +CREATURE:GIANT_LEOPARD:GIZZARD +CREATURE:GIANT_LEOPARD:PANCREAS +CREATURE:GIANT_LEOPARD:SPLEEN +CREATURE:GIANT_LEOPARD:KIDNEY +CREATURE:JAGUAR:MUSCLE +CREATURE:JAGUAR:EYE +CREATURE:JAGUAR:BRAIN +CREATURE:JAGUAR:LUNG +CREATURE:JAGUAR:HEART +CREATURE:JAGUAR:LIVER +CREATURE:JAGUAR:GUT +CREATURE:JAGUAR:STOMACH +CREATURE:JAGUAR:GIZZARD +CREATURE:JAGUAR:PANCREAS +CREATURE:JAGUAR:SPLEEN +CREATURE:JAGUAR:KIDNEY +CREATURE:JAGUAR_MAN:MUSCLE +CREATURE:JAGUAR_MAN:EYE +CREATURE:JAGUAR_MAN:BRAIN +CREATURE:JAGUAR_MAN:LUNG +CREATURE:JAGUAR_MAN:HEART +CREATURE:JAGUAR_MAN:LIVER +CREATURE:JAGUAR_MAN:GUT +CREATURE:JAGUAR_MAN:STOMACH +CREATURE:JAGUAR_MAN:GIZZARD +CREATURE:JAGUAR_MAN:PANCREAS +CREATURE:JAGUAR_MAN:SPLEEN +CREATURE:JAGUAR_MAN:KIDNEY +CREATURE:GIANT_JAGUAR:MUSCLE +CREATURE:GIANT_JAGUAR:EYE +CREATURE:GIANT_JAGUAR:BRAIN +CREATURE:GIANT_JAGUAR:LUNG +CREATURE:GIANT_JAGUAR:HEART +CREATURE:GIANT_JAGUAR:LIVER +CREATURE:GIANT_JAGUAR:GUT +CREATURE:GIANT_JAGUAR:STOMACH +CREATURE:GIANT_JAGUAR:GIZZARD +CREATURE:GIANT_JAGUAR:PANCREAS +CREATURE:GIANT_JAGUAR:SPLEEN +CREATURE:GIANT_JAGUAR:KIDNEY +CREATURE:TIGER:MUSCLE +CREATURE:TIGER:EYE +CREATURE:TIGER:BRAIN +CREATURE:TIGER:LUNG +CREATURE:TIGER:HEART +CREATURE:TIGER:LIVER +CREATURE:TIGER:GUT +CREATURE:TIGER:STOMACH +CREATURE:TIGER:GIZZARD +CREATURE:TIGER:PANCREAS +CREATURE:TIGER:SPLEEN +CREATURE:TIGER:KIDNEY +CREATURE:TIGER_MAN:MUSCLE +CREATURE:TIGER_MAN:EYE +CREATURE:TIGER_MAN:BRAIN +CREATURE:TIGER_MAN:LUNG +CREATURE:TIGER_MAN:HEART +CREATURE:TIGER_MAN:LIVER +CREATURE:TIGER_MAN:GUT +CREATURE:TIGER_MAN:STOMACH +CREATURE:TIGER_MAN:GIZZARD +CREATURE:TIGER_MAN:PANCREAS +CREATURE:TIGER_MAN:SPLEEN +CREATURE:TIGER_MAN:KIDNEY +CREATURE:GIANT_TIGER:MUSCLE +CREATURE:GIANT_TIGER:EYE +CREATURE:GIANT_TIGER:BRAIN +CREATURE:GIANT_TIGER:LUNG +CREATURE:GIANT_TIGER:HEART +CREATURE:GIANT_TIGER:LIVER +CREATURE:GIANT_TIGER:GUT +CREATURE:GIANT_TIGER:STOMACH +CREATURE:GIANT_TIGER:GIZZARD +CREATURE:GIANT_TIGER:PANCREAS +CREATURE:GIANT_TIGER:SPLEEN +CREATURE:GIANT_TIGER:KIDNEY +CREATURE:CHEETAH:MUSCLE +CREATURE:CHEETAH:EYE +CREATURE:CHEETAH:BRAIN +CREATURE:CHEETAH:LUNG +CREATURE:CHEETAH:HEART +CREATURE:CHEETAH:LIVER +CREATURE:CHEETAH:GUT +CREATURE:CHEETAH:STOMACH +CREATURE:CHEETAH:GIZZARD +CREATURE:CHEETAH:PANCREAS +CREATURE:CHEETAH:SPLEEN +CREATURE:CHEETAH:KIDNEY +CREATURE:CHEETAH_MAN:MUSCLE +CREATURE:CHEETAH_MAN:EYE +CREATURE:CHEETAH_MAN:BRAIN +CREATURE:CHEETAH_MAN:LUNG +CREATURE:CHEETAH_MAN:HEART +CREATURE:CHEETAH_MAN:LIVER +CREATURE:CHEETAH_MAN:GUT +CREATURE:CHEETAH_MAN:STOMACH +CREATURE:CHEETAH_MAN:GIZZARD +CREATURE:CHEETAH_MAN:PANCREAS +CREATURE:CHEETAH_MAN:SPLEEN +CREATURE:CHEETAH_MAN:KIDNEY +CREATURE:GIANT_CHEETAH:MUSCLE +CREATURE:GIANT_CHEETAH:EYE +CREATURE:GIANT_CHEETAH:BRAIN +CREATURE:GIANT_CHEETAH:LUNG +CREATURE:GIANT_CHEETAH:HEART +CREATURE:GIANT_CHEETAH:LIVER +CREATURE:GIANT_CHEETAH:GUT +CREATURE:GIANT_CHEETAH:STOMACH +CREATURE:GIANT_CHEETAH:GIZZARD +CREATURE:GIANT_CHEETAH:PANCREAS +CREATURE:GIANT_CHEETAH:SPLEEN +CREATURE:GIANT_CHEETAH:KIDNEY +CREATURE:GAZELLE:MUSCLE +CREATURE:GAZELLE:EYE +CREATURE:GAZELLE:BRAIN +CREATURE:GAZELLE:LUNG +CREATURE:GAZELLE:HEART +CREATURE:GAZELLE:LIVER +CREATURE:GAZELLE:GUT +CREATURE:GAZELLE:STOMACH +CREATURE:GAZELLE:GIZZARD +CREATURE:GAZELLE:PANCREAS +CREATURE:GAZELLE:SPLEEN +CREATURE:GAZELLE:KIDNEY +CREATURE:GAZELLE_MAN:MUSCLE +CREATURE:GAZELLE_MAN:EYE +CREATURE:GAZELLE_MAN:BRAIN +CREATURE:GAZELLE_MAN:LUNG +CREATURE:GAZELLE_MAN:HEART +CREATURE:GAZELLE_MAN:LIVER +CREATURE:GAZELLE_MAN:GUT +CREATURE:GAZELLE_MAN:STOMACH +CREATURE:GAZELLE_MAN:GIZZARD +CREATURE:GAZELLE_MAN:PANCREAS +CREATURE:GAZELLE_MAN:SPLEEN +CREATURE:GAZELLE_MAN:KIDNEY +CREATURE:GIANT_GAZELLE:MUSCLE +CREATURE:GIANT_GAZELLE:EYE +CREATURE:GIANT_GAZELLE:BRAIN +CREATURE:GIANT_GAZELLE:LUNG +CREATURE:GIANT_GAZELLE:HEART +CREATURE:GIANT_GAZELLE:LIVER +CREATURE:GIANT_GAZELLE:GUT +CREATURE:GIANT_GAZELLE:STOMACH +CREATURE:GIANT_GAZELLE:GIZZARD +CREATURE:GIANT_GAZELLE:PANCREAS +CREATURE:GIANT_GAZELLE:SPLEEN +CREATURE:GIANT_GAZELLE:KIDNEY +CREATURE:MANDRILL:MUSCLE +CREATURE:MANDRILL:EYE +CREATURE:MANDRILL:BRAIN +CREATURE:MANDRILL:LUNG +CREATURE:MANDRILL:HEART +CREATURE:MANDRILL:LIVER +CREATURE:MANDRILL:GUT +CREATURE:MANDRILL:STOMACH +CREATURE:MANDRILL:GIZZARD +CREATURE:MANDRILL:PANCREAS +CREATURE:MANDRILL:SPLEEN +CREATURE:MANDRILL:KIDNEY +CREATURE:MANDRILL_MAN:MUSCLE +CREATURE:MANDRILL_MAN:EYE +CREATURE:MANDRILL_MAN:BRAIN +CREATURE:MANDRILL_MAN:LUNG +CREATURE:MANDRILL_MAN:HEART +CREATURE:MANDRILL_MAN:LIVER +CREATURE:MANDRILL_MAN:GUT +CREATURE:MANDRILL_MAN:STOMACH +CREATURE:MANDRILL_MAN:GIZZARD +CREATURE:MANDRILL_MAN:PANCREAS +CREATURE:MANDRILL_MAN:SPLEEN +CREATURE:MANDRILL_MAN:KIDNEY +CREATURE:GIANT_MANDRILL:MUSCLE +CREATURE:GIANT_MANDRILL:EYE +CREATURE:GIANT_MANDRILL:BRAIN +CREATURE:GIANT_MANDRILL:LUNG +CREATURE:GIANT_MANDRILL:HEART +CREATURE:GIANT_MANDRILL:LIVER +CREATURE:GIANT_MANDRILL:GUT +CREATURE:GIANT_MANDRILL:STOMACH +CREATURE:GIANT_MANDRILL:GIZZARD + CREATURE:GIANT_MANDRILL:PANCREAS +CREATURE:GIANT_MANDRILL:SPLEEN +CREATURE:GIANT_MANDRILL:KIDNEY +CREATURE:CHIMPANZEE:MUSCLE +CREATURE:CHIMPANZEE:EYE +CREATURE:CHIMPANZEE:BRAIN +CREATURE:CHIMPANZEE:LUNG +CREATURE:CHIMPANZEE:HEART +CREATURE:CHIMPANZEE:LIVER +CREATURE:CHIMPANZEE:GUT +CREATURE:CHIMPANZEE:STOMACH +CREATURE:CHIMPANZEE:GIZZARD +CREATURE:CHIMPANZEE:PANCREAS +CREATURE:CHIMPANZEE:SPLEEN +CREATURE:CHIMPANZEE:KIDNEY +CREATURE:BONOBO:MUSCLE +CREATURE:BONOBO:EYE +CREATURE:BONOBO:BRAIN +CREATURE:BONOBO:LUNG +CREATURE:BONOBO:HEART +CREATURE:BONOBO:LIVER +CREATURE:BONOBO:GUT +CREATURE:BONOBO:STOMACH +CREATURE:BONOBO:GIZZARD +CREATURE:BONOBO:PANCREAS +CREATURE:BONOBO:SPLEEN +CREATURE:BONOBO:KIDNEY +CREATURE:GORILLA:MUSCLE +CREATURE:GORILLA:EYE +CREATURE:GORILLA:BRAIN +CREATURE:GORILLA:LUNG +CREATURE:GORILLA:HEART +CREATURE:GORILLA:LIVER +CREATURE:GORILLA:GUT +CREATURE:GORILLA:STOMACH +CREATURE:GORILLA:GIZZARD +CREATURE:GORILLA:PANCREAS +CREATURE:GORILLA:SPLEEN +CREATURE:GORILLA:KIDNEY +CREATURE:ORANGUTAN:MUSCLE +CREATURE:ORANGUTAN:EYE +CREATURE:ORANGUTAN:BRAIN +CREATURE:ORANGUTAN:LUNG +CREATURE:ORANGUTAN:HEART +CREATURE:ORANGUTAN:LIVER +CREATURE:ORANGUTAN:GUT +CREATURE:ORANGUTAN:STOMACH +CREATURE:ORANGUTAN:GIZZARD +CREATURE:ORANGUTAN:PANCREAS +CREATURE:ORANGUTAN:SPLEEN +CREATURE:ORANGUTAN:KIDNEY +CREATURE:GIBBON_SIAMANG:MUSCLE +CREATURE:GIBBON_SIAMANG:EYE +CREATURE:GIBBON_SIAMANG:BRAIN +CREATURE:GIBBON_SIAMANG:LUNG +CREATURE:GIBBON_SIAMANG:HEART +CREATURE:GIBBON_SIAMANG:LIVER +CREATURE:GIBBON_SIAMANG:GUT +CREATURE:GIBBON_SIAMANG:STOMACH +CREATURE:GIBBON_SIAMANG:GIZZARD + CREATURE:GIBBON_SIAMANG:PANCREAS +CREATURE:GIBBON_SIAMANG:SPLEEN +CREATURE:GIBBON_SIAMANG:KIDNEY +#CREATURE:GIBBON_WHITE_HANDED:MUSCLE + CREATURE:GIBBON_WHITE_HANDED:EYE +"CREATURE:GIBBON_WHITE_HANDED:BRAIN +!CREATURE:GIBBON_WHITE_HANDED:LUNG +"CREATURE:GIBBON_WHITE_HANDED:HEART +"CREATURE:GIBBON_WHITE_HANDED:LIVER + CREATURE:GIBBON_WHITE_HANDED:GUT +$CREATURE:GIBBON_WHITE_HANDED:STOMACH +$CREATURE:GIBBON_WHITE_HANDED:GIZZARD +%CREATURE:GIBBON_WHITE_HANDED:PANCREAS +#CREATURE:GIBBON_WHITE_HANDED:SPLEEN +#CREATURE:GIBBON_WHITE_HANDED:KIDNEY +#CREATURE:GIBBON_BLACK_HANDED:MUSCLE + CREATURE:GIBBON_BLACK_HANDED:EYE +"CREATURE:GIBBON_BLACK_HANDED:BRAIN +!CREATURE:GIBBON_BLACK_HANDED:LUNG +"CREATURE:GIBBON_BLACK_HANDED:HEART +"CREATURE:GIBBON_BLACK_HANDED:LIVER + CREATURE:GIBBON_BLACK_HANDED:GUT +$CREATURE:GIBBON_BLACK_HANDED:STOMACH +$CREATURE:GIBBON_BLACK_HANDED:GIZZARD +%CREATURE:GIBBON_BLACK_HANDED:PANCREAS +#CREATURE:GIBBON_BLACK_HANDED:SPLEEN +#CREATURE:GIBBON_BLACK_HANDED:KIDNEY +CREATURE:GIBBON_GRAY:MUSCLE +CREATURE:GIBBON_GRAY:EYE +CREATURE:GIBBON_GRAY:BRAIN +CREATURE:GIBBON_GRAY:LUNG +CREATURE:GIBBON_GRAY:HEART +CREATURE:GIBBON_GRAY:LIVER +CREATURE:GIBBON_GRAY:GUT +CREATURE:GIBBON_GRAY:STOMACH +CREATURE:GIBBON_GRAY:GIZZARD +CREATURE:GIBBON_GRAY:PANCREAS +CREATURE:GIBBON_GRAY:SPLEEN +CREATURE:GIBBON_GRAY:KIDNEY +CREATURE:GIBBON_SILVERY:MUSCLE +CREATURE:GIBBON_SILVERY:EYE +CREATURE:GIBBON_SILVERY:BRAIN +CREATURE:GIBBON_SILVERY:LUNG +CREATURE:GIBBON_SILVERY:HEART +CREATURE:GIBBON_SILVERY:LIVER +CREATURE:GIBBON_SILVERY:GUT +CREATURE:GIBBON_SILVERY:STOMACH +CREATURE:GIBBON_SILVERY:GIZZARD + CREATURE:GIBBON_SILVERY:PANCREAS +CREATURE:GIBBON_SILVERY:SPLEEN +CREATURE:GIBBON_SILVERY:KIDNEY +CREATURE:GIBBON_PILEATED:MUSCLE +CREATURE:GIBBON_PILEATED:EYE +CREATURE:GIBBON_PILEATED:BRAIN +CREATURE:GIBBON_PILEATED:LUNG +CREATURE:GIBBON_PILEATED:HEART +CREATURE:GIBBON_PILEATED:LIVER +CREATURE:GIBBON_PILEATED:GUT + CREATURE:GIBBON_PILEATED:STOMACH + CREATURE:GIBBON_PILEATED:GIZZARD +!CREATURE:GIBBON_PILEATED:PANCREAS +CREATURE:GIBBON_PILEATED:SPLEEN +CREATURE:GIBBON_PILEATED:KIDNEY +CREATURE:GIBBON_BILOU:MUSCLE +CREATURE:GIBBON_BILOU:EYE +CREATURE:GIBBON_BILOU:BRAIN +CREATURE:GIBBON_BILOU:LUNG +CREATURE:GIBBON_BILOU:HEART +CREATURE:GIBBON_BILOU:LIVER +CREATURE:GIBBON_BILOU:GUT +CREATURE:GIBBON_BILOU:STOMACH +CREATURE:GIBBON_BILOU:GIZZARD +CREATURE:GIBBON_BILOU:PANCREAS +CREATURE:GIBBON_BILOU:SPLEEN +CREATURE:GIBBON_BILOU:KIDNEY +#CREATURE:GIBBON_WHITE_BROWED:MUSCLE + CREATURE:GIBBON_WHITE_BROWED:EYE +"CREATURE:GIBBON_WHITE_BROWED:BRAIN +!CREATURE:GIBBON_WHITE_BROWED:LUNG +"CREATURE:GIBBON_WHITE_BROWED:HEART +"CREATURE:GIBBON_WHITE_BROWED:LIVER + CREATURE:GIBBON_WHITE_BROWED:GUT +$CREATURE:GIBBON_WHITE_BROWED:STOMACH +$CREATURE:GIBBON_WHITE_BROWED:GIZZARD +%CREATURE:GIBBON_WHITE_BROWED:PANCREAS +#CREATURE:GIBBON_WHITE_BROWED:SPLEEN +#CREATURE:GIBBON_WHITE_BROWED:KIDNEY +$CREATURE:GIBBON_BLACK_CRESTED:MUSCLE +!CREATURE:GIBBON_BLACK_CRESTED:EYE +#CREATURE:GIBBON_BLACK_CRESTED:BRAIN +"CREATURE:GIBBON_BLACK_CRESTED:LUNG +#CREATURE:GIBBON_BLACK_CRESTED:HEART +#CREATURE:GIBBON_BLACK_CRESTED:LIVER +!CREATURE:GIBBON_BLACK_CRESTED:GUT +%CREATURE:GIBBON_BLACK_CRESTED:STOMACH +%CREATURE:GIBBON_BLACK_CRESTED:GIZZARD +&CREATURE:GIBBON_BLACK_CRESTED:PANCREAS +$CREATURE:GIBBON_BLACK_CRESTED:SPLEEN +$CREATURE:GIBBON_BLACK_CRESTED:KIDNEY +CREATURE:CAMEL_1_HUMP:MUSCLE +CREATURE:CAMEL_1_HUMP:EYE +CREATURE:CAMEL_1_HUMP:BRAIN +CREATURE:CAMEL_1_HUMP:LUNG +CREATURE:CAMEL_1_HUMP:HEART +CREATURE:CAMEL_1_HUMP:LIVER +CREATURE:CAMEL_1_HUMP:GUT +CREATURE:CAMEL_1_HUMP:STOMACH +CREATURE:CAMEL_1_HUMP:GIZZARD +CREATURE:CAMEL_1_HUMP:PANCREAS +CREATURE:CAMEL_1_HUMP:SPLEEN +CREATURE:CAMEL_1_HUMP:KIDNEY + CREATURE:CAMEL_1_HUMP_MAN:MUSCLE +CREATURE:CAMEL_1_HUMP_MAN:EYE +CREATURE:CAMEL_1_HUMP_MAN:BRAIN +CREATURE:CAMEL_1_HUMP_MAN:LUNG +CREATURE:CAMEL_1_HUMP_MAN:HEART +CREATURE:CAMEL_1_HUMP_MAN:LIVER +CREATURE:CAMEL_1_HUMP_MAN:GUT +!CREATURE:CAMEL_1_HUMP_MAN:STOMACH +!CREATURE:CAMEL_1_HUMP_MAN:GIZZARD +"CREATURE:CAMEL_1_HUMP_MAN:PANCREAS + CREATURE:CAMEL_1_HUMP_MAN:SPLEEN + CREATURE:CAMEL_1_HUMP_MAN:KIDNEY +"CREATURE:GIANT_CAMEL_1_HUMP:MUSCLE +CREATURE:GIANT_CAMEL_1_HUMP:EYE +!CREATURE:GIANT_CAMEL_1_HUMP:BRAIN + CREATURE:GIANT_CAMEL_1_HUMP:LUNG +!CREATURE:GIANT_CAMEL_1_HUMP:HEART +!CREATURE:GIANT_CAMEL_1_HUMP:LIVER +CREATURE:GIANT_CAMEL_1_HUMP:GUT +#CREATURE:GIANT_CAMEL_1_HUMP:STOMACH +#CREATURE:GIANT_CAMEL_1_HUMP:GIZZARD +$CREATURE:GIANT_CAMEL_1_HUMP:PANCREAS +"CREATURE:GIANT_CAMEL_1_HUMP:SPLEEN +"CREATURE:GIANT_CAMEL_1_HUMP:KIDNEY +CREATURE:CAMEL_2_HUMP:MUSCLE +CREATURE:CAMEL_2_HUMP:EYE +CREATURE:CAMEL_2_HUMP:BRAIN +CREATURE:CAMEL_2_HUMP:LUNG +CREATURE:CAMEL_2_HUMP:HEART +CREATURE:CAMEL_2_HUMP:LIVER +CREATURE:CAMEL_2_HUMP:GUT +CREATURE:CAMEL_2_HUMP:STOMACH +CREATURE:CAMEL_2_HUMP:GIZZARD +CREATURE:CAMEL_2_HUMP:PANCREAS +CREATURE:CAMEL_2_HUMP:SPLEEN +CREATURE:CAMEL_2_HUMP:KIDNEY + CREATURE:CAMEL_2_HUMP_MAN:MUSCLE +CREATURE:CAMEL_2_HUMP_MAN:EYE +CREATURE:CAMEL_2_HUMP_MAN:BRAIN +CREATURE:CAMEL_2_HUMP_MAN:LUNG +CREATURE:CAMEL_2_HUMP_MAN:HEART +CREATURE:CAMEL_2_HUMP_MAN:LIVER +CREATURE:CAMEL_2_HUMP_MAN:GUT +!CREATURE:CAMEL_2_HUMP_MAN:STOMACH +!CREATURE:CAMEL_2_HUMP_MAN:GIZZARD +"CREATURE:CAMEL_2_HUMP_MAN:PANCREAS + CREATURE:CAMEL_2_HUMP_MAN:SPLEEN + CREATURE:CAMEL_2_HUMP_MAN:KIDNEY +"CREATURE:GIANT_CAMEL_2_HUMP:MUSCLE +CREATURE:GIANT_CAMEL_2_HUMP:EYE +!CREATURE:GIANT_CAMEL_2_HUMP:BRAIN + CREATURE:GIANT_CAMEL_2_HUMP:LUNG +!CREATURE:GIANT_CAMEL_2_HUMP:HEART +!CREATURE:GIANT_CAMEL_2_HUMP:LIVER +CREATURE:GIANT_CAMEL_2_HUMP:GUT +#CREATURE:GIANT_CAMEL_2_HUMP:STOMACH +#CREATURE:GIANT_CAMEL_2_HUMP:GIZZARD +$CREATURE:GIANT_CAMEL_2_HUMP:PANCREAS +"CREATURE:GIANT_CAMEL_2_HUMP:SPLEEN +"CREATURE:GIANT_CAMEL_2_HUMP:KIDNEY +#CREATURE:CROCODILE_SALTWATER:MUSCLE + CREATURE:CROCODILE_SALTWATER:EYE +"CREATURE:CROCODILE_SALTWATER:BRAIN +!CREATURE:CROCODILE_SALTWATER:LUNG +"CREATURE:CROCODILE_SALTWATER:HEART +"CREATURE:CROCODILE_SALTWATER:LIVER + CREATURE:CROCODILE_SALTWATER:GUT +$CREATURE:CROCODILE_SALTWATER:STOMACH +$CREATURE:CROCODILE_SALTWATER:GIZZARD +%CREATURE:CROCODILE_SALTWATER:PANCREAS +#CREATURE:CROCODILE_SALTWATER:SPLEEN +#CREATURE:CROCODILE_SALTWATER:KIDNEY +'CREATURE:CROCODILE_SALTWATER_MAN:MUSCLE +$CREATURE:CROCODILE_SALTWATER_MAN:EYE +&CREATURE:CROCODILE_SALTWATER_MAN:BRAIN +%CREATURE:CROCODILE_SALTWATER_MAN:LUNG +&CREATURE:CROCODILE_SALTWATER_MAN:HEART +&CREATURE:CROCODILE_SALTWATER_MAN:LIVER +$CREATURE:CROCODILE_SALTWATER_MAN:GUT +(CREATURE:CROCODILE_SALTWATER_MAN:STOMACH +(CREATURE:CROCODILE_SALTWATER_MAN:GIZZARD +)CREATURE:CROCODILE_SALTWATER_MAN:PANCREAS +'CREATURE:CROCODILE_SALTWATER_MAN:SPLEEN +'CREATURE:CROCODILE_SALTWATER_MAN:KIDNEY +)CREATURE:GIANT_CROCODILE_SALTWATER:MUSCLE +&CREATURE:GIANT_CROCODILE_SALTWATER:EYE +(CREATURE:GIANT_CROCODILE_SALTWATER:BRAIN +'CREATURE:GIANT_CROCODILE_SALTWATER:LUNG +(CREATURE:GIANT_CROCODILE_SALTWATER:HEART +(CREATURE:GIANT_CROCODILE_SALTWATER:LIVER +&CREATURE:GIANT_CROCODILE_SALTWATER:GUT +*CREATURE:GIANT_CROCODILE_SALTWATER:STOMACH +*CREATURE:GIANT_CROCODILE_SALTWATER:GIZZARD ++CREATURE:GIANT_CROCODILE_SALTWATER:PANCREAS +)CREATURE:GIANT_CROCODILE_SALTWATER:SPLEEN +)CREATURE:GIANT_CROCODILE_SALTWATER:KIDNEY +CREATURE:BIRD_VULTURE:MUSCLE +CREATURE:BIRD_VULTURE:EYE +CREATURE:BIRD_VULTURE:BRAIN +CREATURE:BIRD_VULTURE:LUNG +CREATURE:BIRD_VULTURE:HEART +CREATURE:BIRD_VULTURE:LIVER +CREATURE:BIRD_VULTURE:GUT +CREATURE:BIRD_VULTURE:STOMACH +CREATURE:BIRD_VULTURE:GIZZARD +CREATURE:BIRD_VULTURE:PANCREAS +CREATURE:BIRD_VULTURE:SPLEEN +CREATURE:BIRD_VULTURE:KIDNEY +CREATURE:VULTURE_MAN:MUSCLE +CREATURE:VULTURE_MAN:EYE +CREATURE:VULTURE_MAN:BRAIN +CREATURE:VULTURE_MAN:LUNG +CREATURE:VULTURE_MAN:HEART +CREATURE:VULTURE_MAN:LIVER +CREATURE:VULTURE_MAN:GUT +CREATURE:VULTURE_MAN:STOMACH +CREATURE:VULTURE_MAN:GIZZARD +CREATURE:VULTURE_MAN:PANCREAS +CREATURE:VULTURE_MAN:SPLEEN +CREATURE:VULTURE_MAN:KIDNEY +CREATURE:GIANT_VULTURE:MUSCLE +CREATURE:GIANT_VULTURE:EYE +CREATURE:GIANT_VULTURE:BRAIN +CREATURE:GIANT_VULTURE:LUNG +CREATURE:GIANT_VULTURE:HEART +CREATURE:GIANT_VULTURE:LIVER +CREATURE:GIANT_VULTURE:GUT +CREATURE:GIANT_VULTURE:STOMACH +CREATURE:GIANT_VULTURE:GIZZARD +CREATURE:GIANT_VULTURE:PANCREAS +CREATURE:GIANT_VULTURE:SPLEEN +CREATURE:GIANT_VULTURE:KIDNEY +CREATURE:RHINOCEROS:MUSCLE +CREATURE:RHINOCEROS:EYE +CREATURE:RHINOCEROS:BRAIN +CREATURE:RHINOCEROS:LUNG +CREATURE:RHINOCEROS:HEART +CREATURE:RHINOCEROS:LIVER +CREATURE:RHINOCEROS:GUT +CREATURE:RHINOCEROS:STOMACH +CREATURE:RHINOCEROS:GIZZARD +CREATURE:RHINOCEROS:PANCREAS +CREATURE:RHINOCEROS:SPLEEN +CREATURE:RHINOCEROS:KIDNEY +CREATURE:RHINOCEROS_MAN:MUSCLE +CREATURE:RHINOCEROS_MAN:EYE +CREATURE:RHINOCEROS_MAN:BRAIN +CREATURE:RHINOCEROS_MAN:LUNG +CREATURE:RHINOCEROS_MAN:HEART +CREATURE:RHINOCEROS_MAN:LIVER +CREATURE:RHINOCEROS_MAN:GUT +CREATURE:RHINOCEROS_MAN:STOMACH +CREATURE:RHINOCEROS_MAN:GIZZARD + CREATURE:RHINOCEROS_MAN:PANCREAS +CREATURE:RHINOCEROS_MAN:SPLEEN +CREATURE:RHINOCEROS_MAN:KIDNEY + CREATURE:GIANT_RHINOCEROS:MUSCLE +CREATURE:GIANT_RHINOCEROS:EYE +CREATURE:GIANT_RHINOCEROS:BRAIN +CREATURE:GIANT_RHINOCEROS:LUNG +CREATURE:GIANT_RHINOCEROS:HEART +CREATURE:GIANT_RHINOCEROS:LIVER +CREATURE:GIANT_RHINOCEROS:GUT +!CREATURE:GIANT_RHINOCEROS:STOMACH +!CREATURE:GIANT_RHINOCEROS:GIZZARD +"CREATURE:GIANT_RHINOCEROS:PANCREAS + CREATURE:GIANT_RHINOCEROS:SPLEEN + CREATURE:GIANT_RHINOCEROS:KIDNEY +CREATURE:GIRAFFE:MUSCLE +CREATURE:GIRAFFE:EYE +CREATURE:GIRAFFE:BRAIN +CREATURE:GIRAFFE:LUNG +CREATURE:GIRAFFE:HEART +CREATURE:GIRAFFE:LIVER +CREATURE:GIRAFFE:GUT +CREATURE:GIRAFFE:STOMACH +CREATURE:GIRAFFE:GIZZARD +CREATURE:GIRAFFE:PANCREAS +CREATURE:GIRAFFE:SPLEEN +CREATURE:GIRAFFE:KIDNEY +CREATURE:GIRAFFE_MAN:MUSCLE +CREATURE:GIRAFFE_MAN:EYE +CREATURE:GIRAFFE_MAN:BRAIN +CREATURE:GIRAFFE_MAN:LUNG +CREATURE:GIRAFFE_MAN:HEART +CREATURE:GIRAFFE_MAN:LIVER +CREATURE:GIRAFFE_MAN:GUT +CREATURE:GIRAFFE_MAN:STOMACH +CREATURE:GIRAFFE_MAN:GIZZARD +CREATURE:GIRAFFE_MAN:PANCREAS +CREATURE:GIRAFFE_MAN:SPLEEN +CREATURE:GIRAFFE_MAN:KIDNEY +CREATURE:GIANT_GIRAFFE:MUSCLE +CREATURE:GIANT_GIRAFFE:EYE +CREATURE:GIANT_GIRAFFE:BRAIN +CREATURE:GIANT_GIRAFFE:LUNG +CREATURE:GIANT_GIRAFFE:HEART +CREATURE:GIANT_GIRAFFE:LIVER +CREATURE:GIANT_GIRAFFE:GUT +CREATURE:GIANT_GIRAFFE:STOMACH +CREATURE:GIANT_GIRAFFE:GIZZARD +CREATURE:GIANT_GIRAFFE:PANCREAS +CREATURE:GIANT_GIRAFFE:SPLEEN +CREATURE:GIANT_GIRAFFE:KIDNEY +CREATURE:HONEY BADGER:MUSCLE +CREATURE:HONEY BADGER:EYE +CREATURE:HONEY BADGER:BRAIN +CREATURE:HONEY BADGER:LUNG +CREATURE:HONEY BADGER:HEART +CREATURE:HONEY BADGER:LIVER +CREATURE:HONEY BADGER:GUT +CREATURE:HONEY BADGER:STOMACH +CREATURE:HONEY BADGER:GIZZARD +CREATURE:HONEY BADGER:PANCREAS +CREATURE:HONEY BADGER:SPLEEN +CREATURE:HONEY BADGER:KIDNEY + CREATURE:HONEY BADGER MAN:MUSCLE +CREATURE:HONEY BADGER MAN:EYE +CREATURE:HONEY BADGER MAN:BRAIN +CREATURE:HONEY BADGER MAN:LUNG +CREATURE:HONEY BADGER MAN:HEART +CREATURE:HONEY BADGER MAN:LIVER +CREATURE:HONEY BADGER MAN:GUT +!CREATURE:HONEY BADGER MAN:STOMACH +!CREATURE:HONEY BADGER MAN:GIZZARD +"CREATURE:HONEY BADGER MAN:PANCREAS + CREATURE:HONEY BADGER MAN:SPLEEN + CREATURE:HONEY BADGER MAN:KIDNEY +#CREATURE:HONEY BADGER, GIANT:MUSCLE + CREATURE:HONEY BADGER, GIANT:EYE +"CREATURE:HONEY BADGER, GIANT:BRAIN +!CREATURE:HONEY BADGER, GIANT:LUNG +"CREATURE:HONEY BADGER, GIANT:HEART +"CREATURE:HONEY BADGER, GIANT:LIVER + CREATURE:HONEY BADGER, GIANT:GUT +$CREATURE:HONEY BADGER, GIANT:STOMACH +$CREATURE:HONEY BADGER, GIANT:GIZZARD +%CREATURE:HONEY BADGER, GIANT:PANCREAS +#CREATURE:HONEY BADGER, GIANT:SPLEEN +#CREATURE:HONEY BADGER, GIANT:KIDNEY +CREATURE:GIANT TORTOISE:MUSCLE +CREATURE:GIANT TORTOISE:EYE +CREATURE:GIANT TORTOISE:BRAIN +CREATURE:GIANT TORTOISE:LUNG +CREATURE:GIANT TORTOISE:HEART +CREATURE:GIANT TORTOISE:LIVER +CREATURE:GIANT TORTOISE:GUT +CREATURE:GIANT TORTOISE:STOMACH +CREATURE:GIANT TORTOISE:GIZZARD + CREATURE:GIANT TORTOISE:PANCREAS +CREATURE:GIANT TORTOISE:SPLEEN +CREATURE:GIANT TORTOISE:KIDNEY +"CREATURE:GIANT TORTOISE MAN:MUSCLE +CREATURE:GIANT TORTOISE MAN:EYE +!CREATURE:GIANT TORTOISE MAN:BRAIN + CREATURE:GIANT TORTOISE MAN:LUNG +!CREATURE:GIANT TORTOISE MAN:HEART +!CREATURE:GIANT TORTOISE MAN:LIVER +CREATURE:GIANT TORTOISE MAN:GUT +#CREATURE:GIANT TORTOISE MAN:STOMACH +#CREATURE:GIANT TORTOISE MAN:GIZZARD +$CREATURE:GIANT TORTOISE MAN:PANCREAS +"CREATURE:GIANT TORTOISE MAN:SPLEEN +"CREATURE:GIANT TORTOISE MAN:KIDNEY +!CREATURE:GIGANTIC TORTOISE:MUSCLE +CREATURE:GIGANTIC TORTOISE:EYE + CREATURE:GIGANTIC TORTOISE:BRAIN +CREATURE:GIGANTIC TORTOISE:LUNG + CREATURE:GIGANTIC TORTOISE:HEART + CREATURE:GIGANTIC TORTOISE:LIVER +CREATURE:GIGANTIC TORTOISE:GUT +"CREATURE:GIGANTIC TORTOISE:STOMACH +"CREATURE:GIGANTIC TORTOISE:GIZZARD +#CREATURE:GIGANTIC TORTOISE:PANCREAS +!CREATURE:GIGANTIC TORTOISE:SPLEEN +!CREATURE:GIGANTIC TORTOISE:KIDNEY +CREATURE:ARMADILLO:MUSCLE +CREATURE:ARMADILLO:EYE +CREATURE:ARMADILLO:BRAIN +CREATURE:ARMADILLO:LUNG +CREATURE:ARMADILLO:HEART +CREATURE:ARMADILLO:LIVER +CREATURE:ARMADILLO:GUT +CREATURE:ARMADILLO:STOMACH +CREATURE:ARMADILLO:GIZZARD +CREATURE:ARMADILLO:PANCREAS +CREATURE:ARMADILLO:SPLEEN +CREATURE:ARMADILLO:KIDNEY +CREATURE:ARMADILLO MAN:MUSCLE +CREATURE:ARMADILLO MAN:EYE +CREATURE:ARMADILLO MAN:BRAIN +CREATURE:ARMADILLO MAN:LUNG +CREATURE:ARMADILLO MAN:HEART +CREATURE:ARMADILLO MAN:LIVER +CREATURE:ARMADILLO MAN:GUT +CREATURE:ARMADILLO MAN:STOMACH +CREATURE:ARMADILLO MAN:GIZZARD +CREATURE:ARMADILLO MAN:PANCREAS +CREATURE:ARMADILLO MAN:SPLEEN +CREATURE:ARMADILLO MAN:KIDNEY + CREATURE:ARMADILLO, GIANT:MUSCLE +CREATURE:ARMADILLO, GIANT:EYE +CREATURE:ARMADILLO, GIANT:BRAIN +CREATURE:ARMADILLO, GIANT:LUNG +CREATURE:ARMADILLO, GIANT:HEART +CREATURE:ARMADILLO, GIANT:LIVER +CREATURE:ARMADILLO, GIANT:GUT +!CREATURE:ARMADILLO, GIANT:STOMACH +!CREATURE:ARMADILLO, GIANT:GIZZARD +"CREATURE:ARMADILLO, GIANT:PANCREAS + CREATURE:ARMADILLO, GIANT:SPLEEN + CREATURE:ARMADILLO, GIANT:KIDNEY +CREATURE:MUSKOX:MUSCLE +CREATURE:MUSKOX:EYE +CREATURE:MUSKOX:BRAIN +CREATURE:MUSKOX:LUNG +CREATURE:MUSKOX:HEART +CREATURE:MUSKOX:LIVER +CREATURE:MUSKOX:GUT +CREATURE:MUSKOX:STOMACH +CREATURE:MUSKOX:GIZZARD +CREATURE:MUSKOX:PANCREAS +CREATURE:MUSKOX:SPLEEN +CREATURE:MUSKOX:KIDNEY +CREATURE:MUSKOX_MAN:MUSCLE +CREATURE:MUSKOX_MAN:EYE +CREATURE:MUSKOX_MAN:BRAIN +CREATURE:MUSKOX_MAN:LUNG +CREATURE:MUSKOX_MAN:HEART +CREATURE:MUSKOX_MAN:LIVER +CREATURE:MUSKOX_MAN:GUT +CREATURE:MUSKOX_MAN:STOMACH +CREATURE:MUSKOX_MAN:GIZZARD +CREATURE:MUSKOX_MAN:PANCREAS +CREATURE:MUSKOX_MAN:SPLEEN +CREATURE:MUSKOX_MAN:KIDNEY +CREATURE:GIANT_MUSKOX:MUSCLE +CREATURE:GIANT_MUSKOX:EYE +CREATURE:GIANT_MUSKOX:BRAIN +CREATURE:GIANT_MUSKOX:LUNG +CREATURE:GIANT_MUSKOX:HEART +CREATURE:GIANT_MUSKOX:LIVER +CREATURE:GIANT_MUSKOX:GUT +CREATURE:GIANT_MUSKOX:STOMACH +CREATURE:GIANT_MUSKOX:GIZZARD +CREATURE:GIANT_MUSKOX:PANCREAS +CREATURE:GIANT_MUSKOX:SPLEEN +CREATURE:GIANT_MUSKOX:KIDNEY +CREATURE:ELK:MUSCLE +CREATURE:ELK:EYE +CREATURE:ELK:BRAIN +CREATURE:ELK:LUNG +CREATURE:ELK:HEART +CREATURE:ELK:LIVER +CREATURE:ELK:GUT +CREATURE:ELK:STOMACH +CREATURE:ELK:GIZZARD +CREATURE:ELK:PANCREAS +CREATURE:ELK:SPLEEN +CREATURE:ELK:KIDNEY +CREATURE:ELK_MAN:MUSCLE +CREATURE:ELK_MAN:EYE +CREATURE:ELK_MAN:BRAIN +CREATURE:ELK_MAN:LUNG +CREATURE:ELK_MAN:HEART +CREATURE:ELK_MAN:LIVER +CREATURE:ELK_MAN:GUT +CREATURE:ELK_MAN:STOMACH +CREATURE:ELK_MAN:GIZZARD +CREATURE:ELK_MAN:PANCREAS +CREATURE:ELK_MAN:SPLEEN +CREATURE:ELK_MAN:KIDNEY +CREATURE:GIANT_ELK:MUSCLE +CREATURE:GIANT_ELK:EYE +CREATURE:GIANT_ELK:BRAIN +CREATURE:GIANT_ELK:LUNG +CREATURE:GIANT_ELK:HEART +CREATURE:GIANT_ELK:LIVER +CREATURE:GIANT_ELK:GUT +CREATURE:GIANT_ELK:STOMACH +CREATURE:GIANT_ELK:GIZZARD +CREATURE:GIANT_ELK:PANCREAS +CREATURE:GIANT_ELK:SPLEEN +CREATURE:GIANT_ELK:KIDNEY +CREATURE:BEAR_POLAR:MUSCLE +CREATURE:BEAR_POLAR:EYE +CREATURE:BEAR_POLAR:BRAIN +CREATURE:BEAR_POLAR:LUNG +CREATURE:BEAR_POLAR:HEART +CREATURE:BEAR_POLAR:LIVER +CREATURE:BEAR_POLAR:GUT +CREATURE:BEAR_POLAR:STOMACH +CREATURE:BEAR_POLAR:GIZZARD +CREATURE:BEAR_POLAR:PANCREAS +CREATURE:BEAR_POLAR:SPLEEN +CREATURE:BEAR_POLAR:KIDNEY +CREATURE:BEAR_POLAR_MAN:MUSCLE +CREATURE:BEAR_POLAR_MAN:EYE +CREATURE:BEAR_POLAR_MAN:BRAIN +CREATURE:BEAR_POLAR_MAN:LUNG +CREATURE:BEAR_POLAR_MAN:HEART +CREATURE:BEAR_POLAR_MAN:LIVER +CREATURE:BEAR_POLAR_MAN:GUT +CREATURE:BEAR_POLAR_MAN:STOMACH +CREATURE:BEAR_POLAR_MAN:GIZZARD + CREATURE:BEAR_POLAR_MAN:PANCREAS +CREATURE:BEAR_POLAR_MAN:SPLEEN +CREATURE:BEAR_POLAR_MAN:KIDNEY + CREATURE:GIANT_BEAR_POLAR:MUSCLE +CREATURE:GIANT_BEAR_POLAR:EYE +CREATURE:GIANT_BEAR_POLAR:BRAIN +CREATURE:GIANT_BEAR_POLAR:LUNG +CREATURE:GIANT_BEAR_POLAR:HEART +CREATURE:GIANT_BEAR_POLAR:LIVER +CREATURE:GIANT_BEAR_POLAR:GUT +!CREATURE:GIANT_BEAR_POLAR:STOMACH +!CREATURE:GIANT_BEAR_POLAR:GIZZARD +"CREATURE:GIANT_BEAR_POLAR:PANCREAS + CREATURE:GIANT_BEAR_POLAR:SPLEEN + CREATURE:GIANT_BEAR_POLAR:KIDNEY +CREATURE:WOLVERINE:MUSCLE +CREATURE:WOLVERINE:EYE +CREATURE:WOLVERINE:BRAIN +CREATURE:WOLVERINE:LUNG +CREATURE:WOLVERINE:HEART +CREATURE:WOLVERINE:LIVER +CREATURE:WOLVERINE:GUT +CREATURE:WOLVERINE:STOMACH +CREATURE:WOLVERINE:GIZZARD +CREATURE:WOLVERINE:PANCREAS +CREATURE:WOLVERINE:SPLEEN +CREATURE:WOLVERINE:KIDNEY +CREATURE:WOLVERINE_MAN:MUSCLE +CREATURE:WOLVERINE_MAN:EYE +CREATURE:WOLVERINE_MAN:BRAIN +CREATURE:WOLVERINE_MAN:LUNG +CREATURE:WOLVERINE_MAN:HEART +CREATURE:WOLVERINE_MAN:LIVER +CREATURE:WOLVERINE_MAN:GUT +CREATURE:WOLVERINE_MAN:STOMACH +CREATURE:WOLVERINE_MAN:GIZZARD +CREATURE:WOLVERINE_MAN:PANCREAS +CREATURE:WOLVERINE_MAN:SPLEEN +CREATURE:WOLVERINE_MAN:KIDNEY +CREATURE:GIANT_WOLVERINE:MUSCLE +CREATURE:GIANT_WOLVERINE:EYE +CREATURE:GIANT_WOLVERINE:BRAIN +CREATURE:GIANT_WOLVERINE:LUNG +CREATURE:GIANT_WOLVERINE:HEART +CREATURE:GIANT_WOLVERINE:LIVER +CREATURE:GIANT_WOLVERINE:GUT + CREATURE:GIANT_WOLVERINE:STOMACH + CREATURE:GIANT_WOLVERINE:GIZZARD +!CREATURE:GIANT_WOLVERINE:PANCREAS +CREATURE:GIANT_WOLVERINE:SPLEEN +CREATURE:GIANT_WOLVERINE:KIDNEY +CREATURE:CHINCHILLA:MUSCLE +CREATURE:CHINCHILLA:EYE +CREATURE:CHINCHILLA:BRAIN +CREATURE:CHINCHILLA:LUNG +CREATURE:CHINCHILLA:HEART +CREATURE:CHINCHILLA:LIVER +CREATURE:CHINCHILLA:GUT +CREATURE:CHINCHILLA:STOMACH +CREATURE:CHINCHILLA:GIZZARD +CREATURE:CHINCHILLA:PANCREAS +CREATURE:CHINCHILLA:SPLEEN +CREATURE:CHINCHILLA:KIDNEY +CREATURE:CHINCHILLA_MAN:MUSCLE +CREATURE:CHINCHILLA_MAN:EYE +CREATURE:CHINCHILLA_MAN:BRAIN +CREATURE:CHINCHILLA_MAN:LUNG +CREATURE:CHINCHILLA_MAN:HEART +CREATURE:CHINCHILLA_MAN:LIVER +CREATURE:CHINCHILLA_MAN:GUT +CREATURE:CHINCHILLA_MAN:STOMACH +CREATURE:CHINCHILLA_MAN:GIZZARD + CREATURE:CHINCHILLA_MAN:PANCREAS +CREATURE:CHINCHILLA_MAN:SPLEEN +CREATURE:CHINCHILLA_MAN:KIDNEY + CREATURE:GIANT_CHINCHILLA:MUSCLE +CREATURE:GIANT_CHINCHILLA:EYE +CREATURE:GIANT_CHINCHILLA:BRAIN +CREATURE:GIANT_CHINCHILLA:LUNG +CREATURE:GIANT_CHINCHILLA:HEART +CREATURE:GIANT_CHINCHILLA:LIVER +CREATURE:GIANT_CHINCHILLA:GUT +!CREATURE:GIANT_CHINCHILLA:STOMACH +!CREATURE:GIANT_CHINCHILLA:GIZZARD +"CREATURE:GIANT_CHINCHILLA:PANCREAS + CREATURE:GIANT_CHINCHILLA:SPLEEN + CREATURE:GIANT_CHINCHILLA:KIDNEY +CREATURE:FLOATING_GUTS:MUSCLE +CREATURE:FLOATING_GUTS:EYE +CREATURE:FLOATING_GUTS:BRAIN +CREATURE:FLOATING_GUTS:LUNG +CREATURE:FLOATING_GUTS:HEART +CREATURE:FLOATING_GUTS:LIVER +CREATURE:FLOATING_GUTS:GUT +CREATURE:FLOATING_GUTS:STOMACH +CREATURE:FLOATING_GUTS:GIZZARD +CREATURE:FLOATING_GUTS:PANCREAS +CREATURE:FLOATING_GUTS:SPLEEN +CREATURE:FLOATING_GUTS:KIDNEY +CREATURE:DRUNIAN:MUSCLE +CREATURE:DRUNIAN:EYE +CREATURE:DRUNIAN:BRAIN +CREATURE:DRUNIAN:LUNG +CREATURE:DRUNIAN:HEART +CREATURE:DRUNIAN:LIVER +CREATURE:DRUNIAN:GUT +CREATURE:DRUNIAN:STOMACH +CREATURE:DRUNIAN:GIZZARD +CREATURE:DRUNIAN:PANCREAS +CREATURE:DRUNIAN:SPLEEN +CREATURE:DRUNIAN:KIDNEY +CREATURE:CREEPING_EYE:MUSCLE +CREATURE:CREEPING_EYE:EYE +CREATURE:CREEPING_EYE:BRAIN +CREATURE:CREEPING_EYE:LUNG +CREATURE:CREEPING_EYE:HEART +CREATURE:CREEPING_EYE:LIVER +CREATURE:CREEPING_EYE:GUT +CREATURE:CREEPING_EYE:STOMACH +CREATURE:CREEPING_EYE:GIZZARD +CREATURE:CREEPING_EYE:PANCREAS +CREATURE:CREEPING_EYE:SPLEEN +CREATURE:CREEPING_EYE:KIDNEY +&CREATURE:VORACIOUS_CAVE_CRAWLER:MUSCLE +#CREATURE:VORACIOUS_CAVE_CRAWLER:EYE +%CREATURE:VORACIOUS_CAVE_CRAWLER:BRAIN +$CREATURE:VORACIOUS_CAVE_CRAWLER:LUNG +%CREATURE:VORACIOUS_CAVE_CRAWLER:HEART +%CREATURE:VORACIOUS_CAVE_CRAWLER:LIVER +#CREATURE:VORACIOUS_CAVE_CRAWLER:GUT +'CREATURE:VORACIOUS_CAVE_CRAWLER:STOMACH +'CREATURE:VORACIOUS_CAVE_CRAWLER:GIZZARD +(CREATURE:VORACIOUS_CAVE_CRAWLER:PANCREAS +&CREATURE:VORACIOUS_CAVE_CRAWLER:SPLEEN +&CREATURE:VORACIOUS_CAVE_CRAWLER:KIDNEY +CREATURE:BLIND_CAVE_OGRE:MUSCLE +CREATURE:BLIND_CAVE_OGRE:EYE +CREATURE:BLIND_CAVE_OGRE:BRAIN +CREATURE:BLIND_CAVE_OGRE:LUNG +CREATURE:BLIND_CAVE_OGRE:HEART +CREATURE:BLIND_CAVE_OGRE:LIVER +CREATURE:BLIND_CAVE_OGRE:GUT + CREATURE:BLIND_CAVE_OGRE:STOMACH + CREATURE:BLIND_CAVE_OGRE:GIZZARD +!CREATURE:BLIND_CAVE_OGRE:PANCREAS +CREATURE:BLIND_CAVE_OGRE:SPLEEN +CREATURE:BLIND_CAVE_OGRE:KIDNEY +CREATURE:CAP_HOPPER:MUSCLE +CREATURE:CAP_HOPPER:EYE +CREATURE:CAP_HOPPER:BRAIN +CREATURE:CAP_HOPPER:LUNG +CREATURE:CAP_HOPPER:HEART +CREATURE:CAP_HOPPER:LIVER +CREATURE:CAP_HOPPER:GUT +CREATURE:CAP_HOPPER:STOMACH +CREATURE:CAP_HOPPER:GIZZARD +CREATURE:CAP_HOPPER:PANCREAS +CREATURE:CAP_HOPPER:SPLEEN +CREATURE:CAP_HOPPER:KIDNEY +CREATURE:MAGMA_CRAB:MUSCLE +CREATURE:MAGMA_CRAB:EYE +CREATURE:MAGMA_CRAB:BRAIN +CREATURE:MAGMA_CRAB:LUNG +CREATURE:MAGMA_CRAB:HEART +CREATURE:MAGMA_CRAB:LIVER +CREATURE:MAGMA_CRAB:GUT +CREATURE:MAGMA_CRAB:STOMACH +CREATURE:MAGMA_CRAB:GIZZARD +CREATURE:MAGMA_CRAB:PANCREAS +CREATURE:MAGMA_CRAB:SPLEEN +CREATURE:MAGMA_CRAB:KIDNEY +CREATURE:CRUNDLE:MUSCLE +CREATURE:CRUNDLE:EYE +CREATURE:CRUNDLE:BRAIN +CREATURE:CRUNDLE:LUNG +CREATURE:CRUNDLE:HEART +CREATURE:CRUNDLE:LIVER +CREATURE:CRUNDLE:GUT +CREATURE:CRUNDLE:STOMACH +CREATURE:CRUNDLE:GIZZARD +CREATURE:CRUNDLE:PANCREAS +CREATURE:CRUNDLE:SPLEEN +CREATURE:CRUNDLE:KIDNEY +CREATURE:HUNGRY_HEAD:MUSCLE +CREATURE:HUNGRY_HEAD:EYE +CREATURE:HUNGRY_HEAD:BRAIN +CREATURE:HUNGRY_HEAD:LUNG +CREATURE:HUNGRY_HEAD:HEART +CREATURE:HUNGRY_HEAD:LIVER +CREATURE:HUNGRY_HEAD:GUT +CREATURE:HUNGRY_HEAD:STOMACH +CREATURE:HUNGRY_HEAD:GIZZARD +CREATURE:HUNGRY_HEAD:PANCREAS +CREATURE:HUNGRY_HEAD:SPLEEN +CREATURE:HUNGRY_HEAD:KIDNEY +CREATURE:FLESH_BALL:MUSCLE +CREATURE:ELK_BIRD:MUSCLE +CREATURE:ELK_BIRD:EYE +CREATURE:ELK_BIRD:BRAIN +CREATURE:ELK_BIRD:LUNG +CREATURE:ELK_BIRD:HEART +CREATURE:ELK_BIRD:LIVER +CREATURE:ELK_BIRD:GUT +CREATURE:ELK_BIRD:STOMACH +CREATURE:ELK_BIRD:GIZZARD +CREATURE:ELK_BIRD:PANCREAS +CREATURE:ELK_BIRD:SPLEEN +CREATURE:ELK_BIRD:KIDNEY +CREATURE:HELMET_SNAKE:MUSCLE +CREATURE:HELMET_SNAKE:EYE +CREATURE:HELMET_SNAKE:BRAIN +CREATURE:HELMET_SNAKE:LUNG +CREATURE:HELMET_SNAKE:HEART +CREATURE:HELMET_SNAKE:LIVER +CREATURE:HELMET_SNAKE:GUT +CREATURE:HELMET_SNAKE:STOMACH +CREATURE:HELMET_SNAKE:GIZZARD +CREATURE:HELMET_SNAKE:PANCREAS +CREATURE:HELMET_SNAKE:SPLEEN +CREATURE:HELMET_SNAKE:KIDNEY +CREATURE:GREEN_DEVOURER:MUSCLE +CREATURE:GREEN_DEVOURER:EYE +CREATURE:GREEN_DEVOURER:BRAIN +CREATURE:GREEN_DEVOURER:LUNG +CREATURE:GREEN_DEVOURER:HEART +CREATURE:GREEN_DEVOURER:LIVER +CREATURE:GREEN_DEVOURER:GUT +CREATURE:GREEN_DEVOURER:STOMACH +CREATURE:GREEN_DEVOURER:GIZZARD + CREATURE:GREEN_DEVOURER:PANCREAS +CREATURE:GREEN_DEVOURER:SPLEEN +CREATURE:GREEN_DEVOURER:KIDNEY +CREATURE:RUTHERER:MUSCLE +CREATURE:RUTHERER:EYE +CREATURE:RUTHERER:BRAIN +CREATURE:RUTHERER:LUNG +CREATURE:RUTHERER:HEART +CREATURE:RUTHERER:LIVER +CREATURE:RUTHERER:GUT +CREATURE:RUTHERER:STOMACH +CREATURE:RUTHERER:GIZZARD +CREATURE:RUTHERER:PANCREAS +CREATURE:RUTHERER:SPLEEN +CREATURE:RUTHERER:KIDNEY +CREATURE:CREEPY_CRAWLER:MUSCLE +CREATURE:CREEPY_CRAWLER:EYE +CREATURE:CREEPY_CRAWLER:BRAIN +CREATURE:CREEPY_CRAWLER:LUNG +CREATURE:CREEPY_CRAWLER:HEART +CREATURE:CREEPY_CRAWLER:LIVER +CREATURE:CREEPY_CRAWLER:GUT +CREATURE:CREEPY_CRAWLER:STOMACH +CREATURE:CREEPY_CRAWLER:GIZZARD + CREATURE:CREEPY_CRAWLER:PANCREAS +CREATURE:CREEPY_CRAWLER:SPLEEN +CREATURE:CREEPY_CRAWLER:KIDNEY +CREATURE:DRALTHA:MUSCLE +CREATURE:DRALTHA:EYE +CREATURE:DRALTHA:BRAIN +CREATURE:DRALTHA:LUNG +CREATURE:DRALTHA:HEART +CREATURE:DRALTHA:LIVER +CREATURE:DRALTHA:GUT +CREATURE:DRALTHA:STOMACH +CREATURE:DRALTHA:GIZZARD +CREATURE:DRALTHA:PANCREAS +CREATURE:DRALTHA:SPLEEN +CREATURE:DRALTHA:KIDNEY +CREATURE:GIANT_EARTHWORM:MUSCLE +CREATURE:GIANT_EARTHWORM:EYE +CREATURE:GIANT_EARTHWORM:BRAIN +CREATURE:GIANT_EARTHWORM:LUNG +CREATURE:GIANT_EARTHWORM:HEART +CREATURE:GIANT_EARTHWORM:LIVER +CREATURE:GIANT_EARTHWORM:GUT + CREATURE:GIANT_EARTHWORM:STOMACH + CREATURE:GIANT_EARTHWORM:GIZZARD +!CREATURE:GIANT_EARTHWORM:PANCREAS +CREATURE:GIANT_EARTHWORM:SPLEEN +CREATURE:GIANT_EARTHWORM:KIDNEY +CREATURE:BUGBAT:MUSCLE +CREATURE:BUGBAT:EYE +CREATURE:BUGBAT:BRAIN +CREATURE:BUGBAT:LUNG +CREATURE:BUGBAT:HEART +CREATURE:BUGBAT:LIVER +CREATURE:BUGBAT:GUT +CREATURE:BUGBAT:STOMACH +CREATURE:BUGBAT:GIZZARD +CREATURE:BUGBAT:PANCREAS +CREATURE:BUGBAT:SPLEEN +CREATURE:BUGBAT:KIDNEY +CREATURE:MANERA:MUSCLE +CREATURE:MANERA:EYE +CREATURE:MANERA:BRAIN +CREATURE:MANERA:LUNG +CREATURE:MANERA:HEART +CREATURE:MANERA:LIVER +CREATURE:MANERA:GUT +CREATURE:MANERA:STOMACH +CREATURE:MANERA:GIZZARD +CREATURE:MANERA:PANCREAS +CREATURE:MANERA:SPLEEN +CREATURE:MANERA:KIDNEY +CREATURE:MOLEMARIAN:MUSCLE +CREATURE:MOLEMARIAN:EYE +CREATURE:MOLEMARIAN:BRAIN +CREATURE:MOLEMARIAN:LUNG +CREATURE:MOLEMARIAN:HEART +CREATURE:MOLEMARIAN:LIVER +CREATURE:MOLEMARIAN:GUT +CREATURE:MOLEMARIAN:STOMACH +CREATURE:MOLEMARIAN:GIZZARD +CREATURE:MOLEMARIAN:PANCREAS +CREATURE:MOLEMARIAN:SPLEEN +CREATURE:MOLEMARIAN:KIDNEY +CREATURE:JABBERER:MUSCLE +CREATURE:JABBERER:EYE +CREATURE:JABBERER:BRAIN +CREATURE:JABBERER:LUNG +CREATURE:JABBERER:HEART +CREATURE:JABBERER:LIVER +CREATURE:JABBERER:GUT +CREATURE:JABBERER:STOMACH +CREATURE:JABBERER:GIZZARD +CREATURE:JABBERER:PANCREAS +CREATURE:JABBERER:SPLEEN +CREATURE:JABBERER:KIDNEY +CREATURE:POND_GRABBER:MUSCLE +CREATURE:POND_GRABBER:EYE +CREATURE:POND_GRABBER:BRAIN +CREATURE:POND_GRABBER:LUNG +CREATURE:POND_GRABBER:HEART +CREATURE:POND_GRABBER:LIVER +CREATURE:POND_GRABBER:GUT +CREATURE:POND_GRABBER:STOMACH +CREATURE:POND_GRABBER:GIZZARD +CREATURE:POND_GRABBER:PANCREAS +CREATURE:POND_GRABBER:SPLEEN +CREATURE:POND_GRABBER:KIDNEY +CREATURE:BLIND_CAVE_BEAR:MUSCLE +CREATURE:BLIND_CAVE_BEAR:EYE +CREATURE:BLIND_CAVE_BEAR:BRAIN +CREATURE:BLIND_CAVE_BEAR:LUNG +CREATURE:BLIND_CAVE_BEAR:HEART +CREATURE:BLIND_CAVE_BEAR:LIVER +CREATURE:BLIND_CAVE_BEAR:GUT + CREATURE:BLIND_CAVE_BEAR:STOMACH + CREATURE:BLIND_CAVE_BEAR:GIZZARD +!CREATURE:BLIND_CAVE_BEAR:PANCREAS +CREATURE:BLIND_CAVE_BEAR:SPLEEN +CREATURE:BLIND_CAVE_BEAR:KIDNEY +CREATURE:CAVE_DRAGON:MUSCLE +CREATURE:CAVE_DRAGON:EYE +CREATURE:CAVE_DRAGON:BRAIN +CREATURE:CAVE_DRAGON:LUNG +CREATURE:CAVE_DRAGON:HEART +CREATURE:CAVE_DRAGON:LIVER +CREATURE:CAVE_DRAGON:GUT +CREATURE:CAVE_DRAGON:STOMACH +CREATURE:CAVE_DRAGON:GIZZARD +CREATURE:CAVE_DRAGON:PANCREAS +CREATURE:CAVE_DRAGON:SPLEEN +CREATURE:CAVE_DRAGON:KIDNEY +CREATURE:REACHER:MUSCLE +CREATURE:REACHER:EYE +CREATURE:REACHER:BRAIN +CREATURE:REACHER:LUNG +CREATURE:REACHER:HEART +CREATURE:REACHER:LIVER +CREATURE:REACHER:GUT +CREATURE:REACHER:STOMACH +CREATURE:REACHER:GIZZARD +CREATURE:REACHER:PANCREAS +CREATURE:REACHER:SPLEEN +CREATURE:REACHER:KIDNEY +CREATURE:GORLAK:MUSCLE +CREATURE:GORLAK:EYE +CREATURE:GORLAK:BRAIN +CREATURE:GORLAK:LUNG +CREATURE:GORLAK:HEART +CREATURE:GORLAK:LIVER +CREATURE:GORLAK:GUT +CREATURE:GORLAK:STOMACH +CREATURE:GORLAK:GIZZARD +CREATURE:GORLAK:PANCREAS +CREATURE:GORLAK:SPLEEN +CREATURE:GORLAK:KIDNEY +CREATURE:OCTOPUS:MUSCLE +CREATURE:OCTOPUS:EYE +CREATURE:OCTOPUS:BRAIN +CREATURE:OCTOPUS:LUNG +CREATURE:OCTOPUS:HEART +CREATURE:OCTOPUS:LIVER +CREATURE:OCTOPUS:GUT +CREATURE:OCTOPUS:STOMACH +CREATURE:OCTOPUS:GIZZARD +CREATURE:OCTOPUS:PANCREAS +CREATURE:OCTOPUS:SPLEEN +CREATURE:OCTOPUS:KIDNEY +CREATURE:OCTOPUS_MAN:MUSCLE +CREATURE:OCTOPUS_MAN:EYE +CREATURE:OCTOPUS_MAN:BRAIN +CREATURE:OCTOPUS_MAN:LUNG +CREATURE:OCTOPUS_MAN:HEART +CREATURE:OCTOPUS_MAN:LIVER +CREATURE:OCTOPUS_MAN:GUT +CREATURE:OCTOPUS_MAN:STOMACH +CREATURE:OCTOPUS_MAN:GIZZARD +CREATURE:OCTOPUS_MAN:PANCREAS +CREATURE:OCTOPUS_MAN:SPLEEN +CREATURE:OCTOPUS_MAN:KIDNEY +CREATURE:GIANT_OCTOPUS:MUSCLE +CREATURE:GIANT_OCTOPUS:EYE +CREATURE:GIANT_OCTOPUS:BRAIN +CREATURE:GIANT_OCTOPUS:LUNG +CREATURE:GIANT_OCTOPUS:HEART +CREATURE:GIANT_OCTOPUS:LIVER +CREATURE:GIANT_OCTOPUS:GUT +CREATURE:GIANT_OCTOPUS:STOMACH +CREATURE:GIANT_OCTOPUS:GIZZARD +CREATURE:GIANT_OCTOPUS:PANCREAS +CREATURE:GIANT_OCTOPUS:SPLEEN +CREATURE:GIANT_OCTOPUS:KIDNEY +CREATURE:CRAB:MUSCLE +CREATURE:CRAB:EYE +CREATURE:CRAB:BRAIN +CREATURE:CRAB:LUNG +CREATURE:CRAB:HEART +CREATURE:CRAB:LIVER +CREATURE:CRAB:GUT +CREATURE:CRAB:STOMACH +CREATURE:CRAB:GIZZARD +CREATURE:CRAB:PANCREAS +CREATURE:CRAB:SPLEEN +CREATURE:CRAB:KIDNEY +CREATURE:CRAB_MAN:MUSCLE +CREATURE:CRAB_MAN:EYE +CREATURE:CRAB_MAN:BRAIN +CREATURE:CRAB_MAN:LUNG +CREATURE:CRAB_MAN:HEART +CREATURE:CRAB_MAN:LIVER +CREATURE:CRAB_MAN:GUT +CREATURE:CRAB_MAN:STOMACH +CREATURE:CRAB_MAN:GIZZARD +CREATURE:CRAB_MAN:PANCREAS +CREATURE:CRAB_MAN:SPLEEN +CREATURE:CRAB_MAN:KIDNEY +CREATURE:GIANT_CRAB:MUSCLE +CREATURE:GIANT_CRAB:EYE +CREATURE:GIANT_CRAB:BRAIN +CREATURE:GIANT_CRAB:LUNG +CREATURE:GIANT_CRAB:HEART +CREATURE:GIANT_CRAB:LIVER +CREATURE:GIANT_CRAB:GUT +CREATURE:GIANT_CRAB:STOMACH +CREATURE:GIANT_CRAB:GIZZARD +CREATURE:GIANT_CRAB:PANCREAS +CREATURE:GIANT_CRAB:SPLEEN +CREATURE:GIANT_CRAB:KIDNEY +CREATURE:LEOPARD_SEAL:MUSCLE +CREATURE:LEOPARD_SEAL:EYE +CREATURE:LEOPARD_SEAL:BRAIN +CREATURE:LEOPARD_SEAL:LUNG +CREATURE:LEOPARD_SEAL:HEART +CREATURE:LEOPARD_SEAL:LIVER +CREATURE:LEOPARD_SEAL:GUT +CREATURE:LEOPARD_SEAL:STOMACH +CREATURE:LEOPARD_SEAL:GIZZARD +CREATURE:LEOPARD_SEAL:PANCREAS +CREATURE:LEOPARD_SEAL:SPLEEN +CREATURE:LEOPARD_SEAL:KIDNEY + CREATURE:LEOPARD_SEAL_MAN:MUSCLE +CREATURE:LEOPARD_SEAL_MAN:EYE +CREATURE:LEOPARD_SEAL_MAN:BRAIN +CREATURE:LEOPARD_SEAL_MAN:LUNG +CREATURE:LEOPARD_SEAL_MAN:HEART +CREATURE:LEOPARD_SEAL_MAN:LIVER +CREATURE:LEOPARD_SEAL_MAN:GUT +!CREATURE:LEOPARD_SEAL_MAN:STOMACH +!CREATURE:LEOPARD_SEAL_MAN:GIZZARD +"CREATURE:LEOPARD_SEAL_MAN:PANCREAS + CREATURE:LEOPARD_SEAL_MAN:SPLEEN + CREATURE:LEOPARD_SEAL_MAN:KIDNEY +"CREATURE:GIANT_LEOPARD_SEAL:MUSCLE +CREATURE:GIANT_LEOPARD_SEAL:EYE +!CREATURE:GIANT_LEOPARD_SEAL:BRAIN + CREATURE:GIANT_LEOPARD_SEAL:LUNG +!CREATURE:GIANT_LEOPARD_SEAL:HEART +!CREATURE:GIANT_LEOPARD_SEAL:LIVER +CREATURE:GIANT_LEOPARD_SEAL:GUT +#CREATURE:GIANT_LEOPARD_SEAL:STOMACH +#CREATURE:GIANT_LEOPARD_SEAL:GIZZARD +$CREATURE:GIANT_LEOPARD_SEAL:PANCREAS +"CREATURE:GIANT_LEOPARD_SEAL:SPLEEN +"CREATURE:GIANT_LEOPARD_SEAL:KIDNEY +CREATURE:CUTTLEFISH:MUSCLE +CREATURE:CUTTLEFISH:EYE +CREATURE:CUTTLEFISH:BRAIN +CREATURE:CUTTLEFISH:LUNG +CREATURE:CUTTLEFISH:HEART +CREATURE:CUTTLEFISH:LIVER +CREATURE:CUTTLEFISH:GUT +CREATURE:CUTTLEFISH:STOMACH +CREATURE:CUTTLEFISH:GIZZARD +CREATURE:CUTTLEFISH:PANCREAS +CREATURE:CUTTLEFISH:SPLEEN +CREATURE:CUTTLEFISH:KIDNEY +CREATURE:CUTTLEFISH_MAN:MUSCLE +CREATURE:CUTTLEFISH_MAN:EYE +CREATURE:CUTTLEFISH_MAN:BRAIN +CREATURE:CUTTLEFISH_MAN:LUNG +CREATURE:CUTTLEFISH_MAN:HEART +CREATURE:CUTTLEFISH_MAN:LIVER +CREATURE:CUTTLEFISH_MAN:GUT +CREATURE:CUTTLEFISH_MAN:STOMACH +CREATURE:CUTTLEFISH_MAN:GIZZARD + CREATURE:CUTTLEFISH_MAN:PANCREAS +CREATURE:CUTTLEFISH_MAN:SPLEEN +CREATURE:CUTTLEFISH_MAN:KIDNEY + CREATURE:GIANT_CUTTLEFISH:MUSCLE +CREATURE:GIANT_CUTTLEFISH:EYE +CREATURE:GIANT_CUTTLEFISH:BRAIN +CREATURE:GIANT_CUTTLEFISH:LUNG +CREATURE:GIANT_CUTTLEFISH:HEART +CREATURE:GIANT_CUTTLEFISH:LIVER +CREATURE:GIANT_CUTTLEFISH:GUT +!CREATURE:GIANT_CUTTLEFISH:STOMACH +!CREATURE:GIANT_CUTTLEFISH:GIZZARD +"CREATURE:GIANT_CUTTLEFISH:PANCREAS + CREATURE:GIANT_CUTTLEFISH:SPLEEN + CREATURE:GIANT_CUTTLEFISH:KIDNEY +CREATURE:ORCA:MUSCLE +CREATURE:ORCA:EYE +CREATURE:ORCA:BRAIN +CREATURE:ORCA:LUNG +CREATURE:ORCA:HEART +CREATURE:ORCA:LIVER +CREATURE:ORCA:GUT +CREATURE:ORCA:STOMACH +CREATURE:ORCA:GIZZARD +CREATURE:ORCA:PANCREAS +CREATURE:ORCA:SPLEEN +CREATURE:ORCA:KIDNEY +CREATURE:ORCA_MAN:MUSCLE +CREATURE:ORCA_MAN:EYE +CREATURE:ORCA_MAN:BRAIN +CREATURE:ORCA_MAN:LUNG +CREATURE:ORCA_MAN:HEART +CREATURE:ORCA_MAN:LIVER +CREATURE:ORCA_MAN:GUT +CREATURE:ORCA_MAN:STOMACH +CREATURE:ORCA_MAN:GIZZARD +CREATURE:ORCA_MAN:PANCREAS +CREATURE:ORCA_MAN:SPLEEN +CREATURE:ORCA_MAN:KIDNEY +CREATURE:GIANT_ORCA:MUSCLE +CREATURE:GIANT_ORCA:EYE +CREATURE:GIANT_ORCA:BRAIN +CREATURE:GIANT_ORCA:LUNG +CREATURE:GIANT_ORCA:HEART +CREATURE:GIANT_ORCA:LIVER +CREATURE:GIANT_ORCA:GUT +CREATURE:GIANT_ORCA:STOMACH +CREATURE:GIANT_ORCA:GIZZARD +CREATURE:GIANT_ORCA:PANCREAS +CREATURE:GIANT_ORCA:SPLEEN +CREATURE:GIANT_ORCA:KIDNEY +CREATURE:HORSESHOE_CRAB:MUSCLE +CREATURE:HORSESHOE_CRAB:EYE +CREATURE:HORSESHOE_CRAB:BRAIN +CREATURE:HORSESHOE_CRAB:LUNG +CREATURE:HORSESHOE_CRAB:HEART +CREATURE:HORSESHOE_CRAB:LIVER +CREATURE:HORSESHOE_CRAB:GUT +CREATURE:HORSESHOE_CRAB:STOMACH +CREATURE:HORSESHOE_CRAB:GIZZARD + CREATURE:HORSESHOE_CRAB:PANCREAS +CREATURE:HORSESHOE_CRAB:SPLEEN +CREATURE:HORSESHOE_CRAB:KIDNEY +"CREATURE:HORSESHOE_CRAB_MAN:MUSCLE +CREATURE:HORSESHOE_CRAB_MAN:EYE +!CREATURE:HORSESHOE_CRAB_MAN:BRAIN + CREATURE:HORSESHOE_CRAB_MAN:LUNG +!CREATURE:HORSESHOE_CRAB_MAN:HEART +!CREATURE:HORSESHOE_CRAB_MAN:LIVER +CREATURE:HORSESHOE_CRAB_MAN:GUT +#CREATURE:HORSESHOE_CRAB_MAN:STOMACH +#CREATURE:HORSESHOE_CRAB_MAN:GIZZARD +$CREATURE:HORSESHOE_CRAB_MAN:PANCREAS +"CREATURE:HORSESHOE_CRAB_MAN:SPLEEN +"CREATURE:HORSESHOE_CRAB_MAN:KIDNEY +$CREATURE:GIANT_HORSESHOE_CRAB:MUSCLE +!CREATURE:GIANT_HORSESHOE_CRAB:EYE +#CREATURE:GIANT_HORSESHOE_CRAB:BRAIN +"CREATURE:GIANT_HORSESHOE_CRAB:LUNG +#CREATURE:GIANT_HORSESHOE_CRAB:HEART +#CREATURE:GIANT_HORSESHOE_CRAB:LIVER +!CREATURE:GIANT_HORSESHOE_CRAB:GUT +%CREATURE:GIANT_HORSESHOE_CRAB:STOMACH +%CREATURE:GIANT_HORSESHOE_CRAB:GIZZARD +&CREATURE:GIANT_HORSESHOE_CRAB:PANCREAS +$CREATURE:GIANT_HORSESHOE_CRAB:SPLEEN +$CREATURE:GIANT_HORSESHOE_CRAB:KIDNEY +CREATURE:SPERM_WHALE:MUSCLE +CREATURE:SPERM_WHALE:EYE +CREATURE:SPERM_WHALE:BRAIN +CREATURE:SPERM_WHALE:LUNG +CREATURE:SPERM_WHALE:HEART +CREATURE:SPERM_WHALE:LIVER +CREATURE:SPERM_WHALE:GUT +CREATURE:SPERM_WHALE:STOMACH +CREATURE:SPERM_WHALE:GIZZARD +CREATURE:SPERM_WHALE:PANCREAS +CREATURE:SPERM_WHALE:SPLEEN +CREATURE:SPERM_WHALE:KIDNEY +CREATURE:SPERM_WHALE_MAN:MUSCLE +CREATURE:SPERM_WHALE_MAN:EYE +CREATURE:SPERM_WHALE_MAN:BRAIN +CREATURE:SPERM_WHALE_MAN:LUNG +CREATURE:SPERM_WHALE_MAN:HEART +CREATURE:SPERM_WHALE_MAN:LIVER +CREATURE:SPERM_WHALE_MAN:GUT + CREATURE:SPERM_WHALE_MAN:STOMACH + CREATURE:SPERM_WHALE_MAN:GIZZARD +!CREATURE:SPERM_WHALE_MAN:PANCREAS +CREATURE:SPERM_WHALE_MAN:SPLEEN +CREATURE:SPERM_WHALE_MAN:KIDNEY +!CREATURE:GIANT_SPERM_WHALE:MUSCLE +CREATURE:GIANT_SPERM_WHALE:EYE + CREATURE:GIANT_SPERM_WHALE:BRAIN +CREATURE:GIANT_SPERM_WHALE:LUNG + CREATURE:GIANT_SPERM_WHALE:HEART + CREATURE:GIANT_SPERM_WHALE:LIVER +CREATURE:GIANT_SPERM_WHALE:GUT +"CREATURE:GIANT_SPERM_WHALE:STOMACH +"CREATURE:GIANT_SPERM_WHALE:GIZZARD +#CREATURE:GIANT_SPERM_WHALE:PANCREAS +!CREATURE:GIANT_SPERM_WHALE:SPLEEN +!CREATURE:GIANT_SPERM_WHALE:KIDNEY +CREATURE:ELEPHANT_SEAL:MUSCLE +CREATURE:ELEPHANT_SEAL:EYE +CREATURE:ELEPHANT_SEAL:BRAIN +CREATURE:ELEPHANT_SEAL:LUNG +CREATURE:ELEPHANT_SEAL:HEART +CREATURE:ELEPHANT_SEAL:LIVER +CREATURE:ELEPHANT_SEAL:GUT +CREATURE:ELEPHANT_SEAL:STOMACH +CREATURE:ELEPHANT_SEAL:GIZZARD +CREATURE:ELEPHANT_SEAL:PANCREAS +CREATURE:ELEPHANT_SEAL:SPLEEN +CREATURE:ELEPHANT_SEAL:KIDNEY +!CREATURE:ELEPHANT_SEAL_MAN:MUSCLE +CREATURE:ELEPHANT_SEAL_MAN:EYE + CREATURE:ELEPHANT_SEAL_MAN:BRAIN +CREATURE:ELEPHANT_SEAL_MAN:LUNG + CREATURE:ELEPHANT_SEAL_MAN:HEART + CREATURE:ELEPHANT_SEAL_MAN:LIVER +CREATURE:ELEPHANT_SEAL_MAN:GUT +"CREATURE:ELEPHANT_SEAL_MAN:STOMACH +"CREATURE:ELEPHANT_SEAL_MAN:GIZZARD +#CREATURE:ELEPHANT_SEAL_MAN:PANCREAS +!CREATURE:ELEPHANT_SEAL_MAN:SPLEEN +!CREATURE:ELEPHANT_SEAL_MAN:KIDNEY +#CREATURE:GIANT_ELEPHANT_SEAL:MUSCLE + CREATURE:GIANT_ELEPHANT_SEAL:EYE +"CREATURE:GIANT_ELEPHANT_SEAL:BRAIN +!CREATURE:GIANT_ELEPHANT_SEAL:LUNG +"CREATURE:GIANT_ELEPHANT_SEAL:HEART +"CREATURE:GIANT_ELEPHANT_SEAL:LIVER + CREATURE:GIANT_ELEPHANT_SEAL:GUT +$CREATURE:GIANT_ELEPHANT_SEAL:STOMACH +$CREATURE:GIANT_ELEPHANT_SEAL:GIZZARD +%CREATURE:GIANT_ELEPHANT_SEAL:PANCREAS +#CREATURE:GIANT_ELEPHANT_SEAL:SPLEEN +#CREATURE:GIANT_ELEPHANT_SEAL:KIDNEY +CREATURE:HARP_SEAL:MUSCLE +CREATURE:HARP_SEAL:EYE +CREATURE:HARP_SEAL:BRAIN +CREATURE:HARP_SEAL:LUNG +CREATURE:HARP_SEAL:HEART +CREATURE:HARP_SEAL:LIVER +CREATURE:HARP_SEAL:GUT +CREATURE:HARP_SEAL:STOMACH +CREATURE:HARP_SEAL:GIZZARD +CREATURE:HARP_SEAL:PANCREAS +CREATURE:HARP_SEAL:SPLEEN +CREATURE:HARP_SEAL:KIDNEY +CREATURE:HARP_SEAL_MAN:MUSCLE +CREATURE:HARP_SEAL_MAN:EYE +CREATURE:HARP_SEAL_MAN:BRAIN +CREATURE:HARP_SEAL_MAN:LUNG +CREATURE:HARP_SEAL_MAN:HEART +CREATURE:HARP_SEAL_MAN:LIVER +CREATURE:HARP_SEAL_MAN:GUT +CREATURE:HARP_SEAL_MAN:STOMACH +CREATURE:HARP_SEAL_MAN:GIZZARD +CREATURE:HARP_SEAL_MAN:PANCREAS +CREATURE:HARP_SEAL_MAN:SPLEEN +CREATURE:HARP_SEAL_MAN:KIDNEY +CREATURE:GIANT_HARP_SEAL:MUSCLE +CREATURE:GIANT_HARP_SEAL:EYE +CREATURE:GIANT_HARP_SEAL:BRAIN +CREATURE:GIANT_HARP_SEAL:LUNG +CREATURE:GIANT_HARP_SEAL:HEART +CREATURE:GIANT_HARP_SEAL:LIVER +CREATURE:GIANT_HARP_SEAL:GUT + CREATURE:GIANT_HARP_SEAL:STOMACH + CREATURE:GIANT_HARP_SEAL:GIZZARD +!CREATURE:GIANT_HARP_SEAL:PANCREAS +CREATURE:GIANT_HARP_SEAL:SPLEEN +CREATURE:GIANT_HARP_SEAL:KIDNEY +CREATURE:NAUTILUS:MUSCLE +CREATURE:NAUTILUS:EYE +CREATURE:NAUTILUS:BRAIN +CREATURE:NAUTILUS:LUNG +CREATURE:NAUTILUS:HEART +CREATURE:NAUTILUS:LIVER +CREATURE:NAUTILUS:GUT +CREATURE:NAUTILUS:STOMACH +CREATURE:NAUTILUS:GIZZARD +CREATURE:NAUTILUS:PANCREAS +CREATURE:NAUTILUS:SPLEEN +CREATURE:NAUTILUS:KIDNEY +CREATURE:NAUTILUS_MAN:MUSCLE +CREATURE:NAUTILUS_MAN:EYE +CREATURE:NAUTILUS_MAN:BRAIN +CREATURE:NAUTILUS_MAN:LUNG +CREATURE:NAUTILUS_MAN:HEART +CREATURE:NAUTILUS_MAN:LIVER +CREATURE:NAUTILUS_MAN:GUT +CREATURE:NAUTILUS_MAN:STOMACH +CREATURE:NAUTILUS_MAN:GIZZARD +CREATURE:NAUTILUS_MAN:PANCREAS +CREATURE:NAUTILUS_MAN:SPLEEN +CREATURE:NAUTILUS_MAN:KIDNEY +CREATURE:GIANT_NAUTILUS:MUSCLE +CREATURE:GIANT_NAUTILUS:EYE +CREATURE:GIANT_NAUTILUS:BRAIN +CREATURE:GIANT_NAUTILUS:LUNG +CREATURE:GIANT_NAUTILUS:HEART +CREATURE:GIANT_NAUTILUS:LIVER +CREATURE:GIANT_NAUTILUS:GUT +CREATURE:GIANT_NAUTILUS:STOMACH +CREATURE:GIANT_NAUTILUS:GIZZARD + CREATURE:GIANT_NAUTILUS:PANCREAS +CREATURE:GIANT_NAUTILUS:SPLEEN +CREATURE:GIANT_NAUTILUS:KIDNEY +CREATURE:FOXSQUIRREL:MUSCLE +CREATURE:FOXSQUIRREL:EYE +CREATURE:FOXSQUIRREL:BRAIN +CREATURE:FOXSQUIRREL:LUNG +CREATURE:FOXSQUIRREL:HEART +CREATURE:FOXSQUIRREL:LIVER +CREATURE:FOXSQUIRREL:GUT +CREATURE:FOXSQUIRREL:STOMACH +CREATURE:FOXSQUIRREL:GIZZARD +CREATURE:FOXSQUIRREL:PANCREAS +CREATURE:FOXSQUIRREL:SPLEEN +CREATURE:FOXSQUIRREL:KIDNEY +CREATURE:MOGHOPPER:MUSCLE +CREATURE:MOGHOPPER:EYE +CREATURE:MOGHOPPER:BRAIN +CREATURE:MOGHOPPER:LUNG +CREATURE:MOGHOPPER:HEART +CREATURE:MOGHOPPER:LIVER +CREATURE:MOGHOPPER:GUT +CREATURE:MOGHOPPER:STOMACH +CREATURE:MOGHOPPER:GIZZARD +CREATURE:MOGHOPPER:PANCREAS +CREATURE:MOGHOPPER:SPLEEN +CREATURE:MOGHOPPER:KIDNEY +CREATURE:RAT_DEMON:MUSCLE +CREATURE:RAT_DEMON:EYE +CREATURE:RAT_DEMON:BRAIN +CREATURE:RAT_DEMON:LUNG +CREATURE:RAT_DEMON:HEART +CREATURE:RAT_DEMON:LIVER +CREATURE:RAT_DEMON:GUT +CREATURE:RAT_DEMON:STOMACH +CREATURE:RAT_DEMON:GIZZARD +CREATURE:RAT_DEMON:PANCREAS +CREATURE:RAT_DEMON:SPLEEN +CREATURE:RAT_DEMON:KIDNEY +CREATURE:WAMBLER_FLUFFY:EYE +'CREATURE:LIZARD_RHINO_TWO_LEGGED:MUSCLE +$CREATURE:LIZARD_RHINO_TWO_LEGGED:EYE +&CREATURE:LIZARD_RHINO_TWO_LEGGED:BRAIN +%CREATURE:LIZARD_RHINO_TWO_LEGGED:LUNG +&CREATURE:LIZARD_RHINO_TWO_LEGGED:HEART +&CREATURE:LIZARD_RHINO_TWO_LEGGED:LIVER +$CREATURE:LIZARD_RHINO_TWO_LEGGED:GUT +(CREATURE:LIZARD_RHINO_TWO_LEGGED:STOMACH +(CREATURE:LIZARD_RHINO_TWO_LEGGED:GIZZARD +)CREATURE:LIZARD_RHINO_TWO_LEGGED:PANCREAS +'CREATURE:LIZARD_RHINO_TWO_LEGGED:SPLEEN +'CREATURE:LIZARD_RHINO_TWO_LEGGED:KIDNEY +CREATURE:WORM_KNUCKLE:MUSCLE +CREATURE:WORM_KNUCKLE:EYE +CREATURE:WORM_KNUCKLE:BRAIN +CREATURE:WORM_KNUCKLE:LUNG +CREATURE:WORM_KNUCKLE:HEART +CREATURE:WORM_KNUCKLE:LIVER +CREATURE:WORM_KNUCKLE:GUT +CREATURE:WORM_KNUCKLE:STOMACH +CREATURE:WORM_KNUCKLE:GIZZARD +CREATURE:WORM_KNUCKLE:PANCREAS +CREATURE:WORM_KNUCKLE:SPLEEN +CREATURE:WORM_KNUCKLE:KIDNEY +CREATURE:SPIDER_PHANTOM:MUSCLE +CREATURE:SPIDER_PHANTOM:EYE +CREATURE:SPIDER_PHANTOM:BRAIN +CREATURE:SPIDER_PHANTOM:LUNG +CREATURE:SPIDER_PHANTOM:HEART +CREATURE:SPIDER_PHANTOM:LIVER +CREATURE:SPIDER_PHANTOM:GUT +CREATURE:SPIDER_PHANTOM:STOMACH +CREATURE:SPIDER_PHANTOM:GIZZARD + CREATURE:SPIDER_PHANTOM:PANCREAS +CREATURE:SPIDER_PHANTOM:SPLEEN +CREATURE:SPIDER_PHANTOM:KIDNEY +CREATURE:FLY_ACORN:MUSCLE +CREATURE:FLY_ACORN:EYE +CREATURE:FLY_ACORN:BRAIN +CREATURE:FLY_ACORN:LUNG +CREATURE:FLY_ACORN:HEART +CREATURE:FLY_ACORN:LIVER +CREATURE:FLY_ACORN:GUT +CREATURE:FLY_ACORN:STOMACH +CREATURE:FLY_ACORN:GIZZARD +CREATURE:FLY_ACORN:PANCREAS +CREATURE:FLY_ACORN:SPLEEN +CREATURE:FLY_ACORN:KIDNEY +CREATURE:GNAT_BLOOD:MUSCLE +CREATURE:GNAT_BLOOD:EYE +CREATURE:GNAT_BLOOD:BRAIN +CREATURE:GNAT_BLOOD:LUNG +CREATURE:GNAT_BLOOD:HEART +CREATURE:GNAT_BLOOD:LIVER +CREATURE:GNAT_BLOOD:GUT +CREATURE:GNAT_BLOOD:STOMACH +CREATURE:GNAT_BLOOD:GIZZARD +CREATURE:GNAT_BLOOD:PANCREAS +CREATURE:GNAT_BLOOD:SPLEEN +CREATURE:GNAT_BLOOD:KIDNEY +CREATURE:LIZARD:MUSCLE +CREATURE:LIZARD:EYE +CREATURE:LIZARD:BRAIN +CREATURE:LIZARD:LUNG +CREATURE:LIZARD:HEART +CREATURE:LIZARD:LIVER +CREATURE:LIZARD:GUT +CREATURE:LIZARD:STOMACH +CREATURE:LIZARD:GIZZARD +CREATURE:LIZARD:PANCREAS +CREATURE:LIZARD:SPLEEN +CREATURE:LIZARD:KIDNEY +CREATURE:LIZARD_MAN:MUSCLE +CREATURE:LIZARD_MAN:EYE +CREATURE:LIZARD_MAN:BRAIN +CREATURE:LIZARD_MAN:LUNG +CREATURE:LIZARD_MAN:HEART +CREATURE:LIZARD_MAN:LIVER +CREATURE:LIZARD_MAN:GUT +CREATURE:LIZARD_MAN:STOMACH +CREATURE:LIZARD_MAN:GIZZARD +CREATURE:LIZARD_MAN:PANCREAS +CREATURE:LIZARD_MAN:SPLEEN +CREATURE:LIZARD_MAN:KIDNEY +CREATURE:GIANT_LIZARD:MUSCLE +CREATURE:GIANT_LIZARD:EYE +CREATURE:GIANT_LIZARD:BRAIN +CREATURE:GIANT_LIZARD:LUNG +CREATURE:GIANT_LIZARD:HEART +CREATURE:GIANT_LIZARD:LIVER +CREATURE:GIANT_LIZARD:GUT +CREATURE:GIANT_LIZARD:STOMACH +CREATURE:GIANT_LIZARD:GIZZARD +CREATURE:GIANT_LIZARD:PANCREAS +CREATURE:GIANT_LIZARD:SPLEEN +CREATURE:GIANT_LIZARD:KIDNEY +CREATURE:SKINK:MUSCLE +CREATURE:SKINK:EYE +CREATURE:SKINK:BRAIN +CREATURE:SKINK:LUNG +CREATURE:SKINK:HEART +CREATURE:SKINK:LIVER +CREATURE:SKINK:GUT +CREATURE:SKINK:STOMACH +CREATURE:SKINK:GIZZARD +CREATURE:SKINK:PANCREAS +CREATURE:SKINK:SPLEEN +CREATURE:SKINK:KIDNEY +CREATURE:SKINK_MAN:MUSCLE +CREATURE:SKINK_MAN:EYE +CREATURE:SKINK_MAN:BRAIN +CREATURE:SKINK_MAN:LUNG +CREATURE:SKINK_MAN:HEART +CREATURE:SKINK_MAN:LIVER +CREATURE:SKINK_MAN:GUT +CREATURE:SKINK_MAN:STOMACH +CREATURE:SKINK_MAN:GIZZARD +CREATURE:SKINK_MAN:PANCREAS +CREATURE:SKINK_MAN:SPLEEN +CREATURE:SKINK_MAN:KIDNEY +CREATURE:GIANT_SKINK:MUSCLE +CREATURE:GIANT_SKINK:EYE +CREATURE:GIANT_SKINK:BRAIN +CREATURE:GIANT_SKINK:LUNG +CREATURE:GIANT_SKINK:HEART +CREATURE:GIANT_SKINK:LIVER +CREATURE:GIANT_SKINK:GUT +CREATURE:GIANT_SKINK:STOMACH +CREATURE:GIANT_SKINK:GIZZARD +CREATURE:GIANT_SKINK:PANCREAS +CREATURE:GIANT_SKINK:SPLEEN +CREATURE:GIANT_SKINK:KIDNEY +CREATURE:CHAMELEON:MUSCLE +CREATURE:CHAMELEON:EYE +CREATURE:CHAMELEON:BRAIN +CREATURE:CHAMELEON:LUNG +CREATURE:CHAMELEON:HEART +CREATURE:CHAMELEON:LIVER +CREATURE:CHAMELEON:GUT +CREATURE:CHAMELEON:STOMACH +CREATURE:CHAMELEON:GIZZARD +CREATURE:CHAMELEON:PANCREAS +CREATURE:CHAMELEON:SPLEEN +CREATURE:CHAMELEON:KIDNEY +CREATURE:CHAMELEON_MAN:MUSCLE +CREATURE:CHAMELEON_MAN:EYE +CREATURE:CHAMELEON_MAN:BRAIN +CREATURE:CHAMELEON_MAN:LUNG +CREATURE:CHAMELEON_MAN:HEART +CREATURE:CHAMELEON_MAN:LIVER +CREATURE:CHAMELEON_MAN:GUT +CREATURE:CHAMELEON_MAN:STOMACH +CREATURE:CHAMELEON_MAN:GIZZARD +CREATURE:CHAMELEON_MAN:PANCREAS +CREATURE:CHAMELEON_MAN:SPLEEN +CREATURE:CHAMELEON_MAN:KIDNEY +CREATURE:GIANT_CHAMELEON:MUSCLE +CREATURE:GIANT_CHAMELEON:EYE +CREATURE:GIANT_CHAMELEON:BRAIN +CREATURE:GIANT_CHAMELEON:LUNG +CREATURE:GIANT_CHAMELEON:HEART +CREATURE:GIANT_CHAMELEON:LIVER +CREATURE:GIANT_CHAMELEON:GUT + CREATURE:GIANT_CHAMELEON:STOMACH + CREATURE:GIANT_CHAMELEON:GIZZARD +!CREATURE:GIANT_CHAMELEON:PANCREAS +CREATURE:GIANT_CHAMELEON:SPLEEN +CREATURE:GIANT_CHAMELEON:KIDNEY +CREATURE:ANOLE:MUSCLE +CREATURE:ANOLE:EYE +CREATURE:ANOLE:BRAIN +CREATURE:ANOLE:LUNG +CREATURE:ANOLE:HEART +CREATURE:ANOLE:LIVER +CREATURE:ANOLE:GUT +CREATURE:ANOLE:STOMACH +CREATURE:ANOLE:GIZZARD +CREATURE:ANOLE:PANCREAS +CREATURE:ANOLE:SPLEEN +CREATURE:ANOLE:KIDNEY +CREATURE:ANOLE_MAN:MUSCLE +CREATURE:ANOLE_MAN:EYE +CREATURE:ANOLE_MAN:BRAIN +CREATURE:ANOLE_MAN:LUNG +CREATURE:ANOLE_MAN:HEART +CREATURE:ANOLE_MAN:LIVER +CREATURE:ANOLE_MAN:GUT +CREATURE:ANOLE_MAN:STOMACH +CREATURE:ANOLE_MAN:GIZZARD +CREATURE:ANOLE_MAN:PANCREAS +CREATURE:ANOLE_MAN:SPLEEN +CREATURE:ANOLE_MAN:KIDNEY +CREATURE:GIANT_ANOLE:MUSCLE +CREATURE:GIANT_ANOLE:EYE +CREATURE:GIANT_ANOLE:BRAIN +CREATURE:GIANT_ANOLE:LUNG +CREATURE:GIANT_ANOLE:HEART +CREATURE:GIANT_ANOLE:LIVER +CREATURE:GIANT_ANOLE:GUT +CREATURE:GIANT_ANOLE:STOMACH +CREATURE:GIANT_ANOLE:GIZZARD +CREATURE:GIANT_ANOLE:PANCREAS +CREATURE:GIANT_ANOLE:SPLEEN +CREATURE:GIANT_ANOLE:KIDNEY +CREATURE:IGUANA:MUSCLE +CREATURE:IGUANA:EYE +CREATURE:IGUANA:BRAIN +CREATURE:IGUANA:LUNG +CREATURE:IGUANA:HEART +CREATURE:IGUANA:LIVER +CREATURE:IGUANA:GUT +CREATURE:IGUANA:STOMACH +CREATURE:IGUANA:GIZZARD +CREATURE:IGUANA:PANCREAS +CREATURE:IGUANA:SPLEEN +CREATURE:IGUANA:KIDNEY +CREATURE:IGUANA_MAN:MUSCLE +CREATURE:IGUANA_MAN:EYE +CREATURE:IGUANA_MAN:BRAIN +CREATURE:IGUANA_MAN:LUNG +CREATURE:IGUANA_MAN:HEART +CREATURE:IGUANA_MAN:LIVER +CREATURE:IGUANA_MAN:GUT +CREATURE:IGUANA_MAN:STOMACH +CREATURE:IGUANA_MAN:GIZZARD +CREATURE:IGUANA_MAN:PANCREAS +CREATURE:IGUANA_MAN:SPLEEN +CREATURE:IGUANA_MAN:KIDNEY +CREATURE:GIANT_IGUANA:MUSCLE +CREATURE:GIANT_IGUANA:EYE +CREATURE:GIANT_IGUANA:BRAIN +CREATURE:GIANT_IGUANA:LUNG +CREATURE:GIANT_IGUANA:HEART +CREATURE:GIANT_IGUANA:LIVER +CREATURE:GIANT_IGUANA:GUT +CREATURE:GIANT_IGUANA:STOMACH +CREATURE:GIANT_IGUANA:GIZZARD +CREATURE:GIANT_IGUANA:PANCREAS +CREATURE:GIANT_IGUANA:SPLEEN +CREATURE:GIANT_IGUANA:KIDNEY +CREATURE:RIVER OTTER:MUSCLE +CREATURE:RIVER OTTER:EYE +CREATURE:RIVER OTTER:BRAIN +CREATURE:RIVER OTTER:LUNG +CREATURE:RIVER OTTER:HEART +CREATURE:RIVER OTTER:LIVER +CREATURE:RIVER OTTER:GUT +CREATURE:RIVER OTTER:STOMACH +CREATURE:RIVER OTTER:GIZZARD +CREATURE:RIVER OTTER:PANCREAS +CREATURE:RIVER OTTER:SPLEEN +CREATURE:RIVER OTTER:KIDNEY +CREATURE:SEA OTTER:MUSCLE +CREATURE:SEA OTTER:EYE +CREATURE:SEA OTTER:BRAIN +CREATURE:SEA OTTER:LUNG +CREATURE:SEA OTTER:HEART +CREATURE:SEA OTTER:LIVER +CREATURE:SEA OTTER:GUT +CREATURE:SEA OTTER:STOMACH +CREATURE:SEA OTTER:GIZZARD +CREATURE:SEA OTTER:PANCREAS +CREATURE:SEA OTTER:SPLEEN +CREATURE:SEA OTTER:KIDNEY +CREATURE:OTTER_MAN:MUSCLE +CREATURE:OTTER_MAN:EYE +CREATURE:OTTER_MAN:BRAIN +CREATURE:OTTER_MAN:LUNG +CREATURE:OTTER_MAN:HEART +CREATURE:OTTER_MAN:LIVER +CREATURE:OTTER_MAN:GUT +CREATURE:OTTER_MAN:STOMACH +CREATURE:OTTER_MAN:GIZZARD +CREATURE:OTTER_MAN:PANCREAS +CREATURE:OTTER_MAN:SPLEEN +CREATURE:OTTER_MAN:KIDNEY +CREATURE:GIANT_OTTER:MUSCLE +CREATURE:GIANT_OTTER:EYE +CREATURE:GIANT_OTTER:BRAIN +CREATURE:GIANT_OTTER:LUNG +CREATURE:GIANT_OTTER:HEART +CREATURE:GIANT_OTTER:LIVER +CREATURE:GIANT_OTTER:GUT +CREATURE:GIANT_OTTER:STOMACH +CREATURE:GIANT_OTTER:GIZZARD +CREATURE:GIANT_OTTER:PANCREAS +CREATURE:GIANT_OTTER:SPLEEN +CREATURE:GIANT_OTTER:KIDNEY +CREATURE:SNAPPING TURTLE:MUSCLE +CREATURE:SNAPPING TURTLE:EYE +CREATURE:SNAPPING TURTLE:BRAIN +CREATURE:SNAPPING TURTLE:LUNG +CREATURE:SNAPPING TURTLE:HEART +CREATURE:SNAPPING TURTLE:LIVER +CREATURE:SNAPPING TURTLE:GUT + CREATURE:SNAPPING TURTLE:STOMACH + CREATURE:SNAPPING TURTLE:GIZZARD +!CREATURE:SNAPPING TURTLE:PANCREAS +CREATURE:SNAPPING TURTLE:SPLEEN +CREATURE:SNAPPING TURTLE:KIDNEY +)CREATURE:ALLIGATOR SNAPPING TURTLE:MUSCLE +&CREATURE:ALLIGATOR SNAPPING TURTLE:EYE +(CREATURE:ALLIGATOR SNAPPING TURTLE:BRAIN +'CREATURE:ALLIGATOR SNAPPING TURTLE:LUNG +(CREATURE:ALLIGATOR SNAPPING TURTLE:HEART +(CREATURE:ALLIGATOR SNAPPING TURTLE:LIVER +&CREATURE:ALLIGATOR SNAPPING TURTLE:GUT +*CREATURE:ALLIGATOR SNAPPING TURTLE:STOMACH +*CREATURE:ALLIGATOR SNAPPING TURTLE:GIZZARD ++CREATURE:ALLIGATOR SNAPPING TURTLE:PANCREAS +)CREATURE:ALLIGATOR SNAPPING TURTLE:SPLEEN +)CREATURE:ALLIGATOR SNAPPING TURTLE:KIDNEY +#CREATURE:SNAPPING_TURTLE_MAN:MUSCLE + CREATURE:SNAPPING_TURTLE_MAN:EYE +"CREATURE:SNAPPING_TURTLE_MAN:BRAIN +!CREATURE:SNAPPING_TURTLE_MAN:LUNG +"CREATURE:SNAPPING_TURTLE_MAN:HEART +"CREATURE:SNAPPING_TURTLE_MAN:LIVER + CREATURE:SNAPPING_TURTLE_MAN:GUT +$CREATURE:SNAPPING_TURTLE_MAN:STOMACH +$CREATURE:SNAPPING_TURTLE_MAN:GIZZARD +%CREATURE:SNAPPING_TURTLE_MAN:PANCREAS +#CREATURE:SNAPPING_TURTLE_MAN:SPLEEN +#CREATURE:SNAPPING_TURTLE_MAN:KIDNEY +%CREATURE:GIANT_SNAPPING_TURTLE:MUSCLE +"CREATURE:GIANT_SNAPPING_TURTLE:EYE +$CREATURE:GIANT_SNAPPING_TURTLE:BRAIN +#CREATURE:GIANT_SNAPPING_TURTLE:LUNG +$CREATURE:GIANT_SNAPPING_TURTLE:HEART +$CREATURE:GIANT_SNAPPING_TURTLE:LIVER +"CREATURE:GIANT_SNAPPING_TURTLE:GUT +&CREATURE:GIANT_SNAPPING_TURTLE:STOMACH +&CREATURE:GIANT_SNAPPING_TURTLE:GIZZARD +'CREATURE:GIANT_SNAPPING_TURTLE:PANCREAS +%CREATURE:GIANT_SNAPPING_TURTLE:SPLEEN +%CREATURE:GIANT_SNAPPING_TURTLE:KIDNEY +CREATURE:BEAVER:MUSCLE +CREATURE:BEAVER:EYE +CREATURE:BEAVER:BRAIN +CREATURE:BEAVER:LUNG +CREATURE:BEAVER:HEART +CREATURE:BEAVER:LIVER +CREATURE:BEAVER:GUT +CREATURE:BEAVER:STOMACH +CREATURE:BEAVER:GIZZARD +CREATURE:BEAVER:PANCREAS +CREATURE:BEAVER:SPLEEN +CREATURE:BEAVER:KIDNEY +CREATURE:BEAVER_MAN:MUSCLE +CREATURE:BEAVER_MAN:EYE +CREATURE:BEAVER_MAN:BRAIN +CREATURE:BEAVER_MAN:LUNG +CREATURE:BEAVER_MAN:HEART +CREATURE:BEAVER_MAN:LIVER +CREATURE:BEAVER_MAN:GUT +CREATURE:BEAVER_MAN:STOMACH +CREATURE:BEAVER_MAN:GIZZARD +CREATURE:BEAVER_MAN:PANCREAS +CREATURE:BEAVER_MAN:SPLEEN +CREATURE:BEAVER_MAN:KIDNEY +CREATURE:GIANT_BEAVER:MUSCLE +CREATURE:GIANT_BEAVER:EYE +CREATURE:GIANT_BEAVER:BRAIN +CREATURE:GIANT_BEAVER:LUNG +CREATURE:GIANT_BEAVER:HEART +CREATURE:GIANT_BEAVER:LIVER +CREATURE:GIANT_BEAVER:GUT +CREATURE:GIANT_BEAVER:STOMACH +CREATURE:GIANT_BEAVER:GIZZARD +CREATURE:GIANT_BEAVER:PANCREAS +CREATURE:GIANT_BEAVER:SPLEEN +CREATURE:GIANT_BEAVER:KIDNEY +CREATURE:LEECH:MUSCLE +CREATURE:LEECH:EYE +CREATURE:LEECH:BRAIN +CREATURE:LEECH:LUNG +CREATURE:LEECH:HEART +CREATURE:LEECH:LIVER +CREATURE:LEECH:GUT +CREATURE:LEECH:STOMACH +CREATURE:LEECH:GIZZARD +CREATURE:LEECH:PANCREAS +CREATURE:LEECH:SPLEEN +CREATURE:LEECH:KIDNEY +CREATURE:LEECH_MAN:MUSCLE +CREATURE:LEECH_MAN:EYE +CREATURE:LEECH_MAN:BRAIN +CREATURE:LEECH_MAN:LUNG +CREATURE:LEECH_MAN:HEART +CREATURE:LEECH_MAN:LIVER +CREATURE:LEECH_MAN:GUT +CREATURE:LEECH_MAN:STOMACH +CREATURE:LEECH_MAN:GIZZARD +CREATURE:LEECH_MAN:PANCREAS +CREATURE:LEECH_MAN:SPLEEN +CREATURE:LEECH_MAN:KIDNEY +CREATURE:GIANT_LEECH:MUSCLE +CREATURE:GIANT_LEECH:EYE +CREATURE:GIANT_LEECH:BRAIN +CREATURE:GIANT_LEECH:LUNG +CREATURE:GIANT_LEECH:HEART +CREATURE:GIANT_LEECH:LIVER +CREATURE:GIANT_LEECH:GUT +CREATURE:GIANT_LEECH:STOMACH +CREATURE:GIANT_LEECH:GIZZARD +CREATURE:GIANT_LEECH:PANCREAS +CREATURE:GIANT_LEECH:SPLEEN +CREATURE:GIANT_LEECH:KIDNEY +CREATURE:AXOLOTL:MUSCLE +CREATURE:AXOLOTL:EYE +CREATURE:AXOLOTL:BRAIN +CREATURE:AXOLOTL:LUNG +CREATURE:AXOLOTL:HEART +CREATURE:AXOLOTL:LIVER +CREATURE:AXOLOTL:GUT +CREATURE:AXOLOTL:STOMACH +CREATURE:AXOLOTL:GIZZARD +CREATURE:AXOLOTL:PANCREAS +CREATURE:AXOLOTL:SPLEEN +CREATURE:AXOLOTL:KIDNEY +CREATURE:AXOLOTL_MAN:MUSCLE +CREATURE:AXOLOTL_MAN:EYE +CREATURE:AXOLOTL_MAN:BRAIN +CREATURE:AXOLOTL_MAN:LUNG +CREATURE:AXOLOTL_MAN:HEART +CREATURE:AXOLOTL_MAN:LIVER +CREATURE:AXOLOTL_MAN:GUT +CREATURE:AXOLOTL_MAN:STOMACH +CREATURE:AXOLOTL_MAN:GIZZARD +CREATURE:AXOLOTL_MAN:PANCREAS +CREATURE:AXOLOTL_MAN:SPLEEN +CREATURE:AXOLOTL_MAN:KIDNEY +CREATURE:GIANT_AXOLOTL:MUSCLE +CREATURE:GIANT_AXOLOTL:EYE +CREATURE:GIANT_AXOLOTL:BRAIN +CREATURE:GIANT_AXOLOTL:LUNG +CREATURE:GIANT_AXOLOTL:HEART +CREATURE:GIANT_AXOLOTL:LIVER +CREATURE:GIANT_AXOLOTL:GUT +CREATURE:GIANT_AXOLOTL:STOMACH +CREATURE:GIANT_AXOLOTL:GIZZARD +CREATURE:GIANT_AXOLOTL:PANCREAS +CREATURE:GIANT_AXOLOTL:SPLEEN +CREATURE:GIANT_AXOLOTL:KIDNEY +CREATURE:MINK:MUSCLE +CREATURE:MINK:EYE +CREATURE:MINK:BRAIN +CREATURE:MINK:LUNG +CREATURE:MINK:HEART +CREATURE:MINK:LIVER +CREATURE:MINK:GUT +CREATURE:MINK:STOMACH +CREATURE:MINK:GIZZARD +CREATURE:MINK:PANCREAS +CREATURE:MINK:SPLEEN +CREATURE:MINK:KIDNEY +CREATURE:MINK_MAN:MUSCLE +CREATURE:MINK_MAN:EYE +CREATURE:MINK_MAN:BRAIN +CREATURE:MINK_MAN:LUNG +CREATURE:MINK_MAN:HEART +CREATURE:MINK_MAN:LIVER +CREATURE:MINK_MAN:GUT +CREATURE:MINK_MAN:STOMACH +CREATURE:MINK_MAN:GIZZARD +CREATURE:MINK_MAN:PANCREAS +CREATURE:MINK_MAN:SPLEEN +CREATURE:MINK_MAN:KIDNEY +CREATURE:GIANT_MINK:MUSCLE +CREATURE:GIANT_MINK:EYE +CREATURE:GIANT_MINK:BRAIN +CREATURE:GIANT_MINK:LUNG +CREATURE:GIANT_MINK:HEART +CREATURE:GIANT_MINK:LIVER +CREATURE:GIANT_MINK:GUT +CREATURE:GIANT_MINK:STOMACH +CREATURE:GIANT_MINK:GIZZARD +CREATURE:GIANT_MINK:PANCREAS +CREATURE:GIANT_MINK:SPLEEN +CREATURE:GIANT_MINK:KIDNEY +CREATURE:POND_TURTLE:MUSCLE +CREATURE:POND_TURTLE:EYE +CREATURE:POND_TURTLE:BRAIN +CREATURE:POND_TURTLE:LUNG +CREATURE:POND_TURTLE:HEART +CREATURE:POND_TURTLE:LIVER +CREATURE:POND_TURTLE:GUT +CREATURE:POND_TURTLE:STOMACH +CREATURE:POND_TURTLE:GIZZARD +CREATURE:POND_TURTLE:PANCREAS +CREATURE:POND_TURTLE:SPLEEN +CREATURE:POND_TURTLE:KIDNEY +CREATURE:POND_TURTLE_MAN:MUSCLE +CREATURE:POND_TURTLE_MAN:EYE +CREATURE:POND_TURTLE_MAN:BRAIN +CREATURE:POND_TURTLE_MAN:LUNG +CREATURE:POND_TURTLE_MAN:HEART +CREATURE:POND_TURTLE_MAN:LIVER +CREATURE:POND_TURTLE_MAN:GUT + CREATURE:POND_TURTLE_MAN:STOMACH + CREATURE:POND_TURTLE_MAN:GIZZARD +!CREATURE:POND_TURTLE_MAN:PANCREAS +CREATURE:POND_TURTLE_MAN:SPLEEN +CREATURE:POND_TURTLE_MAN:KIDNEY +!CREATURE:GIANT_POND_TURTLE:MUSCLE +CREATURE:GIANT_POND_TURTLE:EYE + CREATURE:GIANT_POND_TURTLE:BRAIN +CREATURE:GIANT_POND_TURTLE:LUNG + CREATURE:GIANT_POND_TURTLE:HEART + CREATURE:GIANT_POND_TURTLE:LIVER +CREATURE:GIANT_POND_TURTLE:GUT +"CREATURE:GIANT_POND_TURTLE:STOMACH +"CREATURE:GIANT_POND_TURTLE:GIZZARD +#CREATURE:GIANT_POND_TURTLE:PANCREAS +!CREATURE:GIANT_POND_TURTLE:SPLEEN +!CREATURE:GIANT_POND_TURTLE:KIDNEY +CREATURE:RAT:MUSCLE +CREATURE:RAT:EYE +CREATURE:RAT:BRAIN +CREATURE:RAT:LUNG +CREATURE:RAT:HEART +CREATURE:RAT:LIVER +CREATURE:RAT:GUT +CREATURE:RAT:STOMACH +CREATURE:RAT:GIZZARD +CREATURE:RAT:PANCREAS +CREATURE:RAT:SPLEEN +CREATURE:RAT:KIDNEY +CREATURE:RAT_MAN:MUSCLE +CREATURE:RAT_MAN:EYE +CREATURE:RAT_MAN:BRAIN +CREATURE:RAT_MAN:LUNG +CREATURE:RAT_MAN:HEART +CREATURE:RAT_MAN:LIVER +CREATURE:RAT_MAN:GUT +CREATURE:RAT_MAN:STOMACH +CREATURE:RAT_MAN:GIZZARD +CREATURE:RAT_MAN:PANCREAS +CREATURE:RAT_MAN:SPLEEN +CREATURE:RAT_MAN:KIDNEY +CREATURE:SQUIRREL_GRAY:MUSCLE +CREATURE:SQUIRREL_GRAY:EYE +CREATURE:SQUIRREL_GRAY:BRAIN +CREATURE:SQUIRREL_GRAY:LUNG +CREATURE:SQUIRREL_GRAY:HEART +CREATURE:SQUIRREL_GRAY:LIVER +CREATURE:SQUIRREL_GRAY:GUT +CREATURE:SQUIRREL_GRAY:STOMACH +CREATURE:SQUIRREL_GRAY:GIZZARD +CREATURE:SQUIRREL_GRAY:PANCREAS +CREATURE:SQUIRREL_GRAY:SPLEEN +CREATURE:SQUIRREL_GRAY:KIDNEY +!CREATURE:SQUIRREL_GRAY_MAN:MUSCLE +CREATURE:SQUIRREL_GRAY_MAN:EYE + CREATURE:SQUIRREL_GRAY_MAN:BRAIN +CREATURE:SQUIRREL_GRAY_MAN:LUNG + CREATURE:SQUIRREL_GRAY_MAN:HEART + CREATURE:SQUIRREL_GRAY_MAN:LIVER +CREATURE:SQUIRREL_GRAY_MAN:GUT +"CREATURE:SQUIRREL_GRAY_MAN:STOMACH +"CREATURE:SQUIRREL_GRAY_MAN:GIZZARD +#CREATURE:SQUIRREL_GRAY_MAN:PANCREAS +!CREATURE:SQUIRREL_GRAY_MAN:SPLEEN +!CREATURE:SQUIRREL_GRAY_MAN:KIDNEY +#CREATURE:GIANT_SQUIRREL_GRAY:MUSCLE + CREATURE:GIANT_SQUIRREL_GRAY:EYE +"CREATURE:GIANT_SQUIRREL_GRAY:BRAIN +!CREATURE:GIANT_SQUIRREL_GRAY:LUNG +"CREATURE:GIANT_SQUIRREL_GRAY:HEART +"CREATURE:GIANT_SQUIRREL_GRAY:LIVER + CREATURE:GIANT_SQUIRREL_GRAY:GUT +$CREATURE:GIANT_SQUIRREL_GRAY:STOMACH +$CREATURE:GIANT_SQUIRREL_GRAY:GIZZARD +%CREATURE:GIANT_SQUIRREL_GRAY:PANCREAS +#CREATURE:GIANT_SQUIRREL_GRAY:SPLEEN +#CREATURE:GIANT_SQUIRREL_GRAY:KIDNEY +CREATURE:SQUIRREL_RED:MUSCLE +CREATURE:SQUIRREL_RED:EYE +CREATURE:SQUIRREL_RED:BRAIN +CREATURE:SQUIRREL_RED:LUNG +CREATURE:SQUIRREL_RED:HEART +CREATURE:SQUIRREL_RED:LIVER +CREATURE:SQUIRREL_RED:GUT +CREATURE:SQUIRREL_RED:STOMACH +CREATURE:SQUIRREL_RED:GIZZARD +CREATURE:SQUIRREL_RED:PANCREAS +CREATURE:SQUIRREL_RED:SPLEEN +CREATURE:SQUIRREL_RED:KIDNEY + CREATURE:SQUIRREL_RED_MAN:MUSCLE +CREATURE:SQUIRREL_RED_MAN:EYE +CREATURE:SQUIRREL_RED_MAN:BRAIN +CREATURE:SQUIRREL_RED_MAN:LUNG +CREATURE:SQUIRREL_RED_MAN:HEART +CREATURE:SQUIRREL_RED_MAN:LIVER +CREATURE:SQUIRREL_RED_MAN:GUT +!CREATURE:SQUIRREL_RED_MAN:STOMACH +!CREATURE:SQUIRREL_RED_MAN:GIZZARD +"CREATURE:SQUIRREL_RED_MAN:PANCREAS + CREATURE:SQUIRREL_RED_MAN:SPLEEN + CREATURE:SQUIRREL_RED_MAN:KIDNEY +"CREATURE:GIANT_SQUIRREL_RED:MUSCLE +CREATURE:GIANT_SQUIRREL_RED:EYE +!CREATURE:GIANT_SQUIRREL_RED:BRAIN + CREATURE:GIANT_SQUIRREL_RED:LUNG +!CREATURE:GIANT_SQUIRREL_RED:HEART +!CREATURE:GIANT_SQUIRREL_RED:LIVER +CREATURE:GIANT_SQUIRREL_RED:GUT +#CREATURE:GIANT_SQUIRREL_RED:STOMACH +#CREATURE:GIANT_SQUIRREL_RED:GIZZARD +$CREATURE:GIANT_SQUIRREL_RED:PANCREAS +"CREATURE:GIANT_SQUIRREL_RED:SPLEEN +"CREATURE:GIANT_SQUIRREL_RED:KIDNEY +CREATURE:CHIPMUNK:MUSCLE +CREATURE:CHIPMUNK:EYE +CREATURE:CHIPMUNK:BRAIN +CREATURE:CHIPMUNK:LUNG +CREATURE:CHIPMUNK:HEART +CREATURE:CHIPMUNK:LIVER +CREATURE:CHIPMUNK:GUT +CREATURE:CHIPMUNK:STOMACH +CREATURE:CHIPMUNK:GIZZARD +CREATURE:CHIPMUNK:PANCREAS +CREATURE:CHIPMUNK:SPLEEN +CREATURE:CHIPMUNK:KIDNEY +CREATURE:CHIPMUNK_MAN:MUSCLE +CREATURE:CHIPMUNK_MAN:EYE +CREATURE:CHIPMUNK_MAN:BRAIN +CREATURE:CHIPMUNK_MAN:LUNG +CREATURE:CHIPMUNK_MAN:HEART +CREATURE:CHIPMUNK_MAN:LIVER +CREATURE:CHIPMUNK_MAN:GUT +CREATURE:CHIPMUNK_MAN:STOMACH +CREATURE:CHIPMUNK_MAN:GIZZARD +CREATURE:CHIPMUNK_MAN:PANCREAS +CREATURE:CHIPMUNK_MAN:SPLEEN +CREATURE:CHIPMUNK_MAN:KIDNEY +CREATURE:GIANT_CHIPMUNK:MUSCLE +CREATURE:GIANT_CHIPMUNK:EYE +CREATURE:GIANT_CHIPMUNK:BRAIN +CREATURE:GIANT_CHIPMUNK:LUNG +CREATURE:GIANT_CHIPMUNK:HEART +CREATURE:GIANT_CHIPMUNK:LIVER +CREATURE:GIANT_CHIPMUNK:GUT +CREATURE:GIANT_CHIPMUNK:STOMACH +CREATURE:GIANT_CHIPMUNK:GIZZARD + CREATURE:GIANT_CHIPMUNK:PANCREAS +CREATURE:GIANT_CHIPMUNK:SPLEEN +CREATURE:GIANT_CHIPMUNK:KIDNEY +CREATURE:HAMSTER:MUSCLE +CREATURE:HAMSTER:EYE +CREATURE:HAMSTER:BRAIN +CREATURE:HAMSTER:LUNG +CREATURE:HAMSTER:HEART +CREATURE:HAMSTER:LIVER +CREATURE:HAMSTER:GUT +CREATURE:HAMSTER:STOMACH +CREATURE:HAMSTER:GIZZARD +CREATURE:HAMSTER:PANCREAS +CREATURE:HAMSTER:SPLEEN +CREATURE:HAMSTER:KIDNEY +CREATURE:HAMSTER_MAN:MUSCLE +CREATURE:HAMSTER_MAN:EYE +CREATURE:HAMSTER_MAN:BRAIN +CREATURE:HAMSTER_MAN:LUNG +CREATURE:HAMSTER_MAN:HEART +CREATURE:HAMSTER_MAN:LIVER +CREATURE:HAMSTER_MAN:GUT +CREATURE:HAMSTER_MAN:STOMACH +CREATURE:HAMSTER_MAN:GIZZARD +CREATURE:HAMSTER_MAN:PANCREAS +CREATURE:HAMSTER_MAN:SPLEEN +CREATURE:HAMSTER_MAN:KIDNEY +CREATURE:GIANT_HAMSTER:MUSCLE +CREATURE:GIANT_HAMSTER:EYE +CREATURE:GIANT_HAMSTER:BRAIN +CREATURE:GIANT_HAMSTER:LUNG +CREATURE:GIANT_HAMSTER:HEART +CREATURE:GIANT_HAMSTER:LIVER +CREATURE:GIANT_HAMSTER:GUT +CREATURE:GIANT_HAMSTER:STOMACH +CREATURE:GIANT_HAMSTER:GIZZARD +CREATURE:GIANT_HAMSTER:PANCREAS +CREATURE:GIANT_HAMSTER:SPLEEN +CREATURE:GIANT_HAMSTER:KIDNEY +CREATURE:HEDGEHOG:MUSCLE +CREATURE:HEDGEHOG:EYE +CREATURE:HEDGEHOG:BRAIN +CREATURE:HEDGEHOG:LUNG +CREATURE:HEDGEHOG:HEART +CREATURE:HEDGEHOG:LIVER +CREATURE:HEDGEHOG:GUT +CREATURE:HEDGEHOG:STOMACH +CREATURE:HEDGEHOG:GIZZARD +CREATURE:HEDGEHOG:PANCREAS +CREATURE:HEDGEHOG:SPLEEN +CREATURE:HEDGEHOG:KIDNEY +CREATURE:HEDGEHOG_MAN:MUSCLE +CREATURE:HEDGEHOG_MAN:EYE +CREATURE:HEDGEHOG_MAN:BRAIN +CREATURE:HEDGEHOG_MAN:LUNG +CREATURE:HEDGEHOG_MAN:HEART +CREATURE:HEDGEHOG_MAN:LIVER +CREATURE:HEDGEHOG_MAN:GUT +CREATURE:HEDGEHOG_MAN:STOMACH +CREATURE:HEDGEHOG_MAN:GIZZARD +CREATURE:HEDGEHOG_MAN:PANCREAS +CREATURE:HEDGEHOG_MAN:SPLEEN +CREATURE:HEDGEHOG_MAN:KIDNEY +CREATURE:GIANT_HEDGEHOG:MUSCLE +CREATURE:GIANT_HEDGEHOG:EYE +CREATURE:GIANT_HEDGEHOG:BRAIN +CREATURE:GIANT_HEDGEHOG:LUNG +CREATURE:GIANT_HEDGEHOG:HEART +CREATURE:GIANT_HEDGEHOG:LIVER +CREATURE:GIANT_HEDGEHOG:GUT +CREATURE:GIANT_HEDGEHOG:STOMACH +CREATURE:GIANT_HEDGEHOG:GIZZARD + CREATURE:GIANT_HEDGEHOG:PANCREAS +CREATURE:GIANT_HEDGEHOG:SPLEEN +CREATURE:GIANT_HEDGEHOG:KIDNEY +CREATURE:SQUIRREL_FLYING:MUSCLE +CREATURE:SQUIRREL_FLYING:EYE +CREATURE:SQUIRREL_FLYING:BRAIN +CREATURE:SQUIRREL_FLYING:LUNG +CREATURE:SQUIRREL_FLYING:HEART +CREATURE:SQUIRREL_FLYING:LIVER +CREATURE:SQUIRREL_FLYING:GUT + CREATURE:SQUIRREL_FLYING:STOMACH + CREATURE:SQUIRREL_FLYING:GIZZARD +!CREATURE:SQUIRREL_FLYING:PANCREAS +CREATURE:SQUIRREL_FLYING:SPLEEN +CREATURE:SQUIRREL_FLYING:KIDNEY +#CREATURE:FLYING_SQUIRREL_MAN:MUSCLE + CREATURE:FLYING_SQUIRREL_MAN:EYE +"CREATURE:FLYING_SQUIRREL_MAN:BRAIN +!CREATURE:FLYING_SQUIRREL_MAN:LUNG +"CREATURE:FLYING_SQUIRREL_MAN:HEART +"CREATURE:FLYING_SQUIRREL_MAN:LIVER + CREATURE:FLYING_SQUIRREL_MAN:GUT +$CREATURE:FLYING_SQUIRREL_MAN:STOMACH +$CREATURE:FLYING_SQUIRREL_MAN:GIZZARD +%CREATURE:FLYING_SQUIRREL_MAN:PANCREAS +#CREATURE:FLYING_SQUIRREL_MAN:SPLEEN +#CREATURE:FLYING_SQUIRREL_MAN:KIDNEY +%CREATURE:GIANT_FLYING_SQUIRREL:MUSCLE +"CREATURE:GIANT_FLYING_SQUIRREL:EYE +$CREATURE:GIANT_FLYING_SQUIRREL:BRAIN +#CREATURE:GIANT_FLYING_SQUIRREL:LUNG +$CREATURE:GIANT_FLYING_SQUIRREL:HEART +$CREATURE:GIANT_FLYING_SQUIRREL:LIVER +"CREATURE:GIANT_FLYING_SQUIRREL:GUT +&CREATURE:GIANT_FLYING_SQUIRREL:STOMACH +&CREATURE:GIANT_FLYING_SQUIRREL:GIZZARD +'CREATURE:GIANT_FLYING_SQUIRREL:PANCREAS +%CREATURE:GIANT_FLYING_SQUIRREL:SPLEEN +%CREATURE:GIANT_FLYING_SQUIRREL:KIDNEY +CREATURE:MUSSEL:MUSCLE +CREATURE:OYSTER:MUSCLE +CREATURE:FISH_SALMON:MUSCLE +CREATURE:FISH_SALMON:EYE +CREATURE:FISH_SALMON:BRAIN +CREATURE:FISH_SALMON:LUNG +CREATURE:FISH_SALMON:HEART +CREATURE:FISH_SALMON:LIVER +CREATURE:FISH_SALMON:GUT +CREATURE:FISH_SALMON:STOMACH +CREATURE:FISH_SALMON:GIZZARD +CREATURE:FISH_SALMON:PANCREAS +CREATURE:FISH_SALMON:SPLEEN +CREATURE:FISH_SALMON:KIDNEY +CREATURE:FISH_CLOWNFISH:MUSCLE +CREATURE:FISH_CLOWNFISH:EYE +CREATURE:FISH_CLOWNFISH:BRAIN +CREATURE:FISH_CLOWNFISH:LUNG +CREATURE:FISH_CLOWNFISH:HEART +CREATURE:FISH_CLOWNFISH:LIVER +CREATURE:FISH_CLOWNFISH:GUT +CREATURE:FISH_CLOWNFISH:STOMACH +CREATURE:FISH_CLOWNFISH:GIZZARD + CREATURE:FISH_CLOWNFISH:PANCREAS +CREATURE:FISH_CLOWNFISH:SPLEEN +CREATURE:FISH_CLOWNFISH:KIDNEY +CREATURE:FISH_HAGFISH:MUSCLE +CREATURE:FISH_HAGFISH:EYE +CREATURE:FISH_HAGFISH:BRAIN +CREATURE:FISH_HAGFISH:LUNG +CREATURE:FISH_HAGFISH:HEART +CREATURE:FISH_HAGFISH:LIVER +CREATURE:FISH_HAGFISH:GUT +CREATURE:FISH_HAGFISH:STOMACH +CREATURE:FISH_HAGFISH:GIZZARD +CREATURE:FISH_HAGFISH:PANCREAS +CREATURE:FISH_HAGFISH:SPLEEN +CREATURE:FISH_HAGFISH:KIDNEY +"CREATURE:FISH_LAMPREY_BROOK:MUSCLE +CREATURE:FISH_LAMPREY_BROOK:EYE +!CREATURE:FISH_LAMPREY_BROOK:BRAIN + CREATURE:FISH_LAMPREY_BROOK:LUNG +!CREATURE:FISH_LAMPREY_BROOK:HEART +!CREATURE:FISH_LAMPREY_BROOK:LIVER +CREATURE:FISH_LAMPREY_BROOK:GUT +#CREATURE:FISH_LAMPREY_BROOK:STOMACH +#CREATURE:FISH_LAMPREY_BROOK:GIZZARD +$CREATURE:FISH_LAMPREY_BROOK:PANCREAS +"CREATURE:FISH_LAMPREY_BROOK:SPLEEN +"CREATURE:FISH_LAMPREY_BROOK:KIDNEY +CREATURE:FISH_RAY_BAT:MUSCLE +CREATURE:FISH_RAY_BAT:EYE +CREATURE:FISH_RAY_BAT:BRAIN +CREATURE:FISH_RAY_BAT:LUNG +CREATURE:FISH_RAY_BAT:HEART +CREATURE:FISH_RAY_BAT:LIVER +CREATURE:FISH_RAY_BAT:GUT +CREATURE:FISH_RAY_BAT:STOMACH +CREATURE:FISH_RAY_BAT:GIZZARD +CREATURE:FISH_RAY_BAT:PANCREAS +CREATURE:FISH_RAY_BAT:SPLEEN +CREATURE:FISH_RAY_BAT:KIDNEY +"CREATURE:FISH_RAY_THORNBACK:MUSCLE +CREATURE:FISH_RAY_THORNBACK:EYE +!CREATURE:FISH_RAY_THORNBACK:BRAIN + CREATURE:FISH_RAY_THORNBACK:LUNG +!CREATURE:FISH_RAY_THORNBACK:HEART +!CREATURE:FISH_RAY_THORNBACK:LIVER +CREATURE:FISH_RAY_THORNBACK:GUT +#CREATURE:FISH_RAY_THORNBACK:STOMACH +#CREATURE:FISH_RAY_THORNBACK:GIZZARD +$CREATURE:FISH_RAY_THORNBACK:PANCREAS +"CREATURE:FISH_RAY_THORNBACK:SPLEEN +"CREATURE:FISH_RAY_THORNBACK:KIDNEY +$CREATURE:FISH_RATFISH_SPOTTED:MUSCLE +!CREATURE:FISH_RATFISH_SPOTTED:EYE +#CREATURE:FISH_RATFISH_SPOTTED:BRAIN +"CREATURE:FISH_RATFISH_SPOTTED:LUNG +#CREATURE:FISH_RATFISH_SPOTTED:HEART +#CREATURE:FISH_RATFISH_SPOTTED:LIVER +!CREATURE:FISH_RATFISH_SPOTTED:GUT +%CREATURE:FISH_RATFISH_SPOTTED:STOMACH +%CREATURE:FISH_RATFISH_SPOTTED:GIZZARD +&CREATURE:FISH_RATFISH_SPOTTED:PANCREAS +$CREATURE:FISH_RATFISH_SPOTTED:SPLEEN +$CREATURE:FISH_RATFISH_SPOTTED:KIDNEY +CREATURE:FISH_HERRING:MUSCLE +CREATURE:FISH_HERRING:EYE +CREATURE:FISH_HERRING:BRAIN +CREATURE:FISH_HERRING:LUNG +CREATURE:FISH_HERRING:HEART +CREATURE:FISH_HERRING:LIVER +CREATURE:FISH_HERRING:GUT +CREATURE:FISH_HERRING:STOMACH +CREATURE:FISH_HERRING:GIZZARD +CREATURE:FISH_HERRING:PANCREAS +CREATURE:FISH_HERRING:SPLEEN +CREATURE:FISH_HERRING:KIDNEY +CREATURE:FISH_SHAD:MUSCLE +CREATURE:FISH_SHAD:EYE +CREATURE:FISH_SHAD:BRAIN +CREATURE:FISH_SHAD:LUNG +CREATURE:FISH_SHAD:HEART +CREATURE:FISH_SHAD:LIVER +CREATURE:FISH_SHAD:GUT +CREATURE:FISH_SHAD:STOMACH +CREATURE:FISH_SHAD:GIZZARD +CREATURE:FISH_SHAD:PANCREAS +CREATURE:FISH_SHAD:SPLEEN +CREATURE:FISH_SHAD:KIDNEY +CREATURE:FISH_ANCHOVY:MUSCLE +CREATURE:FISH_ANCHOVY:EYE +CREATURE:FISH_ANCHOVY:BRAIN +CREATURE:FISH_ANCHOVY:LUNG +CREATURE:FISH_ANCHOVY:HEART +CREATURE:FISH_ANCHOVY:LIVER +CREATURE:FISH_ANCHOVY:GUT +CREATURE:FISH_ANCHOVY:STOMACH +CREATURE:FISH_ANCHOVY:GIZZARD +CREATURE:FISH_ANCHOVY:PANCREAS +CREATURE:FISH_ANCHOVY:SPLEEN +CREATURE:FISH_ANCHOVY:KIDNEY +$CREATURE:FISH_TROUT_STEELHEAD:MUSCLE +!CREATURE:FISH_TROUT_STEELHEAD:EYE +#CREATURE:FISH_TROUT_STEELHEAD:BRAIN +"CREATURE:FISH_TROUT_STEELHEAD:LUNG +#CREATURE:FISH_TROUT_STEELHEAD:HEART +#CREATURE:FISH_TROUT_STEELHEAD:LIVER +!CREATURE:FISH_TROUT_STEELHEAD:GUT +%CREATURE:FISH_TROUT_STEELHEAD:STOMACH +%CREATURE:FISH_TROUT_STEELHEAD:GIZZARD +&CREATURE:FISH_TROUT_STEELHEAD:PANCREAS +$CREATURE:FISH_TROUT_STEELHEAD:SPLEEN +$CREATURE:FISH_TROUT_STEELHEAD:KIDNEY +CREATURE:FISH_HAKE:MUSCLE +CREATURE:FISH_HAKE:EYE +CREATURE:FISH_HAKE:BRAIN +CREATURE:FISH_HAKE:LUNG +CREATURE:FISH_HAKE:HEART +CREATURE:FISH_HAKE:LIVER +CREATURE:FISH_HAKE:GUT +CREATURE:FISH_HAKE:STOMACH +CREATURE:FISH_HAKE:GIZZARD +CREATURE:FISH_HAKE:PANCREAS +CREATURE:FISH_HAKE:SPLEEN +CREATURE:FISH_HAKE:KIDNEY +CREATURE:FISH_SEAHORSE:MUSCLE +CREATURE:FISH_SEAHORSE:EYE +CREATURE:FISH_SEAHORSE:BRAIN +CREATURE:FISH_SEAHORSE:LUNG +CREATURE:FISH_SEAHORSE:HEART +CREATURE:FISH_SEAHORSE:LIVER +CREATURE:FISH_SEAHORSE:GUT +CREATURE:FISH_SEAHORSE:STOMACH +CREATURE:FISH_SEAHORSE:GIZZARD +CREATURE:FISH_SEAHORSE:PANCREAS +CREATURE:FISH_SEAHORSE:SPLEEN +CREATURE:FISH_SEAHORSE:KIDNEY +CREATURE:FISH_GLASSEYE:MUSCLE +CREATURE:FISH_GLASSEYE:EYE +CREATURE:FISH_GLASSEYE:BRAIN +CREATURE:FISH_GLASSEYE:LUNG +CREATURE:FISH_GLASSEYE:HEART +CREATURE:FISH_GLASSEYE:LIVER +CREATURE:FISH_GLASSEYE:GUT +CREATURE:FISH_GLASSEYE:STOMACH +CREATURE:FISH_GLASSEYE:GIZZARD +CREATURE:FISH_GLASSEYE:PANCREAS +CREATURE:FISH_GLASSEYE:SPLEEN +CREATURE:FISH_GLASSEYE:KIDNEY +)CREATURE:FISH_PUFFER_WHITE_SPOTTED:MUSCLE +&CREATURE:FISH_PUFFER_WHITE_SPOTTED:EYE +(CREATURE:FISH_PUFFER_WHITE_SPOTTED:BRAIN +'CREATURE:FISH_PUFFER_WHITE_SPOTTED:LUNG +(CREATURE:FISH_PUFFER_WHITE_SPOTTED:HEART +(CREATURE:FISH_PUFFER_WHITE_SPOTTED:LIVER +&CREATURE:FISH_PUFFER_WHITE_SPOTTED:GUT +*CREATURE:FISH_PUFFER_WHITE_SPOTTED:STOMACH +*CREATURE:FISH_PUFFER_WHITE_SPOTTED:GIZZARD ++CREATURE:FISH_PUFFER_WHITE_SPOTTED:PANCREAS +)CREATURE:FISH_PUFFER_WHITE_SPOTTED:SPLEEN +)CREATURE:FISH_PUFFER_WHITE_SPOTTED:KIDNEY +CREATURE:FISH_SOLE:MUSCLE +CREATURE:FISH_SOLE:EYE +CREATURE:FISH_SOLE:BRAIN +CREATURE:FISH_SOLE:LUNG +CREATURE:FISH_SOLE:HEART +CREATURE:FISH_SOLE:LIVER +CREATURE:FISH_SOLE:GUT +CREATURE:FISH_SOLE:STOMACH +CREATURE:FISH_SOLE:GIZZARD +CREATURE:FISH_SOLE:PANCREAS +CREATURE:FISH_SOLE:SPLEEN +CREATURE:FISH_SOLE:KIDNEY +CREATURE:FISH_FLOUNDER:MUSCLE +CREATURE:FISH_FLOUNDER:EYE +CREATURE:FISH_FLOUNDER:BRAIN +CREATURE:FISH_FLOUNDER:LUNG +CREATURE:FISH_FLOUNDER:HEART +CREATURE:FISH_FLOUNDER:LIVER +CREATURE:FISH_FLOUNDER:GUT +CREATURE:FISH_FLOUNDER:STOMACH +CREATURE:FISH_FLOUNDER:GIZZARD +CREATURE:FISH_FLOUNDER:PANCREAS +CREATURE:FISH_FLOUNDER:SPLEEN +CREATURE:FISH_FLOUNDER:KIDNEY +CREATURE:FISH_MACKEREL:MUSCLE +CREATURE:FISH_MACKEREL:EYE +CREATURE:FISH_MACKEREL:BRAIN +CREATURE:FISH_MACKEREL:LUNG +CREATURE:FISH_MACKEREL:HEART +CREATURE:FISH_MACKEREL:LIVER +CREATURE:FISH_MACKEREL:GUT +CREATURE:FISH_MACKEREL:STOMACH +CREATURE:FISH_MACKEREL:GIZZARD +CREATURE:FISH_MACKEREL:PANCREAS +CREATURE:FISH_MACKEREL:SPLEEN +CREATURE:FISH_MACKEREL:KIDNEY +$CREATURE:JELLYFISH_SEA_NETTLE:MUSCLE +!CREATURE:JELLYFISH_SEA_NETTLE:EYE +#CREATURE:JELLYFISH_SEA_NETTLE:BRAIN +"CREATURE:JELLYFISH_SEA_NETTLE:LUNG +#CREATURE:JELLYFISH_SEA_NETTLE:HEART +#CREATURE:JELLYFISH_SEA_NETTLE:LIVER +!CREATURE:JELLYFISH_SEA_NETTLE:GUT +%CREATURE:JELLYFISH_SEA_NETTLE:STOMACH +%CREATURE:JELLYFISH_SEA_NETTLE:GIZZARD +&CREATURE:JELLYFISH_SEA_NETTLE:PANCREAS +$CREATURE:JELLYFISH_SEA_NETTLE:SPLEEN +$CREATURE:JELLYFISH_SEA_NETTLE:KIDNEY +CREATURE:SQUID:MUSCLE +CREATURE:SQUID:EYE +CREATURE:SQUID:BRAIN +CREATURE:SQUID:LUNG +CREATURE:SQUID:HEART +CREATURE:SQUID:LIVER +CREATURE:SQUID:GUT +CREATURE:SQUID:STOMACH +CREATURE:SQUID:GIZZARD +CREATURE:SQUID:PANCREAS +CREATURE:SQUID:SPLEEN +CREATURE:SQUID:KIDNEY +CREATURE:SQUID MAN:MUSCLE +CREATURE:SQUID MAN:EYE +CREATURE:SQUID MAN:BRAIN +CREATURE:SQUID MAN:LUNG +CREATURE:SQUID MAN:HEART +CREATURE:SQUID MAN:LIVER +CREATURE:SQUID MAN:GUT +CREATURE:SQUID MAN:STOMACH +CREATURE:SQUID MAN:GIZZARD +CREATURE:SQUID MAN:PANCREAS +CREATURE:SQUID MAN:SPLEEN +CREATURE:SQUID MAN:KIDNEY +CREATURE:GIGANTIC SQUID:MUSCLE +CREATURE:GIGANTIC SQUID:EYE +CREATURE:GIGANTIC SQUID:BRAIN +CREATURE:GIGANTIC SQUID:LUNG +CREATURE:GIGANTIC SQUID:HEART +CREATURE:GIGANTIC SQUID:LIVER +CREATURE:GIGANTIC SQUID:GUT +CREATURE:GIGANTIC SQUID:STOMACH +CREATURE:GIGANTIC SQUID:GIZZARD + CREATURE:GIGANTIC SQUID:PANCREAS +CREATURE:GIGANTIC SQUID:SPLEEN +CREATURE:GIGANTIC SQUID:KIDNEY +CREATURE:FISH_LUNGFISH:MUSCLE +CREATURE:FISH_LUNGFISH:EYE +CREATURE:FISH_LUNGFISH:BRAIN +CREATURE:FISH_LUNGFISH:LUNG +CREATURE:FISH_LUNGFISH:HEART +CREATURE:FISH_LUNGFISH:LIVER +CREATURE:FISH_LUNGFISH:GUT +CREATURE:FISH_LUNGFISH:STOMACH +CREATURE:FISH_LUNGFISH:GIZZARD +CREATURE:FISH_LUNGFISH:PANCREAS +CREATURE:FISH_LUNGFISH:SPLEEN +CREATURE:FISH_LUNGFISH:KIDNEY + CREATURE:FISH_LOACH_CLOWN:MUSCLE +CREATURE:FISH_LOACH_CLOWN:EYE +CREATURE:FISH_LOACH_CLOWN:BRAIN +CREATURE:FISH_LOACH_CLOWN:LUNG +CREATURE:FISH_LOACH_CLOWN:HEART +CREATURE:FISH_LOACH_CLOWN:LIVER +CREATURE:FISH_LOACH_CLOWN:GUT +!CREATURE:FISH_LOACH_CLOWN:STOMACH +!CREATURE:FISH_LOACH_CLOWN:GIZZARD +"CREATURE:FISH_LOACH_CLOWN:PANCREAS + CREATURE:FISH_LOACH_CLOWN:SPLEEN + CREATURE:FISH_LOACH_CLOWN:KIDNEY +#CREATURE:FISH_BULLHEAD_BROWN:MUSCLE + CREATURE:FISH_BULLHEAD_BROWN:EYE +"CREATURE:FISH_BULLHEAD_BROWN:BRAIN +!CREATURE:FISH_BULLHEAD_BROWN:LUNG +"CREATURE:FISH_BULLHEAD_BROWN:HEART +"CREATURE:FISH_BULLHEAD_BROWN:LIVER + CREATURE:FISH_BULLHEAD_BROWN:GUT +$CREATURE:FISH_BULLHEAD_BROWN:STOMACH +$CREATURE:FISH_BULLHEAD_BROWN:GIZZARD +%CREATURE:FISH_BULLHEAD_BROWN:PANCREAS +#CREATURE:FISH_BULLHEAD_BROWN:SPLEEN +#CREATURE:FISH_BULLHEAD_BROWN:KIDNEY +$CREATURE:FISH_BULLHEAD_YELLOW:MUSCLE +!CREATURE:FISH_BULLHEAD_YELLOW:EYE +#CREATURE:FISH_BULLHEAD_YELLOW:BRAIN +"CREATURE:FISH_BULLHEAD_YELLOW:LUNG +#CREATURE:FISH_BULLHEAD_YELLOW:HEART +#CREATURE:FISH_BULLHEAD_YELLOW:LIVER +!CREATURE:FISH_BULLHEAD_YELLOW:GUT +%CREATURE:FISH_BULLHEAD_YELLOW:STOMACH +%CREATURE:FISH_BULLHEAD_YELLOW:GIZZARD +&CREATURE:FISH_BULLHEAD_YELLOW:PANCREAS +$CREATURE:FISH_BULLHEAD_YELLOW:SPLEEN +$CREATURE:FISH_BULLHEAD_YELLOW:KIDNEY +#CREATURE:FISH_BULLHEAD_BLACK:MUSCLE + CREATURE:FISH_BULLHEAD_BLACK:EYE +"CREATURE:FISH_BULLHEAD_BLACK:BRAIN +!CREATURE:FISH_BULLHEAD_BLACK:LUNG +"CREATURE:FISH_BULLHEAD_BLACK:HEART +"CREATURE:FISH_BULLHEAD_BLACK:LIVER + CREATURE:FISH_BULLHEAD_BLACK:GUT +$CREATURE:FISH_BULLHEAD_BLACK:STOMACH +$CREATURE:FISH_BULLHEAD_BLACK:GIZZARD +%CREATURE:FISH_BULLHEAD_BLACK:PANCREAS +#CREATURE:FISH_BULLHEAD_BLACK:SPLEEN +#CREATURE:FISH_BULLHEAD_BLACK:KIDNEY +%CREATURE:FISH_KNIFEFISH_BANDED:MUSCLE +"CREATURE:FISH_KNIFEFISH_BANDED:EYE +$CREATURE:FISH_KNIFEFISH_BANDED:BRAIN +#CREATURE:FISH_KNIFEFISH_BANDED:LUNG +$CREATURE:FISH_KNIFEFISH_BANDED:HEART +$CREATURE:FISH_KNIFEFISH_BANDED:LIVER +"CREATURE:FISH_KNIFEFISH_BANDED:GUT +&CREATURE:FISH_KNIFEFISH_BANDED:STOMACH +&CREATURE:FISH_KNIFEFISH_BANDED:GIZZARD +'CREATURE:FISH_KNIFEFISH_BANDED:PANCREAS +%CREATURE:FISH_KNIFEFISH_BANDED:SPLEEN +%CREATURE:FISH_KNIFEFISH_BANDED:KIDNEY +CREATURE:FISH_CHAR:MUSCLE +CREATURE:FISH_CHAR:EYE +CREATURE:FISH_CHAR:BRAIN +CREATURE:FISH_CHAR:LUNG +CREATURE:FISH_CHAR:HEART +CREATURE:FISH_CHAR:LIVER +CREATURE:FISH_CHAR:GUT +CREATURE:FISH_CHAR:STOMACH +CREATURE:FISH_CHAR:GIZZARD +CREATURE:FISH_CHAR:PANCREAS +CREATURE:FISH_CHAR:SPLEEN +CREATURE:FISH_CHAR:KIDNEY +"CREATURE:FISH_TROUT_RAINBOW:MUSCLE +CREATURE:FISH_TROUT_RAINBOW:EYE +!CREATURE:FISH_TROUT_RAINBOW:BRAIN + CREATURE:FISH_TROUT_RAINBOW:LUNG +!CREATURE:FISH_TROUT_RAINBOW:HEART +!CREATURE:FISH_TROUT_RAINBOW:LIVER +CREATURE:FISH_TROUT_RAINBOW:GUT +#CREATURE:FISH_TROUT_RAINBOW:STOMACH +#CREATURE:FISH_TROUT_RAINBOW:GIZZARD +$CREATURE:FISH_TROUT_RAINBOW:PANCREAS +"CREATURE:FISH_TROUT_RAINBOW:SPLEEN +"CREATURE:FISH_TROUT_RAINBOW:KIDNEY +"CREATURE:FISH_MOLLY_SAILFIN:MUSCLE +CREATURE:FISH_MOLLY_SAILFIN:EYE +!CREATURE:FISH_MOLLY_SAILFIN:BRAIN + CREATURE:FISH_MOLLY_SAILFIN:LUNG +!CREATURE:FISH_MOLLY_SAILFIN:HEART +!CREATURE:FISH_MOLLY_SAILFIN:LIVER +CREATURE:FISH_MOLLY_SAILFIN:GUT +#CREATURE:FISH_MOLLY_SAILFIN:STOMACH +#CREATURE:FISH_MOLLY_SAILFIN:GIZZARD +$CREATURE:FISH_MOLLY_SAILFIN:PANCREAS +"CREATURE:FISH_MOLLY_SAILFIN:SPLEEN +"CREATURE:FISH_MOLLY_SAILFIN:KIDNEY +CREATURE:FISH_GUPPY:MUSCLE +CREATURE:FISH_GUPPY:EYE +CREATURE:FISH_GUPPY:BRAIN +CREATURE:FISH_GUPPY:LUNG +CREATURE:FISH_GUPPY:HEART +CREATURE:FISH_GUPPY:LIVER +CREATURE:FISH_GUPPY:GUT +CREATURE:FISH_GUPPY:STOMACH +CREATURE:FISH_GUPPY:GIZZARD +CREATURE:FISH_GUPPY:PANCREAS +CREATURE:FISH_GUPPY:SPLEEN +CREATURE:FISH_GUPPY:KIDNEY +CREATURE:FISH_PERCH:MUSCLE +CREATURE:FISH_PERCH:EYE +CREATURE:FISH_PERCH:BRAIN +CREATURE:FISH_PERCH:LUNG +CREATURE:FISH_PERCH:HEART +CREATURE:FISH_PERCH:LIVER +CREATURE:FISH_PERCH:GUT +CREATURE:FISH_PERCH:STOMACH +CREATURE:FISH_PERCH:GIZZARD +CREATURE:FISH_PERCH:PANCREAS +CREATURE:FISH_PERCH:SPLEEN +CREATURE:FISH_PERCH:KIDNEY +CREATURE:DWARF:MUSCLE +CREATURE:DWARF:EYE +CREATURE:DWARF:BRAIN +CREATURE:DWARF:LUNG +CREATURE:DWARF:HEART +CREATURE:DWARF:LIVER +CREATURE:DWARF:GUT +CREATURE:DWARF:STOMACH +CREATURE:DWARF:GIZZARD +CREATURE:DWARF:PANCREAS +CREATURE:DWARF:SPLEEN +CREATURE:DWARF:KIDNEY +CREATURE:HUMAN:MUSCLE +CREATURE:HUMAN:EYE +CREATURE:HUMAN:BRAIN +CREATURE:HUMAN:LUNG +CREATURE:HUMAN:HEART +CREATURE:HUMAN:LIVER +CREATURE:HUMAN:GUT +CREATURE:HUMAN:STOMACH +CREATURE:HUMAN:GIZZARD +CREATURE:HUMAN:PANCREAS +CREATURE:HUMAN:SPLEEN +CREATURE:HUMAN:KIDNEY +CREATURE:ELF:MUSCLE +CREATURE:ELF:EYE +CREATURE:ELF:BRAIN +CREATURE:ELF:LUNG +CREATURE:ELF:HEART +CREATURE:ELF:LIVER +CREATURE:ELF:GUT +CREATURE:ELF:STOMACH +CREATURE:ELF:GIZZARD +CREATURE:ELF:PANCREAS +CREATURE:ELF:SPLEEN +CREATURE:ELF:KIDNEY +CREATURE:GOBLIN:MUSCLE +CREATURE:GOBLIN:EYE +CREATURE:GOBLIN:BRAIN +CREATURE:GOBLIN:LUNG +CREATURE:GOBLIN:HEART +CREATURE:GOBLIN:LIVER +CREATURE:GOBLIN:GUT +CREATURE:GOBLIN:STOMACH +CREATURE:GOBLIN:GIZZARD +CREATURE:GOBLIN:PANCREAS +CREATURE:GOBLIN:SPLEEN +CREATURE:GOBLIN:KIDNEY +CREATURE:KOBOLD:MUSCLE +CREATURE:KOBOLD:EYE +CREATURE:KOBOLD:BRAIN +CREATURE:KOBOLD:LUNG +CREATURE:KOBOLD:HEART +CREATURE:KOBOLD:LIVER +CREATURE:KOBOLD:GUT +CREATURE:KOBOLD:STOMACH +CREATURE:KOBOLD:GIZZARD +CREATURE:KOBOLD:PANCREAS +CREATURE:KOBOLD:SPLEEN +CREATURE:KOBOLD:KIDNEY +CREATURE:GREMLIN:MUSCLE +CREATURE:GREMLIN:EYE +CREATURE:GREMLIN:BRAIN +CREATURE:GREMLIN:LUNG +CREATURE:GREMLIN:HEART +CREATURE:GREMLIN:LIVER +CREATURE:GREMLIN:GUT +CREATURE:GREMLIN:STOMACH +CREATURE:GREMLIN:GIZZARD +CREATURE:GREMLIN:PANCREAS +CREATURE:GREMLIN:SPLEEN +CREATURE:GREMLIN:KIDNEY +CREATURE:TROLL:MUSCLE +CREATURE:TROLL:EYE +CREATURE:TROLL:BRAIN +CREATURE:TROLL:LUNG +CREATURE:TROLL:HEART +CREATURE:TROLL:LIVER +CREATURE:TROLL:GUT +CREATURE:TROLL:STOMACH +CREATURE:TROLL:GIZZARD +CREATURE:TROLL:PANCREAS +CREATURE:TROLL:SPLEEN +CREATURE:TROLL:KIDNEY +CREATURE:OGRE:MUSCLE +CREATURE:OGRE:EYE +CREATURE:OGRE:BRAIN +CREATURE:OGRE:LUNG +CREATURE:OGRE:HEART +CREATURE:OGRE:LIVER +CREATURE:OGRE:GUT +CREATURE:OGRE:STOMACH +CREATURE:OGRE:GIZZARD +CREATURE:OGRE:PANCREAS +CREATURE:OGRE:SPLEEN +CREATURE:OGRE:KIDNEY +CREATURE:UNICORN:MUSCLE +CREATURE:UNICORN:EYE +CREATURE:UNICORN:BRAIN +CREATURE:UNICORN:LUNG +CREATURE:UNICORN:HEART +CREATURE:UNICORN:LIVER +CREATURE:UNICORN:GUT +CREATURE:UNICORN:STOMACH +CREATURE:UNICORN:GIZZARD +CREATURE:UNICORN:PANCREAS +CREATURE:UNICORN:SPLEEN +CREATURE:UNICORN:KIDNEY +CREATURE:DRAGON:MUSCLE +CREATURE:DRAGON:EYE +CREATURE:DRAGON:BRAIN +CREATURE:DRAGON:LUNG +CREATURE:DRAGON:HEART +CREATURE:DRAGON:LIVER +CREATURE:DRAGON:GUT +CREATURE:DRAGON:STOMACH +CREATURE:DRAGON:GIZZARD +CREATURE:DRAGON:PANCREAS +CREATURE:DRAGON:SPLEEN +CREATURE:DRAGON:KIDNEY +CREATURE:SATYR:MUSCLE +CREATURE:SATYR:EYE +CREATURE:SATYR:BRAIN +CREATURE:SATYR:LUNG +CREATURE:SATYR:HEART +CREATURE:SATYR:LIVER +CREATURE:SATYR:GUT +CREATURE:SATYR:STOMACH +CREATURE:SATYR:GIZZARD +CREATURE:SATYR:PANCREAS +CREATURE:SATYR:SPLEEN +CREATURE:SATYR:KIDNEY +CREATURE:GIANT:MUSCLE +CREATURE:GIANT:EYE +CREATURE:GIANT:BRAIN +CREATURE:GIANT:LUNG +CREATURE:GIANT:HEART +CREATURE:GIANT:LIVER +CREATURE:GIANT:GUT +CREATURE:GIANT:STOMACH +CREATURE:GIANT:GIZZARD +CREATURE:GIANT:PANCREAS +CREATURE:GIANT:SPLEEN +CREATURE:GIANT:KIDNEY +CREATURE:CYCLOPS:MUSCLE +CREATURE:CYCLOPS:EYE +CREATURE:CYCLOPS:BRAIN +CREATURE:CYCLOPS:LUNG +CREATURE:CYCLOPS:HEART +CREATURE:CYCLOPS:LIVER +CREATURE:CYCLOPS:GUT +CREATURE:CYCLOPS:STOMACH +CREATURE:CYCLOPS:GIZZARD +CREATURE:CYCLOPS:PANCREAS +CREATURE:CYCLOPS:SPLEEN +CREATURE:CYCLOPS:KIDNEY +CREATURE:ETTIN:MUSCLE +CREATURE:ETTIN:EYE +CREATURE:ETTIN:BRAIN +CREATURE:ETTIN:LUNG +CREATURE:ETTIN:HEART +CREATURE:ETTIN:LIVER +CREATURE:ETTIN:GUT +CREATURE:ETTIN:STOMACH +CREATURE:ETTIN:GIZZARD +CREATURE:ETTIN:PANCREAS +CREATURE:ETTIN:SPLEEN +CREATURE:ETTIN:KIDNEY +CREATURE:MINOTAUR:MUSCLE +CREATURE:MINOTAUR:EYE +CREATURE:MINOTAUR:BRAIN +CREATURE:MINOTAUR:LUNG +CREATURE:MINOTAUR:HEART +CREATURE:MINOTAUR:LIVER +CREATURE:MINOTAUR:GUT +CREATURE:MINOTAUR:STOMACH +CREATURE:MINOTAUR:GIZZARD +CREATURE:MINOTAUR:PANCREAS +CREATURE:MINOTAUR:SPLEEN +CREATURE:MINOTAUR:KIDNEY +CREATURE:YETI:MUSCLE +CREATURE:YETI:EYE +CREATURE:YETI:BRAIN +CREATURE:YETI:LUNG +CREATURE:YETI:HEART +CREATURE:YETI:LIVER +CREATURE:YETI:GUT +CREATURE:YETI:STOMACH +CREATURE:YETI:GIZZARD +CREATURE:YETI:PANCREAS +CREATURE:YETI:SPLEEN +CREATURE:YETI:KIDNEY +CREATURE:SASQUATCH:MUSCLE +CREATURE:SASQUATCH:EYE +CREATURE:SASQUATCH:BRAIN +CREATURE:SASQUATCH:LUNG +CREATURE:SASQUATCH:HEART +CREATURE:SASQUATCH:LIVER +CREATURE:SASQUATCH:GUT +CREATURE:SASQUATCH:STOMACH +CREATURE:SASQUATCH:GIZZARD +CREATURE:SASQUATCH:PANCREAS +CREATURE:SASQUATCH:SPLEEN +CREATURE:SASQUATCH:KIDNEY +CREATURE:BLIZZARD_MAN:MUSCLE +CREATURE:BLIZZARD_MAN:EYE +CREATURE:BLIZZARD_MAN:BRAIN +CREATURE:BLIZZARD_MAN:LUNG +CREATURE:BLIZZARD_MAN:HEART +CREATURE:BLIZZARD_MAN:LIVER +CREATURE:BLIZZARD_MAN:GUT +CREATURE:BLIZZARD_MAN:STOMACH +CREATURE:BLIZZARD_MAN:GIZZARD +CREATURE:BLIZZARD_MAN:PANCREAS +CREATURE:BLIZZARD_MAN:SPLEEN +CREATURE:BLIZZARD_MAN:KIDNEY +CREATURE:WOLF_ICE:MUSCLE +CREATURE:WOLF_ICE:EYE +CREATURE:WOLF_ICE:BRAIN +CREATURE:WOLF_ICE:LUNG +CREATURE:WOLF_ICE:HEART +CREATURE:WOLF_ICE:LIVER +CREATURE:WOLF_ICE:GUT +CREATURE:WOLF_ICE:STOMACH +CREATURE:WOLF_ICE:GIZZARD +CREATURE:WOLF_ICE:PANCREAS +CREATURE:WOLF_ICE:SPLEEN +CREATURE:WOLF_ICE:KIDNEY +CREATURE:FAIRY:MUSCLE +CREATURE:FAIRY:EYE +CREATURE:FAIRY:BRAIN +CREATURE:FAIRY:LUNG +CREATURE:FAIRY:HEART +CREATURE:FAIRY:LIVER +CREATURE:FAIRY:GUT +CREATURE:FAIRY:STOMACH +CREATURE:FAIRY:GIZZARD +CREATURE:FAIRY:PANCREAS +CREATURE:FAIRY:SPLEEN +CREATURE:FAIRY:KIDNEY +CREATURE:PIXIE:MUSCLE +CREATURE:PIXIE:EYE +CREATURE:PIXIE:BRAIN +CREATURE:PIXIE:LUNG +CREATURE:PIXIE:HEART +CREATURE:PIXIE:LIVER +CREATURE:PIXIE:GUT +CREATURE:PIXIE:STOMACH +CREATURE:PIXIE:GIZZARD +CREATURE:PIXIE:PANCREAS +CREATURE:PIXIE:SPLEEN +CREATURE:PIXIE:KIDNEY +CREATURE:BEAK_DOG:MUSCLE +CREATURE:BEAK_DOG:EYE +CREATURE:BEAK_DOG:BRAIN +CREATURE:BEAK_DOG:LUNG +CREATURE:BEAK_DOG:HEART +CREATURE:BEAK_DOG:LIVER +CREATURE:BEAK_DOG:GUT +CREATURE:BEAK_DOG:STOMACH +CREATURE:BEAK_DOG:GIZZARD +CREATURE:BEAK_DOG:PANCREAS +CREATURE:BEAK_DOG:SPLEEN +CREATURE:BEAK_DOG:KIDNEY +CREATURE:GRIMELING:MUSCLE +CREATURE:GRIMELING:EYE +CREATURE:GRIMELING:BRAIN +CREATURE:GRIMELING:LUNG +CREATURE:GRIMELING:HEART +CREATURE:GRIMELING:LIVER +CREATURE:GRIMELING:GUT +CREATURE:GRIMELING:STOMACH +CREATURE:GRIMELING:GIZZARD +CREATURE:GRIMELING:PANCREAS +CREATURE:GRIMELING:SPLEEN +CREATURE:GRIMELING:KIDNEY +CREATURE:BLENDEC_FOUL:MUSCLE +CREATURE:BLENDEC_FOUL:EYE +CREATURE:BLENDEC_FOUL:BRAIN +CREATURE:BLENDEC_FOUL:LUNG +CREATURE:BLENDEC_FOUL:HEART +CREATURE:BLENDEC_FOUL:LIVER +CREATURE:BLENDEC_FOUL:GUT +CREATURE:BLENDEC_FOUL:STOMACH +CREATURE:BLENDEC_FOUL:GIZZARD +CREATURE:BLENDEC_FOUL:PANCREAS +CREATURE:BLENDEC_FOUL:SPLEEN +CREATURE:BLENDEC_FOUL:KIDNEY +CREATURE:STRANGLER:MUSCLE +CREATURE:STRANGLER:EYE +CREATURE:STRANGLER:BRAIN +CREATURE:STRANGLER:LUNG +CREATURE:STRANGLER:HEART +CREATURE:STRANGLER:LIVER +CREATURE:STRANGLER:GUT +CREATURE:STRANGLER:STOMACH +CREATURE:STRANGLER:GIZZARD +CREATURE:STRANGLER:PANCREAS +CREATURE:STRANGLER:SPLEEN +CREATURE:STRANGLER:KIDNEY +CREATURE:NIGHTWING:MUSCLE +CREATURE:NIGHTWING:EYE +CREATURE:NIGHTWING:BRAIN +CREATURE:NIGHTWING:LUNG +CREATURE:NIGHTWING:HEART +CREATURE:NIGHTWING:LIVER +CREATURE:NIGHTWING:GUT +CREATURE:NIGHTWING:STOMACH +CREATURE:NIGHTWING:GIZZARD +CREATURE:NIGHTWING:PANCREAS +CREATURE:NIGHTWING:SPLEEN +CREATURE:NIGHTWING:KIDNEY +CREATURE:HARPY:MUSCLE +CREATURE:HARPY:EYE +CREATURE:HARPY:BRAIN +CREATURE:HARPY:LUNG +CREATURE:HARPY:HEART +CREATURE:HARPY:LIVER +CREATURE:HARPY:GUT +CREATURE:HARPY:STOMACH +CREATURE:HARPY:GIZZARD +CREATURE:HARPY:PANCREAS +CREATURE:HARPY:SPLEEN +CREATURE:HARPY:KIDNEY +CREATURE:HYDRA:MUSCLE +CREATURE:HYDRA:EYE +CREATURE:HYDRA:BRAIN +CREATURE:HYDRA:LUNG +CREATURE:HYDRA:HEART +CREATURE:HYDRA:LIVER +CREATURE:HYDRA:GUT +CREATURE:HYDRA:STOMACH +CREATURE:HYDRA:GIZZARD +CREATURE:HYDRA:PANCREAS +CREATURE:HYDRA:SPLEEN +CREATURE:HYDRA:KIDNEY +CREATURE:MERPERSON:MUSCLE +CREATURE:MERPERSON:EYE +CREATURE:MERPERSON:BRAIN +CREATURE:MERPERSON:LUNG +CREATURE:MERPERSON:HEART +CREATURE:MERPERSON:LIVER +CREATURE:MERPERSON:GUT +CREATURE:MERPERSON:STOMACH +CREATURE:MERPERSON:GIZZARD +CREATURE:MERPERSON:PANCREAS +CREATURE:MERPERSON:SPLEEN +CREATURE:MERPERSON:KIDNEY +CREATURE:SEA_SERPENT:MUSCLE +CREATURE:SEA_SERPENT:EYE +CREATURE:SEA_SERPENT:BRAIN +CREATURE:SEA_SERPENT:LUNG +CREATURE:SEA_SERPENT:HEART +CREATURE:SEA_SERPENT:LIVER +CREATURE:SEA_SERPENT:GUT +CREATURE:SEA_SERPENT:STOMACH +CREATURE:SEA_SERPENT:GIZZARD +CREATURE:SEA_SERPENT:PANCREAS +CREATURE:SEA_SERPENT:SPLEEN +CREATURE:SEA_SERPENT:KIDNEY +CREATURE:SEA_MONSTER:MUSCLE +CREATURE:SEA_MONSTER:EYE +CREATURE:SEA_MONSTER:BRAIN +CREATURE:SEA_MONSTER:LUNG +CREATURE:SEA_MONSTER:HEART +CREATURE:SEA_MONSTER:LIVER +CREATURE:SEA_MONSTER:GUT +CREATURE:SEA_MONSTER:STOMACH +CREATURE:SEA_MONSTER:GIZZARD +CREATURE:SEA_MONSTER:PANCREAS +CREATURE:SEA_MONSTER:SPLEEN +CREATURE:SEA_MONSTER:KIDNEY +CREATURE:BIRD_ROC:MUSCLE +CREATURE:BIRD_ROC:EYE +CREATURE:BIRD_ROC:BRAIN +CREATURE:BIRD_ROC:LUNG +CREATURE:BIRD_ROC:HEART +CREATURE:BIRD_ROC:LIVER +CREATURE:BIRD_ROC:GUT +CREATURE:BIRD_ROC:STOMACH +CREATURE:BIRD_ROC:GIZZARD +CREATURE:BIRD_ROC:PANCREAS +CREATURE:BIRD_ROC:SPLEEN +CREATURE:BIRD_ROC:KIDNEY +CREATURE:CROCODILE_CAVE:MUSCLE +CREATURE:CROCODILE_CAVE:EYE +CREATURE:CROCODILE_CAVE:BRAIN +CREATURE:CROCODILE_CAVE:LUNG +CREATURE:CROCODILE_CAVE:HEART +CREATURE:CROCODILE_CAVE:LIVER +CREATURE:CROCODILE_CAVE:GUT +CREATURE:CROCODILE_CAVE:STOMACH +CREATURE:CROCODILE_CAVE:GIZZARD + CREATURE:CROCODILE_CAVE:PANCREAS +CREATURE:CROCODILE_CAVE:SPLEEN +CREATURE:CROCODILE_CAVE:KIDNEY +CREATURE:TOAD_GIANT_CAVE:MUSCLE +CREATURE:TOAD_GIANT_CAVE:EYE +CREATURE:TOAD_GIANT_CAVE:BRAIN +CREATURE:TOAD_GIANT_CAVE:LUNG +CREATURE:TOAD_GIANT_CAVE:HEART +CREATURE:TOAD_GIANT_CAVE:LIVER +CREATURE:TOAD_GIANT_CAVE:GUT + CREATURE:TOAD_GIANT_CAVE:STOMACH + CREATURE:TOAD_GIANT_CAVE:GIZZARD +!CREATURE:TOAD_GIANT_CAVE:PANCREAS +CREATURE:TOAD_GIANT_CAVE:SPLEEN +CREATURE:TOAD_GIANT_CAVE:KIDNEY +CREATURE:OLM_GIANT:MUSCLE +CREATURE:OLM_GIANT:EYE +CREATURE:OLM_GIANT:BRAIN +CREATURE:OLM_GIANT:LUNG +CREATURE:OLM_GIANT:HEART +CREATURE:OLM_GIANT:LIVER +CREATURE:OLM_GIANT:GUT +CREATURE:OLM_GIANT:STOMACH +CREATURE:OLM_GIANT:GIZZARD +CREATURE:OLM_GIANT:PANCREAS +CREATURE:OLM_GIANT:SPLEEN +CREATURE:OLM_GIANT:KIDNEY +CREATURE:BAT_GIANT:MUSCLE +CREATURE:BAT_GIANT:EYE +CREATURE:BAT_GIANT:BRAIN +CREATURE:BAT_GIANT:LUNG +CREATURE:BAT_GIANT:HEART +CREATURE:BAT_GIANT:LIVER +CREATURE:BAT_GIANT:GUT +CREATURE:BAT_GIANT:STOMACH +CREATURE:BAT_GIANT:GIZZARD +CREATURE:BAT_GIANT:PANCREAS +CREATURE:BAT_GIANT:SPLEEN +CREATURE:BAT_GIANT:KIDNEY +CREATURE:RAT_GIANT:MUSCLE +CREATURE:RAT_GIANT:EYE +CREATURE:RAT_GIANT:BRAIN +CREATURE:RAT_GIANT:LUNG +CREATURE:RAT_GIANT:HEART +CREATURE:RAT_GIANT:LIVER +CREATURE:RAT_GIANT:GUT +CREATURE:RAT_GIANT:STOMACH +CREATURE:RAT_GIANT:GIZZARD +CREATURE:RAT_GIANT:PANCREAS +CREATURE:RAT_GIANT:SPLEEN +CREATURE:RAT_GIANT:KIDNEY +CREATURE:RAT_LARGE:MUSCLE +CREATURE:RAT_LARGE:EYE +CREATURE:RAT_LARGE:BRAIN +CREATURE:RAT_LARGE:LUNG +CREATURE:RAT_LARGE:HEART +CREATURE:RAT_LARGE:LIVER +CREATURE:RAT_LARGE:GUT +CREATURE:RAT_LARGE:STOMACH +CREATURE:RAT_LARGE:GIZZARD +CREATURE:RAT_LARGE:PANCREAS +CREATURE:RAT_LARGE:SPLEEN +CREATURE:RAT_LARGE:KIDNEY +CREATURE:MOLE_DOG_NAKED:MUSCLE +CREATURE:MOLE_DOG_NAKED:EYE +CREATURE:MOLE_DOG_NAKED:BRAIN +CREATURE:MOLE_DOG_NAKED:LUNG +CREATURE:MOLE_DOG_NAKED:HEART +CREATURE:MOLE_DOG_NAKED:LIVER +CREATURE:MOLE_DOG_NAKED:GUT +CREATURE:MOLE_DOG_NAKED:STOMACH +CREATURE:MOLE_DOG_NAKED:GIZZARD + CREATURE:MOLE_DOG_NAKED:PANCREAS +CREATURE:MOLE_DOG_NAKED:SPLEEN +CREATURE:MOLE_DOG_NAKED:KIDNEY +CREATURE:TROGLODYTE:MUSCLE +CREATURE:TROGLODYTE:EYE +CREATURE:TROGLODYTE:BRAIN +CREATURE:TROGLODYTE:LUNG +CREATURE:TROGLODYTE:HEART +CREATURE:TROGLODYTE:LIVER +CREATURE:TROGLODYTE:GUT +CREATURE:TROGLODYTE:STOMACH +CREATURE:TROGLODYTE:GIZZARD +CREATURE:TROGLODYTE:PANCREAS +CREATURE:TROGLODYTE:SPLEEN +CREATURE:TROGLODYTE:KIDNEY +CREATURE:MOLE_GIANT:MUSCLE +CREATURE:MOLE_GIANT:EYE +CREATURE:MOLE_GIANT:BRAIN +CREATURE:MOLE_GIANT:LUNG +CREATURE:MOLE_GIANT:HEART +CREATURE:MOLE_GIANT:LIVER +CREATURE:MOLE_GIANT:GUT +CREATURE:MOLE_GIANT:STOMACH +CREATURE:MOLE_GIANT:GIZZARD +CREATURE:MOLE_GIANT:PANCREAS +CREATURE:MOLE_GIANT:SPLEEN +CREATURE:MOLE_GIANT:KIDNEY +CREATURE:IMP_FIRE:MUSCLE +CREATURE:IMP_FIRE:EYE +CREATURE:IMP_FIRE:BRAIN +CREATURE:IMP_FIRE:LUNG +CREATURE:IMP_FIRE:HEART +CREATURE:IMP_FIRE:LIVER +CREATURE:IMP_FIRE:GUT +CREATURE:IMP_FIRE:STOMACH +CREATURE:IMP_FIRE:GIZZARD +CREATURE:IMP_FIRE:PANCREAS +CREATURE:IMP_FIRE:SPLEEN +CREATURE:IMP_FIRE:KIDNEY +!CREATURE:SPIDER_CAVE_GIANT:MUSCLE +CREATURE:SPIDER_CAVE_GIANT:EYE + CREATURE:SPIDER_CAVE_GIANT:BRAIN +CREATURE:SPIDER_CAVE_GIANT:LUNG + CREATURE:SPIDER_CAVE_GIANT:HEART + CREATURE:SPIDER_CAVE_GIANT:LIVER +CREATURE:SPIDER_CAVE_GIANT:GUT +"CREATURE:SPIDER_CAVE_GIANT:STOMACH +"CREATURE:SPIDER_CAVE_GIANT:GIZZARD +#CREATURE:SPIDER_CAVE_GIANT:PANCREAS +!CREATURE:SPIDER_CAVE_GIANT:SPLEEN +!CREATURE:SPIDER_CAVE_GIANT:KIDNEY +CREATURE:SPIDER_CAVE:MUSCLE +CREATURE:SPIDER_CAVE:EYE +CREATURE:SPIDER_CAVE:BRAIN +CREATURE:SPIDER_CAVE:LUNG +CREATURE:SPIDER_CAVE:HEART +CREATURE:SPIDER_CAVE:LIVER +CREATURE:SPIDER_CAVE:GUT +CREATURE:SPIDER_CAVE:STOMACH +CREATURE:SPIDER_CAVE:GIZZARD +CREATURE:SPIDER_CAVE:PANCREAS +CREATURE:SPIDER_CAVE:SPLEEN +CREATURE:SPIDER_CAVE:KIDNEY +CREATURE:FISH_CAVE:MUSCLE +CREATURE:FISH_CAVE:BRAIN +CREATURE:FISH_CAVE:LUNG +CREATURE:FISH_CAVE:HEART +CREATURE:FISH_CAVE:LIVER +CREATURE:FISH_CAVE:GUT +CREATURE:FISH_CAVE:STOMACH +CREATURE:FISH_CAVE:GIZZARD +CREATURE:FISH_CAVE:PANCREAS +CREATURE:FISH_CAVE:SPLEEN +CREATURE:FISH_CAVE:KIDNEY +CREATURE:CAVE_FISH_MAN:MUSCLE +CREATURE:CAVE_FISH_MAN:BRAIN +CREATURE:CAVE_FISH_MAN:LUNG +CREATURE:CAVE_FISH_MAN:HEART +CREATURE:CAVE_FISH_MAN:LIVER +CREATURE:CAVE_FISH_MAN:GUT +CREATURE:CAVE_FISH_MAN:STOMACH +CREATURE:CAVE_FISH_MAN:GIZZARD +CREATURE:CAVE_FISH_MAN:PANCREAS +CREATURE:CAVE_FISH_MAN:SPLEEN +CREATURE:CAVE_FISH_MAN:KIDNEY +CREATURE:LOBSTER_CAVE:MUSCLE +CREATURE:LOBSTER_CAVE:EYE +CREATURE:LOBSTER_CAVE:BRAIN +CREATURE:LOBSTER_CAVE:LUNG +CREATURE:LOBSTER_CAVE:HEART +CREATURE:LOBSTER_CAVE:LIVER +CREATURE:LOBSTER_CAVE:GUT +CREATURE:LOBSTER_CAVE:STOMACH +CREATURE:LOBSTER_CAVE:GIZZARD +CREATURE:LOBSTER_CAVE:PANCREAS +CREATURE:LOBSTER_CAVE:SPLEEN +CREATURE:LOBSTER_CAVE:KIDNEY +CREATURE:OLM:MUSCLE +CREATURE:OLM:EYE +CREATURE:OLM:BRAIN +CREATURE:OLM:LUNG +CREATURE:OLM:HEART +CREATURE:OLM:LIVER +CREATURE:OLM:GUT +CREATURE:OLM:STOMACH +CREATURE:OLM:GIZZARD +CREATURE:OLM:PANCREAS +CREATURE:OLM:SPLEEN +CREATURE:OLM:KIDNEY +CREATURE:OLM_MAN:MUSCLE +CREATURE:OLM_MAN:EYE +CREATURE:OLM_MAN:BRAIN +CREATURE:OLM_MAN:LUNG +CREATURE:OLM_MAN:HEART +CREATURE:OLM_MAN:LIVER +CREATURE:OLM_MAN:GUT +CREATURE:OLM_MAN:STOMACH +CREATURE:OLM_MAN:GIZZARD +CREATURE:OLM_MAN:PANCREAS +CREATURE:OLM_MAN:SPLEEN +CREATURE:OLM_MAN:KIDNEY +CREATURE:BAT:MUSCLE +CREATURE:BAT:EYE +CREATURE:BAT:BRAIN +CREATURE:BAT:LUNG +CREATURE:BAT:HEART +CREATURE:BAT:LIVER +CREATURE:BAT:GUT +CREATURE:BAT:STOMACH +CREATURE:BAT:GIZZARD +CREATURE:BAT:PANCREAS +CREATURE:BAT:SPLEEN +CREATURE:BAT:KIDNEY +CREATURE:BAT_MAN:MUSCLE +CREATURE:BAT_MAN:EYE +CREATURE:BAT_MAN:BRAIN +CREATURE:BAT_MAN:LUNG +CREATURE:BAT_MAN:HEART +CREATURE:BAT_MAN:LIVER +CREATURE:BAT_MAN:GUT +CREATURE:BAT_MAN:STOMACH +CREATURE:BAT_MAN:GIZZARD +CREATURE:BAT_MAN:PANCREAS +CREATURE:BAT_MAN:SPLEEN +CREATURE:BAT_MAN:KIDNEY +CREATURE:MAGGOT_PURRING:MUSCLE +CREATURE:MAGGOT_PURRING:EYE +CREATURE:MAGGOT_PURRING:BRAIN +CREATURE:MAGGOT_PURRING:LUNG +CREATURE:MAGGOT_PURRING:HEART +CREATURE:MAGGOT_PURRING:LIVER +CREATURE:MAGGOT_PURRING:GUT +CREATURE:MAGGOT_PURRING:STOMACH +CREATURE:MAGGOT_PURRING:GIZZARD + CREATURE:MAGGOT_PURRING:PANCREAS +CREATURE:MAGGOT_PURRING:SPLEEN +CREATURE:MAGGOT_PURRING:KIDNEY +!CREATURE:BIRD_SWALLOW_CAVE:MUSCLE +CREATURE:BIRD_SWALLOW_CAVE:EYE + CREATURE:BIRD_SWALLOW_CAVE:BRAIN +CREATURE:BIRD_SWALLOW_CAVE:LUNG + CREATURE:BIRD_SWALLOW_CAVE:HEART + CREATURE:BIRD_SWALLOW_CAVE:LIVER +CREATURE:BIRD_SWALLOW_CAVE:GUT +"CREATURE:BIRD_SWALLOW_CAVE:STOMACH +"CREATURE:BIRD_SWALLOW_CAVE:GIZZARD +#CREATURE:BIRD_SWALLOW_CAVE:PANCREAS +!CREATURE:BIRD_SWALLOW_CAVE:SPLEEN +!CREATURE:BIRD_SWALLOW_CAVE:KIDNEY + CREATURE:CAVE_SWALLOW_MAN:MUSCLE +CREATURE:CAVE_SWALLOW_MAN:EYE +CREATURE:CAVE_SWALLOW_MAN:BRAIN +CREATURE:CAVE_SWALLOW_MAN:LUNG +CREATURE:CAVE_SWALLOW_MAN:HEART +CREATURE:CAVE_SWALLOW_MAN:LIVER +CREATURE:CAVE_SWALLOW_MAN:GUT +!CREATURE:CAVE_SWALLOW_MAN:STOMACH +!CREATURE:CAVE_SWALLOW_MAN:GIZZARD +"CREATURE:CAVE_SWALLOW_MAN:PANCREAS + CREATURE:CAVE_SWALLOW_MAN:SPLEEN + CREATURE:CAVE_SWALLOW_MAN:KIDNEY +'CREATURE:BIRD_SWALLOW_CAVE_GIANT:MUSCLE +$CREATURE:BIRD_SWALLOW_CAVE_GIANT:EYE +&CREATURE:BIRD_SWALLOW_CAVE_GIANT:BRAIN +%CREATURE:BIRD_SWALLOW_CAVE_GIANT:LUNG +&CREATURE:BIRD_SWALLOW_CAVE_GIANT:HEART +&CREATURE:BIRD_SWALLOW_CAVE_GIANT:LIVER +$CREATURE:BIRD_SWALLOW_CAVE_GIANT:GUT +(CREATURE:BIRD_SWALLOW_CAVE_GIANT:STOMACH +(CREATURE:BIRD_SWALLOW_CAVE_GIANT:GIZZARD +)CREATURE:BIRD_SWALLOW_CAVE_GIANT:PANCREAS +'CREATURE:BIRD_SWALLOW_CAVE_GIANT:SPLEEN +'CREATURE:BIRD_SWALLOW_CAVE_GIANT:KIDNEY +CREATURE:AMPHIBIAN_MAN:MUSCLE +CREATURE:AMPHIBIAN_MAN:EYE +CREATURE:AMPHIBIAN_MAN:BRAIN +CREATURE:AMPHIBIAN_MAN:LUNG +CREATURE:AMPHIBIAN_MAN:HEART +CREATURE:AMPHIBIAN_MAN:LIVER +CREATURE:AMPHIBIAN_MAN:GUT +CREATURE:AMPHIBIAN_MAN:STOMACH +CREATURE:AMPHIBIAN_MAN:GIZZARD +CREATURE:AMPHIBIAN_MAN:PANCREAS +CREATURE:AMPHIBIAN_MAN:SPLEEN +CREATURE:AMPHIBIAN_MAN:KIDNEY +CREATURE:REPTILE_MAN:MUSCLE +CREATURE:REPTILE_MAN:EYE +CREATURE:REPTILE_MAN:BRAIN +CREATURE:REPTILE_MAN:LUNG +CREATURE:REPTILE_MAN:HEART +CREATURE:REPTILE_MAN:LIVER +CREATURE:REPTILE_MAN:GUT +CREATURE:REPTILE_MAN:STOMACH +CREATURE:REPTILE_MAN:GIZZARD +CREATURE:REPTILE_MAN:PANCREAS +CREATURE:REPTILE_MAN:SPLEEN +CREATURE:REPTILE_MAN:KIDNEY +CREATURE:SERPENT_MAN:MUSCLE +CREATURE:SERPENT_MAN:EYE +CREATURE:SERPENT_MAN:BRAIN +CREATURE:SERPENT_MAN:LUNG +CREATURE:SERPENT_MAN:HEART +CREATURE:SERPENT_MAN:LIVER +CREATURE:SERPENT_MAN:GUT +CREATURE:SERPENT_MAN:STOMACH +CREATURE:SERPENT_MAN:GIZZARD +CREATURE:SERPENT_MAN:PANCREAS +CREATURE:SERPENT_MAN:SPLEEN +CREATURE:SERPENT_MAN:KIDNEY +CREATURE:ANT_MAN:MUSCLE +CREATURE:ANT_MAN:EYE +CREATURE:ANT_MAN:BRAIN +CREATURE:ANT_MAN:LUNG +CREATURE:ANT_MAN:HEART +CREATURE:ANT_MAN:LIVER +CREATURE:ANT_MAN:GUT +CREATURE:ANT_MAN:STOMACH +CREATURE:ANT_MAN:GIZZARD +CREATURE:ANT_MAN:PANCREAS +CREATURE:ANT_MAN:SPLEEN +CREATURE:ANT_MAN:KIDNEY +CREATURE:RODENT MAN:MUSCLE +CREATURE:RODENT MAN:EYE +CREATURE:RODENT MAN:BRAIN +CREATURE:RODENT MAN:LUNG +CREATURE:RODENT MAN:HEART +CREATURE:RODENT MAN:LIVER +CREATURE:RODENT MAN:GUT +CREATURE:RODENT MAN:STOMACH +CREATURE:RODENT MAN:GIZZARD +CREATURE:RODENT MAN:PANCREAS +CREATURE:RODENT MAN:SPLEEN +CREATURE:RODENT MAN:KIDNEY +CREATURE:WILD_BOAR:MUSCLE +CREATURE:WILD_BOAR:EYE +CREATURE:WILD_BOAR:BRAIN +CREATURE:WILD_BOAR:LUNG +CREATURE:WILD_BOAR:HEART +CREATURE:WILD_BOAR:LIVER +CREATURE:WILD_BOAR:GUT +CREATURE:WILD_BOAR:STOMACH +CREATURE:WILD_BOAR:GIZZARD +CREATURE:WILD_BOAR:PANCREAS +CREATURE:WILD_BOAR:SPLEEN +CREATURE:WILD_BOAR:KIDNEY +CREATURE:WILD_BOAR_MAN:MUSCLE +CREATURE:WILD_BOAR_MAN:EYE +CREATURE:WILD_BOAR_MAN:BRAIN +CREATURE:WILD_BOAR_MAN:LUNG +CREATURE:WILD_BOAR_MAN:HEART +CREATURE:WILD_BOAR_MAN:LIVER +CREATURE:WILD_BOAR_MAN:GUT +CREATURE:WILD_BOAR_MAN:STOMACH +CREATURE:WILD_BOAR_MAN:GIZZARD +CREATURE:WILD_BOAR_MAN:PANCREAS +CREATURE:WILD_BOAR_MAN:SPLEEN +CREATURE:WILD_BOAR_MAN:KIDNEY +CREATURE:GIANT_WILD_BOAR:MUSCLE +CREATURE:GIANT_WILD_BOAR:EYE +CREATURE:GIANT_WILD_BOAR:BRAIN +CREATURE:GIANT_WILD_BOAR:LUNG +CREATURE:GIANT_WILD_BOAR:HEART +CREATURE:GIANT_WILD_BOAR:LIVER +CREATURE:GIANT_WILD_BOAR:GUT + CREATURE:GIANT_WILD_BOAR:STOMACH + CREATURE:GIANT_WILD_BOAR:GIZZARD +!CREATURE:GIANT_WILD_BOAR:PANCREAS +CREATURE:GIANT_WILD_BOAR:SPLEEN +CREATURE:GIANT_WILD_BOAR:KIDNEY +CREATURE:COYOTE:MUSCLE +CREATURE:COYOTE:EYE +CREATURE:COYOTE:BRAIN +CREATURE:COYOTE:LUNG +CREATURE:COYOTE:HEART +CREATURE:COYOTE:LIVER +CREATURE:COYOTE:GUT +CREATURE:COYOTE:STOMACH +CREATURE:COYOTE:GIZZARD +CREATURE:COYOTE:PANCREAS +CREATURE:COYOTE:SPLEEN +CREATURE:COYOTE:KIDNEY +CREATURE:COYOTE_MAN:MUSCLE +CREATURE:COYOTE_MAN:EYE +CREATURE:COYOTE_MAN:BRAIN +CREATURE:COYOTE_MAN:LUNG +CREATURE:COYOTE_MAN:HEART +CREATURE:COYOTE_MAN:LIVER +CREATURE:COYOTE_MAN:GUT +CREATURE:COYOTE_MAN:STOMACH +CREATURE:COYOTE_MAN:GIZZARD +CREATURE:COYOTE_MAN:PANCREAS +CREATURE:COYOTE_MAN:SPLEEN +CREATURE:COYOTE_MAN:KIDNEY +CREATURE:GIANT_COYOTE:MUSCLE +CREATURE:GIANT_COYOTE:EYE +CREATURE:GIANT_COYOTE:BRAIN +CREATURE:GIANT_COYOTE:LUNG +CREATURE:GIANT_COYOTE:HEART +CREATURE:GIANT_COYOTE:LIVER +CREATURE:GIANT_COYOTE:GUT +CREATURE:GIANT_COYOTE:STOMACH +CREATURE:GIANT_COYOTE:GIZZARD +CREATURE:GIANT_COYOTE:PANCREAS +CREATURE:GIANT_COYOTE:SPLEEN +CREATURE:GIANT_COYOTE:KIDNEY +CREATURE:KANGAROO:MUSCLE +CREATURE:KANGAROO:EYE +CREATURE:KANGAROO:BRAIN +CREATURE:KANGAROO:LUNG +CREATURE:KANGAROO:HEART +CREATURE:KANGAROO:LIVER +CREATURE:KANGAROO:GUT +CREATURE:KANGAROO:STOMACH +CREATURE:KANGAROO:GIZZARD +CREATURE:KANGAROO:PANCREAS +CREATURE:KANGAROO:SPLEEN +CREATURE:KANGAROO:KIDNEY +CREATURE:KANGAROO_MAN:MUSCLE +CREATURE:KANGAROO_MAN:EYE +CREATURE:KANGAROO_MAN:BRAIN +CREATURE:KANGAROO_MAN:LUNG +CREATURE:KANGAROO_MAN:HEART +CREATURE:KANGAROO_MAN:LIVER +CREATURE:KANGAROO_MAN:GUT +CREATURE:KANGAROO_MAN:STOMACH +CREATURE:KANGAROO_MAN:GIZZARD +CREATURE:KANGAROO_MAN:PANCREAS +CREATURE:KANGAROO_MAN:SPLEEN +CREATURE:KANGAROO_MAN:KIDNEY +CREATURE:GIANT_KANGAROO:MUSCLE +CREATURE:GIANT_KANGAROO:EYE +CREATURE:GIANT_KANGAROO:BRAIN +CREATURE:GIANT_KANGAROO:LUNG +CREATURE:GIANT_KANGAROO:HEART +CREATURE:GIANT_KANGAROO:LIVER +CREATURE:GIANT_KANGAROO:GUT +CREATURE:GIANT_KANGAROO:STOMACH +CREATURE:GIANT_KANGAROO:GIZZARD + CREATURE:GIANT_KANGAROO:PANCREAS +CREATURE:GIANT_KANGAROO:SPLEEN +CREATURE:GIANT_KANGAROO:KIDNEY +CREATURE:KOALA:MUSCLE +CREATURE:KOALA:EYE +CREATURE:KOALA:BRAIN +CREATURE:KOALA:LUNG +CREATURE:KOALA:HEART +CREATURE:KOALA:LIVER +CREATURE:KOALA:GUT +CREATURE:KOALA:STOMACH +CREATURE:KOALA:GIZZARD +CREATURE:KOALA:PANCREAS +CREATURE:KOALA:SPLEEN +CREATURE:KOALA:KIDNEY +CREATURE:KOALA_MAN:MUSCLE +CREATURE:KOALA_MAN:EYE +CREATURE:KOALA_MAN:BRAIN +CREATURE:KOALA_MAN:LUNG +CREATURE:KOALA_MAN:HEART +CREATURE:KOALA_MAN:LIVER +CREATURE:KOALA_MAN:GUT +CREATURE:KOALA_MAN:STOMACH +CREATURE:KOALA_MAN:GIZZARD +CREATURE:KOALA_MAN:PANCREAS +CREATURE:KOALA_MAN:SPLEEN +CREATURE:KOALA_MAN:KIDNEY +CREATURE:GIANT_KOALA:MUSCLE +CREATURE:GIANT_KOALA:EYE +CREATURE:GIANT_KOALA:BRAIN +CREATURE:GIANT_KOALA:LUNG +CREATURE:GIANT_KOALA:HEART +CREATURE:GIANT_KOALA:LIVER +CREATURE:GIANT_KOALA:GUT +CREATURE:GIANT_KOALA:STOMACH +CREATURE:GIANT_KOALA:GIZZARD +CREATURE:GIANT_KOALA:PANCREAS +CREATURE:GIANT_KOALA:SPLEEN +CREATURE:GIANT_KOALA:KIDNEY +CREATURE:ADDER:MUSCLE +CREATURE:ADDER:EYE +CREATURE:ADDER:BRAIN +CREATURE:ADDER:LUNG +CREATURE:ADDER:HEART +CREATURE:ADDER:LIVER +CREATURE:ADDER:GUT +CREATURE:ADDER:STOMACH +CREATURE:ADDER:GIZZARD +CREATURE:ADDER:PANCREAS +CREATURE:ADDER:SPLEEN +CREATURE:ADDER:KIDNEY +CREATURE:ADDER_MAN:MUSCLE +CREATURE:ADDER_MAN:EYE +CREATURE:ADDER_MAN:BRAIN +CREATURE:ADDER_MAN:LUNG +CREATURE:ADDER_MAN:HEART +CREATURE:ADDER_MAN:LIVER +CREATURE:ADDER_MAN:GUT +CREATURE:ADDER_MAN:STOMACH +CREATURE:ADDER_MAN:GIZZARD +CREATURE:ADDER_MAN:PANCREAS +CREATURE:ADDER_MAN:SPLEEN +CREATURE:ADDER_MAN:KIDNEY +CREATURE:GIANT_ADDER:MUSCLE +CREATURE:GIANT_ADDER:EYE +CREATURE:GIANT_ADDER:BRAIN +CREATURE:GIANT_ADDER:LUNG +CREATURE:GIANT_ADDER:HEART +CREATURE:GIANT_ADDER:LIVER +CREATURE:GIANT_ADDER:GUT +CREATURE:GIANT_ADDER:STOMACH +CREATURE:GIANT_ADDER:GIZZARD +CREATURE:GIANT_ADDER:PANCREAS +CREATURE:GIANT_ADDER:SPLEEN +CREATURE:GIANT_ADDER:KIDNEY +CREATURE:ECHIDNA:MUSCLE +CREATURE:ECHIDNA:EYE +CREATURE:ECHIDNA:BRAIN +CREATURE:ECHIDNA:LUNG +CREATURE:ECHIDNA:HEART +CREATURE:ECHIDNA:LIVER +CREATURE:ECHIDNA:GUT +CREATURE:ECHIDNA:STOMACH +CREATURE:ECHIDNA:GIZZARD +CREATURE:ECHIDNA:PANCREAS +CREATURE:ECHIDNA:SPLEEN +CREATURE:ECHIDNA:KIDNEY +CREATURE:ECHIDNA_MAN:MUSCLE +CREATURE:ECHIDNA_MAN:EYE +CREATURE:ECHIDNA_MAN:BRAIN +CREATURE:ECHIDNA_MAN:LUNG +CREATURE:ECHIDNA_MAN:HEART +CREATURE:ECHIDNA_MAN:LIVER +CREATURE:ECHIDNA_MAN:GUT +CREATURE:ECHIDNA_MAN:STOMACH +CREATURE:ECHIDNA_MAN:GIZZARD +CREATURE:ECHIDNA_MAN:PANCREAS +CREATURE:ECHIDNA_MAN:SPLEEN +CREATURE:ECHIDNA_MAN:KIDNEY +CREATURE:GIANT_ECHIDNA:MUSCLE +CREATURE:GIANT_ECHIDNA:EYE +CREATURE:GIANT_ECHIDNA:BRAIN +CREATURE:GIANT_ECHIDNA:LUNG +CREATURE:GIANT_ECHIDNA:HEART +CREATURE:GIANT_ECHIDNA:LIVER +CREATURE:GIANT_ECHIDNA:GUT +CREATURE:GIANT_ECHIDNA:STOMACH +CREATURE:GIANT_ECHIDNA:GIZZARD +CREATURE:GIANT_ECHIDNA:PANCREAS +CREATURE:GIANT_ECHIDNA:SPLEEN +CREATURE:GIANT_ECHIDNA:KIDNEY +CREATURE:PORCUPINE:MUSCLE +CREATURE:PORCUPINE:EYE +CREATURE:PORCUPINE:BRAIN +CREATURE:PORCUPINE:LUNG +CREATURE:PORCUPINE:HEART +CREATURE:PORCUPINE:LIVER +CREATURE:PORCUPINE:GUT +CREATURE:PORCUPINE:STOMACH +CREATURE:PORCUPINE:GIZZARD +CREATURE:PORCUPINE:PANCREAS +CREATURE:PORCUPINE:SPLEEN +CREATURE:PORCUPINE:KIDNEY +CREATURE:PORCUPINE_MAN:MUSCLE +CREATURE:PORCUPINE_MAN:EYE +CREATURE:PORCUPINE_MAN:BRAIN +CREATURE:PORCUPINE_MAN:LUNG +CREATURE:PORCUPINE_MAN:HEART +CREATURE:PORCUPINE_MAN:LIVER +CREATURE:PORCUPINE_MAN:GUT +CREATURE:PORCUPINE_MAN:STOMACH +CREATURE:PORCUPINE_MAN:GIZZARD +CREATURE:PORCUPINE_MAN:PANCREAS +CREATURE:PORCUPINE_MAN:SPLEEN +CREATURE:PORCUPINE_MAN:KIDNEY +CREATURE:GIANT_PORCUPINE:MUSCLE +CREATURE:GIANT_PORCUPINE:EYE +CREATURE:GIANT_PORCUPINE:BRAIN +CREATURE:GIANT_PORCUPINE:LUNG +CREATURE:GIANT_PORCUPINE:HEART +CREATURE:GIANT_PORCUPINE:LIVER +CREATURE:GIANT_PORCUPINE:GUT + CREATURE:GIANT_PORCUPINE:STOMACH + CREATURE:GIANT_PORCUPINE:GIZZARD +!CREATURE:GIANT_PORCUPINE:PANCREAS +CREATURE:GIANT_PORCUPINE:SPLEEN +CREATURE:GIANT_PORCUPINE:KIDNEY +CREATURE:KINGSNAKE:MUSCLE +CREATURE:KINGSNAKE:EYE +CREATURE:KINGSNAKE:BRAIN +CREATURE:KINGSNAKE:LUNG +CREATURE:KINGSNAKE:HEART +CREATURE:KINGSNAKE:LIVER +CREATURE:KINGSNAKE:GUT +CREATURE:KINGSNAKE:STOMACH +CREATURE:KINGSNAKE:GIZZARD +CREATURE:KINGSNAKE:PANCREAS +CREATURE:KINGSNAKE:SPLEEN +CREATURE:KINGSNAKE:KIDNEY +CREATURE:KINGSNAKE_MAN:MUSCLE +CREATURE:KINGSNAKE_MAN:EYE +CREATURE:KINGSNAKE_MAN:BRAIN +CREATURE:KINGSNAKE_MAN:LUNG +CREATURE:KINGSNAKE_MAN:HEART +CREATURE:KINGSNAKE_MAN:LIVER +CREATURE:KINGSNAKE_MAN:GUT +CREATURE:KINGSNAKE_MAN:STOMACH +CREATURE:KINGSNAKE_MAN:GIZZARD +CREATURE:KINGSNAKE_MAN:PANCREAS +CREATURE:KINGSNAKE_MAN:SPLEEN +CREATURE:KINGSNAKE_MAN:KIDNEY +CREATURE:GIANT_KINGSNAKE:MUSCLE +CREATURE:GIANT_KINGSNAKE:EYE +CREATURE:GIANT_KINGSNAKE:BRAIN +CREATURE:GIANT_KINGSNAKE:LUNG +CREATURE:GIANT_KINGSNAKE:HEART +CREATURE:GIANT_KINGSNAKE:LIVER +CREATURE:GIANT_KINGSNAKE:GUT + CREATURE:GIANT_KINGSNAKE:STOMACH + CREATURE:GIANT_KINGSNAKE:GIZZARD +!CREATURE:GIANT_KINGSNAKE:PANCREAS +CREATURE:GIANT_KINGSNAKE:SPLEEN +CREATURE:GIANT_KINGSNAKE:KIDNEY +CREATURE:GRAY_LANGUR:MUSCLE +CREATURE:GRAY_LANGUR:EYE +CREATURE:GRAY_LANGUR:BRAIN +CREATURE:GRAY_LANGUR:LUNG +CREATURE:GRAY_LANGUR:HEART +CREATURE:GRAY_LANGUR:LIVER +CREATURE:GRAY_LANGUR:GUT +CREATURE:GRAY_LANGUR:STOMACH +CREATURE:GRAY_LANGUR:GIZZARD +CREATURE:GRAY_LANGUR:PANCREAS +CREATURE:GRAY_LANGUR:SPLEEN +CREATURE:GRAY_LANGUR:KIDNEY +CREATURE:GRAY_LANGUR_MAN:MUSCLE +CREATURE:GRAY_LANGUR_MAN:EYE +CREATURE:GRAY_LANGUR_MAN:BRAIN +CREATURE:GRAY_LANGUR_MAN:LUNG +CREATURE:GRAY_LANGUR_MAN:HEART +CREATURE:GRAY_LANGUR_MAN:LIVER +CREATURE:GRAY_LANGUR_MAN:GUT + CREATURE:GRAY_LANGUR_MAN:STOMACH + CREATURE:GRAY_LANGUR_MAN:GIZZARD +!CREATURE:GRAY_LANGUR_MAN:PANCREAS +CREATURE:GRAY_LANGUR_MAN:SPLEEN +CREATURE:GRAY_LANGUR_MAN:KIDNEY +!CREATURE:GIANT_GRAY_LANGUR:MUSCLE +CREATURE:GIANT_GRAY_LANGUR:EYE + CREATURE:GIANT_GRAY_LANGUR:BRAIN +CREATURE:GIANT_GRAY_LANGUR:LUNG + CREATURE:GIANT_GRAY_LANGUR:HEART + CREATURE:GIANT_GRAY_LANGUR:LIVER +CREATURE:GIANT_GRAY_LANGUR:GUT +"CREATURE:GIANT_GRAY_LANGUR:STOMACH +"CREATURE:GIANT_GRAY_LANGUR:GIZZARD +#CREATURE:GIANT_GRAY_LANGUR:PANCREAS +!CREATURE:GIANT_GRAY_LANGUR:SPLEEN +!CREATURE:GIANT_GRAY_LANGUR:KIDNEY +CREATURE:BOBCAT:MUSCLE +CREATURE:BOBCAT:EYE +CREATURE:BOBCAT:BRAIN +CREATURE:BOBCAT:LUNG +CREATURE:BOBCAT:HEART +CREATURE:BOBCAT:LIVER +CREATURE:BOBCAT:GUT +CREATURE:BOBCAT:STOMACH +CREATURE:BOBCAT:GIZZARD +CREATURE:BOBCAT:PANCREAS +CREATURE:BOBCAT:SPLEEN +CREATURE:BOBCAT:KIDNEY +CREATURE:BOBCAT_MAN:MUSCLE +CREATURE:BOBCAT_MAN:EYE +CREATURE:BOBCAT_MAN:BRAIN +CREATURE:BOBCAT_MAN:LUNG +CREATURE:BOBCAT_MAN:HEART +CREATURE:BOBCAT_MAN:LIVER +CREATURE:BOBCAT_MAN:GUT +CREATURE:BOBCAT_MAN:STOMACH +CREATURE:BOBCAT_MAN:GIZZARD +CREATURE:BOBCAT_MAN:PANCREAS +CREATURE:BOBCAT_MAN:SPLEEN +CREATURE:BOBCAT_MAN:KIDNEY +CREATURE:GIANT_BOBCAT:MUSCLE +CREATURE:GIANT_BOBCAT:EYE +CREATURE:GIANT_BOBCAT:BRAIN +CREATURE:GIANT_BOBCAT:LUNG +CREATURE:GIANT_BOBCAT:HEART +CREATURE:GIANT_BOBCAT:LIVER +CREATURE:GIANT_BOBCAT:GUT +CREATURE:GIANT_BOBCAT:STOMACH +CREATURE:GIANT_BOBCAT:GIZZARD +CREATURE:GIANT_BOBCAT:PANCREAS +CREATURE:GIANT_BOBCAT:SPLEEN +CREATURE:GIANT_BOBCAT:KIDNEY +CREATURE:SKUNK:MUSCLE +CREATURE:SKUNK:EYE +CREATURE:SKUNK:BRAIN +CREATURE:SKUNK:LUNG +CREATURE:SKUNK:HEART +CREATURE:SKUNK:LIVER +CREATURE:SKUNK:GUT +CREATURE:SKUNK:STOMACH +CREATURE:SKUNK:GIZZARD +CREATURE:SKUNK:PANCREAS +CREATURE:SKUNK:SPLEEN +CREATURE:SKUNK:KIDNEY +CREATURE:SKUNK_MAN:MUSCLE +CREATURE:SKUNK_MAN:EYE +CREATURE:SKUNK_MAN:BRAIN +CREATURE:SKUNK_MAN:LUNG +CREATURE:SKUNK_MAN:HEART +CREATURE:SKUNK_MAN:LIVER +CREATURE:SKUNK_MAN:GUT +CREATURE:SKUNK_MAN:STOMACH +CREATURE:SKUNK_MAN:GIZZARD +CREATURE:SKUNK_MAN:PANCREAS +CREATURE:SKUNK_MAN:SPLEEN +CREATURE:SKUNK_MAN:KIDNEY +CREATURE:GIANT_SKUNK:MUSCLE +CREATURE:GIANT_SKUNK:EYE +CREATURE:GIANT_SKUNK:BRAIN +CREATURE:GIANT_SKUNK:LUNG +CREATURE:GIANT_SKUNK:HEART +CREATURE:GIANT_SKUNK:LIVER +CREATURE:GIANT_SKUNK:GUT +CREATURE:GIANT_SKUNK:STOMACH +CREATURE:GIANT_SKUNK:GIZZARD +CREATURE:GIANT_SKUNK:PANCREAS +CREATURE:GIANT_SKUNK:SPLEEN +CREATURE:GIANT_SKUNK:KIDNEY +CREATURE:GREEN_TREE_FROG:MUSCLE +CREATURE:GREEN_TREE_FROG:EYE +CREATURE:GREEN_TREE_FROG:BRAIN +CREATURE:GREEN_TREE_FROG:LUNG +CREATURE:GREEN_TREE_FROG:HEART +CREATURE:GREEN_TREE_FROG:LIVER +CREATURE:GREEN_TREE_FROG:GUT + CREATURE:GREEN_TREE_FROG:STOMACH + CREATURE:GREEN_TREE_FROG:GIZZARD +!CREATURE:GREEN_TREE_FROG:PANCREAS +CREATURE:GREEN_TREE_FROG:SPLEEN +CREATURE:GREEN_TREE_FROG:KIDNEY +#CREATURE:GREEN_TREE_FROG_MAN:MUSCLE + CREATURE:GREEN_TREE_FROG_MAN:EYE +"CREATURE:GREEN_TREE_FROG_MAN:BRAIN +!CREATURE:GREEN_TREE_FROG_MAN:LUNG +"CREATURE:GREEN_TREE_FROG_MAN:HEART +"CREATURE:GREEN_TREE_FROG_MAN:LIVER + CREATURE:GREEN_TREE_FROG_MAN:GUT +$CREATURE:GREEN_TREE_FROG_MAN:STOMACH +$CREATURE:GREEN_TREE_FROG_MAN:GIZZARD +%CREATURE:GREEN_TREE_FROG_MAN:PANCREAS +#CREATURE:GREEN_TREE_FROG_MAN:SPLEEN +#CREATURE:GREEN_TREE_FROG_MAN:KIDNEY +%CREATURE:GIANT_GREEN_TREE_FROG:MUSCLE +"CREATURE:GIANT_GREEN_TREE_FROG:EYE +$CREATURE:GIANT_GREEN_TREE_FROG:BRAIN +#CREATURE:GIANT_GREEN_TREE_FROG:LUNG +$CREATURE:GIANT_GREEN_TREE_FROG:HEART +$CREATURE:GIANT_GREEN_TREE_FROG:LIVER +"CREATURE:GIANT_GREEN_TREE_FROG:GUT +&CREATURE:GIANT_GREEN_TREE_FROG:STOMACH +&CREATURE:GIANT_GREEN_TREE_FROG:GIZZARD +'CREATURE:GIANT_GREEN_TREE_FROG:PANCREAS +%CREATURE:GIANT_GREEN_TREE_FROG:SPLEEN +%CREATURE:GIANT_GREEN_TREE_FROG:KIDNEY +CREATURE:HARE:MUSCLE +CREATURE:HARE:EYE +CREATURE:HARE:BRAIN +CREATURE:HARE:LUNG +CREATURE:HARE:HEART +CREATURE:HARE:LIVER +CREATURE:HARE:GUT +CREATURE:HARE:STOMACH +CREATURE:HARE:GIZZARD +CREATURE:HARE:PANCREAS +CREATURE:HARE:SPLEEN +CREATURE:HARE:KIDNEY +CREATURE:HARE_MAN:MUSCLE +CREATURE:HARE_MAN:EYE +CREATURE:HARE_MAN:BRAIN +CREATURE:HARE_MAN:LUNG +CREATURE:HARE_MAN:HEART +CREATURE:HARE_MAN:LIVER +CREATURE:HARE_MAN:GUT +CREATURE:HARE_MAN:STOMACH +CREATURE:HARE_MAN:GIZZARD +CREATURE:HARE_MAN:PANCREAS +CREATURE:HARE_MAN:SPLEEN +CREATURE:HARE_MAN:KIDNEY +CREATURE:GIANT_HARE:MUSCLE +CREATURE:GIANT_HARE:EYE +CREATURE:GIANT_HARE:BRAIN +CREATURE:GIANT_HARE:LUNG +CREATURE:GIANT_HARE:HEART +CREATURE:GIANT_HARE:LIVER +CREATURE:GIANT_HARE:GUT +CREATURE:GIANT_HARE:STOMACH +CREATURE:GIANT_HARE:GIZZARD +CREATURE:GIANT_HARE:PANCREAS +CREATURE:GIANT_HARE:SPLEEN +CREATURE:GIANT_HARE:KIDNEY +CREATURE:RATTLESNAKE:MUSCLE +CREATURE:RATTLESNAKE:EYE +CREATURE:RATTLESNAKE:BRAIN +CREATURE:RATTLESNAKE:LUNG +CREATURE:RATTLESNAKE:HEART +CREATURE:RATTLESNAKE:LIVER +CREATURE:RATTLESNAKE:GUT +CREATURE:RATTLESNAKE:STOMACH +CREATURE:RATTLESNAKE:GIZZARD +CREATURE:RATTLESNAKE:PANCREAS +CREATURE:RATTLESNAKE:SPLEEN +CREATURE:RATTLESNAKE:KIDNEY +CREATURE:RATTLESNAKE_MAN:MUSCLE +CREATURE:RATTLESNAKE_MAN:EYE +CREATURE:RATTLESNAKE_MAN:BRAIN +CREATURE:RATTLESNAKE_MAN:LUNG +CREATURE:RATTLESNAKE_MAN:HEART +CREATURE:RATTLESNAKE_MAN:LIVER +CREATURE:RATTLESNAKE_MAN:GUT + CREATURE:RATTLESNAKE_MAN:STOMACH + CREATURE:RATTLESNAKE_MAN:GIZZARD +!CREATURE:RATTLESNAKE_MAN:PANCREAS +CREATURE:RATTLESNAKE_MAN:SPLEEN +CREATURE:RATTLESNAKE_MAN:KIDNEY +!CREATURE:GIANT_RATTLESNAKE:MUSCLE +CREATURE:GIANT_RATTLESNAKE:EYE + CREATURE:GIANT_RATTLESNAKE:BRAIN +CREATURE:GIANT_RATTLESNAKE:LUNG + CREATURE:GIANT_RATTLESNAKE:HEART + CREATURE:GIANT_RATTLESNAKE:LIVER +CREATURE:GIANT_RATTLESNAKE:GUT +"CREATURE:GIANT_RATTLESNAKE:STOMACH +"CREATURE:GIANT_RATTLESNAKE:GIZZARD +#CREATURE:GIANT_RATTLESNAKE:PANCREAS +!CREATURE:GIANT_RATTLESNAKE:SPLEEN +!CREATURE:GIANT_RATTLESNAKE:KIDNEY +CREATURE:WEASEL:MUSCLE +CREATURE:WEASEL:EYE +CREATURE:WEASEL:BRAIN +CREATURE:WEASEL:LUNG +CREATURE:WEASEL:HEART +CREATURE:WEASEL:LIVER +CREATURE:WEASEL:GUT +CREATURE:WEASEL:STOMACH +CREATURE:WEASEL:GIZZARD +CREATURE:WEASEL:PANCREAS +CREATURE:WEASEL:SPLEEN +CREATURE:WEASEL:KIDNEY +CREATURE:WEASEL_MAN:MUSCLE +CREATURE:WEASEL_MAN:EYE +CREATURE:WEASEL_MAN:BRAIN +CREATURE:WEASEL_MAN:LUNG +CREATURE:WEASEL_MAN:HEART +CREATURE:WEASEL_MAN:LIVER +CREATURE:WEASEL_MAN:GUT +CREATURE:WEASEL_MAN:STOMACH +CREATURE:WEASEL_MAN:GIZZARD +CREATURE:WEASEL_MAN:PANCREAS +CREATURE:WEASEL_MAN:SPLEEN +CREATURE:WEASEL_MAN:KIDNEY +CREATURE:GIANT_WEASEL:MUSCLE +CREATURE:GIANT_WEASEL:EYE +CREATURE:GIANT_WEASEL:BRAIN +CREATURE:GIANT_WEASEL:LUNG +CREATURE:GIANT_WEASEL:HEART +CREATURE:GIANT_WEASEL:LIVER +CREATURE:GIANT_WEASEL:GUT +CREATURE:GIANT_WEASEL:STOMACH +CREATURE:GIANT_WEASEL:GIZZARD +CREATURE:GIANT_WEASEL:PANCREAS +CREATURE:GIANT_WEASEL:SPLEEN +CREATURE:GIANT_WEASEL:KIDNEY + CREATURE:COPPERHEAD_SNAKE:MUSCLE +CREATURE:COPPERHEAD_SNAKE:EYE +CREATURE:COPPERHEAD_SNAKE:BRAIN +CREATURE:COPPERHEAD_SNAKE:LUNG +CREATURE:COPPERHEAD_SNAKE:HEART +CREATURE:COPPERHEAD_SNAKE:LIVER +CREATURE:COPPERHEAD_SNAKE:GUT +!CREATURE:COPPERHEAD_SNAKE:STOMACH +!CREATURE:COPPERHEAD_SNAKE:GIZZARD +"CREATURE:COPPERHEAD_SNAKE:PANCREAS + CREATURE:COPPERHEAD_SNAKE:SPLEEN + CREATURE:COPPERHEAD_SNAKE:KIDNEY +$CREATURE:COPPERHEAD_SNAKE_MAN:MUSCLE +!CREATURE:COPPERHEAD_SNAKE_MAN:EYE +#CREATURE:COPPERHEAD_SNAKE_MAN:BRAIN +"CREATURE:COPPERHEAD_SNAKE_MAN:LUNG +#CREATURE:COPPERHEAD_SNAKE_MAN:HEART +#CREATURE:COPPERHEAD_SNAKE_MAN:LIVER +!CREATURE:COPPERHEAD_SNAKE_MAN:GUT +%CREATURE:COPPERHEAD_SNAKE_MAN:STOMACH +%CREATURE:COPPERHEAD_SNAKE_MAN:GIZZARD +&CREATURE:COPPERHEAD_SNAKE_MAN:PANCREAS +$CREATURE:COPPERHEAD_SNAKE_MAN:SPLEEN +$CREATURE:COPPERHEAD_SNAKE_MAN:KIDNEY +&CREATURE:GIANT_COPPERHEAD_SNAKE:MUSCLE +#CREATURE:GIANT_COPPERHEAD_SNAKE:EYE +%CREATURE:GIANT_COPPERHEAD_SNAKE:BRAIN +$CREATURE:GIANT_COPPERHEAD_SNAKE:LUNG +%CREATURE:GIANT_COPPERHEAD_SNAKE:HEART +%CREATURE:GIANT_COPPERHEAD_SNAKE:LIVER +#CREATURE:GIANT_COPPERHEAD_SNAKE:GUT +'CREATURE:GIANT_COPPERHEAD_SNAKE:STOMACH +'CREATURE:GIANT_COPPERHEAD_SNAKE:GIZZARD +(CREATURE:GIANT_COPPERHEAD_SNAKE:PANCREAS +&CREATURE:GIANT_COPPERHEAD_SNAKE:SPLEEN +&CREATURE:GIANT_COPPERHEAD_SNAKE:KIDNEY +CREATURE:IBEX:MUSCLE +CREATURE:IBEX:EYE +CREATURE:IBEX:BRAIN +CREATURE:IBEX:LUNG +CREATURE:IBEX:HEART +CREATURE:IBEX:LIVER +CREATURE:IBEX:GUT +CREATURE:IBEX:STOMACH +CREATURE:IBEX:GIZZARD +CREATURE:IBEX:PANCREAS +CREATURE:IBEX:SPLEEN +CREATURE:IBEX:KIDNEY +CREATURE:IBEX_MAN:MUSCLE +CREATURE:IBEX_MAN:EYE +CREATURE:IBEX_MAN:BRAIN +CREATURE:IBEX_MAN:LUNG +CREATURE:IBEX_MAN:HEART +CREATURE:IBEX_MAN:LIVER +CREATURE:IBEX_MAN:GUT +CREATURE:IBEX_MAN:STOMACH +CREATURE:IBEX_MAN:GIZZARD +CREATURE:IBEX_MAN:PANCREAS +CREATURE:IBEX_MAN:SPLEEN +CREATURE:IBEX_MAN:KIDNEY +CREATURE:GIANT_IBEX:MUSCLE +CREATURE:GIANT_IBEX:EYE +CREATURE:GIANT_IBEX:BRAIN +CREATURE:GIANT_IBEX:LUNG +CREATURE:GIANT_IBEX:HEART +CREATURE:GIANT_IBEX:LIVER +CREATURE:GIANT_IBEX:GUT +CREATURE:GIANT_IBEX:STOMACH +CREATURE:GIANT_IBEX:GIZZARD +CREATURE:GIANT_IBEX:PANCREAS +CREATURE:GIANT_IBEX:SPLEEN +CREATURE:GIANT_IBEX:KIDNEY +CREATURE:WOMBAT:MUSCLE +CREATURE:WOMBAT:EYE +CREATURE:WOMBAT:BRAIN +CREATURE:WOMBAT:LUNG +CREATURE:WOMBAT:HEART +CREATURE:WOMBAT:LIVER +CREATURE:WOMBAT:GUT +CREATURE:WOMBAT:STOMACH +CREATURE:WOMBAT:GIZZARD +CREATURE:WOMBAT:PANCREAS +CREATURE:WOMBAT:SPLEEN +CREATURE:WOMBAT:KIDNEY +CREATURE:WOMBAT_MAN:MUSCLE +CREATURE:WOMBAT_MAN:EYE +CREATURE:WOMBAT_MAN:BRAIN +CREATURE:WOMBAT_MAN:LUNG +CREATURE:WOMBAT_MAN:HEART +CREATURE:WOMBAT_MAN:LIVER +CREATURE:WOMBAT_MAN:GUT +CREATURE:WOMBAT_MAN:STOMACH +CREATURE:WOMBAT_MAN:GIZZARD +CREATURE:WOMBAT_MAN:PANCREAS +CREATURE:WOMBAT_MAN:SPLEEN +CREATURE:WOMBAT_MAN:KIDNEY +CREATURE:GIANT_WOMBAT:MUSCLE +CREATURE:GIANT_WOMBAT:EYE +CREATURE:GIANT_WOMBAT:BRAIN +CREATURE:GIANT_WOMBAT:LUNG +CREATURE:GIANT_WOMBAT:HEART +CREATURE:GIANT_WOMBAT:LIVER +CREATURE:GIANT_WOMBAT:GUT +CREATURE:GIANT_WOMBAT:STOMACH +CREATURE:GIANT_WOMBAT:GIZZARD +CREATURE:GIANT_WOMBAT:PANCREAS +CREATURE:GIANT_WOMBAT:SPLEEN +CREATURE:GIANT_WOMBAT:KIDNEY +CREATURE:DINGO:MUSCLE +CREATURE:DINGO:EYE +CREATURE:DINGO:BRAIN +CREATURE:DINGO:LUNG +CREATURE:DINGO:HEART +CREATURE:DINGO:LIVER +CREATURE:DINGO:GUT +CREATURE:DINGO:STOMACH +CREATURE:DINGO:GIZZARD +CREATURE:DINGO:PANCREAS +CREATURE:DINGO:SPLEEN +CREATURE:DINGO:KIDNEY +CREATURE:DINGO_MAN:MUSCLE +CREATURE:DINGO_MAN:EYE +CREATURE:DINGO_MAN:BRAIN +CREATURE:DINGO_MAN:LUNG +CREATURE:DINGO_MAN:HEART +CREATURE:DINGO_MAN:LIVER +CREATURE:DINGO_MAN:GUT +CREATURE:DINGO_MAN:STOMACH +CREATURE:DINGO_MAN:GIZZARD +CREATURE:DINGO_MAN:PANCREAS +CREATURE:DINGO_MAN:SPLEEN +CREATURE:DINGO_MAN:KIDNEY +CREATURE:GIANT_DINGO:MUSCLE +CREATURE:GIANT_DINGO:EYE +CREATURE:GIANT_DINGO:BRAIN +CREATURE:GIANT_DINGO:LUNG +CREATURE:GIANT_DINGO:HEART +CREATURE:GIANT_DINGO:LIVER +CREATURE:GIANT_DINGO:GUT +CREATURE:GIANT_DINGO:STOMACH +CREATURE:GIANT_DINGO:GIZZARD +CREATURE:GIANT_DINGO:PANCREAS +CREATURE:GIANT_DINGO:SPLEEN +CREATURE:GIANT_DINGO:KIDNEY +CREATURE:COATI:MUSCLE +CREATURE:COATI:EYE +CREATURE:COATI:BRAIN +CREATURE:COATI:LUNG +CREATURE:COATI:HEART +CREATURE:COATI:LIVER +CREATURE:COATI:GUT +CREATURE:COATI:STOMACH +CREATURE:COATI:GIZZARD +CREATURE:COATI:PANCREAS +CREATURE:COATI:SPLEEN +CREATURE:COATI:KIDNEY +CREATURE:COATI_MAN:MUSCLE +CREATURE:COATI_MAN:EYE +CREATURE:COATI_MAN:BRAIN +CREATURE:COATI_MAN:LUNG +CREATURE:COATI_MAN:HEART +CREATURE:COATI_MAN:LIVER +CREATURE:COATI_MAN:GUT +CREATURE:COATI_MAN:STOMACH +CREATURE:COATI_MAN:GIZZARD +CREATURE:COATI_MAN:PANCREAS +CREATURE:COATI_MAN:SPLEEN +CREATURE:COATI_MAN:KIDNEY +CREATURE:GIANT_COATI:MUSCLE +CREATURE:GIANT_COATI:EYE +CREATURE:GIANT_COATI:BRAIN +CREATURE:GIANT_COATI:LUNG +CREATURE:GIANT_COATI:HEART +CREATURE:GIANT_COATI:LIVER +CREATURE:GIANT_COATI:GUT +CREATURE:GIANT_COATI:STOMACH +CREATURE:GIANT_COATI:GIZZARD +CREATURE:GIANT_COATI:PANCREAS +CREATURE:GIANT_COATI:SPLEEN +CREATURE:GIANT_COATI:KIDNEY +CREATURE:OPOSSUM:MUSCLE +CREATURE:OPOSSUM:EYE +CREATURE:OPOSSUM:BRAIN +CREATURE:OPOSSUM:LUNG +CREATURE:OPOSSUM:HEART +CREATURE:OPOSSUM:LIVER +CREATURE:OPOSSUM:GUT +CREATURE:OPOSSUM:STOMACH +CREATURE:OPOSSUM:GIZZARD +CREATURE:OPOSSUM:PANCREAS +CREATURE:OPOSSUM:SPLEEN +CREATURE:OPOSSUM:KIDNEY +CREATURE:OPOSSUM_MAN:MUSCLE +CREATURE:OPOSSUM_MAN:EYE +CREATURE:OPOSSUM_MAN:BRAIN +CREATURE:OPOSSUM_MAN:LUNG +CREATURE:OPOSSUM_MAN:HEART +CREATURE:OPOSSUM_MAN:LIVER +CREATURE:OPOSSUM_MAN:GUT +CREATURE:OPOSSUM_MAN:STOMACH +CREATURE:OPOSSUM_MAN:GIZZARD +CREATURE:OPOSSUM_MAN:PANCREAS +CREATURE:OPOSSUM_MAN:SPLEEN +CREATURE:OPOSSUM_MAN:KIDNEY +CREATURE:GIANT_OPOSSUM:MUSCLE +CREATURE:GIANT_OPOSSUM:EYE +CREATURE:GIANT_OPOSSUM:BRAIN +CREATURE:GIANT_OPOSSUM:LUNG +CREATURE:GIANT_OPOSSUM:HEART +CREATURE:GIANT_OPOSSUM:LIVER +CREATURE:GIANT_OPOSSUM:GUT +CREATURE:GIANT_OPOSSUM:STOMACH +CREATURE:GIANT_OPOSSUM:GIZZARD +CREATURE:GIANT_OPOSSUM:PANCREAS +CREATURE:GIANT_OPOSSUM:SPLEEN +CREATURE:GIANT_OPOSSUM:KIDNEY +CREATURE:MONGOOSE:MUSCLE +CREATURE:MONGOOSE:EYE +CREATURE:MONGOOSE:BRAIN +CREATURE:MONGOOSE:LUNG +CREATURE:MONGOOSE:HEART +CREATURE:MONGOOSE:LIVER +CREATURE:MONGOOSE:GUT +CREATURE:MONGOOSE:STOMACH +CREATURE:MONGOOSE:GIZZARD +CREATURE:MONGOOSE:PANCREAS +CREATURE:MONGOOSE:SPLEEN +CREATURE:MONGOOSE:KIDNEY +CREATURE:MONGOOSE_MAN:MUSCLE +CREATURE:MONGOOSE_MAN:EYE +CREATURE:MONGOOSE_MAN:BRAIN +CREATURE:MONGOOSE_MAN:LUNG +CREATURE:MONGOOSE_MAN:HEART +CREATURE:MONGOOSE_MAN:LIVER +CREATURE:MONGOOSE_MAN:GUT +CREATURE:MONGOOSE_MAN:STOMACH +CREATURE:MONGOOSE_MAN:GIZZARD +CREATURE:MONGOOSE_MAN:PANCREAS +CREATURE:MONGOOSE_MAN:SPLEEN +CREATURE:MONGOOSE_MAN:KIDNEY +CREATURE:GIANT_MONGOOSE:MUSCLE +CREATURE:GIANT_MONGOOSE:EYE +CREATURE:GIANT_MONGOOSE:BRAIN +CREATURE:GIANT_MONGOOSE:LUNG +CREATURE:GIANT_MONGOOSE:HEART +CREATURE:GIANT_MONGOOSE:LIVER +CREATURE:GIANT_MONGOOSE:GUT +CREATURE:GIANT_MONGOOSE:STOMACH +CREATURE:GIANT_MONGOOSE:GIZZARD + CREATURE:GIANT_MONGOOSE:PANCREAS +CREATURE:GIANT_MONGOOSE:SPLEEN +CREATURE:GIANT_MONGOOSE:KIDNEY +CREATURE:HYENA:MUSCLE +CREATURE:HYENA:EYE +CREATURE:HYENA:BRAIN +CREATURE:HYENA:LUNG +CREATURE:HYENA:HEART +CREATURE:HYENA:LIVER +CREATURE:HYENA:GUT +CREATURE:HYENA:STOMACH +CREATURE:HYENA:GIZZARD +CREATURE:HYENA:PANCREAS +CREATURE:HYENA:SPLEEN +CREATURE:HYENA:KIDNEY +CREATURE:HYENA_MAN:MUSCLE +CREATURE:HYENA_MAN:EYE +CREATURE:HYENA_MAN:BRAIN +CREATURE:HYENA_MAN:LUNG +CREATURE:HYENA_MAN:HEART +CREATURE:HYENA_MAN:LIVER +CREATURE:HYENA_MAN:GUT +CREATURE:HYENA_MAN:STOMACH +CREATURE:HYENA_MAN:GIZZARD +CREATURE:HYENA_MAN:PANCREAS +CREATURE:HYENA_MAN:SPLEEN +CREATURE:HYENA_MAN:KIDNEY +CREATURE:GIANT_HYENA:MUSCLE +CREATURE:GIANT_HYENA:EYE +CREATURE:GIANT_HYENA:BRAIN +CREATURE:GIANT_HYENA:LUNG +CREATURE:GIANT_HYENA:HEART +CREATURE:GIANT_HYENA:LIVER +CREATURE:GIANT_HYENA:GUT +CREATURE:GIANT_HYENA:STOMACH +CREATURE:GIANT_HYENA:GIZZARD +CREATURE:GIANT_HYENA:PANCREAS +CREATURE:GIANT_HYENA:SPLEEN +CREATURE:GIANT_HYENA:KIDNEY +CREATURE:ANACONDA:MUSCLE +CREATURE:ANACONDA:EYE +CREATURE:ANACONDA:BRAIN +CREATURE:ANACONDA:LUNG +CREATURE:ANACONDA:HEART +CREATURE:ANACONDA:LIVER +CREATURE:ANACONDA:GUT +CREATURE:ANACONDA:STOMACH +CREATURE:ANACONDA:GIZZARD +CREATURE:ANACONDA:PANCREAS +CREATURE:ANACONDA:SPLEEN +CREATURE:ANACONDA:KIDNEY +CREATURE:ANACONDA_MAN:MUSCLE +CREATURE:ANACONDA_MAN:EYE +CREATURE:ANACONDA_MAN:BRAIN +CREATURE:ANACONDA_MAN:LUNG +CREATURE:ANACONDA_MAN:HEART +CREATURE:ANACONDA_MAN:LIVER +CREATURE:ANACONDA_MAN:GUT +CREATURE:ANACONDA_MAN:STOMACH +CREATURE:ANACONDA_MAN:GIZZARD +CREATURE:ANACONDA_MAN:PANCREAS +CREATURE:ANACONDA_MAN:SPLEEN +CREATURE:ANACONDA_MAN:KIDNEY +CREATURE:GIANT_ANACONDA:MUSCLE +CREATURE:GIANT_ANACONDA:EYE +CREATURE:GIANT_ANACONDA:BRAIN +CREATURE:GIANT_ANACONDA:LUNG +CREATURE:GIANT_ANACONDA:HEART +CREATURE:GIANT_ANACONDA:LIVER +CREATURE:GIANT_ANACONDA:GUT +CREATURE:GIANT_ANACONDA:STOMACH +CREATURE:GIANT_ANACONDA:GIZZARD + CREATURE:GIANT_ANACONDA:PANCREAS +CREATURE:GIANT_ANACONDA:SPLEEN +CREATURE:GIANT_ANACONDA:KIDNEY +CREATURE:MONITOR_LIZARD:MUSCLE +CREATURE:MONITOR_LIZARD:EYE +CREATURE:MONITOR_LIZARD:BRAIN +CREATURE:MONITOR_LIZARD:LUNG +CREATURE:MONITOR_LIZARD:HEART +CREATURE:MONITOR_LIZARD:LIVER +CREATURE:MONITOR_LIZARD:GUT +CREATURE:MONITOR_LIZARD:STOMACH +CREATURE:MONITOR_LIZARD:GIZZARD + CREATURE:MONITOR_LIZARD:PANCREAS +CREATURE:MONITOR_LIZARD:SPLEEN +CREATURE:MONITOR_LIZARD:KIDNEY +"CREATURE:MONITOR_LIZARD_MAN:MUSCLE +CREATURE:MONITOR_LIZARD_MAN:EYE +!CREATURE:MONITOR_LIZARD_MAN:BRAIN + CREATURE:MONITOR_LIZARD_MAN:LUNG +!CREATURE:MONITOR_LIZARD_MAN:HEART +!CREATURE:MONITOR_LIZARD_MAN:LIVER +CREATURE:MONITOR_LIZARD_MAN:GUT +#CREATURE:MONITOR_LIZARD_MAN:STOMACH +#CREATURE:MONITOR_LIZARD_MAN:GIZZARD +$CREATURE:MONITOR_LIZARD_MAN:PANCREAS +"CREATURE:MONITOR_LIZARD_MAN:SPLEEN +"CREATURE:MONITOR_LIZARD_MAN:KIDNEY +$CREATURE:GIANT_MONITOR_LIZARD:MUSCLE +!CREATURE:GIANT_MONITOR_LIZARD:EYE +#CREATURE:GIANT_MONITOR_LIZARD:BRAIN +"CREATURE:GIANT_MONITOR_LIZARD:LUNG +#CREATURE:GIANT_MONITOR_LIZARD:HEART +#CREATURE:GIANT_MONITOR_LIZARD:LIVER +!CREATURE:GIANT_MONITOR_LIZARD:GUT +%CREATURE:GIANT_MONITOR_LIZARD:STOMACH +%CREATURE:GIANT_MONITOR_LIZARD:GIZZARD +&CREATURE:GIANT_MONITOR_LIZARD:PANCREAS +$CREATURE:GIANT_MONITOR_LIZARD:SPLEEN +$CREATURE:GIANT_MONITOR_LIZARD:KIDNEY +CREATURE:KING_COBRA:MUSCLE +CREATURE:KING_COBRA:EYE +CREATURE:KING_COBRA:BRAIN +CREATURE:KING_COBRA:LUNG +CREATURE:KING_COBRA:HEART +CREATURE:KING_COBRA:LIVER +CREATURE:KING_COBRA:GUT +CREATURE:KING_COBRA:STOMACH +CREATURE:KING_COBRA:GIZZARD +CREATURE:KING_COBRA:PANCREAS +CREATURE:KING_COBRA:SPLEEN +CREATURE:KING_COBRA:KIDNEY +CREATURE:KING_COBRA_MAN:MUSCLE +CREATURE:KING_COBRA_MAN:EYE +CREATURE:KING_COBRA_MAN:BRAIN +CREATURE:KING_COBRA_MAN:LUNG +CREATURE:KING_COBRA_MAN:HEART +CREATURE:KING_COBRA_MAN:LIVER +CREATURE:KING_COBRA_MAN:GUT +CREATURE:KING_COBRA_MAN:STOMACH +CREATURE:KING_COBRA_MAN:GIZZARD + CREATURE:KING_COBRA_MAN:PANCREAS +CREATURE:KING_COBRA_MAN:SPLEEN +CREATURE:KING_COBRA_MAN:KIDNEY + CREATURE:GIANT_KING_COBRA:MUSCLE +CREATURE:GIANT_KING_COBRA:EYE +CREATURE:GIANT_KING_COBRA:BRAIN +CREATURE:GIANT_KING_COBRA:LUNG +CREATURE:GIANT_KING_COBRA:HEART +CREATURE:GIANT_KING_COBRA:LIVER +CREATURE:GIANT_KING_COBRA:GUT +!CREATURE:GIANT_KING_COBRA:STOMACH +!CREATURE:GIANT_KING_COBRA:GIZZARD +"CREATURE:GIANT_KING_COBRA:PANCREAS + CREATURE:GIANT_KING_COBRA:SPLEEN + CREATURE:GIANT_KING_COBRA:KIDNEY +CREATURE:OCELOT:MUSCLE +CREATURE:OCELOT:EYE +CREATURE:OCELOT:BRAIN +CREATURE:OCELOT:LUNG +CREATURE:OCELOT:HEART +CREATURE:OCELOT:LIVER +CREATURE:OCELOT:GUT +CREATURE:OCELOT:STOMACH +CREATURE:OCELOT:GIZZARD +CREATURE:OCELOT:PANCREAS +CREATURE:OCELOT:SPLEEN +CREATURE:OCELOT:KIDNEY +CREATURE:OCELOT_MAN:MUSCLE +CREATURE:OCELOT_MAN:EYE +CREATURE:OCELOT_MAN:BRAIN +CREATURE:OCELOT_MAN:LUNG +CREATURE:OCELOT_MAN:HEART +CREATURE:OCELOT_MAN:LIVER +CREATURE:OCELOT_MAN:GUT +CREATURE:OCELOT_MAN:STOMACH +CREATURE:OCELOT_MAN:GIZZARD +CREATURE:OCELOT_MAN:PANCREAS +CREATURE:OCELOT_MAN:SPLEEN +CREATURE:OCELOT_MAN:KIDNEY +CREATURE:GIANT_OCELOT:MUSCLE +CREATURE:GIANT_OCELOT:EYE +CREATURE:GIANT_OCELOT:BRAIN +CREATURE:GIANT_OCELOT:LUNG +CREATURE:GIANT_OCELOT:HEART +CREATURE:GIANT_OCELOT:LIVER +CREATURE:GIANT_OCELOT:GUT +CREATURE:GIANT_OCELOT:STOMACH +CREATURE:GIANT_OCELOT:GIZZARD +CREATURE:GIANT_OCELOT:PANCREAS +CREATURE:GIANT_OCELOT:SPLEEN +CREATURE:GIANT_OCELOT:KIDNEY +CREATURE:JACKAL:MUSCLE +CREATURE:JACKAL:EYE +CREATURE:JACKAL:BRAIN +CREATURE:JACKAL:LUNG +CREATURE:JACKAL:HEART +CREATURE:JACKAL:LIVER +CREATURE:JACKAL:GUT +CREATURE:JACKAL:STOMACH +CREATURE:JACKAL:GIZZARD +CREATURE:JACKAL:PANCREAS +CREATURE:JACKAL:SPLEEN +CREATURE:JACKAL:KIDNEY +CREATURE:JACKAL_MAN:MUSCLE +CREATURE:JACKAL_MAN:EYE +CREATURE:JACKAL_MAN:BRAIN +CREATURE:JACKAL_MAN:LUNG +CREATURE:JACKAL_MAN:HEART +CREATURE:JACKAL_MAN:LIVER +CREATURE:JACKAL_MAN:GUT +CREATURE:JACKAL_MAN:STOMACH +CREATURE:JACKAL_MAN:GIZZARD +CREATURE:JACKAL_MAN:PANCREAS +CREATURE:JACKAL_MAN:SPLEEN +CREATURE:JACKAL_MAN:KIDNEY +CREATURE:GIANT_JACKAL:MUSCLE +CREATURE:GIANT_JACKAL:EYE +CREATURE:GIANT_JACKAL:BRAIN +CREATURE:GIANT_JACKAL:LUNG +CREATURE:GIANT_JACKAL:HEART +CREATURE:GIANT_JACKAL:LIVER +CREATURE:GIANT_JACKAL:GUT +CREATURE:GIANT_JACKAL:STOMACH +CREATURE:GIANT_JACKAL:GIZZARD +CREATURE:GIANT_JACKAL:PANCREAS +CREATURE:GIANT_JACKAL:SPLEEN +CREATURE:GIANT_JACKAL:KIDNEY +CREATURE:CAPUCHIN:MUSCLE +CREATURE:CAPUCHIN:EYE +CREATURE:CAPUCHIN:BRAIN +CREATURE:CAPUCHIN:LUNG +CREATURE:CAPUCHIN:HEART +CREATURE:CAPUCHIN:LIVER +CREATURE:CAPUCHIN:GUT +CREATURE:CAPUCHIN:STOMACH +CREATURE:CAPUCHIN:GIZZARD +CREATURE:CAPUCHIN:PANCREAS +CREATURE:CAPUCHIN:SPLEEN +CREATURE:CAPUCHIN:KIDNEY +CREATURE:CAPUCHIN_MAN:MUSCLE +CREATURE:CAPUCHIN_MAN:EYE +CREATURE:CAPUCHIN_MAN:BRAIN +CREATURE:CAPUCHIN_MAN:LUNG +CREATURE:CAPUCHIN_MAN:HEART +CREATURE:CAPUCHIN_MAN:LIVER +CREATURE:CAPUCHIN_MAN:GUT +CREATURE:CAPUCHIN_MAN:STOMACH +CREATURE:CAPUCHIN_MAN:GIZZARD +CREATURE:CAPUCHIN_MAN:PANCREAS +CREATURE:CAPUCHIN_MAN:SPLEEN +CREATURE:CAPUCHIN_MAN:KIDNEY +CREATURE:GIANT_CAPUCHIN:MUSCLE +CREATURE:GIANT_CAPUCHIN:EYE +CREATURE:GIANT_CAPUCHIN:BRAIN +CREATURE:GIANT_CAPUCHIN:LUNG +CREATURE:GIANT_CAPUCHIN:HEART +CREATURE:GIANT_CAPUCHIN:LIVER +CREATURE:GIANT_CAPUCHIN:GUT +CREATURE:GIANT_CAPUCHIN:STOMACH +CREATURE:GIANT_CAPUCHIN:GIZZARD + CREATURE:GIANT_CAPUCHIN:PANCREAS +CREATURE:GIANT_CAPUCHIN:SPLEEN +CREATURE:GIANT_CAPUCHIN:KIDNEY +CREATURE:SLOTH:MUSCLE +CREATURE:SLOTH:EYE +CREATURE:SLOTH:BRAIN +CREATURE:SLOTH:LUNG +CREATURE:SLOTH:HEART +CREATURE:SLOTH:LIVER +CREATURE:SLOTH:GUT +CREATURE:SLOTH:STOMACH +CREATURE:SLOTH:GIZZARD +CREATURE:SLOTH:PANCREAS +CREATURE:SLOTH:SPLEEN +CREATURE:SLOTH:KIDNEY +CREATURE:SLOTH_MAN:MUSCLE +CREATURE:SLOTH_MAN:EYE +CREATURE:SLOTH_MAN:BRAIN +CREATURE:SLOTH_MAN:LUNG +CREATURE:SLOTH_MAN:HEART +CREATURE:SLOTH_MAN:LIVER +CREATURE:SLOTH_MAN:GUT +CREATURE:SLOTH_MAN:STOMACH +CREATURE:SLOTH_MAN:GIZZARD +CREATURE:SLOTH_MAN:PANCREAS +CREATURE:SLOTH_MAN:SPLEEN +CREATURE:SLOTH_MAN:KIDNEY +CREATURE:GIANT_SLOTH:MUSCLE +CREATURE:GIANT_SLOTH:EYE +CREATURE:GIANT_SLOTH:BRAIN +CREATURE:GIANT_SLOTH:LUNG +CREATURE:GIANT_SLOTH:HEART +CREATURE:GIANT_SLOTH:LIVER +CREATURE:GIANT_SLOTH:GUT +CREATURE:GIANT_SLOTH:STOMACH +CREATURE:GIANT_SLOTH:GIZZARD +CREATURE:GIANT_SLOTH:PANCREAS +CREATURE:GIANT_SLOTH:SPLEEN +CREATURE:GIANT_SLOTH:KIDNEY +CREATURE:SPIDER_MONKEY:MUSCLE +CREATURE:SPIDER_MONKEY:EYE +CREATURE:SPIDER_MONKEY:BRAIN +CREATURE:SPIDER_MONKEY:LUNG +CREATURE:SPIDER_MONKEY:HEART +CREATURE:SPIDER_MONKEY:LIVER +CREATURE:SPIDER_MONKEY:GUT +CREATURE:SPIDER_MONKEY:STOMACH +CREATURE:SPIDER_MONKEY:GIZZARD +CREATURE:SPIDER_MONKEY:PANCREAS +CREATURE:SPIDER_MONKEY:SPLEEN +CREATURE:SPIDER_MONKEY:KIDNEY +!CREATURE:SPIDER_MONKEY_MAN:MUSCLE +CREATURE:SPIDER_MONKEY_MAN:EYE + CREATURE:SPIDER_MONKEY_MAN:BRAIN +CREATURE:SPIDER_MONKEY_MAN:LUNG + CREATURE:SPIDER_MONKEY_MAN:HEART + CREATURE:SPIDER_MONKEY_MAN:LIVER +CREATURE:SPIDER_MONKEY_MAN:GUT +"CREATURE:SPIDER_MONKEY_MAN:STOMACH +"CREATURE:SPIDER_MONKEY_MAN:GIZZARD +#CREATURE:SPIDER_MONKEY_MAN:PANCREAS +!CREATURE:SPIDER_MONKEY_MAN:SPLEEN +!CREATURE:SPIDER_MONKEY_MAN:KIDNEY +#CREATURE:GIANT_SPIDER_MONKEY:MUSCLE + CREATURE:GIANT_SPIDER_MONKEY:EYE +"CREATURE:GIANT_SPIDER_MONKEY:BRAIN +!CREATURE:GIANT_SPIDER_MONKEY:LUNG +"CREATURE:GIANT_SPIDER_MONKEY:HEART +"CREATURE:GIANT_SPIDER_MONKEY:LIVER + CREATURE:GIANT_SPIDER_MONKEY:GUT +$CREATURE:GIANT_SPIDER_MONKEY:STOMACH +$CREATURE:GIANT_SPIDER_MONKEY:GIZZARD +%CREATURE:GIANT_SPIDER_MONKEY:PANCREAS +#CREATURE:GIANT_SPIDER_MONKEY:SPLEEN +#CREATURE:GIANT_SPIDER_MONKEY:KIDNEY +CREATURE:PANGOLIN:MUSCLE +CREATURE:PANGOLIN:EYE +CREATURE:PANGOLIN:BRAIN +CREATURE:PANGOLIN:LUNG +CREATURE:PANGOLIN:HEART +CREATURE:PANGOLIN:LIVER +CREATURE:PANGOLIN:GUT +CREATURE:PANGOLIN:STOMACH +CREATURE:PANGOLIN:GIZZARD +CREATURE:PANGOLIN:PANCREAS +CREATURE:PANGOLIN:SPLEEN +CREATURE:PANGOLIN:KIDNEY +CREATURE:PANGOLIN_MAN:MUSCLE +CREATURE:PANGOLIN_MAN:EYE +CREATURE:PANGOLIN_MAN:BRAIN +CREATURE:PANGOLIN_MAN:LUNG +CREATURE:PANGOLIN_MAN:HEART +CREATURE:PANGOLIN_MAN:LIVER +CREATURE:PANGOLIN_MAN:GUT +CREATURE:PANGOLIN_MAN:STOMACH +CREATURE:PANGOLIN_MAN:GIZZARD +CREATURE:PANGOLIN_MAN:PANCREAS +CREATURE:PANGOLIN_MAN:SPLEEN +CREATURE:PANGOLIN_MAN:KIDNEY +CREATURE:GIANT_PANGOLIN:MUSCLE +CREATURE:GIANT_PANGOLIN:EYE +CREATURE:GIANT_PANGOLIN:BRAIN +CREATURE:GIANT_PANGOLIN:LUNG +CREATURE:GIANT_PANGOLIN:HEART +CREATURE:GIANT_PANGOLIN:LIVER +CREATURE:GIANT_PANGOLIN:GUT +CREATURE:GIANT_PANGOLIN:STOMACH +CREATURE:GIANT_PANGOLIN:GIZZARD + CREATURE:GIANT_PANGOLIN:PANCREAS +CREATURE:GIANT_PANGOLIN:SPLEEN +CREATURE:GIANT_PANGOLIN:KIDNEY +CREATURE:BLACK_MAMBA:MUSCLE +CREATURE:BLACK_MAMBA:EYE +CREATURE:BLACK_MAMBA:BRAIN +CREATURE:BLACK_MAMBA:LUNG +CREATURE:BLACK_MAMBA:HEART +CREATURE:BLACK_MAMBA:LIVER +CREATURE:BLACK_MAMBA:GUT +CREATURE:BLACK_MAMBA:STOMACH +CREATURE:BLACK_MAMBA:GIZZARD +CREATURE:BLACK_MAMBA:PANCREAS +CREATURE:BLACK_MAMBA:SPLEEN +CREATURE:BLACK_MAMBA:KIDNEY +CREATURE:BLACK_MAMBA_MAN:MUSCLE +CREATURE:BLACK_MAMBA_MAN:EYE +CREATURE:BLACK_MAMBA_MAN:BRAIN +CREATURE:BLACK_MAMBA_MAN:LUNG +CREATURE:BLACK_MAMBA_MAN:HEART +CREATURE:BLACK_MAMBA_MAN:LIVER +CREATURE:BLACK_MAMBA_MAN:GUT + CREATURE:BLACK_MAMBA_MAN:STOMACH + CREATURE:BLACK_MAMBA_MAN:GIZZARD +!CREATURE:BLACK_MAMBA_MAN:PANCREAS +CREATURE:BLACK_MAMBA_MAN:SPLEEN +CREATURE:BLACK_MAMBA_MAN:KIDNEY +!CREATURE:GIANT_BLACK_MAMBA:MUSCLE +CREATURE:GIANT_BLACK_MAMBA:EYE + CREATURE:GIANT_BLACK_MAMBA:BRAIN +CREATURE:GIANT_BLACK_MAMBA:LUNG + CREATURE:GIANT_BLACK_MAMBA:HEART + CREATURE:GIANT_BLACK_MAMBA:LIVER +CREATURE:GIANT_BLACK_MAMBA:GUT +"CREATURE:GIANT_BLACK_MAMBA:STOMACH +"CREATURE:GIANT_BLACK_MAMBA:GIZZARD +#CREATURE:GIANT_BLACK_MAMBA:PANCREAS +!CREATURE:GIANT_BLACK_MAMBA:SPLEEN +!CREATURE:GIANT_BLACK_MAMBA:KIDNEY +CREATURE:BEAR_SLOTH:MUSCLE +CREATURE:BEAR_SLOTH:EYE +CREATURE:BEAR_SLOTH:BRAIN +CREATURE:BEAR_SLOTH:LUNG +CREATURE:BEAR_SLOTH:HEART +CREATURE:BEAR_SLOTH:LIVER +CREATURE:BEAR_SLOTH:GUT +CREATURE:BEAR_SLOTH:STOMACH +CREATURE:BEAR_SLOTH:GIZZARD +CREATURE:BEAR_SLOTH:PANCREAS +CREATURE:BEAR_SLOTH:SPLEEN +CREATURE:BEAR_SLOTH:KIDNEY +CREATURE:SLOTH_BEAR_MAN:MUSCLE +CREATURE:SLOTH_BEAR_MAN:EYE +CREATURE:SLOTH_BEAR_MAN:BRAIN +CREATURE:SLOTH_BEAR_MAN:LUNG +CREATURE:SLOTH_BEAR_MAN:HEART +CREATURE:SLOTH_BEAR_MAN:LIVER +CREATURE:SLOTH_BEAR_MAN:GUT +CREATURE:SLOTH_BEAR_MAN:STOMACH +CREATURE:SLOTH_BEAR_MAN:GIZZARD + CREATURE:SLOTH_BEAR_MAN:PANCREAS +CREATURE:SLOTH_BEAR_MAN:SPLEEN +CREATURE:SLOTH_BEAR_MAN:KIDNEY + CREATURE:GIANT_SLOTH_BEAR:MUSCLE +CREATURE:GIANT_SLOTH_BEAR:EYE +CREATURE:GIANT_SLOTH_BEAR:BRAIN +CREATURE:GIANT_SLOTH_BEAR:LUNG +CREATURE:GIANT_SLOTH_BEAR:HEART +CREATURE:GIANT_SLOTH_BEAR:LIVER +CREATURE:GIANT_SLOTH_BEAR:GUT +!CREATURE:GIANT_SLOTH_BEAR:STOMACH +!CREATURE:GIANT_SLOTH_BEAR:GIZZARD +"CREATURE:GIANT_SLOTH_BEAR:PANCREAS + CREATURE:GIANT_SLOTH_BEAR:SPLEEN + CREATURE:GIANT_SLOTH_BEAR:KIDNEY +CREATURE:AYE-AYE:MUSCLE +CREATURE:AYE-AYE:EYE +CREATURE:AYE-AYE:BRAIN +CREATURE:AYE-AYE:LUNG +CREATURE:AYE-AYE:HEART +CREATURE:AYE-AYE:LIVER +CREATURE:AYE-AYE:GUT +CREATURE:AYE-AYE:STOMACH +CREATURE:AYE-AYE:GIZZARD +CREATURE:AYE-AYE:PANCREAS +CREATURE:AYE-AYE:SPLEEN +CREATURE:AYE-AYE:KIDNEY +CREATURE:AYE-AYE_MAN:MUSCLE +CREATURE:AYE-AYE_MAN:EYE +CREATURE:AYE-AYE_MAN:BRAIN +CREATURE:AYE-AYE_MAN:LUNG +CREATURE:AYE-AYE_MAN:HEART +CREATURE:AYE-AYE_MAN:LIVER +CREATURE:AYE-AYE_MAN:GUT +CREATURE:AYE-AYE_MAN:STOMACH +CREATURE:AYE-AYE_MAN:GIZZARD +CREATURE:AYE-AYE_MAN:PANCREAS +CREATURE:AYE-AYE_MAN:SPLEEN +CREATURE:AYE-AYE_MAN:KIDNEY +CREATURE:GIANT_AYE-AYE:MUSCLE +CREATURE:GIANT_AYE-AYE:EYE +CREATURE:GIANT_AYE-AYE:BRAIN +CREATURE:GIANT_AYE-AYE:LUNG +CREATURE:GIANT_AYE-AYE:HEART +CREATURE:GIANT_AYE-AYE:LIVER +CREATURE:GIANT_AYE-AYE:GUT +CREATURE:GIANT_AYE-AYE:STOMACH +CREATURE:GIANT_AYE-AYE:GIZZARD +CREATURE:GIANT_AYE-AYE:PANCREAS +CREATURE:GIANT_AYE-AYE:SPLEEN +CREATURE:GIANT_AYE-AYE:KIDNEY +CREATURE:BUSHMASTER:MUSCLE +CREATURE:BUSHMASTER:EYE +CREATURE:BUSHMASTER:BRAIN +CREATURE:BUSHMASTER:LUNG +CREATURE:BUSHMASTER:HEART +CREATURE:BUSHMASTER:LIVER +CREATURE:BUSHMASTER:GUT +CREATURE:BUSHMASTER:STOMACH +CREATURE:BUSHMASTER:GIZZARD +CREATURE:BUSHMASTER:PANCREAS +CREATURE:BUSHMASTER:SPLEEN +CREATURE:BUSHMASTER:KIDNEY +CREATURE:BUSHMASTER_MAN:MUSCLE +CREATURE:BUSHMASTER_MAN:EYE +CREATURE:BUSHMASTER_MAN:BRAIN +CREATURE:BUSHMASTER_MAN:LUNG +CREATURE:BUSHMASTER_MAN:HEART +CREATURE:BUSHMASTER_MAN:LIVER +CREATURE:BUSHMASTER_MAN:GUT +CREATURE:BUSHMASTER_MAN:STOMACH +CREATURE:BUSHMASTER_MAN:GIZZARD + CREATURE:BUSHMASTER_MAN:PANCREAS +CREATURE:BUSHMASTER_MAN:SPLEEN +CREATURE:BUSHMASTER_MAN:KIDNEY + CREATURE:GIANT_BUSHMASTER:MUSCLE +CREATURE:GIANT_BUSHMASTER:EYE +CREATURE:GIANT_BUSHMASTER:BRAIN +CREATURE:GIANT_BUSHMASTER:LUNG +CREATURE:GIANT_BUSHMASTER:HEART +CREATURE:GIANT_BUSHMASTER:LIVER +CREATURE:GIANT_BUSHMASTER:GUT +!CREATURE:GIANT_BUSHMASTER:STOMACH +!CREATURE:GIANT_BUSHMASTER:GIZZARD +"CREATURE:GIANT_BUSHMASTER:PANCREAS + CREATURE:GIANT_BUSHMASTER:SPLEEN + CREATURE:GIANT_BUSHMASTER:KIDNEY +CREATURE:PYTHON:MUSCLE +CREATURE:PYTHON:EYE +CREATURE:PYTHON:BRAIN +CREATURE:PYTHON:LUNG +CREATURE:PYTHON:HEART +CREATURE:PYTHON:LIVER +CREATURE:PYTHON:GUT +CREATURE:PYTHON:STOMACH +CREATURE:PYTHON:GIZZARD +CREATURE:PYTHON:PANCREAS +CREATURE:PYTHON:SPLEEN +CREATURE:PYTHON:KIDNEY +CREATURE:PYTHON_MAN:MUSCLE +CREATURE:PYTHON_MAN:EYE +CREATURE:PYTHON_MAN:BRAIN +CREATURE:PYTHON_MAN:LUNG +CREATURE:PYTHON_MAN:HEART +CREATURE:PYTHON_MAN:LIVER +CREATURE:PYTHON_MAN:GUT +CREATURE:PYTHON_MAN:STOMACH +CREATURE:PYTHON_MAN:GIZZARD +CREATURE:PYTHON_MAN:PANCREAS +CREATURE:PYTHON_MAN:SPLEEN +CREATURE:PYTHON_MAN:KIDNEY +CREATURE:GIANT_PYTHON:MUSCLE +CREATURE:GIANT_PYTHON:EYE +CREATURE:GIANT_PYTHON:BRAIN +CREATURE:GIANT_PYTHON:LUNG +CREATURE:GIANT_PYTHON:HEART +CREATURE:GIANT_PYTHON:LIVER +CREATURE:GIANT_PYTHON:GUT +CREATURE:GIANT_PYTHON:STOMACH +CREATURE:GIANT_PYTHON:GIZZARD +CREATURE:GIANT_PYTHON:PANCREAS +CREATURE:GIANT_PYTHON:SPLEEN +CREATURE:GIANT_PYTHON:KIDNEY +CREATURE:TAPIR:MUSCLE +CREATURE:TAPIR:EYE +CREATURE:TAPIR:BRAIN +CREATURE:TAPIR:LUNG +CREATURE:TAPIR:HEART +CREATURE:TAPIR:LIVER +CREATURE:TAPIR:GUT +CREATURE:TAPIR:STOMACH +CREATURE:TAPIR:GIZZARD +CREATURE:TAPIR:PANCREAS +CREATURE:TAPIR:SPLEEN +CREATURE:TAPIR:KIDNEY +CREATURE:TAPIR_MAN:MUSCLE +CREATURE:TAPIR_MAN:EYE +CREATURE:TAPIR_MAN:BRAIN +CREATURE:TAPIR_MAN:LUNG +CREATURE:TAPIR_MAN:HEART +CREATURE:TAPIR_MAN:LIVER +CREATURE:TAPIR_MAN:GUT +CREATURE:TAPIR_MAN:STOMACH +CREATURE:TAPIR_MAN:GIZZARD +CREATURE:TAPIR_MAN:PANCREAS +CREATURE:TAPIR_MAN:SPLEEN +CREATURE:TAPIR_MAN:KIDNEY +CREATURE:GIANT_TAPIR:MUSCLE +CREATURE:GIANT_TAPIR:EYE +CREATURE:GIANT_TAPIR:BRAIN +CREATURE:GIANT_TAPIR:LUNG +CREATURE:GIANT_TAPIR:HEART +CREATURE:GIANT_TAPIR:LIVER +CREATURE:GIANT_TAPIR:GUT +CREATURE:GIANT_TAPIR:STOMACH +CREATURE:GIANT_TAPIR:GIZZARD +CREATURE:GIANT_TAPIR:PANCREAS +CREATURE:GIANT_TAPIR:SPLEEN +CREATURE:GIANT_TAPIR:KIDNEY +CREATURE:IMPALA:MUSCLE +CREATURE:IMPALA:EYE +CREATURE:IMPALA:BRAIN +CREATURE:IMPALA:LUNG +CREATURE:IMPALA:HEART +CREATURE:IMPALA:LIVER +CREATURE:IMPALA:GUT +CREATURE:IMPALA:STOMACH +CREATURE:IMPALA:GIZZARD +CREATURE:IMPALA:PANCREAS +CREATURE:IMPALA:SPLEEN +CREATURE:IMPALA:KIDNEY +CREATURE:IMPALA_MAN:MUSCLE +CREATURE:IMPALA_MAN:EYE +CREATURE:IMPALA_MAN:BRAIN +CREATURE:IMPALA_MAN:LUNG +CREATURE:IMPALA_MAN:HEART +CREATURE:IMPALA_MAN:LIVER +CREATURE:IMPALA_MAN:GUT +CREATURE:IMPALA_MAN:STOMACH +CREATURE:IMPALA_MAN:GIZZARD +CREATURE:IMPALA_MAN:PANCREAS +CREATURE:IMPALA_MAN:SPLEEN +CREATURE:IMPALA_MAN:KIDNEY +CREATURE:GIANT_IMPALA:MUSCLE +CREATURE:GIANT_IMPALA:EYE +CREATURE:GIANT_IMPALA:BRAIN +CREATURE:GIANT_IMPALA:LUNG +CREATURE:GIANT_IMPALA:HEART +CREATURE:GIANT_IMPALA:LIVER +CREATURE:GIANT_IMPALA:GUT +CREATURE:GIANT_IMPALA:STOMACH +CREATURE:GIANT_IMPALA:GIZZARD +CREATURE:GIANT_IMPALA:PANCREAS +CREATURE:GIANT_IMPALA:SPLEEN +CREATURE:GIANT_IMPALA:KIDNEY +CREATURE:AARDVARK:MUSCLE +CREATURE:AARDVARK:EYE +CREATURE:AARDVARK:BRAIN +CREATURE:AARDVARK:LUNG +CREATURE:AARDVARK:HEART +CREATURE:AARDVARK:LIVER +CREATURE:AARDVARK:GUT +CREATURE:AARDVARK:STOMACH +CREATURE:AARDVARK:GIZZARD +CREATURE:AARDVARK:PANCREAS +CREATURE:AARDVARK:SPLEEN +CREATURE:AARDVARK:KIDNEY +CREATURE:AARDVARK_MAN:MUSCLE +CREATURE:AARDVARK_MAN:EYE +CREATURE:AARDVARK_MAN:BRAIN +CREATURE:AARDVARK_MAN:LUNG +CREATURE:AARDVARK_MAN:HEART +CREATURE:AARDVARK_MAN:LIVER +CREATURE:AARDVARK_MAN:GUT +CREATURE:AARDVARK_MAN:STOMACH +CREATURE:AARDVARK_MAN:GIZZARD +CREATURE:AARDVARK_MAN:PANCREAS +CREATURE:AARDVARK_MAN:SPLEEN +CREATURE:AARDVARK_MAN:KIDNEY +CREATURE:GIANT_AARDVARK:MUSCLE +CREATURE:GIANT_AARDVARK:EYE +CREATURE:GIANT_AARDVARK:BRAIN +CREATURE:GIANT_AARDVARK:LUNG +CREATURE:GIANT_AARDVARK:HEART +CREATURE:GIANT_AARDVARK:LIVER +CREATURE:GIANT_AARDVARK:GUT +CREATURE:GIANT_AARDVARK:STOMACH +CREATURE:GIANT_AARDVARK:GIZZARD + CREATURE:GIANT_AARDVARK:PANCREAS +CREATURE:GIANT_AARDVARK:SPLEEN +CREATURE:GIANT_AARDVARK:KIDNEY +CREATURE:LION_TAMARIN:MUSCLE +CREATURE:LION_TAMARIN:EYE +CREATURE:LION_TAMARIN:BRAIN +CREATURE:LION_TAMARIN:LUNG +CREATURE:LION_TAMARIN:HEART +CREATURE:LION_TAMARIN:LIVER +CREATURE:LION_TAMARIN:GUT +CREATURE:LION_TAMARIN:STOMACH +CREATURE:LION_TAMARIN:GIZZARD +CREATURE:LION_TAMARIN:PANCREAS +CREATURE:LION_TAMARIN:SPLEEN +CREATURE:LION_TAMARIN:KIDNEY + CREATURE:LION_TAMARIN_MAN:MUSCLE +CREATURE:LION_TAMARIN_MAN:EYE +CREATURE:LION_TAMARIN_MAN:BRAIN +CREATURE:LION_TAMARIN_MAN:LUNG +CREATURE:LION_TAMARIN_MAN:HEART +CREATURE:LION_TAMARIN_MAN:LIVER +CREATURE:LION_TAMARIN_MAN:GUT +!CREATURE:LION_TAMARIN_MAN:STOMACH +!CREATURE:LION_TAMARIN_MAN:GIZZARD +"CREATURE:LION_TAMARIN_MAN:PANCREAS + CREATURE:LION_TAMARIN_MAN:SPLEEN + CREATURE:LION_TAMARIN_MAN:KIDNEY +"CREATURE:GIANT_LION_TAMARIN:MUSCLE +CREATURE:GIANT_LION_TAMARIN:EYE +!CREATURE:GIANT_LION_TAMARIN:BRAIN + CREATURE:GIANT_LION_TAMARIN:LUNG +!CREATURE:GIANT_LION_TAMARIN:HEART +!CREATURE:GIANT_LION_TAMARIN:LIVER +CREATURE:GIANT_LION_TAMARIN:GUT +#CREATURE:GIANT_LION_TAMARIN:STOMACH +#CREATURE:GIANT_LION_TAMARIN:GIZZARD +$CREATURE:GIANT_LION_TAMARIN:PANCREAS +"CREATURE:GIANT_LION_TAMARIN:SPLEEN +"CREATURE:GIANT_LION_TAMARIN:KIDNEY +CREATURE:STOAT:MUSCLE +CREATURE:STOAT:EYE +CREATURE:STOAT:BRAIN +CREATURE:STOAT:LUNG +CREATURE:STOAT:HEART +CREATURE:STOAT:LIVER +CREATURE:STOAT:GUT +CREATURE:STOAT:STOMACH +CREATURE:STOAT:GIZZARD +CREATURE:STOAT:PANCREAS +CREATURE:STOAT:SPLEEN +CREATURE:STOAT:KIDNEY +CREATURE:STOAT_MAN:MUSCLE +CREATURE:STOAT_MAN:EYE +CREATURE:STOAT_MAN:BRAIN +CREATURE:STOAT_MAN:LUNG +CREATURE:STOAT_MAN:HEART +CREATURE:STOAT_MAN:LIVER +CREATURE:STOAT_MAN:GUT +CREATURE:STOAT_MAN:STOMACH +CREATURE:STOAT_MAN:GIZZARD +CREATURE:STOAT_MAN:PANCREAS +CREATURE:STOAT_MAN:SPLEEN +CREATURE:STOAT_MAN:KIDNEY +CREATURE:GIANT_STOAT:MUSCLE +CREATURE:GIANT_STOAT:EYE +CREATURE:GIANT_STOAT:BRAIN +CREATURE:GIANT_STOAT:LUNG +CREATURE:GIANT_STOAT:HEART +CREATURE:GIANT_STOAT:LIVER +CREATURE:GIANT_STOAT:GUT +CREATURE:GIANT_STOAT:STOMACH +CREATURE:GIANT_STOAT:GIZZARD +CREATURE:GIANT_STOAT:PANCREAS +CREATURE:GIANT_STOAT:SPLEEN +CREATURE:GIANT_STOAT:KIDNEY +CREATURE:LYNX:MUSCLE +CREATURE:LYNX:EYE +CREATURE:LYNX:BRAIN +CREATURE:LYNX:LUNG +CREATURE:LYNX:HEART +CREATURE:LYNX:LIVER +CREATURE:LYNX:GUT +CREATURE:LYNX:STOMACH +CREATURE:LYNX:GIZZARD +CREATURE:LYNX:PANCREAS +CREATURE:LYNX:SPLEEN +CREATURE:LYNX:KIDNEY +CREATURE:LYNX_MAN:MUSCLE +CREATURE:LYNX_MAN:EYE +CREATURE:LYNX_MAN:BRAIN +CREATURE:LYNX_MAN:LUNG +CREATURE:LYNX_MAN:HEART +CREATURE:LYNX_MAN:LIVER +CREATURE:LYNX_MAN:GUT +CREATURE:LYNX_MAN:STOMACH +CREATURE:LYNX_MAN:GIZZARD +CREATURE:LYNX_MAN:PANCREAS +CREATURE:LYNX_MAN:SPLEEN +CREATURE:LYNX_MAN:KIDNEY +CREATURE:GIANT_LYNX:MUSCLE +CREATURE:GIANT_LYNX:EYE +CREATURE:GIANT_LYNX:BRAIN +CREATURE:GIANT_LYNX:LUNG +CREATURE:GIANT_LYNX:HEART +CREATURE:GIANT_LYNX:LIVER +CREATURE:GIANT_LYNX:GUT +CREATURE:GIANT_LYNX:STOMACH +CREATURE:GIANT_LYNX:GIZZARD +CREATURE:GIANT_LYNX:PANCREAS +CREATURE:GIANT_LYNX:SPLEEN +CREATURE:GIANT_LYNX:KIDNEY +CREATURE:GNOLL:MUSCLE +CREATURE:GNOLL:EYE +CREATURE:GNOLL:BRAIN +CREATURE:GNOLL:LUNG +CREATURE:GNOLL:HEART +CREATURE:GNOLL:LIVER +CREATURE:GNOLL:GUT +CREATURE:GNOLL:STOMACH +CREATURE:GNOLL:GIZZARD +CREATURE:GNOLL:PANCREAS +CREATURE:GNOLL:SPLEEN +CREATURE:GNOLL:KIDNEY +CREATURE:NAGA:MUSCLE +CREATURE:NAGA:EYE +CREATURE:NAGA:BRAIN +CREATURE:NAGA:LUNG +CREATURE:NAGA:HEART +CREATURE:NAGA:LIVER +CREATURE:NAGA:GUT +CREATURE:NAGA:STOMACH +CREATURE:NAGA:GIZZARD +CREATURE:NAGA:PANCREAS +CREATURE:NAGA:SPLEEN +CREATURE:NAGA:KIDNEY +!CREATURE:FORGOTTEN_BEAST_2:MUSCLE +CREATURE:FORGOTTEN_BEAST_2:EYE + CREATURE:FORGOTTEN_BEAST_2:BRAIN +CREATURE:FORGOTTEN_BEAST_2:LUNG + CREATURE:FORGOTTEN_BEAST_2:HEART + CREATURE:FORGOTTEN_BEAST_2:LIVER +CREATURE:FORGOTTEN_BEAST_2:GUT +"CREATURE:FORGOTTEN_BEAST_2:STOMACH +"CREATURE:FORGOTTEN_BEAST_2:GIZZARD +#CREATURE:FORGOTTEN_BEAST_2:PANCREAS +!CREATURE:FORGOTTEN_BEAST_2:SPLEEN +!CREATURE:FORGOTTEN_BEAST_2:KIDNEY +!CREATURE:FORGOTTEN_BEAST_4:MUSCLE +CREATURE:FORGOTTEN_BEAST_4:EYE + CREATURE:FORGOTTEN_BEAST_4:BRAIN +CREATURE:FORGOTTEN_BEAST_4:LUNG + CREATURE:FORGOTTEN_BEAST_4:HEART + CREATURE:FORGOTTEN_BEAST_4:LIVER +CREATURE:FORGOTTEN_BEAST_4:GUT +"CREATURE:FORGOTTEN_BEAST_4:STOMACH +"CREATURE:FORGOTTEN_BEAST_4:GIZZARD +#CREATURE:FORGOTTEN_BEAST_4:PANCREAS +!CREATURE:FORGOTTEN_BEAST_4:SPLEEN +!CREATURE:FORGOTTEN_BEAST_4:KIDNEY +!CREATURE:FORGOTTEN_BEAST_5:MUSCLE +CREATURE:FORGOTTEN_BEAST_5:EYE + CREATURE:FORGOTTEN_BEAST_5:BRAIN +CREATURE:FORGOTTEN_BEAST_5:LUNG + CREATURE:FORGOTTEN_BEAST_5:HEART + CREATURE:FORGOTTEN_BEAST_5:LIVER +CREATURE:FORGOTTEN_BEAST_5:GUT +"CREATURE:FORGOTTEN_BEAST_5:STOMACH +"CREATURE:FORGOTTEN_BEAST_5:GIZZARD +#CREATURE:FORGOTTEN_BEAST_5:PANCREAS +!CREATURE:FORGOTTEN_BEAST_5:SPLEEN +!CREATURE:FORGOTTEN_BEAST_5:KIDNEY +!CREATURE:FORGOTTEN_BEAST_6:MUSCLE +CREATURE:FORGOTTEN_BEAST_6:EYE + CREATURE:FORGOTTEN_BEAST_6:BRAIN +CREATURE:FORGOTTEN_BEAST_6:LUNG + CREATURE:FORGOTTEN_BEAST_6:HEART + CREATURE:FORGOTTEN_BEAST_6:LIVER +CREATURE:FORGOTTEN_BEAST_6:GUT +"CREATURE:FORGOTTEN_BEAST_6:STOMACH +"CREATURE:FORGOTTEN_BEAST_6:GIZZARD +#CREATURE:FORGOTTEN_BEAST_6:PANCREAS +!CREATURE:FORGOTTEN_BEAST_6:SPLEEN +!CREATURE:FORGOTTEN_BEAST_6:KIDNEY +!CREATURE:FORGOTTEN_BEAST_7:MUSCLE +CREATURE:FORGOTTEN_BEAST_7:EYE + CREATURE:FORGOTTEN_BEAST_7:BRAIN +CREATURE:FORGOTTEN_BEAST_7:LUNG + CREATURE:FORGOTTEN_BEAST_7:HEART + CREATURE:FORGOTTEN_BEAST_7:LIVER +CREATURE:FORGOTTEN_BEAST_7:GUT +"CREATURE:FORGOTTEN_BEAST_7:STOMACH +"CREATURE:FORGOTTEN_BEAST_7:GIZZARD +#CREATURE:FORGOTTEN_BEAST_7:PANCREAS +!CREATURE:FORGOTTEN_BEAST_7:SPLEEN +!CREATURE:FORGOTTEN_BEAST_7:KIDNEY +"CREATURE:FORGOTTEN_BEAST_10:MUSCLE +CREATURE:FORGOTTEN_BEAST_10:EYE +!CREATURE:FORGOTTEN_BEAST_10:BRAIN + CREATURE:FORGOTTEN_BEAST_10:LUNG +!CREATURE:FORGOTTEN_BEAST_10:HEART +!CREATURE:FORGOTTEN_BEAST_10:LIVER +CREATURE:FORGOTTEN_BEAST_10:GUT +#CREATURE:FORGOTTEN_BEAST_10:STOMACH +#CREATURE:FORGOTTEN_BEAST_10:GIZZARD +$CREATURE:FORGOTTEN_BEAST_10:PANCREAS +"CREATURE:FORGOTTEN_BEAST_10:SPLEEN +"CREATURE:FORGOTTEN_BEAST_10:KIDNEY +"CREATURE:FORGOTTEN_BEAST_12:MUSCLE +CREATURE:FORGOTTEN_BEAST_12:EYE +!CREATURE:FORGOTTEN_BEAST_12:BRAIN + CREATURE:FORGOTTEN_BEAST_12:LUNG +!CREATURE:FORGOTTEN_BEAST_12:HEART +!CREATURE:FORGOTTEN_BEAST_12:LIVER +CREATURE:FORGOTTEN_BEAST_12:GUT +#CREATURE:FORGOTTEN_BEAST_12:STOMACH +#CREATURE:FORGOTTEN_BEAST_12:GIZZARD +$CREATURE:FORGOTTEN_BEAST_12:PANCREAS +"CREATURE:FORGOTTEN_BEAST_12:SPLEEN +"CREATURE:FORGOTTEN_BEAST_12:KIDNEY +"CREATURE:FORGOTTEN_BEAST_13:MUSCLE +CREATURE:FORGOTTEN_BEAST_13:EYE +!CREATURE:FORGOTTEN_BEAST_13:BRAIN + CREATURE:FORGOTTEN_BEAST_13:LUNG +!CREATURE:FORGOTTEN_BEAST_13:HEART +!CREATURE:FORGOTTEN_BEAST_13:LIVER +CREATURE:FORGOTTEN_BEAST_13:GUT +#CREATURE:FORGOTTEN_BEAST_13:STOMACH +#CREATURE:FORGOTTEN_BEAST_13:GIZZARD +$CREATURE:FORGOTTEN_BEAST_13:PANCREAS +"CREATURE:FORGOTTEN_BEAST_13:SPLEEN +"CREATURE:FORGOTTEN_BEAST_13:KIDNEY +"CREATURE:FORGOTTEN_BEAST_16:MUSCLE +CREATURE:FORGOTTEN_BEAST_16:EYE +!CREATURE:FORGOTTEN_BEAST_16:BRAIN + CREATURE:FORGOTTEN_BEAST_16:LUNG +!CREATURE:FORGOTTEN_BEAST_16:HEART +!CREATURE:FORGOTTEN_BEAST_16:LIVER +CREATURE:FORGOTTEN_BEAST_16:GUT +#CREATURE:FORGOTTEN_BEAST_16:STOMACH +#CREATURE:FORGOTTEN_BEAST_16:GIZZARD +$CREATURE:FORGOTTEN_BEAST_16:PANCREAS +"CREATURE:FORGOTTEN_BEAST_16:SPLEEN +"CREATURE:FORGOTTEN_BEAST_16:KIDNEY +"CREATURE:FORGOTTEN_BEAST_17:MUSCLE +CREATURE:FORGOTTEN_BEAST_17:EYE +!CREATURE:FORGOTTEN_BEAST_17:BRAIN + CREATURE:FORGOTTEN_BEAST_17:LUNG +!CREATURE:FORGOTTEN_BEAST_17:HEART +!CREATURE:FORGOTTEN_BEAST_17:LIVER +CREATURE:FORGOTTEN_BEAST_17:GUT +#CREATURE:FORGOTTEN_BEAST_17:STOMACH +#CREATURE:FORGOTTEN_BEAST_17:GIZZARD +$CREATURE:FORGOTTEN_BEAST_17:PANCREAS +"CREATURE:FORGOTTEN_BEAST_17:SPLEEN +"CREATURE:FORGOTTEN_BEAST_17:KIDNEY +"CREATURE:FORGOTTEN_BEAST_18:MUSCLE +CREATURE:FORGOTTEN_BEAST_18:EYE +!CREATURE:FORGOTTEN_BEAST_18:BRAIN + CREATURE:FORGOTTEN_BEAST_18:LUNG +!CREATURE:FORGOTTEN_BEAST_18:HEART +!CREATURE:FORGOTTEN_BEAST_18:LIVER +CREATURE:FORGOTTEN_BEAST_18:GUT +#CREATURE:FORGOTTEN_BEAST_18:STOMACH +#CREATURE:FORGOTTEN_BEAST_18:GIZZARD +$CREATURE:FORGOTTEN_BEAST_18:PANCREAS +"CREATURE:FORGOTTEN_BEAST_18:SPLEEN +"CREATURE:FORGOTTEN_BEAST_18:KIDNEY +"CREATURE:FORGOTTEN_BEAST_19:MUSCLE +CREATURE:FORGOTTEN_BEAST_19:EYE +!CREATURE:FORGOTTEN_BEAST_19:BRAIN + CREATURE:FORGOTTEN_BEAST_19:LUNG +!CREATURE:FORGOTTEN_BEAST_19:HEART +!CREATURE:FORGOTTEN_BEAST_19:LIVER +CREATURE:FORGOTTEN_BEAST_19:GUT +#CREATURE:FORGOTTEN_BEAST_19:STOMACH +#CREATURE:FORGOTTEN_BEAST_19:GIZZARD +$CREATURE:FORGOTTEN_BEAST_19:PANCREAS +"CREATURE:FORGOTTEN_BEAST_19:SPLEEN +"CREATURE:FORGOTTEN_BEAST_19:KIDNEY +"CREATURE:FORGOTTEN_BEAST_20:MUSCLE +CREATURE:FORGOTTEN_BEAST_20:EYE +!CREATURE:FORGOTTEN_BEAST_20:BRAIN + CREATURE:FORGOTTEN_BEAST_20:LUNG +!CREATURE:FORGOTTEN_BEAST_20:HEART +!CREATURE:FORGOTTEN_BEAST_20:LIVER +CREATURE:FORGOTTEN_BEAST_20:GUT +#CREATURE:FORGOTTEN_BEAST_20:STOMACH +#CREATURE:FORGOTTEN_BEAST_20:GIZZARD +$CREATURE:FORGOTTEN_BEAST_20:PANCREAS +"CREATURE:FORGOTTEN_BEAST_20:SPLEEN +"CREATURE:FORGOTTEN_BEAST_20:KIDNEY +"CREATURE:FORGOTTEN_BEAST_22:MUSCLE +CREATURE:FORGOTTEN_BEAST_22:EYE +!CREATURE:FORGOTTEN_BEAST_22:BRAIN + CREATURE:FORGOTTEN_BEAST_22:LUNG +!CREATURE:FORGOTTEN_BEAST_22:HEART +!CREATURE:FORGOTTEN_BEAST_22:LIVER +CREATURE:FORGOTTEN_BEAST_22:GUT +#CREATURE:FORGOTTEN_BEAST_22:STOMACH +#CREATURE:FORGOTTEN_BEAST_22:GIZZARD +$CREATURE:FORGOTTEN_BEAST_22:PANCREAS +"CREATURE:FORGOTTEN_BEAST_22:SPLEEN +"CREATURE:FORGOTTEN_BEAST_22:KIDNEY +"CREATURE:FORGOTTEN_BEAST_23:MUSCLE +CREATURE:FORGOTTEN_BEAST_23:EYE +!CREATURE:FORGOTTEN_BEAST_23:BRAIN + CREATURE:FORGOTTEN_BEAST_23:LUNG +!CREATURE:FORGOTTEN_BEAST_23:HEART +!CREATURE:FORGOTTEN_BEAST_23:LIVER +CREATURE:FORGOTTEN_BEAST_23:GUT +#CREATURE:FORGOTTEN_BEAST_23:STOMACH +#CREATURE:FORGOTTEN_BEAST_23:GIZZARD +$CREATURE:FORGOTTEN_BEAST_23:PANCREAS +"CREATURE:FORGOTTEN_BEAST_23:SPLEEN +"CREATURE:FORGOTTEN_BEAST_23:KIDNEY +"CREATURE:FORGOTTEN_BEAST_24:MUSCLE +CREATURE:FORGOTTEN_BEAST_24:EYE +!CREATURE:FORGOTTEN_BEAST_24:BRAIN + CREATURE:FORGOTTEN_BEAST_24:LUNG +!CREATURE:FORGOTTEN_BEAST_24:HEART +!CREATURE:FORGOTTEN_BEAST_24:LIVER +CREATURE:FORGOTTEN_BEAST_24:GUT +#CREATURE:FORGOTTEN_BEAST_24:STOMACH +#CREATURE:FORGOTTEN_BEAST_24:GIZZARD +$CREATURE:FORGOTTEN_BEAST_24:PANCREAS +"CREATURE:FORGOTTEN_BEAST_24:SPLEEN +"CREATURE:FORGOTTEN_BEAST_24:KIDNEY +"CREATURE:FORGOTTEN_BEAST_25:MUSCLE +CREATURE:FORGOTTEN_BEAST_25:EYE +!CREATURE:FORGOTTEN_BEAST_25:BRAIN + CREATURE:FORGOTTEN_BEAST_25:LUNG +!CREATURE:FORGOTTEN_BEAST_25:HEART +!CREATURE:FORGOTTEN_BEAST_25:LIVER +CREATURE:FORGOTTEN_BEAST_25:GUT +#CREATURE:FORGOTTEN_BEAST_25:STOMACH +#CREATURE:FORGOTTEN_BEAST_25:GIZZARD +$CREATURE:FORGOTTEN_BEAST_25:PANCREAS +"CREATURE:FORGOTTEN_BEAST_25:SPLEEN +"CREATURE:FORGOTTEN_BEAST_25:KIDNEY +"CREATURE:FORGOTTEN_BEAST_26:MUSCLE +CREATURE:FORGOTTEN_BEAST_26:EYE +!CREATURE:FORGOTTEN_BEAST_26:BRAIN + CREATURE:FORGOTTEN_BEAST_26:LUNG +!CREATURE:FORGOTTEN_BEAST_26:HEART +!CREATURE:FORGOTTEN_BEAST_26:LIVER +CREATURE:FORGOTTEN_BEAST_26:GUT +#CREATURE:FORGOTTEN_BEAST_26:STOMACH +#CREATURE:FORGOTTEN_BEAST_26:GIZZARD +$CREATURE:FORGOTTEN_BEAST_26:PANCREAS +"CREATURE:FORGOTTEN_BEAST_26:SPLEEN +"CREATURE:FORGOTTEN_BEAST_26:KIDNEY +"CREATURE:FORGOTTEN_BEAST_27:MUSCLE +CREATURE:FORGOTTEN_BEAST_27:EYE +!CREATURE:FORGOTTEN_BEAST_27:BRAIN + CREATURE:FORGOTTEN_BEAST_27:LUNG +!CREATURE:FORGOTTEN_BEAST_27:HEART +!CREATURE:FORGOTTEN_BEAST_27:LIVER +CREATURE:FORGOTTEN_BEAST_27:GUT +#CREATURE:FORGOTTEN_BEAST_27:STOMACH +#CREATURE:FORGOTTEN_BEAST_27:GIZZARD +$CREATURE:FORGOTTEN_BEAST_27:PANCREAS +"CREATURE:FORGOTTEN_BEAST_27:SPLEEN +"CREATURE:FORGOTTEN_BEAST_27:KIDNEY +"CREATURE:FORGOTTEN_BEAST_28:MUSCLE +CREATURE:FORGOTTEN_BEAST_28:EYE +!CREATURE:FORGOTTEN_BEAST_28:BRAIN + CREATURE:FORGOTTEN_BEAST_28:LUNG +!CREATURE:FORGOTTEN_BEAST_28:HEART +!CREATURE:FORGOTTEN_BEAST_28:LIVER +CREATURE:FORGOTTEN_BEAST_28:GUT +#CREATURE:FORGOTTEN_BEAST_28:STOMACH +#CREATURE:FORGOTTEN_BEAST_28:GIZZARD +$CREATURE:FORGOTTEN_BEAST_28:PANCREAS +"CREATURE:FORGOTTEN_BEAST_28:SPLEEN +"CREATURE:FORGOTTEN_BEAST_28:KIDNEY +"CREATURE:FORGOTTEN_BEAST_29:MUSCLE +CREATURE:FORGOTTEN_BEAST_29:EYE +!CREATURE:FORGOTTEN_BEAST_29:BRAIN + CREATURE:FORGOTTEN_BEAST_29:LUNG +!CREATURE:FORGOTTEN_BEAST_29:HEART +!CREATURE:FORGOTTEN_BEAST_29:LIVER +CREATURE:FORGOTTEN_BEAST_29:GUT +#CREATURE:FORGOTTEN_BEAST_29:STOMACH +#CREATURE:FORGOTTEN_BEAST_29:GIZZARD +$CREATURE:FORGOTTEN_BEAST_29:PANCREAS +"CREATURE:FORGOTTEN_BEAST_29:SPLEEN +"CREATURE:FORGOTTEN_BEAST_29:KIDNEY +"CREATURE:FORGOTTEN_BEAST_32:MUSCLE +CREATURE:FORGOTTEN_BEAST_32:EYE +!CREATURE:FORGOTTEN_BEAST_32:BRAIN + CREATURE:FORGOTTEN_BEAST_32:LUNG +!CREATURE:FORGOTTEN_BEAST_32:HEART +!CREATURE:FORGOTTEN_BEAST_32:LIVER +CREATURE:FORGOTTEN_BEAST_32:GUT +#CREATURE:FORGOTTEN_BEAST_32:STOMACH +#CREATURE:FORGOTTEN_BEAST_32:GIZZARD +$CREATURE:FORGOTTEN_BEAST_32:PANCREAS +"CREATURE:FORGOTTEN_BEAST_32:SPLEEN +"CREATURE:FORGOTTEN_BEAST_32:KIDNEY +"CREATURE:FORGOTTEN_BEAST_33:MUSCLE +CREATURE:FORGOTTEN_BEAST_33:EYE +!CREATURE:FORGOTTEN_BEAST_33:BRAIN + CREATURE:FORGOTTEN_BEAST_33:LUNG +!CREATURE:FORGOTTEN_BEAST_33:HEART +!CREATURE:FORGOTTEN_BEAST_33:LIVER +CREATURE:FORGOTTEN_BEAST_33:GUT +#CREATURE:FORGOTTEN_BEAST_33:STOMACH +#CREATURE:FORGOTTEN_BEAST_33:GIZZARD +$CREATURE:FORGOTTEN_BEAST_33:PANCREAS +"CREATURE:FORGOTTEN_BEAST_33:SPLEEN +"CREATURE:FORGOTTEN_BEAST_33:KIDNEY +"CREATURE:FORGOTTEN_BEAST_34:MUSCLE +CREATURE:FORGOTTEN_BEAST_34:EYE +!CREATURE:FORGOTTEN_BEAST_34:BRAIN + CREATURE:FORGOTTEN_BEAST_34:LUNG +!CREATURE:FORGOTTEN_BEAST_34:HEART +!CREATURE:FORGOTTEN_BEAST_34:LIVER +CREATURE:FORGOTTEN_BEAST_34:GUT +#CREATURE:FORGOTTEN_BEAST_34:STOMACH +#CREATURE:FORGOTTEN_BEAST_34:GIZZARD +$CREATURE:FORGOTTEN_BEAST_34:PANCREAS +"CREATURE:FORGOTTEN_BEAST_34:SPLEEN +"CREATURE:FORGOTTEN_BEAST_34:KIDNEY +"CREATURE:FORGOTTEN_BEAST_35:MUSCLE +CREATURE:FORGOTTEN_BEAST_35:EYE +!CREATURE:FORGOTTEN_BEAST_35:BRAIN + CREATURE:FORGOTTEN_BEAST_35:LUNG +!CREATURE:FORGOTTEN_BEAST_35:HEART +!CREATURE:FORGOTTEN_BEAST_35:LIVER +CREATURE:FORGOTTEN_BEAST_35:GUT +#CREATURE:FORGOTTEN_BEAST_35:STOMACH +#CREATURE:FORGOTTEN_BEAST_35:GIZZARD +$CREATURE:FORGOTTEN_BEAST_35:PANCREAS +"CREATURE:FORGOTTEN_BEAST_35:SPLEEN +"CREATURE:FORGOTTEN_BEAST_35:KIDNEY +"CREATURE:FORGOTTEN_BEAST_36:MUSCLE +CREATURE:FORGOTTEN_BEAST_36:EYE +!CREATURE:FORGOTTEN_BEAST_36:BRAIN + CREATURE:FORGOTTEN_BEAST_36:LUNG +!CREATURE:FORGOTTEN_BEAST_36:HEART +!CREATURE:FORGOTTEN_BEAST_36:LIVER +CREATURE:FORGOTTEN_BEAST_36:GUT +#CREATURE:FORGOTTEN_BEAST_36:STOMACH +#CREATURE:FORGOTTEN_BEAST_36:GIZZARD +$CREATURE:FORGOTTEN_BEAST_36:PANCREAS +"CREATURE:FORGOTTEN_BEAST_36:SPLEEN +"CREATURE:FORGOTTEN_BEAST_36:KIDNEY +"CREATURE:FORGOTTEN_BEAST_39:MUSCLE +CREATURE:FORGOTTEN_BEAST_39:EYE +!CREATURE:FORGOTTEN_BEAST_39:BRAIN + CREATURE:FORGOTTEN_BEAST_39:LUNG +!CREATURE:FORGOTTEN_BEAST_39:HEART +!CREATURE:FORGOTTEN_BEAST_39:LIVER +CREATURE:FORGOTTEN_BEAST_39:GUT +#CREATURE:FORGOTTEN_BEAST_39:STOMACH +#CREATURE:FORGOTTEN_BEAST_39:GIZZARD +$CREATURE:FORGOTTEN_BEAST_39:PANCREAS +"CREATURE:FORGOTTEN_BEAST_39:SPLEEN +"CREATURE:FORGOTTEN_BEAST_39:KIDNEY +"CREATURE:FORGOTTEN_BEAST_41:MUSCLE +CREATURE:FORGOTTEN_BEAST_41:EYE +!CREATURE:FORGOTTEN_BEAST_41:BRAIN + CREATURE:FORGOTTEN_BEAST_41:LUNG +!CREATURE:FORGOTTEN_BEAST_41:HEART +!CREATURE:FORGOTTEN_BEAST_41:LIVER +CREATURE:FORGOTTEN_BEAST_41:GUT +#CREATURE:FORGOTTEN_BEAST_41:STOMACH +#CREATURE:FORGOTTEN_BEAST_41:GIZZARD +$CREATURE:FORGOTTEN_BEAST_41:PANCREAS +"CREATURE:FORGOTTEN_BEAST_41:SPLEEN +"CREATURE:FORGOTTEN_BEAST_41:KIDNEY +"CREATURE:FORGOTTEN_BEAST_42:MUSCLE +CREATURE:FORGOTTEN_BEAST_42:EYE +!CREATURE:FORGOTTEN_BEAST_42:BRAIN + CREATURE:FORGOTTEN_BEAST_42:LUNG +!CREATURE:FORGOTTEN_BEAST_42:HEART +!CREATURE:FORGOTTEN_BEAST_42:LIVER +CREATURE:FORGOTTEN_BEAST_42:GUT +#CREATURE:FORGOTTEN_BEAST_42:STOMACH +#CREATURE:FORGOTTEN_BEAST_42:GIZZARD +$CREATURE:FORGOTTEN_BEAST_42:PANCREAS +"CREATURE:FORGOTTEN_BEAST_42:SPLEEN +"CREATURE:FORGOTTEN_BEAST_42:KIDNEY +"CREATURE:FORGOTTEN_BEAST_43:MUSCLE +CREATURE:FORGOTTEN_BEAST_43:EYE +!CREATURE:FORGOTTEN_BEAST_43:BRAIN + CREATURE:FORGOTTEN_BEAST_43:LUNG +!CREATURE:FORGOTTEN_BEAST_43:HEART +!CREATURE:FORGOTTEN_BEAST_43:LIVER +CREATURE:FORGOTTEN_BEAST_43:GUT +#CREATURE:FORGOTTEN_BEAST_43:STOMACH +#CREATURE:FORGOTTEN_BEAST_43:GIZZARD +$CREATURE:FORGOTTEN_BEAST_43:PANCREAS +"CREATURE:FORGOTTEN_BEAST_43:SPLEEN +"CREATURE:FORGOTTEN_BEAST_43:KIDNEY +"CREATURE:FORGOTTEN_BEAST_44:MUSCLE +CREATURE:FORGOTTEN_BEAST_44:EYE +!CREATURE:FORGOTTEN_BEAST_44:BRAIN + CREATURE:FORGOTTEN_BEAST_44:LUNG +!CREATURE:FORGOTTEN_BEAST_44:HEART +!CREATURE:FORGOTTEN_BEAST_44:LIVER +CREATURE:FORGOTTEN_BEAST_44:GUT +#CREATURE:FORGOTTEN_BEAST_44:STOMACH +#CREATURE:FORGOTTEN_BEAST_44:GIZZARD +$CREATURE:FORGOTTEN_BEAST_44:PANCREAS +"CREATURE:FORGOTTEN_BEAST_44:SPLEEN +"CREATURE:FORGOTTEN_BEAST_44:KIDNEY +"CREATURE:FORGOTTEN_BEAST_45:MUSCLE +CREATURE:FORGOTTEN_BEAST_45:EYE +!CREATURE:FORGOTTEN_BEAST_45:BRAIN + CREATURE:FORGOTTEN_BEAST_45:LUNG +!CREATURE:FORGOTTEN_BEAST_45:HEART +!CREATURE:FORGOTTEN_BEAST_45:LIVER +CREATURE:FORGOTTEN_BEAST_45:GUT +#CREATURE:FORGOTTEN_BEAST_45:STOMACH +#CREATURE:FORGOTTEN_BEAST_45:GIZZARD +$CREATURE:FORGOTTEN_BEAST_45:PANCREAS +"CREATURE:FORGOTTEN_BEAST_45:SPLEEN +"CREATURE:FORGOTTEN_BEAST_45:KIDNEY +"CREATURE:FORGOTTEN_BEAST_47:MUSCLE +CREATURE:FORGOTTEN_BEAST_47:EYE +!CREATURE:FORGOTTEN_BEAST_47:BRAIN + CREATURE:FORGOTTEN_BEAST_47:LUNG +!CREATURE:FORGOTTEN_BEAST_47:HEART +!CREATURE:FORGOTTEN_BEAST_47:LIVER +CREATURE:FORGOTTEN_BEAST_47:GUT +#CREATURE:FORGOTTEN_BEAST_47:STOMACH +#CREATURE:FORGOTTEN_BEAST_47:GIZZARD +$CREATURE:FORGOTTEN_BEAST_47:PANCREAS +"CREATURE:FORGOTTEN_BEAST_47:SPLEEN +"CREATURE:FORGOTTEN_BEAST_47:KIDNEY +"CREATURE:FORGOTTEN_BEAST_50:MUSCLE +CREATURE:FORGOTTEN_BEAST_50:EYE +!CREATURE:FORGOTTEN_BEAST_50:BRAIN + CREATURE:FORGOTTEN_BEAST_50:LUNG +!CREATURE:FORGOTTEN_BEAST_50:HEART +!CREATURE:FORGOTTEN_BEAST_50:LIVER +CREATURE:FORGOTTEN_BEAST_50:GUT +#CREATURE:FORGOTTEN_BEAST_50:STOMACH +#CREATURE:FORGOTTEN_BEAST_50:GIZZARD +$CREATURE:FORGOTTEN_BEAST_50:PANCREAS +"CREATURE:FORGOTTEN_BEAST_50:SPLEEN +"CREATURE:FORGOTTEN_BEAST_50:KIDNEY +"CREATURE:FORGOTTEN_BEAST_52:MUSCLE +CREATURE:FORGOTTEN_BEAST_52:EYE +!CREATURE:FORGOTTEN_BEAST_52:BRAIN + CREATURE:FORGOTTEN_BEAST_52:LUNG +!CREATURE:FORGOTTEN_BEAST_52:HEART +!CREATURE:FORGOTTEN_BEAST_52:LIVER +CREATURE:FORGOTTEN_BEAST_52:GUT +#CREATURE:FORGOTTEN_BEAST_52:STOMACH +#CREATURE:FORGOTTEN_BEAST_52:GIZZARD +$CREATURE:FORGOTTEN_BEAST_52:PANCREAS +"CREATURE:FORGOTTEN_BEAST_52:SPLEEN +"CREATURE:FORGOTTEN_BEAST_52:KIDNEY +"CREATURE:FORGOTTEN_BEAST_53:MUSCLE +CREATURE:FORGOTTEN_BEAST_53:EYE +!CREATURE:FORGOTTEN_BEAST_53:BRAIN + CREATURE:FORGOTTEN_BEAST_53:LUNG +!CREATURE:FORGOTTEN_BEAST_53:HEART +!CREATURE:FORGOTTEN_BEAST_53:LIVER +CREATURE:FORGOTTEN_BEAST_53:GUT +#CREATURE:FORGOTTEN_BEAST_53:STOMACH +#CREATURE:FORGOTTEN_BEAST_53:GIZZARD +$CREATURE:FORGOTTEN_BEAST_53:PANCREAS +"CREATURE:FORGOTTEN_BEAST_53:SPLEEN +"CREATURE:FORGOTTEN_BEAST_53:KIDNEY +"CREATURE:FORGOTTEN_BEAST_55:MUSCLE +CREATURE:FORGOTTEN_BEAST_55:EYE +!CREATURE:FORGOTTEN_BEAST_55:BRAIN + CREATURE:FORGOTTEN_BEAST_55:LUNG +!CREATURE:FORGOTTEN_BEAST_55:HEART +!CREATURE:FORGOTTEN_BEAST_55:LIVER +CREATURE:FORGOTTEN_BEAST_55:GUT +#CREATURE:FORGOTTEN_BEAST_55:STOMACH +#CREATURE:FORGOTTEN_BEAST_55:GIZZARD +$CREATURE:FORGOTTEN_BEAST_55:PANCREAS +"CREATURE:FORGOTTEN_BEAST_55:SPLEEN +"CREATURE:FORGOTTEN_BEAST_55:KIDNEY +"CREATURE:FORGOTTEN_BEAST_56:MUSCLE +CREATURE:FORGOTTEN_BEAST_56:EYE +!CREATURE:FORGOTTEN_BEAST_56:BRAIN + CREATURE:FORGOTTEN_BEAST_56:LUNG +!CREATURE:FORGOTTEN_BEAST_56:HEART +!CREATURE:FORGOTTEN_BEAST_56:LIVER +CREATURE:FORGOTTEN_BEAST_56:GUT +#CREATURE:FORGOTTEN_BEAST_56:STOMACH +#CREATURE:FORGOTTEN_BEAST_56:GIZZARD +$CREATURE:FORGOTTEN_BEAST_56:PANCREAS +"CREATURE:FORGOTTEN_BEAST_56:SPLEEN +"CREATURE:FORGOTTEN_BEAST_56:KIDNEY +"CREATURE:FORGOTTEN_BEAST_58:MUSCLE +CREATURE:FORGOTTEN_BEAST_58:EYE +!CREATURE:FORGOTTEN_BEAST_58:BRAIN + CREATURE:FORGOTTEN_BEAST_58:LUNG +!CREATURE:FORGOTTEN_BEAST_58:HEART +!CREATURE:FORGOTTEN_BEAST_58:LIVER +CREATURE:FORGOTTEN_BEAST_58:GUT +#CREATURE:FORGOTTEN_BEAST_58:STOMACH +#CREATURE:FORGOTTEN_BEAST_58:GIZZARD +$CREATURE:FORGOTTEN_BEAST_58:PANCREAS +"CREATURE:FORGOTTEN_BEAST_58:SPLEEN +"CREATURE:FORGOTTEN_BEAST_58:KIDNEY +"CREATURE:FORGOTTEN_BEAST_59:MUSCLE +CREATURE:FORGOTTEN_BEAST_59:EYE +!CREATURE:FORGOTTEN_BEAST_59:BRAIN + CREATURE:FORGOTTEN_BEAST_59:LUNG +!CREATURE:FORGOTTEN_BEAST_59:HEART +!CREATURE:FORGOTTEN_BEAST_59:LIVER +CREATURE:FORGOTTEN_BEAST_59:GUT +#CREATURE:FORGOTTEN_BEAST_59:STOMACH +#CREATURE:FORGOTTEN_BEAST_59:GIZZARD +$CREATURE:FORGOTTEN_BEAST_59:PANCREAS +"CREATURE:FORGOTTEN_BEAST_59:SPLEEN +"CREATURE:FORGOTTEN_BEAST_59:KIDNEY +"CREATURE:FORGOTTEN_BEAST_60:MUSCLE +CREATURE:FORGOTTEN_BEAST_60:EYE +!CREATURE:FORGOTTEN_BEAST_60:BRAIN + CREATURE:FORGOTTEN_BEAST_60:LUNG +!CREATURE:FORGOTTEN_BEAST_60:HEART +!CREATURE:FORGOTTEN_BEAST_60:LIVER +CREATURE:FORGOTTEN_BEAST_60:GUT +#CREATURE:FORGOTTEN_BEAST_60:STOMACH +#CREATURE:FORGOTTEN_BEAST_60:GIZZARD +$CREATURE:FORGOTTEN_BEAST_60:PANCREAS +"CREATURE:FORGOTTEN_BEAST_60:SPLEEN +"CREATURE:FORGOTTEN_BEAST_60:KIDNEY +"CREATURE:FORGOTTEN_BEAST_61:MUSCLE +CREATURE:FORGOTTEN_BEAST_61:EYE +!CREATURE:FORGOTTEN_BEAST_61:BRAIN + CREATURE:FORGOTTEN_BEAST_61:LUNG +!CREATURE:FORGOTTEN_BEAST_61:HEART +!CREATURE:FORGOTTEN_BEAST_61:LIVER +CREATURE:FORGOTTEN_BEAST_61:GUT +#CREATURE:FORGOTTEN_BEAST_61:STOMACH +#CREATURE:FORGOTTEN_BEAST_61:GIZZARD +$CREATURE:FORGOTTEN_BEAST_61:PANCREAS +"CREATURE:FORGOTTEN_BEAST_61:SPLEEN +"CREATURE:FORGOTTEN_BEAST_61:KIDNEY +"CREATURE:FORGOTTEN_BEAST_64:MUSCLE +CREATURE:FORGOTTEN_BEAST_64:EYE +!CREATURE:FORGOTTEN_BEAST_64:BRAIN + CREATURE:FORGOTTEN_BEAST_64:LUNG +!CREATURE:FORGOTTEN_BEAST_64:HEART +!CREATURE:FORGOTTEN_BEAST_64:LIVER +CREATURE:FORGOTTEN_BEAST_64:GUT +#CREATURE:FORGOTTEN_BEAST_64:STOMACH +#CREATURE:FORGOTTEN_BEAST_64:GIZZARD +$CREATURE:FORGOTTEN_BEAST_64:PANCREAS +"CREATURE:FORGOTTEN_BEAST_64:SPLEEN +"CREATURE:FORGOTTEN_BEAST_64:KIDNEY +"CREATURE:FORGOTTEN_BEAST_66:MUSCLE +CREATURE:FORGOTTEN_BEAST_66:EYE +!CREATURE:FORGOTTEN_BEAST_66:BRAIN + CREATURE:FORGOTTEN_BEAST_66:LUNG +!CREATURE:FORGOTTEN_BEAST_66:HEART +!CREATURE:FORGOTTEN_BEAST_66:LIVER +CREATURE:FORGOTTEN_BEAST_66:GUT +#CREATURE:FORGOTTEN_BEAST_66:STOMACH +#CREATURE:FORGOTTEN_BEAST_66:GIZZARD +$CREATURE:FORGOTTEN_BEAST_66:PANCREAS +"CREATURE:FORGOTTEN_BEAST_66:SPLEEN +"CREATURE:FORGOTTEN_BEAST_66:KIDNEY +"CREATURE:FORGOTTEN_BEAST_67:MUSCLE +CREATURE:FORGOTTEN_BEAST_67:EYE +!CREATURE:FORGOTTEN_BEAST_67:BRAIN + CREATURE:FORGOTTEN_BEAST_67:LUNG +!CREATURE:FORGOTTEN_BEAST_67:HEART +!CREATURE:FORGOTTEN_BEAST_67:LIVER +CREATURE:FORGOTTEN_BEAST_67:GUT +#CREATURE:FORGOTTEN_BEAST_67:STOMACH +#CREATURE:FORGOTTEN_BEAST_67:GIZZARD +$CREATURE:FORGOTTEN_BEAST_67:PANCREAS +"CREATURE:FORGOTTEN_BEAST_67:SPLEEN +"CREATURE:FORGOTTEN_BEAST_67:KIDNEY +"CREATURE:FORGOTTEN_BEAST_69:MUSCLE +CREATURE:FORGOTTEN_BEAST_69:EYE +!CREATURE:FORGOTTEN_BEAST_69:BRAIN + CREATURE:FORGOTTEN_BEAST_69:LUNG +!CREATURE:FORGOTTEN_BEAST_69:HEART +!CREATURE:FORGOTTEN_BEAST_69:LIVER +CREATURE:FORGOTTEN_BEAST_69:GUT +#CREATURE:FORGOTTEN_BEAST_69:STOMACH +#CREATURE:FORGOTTEN_BEAST_69:GIZZARD +$CREATURE:FORGOTTEN_BEAST_69:PANCREAS +"CREATURE:FORGOTTEN_BEAST_69:SPLEEN +"CREATURE:FORGOTTEN_BEAST_69:KIDNEY +"CREATURE:FORGOTTEN_BEAST_71:MUSCLE +CREATURE:FORGOTTEN_BEAST_71:EYE +!CREATURE:FORGOTTEN_BEAST_71:BRAIN + CREATURE:FORGOTTEN_BEAST_71:LUNG +!CREATURE:FORGOTTEN_BEAST_71:HEART +!CREATURE:FORGOTTEN_BEAST_71:LIVER +CREATURE:FORGOTTEN_BEAST_71:GUT +#CREATURE:FORGOTTEN_BEAST_71:STOMACH +#CREATURE:FORGOTTEN_BEAST_71:GIZZARD +$CREATURE:FORGOTTEN_BEAST_71:PANCREAS +"CREATURE:FORGOTTEN_BEAST_71:SPLEEN +"CREATURE:FORGOTTEN_BEAST_71:KIDNEY +"CREATURE:FORGOTTEN_BEAST_72:MUSCLE +CREATURE:FORGOTTEN_BEAST_72:EYE +!CREATURE:FORGOTTEN_BEAST_72:BRAIN + CREATURE:FORGOTTEN_BEAST_72:LUNG +!CREATURE:FORGOTTEN_BEAST_72:HEART +!CREATURE:FORGOTTEN_BEAST_72:LIVER +CREATURE:FORGOTTEN_BEAST_72:GUT +#CREATURE:FORGOTTEN_BEAST_72:STOMACH +#CREATURE:FORGOTTEN_BEAST_72:GIZZARD +$CREATURE:FORGOTTEN_BEAST_72:PANCREAS +"CREATURE:FORGOTTEN_BEAST_72:SPLEEN +"CREATURE:FORGOTTEN_BEAST_72:KIDNEY +"CREATURE:FORGOTTEN_BEAST_73:MUSCLE +CREATURE:FORGOTTEN_BEAST_73:EYE +!CREATURE:FORGOTTEN_BEAST_73:BRAIN + CREATURE:FORGOTTEN_BEAST_73:LUNG +!CREATURE:FORGOTTEN_BEAST_73:HEART +!CREATURE:FORGOTTEN_BEAST_73:LIVER +CREATURE:FORGOTTEN_BEAST_73:GUT +#CREATURE:FORGOTTEN_BEAST_73:STOMACH +#CREATURE:FORGOTTEN_BEAST_73:GIZZARD +$CREATURE:FORGOTTEN_BEAST_73:PANCREAS +"CREATURE:FORGOTTEN_BEAST_73:SPLEEN +"CREATURE:FORGOTTEN_BEAST_73:KIDNEY +"CREATURE:FORGOTTEN_BEAST_74:MUSCLE +CREATURE:FORGOTTEN_BEAST_74:EYE +!CREATURE:FORGOTTEN_BEAST_74:BRAIN + CREATURE:FORGOTTEN_BEAST_74:LUNG +!CREATURE:FORGOTTEN_BEAST_74:HEART +!CREATURE:FORGOTTEN_BEAST_74:LIVER +CREATURE:FORGOTTEN_BEAST_74:GUT +#CREATURE:FORGOTTEN_BEAST_74:STOMACH +#CREATURE:FORGOTTEN_BEAST_74:GIZZARD +$CREATURE:FORGOTTEN_BEAST_74:PANCREAS +"CREATURE:FORGOTTEN_BEAST_74:SPLEEN +"CREATURE:FORGOTTEN_BEAST_74:KIDNEY +"CREATURE:FORGOTTEN_BEAST_75:MUSCLE +CREATURE:FORGOTTEN_BEAST_75:EYE +!CREATURE:FORGOTTEN_BEAST_75:BRAIN + CREATURE:FORGOTTEN_BEAST_75:LUNG +!CREATURE:FORGOTTEN_BEAST_75:HEART +!CREATURE:FORGOTTEN_BEAST_75:LIVER +CREATURE:FORGOTTEN_BEAST_75:GUT +#CREATURE:FORGOTTEN_BEAST_75:STOMACH +#CREATURE:FORGOTTEN_BEAST_75:GIZZARD +$CREATURE:FORGOTTEN_BEAST_75:PANCREAS +"CREATURE:FORGOTTEN_BEAST_75:SPLEEN +"CREATURE:FORGOTTEN_BEAST_75:KIDNEY +"CREATURE:FORGOTTEN_BEAST_78:MUSCLE +CREATURE:FORGOTTEN_BEAST_78:EYE +!CREATURE:FORGOTTEN_BEAST_78:BRAIN + CREATURE:FORGOTTEN_BEAST_78:LUNG +!CREATURE:FORGOTTEN_BEAST_78:HEART +!CREATURE:FORGOTTEN_BEAST_78:LIVER +CREATURE:FORGOTTEN_BEAST_78:GUT +#CREATURE:FORGOTTEN_BEAST_78:STOMACH +#CREATURE:FORGOTTEN_BEAST_78:GIZZARD +$CREATURE:FORGOTTEN_BEAST_78:PANCREAS +"CREATURE:FORGOTTEN_BEAST_78:SPLEEN +"CREATURE:FORGOTTEN_BEAST_78:KIDNEY +"CREATURE:FORGOTTEN_BEAST_80:MUSCLE +CREATURE:FORGOTTEN_BEAST_80:EYE +!CREATURE:FORGOTTEN_BEAST_80:BRAIN + CREATURE:FORGOTTEN_BEAST_80:LUNG +!CREATURE:FORGOTTEN_BEAST_80:HEART +!CREATURE:FORGOTTEN_BEAST_80:LIVER +CREATURE:FORGOTTEN_BEAST_80:GUT +#CREATURE:FORGOTTEN_BEAST_80:STOMACH +#CREATURE:FORGOTTEN_BEAST_80:GIZZARD +$CREATURE:FORGOTTEN_BEAST_80:PANCREAS +"CREATURE:FORGOTTEN_BEAST_80:SPLEEN +"CREATURE:FORGOTTEN_BEAST_80:KIDNEY +"CREATURE:FORGOTTEN_BEAST_81:MUSCLE +CREATURE:FORGOTTEN_BEAST_81:EYE +!CREATURE:FORGOTTEN_BEAST_81:BRAIN + CREATURE:FORGOTTEN_BEAST_81:LUNG +!CREATURE:FORGOTTEN_BEAST_81:HEART +!CREATURE:FORGOTTEN_BEAST_81:LIVER +CREATURE:FORGOTTEN_BEAST_81:GUT +#CREATURE:FORGOTTEN_BEAST_81:STOMACH +#CREATURE:FORGOTTEN_BEAST_81:GIZZARD +$CREATURE:FORGOTTEN_BEAST_81:PANCREAS +"CREATURE:FORGOTTEN_BEAST_81:SPLEEN +"CREATURE:FORGOTTEN_BEAST_81:KIDNEY +"CREATURE:FORGOTTEN_BEAST_82:MUSCLE +CREATURE:FORGOTTEN_BEAST_82:EYE +!CREATURE:FORGOTTEN_BEAST_82:BRAIN + CREATURE:FORGOTTEN_BEAST_82:LUNG +!CREATURE:FORGOTTEN_BEAST_82:HEART +!CREATURE:FORGOTTEN_BEAST_82:LIVER +CREATURE:FORGOTTEN_BEAST_82:GUT +#CREATURE:FORGOTTEN_BEAST_82:STOMACH +#CREATURE:FORGOTTEN_BEAST_82:GIZZARD +$CREATURE:FORGOTTEN_BEAST_82:PANCREAS +"CREATURE:FORGOTTEN_BEAST_82:SPLEEN +"CREATURE:FORGOTTEN_BEAST_82:KIDNEY +"CREATURE:FORGOTTEN_BEAST_83:MUSCLE +CREATURE:FORGOTTEN_BEAST_83:EYE +!CREATURE:FORGOTTEN_BEAST_83:BRAIN + CREATURE:FORGOTTEN_BEAST_83:LUNG +!CREATURE:FORGOTTEN_BEAST_83:HEART +!CREATURE:FORGOTTEN_BEAST_83:LIVER +CREATURE:FORGOTTEN_BEAST_83:GUT +#CREATURE:FORGOTTEN_BEAST_83:STOMACH +#CREATURE:FORGOTTEN_BEAST_83:GIZZARD +$CREATURE:FORGOTTEN_BEAST_83:PANCREAS +"CREATURE:FORGOTTEN_BEAST_83:SPLEEN +"CREATURE:FORGOTTEN_BEAST_83:KIDNEY +"CREATURE:FORGOTTEN_BEAST_84:MUSCLE +CREATURE:FORGOTTEN_BEAST_84:EYE +!CREATURE:FORGOTTEN_BEAST_84:BRAIN + CREATURE:FORGOTTEN_BEAST_84:LUNG +!CREATURE:FORGOTTEN_BEAST_84:HEART +!CREATURE:FORGOTTEN_BEAST_84:LIVER +CREATURE:FORGOTTEN_BEAST_84:GUT +#CREATURE:FORGOTTEN_BEAST_84:STOMACH +#CREATURE:FORGOTTEN_BEAST_84:GIZZARD +$CREATURE:FORGOTTEN_BEAST_84:PANCREAS +"CREATURE:FORGOTTEN_BEAST_84:SPLEEN +"CREATURE:FORGOTTEN_BEAST_84:KIDNEY +"CREATURE:FORGOTTEN_BEAST_86:MUSCLE +CREATURE:FORGOTTEN_BEAST_86:EYE +!CREATURE:FORGOTTEN_BEAST_86:BRAIN + CREATURE:FORGOTTEN_BEAST_86:LUNG +!CREATURE:FORGOTTEN_BEAST_86:HEART +!CREATURE:FORGOTTEN_BEAST_86:LIVER +CREATURE:FORGOTTEN_BEAST_86:GUT +#CREATURE:FORGOTTEN_BEAST_86:STOMACH +#CREATURE:FORGOTTEN_BEAST_86:GIZZARD +$CREATURE:FORGOTTEN_BEAST_86:PANCREAS +"CREATURE:FORGOTTEN_BEAST_86:SPLEEN +"CREATURE:FORGOTTEN_BEAST_86:KIDNEY +"CREATURE:FORGOTTEN_BEAST_87:MUSCLE +CREATURE:FORGOTTEN_BEAST_87:EYE +!CREATURE:FORGOTTEN_BEAST_87:BRAIN + CREATURE:FORGOTTEN_BEAST_87:LUNG +!CREATURE:FORGOTTEN_BEAST_87:HEART +!CREATURE:FORGOTTEN_BEAST_87:LIVER +CREATURE:FORGOTTEN_BEAST_87:GUT +#CREATURE:FORGOTTEN_BEAST_87:STOMACH +#CREATURE:FORGOTTEN_BEAST_87:GIZZARD +$CREATURE:FORGOTTEN_BEAST_87:PANCREAS +"CREATURE:FORGOTTEN_BEAST_87:SPLEEN +"CREATURE:FORGOTTEN_BEAST_87:KIDNEY +"CREATURE:FORGOTTEN_BEAST_89:MUSCLE +CREATURE:FORGOTTEN_BEAST_89:EYE +!CREATURE:FORGOTTEN_BEAST_89:BRAIN + CREATURE:FORGOTTEN_BEAST_89:LUNG +!CREATURE:FORGOTTEN_BEAST_89:HEART +!CREATURE:FORGOTTEN_BEAST_89:LIVER +CREATURE:FORGOTTEN_BEAST_89:GUT +#CREATURE:FORGOTTEN_BEAST_89:STOMACH +#CREATURE:FORGOTTEN_BEAST_89:GIZZARD +$CREATURE:FORGOTTEN_BEAST_89:PANCREAS +"CREATURE:FORGOTTEN_BEAST_89:SPLEEN +"CREATURE:FORGOTTEN_BEAST_89:KIDNEY +"CREATURE:FORGOTTEN_BEAST_90:MUSCLE +CREATURE:FORGOTTEN_BEAST_90:EYE +!CREATURE:FORGOTTEN_BEAST_90:BRAIN + CREATURE:FORGOTTEN_BEAST_90:LUNG +!CREATURE:FORGOTTEN_BEAST_90:HEART +!CREATURE:FORGOTTEN_BEAST_90:LIVER +CREATURE:FORGOTTEN_BEAST_90:GUT +#CREATURE:FORGOTTEN_BEAST_90:STOMACH +#CREATURE:FORGOTTEN_BEAST_90:GIZZARD +$CREATURE:FORGOTTEN_BEAST_90:PANCREAS +"CREATURE:FORGOTTEN_BEAST_90:SPLEEN +"CREATURE:FORGOTTEN_BEAST_90:KIDNEY +"CREATURE:FORGOTTEN_BEAST_92:MUSCLE +CREATURE:FORGOTTEN_BEAST_92:EYE +!CREATURE:FORGOTTEN_BEAST_92:BRAIN + CREATURE:FORGOTTEN_BEAST_92:LUNG +!CREATURE:FORGOTTEN_BEAST_92:HEART +!CREATURE:FORGOTTEN_BEAST_92:LIVER +CREATURE:FORGOTTEN_BEAST_92:GUT +#CREATURE:FORGOTTEN_BEAST_92:STOMACH +#CREATURE:FORGOTTEN_BEAST_92:GIZZARD +$CREATURE:FORGOTTEN_BEAST_92:PANCREAS +"CREATURE:FORGOTTEN_BEAST_92:SPLEEN +"CREATURE:FORGOTTEN_BEAST_92:KIDNEY +"CREATURE:FORGOTTEN_BEAST_94:MUSCLE +CREATURE:FORGOTTEN_BEAST_94:EYE +!CREATURE:FORGOTTEN_BEAST_94:BRAIN + CREATURE:FORGOTTEN_BEAST_94:LUNG +!CREATURE:FORGOTTEN_BEAST_94:HEART +!CREATURE:FORGOTTEN_BEAST_94:LIVER +CREATURE:FORGOTTEN_BEAST_94:GUT +#CREATURE:FORGOTTEN_BEAST_94:STOMACH +#CREATURE:FORGOTTEN_BEAST_94:GIZZARD +$CREATURE:FORGOTTEN_BEAST_94:PANCREAS +"CREATURE:FORGOTTEN_BEAST_94:SPLEEN +"CREATURE:FORGOTTEN_BEAST_94:KIDNEY +"CREATURE:FORGOTTEN_BEAST_95:MUSCLE +CREATURE:FORGOTTEN_BEAST_95:EYE +!CREATURE:FORGOTTEN_BEAST_95:BRAIN + CREATURE:FORGOTTEN_BEAST_95:LUNG +!CREATURE:FORGOTTEN_BEAST_95:HEART +!CREATURE:FORGOTTEN_BEAST_95:LIVER +CREATURE:FORGOTTEN_BEAST_95:GUT +#CREATURE:FORGOTTEN_BEAST_95:STOMACH +#CREATURE:FORGOTTEN_BEAST_95:GIZZARD +$CREATURE:FORGOTTEN_BEAST_95:PANCREAS +"CREATURE:FORGOTTEN_BEAST_95:SPLEEN +"CREATURE:FORGOTTEN_BEAST_95:KIDNEY +"CREATURE:FORGOTTEN_BEAST_96:MUSCLE +CREATURE:FORGOTTEN_BEAST_96:EYE +!CREATURE:FORGOTTEN_BEAST_96:BRAIN + CREATURE:FORGOTTEN_BEAST_96:LUNG +!CREATURE:FORGOTTEN_BEAST_96:HEART +!CREATURE:FORGOTTEN_BEAST_96:LIVER +CREATURE:FORGOTTEN_BEAST_96:GUT +#CREATURE:FORGOTTEN_BEAST_96:STOMACH +#CREATURE:FORGOTTEN_BEAST_96:GIZZARD +$CREATURE:FORGOTTEN_BEAST_96:PANCREAS +"CREATURE:FORGOTTEN_BEAST_96:SPLEEN +"CREATURE:FORGOTTEN_BEAST_96:KIDNEY +"CREATURE:FORGOTTEN_BEAST_97:MUSCLE +CREATURE:FORGOTTEN_BEAST_97:EYE +!CREATURE:FORGOTTEN_BEAST_97:BRAIN + CREATURE:FORGOTTEN_BEAST_97:LUNG +!CREATURE:FORGOTTEN_BEAST_97:HEART +!CREATURE:FORGOTTEN_BEAST_97:LIVER +CREATURE:FORGOTTEN_BEAST_97:GUT +#CREATURE:FORGOTTEN_BEAST_97:STOMACH +#CREATURE:FORGOTTEN_BEAST_97:GIZZARD +$CREATURE:FORGOTTEN_BEAST_97:PANCREAS +"CREATURE:FORGOTTEN_BEAST_97:SPLEEN +"CREATURE:FORGOTTEN_BEAST_97:KIDNEY +"CREATURE:FORGOTTEN_BEAST_98:MUSCLE +CREATURE:FORGOTTEN_BEAST_98:EYE +!CREATURE:FORGOTTEN_BEAST_98:BRAIN + CREATURE:FORGOTTEN_BEAST_98:LUNG +!CREATURE:FORGOTTEN_BEAST_98:HEART +!CREATURE:FORGOTTEN_BEAST_98:LIVER +CREATURE:FORGOTTEN_BEAST_98:GUT +#CREATURE:FORGOTTEN_BEAST_98:STOMACH +#CREATURE:FORGOTTEN_BEAST_98:GIZZARD +$CREATURE:FORGOTTEN_BEAST_98:PANCREAS +"CREATURE:FORGOTTEN_BEAST_98:SPLEEN +"CREATURE:FORGOTTEN_BEAST_98:KIDNEY +#CREATURE:FORGOTTEN_BEAST_100:MUSCLE + CREATURE:FORGOTTEN_BEAST_100:EYE +"CREATURE:FORGOTTEN_BEAST_100:BRAIN +!CREATURE:FORGOTTEN_BEAST_100:LUNG +"CREATURE:FORGOTTEN_BEAST_100:HEART +"CREATURE:FORGOTTEN_BEAST_100:LIVER + CREATURE:FORGOTTEN_BEAST_100:GUT +$CREATURE:FORGOTTEN_BEAST_100:STOMACH +$CREATURE:FORGOTTEN_BEAST_100:GIZZARD +%CREATURE:FORGOTTEN_BEAST_100:PANCREAS +#CREATURE:FORGOTTEN_BEAST_100:SPLEEN +#CREATURE:FORGOTTEN_BEAST_100:KIDNEY +#CREATURE:FORGOTTEN_BEAST_105:MUSCLE + CREATURE:FORGOTTEN_BEAST_105:EYE +"CREATURE:FORGOTTEN_BEAST_105:BRAIN +!CREATURE:FORGOTTEN_BEAST_105:LUNG +"CREATURE:FORGOTTEN_BEAST_105:HEART +"CREATURE:FORGOTTEN_BEAST_105:LIVER + CREATURE:FORGOTTEN_BEAST_105:GUT +$CREATURE:FORGOTTEN_BEAST_105:STOMACH +$CREATURE:FORGOTTEN_BEAST_105:GIZZARD +%CREATURE:FORGOTTEN_BEAST_105:PANCREAS +#CREATURE:FORGOTTEN_BEAST_105:SPLEEN +#CREATURE:FORGOTTEN_BEAST_105:KIDNEY +#CREATURE:FORGOTTEN_BEAST_106:MUSCLE + CREATURE:FORGOTTEN_BEAST_106:EYE +"CREATURE:FORGOTTEN_BEAST_106:BRAIN +!CREATURE:FORGOTTEN_BEAST_106:LUNG +"CREATURE:FORGOTTEN_BEAST_106:HEART +"CREATURE:FORGOTTEN_BEAST_106:LIVER + CREATURE:FORGOTTEN_BEAST_106:GUT +$CREATURE:FORGOTTEN_BEAST_106:STOMACH +$CREATURE:FORGOTTEN_BEAST_106:GIZZARD +%CREATURE:FORGOTTEN_BEAST_106:PANCREAS +#CREATURE:FORGOTTEN_BEAST_106:SPLEEN +#CREATURE:FORGOTTEN_BEAST_106:KIDNEY +#CREATURE:FORGOTTEN_BEAST_107:MUSCLE + CREATURE:FORGOTTEN_BEAST_107:EYE +"CREATURE:FORGOTTEN_BEAST_107:BRAIN +!CREATURE:FORGOTTEN_BEAST_107:LUNG +"CREATURE:FORGOTTEN_BEAST_107:HEART +"CREATURE:FORGOTTEN_BEAST_107:LIVER + CREATURE:FORGOTTEN_BEAST_107:GUT +$CREATURE:FORGOTTEN_BEAST_107:STOMACH +$CREATURE:FORGOTTEN_BEAST_107:GIZZARD +%CREATURE:FORGOTTEN_BEAST_107:PANCREAS +#CREATURE:FORGOTTEN_BEAST_107:SPLEEN +#CREATURE:FORGOTTEN_BEAST_107:KIDNEY +#CREATURE:FORGOTTEN_BEAST_108:MUSCLE + CREATURE:FORGOTTEN_BEAST_108:EYE +"CREATURE:FORGOTTEN_BEAST_108:BRAIN +!CREATURE:FORGOTTEN_BEAST_108:LUNG +"CREATURE:FORGOTTEN_BEAST_108:HEART +"CREATURE:FORGOTTEN_BEAST_108:LIVER + CREATURE:FORGOTTEN_BEAST_108:GUT +$CREATURE:FORGOTTEN_BEAST_108:STOMACH +$CREATURE:FORGOTTEN_BEAST_108:GIZZARD +%CREATURE:FORGOTTEN_BEAST_108:PANCREAS +#CREATURE:FORGOTTEN_BEAST_108:SPLEEN +#CREATURE:FORGOTTEN_BEAST_108:KIDNEY +#CREATURE:FORGOTTEN_BEAST_109:MUSCLE + CREATURE:FORGOTTEN_BEAST_109:EYE +"CREATURE:FORGOTTEN_BEAST_109:BRAIN +!CREATURE:FORGOTTEN_BEAST_109:LUNG +"CREATURE:FORGOTTEN_BEAST_109:HEART +"CREATURE:FORGOTTEN_BEAST_109:LIVER + CREATURE:FORGOTTEN_BEAST_109:GUT +$CREATURE:FORGOTTEN_BEAST_109:STOMACH +$CREATURE:FORGOTTEN_BEAST_109:GIZZARD +%CREATURE:FORGOTTEN_BEAST_109:PANCREAS +#CREATURE:FORGOTTEN_BEAST_109:SPLEEN +#CREATURE:FORGOTTEN_BEAST_109:KIDNEY +#CREATURE:FORGOTTEN_BEAST_111:MUSCLE + CREATURE:FORGOTTEN_BEAST_111:EYE +"CREATURE:FORGOTTEN_BEAST_111:BRAIN +!CREATURE:FORGOTTEN_BEAST_111:LUNG +"CREATURE:FORGOTTEN_BEAST_111:HEART +"CREATURE:FORGOTTEN_BEAST_111:LIVER + CREATURE:FORGOTTEN_BEAST_111:GUT +$CREATURE:FORGOTTEN_BEAST_111:STOMACH +$CREATURE:FORGOTTEN_BEAST_111:GIZZARD +%CREATURE:FORGOTTEN_BEAST_111:PANCREAS +#CREATURE:FORGOTTEN_BEAST_111:SPLEEN +#CREATURE:FORGOTTEN_BEAST_111:KIDNEY +#CREATURE:FORGOTTEN_BEAST_112:MUSCLE + CREATURE:FORGOTTEN_BEAST_112:EYE +"CREATURE:FORGOTTEN_BEAST_112:BRAIN +!CREATURE:FORGOTTEN_BEAST_112:LUNG +"CREATURE:FORGOTTEN_BEAST_112:HEART +"CREATURE:FORGOTTEN_BEAST_112:LIVER + CREATURE:FORGOTTEN_BEAST_112:GUT +$CREATURE:FORGOTTEN_BEAST_112:STOMACH +$CREATURE:FORGOTTEN_BEAST_112:GIZZARD +%CREATURE:FORGOTTEN_BEAST_112:PANCREAS +#CREATURE:FORGOTTEN_BEAST_112:SPLEEN +#CREATURE:FORGOTTEN_BEAST_112:KIDNEY +#CREATURE:FORGOTTEN_BEAST_113:MUSCLE + CREATURE:FORGOTTEN_BEAST_113:EYE +"CREATURE:FORGOTTEN_BEAST_113:BRAIN +!CREATURE:FORGOTTEN_BEAST_113:LUNG +"CREATURE:FORGOTTEN_BEAST_113:HEART +"CREATURE:FORGOTTEN_BEAST_113:LIVER + CREATURE:FORGOTTEN_BEAST_113:GUT +$CREATURE:FORGOTTEN_BEAST_113:STOMACH +$CREATURE:FORGOTTEN_BEAST_113:GIZZARD +%CREATURE:FORGOTTEN_BEAST_113:PANCREAS +#CREATURE:FORGOTTEN_BEAST_113:SPLEEN +#CREATURE:FORGOTTEN_BEAST_113:KIDNEY +#CREATURE:FORGOTTEN_BEAST_114:MUSCLE + CREATURE:FORGOTTEN_BEAST_114:EYE +"CREATURE:FORGOTTEN_BEAST_114:BRAIN +!CREATURE:FORGOTTEN_BEAST_114:LUNG +"CREATURE:FORGOTTEN_BEAST_114:HEART +"CREATURE:FORGOTTEN_BEAST_114:LIVER + CREATURE:FORGOTTEN_BEAST_114:GUT +$CREATURE:FORGOTTEN_BEAST_114:STOMACH +$CREATURE:FORGOTTEN_BEAST_114:GIZZARD +%CREATURE:FORGOTTEN_BEAST_114:PANCREAS +#CREATURE:FORGOTTEN_BEAST_114:SPLEEN +#CREATURE:FORGOTTEN_BEAST_114:KIDNEY +#CREATURE:FORGOTTEN_BEAST_115:MUSCLE + CREATURE:FORGOTTEN_BEAST_115:EYE +"CREATURE:FORGOTTEN_BEAST_115:BRAIN +!CREATURE:FORGOTTEN_BEAST_115:LUNG +"CREATURE:FORGOTTEN_BEAST_115:HEART +"CREATURE:FORGOTTEN_BEAST_115:LIVER + CREATURE:FORGOTTEN_BEAST_115:GUT +$CREATURE:FORGOTTEN_BEAST_115:STOMACH +$CREATURE:FORGOTTEN_BEAST_115:GIZZARD +%CREATURE:FORGOTTEN_BEAST_115:PANCREAS +#CREATURE:FORGOTTEN_BEAST_115:SPLEEN +#CREATURE:FORGOTTEN_BEAST_115:KIDNEY +#CREATURE:FORGOTTEN_BEAST_116:MUSCLE + CREATURE:FORGOTTEN_BEAST_116:EYE +"CREATURE:FORGOTTEN_BEAST_116:BRAIN +!CREATURE:FORGOTTEN_BEAST_116:LUNG +"CREATURE:FORGOTTEN_BEAST_116:HEART +"CREATURE:FORGOTTEN_BEAST_116:LIVER + CREATURE:FORGOTTEN_BEAST_116:GUT +$CREATURE:FORGOTTEN_BEAST_116:STOMACH +$CREATURE:FORGOTTEN_BEAST_116:GIZZARD +%CREATURE:FORGOTTEN_BEAST_116:PANCREAS +#CREATURE:FORGOTTEN_BEAST_116:SPLEEN +#CREATURE:FORGOTTEN_BEAST_116:KIDNEY +#CREATURE:FORGOTTEN_BEAST_117:MUSCLE + CREATURE:FORGOTTEN_BEAST_117:EYE +"CREATURE:FORGOTTEN_BEAST_117:BRAIN +!CREATURE:FORGOTTEN_BEAST_117:LUNG +"CREATURE:FORGOTTEN_BEAST_117:HEART +"CREATURE:FORGOTTEN_BEAST_117:LIVER + CREATURE:FORGOTTEN_BEAST_117:GUT +$CREATURE:FORGOTTEN_BEAST_117:STOMACH +$CREATURE:FORGOTTEN_BEAST_117:GIZZARD +%CREATURE:FORGOTTEN_BEAST_117:PANCREAS +#CREATURE:FORGOTTEN_BEAST_117:SPLEEN +#CREATURE:FORGOTTEN_BEAST_117:KIDNEY +#CREATURE:FORGOTTEN_BEAST_118:MUSCLE + CREATURE:FORGOTTEN_BEAST_118:EYE +"CREATURE:FORGOTTEN_BEAST_118:BRAIN +!CREATURE:FORGOTTEN_BEAST_118:LUNG +"CREATURE:FORGOTTEN_BEAST_118:HEART +"CREATURE:FORGOTTEN_BEAST_118:LIVER + CREATURE:FORGOTTEN_BEAST_118:GUT +$CREATURE:FORGOTTEN_BEAST_118:STOMACH +$CREATURE:FORGOTTEN_BEAST_118:GIZZARD +%CREATURE:FORGOTTEN_BEAST_118:PANCREAS +#CREATURE:FORGOTTEN_BEAST_118:SPLEEN +#CREATURE:FORGOTTEN_BEAST_118:KIDNEY +#CREATURE:FORGOTTEN_BEAST_119:MUSCLE + CREATURE:FORGOTTEN_BEAST_119:EYE +"CREATURE:FORGOTTEN_BEAST_119:BRAIN +!CREATURE:FORGOTTEN_BEAST_119:LUNG +"CREATURE:FORGOTTEN_BEAST_119:HEART +"CREATURE:FORGOTTEN_BEAST_119:LIVER + CREATURE:FORGOTTEN_BEAST_119:GUT +$CREATURE:FORGOTTEN_BEAST_119:STOMACH +$CREATURE:FORGOTTEN_BEAST_119:GIZZARD +%CREATURE:FORGOTTEN_BEAST_119:PANCREAS +#CREATURE:FORGOTTEN_BEAST_119:SPLEEN +#CREATURE:FORGOTTEN_BEAST_119:KIDNEY +#CREATURE:FORGOTTEN_BEAST_120:MUSCLE + CREATURE:FORGOTTEN_BEAST_120:EYE +"CREATURE:FORGOTTEN_BEAST_120:BRAIN +!CREATURE:FORGOTTEN_BEAST_120:LUNG +"CREATURE:FORGOTTEN_BEAST_120:HEART +"CREATURE:FORGOTTEN_BEAST_120:LIVER + CREATURE:FORGOTTEN_BEAST_120:GUT +$CREATURE:FORGOTTEN_BEAST_120:STOMACH +$CREATURE:FORGOTTEN_BEAST_120:GIZZARD +%CREATURE:FORGOTTEN_BEAST_120:PANCREAS +#CREATURE:FORGOTTEN_BEAST_120:SPLEEN +#CREATURE:FORGOTTEN_BEAST_120:KIDNEY +#CREATURE:FORGOTTEN_BEAST_122:MUSCLE + CREATURE:FORGOTTEN_BEAST_122:EYE +"CREATURE:FORGOTTEN_BEAST_122:BRAIN +!CREATURE:FORGOTTEN_BEAST_122:LUNG +"CREATURE:FORGOTTEN_BEAST_122:HEART +"CREATURE:FORGOTTEN_BEAST_122:LIVER + CREATURE:FORGOTTEN_BEAST_122:GUT +$CREATURE:FORGOTTEN_BEAST_122:STOMACH +$CREATURE:FORGOTTEN_BEAST_122:GIZZARD +%CREATURE:FORGOTTEN_BEAST_122:PANCREAS +#CREATURE:FORGOTTEN_BEAST_122:SPLEEN +#CREATURE:FORGOTTEN_BEAST_122:KIDNEY +#CREATURE:FORGOTTEN_BEAST_123:MUSCLE + CREATURE:FORGOTTEN_BEAST_123:EYE +"CREATURE:FORGOTTEN_BEAST_123:BRAIN +!CREATURE:FORGOTTEN_BEAST_123:LUNG +"CREATURE:FORGOTTEN_BEAST_123:HEART +"CREATURE:FORGOTTEN_BEAST_123:LIVER + CREATURE:FORGOTTEN_BEAST_123:GUT +$CREATURE:FORGOTTEN_BEAST_123:STOMACH +$CREATURE:FORGOTTEN_BEAST_123:GIZZARD +%CREATURE:FORGOTTEN_BEAST_123:PANCREAS +#CREATURE:FORGOTTEN_BEAST_123:SPLEEN +#CREATURE:FORGOTTEN_BEAST_123:KIDNEY +#CREATURE:FORGOTTEN_BEAST_124:MUSCLE + CREATURE:FORGOTTEN_BEAST_124:EYE +"CREATURE:FORGOTTEN_BEAST_124:BRAIN +!CREATURE:FORGOTTEN_BEAST_124:LUNG +"CREATURE:FORGOTTEN_BEAST_124:HEART +"CREATURE:FORGOTTEN_BEAST_124:LIVER + CREATURE:FORGOTTEN_BEAST_124:GUT +$CREATURE:FORGOTTEN_BEAST_124:STOMACH +$CREATURE:FORGOTTEN_BEAST_124:GIZZARD +%CREATURE:FORGOTTEN_BEAST_124:PANCREAS +#CREATURE:FORGOTTEN_BEAST_124:SPLEEN +#CREATURE:FORGOTTEN_BEAST_124:KIDNEY +#CREATURE:FORGOTTEN_BEAST_125:MUSCLE + CREATURE:FORGOTTEN_BEAST_125:EYE +"CREATURE:FORGOTTEN_BEAST_125:BRAIN +!CREATURE:FORGOTTEN_BEAST_125:LUNG +"CREATURE:FORGOTTEN_BEAST_125:HEART +"CREATURE:FORGOTTEN_BEAST_125:LIVER + CREATURE:FORGOTTEN_BEAST_125:GUT +$CREATURE:FORGOTTEN_BEAST_125:STOMACH +$CREATURE:FORGOTTEN_BEAST_125:GIZZARD +%CREATURE:FORGOTTEN_BEAST_125:PANCREAS +#CREATURE:FORGOTTEN_BEAST_125:SPLEEN +#CREATURE:FORGOTTEN_BEAST_125:KIDNEY +#CREATURE:FORGOTTEN_BEAST_127:MUSCLE + CREATURE:FORGOTTEN_BEAST_127:EYE +"CREATURE:FORGOTTEN_BEAST_127:BRAIN +!CREATURE:FORGOTTEN_BEAST_127:LUNG +"CREATURE:FORGOTTEN_BEAST_127:HEART +"CREATURE:FORGOTTEN_BEAST_127:LIVER + CREATURE:FORGOTTEN_BEAST_127:GUT +$CREATURE:FORGOTTEN_BEAST_127:STOMACH +$CREATURE:FORGOTTEN_BEAST_127:GIZZARD +%CREATURE:FORGOTTEN_BEAST_127:PANCREAS +#CREATURE:FORGOTTEN_BEAST_127:SPLEEN +#CREATURE:FORGOTTEN_BEAST_127:KIDNEY +#CREATURE:FORGOTTEN_BEAST_128:MUSCLE + CREATURE:FORGOTTEN_BEAST_128:EYE +"CREATURE:FORGOTTEN_BEAST_128:BRAIN +!CREATURE:FORGOTTEN_BEAST_128:LUNG +"CREATURE:FORGOTTEN_BEAST_128:HEART +"CREATURE:FORGOTTEN_BEAST_128:LIVER + CREATURE:FORGOTTEN_BEAST_128:GUT +$CREATURE:FORGOTTEN_BEAST_128:STOMACH +$CREATURE:FORGOTTEN_BEAST_128:GIZZARD +%CREATURE:FORGOTTEN_BEAST_128:PANCREAS +#CREATURE:FORGOTTEN_BEAST_128:SPLEEN +#CREATURE:FORGOTTEN_BEAST_128:KIDNEY +#CREATURE:FORGOTTEN_BEAST_130:MUSCLE + CREATURE:FORGOTTEN_BEAST_130:EYE +"CREATURE:FORGOTTEN_BEAST_130:BRAIN +!CREATURE:FORGOTTEN_BEAST_130:LUNG +"CREATURE:FORGOTTEN_BEAST_130:HEART +"CREATURE:FORGOTTEN_BEAST_130:LIVER + CREATURE:FORGOTTEN_BEAST_130:GUT +$CREATURE:FORGOTTEN_BEAST_130:STOMACH +$CREATURE:FORGOTTEN_BEAST_130:GIZZARD +%CREATURE:FORGOTTEN_BEAST_130:PANCREAS +#CREATURE:FORGOTTEN_BEAST_130:SPLEEN +#CREATURE:FORGOTTEN_BEAST_130:KIDNEY +#CREATURE:FORGOTTEN_BEAST_131:MUSCLE + CREATURE:FORGOTTEN_BEAST_131:EYE +"CREATURE:FORGOTTEN_BEAST_131:BRAIN +!CREATURE:FORGOTTEN_BEAST_131:LUNG +"CREATURE:FORGOTTEN_BEAST_131:HEART +"CREATURE:FORGOTTEN_BEAST_131:LIVER + CREATURE:FORGOTTEN_BEAST_131:GUT +$CREATURE:FORGOTTEN_BEAST_131:STOMACH +$CREATURE:FORGOTTEN_BEAST_131:GIZZARD +%CREATURE:FORGOTTEN_BEAST_131:PANCREAS +#CREATURE:FORGOTTEN_BEAST_131:SPLEEN +#CREATURE:FORGOTTEN_BEAST_131:KIDNEY +#CREATURE:FORGOTTEN_BEAST_132:MUSCLE + CREATURE:FORGOTTEN_BEAST_132:EYE +"CREATURE:FORGOTTEN_BEAST_132:BRAIN +!CREATURE:FORGOTTEN_BEAST_132:LUNG +"CREATURE:FORGOTTEN_BEAST_132:HEART +"CREATURE:FORGOTTEN_BEAST_132:LIVER + CREATURE:FORGOTTEN_BEAST_132:GUT +$CREATURE:FORGOTTEN_BEAST_132:STOMACH +$CREATURE:FORGOTTEN_BEAST_132:GIZZARD +%CREATURE:FORGOTTEN_BEAST_132:PANCREAS +#CREATURE:FORGOTTEN_BEAST_132:SPLEEN +#CREATURE:FORGOTTEN_BEAST_132:KIDNEY +#CREATURE:FORGOTTEN_BEAST_133:MUSCLE + CREATURE:FORGOTTEN_BEAST_133:EYE +"CREATURE:FORGOTTEN_BEAST_133:BRAIN +!CREATURE:FORGOTTEN_BEAST_133:LUNG +"CREATURE:FORGOTTEN_BEAST_133:HEART +"CREATURE:FORGOTTEN_BEAST_133:LIVER + CREATURE:FORGOTTEN_BEAST_133:GUT +$CREATURE:FORGOTTEN_BEAST_133:STOMACH +$CREATURE:FORGOTTEN_BEAST_133:GIZZARD +%CREATURE:FORGOTTEN_BEAST_133:PANCREAS +#CREATURE:FORGOTTEN_BEAST_133:SPLEEN +#CREATURE:FORGOTTEN_BEAST_133:KIDNEY +#CREATURE:FORGOTTEN_BEAST_134:MUSCLE + CREATURE:FORGOTTEN_BEAST_134:EYE +"CREATURE:FORGOTTEN_BEAST_134:BRAIN +!CREATURE:FORGOTTEN_BEAST_134:LUNG +"CREATURE:FORGOTTEN_BEAST_134:HEART +"CREATURE:FORGOTTEN_BEAST_134:LIVER + CREATURE:FORGOTTEN_BEAST_134:GUT +$CREATURE:FORGOTTEN_BEAST_134:STOMACH +$CREATURE:FORGOTTEN_BEAST_134:GIZZARD +%CREATURE:FORGOTTEN_BEAST_134:PANCREAS +#CREATURE:FORGOTTEN_BEAST_134:SPLEEN +#CREATURE:FORGOTTEN_BEAST_134:KIDNEY +#CREATURE:FORGOTTEN_BEAST_135:MUSCLE + CREATURE:FORGOTTEN_BEAST_135:EYE +"CREATURE:FORGOTTEN_BEAST_135:BRAIN +!CREATURE:FORGOTTEN_BEAST_135:LUNG +"CREATURE:FORGOTTEN_BEAST_135:HEART +"CREATURE:FORGOTTEN_BEAST_135:LIVER + CREATURE:FORGOTTEN_BEAST_135:GUT +$CREATURE:FORGOTTEN_BEAST_135:STOMACH +$CREATURE:FORGOTTEN_BEAST_135:GIZZARD +%CREATURE:FORGOTTEN_BEAST_135:PANCREAS +#CREATURE:FORGOTTEN_BEAST_135:SPLEEN +#CREATURE:FORGOTTEN_BEAST_135:KIDNEY +#CREATURE:FORGOTTEN_BEAST_137:MUSCLE + CREATURE:FORGOTTEN_BEAST_137:EYE +"CREATURE:FORGOTTEN_BEAST_137:BRAIN +!CREATURE:FORGOTTEN_BEAST_137:LUNG +"CREATURE:FORGOTTEN_BEAST_137:HEART +"CREATURE:FORGOTTEN_BEAST_137:LIVER + CREATURE:FORGOTTEN_BEAST_137:GUT +$CREATURE:FORGOTTEN_BEAST_137:STOMACH +$CREATURE:FORGOTTEN_BEAST_137:GIZZARD +%CREATURE:FORGOTTEN_BEAST_137:PANCREAS +#CREATURE:FORGOTTEN_BEAST_137:SPLEEN +#CREATURE:FORGOTTEN_BEAST_137:KIDNEY +#CREATURE:FORGOTTEN_BEAST_138:MUSCLE + CREATURE:FORGOTTEN_BEAST_138:EYE +"CREATURE:FORGOTTEN_BEAST_138:BRAIN +!CREATURE:FORGOTTEN_BEAST_138:LUNG +"CREATURE:FORGOTTEN_BEAST_138:HEART +"CREATURE:FORGOTTEN_BEAST_138:LIVER + CREATURE:FORGOTTEN_BEAST_138:GUT +$CREATURE:FORGOTTEN_BEAST_138:STOMACH +$CREATURE:FORGOTTEN_BEAST_138:GIZZARD +%CREATURE:FORGOTTEN_BEAST_138:PANCREAS +#CREATURE:FORGOTTEN_BEAST_138:SPLEEN +#CREATURE:FORGOTTEN_BEAST_138:KIDNEY +#CREATURE:FORGOTTEN_BEAST_139:MUSCLE + CREATURE:FORGOTTEN_BEAST_139:EYE +"CREATURE:FORGOTTEN_BEAST_139:BRAIN +!CREATURE:FORGOTTEN_BEAST_139:LUNG +"CREATURE:FORGOTTEN_BEAST_139:HEART +"CREATURE:FORGOTTEN_BEAST_139:LIVER + CREATURE:FORGOTTEN_BEAST_139:GUT +$CREATURE:FORGOTTEN_BEAST_139:STOMACH +$CREATURE:FORGOTTEN_BEAST_139:GIZZARD +%CREATURE:FORGOTTEN_BEAST_139:PANCREAS +#CREATURE:FORGOTTEN_BEAST_139:SPLEEN +#CREATURE:FORGOTTEN_BEAST_139:KIDNEY +#CREATURE:FORGOTTEN_BEAST_141:MUSCLE + CREATURE:FORGOTTEN_BEAST_141:EYE +"CREATURE:FORGOTTEN_BEAST_141:BRAIN +!CREATURE:FORGOTTEN_BEAST_141:LUNG +"CREATURE:FORGOTTEN_BEAST_141:HEART +"CREATURE:FORGOTTEN_BEAST_141:LIVER + CREATURE:FORGOTTEN_BEAST_141:GUT +$CREATURE:FORGOTTEN_BEAST_141:STOMACH +$CREATURE:FORGOTTEN_BEAST_141:GIZZARD +%CREATURE:FORGOTTEN_BEAST_141:PANCREAS +#CREATURE:FORGOTTEN_BEAST_141:SPLEEN +#CREATURE:FORGOTTEN_BEAST_141:KIDNEY +#CREATURE:FORGOTTEN_BEAST_142:MUSCLE + CREATURE:FORGOTTEN_BEAST_142:EYE +"CREATURE:FORGOTTEN_BEAST_142:BRAIN +!CREATURE:FORGOTTEN_BEAST_142:LUNG +"CREATURE:FORGOTTEN_BEAST_142:HEART +"CREATURE:FORGOTTEN_BEAST_142:LIVER + CREATURE:FORGOTTEN_BEAST_142:GUT +$CREATURE:FORGOTTEN_BEAST_142:STOMACH +$CREATURE:FORGOTTEN_BEAST_142:GIZZARD +%CREATURE:FORGOTTEN_BEAST_142:PANCREAS +#CREATURE:FORGOTTEN_BEAST_142:SPLEEN +#CREATURE:FORGOTTEN_BEAST_142:KIDNEY +#CREATURE:FORGOTTEN_BEAST_144:MUSCLE + CREATURE:FORGOTTEN_BEAST_144:EYE +"CREATURE:FORGOTTEN_BEAST_144:BRAIN +!CREATURE:FORGOTTEN_BEAST_144:LUNG +"CREATURE:FORGOTTEN_BEAST_144:HEART +"CREATURE:FORGOTTEN_BEAST_144:LIVER + CREATURE:FORGOTTEN_BEAST_144:GUT +$CREATURE:FORGOTTEN_BEAST_144:STOMACH +$CREATURE:FORGOTTEN_BEAST_144:GIZZARD +%CREATURE:FORGOTTEN_BEAST_144:PANCREAS +#CREATURE:FORGOTTEN_BEAST_144:SPLEEN +#CREATURE:FORGOTTEN_BEAST_144:KIDNEY +#CREATURE:FORGOTTEN_BEAST_146:MUSCLE + CREATURE:FORGOTTEN_BEAST_146:EYE +"CREATURE:FORGOTTEN_BEAST_146:BRAIN +!CREATURE:FORGOTTEN_BEAST_146:LUNG +"CREATURE:FORGOTTEN_BEAST_146:HEART +"CREATURE:FORGOTTEN_BEAST_146:LIVER + CREATURE:FORGOTTEN_BEAST_146:GUT +$CREATURE:FORGOTTEN_BEAST_146:STOMACH +$CREATURE:FORGOTTEN_BEAST_146:GIZZARD +%CREATURE:FORGOTTEN_BEAST_146:PANCREAS +#CREATURE:FORGOTTEN_BEAST_146:SPLEEN +#CREATURE:FORGOTTEN_BEAST_146:KIDNEY +#CREATURE:FORGOTTEN_BEAST_148:MUSCLE + CREATURE:FORGOTTEN_BEAST_148:EYE +"CREATURE:FORGOTTEN_BEAST_148:BRAIN +!CREATURE:FORGOTTEN_BEAST_148:LUNG +"CREATURE:FORGOTTEN_BEAST_148:HEART +"CREATURE:FORGOTTEN_BEAST_148:LIVER + CREATURE:FORGOTTEN_BEAST_148:GUT +$CREATURE:FORGOTTEN_BEAST_148:STOMACH +$CREATURE:FORGOTTEN_BEAST_148:GIZZARD +%CREATURE:FORGOTTEN_BEAST_148:PANCREAS +#CREATURE:FORGOTTEN_BEAST_148:SPLEEN +#CREATURE:FORGOTTEN_BEAST_148:KIDNEY +#CREATURE:FORGOTTEN_BEAST_149:MUSCLE + CREATURE:FORGOTTEN_BEAST_149:EYE +"CREATURE:FORGOTTEN_BEAST_149:BRAIN +!CREATURE:FORGOTTEN_BEAST_149:LUNG +"CREATURE:FORGOTTEN_BEAST_149:HEART +"CREATURE:FORGOTTEN_BEAST_149:LIVER + CREATURE:FORGOTTEN_BEAST_149:GUT +$CREATURE:FORGOTTEN_BEAST_149:STOMACH +$CREATURE:FORGOTTEN_BEAST_149:GIZZARD +%CREATURE:FORGOTTEN_BEAST_149:PANCREAS +#CREATURE:FORGOTTEN_BEAST_149:SPLEEN +#CREATURE:FORGOTTEN_BEAST_149:KIDNEY +#CREATURE:FORGOTTEN_BEAST_150:MUSCLE + CREATURE:FORGOTTEN_BEAST_150:EYE +"CREATURE:FORGOTTEN_BEAST_150:BRAIN +!CREATURE:FORGOTTEN_BEAST_150:LUNG +"CREATURE:FORGOTTEN_BEAST_150:HEART +"CREATURE:FORGOTTEN_BEAST_150:LIVER + CREATURE:FORGOTTEN_BEAST_150:GUT +$CREATURE:FORGOTTEN_BEAST_150:STOMACH +$CREATURE:FORGOTTEN_BEAST_150:GIZZARD +%CREATURE:FORGOTTEN_BEAST_150:PANCREAS +#CREATURE:FORGOTTEN_BEAST_150:SPLEEN +#CREATURE:FORGOTTEN_BEAST_150:KIDNEY +#CREATURE:FORGOTTEN_BEAST_152:MUSCLE + CREATURE:FORGOTTEN_BEAST_152:EYE +"CREATURE:FORGOTTEN_BEAST_152:BRAIN +!CREATURE:FORGOTTEN_BEAST_152:LUNG +"CREATURE:FORGOTTEN_BEAST_152:HEART +"CREATURE:FORGOTTEN_BEAST_152:LIVER + CREATURE:FORGOTTEN_BEAST_152:GUT +$CREATURE:FORGOTTEN_BEAST_152:STOMACH +$CREATURE:FORGOTTEN_BEAST_152:GIZZARD +%CREATURE:FORGOTTEN_BEAST_152:PANCREAS +#CREATURE:FORGOTTEN_BEAST_152:SPLEEN +#CREATURE:FORGOTTEN_BEAST_152:KIDNEY +#CREATURE:FORGOTTEN_BEAST_154:MUSCLE + CREATURE:FORGOTTEN_BEAST_154:EYE +"CREATURE:FORGOTTEN_BEAST_154:BRAIN +!CREATURE:FORGOTTEN_BEAST_154:LUNG +"CREATURE:FORGOTTEN_BEAST_154:HEART +"CREATURE:FORGOTTEN_BEAST_154:LIVER + CREATURE:FORGOTTEN_BEAST_154:GUT +$CREATURE:FORGOTTEN_BEAST_154:STOMACH +$CREATURE:FORGOTTEN_BEAST_154:GIZZARD +%CREATURE:FORGOTTEN_BEAST_154:PANCREAS +#CREATURE:FORGOTTEN_BEAST_154:SPLEEN +#CREATURE:FORGOTTEN_BEAST_154:KIDNEY +#CREATURE:FORGOTTEN_BEAST_156:MUSCLE + CREATURE:FORGOTTEN_BEAST_156:EYE +"CREATURE:FORGOTTEN_BEAST_156:BRAIN +!CREATURE:FORGOTTEN_BEAST_156:LUNG +"CREATURE:FORGOTTEN_BEAST_156:HEART +"CREATURE:FORGOTTEN_BEAST_156:LIVER + CREATURE:FORGOTTEN_BEAST_156:GUT +$CREATURE:FORGOTTEN_BEAST_156:STOMACH +$CREATURE:FORGOTTEN_BEAST_156:GIZZARD +%CREATURE:FORGOTTEN_BEAST_156:PANCREAS +#CREATURE:FORGOTTEN_BEAST_156:SPLEEN +#CREATURE:FORGOTTEN_BEAST_156:KIDNEY +#CREATURE:FORGOTTEN_BEAST_157:MUSCLE + CREATURE:FORGOTTEN_BEAST_157:EYE +"CREATURE:FORGOTTEN_BEAST_157:BRAIN +!CREATURE:FORGOTTEN_BEAST_157:LUNG +"CREATURE:FORGOTTEN_BEAST_157:HEART +"CREATURE:FORGOTTEN_BEAST_157:LIVER + CREATURE:FORGOTTEN_BEAST_157:GUT +$CREATURE:FORGOTTEN_BEAST_157:STOMACH +$CREATURE:FORGOTTEN_BEAST_157:GIZZARD +%CREATURE:FORGOTTEN_BEAST_157:PANCREAS +#CREATURE:FORGOTTEN_BEAST_157:SPLEEN +#CREATURE:FORGOTTEN_BEAST_157:KIDNEY +#CREATURE:FORGOTTEN_BEAST_158:MUSCLE + CREATURE:FORGOTTEN_BEAST_158:EYE +"CREATURE:FORGOTTEN_BEAST_158:BRAIN +!CREATURE:FORGOTTEN_BEAST_158:LUNG +"CREATURE:FORGOTTEN_BEAST_158:HEART +"CREATURE:FORGOTTEN_BEAST_158:LIVER + CREATURE:FORGOTTEN_BEAST_158:GUT +$CREATURE:FORGOTTEN_BEAST_158:STOMACH +$CREATURE:FORGOTTEN_BEAST_158:GIZZARD +%CREATURE:FORGOTTEN_BEAST_158:PANCREAS +#CREATURE:FORGOTTEN_BEAST_158:SPLEEN +#CREATURE:FORGOTTEN_BEAST_158:KIDNEY +#CREATURE:FORGOTTEN_BEAST_159:MUSCLE + CREATURE:FORGOTTEN_BEAST_159:EYE +"CREATURE:FORGOTTEN_BEAST_159:BRAIN +!CREATURE:FORGOTTEN_BEAST_159:LUNG +"CREATURE:FORGOTTEN_BEAST_159:HEART +"CREATURE:FORGOTTEN_BEAST_159:LIVER + CREATURE:FORGOTTEN_BEAST_159:GUT +$CREATURE:FORGOTTEN_BEAST_159:STOMACH +$CREATURE:FORGOTTEN_BEAST_159:GIZZARD +%CREATURE:FORGOTTEN_BEAST_159:PANCREAS +#CREATURE:FORGOTTEN_BEAST_159:SPLEEN +#CREATURE:FORGOTTEN_BEAST_159:KIDNEY +#CREATURE:FORGOTTEN_BEAST_161:MUSCLE + CREATURE:FORGOTTEN_BEAST_161:EYE +"CREATURE:FORGOTTEN_BEAST_161:BRAIN +!CREATURE:FORGOTTEN_BEAST_161:LUNG +"CREATURE:FORGOTTEN_BEAST_161:HEART +"CREATURE:FORGOTTEN_BEAST_161:LIVER + CREATURE:FORGOTTEN_BEAST_161:GUT +$CREATURE:FORGOTTEN_BEAST_161:STOMACH +$CREATURE:FORGOTTEN_BEAST_161:GIZZARD +%CREATURE:FORGOTTEN_BEAST_161:PANCREAS +#CREATURE:FORGOTTEN_BEAST_161:SPLEEN +#CREATURE:FORGOTTEN_BEAST_161:KIDNEY +#CREATURE:FORGOTTEN_BEAST_162:MUSCLE + CREATURE:FORGOTTEN_BEAST_162:EYE +"CREATURE:FORGOTTEN_BEAST_162:BRAIN +!CREATURE:FORGOTTEN_BEAST_162:LUNG +"CREATURE:FORGOTTEN_BEAST_162:HEART +"CREATURE:FORGOTTEN_BEAST_162:LIVER + CREATURE:FORGOTTEN_BEAST_162:GUT +$CREATURE:FORGOTTEN_BEAST_162:STOMACH +$CREATURE:FORGOTTEN_BEAST_162:GIZZARD +%CREATURE:FORGOTTEN_BEAST_162:PANCREAS +#CREATURE:FORGOTTEN_BEAST_162:SPLEEN +#CREATURE:FORGOTTEN_BEAST_162:KIDNEY +#CREATURE:FORGOTTEN_BEAST_163:MUSCLE + CREATURE:FORGOTTEN_BEAST_163:EYE +"CREATURE:FORGOTTEN_BEAST_163:BRAIN +!CREATURE:FORGOTTEN_BEAST_163:LUNG +"CREATURE:FORGOTTEN_BEAST_163:HEART +"CREATURE:FORGOTTEN_BEAST_163:LIVER + CREATURE:FORGOTTEN_BEAST_163:GUT +$CREATURE:FORGOTTEN_BEAST_163:STOMACH +$CREATURE:FORGOTTEN_BEAST_163:GIZZARD +%CREATURE:FORGOTTEN_BEAST_163:PANCREAS +#CREATURE:FORGOTTEN_BEAST_163:SPLEEN +#CREATURE:FORGOTTEN_BEAST_163:KIDNEY +#CREATURE:FORGOTTEN_BEAST_165:MUSCLE + CREATURE:FORGOTTEN_BEAST_165:EYE +"CREATURE:FORGOTTEN_BEAST_165:BRAIN +!CREATURE:FORGOTTEN_BEAST_165:LUNG +"CREATURE:FORGOTTEN_BEAST_165:HEART +"CREATURE:FORGOTTEN_BEAST_165:LIVER + CREATURE:FORGOTTEN_BEAST_165:GUT +$CREATURE:FORGOTTEN_BEAST_165:STOMACH +$CREATURE:FORGOTTEN_BEAST_165:GIZZARD +%CREATURE:FORGOTTEN_BEAST_165:PANCREAS +#CREATURE:FORGOTTEN_BEAST_165:SPLEEN +#CREATURE:FORGOTTEN_BEAST_165:KIDNEY +#CREATURE:FORGOTTEN_BEAST_167:MUSCLE + CREATURE:FORGOTTEN_BEAST_167:EYE +"CREATURE:FORGOTTEN_BEAST_167:BRAIN +!CREATURE:FORGOTTEN_BEAST_167:LUNG +"CREATURE:FORGOTTEN_BEAST_167:HEART +"CREATURE:FORGOTTEN_BEAST_167:LIVER + CREATURE:FORGOTTEN_BEAST_167:GUT +$CREATURE:FORGOTTEN_BEAST_167:STOMACH +$CREATURE:FORGOTTEN_BEAST_167:GIZZARD +%CREATURE:FORGOTTEN_BEAST_167:PANCREAS +#CREATURE:FORGOTTEN_BEAST_167:SPLEEN +#CREATURE:FORGOTTEN_BEAST_167:KIDNEY +#CREATURE:FORGOTTEN_BEAST_168:MUSCLE + CREATURE:FORGOTTEN_BEAST_168:EYE +"CREATURE:FORGOTTEN_BEAST_168:BRAIN +!CREATURE:FORGOTTEN_BEAST_168:LUNG +"CREATURE:FORGOTTEN_BEAST_168:HEART +"CREATURE:FORGOTTEN_BEAST_168:LIVER + CREATURE:FORGOTTEN_BEAST_168:GUT +$CREATURE:FORGOTTEN_BEAST_168:STOMACH +$CREATURE:FORGOTTEN_BEAST_168:GIZZARD +%CREATURE:FORGOTTEN_BEAST_168:PANCREAS +#CREATURE:FORGOTTEN_BEAST_168:SPLEEN +#CREATURE:FORGOTTEN_BEAST_168:KIDNEY +#CREATURE:FORGOTTEN_BEAST_169:MUSCLE + CREATURE:FORGOTTEN_BEAST_169:EYE +"CREATURE:FORGOTTEN_BEAST_169:BRAIN +!CREATURE:FORGOTTEN_BEAST_169:LUNG +"CREATURE:FORGOTTEN_BEAST_169:HEART +"CREATURE:FORGOTTEN_BEAST_169:LIVER + CREATURE:FORGOTTEN_BEAST_169:GUT +$CREATURE:FORGOTTEN_BEAST_169:STOMACH +$CREATURE:FORGOTTEN_BEAST_169:GIZZARD +%CREATURE:FORGOTTEN_BEAST_169:PANCREAS +#CREATURE:FORGOTTEN_BEAST_169:SPLEEN +#CREATURE:FORGOTTEN_BEAST_169:KIDNEY +#CREATURE:FORGOTTEN_BEAST_170:MUSCLE + CREATURE:FORGOTTEN_BEAST_170:EYE +"CREATURE:FORGOTTEN_BEAST_170:BRAIN +!CREATURE:FORGOTTEN_BEAST_170:LUNG +"CREATURE:FORGOTTEN_BEAST_170:HEART +"CREATURE:FORGOTTEN_BEAST_170:LIVER + CREATURE:FORGOTTEN_BEAST_170:GUT +$CREATURE:FORGOTTEN_BEAST_170:STOMACH +$CREATURE:FORGOTTEN_BEAST_170:GIZZARD +%CREATURE:FORGOTTEN_BEAST_170:PANCREAS +#CREATURE:FORGOTTEN_BEAST_170:SPLEEN +#CREATURE:FORGOTTEN_BEAST_170:KIDNEY +#CREATURE:FORGOTTEN_BEAST_171:MUSCLE + CREATURE:FORGOTTEN_BEAST_171:EYE +"CREATURE:FORGOTTEN_BEAST_171:BRAIN +!CREATURE:FORGOTTEN_BEAST_171:LUNG +"CREATURE:FORGOTTEN_BEAST_171:HEART +"CREATURE:FORGOTTEN_BEAST_171:LIVER + CREATURE:FORGOTTEN_BEAST_171:GUT +$CREATURE:FORGOTTEN_BEAST_171:STOMACH +$CREATURE:FORGOTTEN_BEAST_171:GIZZARD +%CREATURE:FORGOTTEN_BEAST_171:PANCREAS +#CREATURE:FORGOTTEN_BEAST_171:SPLEEN +#CREATURE:FORGOTTEN_BEAST_171:KIDNEY +#CREATURE:FORGOTTEN_BEAST_172:MUSCLE + CREATURE:FORGOTTEN_BEAST_172:EYE +"CREATURE:FORGOTTEN_BEAST_172:BRAIN +!CREATURE:FORGOTTEN_BEAST_172:LUNG +"CREATURE:FORGOTTEN_BEAST_172:HEART +"CREATURE:FORGOTTEN_BEAST_172:LIVER + CREATURE:FORGOTTEN_BEAST_172:GUT +$CREATURE:FORGOTTEN_BEAST_172:STOMACH +$CREATURE:FORGOTTEN_BEAST_172:GIZZARD +%CREATURE:FORGOTTEN_BEAST_172:PANCREAS +#CREATURE:FORGOTTEN_BEAST_172:SPLEEN +#CREATURE:FORGOTTEN_BEAST_172:KIDNEY +#CREATURE:FORGOTTEN_BEAST_173:MUSCLE + CREATURE:FORGOTTEN_BEAST_173:EYE +"CREATURE:FORGOTTEN_BEAST_173:BRAIN +!CREATURE:FORGOTTEN_BEAST_173:LUNG +"CREATURE:FORGOTTEN_BEAST_173:HEART +"CREATURE:FORGOTTEN_BEAST_173:LIVER + CREATURE:FORGOTTEN_BEAST_173:GUT +$CREATURE:FORGOTTEN_BEAST_173:STOMACH +$CREATURE:FORGOTTEN_BEAST_173:GIZZARD +%CREATURE:FORGOTTEN_BEAST_173:PANCREAS +#CREATURE:FORGOTTEN_BEAST_173:SPLEEN +#CREATURE:FORGOTTEN_BEAST_173:KIDNEY +#CREATURE:FORGOTTEN_BEAST_176:MUSCLE + CREATURE:FORGOTTEN_BEAST_176:EYE +"CREATURE:FORGOTTEN_BEAST_176:BRAIN +!CREATURE:FORGOTTEN_BEAST_176:LUNG +"CREATURE:FORGOTTEN_BEAST_176:HEART +"CREATURE:FORGOTTEN_BEAST_176:LIVER + CREATURE:FORGOTTEN_BEAST_176:GUT +$CREATURE:FORGOTTEN_BEAST_176:STOMACH +$CREATURE:FORGOTTEN_BEAST_176:GIZZARD +%CREATURE:FORGOTTEN_BEAST_176:PANCREAS +#CREATURE:FORGOTTEN_BEAST_176:SPLEEN +#CREATURE:FORGOTTEN_BEAST_176:KIDNEY +#CREATURE:FORGOTTEN_BEAST_177:MUSCLE + CREATURE:FORGOTTEN_BEAST_177:EYE +"CREATURE:FORGOTTEN_BEAST_177:BRAIN +!CREATURE:FORGOTTEN_BEAST_177:LUNG +"CREATURE:FORGOTTEN_BEAST_177:HEART +"CREATURE:FORGOTTEN_BEAST_177:LIVER + CREATURE:FORGOTTEN_BEAST_177:GUT +$CREATURE:FORGOTTEN_BEAST_177:STOMACH +$CREATURE:FORGOTTEN_BEAST_177:GIZZARD +%CREATURE:FORGOTTEN_BEAST_177:PANCREAS +#CREATURE:FORGOTTEN_BEAST_177:SPLEEN +#CREATURE:FORGOTTEN_BEAST_177:KIDNEY +#CREATURE:FORGOTTEN_BEAST_178:MUSCLE + CREATURE:FORGOTTEN_BEAST_178:EYE +"CREATURE:FORGOTTEN_BEAST_178:BRAIN +!CREATURE:FORGOTTEN_BEAST_178:LUNG +"CREATURE:FORGOTTEN_BEAST_178:HEART +"CREATURE:FORGOTTEN_BEAST_178:LIVER + CREATURE:FORGOTTEN_BEAST_178:GUT +$CREATURE:FORGOTTEN_BEAST_178:STOMACH +$CREATURE:FORGOTTEN_BEAST_178:GIZZARD +%CREATURE:FORGOTTEN_BEAST_178:PANCREAS +#CREATURE:FORGOTTEN_BEAST_178:SPLEEN +#CREATURE:FORGOTTEN_BEAST_178:KIDNEY +#CREATURE:FORGOTTEN_BEAST_179:MUSCLE + CREATURE:FORGOTTEN_BEAST_179:EYE +"CREATURE:FORGOTTEN_BEAST_179:BRAIN +!CREATURE:FORGOTTEN_BEAST_179:LUNG +"CREATURE:FORGOTTEN_BEAST_179:HEART +"CREATURE:FORGOTTEN_BEAST_179:LIVER + CREATURE:FORGOTTEN_BEAST_179:GUT +$CREATURE:FORGOTTEN_BEAST_179:STOMACH +$CREATURE:FORGOTTEN_BEAST_179:GIZZARD +%CREATURE:FORGOTTEN_BEAST_179:PANCREAS +#CREATURE:FORGOTTEN_BEAST_179:SPLEEN +#CREATURE:FORGOTTEN_BEAST_179:KIDNEY +#CREATURE:FORGOTTEN_BEAST_180:MUSCLE + CREATURE:FORGOTTEN_BEAST_180:EYE +"CREATURE:FORGOTTEN_BEAST_180:BRAIN +!CREATURE:FORGOTTEN_BEAST_180:LUNG +"CREATURE:FORGOTTEN_BEAST_180:HEART +"CREATURE:FORGOTTEN_BEAST_180:LIVER + CREATURE:FORGOTTEN_BEAST_180:GUT +$CREATURE:FORGOTTEN_BEAST_180:STOMACH +$CREATURE:FORGOTTEN_BEAST_180:GIZZARD +%CREATURE:FORGOTTEN_BEAST_180:PANCREAS +#CREATURE:FORGOTTEN_BEAST_180:SPLEEN +#CREATURE:FORGOTTEN_BEAST_180:KIDNEY +#CREATURE:FORGOTTEN_BEAST_181:MUSCLE + CREATURE:FORGOTTEN_BEAST_181:EYE +"CREATURE:FORGOTTEN_BEAST_181:BRAIN +!CREATURE:FORGOTTEN_BEAST_181:LUNG +"CREATURE:FORGOTTEN_BEAST_181:HEART +"CREATURE:FORGOTTEN_BEAST_181:LIVER + CREATURE:FORGOTTEN_BEAST_181:GUT +$CREATURE:FORGOTTEN_BEAST_181:STOMACH +$CREATURE:FORGOTTEN_BEAST_181:GIZZARD +%CREATURE:FORGOTTEN_BEAST_181:PANCREAS +#CREATURE:FORGOTTEN_BEAST_181:SPLEEN +#CREATURE:FORGOTTEN_BEAST_181:KIDNEY +#CREATURE:FORGOTTEN_BEAST_182:MUSCLE + CREATURE:FORGOTTEN_BEAST_182:EYE +"CREATURE:FORGOTTEN_BEAST_182:BRAIN +!CREATURE:FORGOTTEN_BEAST_182:LUNG +"CREATURE:FORGOTTEN_BEAST_182:HEART +"CREATURE:FORGOTTEN_BEAST_182:LIVER + CREATURE:FORGOTTEN_BEAST_182:GUT +$CREATURE:FORGOTTEN_BEAST_182:STOMACH +$CREATURE:FORGOTTEN_BEAST_182:GIZZARD +%CREATURE:FORGOTTEN_BEAST_182:PANCREAS +#CREATURE:FORGOTTEN_BEAST_182:SPLEEN +#CREATURE:FORGOTTEN_BEAST_182:KIDNEY +#CREATURE:FORGOTTEN_BEAST_183:MUSCLE + CREATURE:FORGOTTEN_BEAST_183:EYE +"CREATURE:FORGOTTEN_BEAST_183:BRAIN +!CREATURE:FORGOTTEN_BEAST_183:LUNG +"CREATURE:FORGOTTEN_BEAST_183:HEART +"CREATURE:FORGOTTEN_BEAST_183:LIVER + CREATURE:FORGOTTEN_BEAST_183:GUT +$CREATURE:FORGOTTEN_BEAST_183:STOMACH +$CREATURE:FORGOTTEN_BEAST_183:GIZZARD +%CREATURE:FORGOTTEN_BEAST_183:PANCREAS +#CREATURE:FORGOTTEN_BEAST_183:SPLEEN +#CREATURE:FORGOTTEN_BEAST_183:KIDNEY +#CREATURE:FORGOTTEN_BEAST_184:MUSCLE + CREATURE:FORGOTTEN_BEAST_184:EYE +"CREATURE:FORGOTTEN_BEAST_184:BRAIN +!CREATURE:FORGOTTEN_BEAST_184:LUNG +"CREATURE:FORGOTTEN_BEAST_184:HEART +"CREATURE:FORGOTTEN_BEAST_184:LIVER + CREATURE:FORGOTTEN_BEAST_184:GUT +$CREATURE:FORGOTTEN_BEAST_184:STOMACH +$CREATURE:FORGOTTEN_BEAST_184:GIZZARD +%CREATURE:FORGOTTEN_BEAST_184:PANCREAS +#CREATURE:FORGOTTEN_BEAST_184:SPLEEN +#CREATURE:FORGOTTEN_BEAST_184:KIDNEY +#CREATURE:FORGOTTEN_BEAST_185:MUSCLE + CREATURE:FORGOTTEN_BEAST_185:EYE +"CREATURE:FORGOTTEN_BEAST_185:BRAIN +!CREATURE:FORGOTTEN_BEAST_185:LUNG +"CREATURE:FORGOTTEN_BEAST_185:HEART +"CREATURE:FORGOTTEN_BEAST_185:LIVER + CREATURE:FORGOTTEN_BEAST_185:GUT +$CREATURE:FORGOTTEN_BEAST_185:STOMACH +$CREATURE:FORGOTTEN_BEAST_185:GIZZARD +%CREATURE:FORGOTTEN_BEAST_185:PANCREAS +#CREATURE:FORGOTTEN_BEAST_185:SPLEEN +#CREATURE:FORGOTTEN_BEAST_185:KIDNEY +#CREATURE:FORGOTTEN_BEAST_186:MUSCLE + CREATURE:FORGOTTEN_BEAST_186:EYE +"CREATURE:FORGOTTEN_BEAST_186:BRAIN +!CREATURE:FORGOTTEN_BEAST_186:LUNG +"CREATURE:FORGOTTEN_BEAST_186:HEART +"CREATURE:FORGOTTEN_BEAST_186:LIVER + CREATURE:FORGOTTEN_BEAST_186:GUT +$CREATURE:FORGOTTEN_BEAST_186:STOMACH +$CREATURE:FORGOTTEN_BEAST_186:GIZZARD +%CREATURE:FORGOTTEN_BEAST_186:PANCREAS +#CREATURE:FORGOTTEN_BEAST_186:SPLEEN +#CREATURE:FORGOTTEN_BEAST_186:KIDNEY +#CREATURE:FORGOTTEN_BEAST_188:MUSCLE + CREATURE:FORGOTTEN_BEAST_188:EYE +"CREATURE:FORGOTTEN_BEAST_188:BRAIN +!CREATURE:FORGOTTEN_BEAST_188:LUNG +"CREATURE:FORGOTTEN_BEAST_188:HEART +"CREATURE:FORGOTTEN_BEAST_188:LIVER + CREATURE:FORGOTTEN_BEAST_188:GUT +$CREATURE:FORGOTTEN_BEAST_188:STOMACH +$CREATURE:FORGOTTEN_BEAST_188:GIZZARD +%CREATURE:FORGOTTEN_BEAST_188:PANCREAS +#CREATURE:FORGOTTEN_BEAST_188:SPLEEN +#CREATURE:FORGOTTEN_BEAST_188:KIDNEY +#CREATURE:FORGOTTEN_BEAST_189:MUSCLE + CREATURE:FORGOTTEN_BEAST_189:EYE +"CREATURE:FORGOTTEN_BEAST_189:BRAIN +!CREATURE:FORGOTTEN_BEAST_189:LUNG +"CREATURE:FORGOTTEN_BEAST_189:HEART +"CREATURE:FORGOTTEN_BEAST_189:LIVER + CREATURE:FORGOTTEN_BEAST_189:GUT +$CREATURE:FORGOTTEN_BEAST_189:STOMACH +$CREATURE:FORGOTTEN_BEAST_189:GIZZARD +%CREATURE:FORGOTTEN_BEAST_189:PANCREAS +#CREATURE:FORGOTTEN_BEAST_189:SPLEEN +#CREATURE:FORGOTTEN_BEAST_189:KIDNEY +#CREATURE:FORGOTTEN_BEAST_190:MUSCLE + CREATURE:FORGOTTEN_BEAST_190:EYE +"CREATURE:FORGOTTEN_BEAST_190:BRAIN +!CREATURE:FORGOTTEN_BEAST_190:LUNG +"CREATURE:FORGOTTEN_BEAST_190:HEART +"CREATURE:FORGOTTEN_BEAST_190:LIVER + CREATURE:FORGOTTEN_BEAST_190:GUT +$CREATURE:FORGOTTEN_BEAST_190:STOMACH +$CREATURE:FORGOTTEN_BEAST_190:GIZZARD +%CREATURE:FORGOTTEN_BEAST_190:PANCREAS +#CREATURE:FORGOTTEN_BEAST_190:SPLEEN +#CREATURE:FORGOTTEN_BEAST_190:KIDNEY +#CREATURE:FORGOTTEN_BEAST_191:MUSCLE + CREATURE:FORGOTTEN_BEAST_191:EYE +"CREATURE:FORGOTTEN_BEAST_191:BRAIN +!CREATURE:FORGOTTEN_BEAST_191:LUNG +"CREATURE:FORGOTTEN_BEAST_191:HEART +"CREATURE:FORGOTTEN_BEAST_191:LIVER + CREATURE:FORGOTTEN_BEAST_191:GUT +$CREATURE:FORGOTTEN_BEAST_191:STOMACH +$CREATURE:FORGOTTEN_BEAST_191:GIZZARD +%CREATURE:FORGOTTEN_BEAST_191:PANCREAS +#CREATURE:FORGOTTEN_BEAST_191:SPLEEN +#CREATURE:FORGOTTEN_BEAST_191:KIDNEY +#CREATURE:FORGOTTEN_BEAST_193:MUSCLE + CREATURE:FORGOTTEN_BEAST_193:EYE +"CREATURE:FORGOTTEN_BEAST_193:BRAIN +!CREATURE:FORGOTTEN_BEAST_193:LUNG +"CREATURE:FORGOTTEN_BEAST_193:HEART +"CREATURE:FORGOTTEN_BEAST_193:LIVER + CREATURE:FORGOTTEN_BEAST_193:GUT +$CREATURE:FORGOTTEN_BEAST_193:STOMACH +$CREATURE:FORGOTTEN_BEAST_193:GIZZARD +%CREATURE:FORGOTTEN_BEAST_193:PANCREAS +#CREATURE:FORGOTTEN_BEAST_193:SPLEEN +#CREATURE:FORGOTTEN_BEAST_193:KIDNEY +#CREATURE:FORGOTTEN_BEAST_194:MUSCLE + CREATURE:FORGOTTEN_BEAST_194:EYE +"CREATURE:FORGOTTEN_BEAST_194:BRAIN +!CREATURE:FORGOTTEN_BEAST_194:LUNG +"CREATURE:FORGOTTEN_BEAST_194:HEART +"CREATURE:FORGOTTEN_BEAST_194:LIVER + CREATURE:FORGOTTEN_BEAST_194:GUT +$CREATURE:FORGOTTEN_BEAST_194:STOMACH +$CREATURE:FORGOTTEN_BEAST_194:GIZZARD +%CREATURE:FORGOTTEN_BEAST_194:PANCREAS +#CREATURE:FORGOTTEN_BEAST_194:SPLEEN +#CREATURE:FORGOTTEN_BEAST_194:KIDNEY +#CREATURE:FORGOTTEN_BEAST_195:MUSCLE + CREATURE:FORGOTTEN_BEAST_195:EYE +"CREATURE:FORGOTTEN_BEAST_195:BRAIN +!CREATURE:FORGOTTEN_BEAST_195:LUNG +"CREATURE:FORGOTTEN_BEAST_195:HEART +"CREATURE:FORGOTTEN_BEAST_195:LIVER + CREATURE:FORGOTTEN_BEAST_195:GUT +$CREATURE:FORGOTTEN_BEAST_195:STOMACH +$CREATURE:FORGOTTEN_BEAST_195:GIZZARD +%CREATURE:FORGOTTEN_BEAST_195:PANCREAS +#CREATURE:FORGOTTEN_BEAST_195:SPLEEN +#CREATURE:FORGOTTEN_BEAST_195:KIDNEY +#CREATURE:FORGOTTEN_BEAST_196:MUSCLE + CREATURE:FORGOTTEN_BEAST_196:EYE +"CREATURE:FORGOTTEN_BEAST_196:BRAIN +!CREATURE:FORGOTTEN_BEAST_196:LUNG +"CREATURE:FORGOTTEN_BEAST_196:HEART +"CREATURE:FORGOTTEN_BEAST_196:LIVER + CREATURE:FORGOTTEN_BEAST_196:GUT +$CREATURE:FORGOTTEN_BEAST_196:STOMACH +$CREATURE:FORGOTTEN_BEAST_196:GIZZARD +%CREATURE:FORGOTTEN_BEAST_196:PANCREAS +#CREATURE:FORGOTTEN_BEAST_196:SPLEEN +#CREATURE:FORGOTTEN_BEAST_196:KIDNEY +#CREATURE:FORGOTTEN_BEAST_197:MUSCLE + CREATURE:FORGOTTEN_BEAST_197:EYE +"CREATURE:FORGOTTEN_BEAST_197:BRAIN +!CREATURE:FORGOTTEN_BEAST_197:LUNG +"CREATURE:FORGOTTEN_BEAST_197:HEART +"CREATURE:FORGOTTEN_BEAST_197:LIVER + CREATURE:FORGOTTEN_BEAST_197:GUT +$CREATURE:FORGOTTEN_BEAST_197:STOMACH +$CREATURE:FORGOTTEN_BEAST_197:GIZZARD +%CREATURE:FORGOTTEN_BEAST_197:PANCREAS +#CREATURE:FORGOTTEN_BEAST_197:SPLEEN +#CREATURE:FORGOTTEN_BEAST_197:KIDNEY +#CREATURE:FORGOTTEN_BEAST_199:MUSCLE + CREATURE:FORGOTTEN_BEAST_199:EYE +"CREATURE:FORGOTTEN_BEAST_199:BRAIN +!CREATURE:FORGOTTEN_BEAST_199:LUNG +"CREATURE:FORGOTTEN_BEAST_199:HEART +"CREATURE:FORGOTTEN_BEAST_199:LIVER + CREATURE:FORGOTTEN_BEAST_199:GUT +$CREATURE:FORGOTTEN_BEAST_199:STOMACH +$CREATURE:FORGOTTEN_BEAST_199:GIZZARD +%CREATURE:FORGOTTEN_BEAST_199:PANCREAS +#CREATURE:FORGOTTEN_BEAST_199:SPLEEN +#CREATURE:FORGOTTEN_BEAST_199:KIDNEY +#CREATURE:FORGOTTEN_BEAST_200:MUSCLE + CREATURE:FORGOTTEN_BEAST_200:EYE +"CREATURE:FORGOTTEN_BEAST_200:BRAIN +!CREATURE:FORGOTTEN_BEAST_200:LUNG +"CREATURE:FORGOTTEN_BEAST_200:HEART +"CREATURE:FORGOTTEN_BEAST_200:LIVER + CREATURE:FORGOTTEN_BEAST_200:GUT +$CREATURE:FORGOTTEN_BEAST_200:STOMACH +$CREATURE:FORGOTTEN_BEAST_200:GIZZARD +%CREATURE:FORGOTTEN_BEAST_200:PANCREAS +#CREATURE:FORGOTTEN_BEAST_200:SPLEEN +#CREATURE:FORGOTTEN_BEAST_200:KIDNEY +#CREATURE:FORGOTTEN_BEAST_201:MUSCLE + CREATURE:FORGOTTEN_BEAST_201:EYE +"CREATURE:FORGOTTEN_BEAST_201:BRAIN +!CREATURE:FORGOTTEN_BEAST_201:LUNG +"CREATURE:FORGOTTEN_BEAST_201:HEART +"CREATURE:FORGOTTEN_BEAST_201:LIVER + CREATURE:FORGOTTEN_BEAST_201:GUT +$CREATURE:FORGOTTEN_BEAST_201:STOMACH +$CREATURE:FORGOTTEN_BEAST_201:GIZZARD +%CREATURE:FORGOTTEN_BEAST_201:PANCREAS +#CREATURE:FORGOTTEN_BEAST_201:SPLEEN +#CREATURE:FORGOTTEN_BEAST_201:KIDNEY +#CREATURE:FORGOTTEN_BEAST_204:MUSCLE + CREATURE:FORGOTTEN_BEAST_204:EYE +"CREATURE:FORGOTTEN_BEAST_204:BRAIN +!CREATURE:FORGOTTEN_BEAST_204:LUNG +"CREATURE:FORGOTTEN_BEAST_204:HEART +"CREATURE:FORGOTTEN_BEAST_204:LIVER + CREATURE:FORGOTTEN_BEAST_204:GUT +$CREATURE:FORGOTTEN_BEAST_204:STOMACH +$CREATURE:FORGOTTEN_BEAST_204:GIZZARD +%CREATURE:FORGOTTEN_BEAST_204:PANCREAS +#CREATURE:FORGOTTEN_BEAST_204:SPLEEN +#CREATURE:FORGOTTEN_BEAST_204:KIDNEY +#CREATURE:FORGOTTEN_BEAST_205:MUSCLE + CREATURE:FORGOTTEN_BEAST_205:EYE +"CREATURE:FORGOTTEN_BEAST_205:BRAIN +!CREATURE:FORGOTTEN_BEAST_205:LUNG +"CREATURE:FORGOTTEN_BEAST_205:HEART +"CREATURE:FORGOTTEN_BEAST_205:LIVER + CREATURE:FORGOTTEN_BEAST_205:GUT +$CREATURE:FORGOTTEN_BEAST_205:STOMACH +$CREATURE:FORGOTTEN_BEAST_205:GIZZARD +%CREATURE:FORGOTTEN_BEAST_205:PANCREAS +#CREATURE:FORGOTTEN_BEAST_205:SPLEEN +#CREATURE:FORGOTTEN_BEAST_205:KIDNEY +#CREATURE:FORGOTTEN_BEAST_206:MUSCLE + CREATURE:FORGOTTEN_BEAST_206:EYE +"CREATURE:FORGOTTEN_BEAST_206:BRAIN +!CREATURE:FORGOTTEN_BEAST_206:LUNG +"CREATURE:FORGOTTEN_BEAST_206:HEART +"CREATURE:FORGOTTEN_BEAST_206:LIVER + CREATURE:FORGOTTEN_BEAST_206:GUT +$CREATURE:FORGOTTEN_BEAST_206:STOMACH +$CREATURE:FORGOTTEN_BEAST_206:GIZZARD +%CREATURE:FORGOTTEN_BEAST_206:PANCREAS +#CREATURE:FORGOTTEN_BEAST_206:SPLEEN +#CREATURE:FORGOTTEN_BEAST_206:KIDNEY +#CREATURE:FORGOTTEN_BEAST_207:MUSCLE + CREATURE:FORGOTTEN_BEAST_207:EYE +"CREATURE:FORGOTTEN_BEAST_207:BRAIN +!CREATURE:FORGOTTEN_BEAST_207:LUNG +"CREATURE:FORGOTTEN_BEAST_207:HEART +"CREATURE:FORGOTTEN_BEAST_207:LIVER + CREATURE:FORGOTTEN_BEAST_207:GUT +$CREATURE:FORGOTTEN_BEAST_207:STOMACH +$CREATURE:FORGOTTEN_BEAST_207:GIZZARD +%CREATURE:FORGOTTEN_BEAST_207:PANCREAS +#CREATURE:FORGOTTEN_BEAST_207:SPLEEN +#CREATURE:FORGOTTEN_BEAST_207:KIDNEY +#CREATURE:FORGOTTEN_BEAST_208:MUSCLE + CREATURE:FORGOTTEN_BEAST_208:EYE +"CREATURE:FORGOTTEN_BEAST_208:BRAIN +!CREATURE:FORGOTTEN_BEAST_208:LUNG +"CREATURE:FORGOTTEN_BEAST_208:HEART +"CREATURE:FORGOTTEN_BEAST_208:LIVER + CREATURE:FORGOTTEN_BEAST_208:GUT +$CREATURE:FORGOTTEN_BEAST_208:STOMACH +$CREATURE:FORGOTTEN_BEAST_208:GIZZARD +%CREATURE:FORGOTTEN_BEAST_208:PANCREAS +#CREATURE:FORGOTTEN_BEAST_208:SPLEEN +#CREATURE:FORGOTTEN_BEAST_208:KIDNEY +#CREATURE:FORGOTTEN_BEAST_209:MUSCLE + CREATURE:FORGOTTEN_BEAST_209:EYE +"CREATURE:FORGOTTEN_BEAST_209:BRAIN +!CREATURE:FORGOTTEN_BEAST_209:LUNG +"CREATURE:FORGOTTEN_BEAST_209:HEART +"CREATURE:FORGOTTEN_BEAST_209:LIVER + CREATURE:FORGOTTEN_BEAST_209:GUT +$CREATURE:FORGOTTEN_BEAST_209:STOMACH +$CREATURE:FORGOTTEN_BEAST_209:GIZZARD +%CREATURE:FORGOTTEN_BEAST_209:PANCREAS +#CREATURE:FORGOTTEN_BEAST_209:SPLEEN +#CREATURE:FORGOTTEN_BEAST_209:KIDNEY +#CREATURE:FORGOTTEN_BEAST_210:MUSCLE + CREATURE:FORGOTTEN_BEAST_210:EYE +"CREATURE:FORGOTTEN_BEAST_210:BRAIN +!CREATURE:FORGOTTEN_BEAST_210:LUNG +"CREATURE:FORGOTTEN_BEAST_210:HEART +"CREATURE:FORGOTTEN_BEAST_210:LIVER + CREATURE:FORGOTTEN_BEAST_210:GUT +$CREATURE:FORGOTTEN_BEAST_210:STOMACH +$CREATURE:FORGOTTEN_BEAST_210:GIZZARD +%CREATURE:FORGOTTEN_BEAST_210:PANCREAS +#CREATURE:FORGOTTEN_BEAST_210:SPLEEN +#CREATURE:FORGOTTEN_BEAST_210:KIDNEY +#CREATURE:FORGOTTEN_BEAST_211:MUSCLE + CREATURE:FORGOTTEN_BEAST_211:EYE +"CREATURE:FORGOTTEN_BEAST_211:BRAIN +!CREATURE:FORGOTTEN_BEAST_211:LUNG +"CREATURE:FORGOTTEN_BEAST_211:HEART +"CREATURE:FORGOTTEN_BEAST_211:LIVER + CREATURE:FORGOTTEN_BEAST_211:GUT +$CREATURE:FORGOTTEN_BEAST_211:STOMACH +$CREATURE:FORGOTTEN_BEAST_211:GIZZARD +%CREATURE:FORGOTTEN_BEAST_211:PANCREAS +#CREATURE:FORGOTTEN_BEAST_211:SPLEEN +#CREATURE:FORGOTTEN_BEAST_211:KIDNEY +#CREATURE:FORGOTTEN_BEAST_212:MUSCLE + CREATURE:FORGOTTEN_BEAST_212:EYE +"CREATURE:FORGOTTEN_BEAST_212:BRAIN +!CREATURE:FORGOTTEN_BEAST_212:LUNG +"CREATURE:FORGOTTEN_BEAST_212:HEART +"CREATURE:FORGOTTEN_BEAST_212:LIVER + CREATURE:FORGOTTEN_BEAST_212:GUT +$CREATURE:FORGOTTEN_BEAST_212:STOMACH +$CREATURE:FORGOTTEN_BEAST_212:GIZZARD +%CREATURE:FORGOTTEN_BEAST_212:PANCREAS +#CREATURE:FORGOTTEN_BEAST_212:SPLEEN +#CREATURE:FORGOTTEN_BEAST_212:KIDNEY +#CREATURE:FORGOTTEN_BEAST_213:MUSCLE + CREATURE:FORGOTTEN_BEAST_213:EYE +"CREATURE:FORGOTTEN_BEAST_213:BRAIN +!CREATURE:FORGOTTEN_BEAST_213:LUNG +"CREATURE:FORGOTTEN_BEAST_213:HEART +"CREATURE:FORGOTTEN_BEAST_213:LIVER + CREATURE:FORGOTTEN_BEAST_213:GUT +$CREATURE:FORGOTTEN_BEAST_213:STOMACH +$CREATURE:FORGOTTEN_BEAST_213:GIZZARD +%CREATURE:FORGOTTEN_BEAST_213:PANCREAS +#CREATURE:FORGOTTEN_BEAST_213:SPLEEN +#CREATURE:FORGOTTEN_BEAST_213:KIDNEY +#CREATURE:FORGOTTEN_BEAST_214:MUSCLE + CREATURE:FORGOTTEN_BEAST_214:EYE +"CREATURE:FORGOTTEN_BEAST_214:BRAIN +!CREATURE:FORGOTTEN_BEAST_214:LUNG +"CREATURE:FORGOTTEN_BEAST_214:HEART +"CREATURE:FORGOTTEN_BEAST_214:LIVER + CREATURE:FORGOTTEN_BEAST_214:GUT +$CREATURE:FORGOTTEN_BEAST_214:STOMACH +$CREATURE:FORGOTTEN_BEAST_214:GIZZARD +%CREATURE:FORGOTTEN_BEAST_214:PANCREAS +#CREATURE:FORGOTTEN_BEAST_214:SPLEEN +#CREATURE:FORGOTTEN_BEAST_214:KIDNEY +#CREATURE:FORGOTTEN_BEAST_215:MUSCLE + CREATURE:FORGOTTEN_BEAST_215:EYE +"CREATURE:FORGOTTEN_BEAST_215:BRAIN +!CREATURE:FORGOTTEN_BEAST_215:LUNG +"CREATURE:FORGOTTEN_BEAST_215:HEART +"CREATURE:FORGOTTEN_BEAST_215:LIVER + CREATURE:FORGOTTEN_BEAST_215:GUT +$CREATURE:FORGOTTEN_BEAST_215:STOMACH +$CREATURE:FORGOTTEN_BEAST_215:GIZZARD +%CREATURE:FORGOTTEN_BEAST_215:PANCREAS +#CREATURE:FORGOTTEN_BEAST_215:SPLEEN +#CREATURE:FORGOTTEN_BEAST_215:KIDNEY +#CREATURE:FORGOTTEN_BEAST_216:MUSCLE + CREATURE:FORGOTTEN_BEAST_216:EYE +"CREATURE:FORGOTTEN_BEAST_216:BRAIN +!CREATURE:FORGOTTEN_BEAST_216:LUNG +"CREATURE:FORGOTTEN_BEAST_216:HEART +"CREATURE:FORGOTTEN_BEAST_216:LIVER + CREATURE:FORGOTTEN_BEAST_216:GUT +$CREATURE:FORGOTTEN_BEAST_216:STOMACH +$CREATURE:FORGOTTEN_BEAST_216:GIZZARD +%CREATURE:FORGOTTEN_BEAST_216:PANCREAS +#CREATURE:FORGOTTEN_BEAST_216:SPLEEN +#CREATURE:FORGOTTEN_BEAST_216:KIDNEY +#CREATURE:FORGOTTEN_BEAST_217:MUSCLE + CREATURE:FORGOTTEN_BEAST_217:EYE +"CREATURE:FORGOTTEN_BEAST_217:BRAIN +!CREATURE:FORGOTTEN_BEAST_217:LUNG +"CREATURE:FORGOTTEN_BEAST_217:HEART +"CREATURE:FORGOTTEN_BEAST_217:LIVER + CREATURE:FORGOTTEN_BEAST_217:GUT +$CREATURE:FORGOTTEN_BEAST_217:STOMACH +$CREATURE:FORGOTTEN_BEAST_217:GIZZARD +%CREATURE:FORGOTTEN_BEAST_217:PANCREAS +#CREATURE:FORGOTTEN_BEAST_217:SPLEEN +#CREATURE:FORGOTTEN_BEAST_217:KIDNEY +#CREATURE:FORGOTTEN_BEAST_218:MUSCLE + CREATURE:FORGOTTEN_BEAST_218:EYE +"CREATURE:FORGOTTEN_BEAST_218:BRAIN +!CREATURE:FORGOTTEN_BEAST_218:LUNG +"CREATURE:FORGOTTEN_BEAST_218:HEART +"CREATURE:FORGOTTEN_BEAST_218:LIVER + CREATURE:FORGOTTEN_BEAST_218:GUT +$CREATURE:FORGOTTEN_BEAST_218:STOMACH +$CREATURE:FORGOTTEN_BEAST_218:GIZZARD +%CREATURE:FORGOTTEN_BEAST_218:PANCREAS +#CREATURE:FORGOTTEN_BEAST_218:SPLEEN +#CREATURE:FORGOTTEN_BEAST_218:KIDNEY +#CREATURE:FORGOTTEN_BEAST_220:MUSCLE + CREATURE:FORGOTTEN_BEAST_220:EYE +"CREATURE:FORGOTTEN_BEAST_220:BRAIN +!CREATURE:FORGOTTEN_BEAST_220:LUNG +"CREATURE:FORGOTTEN_BEAST_220:HEART +"CREATURE:FORGOTTEN_BEAST_220:LIVER + CREATURE:FORGOTTEN_BEAST_220:GUT +$CREATURE:FORGOTTEN_BEAST_220:STOMACH +$CREATURE:FORGOTTEN_BEAST_220:GIZZARD +%CREATURE:FORGOTTEN_BEAST_220:PANCREAS +#CREATURE:FORGOTTEN_BEAST_220:SPLEEN +#CREATURE:FORGOTTEN_BEAST_220:KIDNEY +#CREATURE:FORGOTTEN_BEAST_221:MUSCLE + CREATURE:FORGOTTEN_BEAST_221:EYE +"CREATURE:FORGOTTEN_BEAST_221:BRAIN +!CREATURE:FORGOTTEN_BEAST_221:LUNG +"CREATURE:FORGOTTEN_BEAST_221:HEART +"CREATURE:FORGOTTEN_BEAST_221:LIVER + CREATURE:FORGOTTEN_BEAST_221:GUT +$CREATURE:FORGOTTEN_BEAST_221:STOMACH +$CREATURE:FORGOTTEN_BEAST_221:GIZZARD +%CREATURE:FORGOTTEN_BEAST_221:PANCREAS +#CREATURE:FORGOTTEN_BEAST_221:SPLEEN +#CREATURE:FORGOTTEN_BEAST_221:KIDNEY +#CREATURE:FORGOTTEN_BEAST_224:MUSCLE + CREATURE:FORGOTTEN_BEAST_224:EYE +"CREATURE:FORGOTTEN_BEAST_224:BRAIN +!CREATURE:FORGOTTEN_BEAST_224:LUNG +"CREATURE:FORGOTTEN_BEAST_224:HEART +"CREATURE:FORGOTTEN_BEAST_224:LIVER + CREATURE:FORGOTTEN_BEAST_224:GUT +$CREATURE:FORGOTTEN_BEAST_224:STOMACH +$CREATURE:FORGOTTEN_BEAST_224:GIZZARD +%CREATURE:FORGOTTEN_BEAST_224:PANCREAS +#CREATURE:FORGOTTEN_BEAST_224:SPLEEN +#CREATURE:FORGOTTEN_BEAST_224:KIDNEY +#CREATURE:FORGOTTEN_BEAST_225:MUSCLE + CREATURE:FORGOTTEN_BEAST_225:EYE +"CREATURE:FORGOTTEN_BEAST_225:BRAIN +!CREATURE:FORGOTTEN_BEAST_225:LUNG +"CREATURE:FORGOTTEN_BEAST_225:HEART +"CREATURE:FORGOTTEN_BEAST_225:LIVER + CREATURE:FORGOTTEN_BEAST_225:GUT +$CREATURE:FORGOTTEN_BEAST_225:STOMACH +$CREATURE:FORGOTTEN_BEAST_225:GIZZARD +%CREATURE:FORGOTTEN_BEAST_225:PANCREAS +#CREATURE:FORGOTTEN_BEAST_225:SPLEEN +#CREATURE:FORGOTTEN_BEAST_225:KIDNEY +#CREATURE:FORGOTTEN_BEAST_228:MUSCLE + CREATURE:FORGOTTEN_BEAST_228:EYE +"CREATURE:FORGOTTEN_BEAST_228:BRAIN +!CREATURE:FORGOTTEN_BEAST_228:LUNG +"CREATURE:FORGOTTEN_BEAST_228:HEART +"CREATURE:FORGOTTEN_BEAST_228:LIVER + CREATURE:FORGOTTEN_BEAST_228:GUT +$CREATURE:FORGOTTEN_BEAST_228:STOMACH +$CREATURE:FORGOTTEN_BEAST_228:GIZZARD +%CREATURE:FORGOTTEN_BEAST_228:PANCREAS +#CREATURE:FORGOTTEN_BEAST_228:SPLEEN +#CREATURE:FORGOTTEN_BEAST_228:KIDNEY +#CREATURE:FORGOTTEN_BEAST_231:MUSCLE + CREATURE:FORGOTTEN_BEAST_231:EYE +"CREATURE:FORGOTTEN_BEAST_231:BRAIN +!CREATURE:FORGOTTEN_BEAST_231:LUNG +"CREATURE:FORGOTTEN_BEAST_231:HEART +"CREATURE:FORGOTTEN_BEAST_231:LIVER + CREATURE:FORGOTTEN_BEAST_231:GUT +$CREATURE:FORGOTTEN_BEAST_231:STOMACH +$CREATURE:FORGOTTEN_BEAST_231:GIZZARD +%CREATURE:FORGOTTEN_BEAST_231:PANCREAS +#CREATURE:FORGOTTEN_BEAST_231:SPLEEN +#CREATURE:FORGOTTEN_BEAST_231:KIDNEY +#CREATURE:FORGOTTEN_BEAST_232:MUSCLE + CREATURE:FORGOTTEN_BEAST_232:EYE +"CREATURE:FORGOTTEN_BEAST_232:BRAIN +!CREATURE:FORGOTTEN_BEAST_232:LUNG +"CREATURE:FORGOTTEN_BEAST_232:HEART +"CREATURE:FORGOTTEN_BEAST_232:LIVER + CREATURE:FORGOTTEN_BEAST_232:GUT +$CREATURE:FORGOTTEN_BEAST_232:STOMACH +$CREATURE:FORGOTTEN_BEAST_232:GIZZARD +%CREATURE:FORGOTTEN_BEAST_232:PANCREAS +#CREATURE:FORGOTTEN_BEAST_232:SPLEEN +#CREATURE:FORGOTTEN_BEAST_232:KIDNEY +#CREATURE:FORGOTTEN_BEAST_235:MUSCLE + CREATURE:FORGOTTEN_BEAST_235:EYE +"CREATURE:FORGOTTEN_BEAST_235:BRAIN +!CREATURE:FORGOTTEN_BEAST_235:LUNG +"CREATURE:FORGOTTEN_BEAST_235:HEART +"CREATURE:FORGOTTEN_BEAST_235:LIVER + CREATURE:FORGOTTEN_BEAST_235:GUT +$CREATURE:FORGOTTEN_BEAST_235:STOMACH +$CREATURE:FORGOTTEN_BEAST_235:GIZZARD +%CREATURE:FORGOTTEN_BEAST_235:PANCREAS +#CREATURE:FORGOTTEN_BEAST_235:SPLEEN +#CREATURE:FORGOTTEN_BEAST_235:KIDNEY +#CREATURE:FORGOTTEN_BEAST_236:MUSCLE + CREATURE:FORGOTTEN_BEAST_236:EYE +"CREATURE:FORGOTTEN_BEAST_236:BRAIN +!CREATURE:FORGOTTEN_BEAST_236:LUNG +"CREATURE:FORGOTTEN_BEAST_236:HEART +"CREATURE:FORGOTTEN_BEAST_236:LIVER + CREATURE:FORGOTTEN_BEAST_236:GUT +$CREATURE:FORGOTTEN_BEAST_236:STOMACH +$CREATURE:FORGOTTEN_BEAST_236:GIZZARD +%CREATURE:FORGOTTEN_BEAST_236:PANCREAS +#CREATURE:FORGOTTEN_BEAST_236:SPLEEN +#CREATURE:FORGOTTEN_BEAST_236:KIDNEY +#CREATURE:FORGOTTEN_BEAST_237:MUSCLE + CREATURE:FORGOTTEN_BEAST_237:EYE +"CREATURE:FORGOTTEN_BEAST_237:BRAIN +!CREATURE:FORGOTTEN_BEAST_237:LUNG +"CREATURE:FORGOTTEN_BEAST_237:HEART +"CREATURE:FORGOTTEN_BEAST_237:LIVER + CREATURE:FORGOTTEN_BEAST_237:GUT +$CREATURE:FORGOTTEN_BEAST_237:STOMACH +$CREATURE:FORGOTTEN_BEAST_237:GIZZARD +%CREATURE:FORGOTTEN_BEAST_237:PANCREAS +#CREATURE:FORGOTTEN_BEAST_237:SPLEEN +#CREATURE:FORGOTTEN_BEAST_237:KIDNEY +#CREATURE:FORGOTTEN_BEAST_239:MUSCLE + CREATURE:FORGOTTEN_BEAST_239:EYE +"CREATURE:FORGOTTEN_BEAST_239:BRAIN +!CREATURE:FORGOTTEN_BEAST_239:LUNG +"CREATURE:FORGOTTEN_BEAST_239:HEART +"CREATURE:FORGOTTEN_BEAST_239:LIVER + CREATURE:FORGOTTEN_BEAST_239:GUT +$CREATURE:FORGOTTEN_BEAST_239:STOMACH +$CREATURE:FORGOTTEN_BEAST_239:GIZZARD +%CREATURE:FORGOTTEN_BEAST_239:PANCREAS +#CREATURE:FORGOTTEN_BEAST_239:SPLEEN +#CREATURE:FORGOTTEN_BEAST_239:KIDNEY +#CREATURE:FORGOTTEN_BEAST_240:MUSCLE + CREATURE:FORGOTTEN_BEAST_240:EYE +"CREATURE:FORGOTTEN_BEAST_240:BRAIN +!CREATURE:FORGOTTEN_BEAST_240:LUNG +"CREATURE:FORGOTTEN_BEAST_240:HEART +"CREATURE:FORGOTTEN_BEAST_240:LIVER + CREATURE:FORGOTTEN_BEAST_240:GUT +$CREATURE:FORGOTTEN_BEAST_240:STOMACH +$CREATURE:FORGOTTEN_BEAST_240:GIZZARD +%CREATURE:FORGOTTEN_BEAST_240:PANCREAS +#CREATURE:FORGOTTEN_BEAST_240:SPLEEN +#CREATURE:FORGOTTEN_BEAST_240:KIDNEY +#CREATURE:FORGOTTEN_BEAST_242:MUSCLE + CREATURE:FORGOTTEN_BEAST_242:EYE +"CREATURE:FORGOTTEN_BEAST_242:BRAIN +!CREATURE:FORGOTTEN_BEAST_242:LUNG +"CREATURE:FORGOTTEN_BEAST_242:HEART +"CREATURE:FORGOTTEN_BEAST_242:LIVER + CREATURE:FORGOTTEN_BEAST_242:GUT +$CREATURE:FORGOTTEN_BEAST_242:STOMACH +$CREATURE:FORGOTTEN_BEAST_242:GIZZARD +%CREATURE:FORGOTTEN_BEAST_242:PANCREAS +#CREATURE:FORGOTTEN_BEAST_242:SPLEEN +#CREATURE:FORGOTTEN_BEAST_242:KIDNEY +#CREATURE:FORGOTTEN_BEAST_243:MUSCLE + CREATURE:FORGOTTEN_BEAST_243:EYE +"CREATURE:FORGOTTEN_BEAST_243:BRAIN +!CREATURE:FORGOTTEN_BEAST_243:LUNG +"CREATURE:FORGOTTEN_BEAST_243:HEART +"CREATURE:FORGOTTEN_BEAST_243:LIVER + CREATURE:FORGOTTEN_BEAST_243:GUT +$CREATURE:FORGOTTEN_BEAST_243:STOMACH +$CREATURE:FORGOTTEN_BEAST_243:GIZZARD +%CREATURE:FORGOTTEN_BEAST_243:PANCREAS +#CREATURE:FORGOTTEN_BEAST_243:SPLEEN +#CREATURE:FORGOTTEN_BEAST_243:KIDNEY +#CREATURE:FORGOTTEN_BEAST_244:MUSCLE + CREATURE:FORGOTTEN_BEAST_244:EYE +"CREATURE:FORGOTTEN_BEAST_244:BRAIN +!CREATURE:FORGOTTEN_BEAST_244:LUNG +"CREATURE:FORGOTTEN_BEAST_244:HEART +"CREATURE:FORGOTTEN_BEAST_244:LIVER + CREATURE:FORGOTTEN_BEAST_244:GUT +$CREATURE:FORGOTTEN_BEAST_244:STOMACH +$CREATURE:FORGOTTEN_BEAST_244:GIZZARD +%CREATURE:FORGOTTEN_BEAST_244:PANCREAS +#CREATURE:FORGOTTEN_BEAST_244:SPLEEN +#CREATURE:FORGOTTEN_BEAST_244:KIDNEY +#CREATURE:FORGOTTEN_BEAST_245:MUSCLE + CREATURE:FORGOTTEN_BEAST_245:EYE +"CREATURE:FORGOTTEN_BEAST_245:BRAIN +!CREATURE:FORGOTTEN_BEAST_245:LUNG +"CREATURE:FORGOTTEN_BEAST_245:HEART +"CREATURE:FORGOTTEN_BEAST_245:LIVER + CREATURE:FORGOTTEN_BEAST_245:GUT +$CREATURE:FORGOTTEN_BEAST_245:STOMACH +$CREATURE:FORGOTTEN_BEAST_245:GIZZARD +%CREATURE:FORGOTTEN_BEAST_245:PANCREAS +#CREATURE:FORGOTTEN_BEAST_245:SPLEEN +#CREATURE:FORGOTTEN_BEAST_245:KIDNEY +#CREATURE:FORGOTTEN_BEAST_246:MUSCLE + CREATURE:FORGOTTEN_BEAST_246:EYE +"CREATURE:FORGOTTEN_BEAST_246:BRAIN +!CREATURE:FORGOTTEN_BEAST_246:LUNG +"CREATURE:FORGOTTEN_BEAST_246:HEART +"CREATURE:FORGOTTEN_BEAST_246:LIVER + CREATURE:FORGOTTEN_BEAST_246:GUT +$CREATURE:FORGOTTEN_BEAST_246:STOMACH +$CREATURE:FORGOTTEN_BEAST_246:GIZZARD +%CREATURE:FORGOTTEN_BEAST_246:PANCREAS +#CREATURE:FORGOTTEN_BEAST_246:SPLEEN +#CREATURE:FORGOTTEN_BEAST_246:KIDNEY +#CREATURE:FORGOTTEN_BEAST_247:MUSCLE + CREATURE:FORGOTTEN_BEAST_247:EYE +"CREATURE:FORGOTTEN_BEAST_247:BRAIN +!CREATURE:FORGOTTEN_BEAST_247:LUNG +"CREATURE:FORGOTTEN_BEAST_247:HEART +"CREATURE:FORGOTTEN_BEAST_247:LIVER + CREATURE:FORGOTTEN_BEAST_247:GUT +$CREATURE:FORGOTTEN_BEAST_247:STOMACH +$CREATURE:FORGOTTEN_BEAST_247:GIZZARD +%CREATURE:FORGOTTEN_BEAST_247:PANCREAS +#CREATURE:FORGOTTEN_BEAST_247:SPLEEN +#CREATURE:FORGOTTEN_BEAST_247:KIDNEY +#CREATURE:FORGOTTEN_BEAST_248:MUSCLE + CREATURE:FORGOTTEN_BEAST_248:EYE +"CREATURE:FORGOTTEN_BEAST_248:BRAIN +!CREATURE:FORGOTTEN_BEAST_248:LUNG +"CREATURE:FORGOTTEN_BEAST_248:HEART +"CREATURE:FORGOTTEN_BEAST_248:LIVER + CREATURE:FORGOTTEN_BEAST_248:GUT +$CREATURE:FORGOTTEN_BEAST_248:STOMACH +$CREATURE:FORGOTTEN_BEAST_248:GIZZARD +%CREATURE:FORGOTTEN_BEAST_248:PANCREAS +#CREATURE:FORGOTTEN_BEAST_248:SPLEEN +#CREATURE:FORGOTTEN_BEAST_248:KIDNEY +#CREATURE:FORGOTTEN_BEAST_249:MUSCLE + CREATURE:FORGOTTEN_BEAST_249:EYE +"CREATURE:FORGOTTEN_BEAST_249:BRAIN +!CREATURE:FORGOTTEN_BEAST_249:LUNG +"CREATURE:FORGOTTEN_BEAST_249:HEART +"CREATURE:FORGOTTEN_BEAST_249:LIVER + CREATURE:FORGOTTEN_BEAST_249:GUT +$CREATURE:FORGOTTEN_BEAST_249:STOMACH +$CREATURE:FORGOTTEN_BEAST_249:GIZZARD +%CREATURE:FORGOTTEN_BEAST_249:PANCREAS +#CREATURE:FORGOTTEN_BEAST_249:SPLEEN +#CREATURE:FORGOTTEN_BEAST_249:KIDNEY +#CREATURE:FORGOTTEN_BEAST_253:MUSCLE + CREATURE:FORGOTTEN_BEAST_253:EYE +"CREATURE:FORGOTTEN_BEAST_253:BRAIN +!CREATURE:FORGOTTEN_BEAST_253:LUNG +"CREATURE:FORGOTTEN_BEAST_253:HEART +"CREATURE:FORGOTTEN_BEAST_253:LIVER + CREATURE:FORGOTTEN_BEAST_253:GUT +$CREATURE:FORGOTTEN_BEAST_253:STOMACH +$CREATURE:FORGOTTEN_BEAST_253:GIZZARD +%CREATURE:FORGOTTEN_BEAST_253:PANCREAS +#CREATURE:FORGOTTEN_BEAST_253:SPLEEN +#CREATURE:FORGOTTEN_BEAST_253:KIDNEY +#CREATURE:FORGOTTEN_BEAST_255:MUSCLE + CREATURE:FORGOTTEN_BEAST_255:EYE +"CREATURE:FORGOTTEN_BEAST_255:BRAIN +!CREATURE:FORGOTTEN_BEAST_255:LUNG +"CREATURE:FORGOTTEN_BEAST_255:HEART +"CREATURE:FORGOTTEN_BEAST_255:LIVER + CREATURE:FORGOTTEN_BEAST_255:GUT +$CREATURE:FORGOTTEN_BEAST_255:STOMACH +$CREATURE:FORGOTTEN_BEAST_255:GIZZARD +%CREATURE:FORGOTTEN_BEAST_255:PANCREAS +#CREATURE:FORGOTTEN_BEAST_255:SPLEEN +#CREATURE:FORGOTTEN_BEAST_255:KIDNEY +#CREATURE:FORGOTTEN_BEAST_256:MUSCLE + CREATURE:FORGOTTEN_BEAST_256:EYE +"CREATURE:FORGOTTEN_BEAST_256:BRAIN +!CREATURE:FORGOTTEN_BEAST_256:LUNG +"CREATURE:FORGOTTEN_BEAST_256:HEART +"CREATURE:FORGOTTEN_BEAST_256:LIVER + CREATURE:FORGOTTEN_BEAST_256:GUT +$CREATURE:FORGOTTEN_BEAST_256:STOMACH +$CREATURE:FORGOTTEN_BEAST_256:GIZZARD +%CREATURE:FORGOTTEN_BEAST_256:PANCREAS +#CREATURE:FORGOTTEN_BEAST_256:SPLEEN +#CREATURE:FORGOTTEN_BEAST_256:KIDNEY +#CREATURE:FORGOTTEN_BEAST_259:MUSCLE + CREATURE:FORGOTTEN_BEAST_259:EYE +"CREATURE:FORGOTTEN_BEAST_259:BRAIN +!CREATURE:FORGOTTEN_BEAST_259:LUNG +"CREATURE:FORGOTTEN_BEAST_259:HEART +"CREATURE:FORGOTTEN_BEAST_259:LIVER + CREATURE:FORGOTTEN_BEAST_259:GUT +$CREATURE:FORGOTTEN_BEAST_259:STOMACH +$CREATURE:FORGOTTEN_BEAST_259:GIZZARD +%CREATURE:FORGOTTEN_BEAST_259:PANCREAS +#CREATURE:FORGOTTEN_BEAST_259:SPLEEN +#CREATURE:FORGOTTEN_BEAST_259:KIDNEY +#CREATURE:FORGOTTEN_BEAST_260:MUSCLE + CREATURE:FORGOTTEN_BEAST_260:EYE +"CREATURE:FORGOTTEN_BEAST_260:BRAIN +!CREATURE:FORGOTTEN_BEAST_260:LUNG +"CREATURE:FORGOTTEN_BEAST_260:HEART +"CREATURE:FORGOTTEN_BEAST_260:LIVER + CREATURE:FORGOTTEN_BEAST_260:GUT +$CREATURE:FORGOTTEN_BEAST_260:STOMACH +$CREATURE:FORGOTTEN_BEAST_260:GIZZARD +%CREATURE:FORGOTTEN_BEAST_260:PANCREAS +#CREATURE:FORGOTTEN_BEAST_260:SPLEEN +#CREATURE:FORGOTTEN_BEAST_260:KIDNEY +#CREATURE:FORGOTTEN_BEAST_263:MUSCLE + CREATURE:FORGOTTEN_BEAST_263:EYE +"CREATURE:FORGOTTEN_BEAST_263:BRAIN +!CREATURE:FORGOTTEN_BEAST_263:LUNG +"CREATURE:FORGOTTEN_BEAST_263:HEART +"CREATURE:FORGOTTEN_BEAST_263:LIVER + CREATURE:FORGOTTEN_BEAST_263:GUT +$CREATURE:FORGOTTEN_BEAST_263:STOMACH +$CREATURE:FORGOTTEN_BEAST_263:GIZZARD +%CREATURE:FORGOTTEN_BEAST_263:PANCREAS +#CREATURE:FORGOTTEN_BEAST_263:SPLEEN +#CREATURE:FORGOTTEN_BEAST_263:KIDNEY +#CREATURE:FORGOTTEN_BEAST_264:MUSCLE + CREATURE:FORGOTTEN_BEAST_264:EYE +"CREATURE:FORGOTTEN_BEAST_264:BRAIN +!CREATURE:FORGOTTEN_BEAST_264:LUNG +"CREATURE:FORGOTTEN_BEAST_264:HEART +"CREATURE:FORGOTTEN_BEAST_264:LIVER + CREATURE:FORGOTTEN_BEAST_264:GUT +$CREATURE:FORGOTTEN_BEAST_264:STOMACH +$CREATURE:FORGOTTEN_BEAST_264:GIZZARD +%CREATURE:FORGOTTEN_BEAST_264:PANCREAS +#CREATURE:FORGOTTEN_BEAST_264:SPLEEN +#CREATURE:FORGOTTEN_BEAST_264:KIDNEY +#CREATURE:FORGOTTEN_BEAST_265:MUSCLE + CREATURE:FORGOTTEN_BEAST_265:EYE +"CREATURE:FORGOTTEN_BEAST_265:BRAIN +!CREATURE:FORGOTTEN_BEAST_265:LUNG +"CREATURE:FORGOTTEN_BEAST_265:HEART +"CREATURE:FORGOTTEN_BEAST_265:LIVER + CREATURE:FORGOTTEN_BEAST_265:GUT +$CREATURE:FORGOTTEN_BEAST_265:STOMACH +$CREATURE:FORGOTTEN_BEAST_265:GIZZARD +%CREATURE:FORGOTTEN_BEAST_265:PANCREAS +#CREATURE:FORGOTTEN_BEAST_265:SPLEEN +#CREATURE:FORGOTTEN_BEAST_265:KIDNEY +#CREATURE:FORGOTTEN_BEAST_266:MUSCLE + CREATURE:FORGOTTEN_BEAST_266:EYE +"CREATURE:FORGOTTEN_BEAST_266:BRAIN +!CREATURE:FORGOTTEN_BEAST_266:LUNG +"CREATURE:FORGOTTEN_BEAST_266:HEART +"CREATURE:FORGOTTEN_BEAST_266:LIVER + CREATURE:FORGOTTEN_BEAST_266:GUT +$CREATURE:FORGOTTEN_BEAST_266:STOMACH +$CREATURE:FORGOTTEN_BEAST_266:GIZZARD +%CREATURE:FORGOTTEN_BEAST_266:PANCREAS +#CREATURE:FORGOTTEN_BEAST_266:SPLEEN +#CREATURE:FORGOTTEN_BEAST_266:KIDNEY +#CREATURE:FORGOTTEN_BEAST_268:MUSCLE + CREATURE:FORGOTTEN_BEAST_268:EYE +"CREATURE:FORGOTTEN_BEAST_268:BRAIN +!CREATURE:FORGOTTEN_BEAST_268:LUNG +"CREATURE:FORGOTTEN_BEAST_268:HEART +"CREATURE:FORGOTTEN_BEAST_268:LIVER + CREATURE:FORGOTTEN_BEAST_268:GUT +$CREATURE:FORGOTTEN_BEAST_268:STOMACH +$CREATURE:FORGOTTEN_BEAST_268:GIZZARD +%CREATURE:FORGOTTEN_BEAST_268:PANCREAS +#CREATURE:FORGOTTEN_BEAST_268:SPLEEN +#CREATURE:FORGOTTEN_BEAST_268:KIDNEY +#CREATURE:FORGOTTEN_BEAST_269:MUSCLE + CREATURE:FORGOTTEN_BEAST_269:EYE +"CREATURE:FORGOTTEN_BEAST_269:BRAIN +!CREATURE:FORGOTTEN_BEAST_269:LUNG +"CREATURE:FORGOTTEN_BEAST_269:HEART +"CREATURE:FORGOTTEN_BEAST_269:LIVER + CREATURE:FORGOTTEN_BEAST_269:GUT +$CREATURE:FORGOTTEN_BEAST_269:STOMACH +$CREATURE:FORGOTTEN_BEAST_269:GIZZARD +%CREATURE:FORGOTTEN_BEAST_269:PANCREAS +#CREATURE:FORGOTTEN_BEAST_269:SPLEEN +#CREATURE:FORGOTTEN_BEAST_269:KIDNEY +#CREATURE:FORGOTTEN_BEAST_270:MUSCLE + CREATURE:FORGOTTEN_BEAST_270:EYE +"CREATURE:FORGOTTEN_BEAST_270:BRAIN +!CREATURE:FORGOTTEN_BEAST_270:LUNG +"CREATURE:FORGOTTEN_BEAST_270:HEART +"CREATURE:FORGOTTEN_BEAST_270:LIVER + CREATURE:FORGOTTEN_BEAST_270:GUT +$CREATURE:FORGOTTEN_BEAST_270:STOMACH +$CREATURE:FORGOTTEN_BEAST_270:GIZZARD +%CREATURE:FORGOTTEN_BEAST_270:PANCREAS +#CREATURE:FORGOTTEN_BEAST_270:SPLEEN +#CREATURE:FORGOTTEN_BEAST_270:KIDNEY +#CREATURE:FORGOTTEN_BEAST_271:MUSCLE + CREATURE:FORGOTTEN_BEAST_271:EYE +"CREATURE:FORGOTTEN_BEAST_271:BRAIN +!CREATURE:FORGOTTEN_BEAST_271:LUNG +"CREATURE:FORGOTTEN_BEAST_271:HEART +"CREATURE:FORGOTTEN_BEAST_271:LIVER + CREATURE:FORGOTTEN_BEAST_271:GUT +$CREATURE:FORGOTTEN_BEAST_271:STOMACH +$CREATURE:FORGOTTEN_BEAST_271:GIZZARD +%CREATURE:FORGOTTEN_BEAST_271:PANCREAS +#CREATURE:FORGOTTEN_BEAST_271:SPLEEN +#CREATURE:FORGOTTEN_BEAST_271:KIDNEY +#CREATURE:FORGOTTEN_BEAST_272:MUSCLE + CREATURE:FORGOTTEN_BEAST_272:EYE +"CREATURE:FORGOTTEN_BEAST_272:BRAIN +!CREATURE:FORGOTTEN_BEAST_272:LUNG +"CREATURE:FORGOTTEN_BEAST_272:HEART +"CREATURE:FORGOTTEN_BEAST_272:LIVER + CREATURE:FORGOTTEN_BEAST_272:GUT +$CREATURE:FORGOTTEN_BEAST_272:STOMACH +$CREATURE:FORGOTTEN_BEAST_272:GIZZARD +%CREATURE:FORGOTTEN_BEAST_272:PANCREAS +#CREATURE:FORGOTTEN_BEAST_272:SPLEEN +#CREATURE:FORGOTTEN_BEAST_272:KIDNEY +#CREATURE:FORGOTTEN_BEAST_273:MUSCLE + CREATURE:FORGOTTEN_BEAST_273:EYE +"CREATURE:FORGOTTEN_BEAST_273:BRAIN +!CREATURE:FORGOTTEN_BEAST_273:LUNG +"CREATURE:FORGOTTEN_BEAST_273:HEART +"CREATURE:FORGOTTEN_BEAST_273:LIVER + CREATURE:FORGOTTEN_BEAST_273:GUT +$CREATURE:FORGOTTEN_BEAST_273:STOMACH +$CREATURE:FORGOTTEN_BEAST_273:GIZZARD +%CREATURE:FORGOTTEN_BEAST_273:PANCREAS +#CREATURE:FORGOTTEN_BEAST_273:SPLEEN +#CREATURE:FORGOTTEN_BEAST_273:KIDNEY +#CREATURE:FORGOTTEN_BEAST_274:MUSCLE + CREATURE:FORGOTTEN_BEAST_274:EYE +"CREATURE:FORGOTTEN_BEAST_274:BRAIN +!CREATURE:FORGOTTEN_BEAST_274:LUNG +"CREATURE:FORGOTTEN_BEAST_274:HEART +"CREATURE:FORGOTTEN_BEAST_274:LIVER + CREATURE:FORGOTTEN_BEAST_274:GUT +$CREATURE:FORGOTTEN_BEAST_274:STOMACH +$CREATURE:FORGOTTEN_BEAST_274:GIZZARD +%CREATURE:FORGOTTEN_BEAST_274:PANCREAS +#CREATURE:FORGOTTEN_BEAST_274:SPLEEN +#CREATURE:FORGOTTEN_BEAST_274:KIDNEY +#CREATURE:FORGOTTEN_BEAST_275:MUSCLE + CREATURE:FORGOTTEN_BEAST_275:EYE +"CREATURE:FORGOTTEN_BEAST_275:BRAIN +!CREATURE:FORGOTTEN_BEAST_275:LUNG +"CREATURE:FORGOTTEN_BEAST_275:HEART +"CREATURE:FORGOTTEN_BEAST_275:LIVER + CREATURE:FORGOTTEN_BEAST_275:GUT +$CREATURE:FORGOTTEN_BEAST_275:STOMACH +$CREATURE:FORGOTTEN_BEAST_275:GIZZARD +%CREATURE:FORGOTTEN_BEAST_275:PANCREAS +#CREATURE:FORGOTTEN_BEAST_275:SPLEEN +#CREATURE:FORGOTTEN_BEAST_275:KIDNEY +#CREATURE:FORGOTTEN_BEAST_276:MUSCLE + CREATURE:FORGOTTEN_BEAST_276:EYE +"CREATURE:FORGOTTEN_BEAST_276:BRAIN +!CREATURE:FORGOTTEN_BEAST_276:LUNG +"CREATURE:FORGOTTEN_BEAST_276:HEART +"CREATURE:FORGOTTEN_BEAST_276:LIVER + CREATURE:FORGOTTEN_BEAST_276:GUT +$CREATURE:FORGOTTEN_BEAST_276:STOMACH +$CREATURE:FORGOTTEN_BEAST_276:GIZZARD +%CREATURE:FORGOTTEN_BEAST_276:PANCREAS +#CREATURE:FORGOTTEN_BEAST_276:SPLEEN +#CREATURE:FORGOTTEN_BEAST_276:KIDNEY +#CREATURE:FORGOTTEN_BEAST_277:MUSCLE + CREATURE:FORGOTTEN_BEAST_277:EYE +"CREATURE:FORGOTTEN_BEAST_277:BRAIN +!CREATURE:FORGOTTEN_BEAST_277:LUNG +"CREATURE:FORGOTTEN_BEAST_277:HEART +"CREATURE:FORGOTTEN_BEAST_277:LIVER + CREATURE:FORGOTTEN_BEAST_277:GUT +$CREATURE:FORGOTTEN_BEAST_277:STOMACH +$CREATURE:FORGOTTEN_BEAST_277:GIZZARD +%CREATURE:FORGOTTEN_BEAST_277:PANCREAS +#CREATURE:FORGOTTEN_BEAST_277:SPLEEN +#CREATURE:FORGOTTEN_BEAST_277:KIDNEY +#CREATURE:FORGOTTEN_BEAST_279:MUSCLE + CREATURE:FORGOTTEN_BEAST_279:EYE +"CREATURE:FORGOTTEN_BEAST_279:BRAIN +!CREATURE:FORGOTTEN_BEAST_279:LUNG +"CREATURE:FORGOTTEN_BEAST_279:HEART +"CREATURE:FORGOTTEN_BEAST_279:LIVER + CREATURE:FORGOTTEN_BEAST_279:GUT +$CREATURE:FORGOTTEN_BEAST_279:STOMACH +$CREATURE:FORGOTTEN_BEAST_279:GIZZARD +%CREATURE:FORGOTTEN_BEAST_279:PANCREAS +#CREATURE:FORGOTTEN_BEAST_279:SPLEEN +#CREATURE:FORGOTTEN_BEAST_279:KIDNEY +#CREATURE:FORGOTTEN_BEAST_280:MUSCLE + CREATURE:FORGOTTEN_BEAST_280:EYE +"CREATURE:FORGOTTEN_BEAST_280:BRAIN +!CREATURE:FORGOTTEN_BEAST_280:LUNG +"CREATURE:FORGOTTEN_BEAST_280:HEART +"CREATURE:FORGOTTEN_BEAST_280:LIVER + CREATURE:FORGOTTEN_BEAST_280:GUT +$CREATURE:FORGOTTEN_BEAST_280:STOMACH +$CREATURE:FORGOTTEN_BEAST_280:GIZZARD +%CREATURE:FORGOTTEN_BEAST_280:PANCREAS +#CREATURE:FORGOTTEN_BEAST_280:SPLEEN +#CREATURE:FORGOTTEN_BEAST_280:KIDNEY +#CREATURE:FORGOTTEN_BEAST_281:MUSCLE + CREATURE:FORGOTTEN_BEAST_281:EYE +"CREATURE:FORGOTTEN_BEAST_281:BRAIN +!CREATURE:FORGOTTEN_BEAST_281:LUNG +"CREATURE:FORGOTTEN_BEAST_281:HEART +"CREATURE:FORGOTTEN_BEAST_281:LIVER + CREATURE:FORGOTTEN_BEAST_281:GUT +$CREATURE:FORGOTTEN_BEAST_281:STOMACH +$CREATURE:FORGOTTEN_BEAST_281:GIZZARD +%CREATURE:FORGOTTEN_BEAST_281:PANCREAS +#CREATURE:FORGOTTEN_BEAST_281:SPLEEN +#CREATURE:FORGOTTEN_BEAST_281:KIDNEY +#CREATURE:FORGOTTEN_BEAST_282:MUSCLE + CREATURE:FORGOTTEN_BEAST_282:EYE +"CREATURE:FORGOTTEN_BEAST_282:BRAIN +!CREATURE:FORGOTTEN_BEAST_282:LUNG +"CREATURE:FORGOTTEN_BEAST_282:HEART +"CREATURE:FORGOTTEN_BEAST_282:LIVER + CREATURE:FORGOTTEN_BEAST_282:GUT +$CREATURE:FORGOTTEN_BEAST_282:STOMACH +$CREATURE:FORGOTTEN_BEAST_282:GIZZARD +%CREATURE:FORGOTTEN_BEAST_282:PANCREAS +#CREATURE:FORGOTTEN_BEAST_282:SPLEEN +#CREATURE:FORGOTTEN_BEAST_282:KIDNEY +#CREATURE:FORGOTTEN_BEAST_283:MUSCLE + CREATURE:FORGOTTEN_BEAST_283:EYE +"CREATURE:FORGOTTEN_BEAST_283:BRAIN +!CREATURE:FORGOTTEN_BEAST_283:LUNG +"CREATURE:FORGOTTEN_BEAST_283:HEART +"CREATURE:FORGOTTEN_BEAST_283:LIVER + CREATURE:FORGOTTEN_BEAST_283:GUT +$CREATURE:FORGOTTEN_BEAST_283:STOMACH +$CREATURE:FORGOTTEN_BEAST_283:GIZZARD +%CREATURE:FORGOTTEN_BEAST_283:PANCREAS +#CREATURE:FORGOTTEN_BEAST_283:SPLEEN +#CREATURE:FORGOTTEN_BEAST_283:KIDNEY +#CREATURE:FORGOTTEN_BEAST_285:MUSCLE + CREATURE:FORGOTTEN_BEAST_285:EYE +"CREATURE:FORGOTTEN_BEAST_285:BRAIN +!CREATURE:FORGOTTEN_BEAST_285:LUNG +"CREATURE:FORGOTTEN_BEAST_285:HEART +"CREATURE:FORGOTTEN_BEAST_285:LIVER + CREATURE:FORGOTTEN_BEAST_285:GUT +$CREATURE:FORGOTTEN_BEAST_285:STOMACH +$CREATURE:FORGOTTEN_BEAST_285:GIZZARD +%CREATURE:FORGOTTEN_BEAST_285:PANCREAS +#CREATURE:FORGOTTEN_BEAST_285:SPLEEN +#CREATURE:FORGOTTEN_BEAST_285:KIDNEY +#CREATURE:FORGOTTEN_BEAST_286:MUSCLE + CREATURE:FORGOTTEN_BEAST_286:EYE +"CREATURE:FORGOTTEN_BEAST_286:BRAIN +!CREATURE:FORGOTTEN_BEAST_286:LUNG +"CREATURE:FORGOTTEN_BEAST_286:HEART +"CREATURE:FORGOTTEN_BEAST_286:LIVER + CREATURE:FORGOTTEN_BEAST_286:GUT +$CREATURE:FORGOTTEN_BEAST_286:STOMACH +$CREATURE:FORGOTTEN_BEAST_286:GIZZARD +%CREATURE:FORGOTTEN_BEAST_286:PANCREAS +#CREATURE:FORGOTTEN_BEAST_286:SPLEEN +#CREATURE:FORGOTTEN_BEAST_286:KIDNEY +#CREATURE:FORGOTTEN_BEAST_287:MUSCLE + CREATURE:FORGOTTEN_BEAST_287:EYE +"CREATURE:FORGOTTEN_BEAST_287:BRAIN +!CREATURE:FORGOTTEN_BEAST_287:LUNG +"CREATURE:FORGOTTEN_BEAST_287:HEART +"CREATURE:FORGOTTEN_BEAST_287:LIVER + CREATURE:FORGOTTEN_BEAST_287:GUT +$CREATURE:FORGOTTEN_BEAST_287:STOMACH +$CREATURE:FORGOTTEN_BEAST_287:GIZZARD +%CREATURE:FORGOTTEN_BEAST_287:PANCREAS +#CREATURE:FORGOTTEN_BEAST_287:SPLEEN +#CREATURE:FORGOTTEN_BEAST_287:KIDNEY +#CREATURE:FORGOTTEN_BEAST_288:MUSCLE + CREATURE:FORGOTTEN_BEAST_288:EYE +"CREATURE:FORGOTTEN_BEAST_288:BRAIN +!CREATURE:FORGOTTEN_BEAST_288:LUNG +"CREATURE:FORGOTTEN_BEAST_288:HEART +"CREATURE:FORGOTTEN_BEAST_288:LIVER + CREATURE:FORGOTTEN_BEAST_288:GUT +$CREATURE:FORGOTTEN_BEAST_288:STOMACH +$CREATURE:FORGOTTEN_BEAST_288:GIZZARD +%CREATURE:FORGOTTEN_BEAST_288:PANCREAS +#CREATURE:FORGOTTEN_BEAST_288:SPLEEN +#CREATURE:FORGOTTEN_BEAST_288:KIDNEY +#CREATURE:FORGOTTEN_BEAST_289:MUSCLE + CREATURE:FORGOTTEN_BEAST_289:EYE +"CREATURE:FORGOTTEN_BEAST_289:BRAIN +!CREATURE:FORGOTTEN_BEAST_289:LUNG +"CREATURE:FORGOTTEN_BEAST_289:HEART +"CREATURE:FORGOTTEN_BEAST_289:LIVER + CREATURE:FORGOTTEN_BEAST_289:GUT +$CREATURE:FORGOTTEN_BEAST_289:STOMACH +$CREATURE:FORGOTTEN_BEAST_289:GIZZARD +%CREATURE:FORGOTTEN_BEAST_289:PANCREAS +#CREATURE:FORGOTTEN_BEAST_289:SPLEEN +#CREATURE:FORGOTTEN_BEAST_289:KIDNEY +#CREATURE:FORGOTTEN_BEAST_290:MUSCLE + CREATURE:FORGOTTEN_BEAST_290:EYE +"CREATURE:FORGOTTEN_BEAST_290:BRAIN +!CREATURE:FORGOTTEN_BEAST_290:LUNG +"CREATURE:FORGOTTEN_BEAST_290:HEART +"CREATURE:FORGOTTEN_BEAST_290:LIVER + CREATURE:FORGOTTEN_BEAST_290:GUT +$CREATURE:FORGOTTEN_BEAST_290:STOMACH +$CREATURE:FORGOTTEN_BEAST_290:GIZZARD +%CREATURE:FORGOTTEN_BEAST_290:PANCREAS +#CREATURE:FORGOTTEN_BEAST_290:SPLEEN +#CREATURE:FORGOTTEN_BEAST_290:KIDNEY +#CREATURE:FORGOTTEN_BEAST_293:MUSCLE + CREATURE:FORGOTTEN_BEAST_293:EYE +"CREATURE:FORGOTTEN_BEAST_293:BRAIN +!CREATURE:FORGOTTEN_BEAST_293:LUNG +"CREATURE:FORGOTTEN_BEAST_293:HEART +"CREATURE:FORGOTTEN_BEAST_293:LIVER + CREATURE:FORGOTTEN_BEAST_293:GUT +$CREATURE:FORGOTTEN_BEAST_293:STOMACH +$CREATURE:FORGOTTEN_BEAST_293:GIZZARD +%CREATURE:FORGOTTEN_BEAST_293:PANCREAS +#CREATURE:FORGOTTEN_BEAST_293:SPLEEN +#CREATURE:FORGOTTEN_BEAST_293:KIDNEY +#CREATURE:FORGOTTEN_BEAST_295:MUSCLE + CREATURE:FORGOTTEN_BEAST_295:EYE +"CREATURE:FORGOTTEN_BEAST_295:BRAIN +!CREATURE:FORGOTTEN_BEAST_295:LUNG +"CREATURE:FORGOTTEN_BEAST_295:HEART +"CREATURE:FORGOTTEN_BEAST_295:LIVER + CREATURE:FORGOTTEN_BEAST_295:GUT +$CREATURE:FORGOTTEN_BEAST_295:STOMACH +$CREATURE:FORGOTTEN_BEAST_295:GIZZARD +%CREATURE:FORGOTTEN_BEAST_295:PANCREAS +#CREATURE:FORGOTTEN_BEAST_295:SPLEEN +#CREATURE:FORGOTTEN_BEAST_295:KIDNEY +#CREATURE:FORGOTTEN_BEAST_297:MUSCLE + CREATURE:FORGOTTEN_BEAST_297:EYE +"CREATURE:FORGOTTEN_BEAST_297:BRAIN +!CREATURE:FORGOTTEN_BEAST_297:LUNG +"CREATURE:FORGOTTEN_BEAST_297:HEART +"CREATURE:FORGOTTEN_BEAST_297:LIVER + CREATURE:FORGOTTEN_BEAST_297:GUT +$CREATURE:FORGOTTEN_BEAST_297:STOMACH +$CREATURE:FORGOTTEN_BEAST_297:GIZZARD +%CREATURE:FORGOTTEN_BEAST_297:PANCREAS +#CREATURE:FORGOTTEN_BEAST_297:SPLEEN +#CREATURE:FORGOTTEN_BEAST_297:KIDNEY +#CREATURE:FORGOTTEN_BEAST_300:MUSCLE + CREATURE:FORGOTTEN_BEAST_300:EYE +"CREATURE:FORGOTTEN_BEAST_300:BRAIN +!CREATURE:FORGOTTEN_BEAST_300:LUNG +"CREATURE:FORGOTTEN_BEAST_300:HEART +"CREATURE:FORGOTTEN_BEAST_300:LIVER + CREATURE:FORGOTTEN_BEAST_300:GUT +$CREATURE:FORGOTTEN_BEAST_300:STOMACH +$CREATURE:FORGOTTEN_BEAST_300:GIZZARD +%CREATURE:FORGOTTEN_BEAST_300:PANCREAS +#CREATURE:FORGOTTEN_BEAST_300:SPLEEN +#CREATURE:FORGOTTEN_BEAST_300:KIDNEY +#CREATURE:FORGOTTEN_BEAST_302:MUSCLE + CREATURE:FORGOTTEN_BEAST_302:EYE +"CREATURE:FORGOTTEN_BEAST_302:BRAIN +!CREATURE:FORGOTTEN_BEAST_302:LUNG +"CREATURE:FORGOTTEN_BEAST_302:HEART +"CREATURE:FORGOTTEN_BEAST_302:LIVER + CREATURE:FORGOTTEN_BEAST_302:GUT +$CREATURE:FORGOTTEN_BEAST_302:STOMACH +$CREATURE:FORGOTTEN_BEAST_302:GIZZARD +%CREATURE:FORGOTTEN_BEAST_302:PANCREAS +#CREATURE:FORGOTTEN_BEAST_302:SPLEEN +#CREATURE:FORGOTTEN_BEAST_302:KIDNEY +#CREATURE:FORGOTTEN_BEAST_306:MUSCLE + CREATURE:FORGOTTEN_BEAST_306:EYE +"CREATURE:FORGOTTEN_BEAST_306:BRAIN +!CREATURE:FORGOTTEN_BEAST_306:LUNG +"CREATURE:FORGOTTEN_BEAST_306:HEART +"CREATURE:FORGOTTEN_BEAST_306:LIVER + CREATURE:FORGOTTEN_BEAST_306:GUT +$CREATURE:FORGOTTEN_BEAST_306:STOMACH +$CREATURE:FORGOTTEN_BEAST_306:GIZZARD +%CREATURE:FORGOTTEN_BEAST_306:PANCREAS +#CREATURE:FORGOTTEN_BEAST_306:SPLEEN +#CREATURE:FORGOTTEN_BEAST_306:KIDNEY +#CREATURE:FORGOTTEN_BEAST_307:MUSCLE + CREATURE:FORGOTTEN_BEAST_307:EYE +"CREATURE:FORGOTTEN_BEAST_307:BRAIN +!CREATURE:FORGOTTEN_BEAST_307:LUNG +"CREATURE:FORGOTTEN_BEAST_307:HEART +"CREATURE:FORGOTTEN_BEAST_307:LIVER + CREATURE:FORGOTTEN_BEAST_307:GUT +$CREATURE:FORGOTTEN_BEAST_307:STOMACH +$CREATURE:FORGOTTEN_BEAST_307:GIZZARD +%CREATURE:FORGOTTEN_BEAST_307:PANCREAS +#CREATURE:FORGOTTEN_BEAST_307:SPLEEN +#CREATURE:FORGOTTEN_BEAST_307:KIDNEY +#CREATURE:FORGOTTEN_BEAST_310:MUSCLE + CREATURE:FORGOTTEN_BEAST_310:EYE +"CREATURE:FORGOTTEN_BEAST_310:BRAIN +!CREATURE:FORGOTTEN_BEAST_310:LUNG +"CREATURE:FORGOTTEN_BEAST_310:HEART +"CREATURE:FORGOTTEN_BEAST_310:LIVER + CREATURE:FORGOTTEN_BEAST_310:GUT +$CREATURE:FORGOTTEN_BEAST_310:STOMACH +$CREATURE:FORGOTTEN_BEAST_310:GIZZARD +%CREATURE:FORGOTTEN_BEAST_310:PANCREAS +#CREATURE:FORGOTTEN_BEAST_310:SPLEEN +#CREATURE:FORGOTTEN_BEAST_310:KIDNEY +#CREATURE:FORGOTTEN_BEAST_311:MUSCLE + CREATURE:FORGOTTEN_BEAST_311:EYE +"CREATURE:FORGOTTEN_BEAST_311:BRAIN +!CREATURE:FORGOTTEN_BEAST_311:LUNG +"CREATURE:FORGOTTEN_BEAST_311:HEART +"CREATURE:FORGOTTEN_BEAST_311:LIVER + CREATURE:FORGOTTEN_BEAST_311:GUT +$CREATURE:FORGOTTEN_BEAST_311:STOMACH +$CREATURE:FORGOTTEN_BEAST_311:GIZZARD +%CREATURE:FORGOTTEN_BEAST_311:PANCREAS +#CREATURE:FORGOTTEN_BEAST_311:SPLEEN +#CREATURE:FORGOTTEN_BEAST_311:KIDNEY +#CREATURE:FORGOTTEN_BEAST_312:MUSCLE + CREATURE:FORGOTTEN_BEAST_312:EYE +"CREATURE:FORGOTTEN_BEAST_312:BRAIN +!CREATURE:FORGOTTEN_BEAST_312:LUNG +"CREATURE:FORGOTTEN_BEAST_312:HEART +"CREATURE:FORGOTTEN_BEAST_312:LIVER + CREATURE:FORGOTTEN_BEAST_312:GUT +$CREATURE:FORGOTTEN_BEAST_312:STOMACH +$CREATURE:FORGOTTEN_BEAST_312:GIZZARD +%CREATURE:FORGOTTEN_BEAST_312:PANCREAS +#CREATURE:FORGOTTEN_BEAST_312:SPLEEN +#CREATURE:FORGOTTEN_BEAST_312:KIDNEY +#CREATURE:FORGOTTEN_BEAST_314:MUSCLE + CREATURE:FORGOTTEN_BEAST_314:EYE +"CREATURE:FORGOTTEN_BEAST_314:BRAIN +!CREATURE:FORGOTTEN_BEAST_314:LUNG +"CREATURE:FORGOTTEN_BEAST_314:HEART +"CREATURE:FORGOTTEN_BEAST_314:LIVER + CREATURE:FORGOTTEN_BEAST_314:GUT +$CREATURE:FORGOTTEN_BEAST_314:STOMACH +$CREATURE:FORGOTTEN_BEAST_314:GIZZARD +%CREATURE:FORGOTTEN_BEAST_314:PANCREAS +#CREATURE:FORGOTTEN_BEAST_314:SPLEEN +#CREATURE:FORGOTTEN_BEAST_314:KIDNEY +#CREATURE:FORGOTTEN_BEAST_316:MUSCLE + CREATURE:FORGOTTEN_BEAST_316:EYE +"CREATURE:FORGOTTEN_BEAST_316:BRAIN +!CREATURE:FORGOTTEN_BEAST_316:LUNG +"CREATURE:FORGOTTEN_BEAST_316:HEART +"CREATURE:FORGOTTEN_BEAST_316:LIVER + CREATURE:FORGOTTEN_BEAST_316:GUT +$CREATURE:FORGOTTEN_BEAST_316:STOMACH +$CREATURE:FORGOTTEN_BEAST_316:GIZZARD +%CREATURE:FORGOTTEN_BEAST_316:PANCREAS +#CREATURE:FORGOTTEN_BEAST_316:SPLEEN +#CREATURE:FORGOTTEN_BEAST_316:KIDNEY +#CREATURE:FORGOTTEN_BEAST_317:MUSCLE + CREATURE:FORGOTTEN_BEAST_317:EYE +"CREATURE:FORGOTTEN_BEAST_317:BRAIN +!CREATURE:FORGOTTEN_BEAST_317:LUNG +"CREATURE:FORGOTTEN_BEAST_317:HEART +"CREATURE:FORGOTTEN_BEAST_317:LIVER + CREATURE:FORGOTTEN_BEAST_317:GUT +$CREATURE:FORGOTTEN_BEAST_317:STOMACH +$CREATURE:FORGOTTEN_BEAST_317:GIZZARD +%CREATURE:FORGOTTEN_BEAST_317:PANCREAS +#CREATURE:FORGOTTEN_BEAST_317:SPLEEN +#CREATURE:FORGOTTEN_BEAST_317:KIDNEY +#CREATURE:FORGOTTEN_BEAST_318:MUSCLE + CREATURE:FORGOTTEN_BEAST_318:EYE +"CREATURE:FORGOTTEN_BEAST_318:BRAIN +!CREATURE:FORGOTTEN_BEAST_318:LUNG +"CREATURE:FORGOTTEN_BEAST_318:HEART +"CREATURE:FORGOTTEN_BEAST_318:LIVER + CREATURE:FORGOTTEN_BEAST_318:GUT +$CREATURE:FORGOTTEN_BEAST_318:STOMACH +$CREATURE:FORGOTTEN_BEAST_318:GIZZARD +%CREATURE:FORGOTTEN_BEAST_318:PANCREAS +#CREATURE:FORGOTTEN_BEAST_318:SPLEEN +#CREATURE:FORGOTTEN_BEAST_318:KIDNEY +#CREATURE:FORGOTTEN_BEAST_320:MUSCLE + CREATURE:FORGOTTEN_BEAST_320:EYE +"CREATURE:FORGOTTEN_BEAST_320:BRAIN +!CREATURE:FORGOTTEN_BEAST_320:LUNG +"CREATURE:FORGOTTEN_BEAST_320:HEART +"CREATURE:FORGOTTEN_BEAST_320:LIVER + CREATURE:FORGOTTEN_BEAST_320:GUT +$CREATURE:FORGOTTEN_BEAST_320:STOMACH +$CREATURE:FORGOTTEN_BEAST_320:GIZZARD +%CREATURE:FORGOTTEN_BEAST_320:PANCREAS +#CREATURE:FORGOTTEN_BEAST_320:SPLEEN +#CREATURE:FORGOTTEN_BEAST_320:KIDNEY +#CREATURE:FORGOTTEN_BEAST_321:MUSCLE + CREATURE:FORGOTTEN_BEAST_321:EYE +"CREATURE:FORGOTTEN_BEAST_321:BRAIN +!CREATURE:FORGOTTEN_BEAST_321:LUNG +"CREATURE:FORGOTTEN_BEAST_321:HEART +"CREATURE:FORGOTTEN_BEAST_321:LIVER + CREATURE:FORGOTTEN_BEAST_321:GUT +$CREATURE:FORGOTTEN_BEAST_321:STOMACH +$CREATURE:FORGOTTEN_BEAST_321:GIZZARD +%CREATURE:FORGOTTEN_BEAST_321:PANCREAS +#CREATURE:FORGOTTEN_BEAST_321:SPLEEN +#CREATURE:FORGOTTEN_BEAST_321:KIDNEY +#CREATURE:FORGOTTEN_BEAST_322:MUSCLE + CREATURE:FORGOTTEN_BEAST_322:EYE +"CREATURE:FORGOTTEN_BEAST_322:BRAIN +!CREATURE:FORGOTTEN_BEAST_322:LUNG +"CREATURE:FORGOTTEN_BEAST_322:HEART +"CREATURE:FORGOTTEN_BEAST_322:LIVER + CREATURE:FORGOTTEN_BEAST_322:GUT +$CREATURE:FORGOTTEN_BEAST_322:STOMACH +$CREATURE:FORGOTTEN_BEAST_322:GIZZARD +%CREATURE:FORGOTTEN_BEAST_322:PANCREAS +#CREATURE:FORGOTTEN_BEAST_322:SPLEEN +#CREATURE:FORGOTTEN_BEAST_322:KIDNEY +#CREATURE:FORGOTTEN_BEAST_323:MUSCLE + CREATURE:FORGOTTEN_BEAST_323:EYE +"CREATURE:FORGOTTEN_BEAST_323:BRAIN +!CREATURE:FORGOTTEN_BEAST_323:LUNG +"CREATURE:FORGOTTEN_BEAST_323:HEART +"CREATURE:FORGOTTEN_BEAST_323:LIVER + CREATURE:FORGOTTEN_BEAST_323:GUT +$CREATURE:FORGOTTEN_BEAST_323:STOMACH +$CREATURE:FORGOTTEN_BEAST_323:GIZZARD +%CREATURE:FORGOTTEN_BEAST_323:PANCREAS +#CREATURE:FORGOTTEN_BEAST_323:SPLEEN +#CREATURE:FORGOTTEN_BEAST_323:KIDNEY +#CREATURE:FORGOTTEN_BEAST_324:MUSCLE + CREATURE:FORGOTTEN_BEAST_324:EYE +"CREATURE:FORGOTTEN_BEAST_324:BRAIN +!CREATURE:FORGOTTEN_BEAST_324:LUNG +"CREATURE:FORGOTTEN_BEAST_324:HEART +"CREATURE:FORGOTTEN_BEAST_324:LIVER + CREATURE:FORGOTTEN_BEAST_324:GUT +$CREATURE:FORGOTTEN_BEAST_324:STOMACH +$CREATURE:FORGOTTEN_BEAST_324:GIZZARD +%CREATURE:FORGOTTEN_BEAST_324:PANCREAS +#CREATURE:FORGOTTEN_BEAST_324:SPLEEN +#CREATURE:FORGOTTEN_BEAST_324:KIDNEY +#CREATURE:FORGOTTEN_BEAST_325:MUSCLE + CREATURE:FORGOTTEN_BEAST_325:EYE +"CREATURE:FORGOTTEN_BEAST_325:BRAIN +!CREATURE:FORGOTTEN_BEAST_325:LUNG +"CREATURE:FORGOTTEN_BEAST_325:HEART +"CREATURE:FORGOTTEN_BEAST_325:LIVER + CREATURE:FORGOTTEN_BEAST_325:GUT +$CREATURE:FORGOTTEN_BEAST_325:STOMACH +$CREATURE:FORGOTTEN_BEAST_325:GIZZARD +%CREATURE:FORGOTTEN_BEAST_325:PANCREAS +#CREATURE:FORGOTTEN_BEAST_325:SPLEEN +#CREATURE:FORGOTTEN_BEAST_325:KIDNEY +#CREATURE:FORGOTTEN_BEAST_326:MUSCLE + CREATURE:FORGOTTEN_BEAST_326:EYE +"CREATURE:FORGOTTEN_BEAST_326:BRAIN +!CREATURE:FORGOTTEN_BEAST_326:LUNG +"CREATURE:FORGOTTEN_BEAST_326:HEART +"CREATURE:FORGOTTEN_BEAST_326:LIVER + CREATURE:FORGOTTEN_BEAST_326:GUT +$CREATURE:FORGOTTEN_BEAST_326:STOMACH +$CREATURE:FORGOTTEN_BEAST_326:GIZZARD +%CREATURE:FORGOTTEN_BEAST_326:PANCREAS +#CREATURE:FORGOTTEN_BEAST_326:SPLEEN +#CREATURE:FORGOTTEN_BEAST_326:KIDNEY +#CREATURE:FORGOTTEN_BEAST_327:MUSCLE + CREATURE:FORGOTTEN_BEAST_327:EYE +"CREATURE:FORGOTTEN_BEAST_327:BRAIN +!CREATURE:FORGOTTEN_BEAST_327:LUNG +"CREATURE:FORGOTTEN_BEAST_327:HEART +"CREATURE:FORGOTTEN_BEAST_327:LIVER + CREATURE:FORGOTTEN_BEAST_327:GUT +$CREATURE:FORGOTTEN_BEAST_327:STOMACH +$CREATURE:FORGOTTEN_BEAST_327:GIZZARD +%CREATURE:FORGOTTEN_BEAST_327:PANCREAS +#CREATURE:FORGOTTEN_BEAST_327:SPLEEN +#CREATURE:FORGOTTEN_BEAST_327:KIDNEY +#CREATURE:FORGOTTEN_BEAST_328:MUSCLE + CREATURE:FORGOTTEN_BEAST_328:EYE +"CREATURE:FORGOTTEN_BEAST_328:BRAIN +!CREATURE:FORGOTTEN_BEAST_328:LUNG +"CREATURE:FORGOTTEN_BEAST_328:HEART +"CREATURE:FORGOTTEN_BEAST_328:LIVER + CREATURE:FORGOTTEN_BEAST_328:GUT +$CREATURE:FORGOTTEN_BEAST_328:STOMACH +$CREATURE:FORGOTTEN_BEAST_328:GIZZARD +%CREATURE:FORGOTTEN_BEAST_328:PANCREAS +#CREATURE:FORGOTTEN_BEAST_328:SPLEEN +#CREATURE:FORGOTTEN_BEAST_328:KIDNEY +#CREATURE:FORGOTTEN_BEAST_329:MUSCLE + CREATURE:FORGOTTEN_BEAST_329:EYE +"CREATURE:FORGOTTEN_BEAST_329:BRAIN +!CREATURE:FORGOTTEN_BEAST_329:LUNG +"CREATURE:FORGOTTEN_BEAST_329:HEART +"CREATURE:FORGOTTEN_BEAST_329:LIVER + CREATURE:FORGOTTEN_BEAST_329:GUT +$CREATURE:FORGOTTEN_BEAST_329:STOMACH +$CREATURE:FORGOTTEN_BEAST_329:GIZZARD +%CREATURE:FORGOTTEN_BEAST_329:PANCREAS +#CREATURE:FORGOTTEN_BEAST_329:SPLEEN +#CREATURE:FORGOTTEN_BEAST_329:KIDNEY +#CREATURE:FORGOTTEN_BEAST_330:MUSCLE + CREATURE:FORGOTTEN_BEAST_330:EYE +"CREATURE:FORGOTTEN_BEAST_330:BRAIN +!CREATURE:FORGOTTEN_BEAST_330:LUNG +"CREATURE:FORGOTTEN_BEAST_330:HEART +"CREATURE:FORGOTTEN_BEAST_330:LIVER + CREATURE:FORGOTTEN_BEAST_330:GUT +$CREATURE:FORGOTTEN_BEAST_330:STOMACH +$CREATURE:FORGOTTEN_BEAST_330:GIZZARD +%CREATURE:FORGOTTEN_BEAST_330:PANCREAS +#CREATURE:FORGOTTEN_BEAST_330:SPLEEN +#CREATURE:FORGOTTEN_BEAST_330:KIDNEY +#CREATURE:FORGOTTEN_BEAST_332:MUSCLE + CREATURE:FORGOTTEN_BEAST_332:EYE +"CREATURE:FORGOTTEN_BEAST_332:BRAIN +!CREATURE:FORGOTTEN_BEAST_332:LUNG +"CREATURE:FORGOTTEN_BEAST_332:HEART +"CREATURE:FORGOTTEN_BEAST_332:LIVER + CREATURE:FORGOTTEN_BEAST_332:GUT +$CREATURE:FORGOTTEN_BEAST_332:STOMACH +$CREATURE:FORGOTTEN_BEAST_332:GIZZARD +%CREATURE:FORGOTTEN_BEAST_332:PANCREAS +#CREATURE:FORGOTTEN_BEAST_332:SPLEEN +#CREATURE:FORGOTTEN_BEAST_332:KIDNEY +#CREATURE:FORGOTTEN_BEAST_333:MUSCLE + CREATURE:FORGOTTEN_BEAST_333:EYE +"CREATURE:FORGOTTEN_BEAST_333:BRAIN +!CREATURE:FORGOTTEN_BEAST_333:LUNG +"CREATURE:FORGOTTEN_BEAST_333:HEART +"CREATURE:FORGOTTEN_BEAST_333:LIVER + CREATURE:FORGOTTEN_BEAST_333:GUT +$CREATURE:FORGOTTEN_BEAST_333:STOMACH +$CREATURE:FORGOTTEN_BEAST_333:GIZZARD +%CREATURE:FORGOTTEN_BEAST_333:PANCREAS +#CREATURE:FORGOTTEN_BEAST_333:SPLEEN +#CREATURE:FORGOTTEN_BEAST_333:KIDNEY +#CREATURE:FORGOTTEN_BEAST_335:MUSCLE + CREATURE:FORGOTTEN_BEAST_335:EYE +"CREATURE:FORGOTTEN_BEAST_335:BRAIN +!CREATURE:FORGOTTEN_BEAST_335:LUNG +"CREATURE:FORGOTTEN_BEAST_335:HEART +"CREATURE:FORGOTTEN_BEAST_335:LIVER + CREATURE:FORGOTTEN_BEAST_335:GUT +$CREATURE:FORGOTTEN_BEAST_335:STOMACH +$CREATURE:FORGOTTEN_BEAST_335:GIZZARD +%CREATURE:FORGOTTEN_BEAST_335:PANCREAS +#CREATURE:FORGOTTEN_BEAST_335:SPLEEN +#CREATURE:FORGOTTEN_BEAST_335:KIDNEY +#CREATURE:FORGOTTEN_BEAST_336:MUSCLE + CREATURE:FORGOTTEN_BEAST_336:EYE +"CREATURE:FORGOTTEN_BEAST_336:BRAIN +!CREATURE:FORGOTTEN_BEAST_336:LUNG +"CREATURE:FORGOTTEN_BEAST_336:HEART +"CREATURE:FORGOTTEN_BEAST_336:LIVER + CREATURE:FORGOTTEN_BEAST_336:GUT +$CREATURE:FORGOTTEN_BEAST_336:STOMACH +$CREATURE:FORGOTTEN_BEAST_336:GIZZARD +%CREATURE:FORGOTTEN_BEAST_336:PANCREAS +#CREATURE:FORGOTTEN_BEAST_336:SPLEEN +#CREATURE:FORGOTTEN_BEAST_336:KIDNEY +#CREATURE:FORGOTTEN_BEAST_337:MUSCLE + CREATURE:FORGOTTEN_BEAST_337:EYE +"CREATURE:FORGOTTEN_BEAST_337:BRAIN +!CREATURE:FORGOTTEN_BEAST_337:LUNG +"CREATURE:FORGOTTEN_BEAST_337:HEART +"CREATURE:FORGOTTEN_BEAST_337:LIVER + CREATURE:FORGOTTEN_BEAST_337:GUT +$CREATURE:FORGOTTEN_BEAST_337:STOMACH +$CREATURE:FORGOTTEN_BEAST_337:GIZZARD +%CREATURE:FORGOTTEN_BEAST_337:PANCREAS +#CREATURE:FORGOTTEN_BEAST_337:SPLEEN +#CREATURE:FORGOTTEN_BEAST_337:KIDNEY +#CREATURE:FORGOTTEN_BEAST_338:MUSCLE + CREATURE:FORGOTTEN_BEAST_338:EYE +"CREATURE:FORGOTTEN_BEAST_338:BRAIN +!CREATURE:FORGOTTEN_BEAST_338:LUNG +"CREATURE:FORGOTTEN_BEAST_338:HEART +"CREATURE:FORGOTTEN_BEAST_338:LIVER + CREATURE:FORGOTTEN_BEAST_338:GUT +$CREATURE:FORGOTTEN_BEAST_338:STOMACH +$CREATURE:FORGOTTEN_BEAST_338:GIZZARD +%CREATURE:FORGOTTEN_BEAST_338:PANCREAS +#CREATURE:FORGOTTEN_BEAST_338:SPLEEN +#CREATURE:FORGOTTEN_BEAST_338:KIDNEY +#CREATURE:FORGOTTEN_BEAST_339:MUSCLE + CREATURE:FORGOTTEN_BEAST_339:EYE +"CREATURE:FORGOTTEN_BEAST_339:BRAIN +!CREATURE:FORGOTTEN_BEAST_339:LUNG +"CREATURE:FORGOTTEN_BEAST_339:HEART +"CREATURE:FORGOTTEN_BEAST_339:LIVER + CREATURE:FORGOTTEN_BEAST_339:GUT +$CREATURE:FORGOTTEN_BEAST_339:STOMACH +$CREATURE:FORGOTTEN_BEAST_339:GIZZARD +%CREATURE:FORGOTTEN_BEAST_339:PANCREAS +#CREATURE:FORGOTTEN_BEAST_339:SPLEEN +#CREATURE:FORGOTTEN_BEAST_339:KIDNEY +#CREATURE:FORGOTTEN_BEAST_341:MUSCLE + CREATURE:FORGOTTEN_BEAST_341:EYE +"CREATURE:FORGOTTEN_BEAST_341:BRAIN +!CREATURE:FORGOTTEN_BEAST_341:LUNG +"CREATURE:FORGOTTEN_BEAST_341:HEART +"CREATURE:FORGOTTEN_BEAST_341:LIVER + CREATURE:FORGOTTEN_BEAST_341:GUT +$CREATURE:FORGOTTEN_BEAST_341:STOMACH +$CREATURE:FORGOTTEN_BEAST_341:GIZZARD +%CREATURE:FORGOTTEN_BEAST_341:PANCREAS +#CREATURE:FORGOTTEN_BEAST_341:SPLEEN +#CREATURE:FORGOTTEN_BEAST_341:KIDNEY +#CREATURE:FORGOTTEN_BEAST_342:MUSCLE + CREATURE:FORGOTTEN_BEAST_342:EYE +"CREATURE:FORGOTTEN_BEAST_342:BRAIN +!CREATURE:FORGOTTEN_BEAST_342:LUNG +"CREATURE:FORGOTTEN_BEAST_342:HEART +"CREATURE:FORGOTTEN_BEAST_342:LIVER + CREATURE:FORGOTTEN_BEAST_342:GUT +$CREATURE:FORGOTTEN_BEAST_342:STOMACH +$CREATURE:FORGOTTEN_BEAST_342:GIZZARD +%CREATURE:FORGOTTEN_BEAST_342:PANCREAS +#CREATURE:FORGOTTEN_BEAST_342:SPLEEN +#CREATURE:FORGOTTEN_BEAST_342:KIDNEY +#CREATURE:FORGOTTEN_BEAST_343:MUSCLE + CREATURE:FORGOTTEN_BEAST_343:EYE +"CREATURE:FORGOTTEN_BEAST_343:BRAIN +!CREATURE:FORGOTTEN_BEAST_343:LUNG +"CREATURE:FORGOTTEN_BEAST_343:HEART +"CREATURE:FORGOTTEN_BEAST_343:LIVER + CREATURE:FORGOTTEN_BEAST_343:GUT +$CREATURE:FORGOTTEN_BEAST_343:STOMACH +$CREATURE:FORGOTTEN_BEAST_343:GIZZARD +%CREATURE:FORGOTTEN_BEAST_343:PANCREAS +#CREATURE:FORGOTTEN_BEAST_343:SPLEEN +#CREATURE:FORGOTTEN_BEAST_343:KIDNEY +#CREATURE:FORGOTTEN_BEAST_344:MUSCLE + CREATURE:FORGOTTEN_BEAST_344:EYE +"CREATURE:FORGOTTEN_BEAST_344:BRAIN +!CREATURE:FORGOTTEN_BEAST_344:LUNG +"CREATURE:FORGOTTEN_BEAST_344:HEART +"CREATURE:FORGOTTEN_BEAST_344:LIVER + CREATURE:FORGOTTEN_BEAST_344:GUT +$CREATURE:FORGOTTEN_BEAST_344:STOMACH +$CREATURE:FORGOTTEN_BEAST_344:GIZZARD +%CREATURE:FORGOTTEN_BEAST_344:PANCREAS +#CREATURE:FORGOTTEN_BEAST_344:SPLEEN +#CREATURE:FORGOTTEN_BEAST_344:KIDNEY +#CREATURE:FORGOTTEN_BEAST_347:MUSCLE + CREATURE:FORGOTTEN_BEAST_347:EYE +"CREATURE:FORGOTTEN_BEAST_347:BRAIN +!CREATURE:FORGOTTEN_BEAST_347:LUNG +"CREATURE:FORGOTTEN_BEAST_347:HEART +"CREATURE:FORGOTTEN_BEAST_347:LIVER + CREATURE:FORGOTTEN_BEAST_347:GUT +$CREATURE:FORGOTTEN_BEAST_347:STOMACH +$CREATURE:FORGOTTEN_BEAST_347:GIZZARD +%CREATURE:FORGOTTEN_BEAST_347:PANCREAS +#CREATURE:FORGOTTEN_BEAST_347:SPLEEN +#CREATURE:FORGOTTEN_BEAST_347:KIDNEY +#CREATURE:FORGOTTEN_BEAST_348:MUSCLE + CREATURE:FORGOTTEN_BEAST_348:EYE +"CREATURE:FORGOTTEN_BEAST_348:BRAIN +!CREATURE:FORGOTTEN_BEAST_348:LUNG +"CREATURE:FORGOTTEN_BEAST_348:HEART +"CREATURE:FORGOTTEN_BEAST_348:LIVER + CREATURE:FORGOTTEN_BEAST_348:GUT +$CREATURE:FORGOTTEN_BEAST_348:STOMACH +$CREATURE:FORGOTTEN_BEAST_348:GIZZARD +%CREATURE:FORGOTTEN_BEAST_348:PANCREAS +#CREATURE:FORGOTTEN_BEAST_348:SPLEEN +#CREATURE:FORGOTTEN_BEAST_348:KIDNEY +#CREATURE:FORGOTTEN_BEAST_349:MUSCLE + CREATURE:FORGOTTEN_BEAST_349:EYE +"CREATURE:FORGOTTEN_BEAST_349:BRAIN +!CREATURE:FORGOTTEN_BEAST_349:LUNG +"CREATURE:FORGOTTEN_BEAST_349:HEART +"CREATURE:FORGOTTEN_BEAST_349:LIVER + CREATURE:FORGOTTEN_BEAST_349:GUT +$CREATURE:FORGOTTEN_BEAST_349:STOMACH +$CREATURE:FORGOTTEN_BEAST_349:GIZZARD +%CREATURE:FORGOTTEN_BEAST_349:PANCREAS +#CREATURE:FORGOTTEN_BEAST_349:SPLEEN +#CREATURE:FORGOTTEN_BEAST_349:KIDNEY +#CREATURE:FORGOTTEN_BEAST_351:MUSCLE + CREATURE:FORGOTTEN_BEAST_351:EYE +"CREATURE:FORGOTTEN_BEAST_351:BRAIN +!CREATURE:FORGOTTEN_BEAST_351:LUNG +"CREATURE:FORGOTTEN_BEAST_351:HEART +"CREATURE:FORGOTTEN_BEAST_351:LIVER + CREATURE:FORGOTTEN_BEAST_351:GUT +$CREATURE:FORGOTTEN_BEAST_351:STOMACH +$CREATURE:FORGOTTEN_BEAST_351:GIZZARD +%CREATURE:FORGOTTEN_BEAST_351:PANCREAS +#CREATURE:FORGOTTEN_BEAST_351:SPLEEN +#CREATURE:FORGOTTEN_BEAST_351:KIDNEY +#CREATURE:FORGOTTEN_BEAST_352:MUSCLE + CREATURE:FORGOTTEN_BEAST_352:EYE +"CREATURE:FORGOTTEN_BEAST_352:BRAIN +!CREATURE:FORGOTTEN_BEAST_352:LUNG +"CREATURE:FORGOTTEN_BEAST_352:HEART +"CREATURE:FORGOTTEN_BEAST_352:LIVER + CREATURE:FORGOTTEN_BEAST_352:GUT +$CREATURE:FORGOTTEN_BEAST_352:STOMACH +$CREATURE:FORGOTTEN_BEAST_352:GIZZARD +%CREATURE:FORGOTTEN_BEAST_352:PANCREAS +#CREATURE:FORGOTTEN_BEAST_352:SPLEEN +#CREATURE:FORGOTTEN_BEAST_352:KIDNEY +#CREATURE:FORGOTTEN_BEAST_353:MUSCLE + CREATURE:FORGOTTEN_BEAST_353:EYE +"CREATURE:FORGOTTEN_BEAST_353:BRAIN +!CREATURE:FORGOTTEN_BEAST_353:LUNG +"CREATURE:FORGOTTEN_BEAST_353:HEART +"CREATURE:FORGOTTEN_BEAST_353:LIVER + CREATURE:FORGOTTEN_BEAST_353:GUT +$CREATURE:FORGOTTEN_BEAST_353:STOMACH +$CREATURE:FORGOTTEN_BEAST_353:GIZZARD +%CREATURE:FORGOTTEN_BEAST_353:PANCREAS +#CREATURE:FORGOTTEN_BEAST_353:SPLEEN +#CREATURE:FORGOTTEN_BEAST_353:KIDNEY +#CREATURE:FORGOTTEN_BEAST_354:MUSCLE + CREATURE:FORGOTTEN_BEAST_354:EYE +"CREATURE:FORGOTTEN_BEAST_354:BRAIN +!CREATURE:FORGOTTEN_BEAST_354:LUNG +"CREATURE:FORGOTTEN_BEAST_354:HEART +"CREATURE:FORGOTTEN_BEAST_354:LIVER + CREATURE:FORGOTTEN_BEAST_354:GUT +$CREATURE:FORGOTTEN_BEAST_354:STOMACH +$CREATURE:FORGOTTEN_BEAST_354:GIZZARD +%CREATURE:FORGOTTEN_BEAST_354:PANCREAS +#CREATURE:FORGOTTEN_BEAST_354:SPLEEN +#CREATURE:FORGOTTEN_BEAST_354:KIDNEY +#CREATURE:FORGOTTEN_BEAST_355:MUSCLE + CREATURE:FORGOTTEN_BEAST_355:EYE +"CREATURE:FORGOTTEN_BEAST_355:BRAIN +!CREATURE:FORGOTTEN_BEAST_355:LUNG +"CREATURE:FORGOTTEN_BEAST_355:HEART +"CREATURE:FORGOTTEN_BEAST_355:LIVER + CREATURE:FORGOTTEN_BEAST_355:GUT +$CREATURE:FORGOTTEN_BEAST_355:STOMACH +$CREATURE:FORGOTTEN_BEAST_355:GIZZARD +%CREATURE:FORGOTTEN_BEAST_355:PANCREAS +#CREATURE:FORGOTTEN_BEAST_355:SPLEEN +#CREATURE:FORGOTTEN_BEAST_355:KIDNEY +#CREATURE:FORGOTTEN_BEAST_356:MUSCLE + CREATURE:FORGOTTEN_BEAST_356:EYE +"CREATURE:FORGOTTEN_BEAST_356:BRAIN +!CREATURE:FORGOTTEN_BEAST_356:LUNG +"CREATURE:FORGOTTEN_BEAST_356:HEART +"CREATURE:FORGOTTEN_BEAST_356:LIVER + CREATURE:FORGOTTEN_BEAST_356:GUT +$CREATURE:FORGOTTEN_BEAST_356:STOMACH +$CREATURE:FORGOTTEN_BEAST_356:GIZZARD +%CREATURE:FORGOTTEN_BEAST_356:PANCREAS +#CREATURE:FORGOTTEN_BEAST_356:SPLEEN +#CREATURE:FORGOTTEN_BEAST_356:KIDNEY +#CREATURE:FORGOTTEN_BEAST_357:MUSCLE + CREATURE:FORGOTTEN_BEAST_357:EYE +"CREATURE:FORGOTTEN_BEAST_357:BRAIN +!CREATURE:FORGOTTEN_BEAST_357:LUNG +"CREATURE:FORGOTTEN_BEAST_357:HEART +"CREATURE:FORGOTTEN_BEAST_357:LIVER + CREATURE:FORGOTTEN_BEAST_357:GUT +$CREATURE:FORGOTTEN_BEAST_357:STOMACH +$CREATURE:FORGOTTEN_BEAST_357:GIZZARD +%CREATURE:FORGOTTEN_BEAST_357:PANCREAS +#CREATURE:FORGOTTEN_BEAST_357:SPLEEN +#CREATURE:FORGOTTEN_BEAST_357:KIDNEY +#CREATURE:FORGOTTEN_BEAST_358:MUSCLE + CREATURE:FORGOTTEN_BEAST_358:EYE +"CREATURE:FORGOTTEN_BEAST_358:BRAIN +!CREATURE:FORGOTTEN_BEAST_358:LUNG +"CREATURE:FORGOTTEN_BEAST_358:HEART +"CREATURE:FORGOTTEN_BEAST_358:LIVER + CREATURE:FORGOTTEN_BEAST_358:GUT +$CREATURE:FORGOTTEN_BEAST_358:STOMACH +$CREATURE:FORGOTTEN_BEAST_358:GIZZARD +%CREATURE:FORGOTTEN_BEAST_358:PANCREAS +#CREATURE:FORGOTTEN_BEAST_358:SPLEEN +#CREATURE:FORGOTTEN_BEAST_358:KIDNEY +#CREATURE:FORGOTTEN_BEAST_359:MUSCLE + CREATURE:FORGOTTEN_BEAST_359:EYE +"CREATURE:FORGOTTEN_BEAST_359:BRAIN +!CREATURE:FORGOTTEN_BEAST_359:LUNG +"CREATURE:FORGOTTEN_BEAST_359:HEART +"CREATURE:FORGOTTEN_BEAST_359:LIVER + CREATURE:FORGOTTEN_BEAST_359:GUT +$CREATURE:FORGOTTEN_BEAST_359:STOMACH +$CREATURE:FORGOTTEN_BEAST_359:GIZZARD +%CREATURE:FORGOTTEN_BEAST_359:PANCREAS +#CREATURE:FORGOTTEN_BEAST_359:SPLEEN +#CREATURE:FORGOTTEN_BEAST_359:KIDNEY +#CREATURE:FORGOTTEN_BEAST_361:MUSCLE + CREATURE:FORGOTTEN_BEAST_361:EYE +"CREATURE:FORGOTTEN_BEAST_361:BRAIN +!CREATURE:FORGOTTEN_BEAST_361:LUNG +"CREATURE:FORGOTTEN_BEAST_361:HEART +"CREATURE:FORGOTTEN_BEAST_361:LIVER + CREATURE:FORGOTTEN_BEAST_361:GUT +$CREATURE:FORGOTTEN_BEAST_361:STOMACH +$CREATURE:FORGOTTEN_BEAST_361:GIZZARD +%CREATURE:FORGOTTEN_BEAST_361:PANCREAS +#CREATURE:FORGOTTEN_BEAST_361:SPLEEN +#CREATURE:FORGOTTEN_BEAST_361:KIDNEY +#CREATURE:FORGOTTEN_BEAST_363:MUSCLE + CREATURE:FORGOTTEN_BEAST_363:EYE +"CREATURE:FORGOTTEN_BEAST_363:BRAIN +!CREATURE:FORGOTTEN_BEAST_363:LUNG +"CREATURE:FORGOTTEN_BEAST_363:HEART +"CREATURE:FORGOTTEN_BEAST_363:LIVER + CREATURE:FORGOTTEN_BEAST_363:GUT +$CREATURE:FORGOTTEN_BEAST_363:STOMACH +$CREATURE:FORGOTTEN_BEAST_363:GIZZARD +%CREATURE:FORGOTTEN_BEAST_363:PANCREAS +#CREATURE:FORGOTTEN_BEAST_363:SPLEEN +#CREATURE:FORGOTTEN_BEAST_363:KIDNEY +#CREATURE:FORGOTTEN_BEAST_364:MUSCLE + CREATURE:FORGOTTEN_BEAST_364:EYE +"CREATURE:FORGOTTEN_BEAST_364:BRAIN +!CREATURE:FORGOTTEN_BEAST_364:LUNG +"CREATURE:FORGOTTEN_BEAST_364:HEART +"CREATURE:FORGOTTEN_BEAST_364:LIVER + CREATURE:FORGOTTEN_BEAST_364:GUT +$CREATURE:FORGOTTEN_BEAST_364:STOMACH +$CREATURE:FORGOTTEN_BEAST_364:GIZZARD +%CREATURE:FORGOTTEN_BEAST_364:PANCREAS +#CREATURE:FORGOTTEN_BEAST_364:SPLEEN +#CREATURE:FORGOTTEN_BEAST_364:KIDNEY +#CREATURE:FORGOTTEN_BEAST_365:MUSCLE + CREATURE:FORGOTTEN_BEAST_365:EYE +"CREATURE:FORGOTTEN_BEAST_365:BRAIN +!CREATURE:FORGOTTEN_BEAST_365:LUNG +"CREATURE:FORGOTTEN_BEAST_365:HEART +"CREATURE:FORGOTTEN_BEAST_365:LIVER + CREATURE:FORGOTTEN_BEAST_365:GUT +$CREATURE:FORGOTTEN_BEAST_365:STOMACH +$CREATURE:FORGOTTEN_BEAST_365:GIZZARD +%CREATURE:FORGOTTEN_BEAST_365:PANCREAS +#CREATURE:FORGOTTEN_BEAST_365:SPLEEN +#CREATURE:FORGOTTEN_BEAST_365:KIDNEY +#CREATURE:FORGOTTEN_BEAST_366:MUSCLE + CREATURE:FORGOTTEN_BEAST_366:EYE +"CREATURE:FORGOTTEN_BEAST_366:BRAIN +!CREATURE:FORGOTTEN_BEAST_366:LUNG +"CREATURE:FORGOTTEN_BEAST_366:HEART +"CREATURE:FORGOTTEN_BEAST_366:LIVER + CREATURE:FORGOTTEN_BEAST_366:GUT +$CREATURE:FORGOTTEN_BEAST_366:STOMACH +$CREATURE:FORGOTTEN_BEAST_366:GIZZARD +%CREATURE:FORGOTTEN_BEAST_366:PANCREAS +#CREATURE:FORGOTTEN_BEAST_366:SPLEEN +#CREATURE:FORGOTTEN_BEAST_366:KIDNEY +#CREATURE:FORGOTTEN_BEAST_367:MUSCLE + CREATURE:FORGOTTEN_BEAST_367:EYE +"CREATURE:FORGOTTEN_BEAST_367:BRAIN +!CREATURE:FORGOTTEN_BEAST_367:LUNG +"CREATURE:FORGOTTEN_BEAST_367:HEART +"CREATURE:FORGOTTEN_BEAST_367:LIVER + CREATURE:FORGOTTEN_BEAST_367:GUT +$CREATURE:FORGOTTEN_BEAST_367:STOMACH +$CREATURE:FORGOTTEN_BEAST_367:GIZZARD +%CREATURE:FORGOTTEN_BEAST_367:PANCREAS +#CREATURE:FORGOTTEN_BEAST_367:SPLEEN +#CREATURE:FORGOTTEN_BEAST_367:KIDNEY +#CREATURE:FORGOTTEN_BEAST_368:MUSCLE + CREATURE:FORGOTTEN_BEAST_368:EYE +"CREATURE:FORGOTTEN_BEAST_368:BRAIN +!CREATURE:FORGOTTEN_BEAST_368:LUNG +"CREATURE:FORGOTTEN_BEAST_368:HEART +"CREATURE:FORGOTTEN_BEAST_368:LIVER + CREATURE:FORGOTTEN_BEAST_368:GUT +$CREATURE:FORGOTTEN_BEAST_368:STOMACH +$CREATURE:FORGOTTEN_BEAST_368:GIZZARD +%CREATURE:FORGOTTEN_BEAST_368:PANCREAS +#CREATURE:FORGOTTEN_BEAST_368:SPLEEN +#CREATURE:FORGOTTEN_BEAST_368:KIDNEY +#CREATURE:FORGOTTEN_BEAST_370:MUSCLE + CREATURE:FORGOTTEN_BEAST_370:EYE +"CREATURE:FORGOTTEN_BEAST_370:BRAIN +!CREATURE:FORGOTTEN_BEAST_370:LUNG +"CREATURE:FORGOTTEN_BEAST_370:HEART +"CREATURE:FORGOTTEN_BEAST_370:LIVER + CREATURE:FORGOTTEN_BEAST_370:GUT +$CREATURE:FORGOTTEN_BEAST_370:STOMACH +$CREATURE:FORGOTTEN_BEAST_370:GIZZARD +%CREATURE:FORGOTTEN_BEAST_370:PANCREAS +#CREATURE:FORGOTTEN_BEAST_370:SPLEEN +#CREATURE:FORGOTTEN_BEAST_370:KIDNEY +#CREATURE:FORGOTTEN_BEAST_372:MUSCLE + CREATURE:FORGOTTEN_BEAST_372:EYE +"CREATURE:FORGOTTEN_BEAST_372:BRAIN +!CREATURE:FORGOTTEN_BEAST_372:LUNG +"CREATURE:FORGOTTEN_BEAST_372:HEART +"CREATURE:FORGOTTEN_BEAST_372:LIVER + CREATURE:FORGOTTEN_BEAST_372:GUT +$CREATURE:FORGOTTEN_BEAST_372:STOMACH +$CREATURE:FORGOTTEN_BEAST_372:GIZZARD +%CREATURE:FORGOTTEN_BEAST_372:PANCREAS +#CREATURE:FORGOTTEN_BEAST_372:SPLEEN +#CREATURE:FORGOTTEN_BEAST_372:KIDNEY +#CREATURE:FORGOTTEN_BEAST_374:MUSCLE + CREATURE:FORGOTTEN_BEAST_374:EYE +"CREATURE:FORGOTTEN_BEAST_374:BRAIN +!CREATURE:FORGOTTEN_BEAST_374:LUNG +"CREATURE:FORGOTTEN_BEAST_374:HEART +"CREATURE:FORGOTTEN_BEAST_374:LIVER + CREATURE:FORGOTTEN_BEAST_374:GUT +$CREATURE:FORGOTTEN_BEAST_374:STOMACH +$CREATURE:FORGOTTEN_BEAST_374:GIZZARD +%CREATURE:FORGOTTEN_BEAST_374:PANCREAS +#CREATURE:FORGOTTEN_BEAST_374:SPLEEN +#CREATURE:FORGOTTEN_BEAST_374:KIDNEY +#CREATURE:FORGOTTEN_BEAST_375:MUSCLE + CREATURE:FORGOTTEN_BEAST_375:EYE +"CREATURE:FORGOTTEN_BEAST_375:BRAIN +!CREATURE:FORGOTTEN_BEAST_375:LUNG +"CREATURE:FORGOTTEN_BEAST_375:HEART +"CREATURE:FORGOTTEN_BEAST_375:LIVER + CREATURE:FORGOTTEN_BEAST_375:GUT +$CREATURE:FORGOTTEN_BEAST_375:STOMACH +$CREATURE:FORGOTTEN_BEAST_375:GIZZARD +%CREATURE:FORGOTTEN_BEAST_375:PANCREAS +#CREATURE:FORGOTTEN_BEAST_375:SPLEEN +#CREATURE:FORGOTTEN_BEAST_375:KIDNEY +#CREATURE:FORGOTTEN_BEAST_377:MUSCLE + CREATURE:FORGOTTEN_BEAST_377:EYE +"CREATURE:FORGOTTEN_BEAST_377:BRAIN +!CREATURE:FORGOTTEN_BEAST_377:LUNG +"CREATURE:FORGOTTEN_BEAST_377:HEART +"CREATURE:FORGOTTEN_BEAST_377:LIVER + CREATURE:FORGOTTEN_BEAST_377:GUT +$CREATURE:FORGOTTEN_BEAST_377:STOMACH +$CREATURE:FORGOTTEN_BEAST_377:GIZZARD +%CREATURE:FORGOTTEN_BEAST_377:PANCREAS +#CREATURE:FORGOTTEN_BEAST_377:SPLEEN +#CREATURE:FORGOTTEN_BEAST_377:KIDNEY +#CREATURE:FORGOTTEN_BEAST_378:MUSCLE + CREATURE:FORGOTTEN_BEAST_378:EYE +"CREATURE:FORGOTTEN_BEAST_378:BRAIN +!CREATURE:FORGOTTEN_BEAST_378:LUNG +"CREATURE:FORGOTTEN_BEAST_378:HEART +"CREATURE:FORGOTTEN_BEAST_378:LIVER + CREATURE:FORGOTTEN_BEAST_378:GUT +$CREATURE:FORGOTTEN_BEAST_378:STOMACH +$CREATURE:FORGOTTEN_BEAST_378:GIZZARD +%CREATURE:FORGOTTEN_BEAST_378:PANCREAS +#CREATURE:FORGOTTEN_BEAST_378:SPLEEN +#CREATURE:FORGOTTEN_BEAST_378:KIDNEY +#CREATURE:FORGOTTEN_BEAST_379:MUSCLE + CREATURE:FORGOTTEN_BEAST_379:EYE +"CREATURE:FORGOTTEN_BEAST_379:BRAIN +!CREATURE:FORGOTTEN_BEAST_379:LUNG +"CREATURE:FORGOTTEN_BEAST_379:HEART +"CREATURE:FORGOTTEN_BEAST_379:LIVER + CREATURE:FORGOTTEN_BEAST_379:GUT +$CREATURE:FORGOTTEN_BEAST_379:STOMACH +$CREATURE:FORGOTTEN_BEAST_379:GIZZARD +%CREATURE:FORGOTTEN_BEAST_379:PANCREAS +#CREATURE:FORGOTTEN_BEAST_379:SPLEEN +#CREATURE:FORGOTTEN_BEAST_379:KIDNEY +#CREATURE:FORGOTTEN_BEAST_380:MUSCLE + CREATURE:FORGOTTEN_BEAST_380:EYE +"CREATURE:FORGOTTEN_BEAST_380:BRAIN +!CREATURE:FORGOTTEN_BEAST_380:LUNG +"CREATURE:FORGOTTEN_BEAST_380:HEART +"CREATURE:FORGOTTEN_BEAST_380:LIVER + CREATURE:FORGOTTEN_BEAST_380:GUT +$CREATURE:FORGOTTEN_BEAST_380:STOMACH +$CREATURE:FORGOTTEN_BEAST_380:GIZZARD +%CREATURE:FORGOTTEN_BEAST_380:PANCREAS +#CREATURE:FORGOTTEN_BEAST_380:SPLEEN +#CREATURE:FORGOTTEN_BEAST_380:KIDNEY +#CREATURE:FORGOTTEN_BEAST_381:MUSCLE + CREATURE:FORGOTTEN_BEAST_381:EYE +"CREATURE:FORGOTTEN_BEAST_381:BRAIN +!CREATURE:FORGOTTEN_BEAST_381:LUNG +"CREATURE:FORGOTTEN_BEAST_381:HEART +"CREATURE:FORGOTTEN_BEAST_381:LIVER + CREATURE:FORGOTTEN_BEAST_381:GUT +$CREATURE:FORGOTTEN_BEAST_381:STOMACH +$CREATURE:FORGOTTEN_BEAST_381:GIZZARD +%CREATURE:FORGOTTEN_BEAST_381:PANCREAS +#CREATURE:FORGOTTEN_BEAST_381:SPLEEN +#CREATURE:FORGOTTEN_BEAST_381:KIDNEY +#CREATURE:FORGOTTEN_BEAST_382:MUSCLE + CREATURE:FORGOTTEN_BEAST_382:EYE +"CREATURE:FORGOTTEN_BEAST_382:BRAIN +!CREATURE:FORGOTTEN_BEAST_382:LUNG +"CREATURE:FORGOTTEN_BEAST_382:HEART +"CREATURE:FORGOTTEN_BEAST_382:LIVER + CREATURE:FORGOTTEN_BEAST_382:GUT +$CREATURE:FORGOTTEN_BEAST_382:STOMACH +$CREATURE:FORGOTTEN_BEAST_382:GIZZARD +%CREATURE:FORGOTTEN_BEAST_382:PANCREAS +#CREATURE:FORGOTTEN_BEAST_382:SPLEEN +#CREATURE:FORGOTTEN_BEAST_382:KIDNEY +#CREATURE:FORGOTTEN_BEAST_383:MUSCLE + CREATURE:FORGOTTEN_BEAST_383:EYE +"CREATURE:FORGOTTEN_BEAST_383:BRAIN +!CREATURE:FORGOTTEN_BEAST_383:LUNG +"CREATURE:FORGOTTEN_BEAST_383:HEART +"CREATURE:FORGOTTEN_BEAST_383:LIVER + CREATURE:FORGOTTEN_BEAST_383:GUT +$CREATURE:FORGOTTEN_BEAST_383:STOMACH +$CREATURE:FORGOTTEN_BEAST_383:GIZZARD +%CREATURE:FORGOTTEN_BEAST_383:PANCREAS +#CREATURE:FORGOTTEN_BEAST_383:SPLEEN +#CREATURE:FORGOTTEN_BEAST_383:KIDNEY +#CREATURE:FORGOTTEN_BEAST_384:MUSCLE + CREATURE:FORGOTTEN_BEAST_384:EYE +"CREATURE:FORGOTTEN_BEAST_384:BRAIN +!CREATURE:FORGOTTEN_BEAST_384:LUNG +"CREATURE:FORGOTTEN_BEAST_384:HEART +"CREATURE:FORGOTTEN_BEAST_384:LIVER + CREATURE:FORGOTTEN_BEAST_384:GUT +$CREATURE:FORGOTTEN_BEAST_384:STOMACH +$CREATURE:FORGOTTEN_BEAST_384:GIZZARD +%CREATURE:FORGOTTEN_BEAST_384:PANCREAS +#CREATURE:FORGOTTEN_BEAST_384:SPLEEN +#CREATURE:FORGOTTEN_BEAST_384:KIDNEY +#CREATURE:FORGOTTEN_BEAST_385:MUSCLE + CREATURE:FORGOTTEN_BEAST_385:EYE +"CREATURE:FORGOTTEN_BEAST_385:BRAIN +!CREATURE:FORGOTTEN_BEAST_385:LUNG +"CREATURE:FORGOTTEN_BEAST_385:HEART +"CREATURE:FORGOTTEN_BEAST_385:LIVER + CREATURE:FORGOTTEN_BEAST_385:GUT +$CREATURE:FORGOTTEN_BEAST_385:STOMACH +$CREATURE:FORGOTTEN_BEAST_385:GIZZARD +%CREATURE:FORGOTTEN_BEAST_385:PANCREAS +#CREATURE:FORGOTTEN_BEAST_385:SPLEEN +#CREATURE:FORGOTTEN_BEAST_385:KIDNEY +#CREATURE:FORGOTTEN_BEAST_386:MUSCLE + CREATURE:FORGOTTEN_BEAST_386:EYE +"CREATURE:FORGOTTEN_BEAST_386:BRAIN +!CREATURE:FORGOTTEN_BEAST_386:LUNG +"CREATURE:FORGOTTEN_BEAST_386:HEART +"CREATURE:FORGOTTEN_BEAST_386:LIVER + CREATURE:FORGOTTEN_BEAST_386:GUT +$CREATURE:FORGOTTEN_BEAST_386:STOMACH +$CREATURE:FORGOTTEN_BEAST_386:GIZZARD +%CREATURE:FORGOTTEN_BEAST_386:PANCREAS +#CREATURE:FORGOTTEN_BEAST_386:SPLEEN +#CREATURE:FORGOTTEN_BEAST_386:KIDNEY +#CREATURE:FORGOTTEN_BEAST_387:MUSCLE + CREATURE:FORGOTTEN_BEAST_387:EYE +"CREATURE:FORGOTTEN_BEAST_387:BRAIN +!CREATURE:FORGOTTEN_BEAST_387:LUNG +"CREATURE:FORGOTTEN_BEAST_387:HEART +"CREATURE:FORGOTTEN_BEAST_387:LIVER + CREATURE:FORGOTTEN_BEAST_387:GUT +$CREATURE:FORGOTTEN_BEAST_387:STOMACH +$CREATURE:FORGOTTEN_BEAST_387:GIZZARD +%CREATURE:FORGOTTEN_BEAST_387:PANCREAS +#CREATURE:FORGOTTEN_BEAST_387:SPLEEN +#CREATURE:FORGOTTEN_BEAST_387:KIDNEY +#CREATURE:FORGOTTEN_BEAST_388:MUSCLE + CREATURE:FORGOTTEN_BEAST_388:EYE +"CREATURE:FORGOTTEN_BEAST_388:BRAIN +!CREATURE:FORGOTTEN_BEAST_388:LUNG +"CREATURE:FORGOTTEN_BEAST_388:HEART +"CREATURE:FORGOTTEN_BEAST_388:LIVER + CREATURE:FORGOTTEN_BEAST_388:GUT +$CREATURE:FORGOTTEN_BEAST_388:STOMACH +$CREATURE:FORGOTTEN_BEAST_388:GIZZARD +%CREATURE:FORGOTTEN_BEAST_388:PANCREAS +#CREATURE:FORGOTTEN_BEAST_388:SPLEEN +#CREATURE:FORGOTTEN_BEAST_388:KIDNEY +#CREATURE:FORGOTTEN_BEAST_389:MUSCLE + CREATURE:FORGOTTEN_BEAST_389:EYE +"CREATURE:FORGOTTEN_BEAST_389:BRAIN +!CREATURE:FORGOTTEN_BEAST_389:LUNG +"CREATURE:FORGOTTEN_BEAST_389:HEART +"CREATURE:FORGOTTEN_BEAST_389:LIVER + CREATURE:FORGOTTEN_BEAST_389:GUT +$CREATURE:FORGOTTEN_BEAST_389:STOMACH +$CREATURE:FORGOTTEN_BEAST_389:GIZZARD +%CREATURE:FORGOTTEN_BEAST_389:PANCREAS +#CREATURE:FORGOTTEN_BEAST_389:SPLEEN +#CREATURE:FORGOTTEN_BEAST_389:KIDNEY +#CREATURE:FORGOTTEN_BEAST_390:MUSCLE + CREATURE:FORGOTTEN_BEAST_390:EYE +"CREATURE:FORGOTTEN_BEAST_390:BRAIN +!CREATURE:FORGOTTEN_BEAST_390:LUNG +"CREATURE:FORGOTTEN_BEAST_390:HEART +"CREATURE:FORGOTTEN_BEAST_390:LIVER + CREATURE:FORGOTTEN_BEAST_390:GUT +$CREATURE:FORGOTTEN_BEAST_390:STOMACH +$CREATURE:FORGOTTEN_BEAST_390:GIZZARD +%CREATURE:FORGOTTEN_BEAST_390:PANCREAS +#CREATURE:FORGOTTEN_BEAST_390:SPLEEN +#CREATURE:FORGOTTEN_BEAST_390:KIDNEY +#CREATURE:FORGOTTEN_BEAST_391:MUSCLE + CREATURE:FORGOTTEN_BEAST_391:EYE +"CREATURE:FORGOTTEN_BEAST_391:BRAIN +!CREATURE:FORGOTTEN_BEAST_391:LUNG +"CREATURE:FORGOTTEN_BEAST_391:HEART +"CREATURE:FORGOTTEN_BEAST_391:LIVER + CREATURE:FORGOTTEN_BEAST_391:GUT +$CREATURE:FORGOTTEN_BEAST_391:STOMACH +$CREATURE:FORGOTTEN_BEAST_391:GIZZARD +%CREATURE:FORGOTTEN_BEAST_391:PANCREAS +#CREATURE:FORGOTTEN_BEAST_391:SPLEEN +#CREATURE:FORGOTTEN_BEAST_391:KIDNEY +#CREATURE:FORGOTTEN_BEAST_392:MUSCLE + CREATURE:FORGOTTEN_BEAST_392:EYE +"CREATURE:FORGOTTEN_BEAST_392:BRAIN +!CREATURE:FORGOTTEN_BEAST_392:LUNG +"CREATURE:FORGOTTEN_BEAST_392:HEART +"CREATURE:FORGOTTEN_BEAST_392:LIVER + CREATURE:FORGOTTEN_BEAST_392:GUT +$CREATURE:FORGOTTEN_BEAST_392:STOMACH +$CREATURE:FORGOTTEN_BEAST_392:GIZZARD +%CREATURE:FORGOTTEN_BEAST_392:PANCREAS +#CREATURE:FORGOTTEN_BEAST_392:SPLEEN +#CREATURE:FORGOTTEN_BEAST_392:KIDNEY +#CREATURE:FORGOTTEN_BEAST_393:MUSCLE + CREATURE:FORGOTTEN_BEAST_393:EYE +"CREATURE:FORGOTTEN_BEAST_393:BRAIN +!CREATURE:FORGOTTEN_BEAST_393:LUNG +"CREATURE:FORGOTTEN_BEAST_393:HEART +"CREATURE:FORGOTTEN_BEAST_393:LIVER + CREATURE:FORGOTTEN_BEAST_393:GUT +$CREATURE:FORGOTTEN_BEAST_393:STOMACH +$CREATURE:FORGOTTEN_BEAST_393:GIZZARD +%CREATURE:FORGOTTEN_BEAST_393:PANCREAS +#CREATURE:FORGOTTEN_BEAST_393:SPLEEN +#CREATURE:FORGOTTEN_BEAST_393:KIDNEY +#CREATURE:FORGOTTEN_BEAST_396:MUSCLE + CREATURE:FORGOTTEN_BEAST_396:EYE +"CREATURE:FORGOTTEN_BEAST_396:BRAIN +!CREATURE:FORGOTTEN_BEAST_396:LUNG +"CREATURE:FORGOTTEN_BEAST_396:HEART +"CREATURE:FORGOTTEN_BEAST_396:LIVER + CREATURE:FORGOTTEN_BEAST_396:GUT +$CREATURE:FORGOTTEN_BEAST_396:STOMACH +$CREATURE:FORGOTTEN_BEAST_396:GIZZARD +%CREATURE:FORGOTTEN_BEAST_396:PANCREAS +#CREATURE:FORGOTTEN_BEAST_396:SPLEEN +#CREATURE:FORGOTTEN_BEAST_396:KIDNEY +#CREATURE:FORGOTTEN_BEAST_397:MUSCLE + CREATURE:FORGOTTEN_BEAST_397:EYE +"CREATURE:FORGOTTEN_BEAST_397:BRAIN +!CREATURE:FORGOTTEN_BEAST_397:LUNG +"CREATURE:FORGOTTEN_BEAST_397:HEART +"CREATURE:FORGOTTEN_BEAST_397:LIVER + CREATURE:FORGOTTEN_BEAST_397:GUT +$CREATURE:FORGOTTEN_BEAST_397:STOMACH +$CREATURE:FORGOTTEN_BEAST_397:GIZZARD +%CREATURE:FORGOTTEN_BEAST_397:PANCREAS +#CREATURE:FORGOTTEN_BEAST_397:SPLEEN +#CREATURE:FORGOTTEN_BEAST_397:KIDNEY +#CREATURE:FORGOTTEN_BEAST_398:MUSCLE + CREATURE:FORGOTTEN_BEAST_398:EYE +"CREATURE:FORGOTTEN_BEAST_398:BRAIN +!CREATURE:FORGOTTEN_BEAST_398:LUNG +"CREATURE:FORGOTTEN_BEAST_398:HEART +"CREATURE:FORGOTTEN_BEAST_398:LIVER + CREATURE:FORGOTTEN_BEAST_398:GUT +$CREATURE:FORGOTTEN_BEAST_398:STOMACH +$CREATURE:FORGOTTEN_BEAST_398:GIZZARD +%CREATURE:FORGOTTEN_BEAST_398:PANCREAS +#CREATURE:FORGOTTEN_BEAST_398:SPLEEN +#CREATURE:FORGOTTEN_BEAST_398:KIDNEY +#CREATURE:FORGOTTEN_BEAST_400:MUSCLE + CREATURE:FORGOTTEN_BEAST_400:EYE +"CREATURE:FORGOTTEN_BEAST_400:BRAIN +!CREATURE:FORGOTTEN_BEAST_400:LUNG +"CREATURE:FORGOTTEN_BEAST_400:HEART +"CREATURE:FORGOTTEN_BEAST_400:LIVER + CREATURE:FORGOTTEN_BEAST_400:GUT +$CREATURE:FORGOTTEN_BEAST_400:STOMACH +$CREATURE:FORGOTTEN_BEAST_400:GIZZARD +%CREATURE:FORGOTTEN_BEAST_400:PANCREAS +#CREATURE:FORGOTTEN_BEAST_400:SPLEEN +#CREATURE:FORGOTTEN_BEAST_400:KIDNEY +#CREATURE:FORGOTTEN_BEAST_403:MUSCLE + CREATURE:FORGOTTEN_BEAST_403:EYE +"CREATURE:FORGOTTEN_BEAST_403:BRAIN +!CREATURE:FORGOTTEN_BEAST_403:LUNG +"CREATURE:FORGOTTEN_BEAST_403:HEART +"CREATURE:FORGOTTEN_BEAST_403:LIVER + CREATURE:FORGOTTEN_BEAST_403:GUT +$CREATURE:FORGOTTEN_BEAST_403:STOMACH +$CREATURE:FORGOTTEN_BEAST_403:GIZZARD +%CREATURE:FORGOTTEN_BEAST_403:PANCREAS +#CREATURE:FORGOTTEN_BEAST_403:SPLEEN +#CREATURE:FORGOTTEN_BEAST_403:KIDNEY +#CREATURE:FORGOTTEN_BEAST_404:MUSCLE + CREATURE:FORGOTTEN_BEAST_404:EYE +"CREATURE:FORGOTTEN_BEAST_404:BRAIN +!CREATURE:FORGOTTEN_BEAST_404:LUNG +"CREATURE:FORGOTTEN_BEAST_404:HEART +"CREATURE:FORGOTTEN_BEAST_404:LIVER + CREATURE:FORGOTTEN_BEAST_404:GUT +$CREATURE:FORGOTTEN_BEAST_404:STOMACH +$CREATURE:FORGOTTEN_BEAST_404:GIZZARD +%CREATURE:FORGOTTEN_BEAST_404:PANCREAS +#CREATURE:FORGOTTEN_BEAST_404:SPLEEN +#CREATURE:FORGOTTEN_BEAST_404:KIDNEY +#CREATURE:FORGOTTEN_BEAST_405:MUSCLE + CREATURE:FORGOTTEN_BEAST_405:EYE +"CREATURE:FORGOTTEN_BEAST_405:BRAIN +!CREATURE:FORGOTTEN_BEAST_405:LUNG +"CREATURE:FORGOTTEN_BEAST_405:HEART +"CREATURE:FORGOTTEN_BEAST_405:LIVER + CREATURE:FORGOTTEN_BEAST_405:GUT +$CREATURE:FORGOTTEN_BEAST_405:STOMACH +$CREATURE:FORGOTTEN_BEAST_405:GIZZARD +%CREATURE:FORGOTTEN_BEAST_405:PANCREAS +#CREATURE:FORGOTTEN_BEAST_405:SPLEEN +#CREATURE:FORGOTTEN_BEAST_405:KIDNEY +#CREATURE:FORGOTTEN_BEAST_406:MUSCLE + CREATURE:FORGOTTEN_BEAST_406:EYE +"CREATURE:FORGOTTEN_BEAST_406:BRAIN +!CREATURE:FORGOTTEN_BEAST_406:LUNG +"CREATURE:FORGOTTEN_BEAST_406:HEART +"CREATURE:FORGOTTEN_BEAST_406:LIVER + CREATURE:FORGOTTEN_BEAST_406:GUT +$CREATURE:FORGOTTEN_BEAST_406:STOMACH +$CREATURE:FORGOTTEN_BEAST_406:GIZZARD +%CREATURE:FORGOTTEN_BEAST_406:PANCREAS +#CREATURE:FORGOTTEN_BEAST_406:SPLEEN +#CREATURE:FORGOTTEN_BEAST_406:KIDNEY +#CREATURE:FORGOTTEN_BEAST_407:MUSCLE + CREATURE:FORGOTTEN_BEAST_407:EYE +"CREATURE:FORGOTTEN_BEAST_407:BRAIN +!CREATURE:FORGOTTEN_BEAST_407:LUNG +"CREATURE:FORGOTTEN_BEAST_407:HEART +"CREATURE:FORGOTTEN_BEAST_407:LIVER + CREATURE:FORGOTTEN_BEAST_407:GUT +$CREATURE:FORGOTTEN_BEAST_407:STOMACH +$CREATURE:FORGOTTEN_BEAST_407:GIZZARD +%CREATURE:FORGOTTEN_BEAST_407:PANCREAS +#CREATURE:FORGOTTEN_BEAST_407:SPLEEN +#CREATURE:FORGOTTEN_BEAST_407:KIDNEY +#CREATURE:FORGOTTEN_BEAST_408:MUSCLE + CREATURE:FORGOTTEN_BEAST_408:EYE +"CREATURE:FORGOTTEN_BEAST_408:BRAIN +!CREATURE:FORGOTTEN_BEAST_408:LUNG +"CREATURE:FORGOTTEN_BEAST_408:HEART +"CREATURE:FORGOTTEN_BEAST_408:LIVER + CREATURE:FORGOTTEN_BEAST_408:GUT +$CREATURE:FORGOTTEN_BEAST_408:STOMACH +$CREATURE:FORGOTTEN_BEAST_408:GIZZARD +%CREATURE:FORGOTTEN_BEAST_408:PANCREAS +#CREATURE:FORGOTTEN_BEAST_408:SPLEEN +#CREATURE:FORGOTTEN_BEAST_408:KIDNEY +#CREATURE:FORGOTTEN_BEAST_409:MUSCLE + CREATURE:FORGOTTEN_BEAST_409:EYE +"CREATURE:FORGOTTEN_BEAST_409:BRAIN +!CREATURE:FORGOTTEN_BEAST_409:LUNG +"CREATURE:FORGOTTEN_BEAST_409:HEART +"CREATURE:FORGOTTEN_BEAST_409:LIVER + CREATURE:FORGOTTEN_BEAST_409:GUT +$CREATURE:FORGOTTEN_BEAST_409:STOMACH +$CREATURE:FORGOTTEN_BEAST_409:GIZZARD +%CREATURE:FORGOTTEN_BEAST_409:PANCREAS +#CREATURE:FORGOTTEN_BEAST_409:SPLEEN +#CREATURE:FORGOTTEN_BEAST_409:KIDNEY +#CREATURE:FORGOTTEN_BEAST_410:MUSCLE + CREATURE:FORGOTTEN_BEAST_410:EYE +"CREATURE:FORGOTTEN_BEAST_410:BRAIN +!CREATURE:FORGOTTEN_BEAST_410:LUNG +"CREATURE:FORGOTTEN_BEAST_410:HEART +"CREATURE:FORGOTTEN_BEAST_410:LIVER + CREATURE:FORGOTTEN_BEAST_410:GUT +$CREATURE:FORGOTTEN_BEAST_410:STOMACH +$CREATURE:FORGOTTEN_BEAST_410:GIZZARD +%CREATURE:FORGOTTEN_BEAST_410:PANCREAS +#CREATURE:FORGOTTEN_BEAST_410:SPLEEN +#CREATURE:FORGOTTEN_BEAST_410:KIDNEY +#CREATURE:FORGOTTEN_BEAST_411:MUSCLE + CREATURE:FORGOTTEN_BEAST_411:EYE +"CREATURE:FORGOTTEN_BEAST_411:BRAIN +!CREATURE:FORGOTTEN_BEAST_411:LUNG +"CREATURE:FORGOTTEN_BEAST_411:HEART +"CREATURE:FORGOTTEN_BEAST_411:LIVER + CREATURE:FORGOTTEN_BEAST_411:GUT +$CREATURE:FORGOTTEN_BEAST_411:STOMACH +$CREATURE:FORGOTTEN_BEAST_411:GIZZARD +%CREATURE:FORGOTTEN_BEAST_411:PANCREAS +#CREATURE:FORGOTTEN_BEAST_411:SPLEEN +#CREATURE:FORGOTTEN_BEAST_411:KIDNEY +#CREATURE:FORGOTTEN_BEAST_412:MUSCLE + CREATURE:FORGOTTEN_BEAST_412:EYE +"CREATURE:FORGOTTEN_BEAST_412:BRAIN +!CREATURE:FORGOTTEN_BEAST_412:LUNG +"CREATURE:FORGOTTEN_BEAST_412:HEART +"CREATURE:FORGOTTEN_BEAST_412:LIVER + CREATURE:FORGOTTEN_BEAST_412:GUT +$CREATURE:FORGOTTEN_BEAST_412:STOMACH +$CREATURE:FORGOTTEN_BEAST_412:GIZZARD +%CREATURE:FORGOTTEN_BEAST_412:PANCREAS +#CREATURE:FORGOTTEN_BEAST_412:SPLEEN +#CREATURE:FORGOTTEN_BEAST_412:KIDNEY +#CREATURE:FORGOTTEN_BEAST_413:MUSCLE + CREATURE:FORGOTTEN_BEAST_413:EYE +"CREATURE:FORGOTTEN_BEAST_413:BRAIN +!CREATURE:FORGOTTEN_BEAST_413:LUNG +"CREATURE:FORGOTTEN_BEAST_413:HEART +"CREATURE:FORGOTTEN_BEAST_413:LIVER + CREATURE:FORGOTTEN_BEAST_413:GUT +$CREATURE:FORGOTTEN_BEAST_413:STOMACH +$CREATURE:FORGOTTEN_BEAST_413:GIZZARD +%CREATURE:FORGOTTEN_BEAST_413:PANCREAS +#CREATURE:FORGOTTEN_BEAST_413:SPLEEN +#CREATURE:FORGOTTEN_BEAST_413:KIDNEY +#CREATURE:FORGOTTEN_BEAST_414:MUSCLE + CREATURE:FORGOTTEN_BEAST_414:EYE +"CREATURE:FORGOTTEN_BEAST_414:BRAIN +!CREATURE:FORGOTTEN_BEAST_414:LUNG +"CREATURE:FORGOTTEN_BEAST_414:HEART +"CREATURE:FORGOTTEN_BEAST_414:LIVER + CREATURE:FORGOTTEN_BEAST_414:GUT +$CREATURE:FORGOTTEN_BEAST_414:STOMACH +$CREATURE:FORGOTTEN_BEAST_414:GIZZARD +%CREATURE:FORGOTTEN_BEAST_414:PANCREAS +#CREATURE:FORGOTTEN_BEAST_414:SPLEEN +#CREATURE:FORGOTTEN_BEAST_414:KIDNEY +#CREATURE:FORGOTTEN_BEAST_416:MUSCLE + CREATURE:FORGOTTEN_BEAST_416:EYE +"CREATURE:FORGOTTEN_BEAST_416:BRAIN +!CREATURE:FORGOTTEN_BEAST_416:LUNG +"CREATURE:FORGOTTEN_BEAST_416:HEART +"CREATURE:FORGOTTEN_BEAST_416:LIVER + CREATURE:FORGOTTEN_BEAST_416:GUT +$CREATURE:FORGOTTEN_BEAST_416:STOMACH +$CREATURE:FORGOTTEN_BEAST_416:GIZZARD +%CREATURE:FORGOTTEN_BEAST_416:PANCREAS +#CREATURE:FORGOTTEN_BEAST_416:SPLEEN +#CREATURE:FORGOTTEN_BEAST_416:KIDNEY +#CREATURE:FORGOTTEN_BEAST_417:MUSCLE + CREATURE:FORGOTTEN_BEAST_417:EYE +"CREATURE:FORGOTTEN_BEAST_417:BRAIN +!CREATURE:FORGOTTEN_BEAST_417:LUNG +"CREATURE:FORGOTTEN_BEAST_417:HEART +"CREATURE:FORGOTTEN_BEAST_417:LIVER + CREATURE:FORGOTTEN_BEAST_417:GUT +$CREATURE:FORGOTTEN_BEAST_417:STOMACH +$CREATURE:FORGOTTEN_BEAST_417:GIZZARD +%CREATURE:FORGOTTEN_BEAST_417:PANCREAS +#CREATURE:FORGOTTEN_BEAST_417:SPLEEN +#CREATURE:FORGOTTEN_BEAST_417:KIDNEY +#CREATURE:FORGOTTEN_BEAST_418:MUSCLE + CREATURE:FORGOTTEN_BEAST_418:EYE +"CREATURE:FORGOTTEN_BEAST_418:BRAIN +!CREATURE:FORGOTTEN_BEAST_418:LUNG +"CREATURE:FORGOTTEN_BEAST_418:HEART +"CREATURE:FORGOTTEN_BEAST_418:LIVER + CREATURE:FORGOTTEN_BEAST_418:GUT +$CREATURE:FORGOTTEN_BEAST_418:STOMACH +$CREATURE:FORGOTTEN_BEAST_418:GIZZARD +%CREATURE:FORGOTTEN_BEAST_418:PANCREAS +#CREATURE:FORGOTTEN_BEAST_418:SPLEEN +#CREATURE:FORGOTTEN_BEAST_418:KIDNEY +#CREATURE:FORGOTTEN_BEAST_420:MUSCLE + CREATURE:FORGOTTEN_BEAST_420:EYE +"CREATURE:FORGOTTEN_BEAST_420:BRAIN +!CREATURE:FORGOTTEN_BEAST_420:LUNG +"CREATURE:FORGOTTEN_BEAST_420:HEART +"CREATURE:FORGOTTEN_BEAST_420:LIVER + CREATURE:FORGOTTEN_BEAST_420:GUT +$CREATURE:FORGOTTEN_BEAST_420:STOMACH +$CREATURE:FORGOTTEN_BEAST_420:GIZZARD +%CREATURE:FORGOTTEN_BEAST_420:PANCREAS +#CREATURE:FORGOTTEN_BEAST_420:SPLEEN +#CREATURE:FORGOTTEN_BEAST_420:KIDNEY +#CREATURE:FORGOTTEN_BEAST_421:MUSCLE + CREATURE:FORGOTTEN_BEAST_421:EYE +"CREATURE:FORGOTTEN_BEAST_421:BRAIN +!CREATURE:FORGOTTEN_BEAST_421:LUNG +"CREATURE:FORGOTTEN_BEAST_421:HEART +"CREATURE:FORGOTTEN_BEAST_421:LIVER + CREATURE:FORGOTTEN_BEAST_421:GUT +$CREATURE:FORGOTTEN_BEAST_421:STOMACH +$CREATURE:FORGOTTEN_BEAST_421:GIZZARD +%CREATURE:FORGOTTEN_BEAST_421:PANCREAS +#CREATURE:FORGOTTEN_BEAST_421:SPLEEN +#CREATURE:FORGOTTEN_BEAST_421:KIDNEY +#CREATURE:FORGOTTEN_BEAST_422:MUSCLE + CREATURE:FORGOTTEN_BEAST_422:EYE +"CREATURE:FORGOTTEN_BEAST_422:BRAIN +!CREATURE:FORGOTTEN_BEAST_422:LUNG +"CREATURE:FORGOTTEN_BEAST_422:HEART +"CREATURE:FORGOTTEN_BEAST_422:LIVER + CREATURE:FORGOTTEN_BEAST_422:GUT +$CREATURE:FORGOTTEN_BEAST_422:STOMACH +$CREATURE:FORGOTTEN_BEAST_422:GIZZARD +%CREATURE:FORGOTTEN_BEAST_422:PANCREAS +#CREATURE:FORGOTTEN_BEAST_422:SPLEEN +#CREATURE:FORGOTTEN_BEAST_422:KIDNEY +#CREATURE:FORGOTTEN_BEAST_423:MUSCLE + CREATURE:FORGOTTEN_BEAST_423:EYE +"CREATURE:FORGOTTEN_BEAST_423:BRAIN +!CREATURE:FORGOTTEN_BEAST_423:LUNG +"CREATURE:FORGOTTEN_BEAST_423:HEART +"CREATURE:FORGOTTEN_BEAST_423:LIVER + CREATURE:FORGOTTEN_BEAST_423:GUT +$CREATURE:FORGOTTEN_BEAST_423:STOMACH +$CREATURE:FORGOTTEN_BEAST_423:GIZZARD +%CREATURE:FORGOTTEN_BEAST_423:PANCREAS +#CREATURE:FORGOTTEN_BEAST_423:SPLEEN +#CREATURE:FORGOTTEN_BEAST_423:KIDNEY +#CREATURE:FORGOTTEN_BEAST_424:MUSCLE + CREATURE:FORGOTTEN_BEAST_424:EYE +"CREATURE:FORGOTTEN_BEAST_424:BRAIN +!CREATURE:FORGOTTEN_BEAST_424:LUNG +"CREATURE:FORGOTTEN_BEAST_424:HEART +"CREATURE:FORGOTTEN_BEAST_424:LIVER + CREATURE:FORGOTTEN_BEAST_424:GUT +$CREATURE:FORGOTTEN_BEAST_424:STOMACH +$CREATURE:FORGOTTEN_BEAST_424:GIZZARD +%CREATURE:FORGOTTEN_BEAST_424:PANCREAS +#CREATURE:FORGOTTEN_BEAST_424:SPLEEN +#CREATURE:FORGOTTEN_BEAST_424:KIDNEY +#CREATURE:FORGOTTEN_BEAST_427:MUSCLE + CREATURE:FORGOTTEN_BEAST_427:EYE +"CREATURE:FORGOTTEN_BEAST_427:BRAIN +!CREATURE:FORGOTTEN_BEAST_427:LUNG +"CREATURE:FORGOTTEN_BEAST_427:HEART +"CREATURE:FORGOTTEN_BEAST_427:LIVER + CREATURE:FORGOTTEN_BEAST_427:GUT +$CREATURE:FORGOTTEN_BEAST_427:STOMACH +$CREATURE:FORGOTTEN_BEAST_427:GIZZARD +%CREATURE:FORGOTTEN_BEAST_427:PANCREAS +#CREATURE:FORGOTTEN_BEAST_427:SPLEEN +#CREATURE:FORGOTTEN_BEAST_427:KIDNEY +#CREATURE:FORGOTTEN_BEAST_429:MUSCLE + CREATURE:FORGOTTEN_BEAST_429:EYE +"CREATURE:FORGOTTEN_BEAST_429:BRAIN +!CREATURE:FORGOTTEN_BEAST_429:LUNG +"CREATURE:FORGOTTEN_BEAST_429:HEART +"CREATURE:FORGOTTEN_BEAST_429:LIVER + CREATURE:FORGOTTEN_BEAST_429:GUT +$CREATURE:FORGOTTEN_BEAST_429:STOMACH +$CREATURE:FORGOTTEN_BEAST_429:GIZZARD +%CREATURE:FORGOTTEN_BEAST_429:PANCREAS +#CREATURE:FORGOTTEN_BEAST_429:SPLEEN +#CREATURE:FORGOTTEN_BEAST_429:KIDNEY +#CREATURE:FORGOTTEN_BEAST_430:MUSCLE + CREATURE:FORGOTTEN_BEAST_430:EYE +"CREATURE:FORGOTTEN_BEAST_430:BRAIN +!CREATURE:FORGOTTEN_BEAST_430:LUNG +"CREATURE:FORGOTTEN_BEAST_430:HEART +"CREATURE:FORGOTTEN_BEAST_430:LIVER + CREATURE:FORGOTTEN_BEAST_430:GUT +$CREATURE:FORGOTTEN_BEAST_430:STOMACH +$CREATURE:FORGOTTEN_BEAST_430:GIZZARD +%CREATURE:FORGOTTEN_BEAST_430:PANCREAS +#CREATURE:FORGOTTEN_BEAST_430:SPLEEN +#CREATURE:FORGOTTEN_BEAST_430:KIDNEY +#CREATURE:FORGOTTEN_BEAST_432:MUSCLE + CREATURE:FORGOTTEN_BEAST_432:EYE +"CREATURE:FORGOTTEN_BEAST_432:BRAIN +!CREATURE:FORGOTTEN_BEAST_432:LUNG +"CREATURE:FORGOTTEN_BEAST_432:HEART +"CREATURE:FORGOTTEN_BEAST_432:LIVER + CREATURE:FORGOTTEN_BEAST_432:GUT +$CREATURE:FORGOTTEN_BEAST_432:STOMACH +$CREATURE:FORGOTTEN_BEAST_432:GIZZARD +%CREATURE:FORGOTTEN_BEAST_432:PANCREAS +#CREATURE:FORGOTTEN_BEAST_432:SPLEEN +#CREATURE:FORGOTTEN_BEAST_432:KIDNEY +#CREATURE:FORGOTTEN_BEAST_433:MUSCLE + CREATURE:FORGOTTEN_BEAST_433:EYE +"CREATURE:FORGOTTEN_BEAST_433:BRAIN +!CREATURE:FORGOTTEN_BEAST_433:LUNG +"CREATURE:FORGOTTEN_BEAST_433:HEART +"CREATURE:FORGOTTEN_BEAST_433:LIVER + CREATURE:FORGOTTEN_BEAST_433:GUT +$CREATURE:FORGOTTEN_BEAST_433:STOMACH +$CREATURE:FORGOTTEN_BEAST_433:GIZZARD +%CREATURE:FORGOTTEN_BEAST_433:PANCREAS +#CREATURE:FORGOTTEN_BEAST_433:SPLEEN +#CREATURE:FORGOTTEN_BEAST_433:KIDNEY +#CREATURE:FORGOTTEN_BEAST_434:MUSCLE + CREATURE:FORGOTTEN_BEAST_434:EYE +"CREATURE:FORGOTTEN_BEAST_434:BRAIN +!CREATURE:FORGOTTEN_BEAST_434:LUNG +"CREATURE:FORGOTTEN_BEAST_434:HEART +"CREATURE:FORGOTTEN_BEAST_434:LIVER + CREATURE:FORGOTTEN_BEAST_434:GUT +$CREATURE:FORGOTTEN_BEAST_434:STOMACH +$CREATURE:FORGOTTEN_BEAST_434:GIZZARD +%CREATURE:FORGOTTEN_BEAST_434:PANCREAS +#CREATURE:FORGOTTEN_BEAST_434:SPLEEN +#CREATURE:FORGOTTEN_BEAST_434:KIDNEY +#CREATURE:FORGOTTEN_BEAST_435:MUSCLE + CREATURE:FORGOTTEN_BEAST_435:EYE +"CREATURE:FORGOTTEN_BEAST_435:BRAIN +!CREATURE:FORGOTTEN_BEAST_435:LUNG +"CREATURE:FORGOTTEN_BEAST_435:HEART +"CREATURE:FORGOTTEN_BEAST_435:LIVER + CREATURE:FORGOTTEN_BEAST_435:GUT +$CREATURE:FORGOTTEN_BEAST_435:STOMACH +$CREATURE:FORGOTTEN_BEAST_435:GIZZARD +%CREATURE:FORGOTTEN_BEAST_435:PANCREAS +#CREATURE:FORGOTTEN_BEAST_435:SPLEEN +#CREATURE:FORGOTTEN_BEAST_435:KIDNEY +#CREATURE:FORGOTTEN_BEAST_436:MUSCLE + CREATURE:FORGOTTEN_BEAST_436:EYE +"CREATURE:FORGOTTEN_BEAST_436:BRAIN +!CREATURE:FORGOTTEN_BEAST_436:LUNG +"CREATURE:FORGOTTEN_BEAST_436:HEART +"CREATURE:FORGOTTEN_BEAST_436:LIVER + CREATURE:FORGOTTEN_BEAST_436:GUT +$CREATURE:FORGOTTEN_BEAST_436:STOMACH +$CREATURE:FORGOTTEN_BEAST_436:GIZZARD +%CREATURE:FORGOTTEN_BEAST_436:PANCREAS +#CREATURE:FORGOTTEN_BEAST_436:SPLEEN +#CREATURE:FORGOTTEN_BEAST_436:KIDNEY +#CREATURE:FORGOTTEN_BEAST_437:MUSCLE + CREATURE:FORGOTTEN_BEAST_437:EYE +"CREATURE:FORGOTTEN_BEAST_437:BRAIN +!CREATURE:FORGOTTEN_BEAST_437:LUNG +"CREATURE:FORGOTTEN_BEAST_437:HEART +"CREATURE:FORGOTTEN_BEAST_437:LIVER + CREATURE:FORGOTTEN_BEAST_437:GUT +$CREATURE:FORGOTTEN_BEAST_437:STOMACH +$CREATURE:FORGOTTEN_BEAST_437:GIZZARD +%CREATURE:FORGOTTEN_BEAST_437:PANCREAS +#CREATURE:FORGOTTEN_BEAST_437:SPLEEN +#CREATURE:FORGOTTEN_BEAST_437:KIDNEY +#CREATURE:FORGOTTEN_BEAST_438:MUSCLE + CREATURE:FORGOTTEN_BEAST_438:EYE +"CREATURE:FORGOTTEN_BEAST_438:BRAIN +!CREATURE:FORGOTTEN_BEAST_438:LUNG +"CREATURE:FORGOTTEN_BEAST_438:HEART +"CREATURE:FORGOTTEN_BEAST_438:LIVER + CREATURE:FORGOTTEN_BEAST_438:GUT +$CREATURE:FORGOTTEN_BEAST_438:STOMACH +$CREATURE:FORGOTTEN_BEAST_438:GIZZARD +%CREATURE:FORGOTTEN_BEAST_438:PANCREAS +#CREATURE:FORGOTTEN_BEAST_438:SPLEEN +#CREATURE:FORGOTTEN_BEAST_438:KIDNEY +#CREATURE:FORGOTTEN_BEAST_440:MUSCLE + CREATURE:FORGOTTEN_BEAST_440:EYE +"CREATURE:FORGOTTEN_BEAST_440:BRAIN +!CREATURE:FORGOTTEN_BEAST_440:LUNG +"CREATURE:FORGOTTEN_BEAST_440:HEART +"CREATURE:FORGOTTEN_BEAST_440:LIVER + CREATURE:FORGOTTEN_BEAST_440:GUT +$CREATURE:FORGOTTEN_BEAST_440:STOMACH +$CREATURE:FORGOTTEN_BEAST_440:GIZZARD +%CREATURE:FORGOTTEN_BEAST_440:PANCREAS +#CREATURE:FORGOTTEN_BEAST_440:SPLEEN +#CREATURE:FORGOTTEN_BEAST_440:KIDNEY +#CREATURE:FORGOTTEN_BEAST_441:MUSCLE + CREATURE:FORGOTTEN_BEAST_441:EYE +"CREATURE:FORGOTTEN_BEAST_441:BRAIN +!CREATURE:FORGOTTEN_BEAST_441:LUNG +"CREATURE:FORGOTTEN_BEAST_441:HEART +"CREATURE:FORGOTTEN_BEAST_441:LIVER + CREATURE:FORGOTTEN_BEAST_441:GUT +$CREATURE:FORGOTTEN_BEAST_441:STOMACH +$CREATURE:FORGOTTEN_BEAST_441:GIZZARD +%CREATURE:FORGOTTEN_BEAST_441:PANCREAS +#CREATURE:FORGOTTEN_BEAST_441:SPLEEN +#CREATURE:FORGOTTEN_BEAST_441:KIDNEY +#CREATURE:FORGOTTEN_BEAST_442:MUSCLE + CREATURE:FORGOTTEN_BEAST_442:EYE +"CREATURE:FORGOTTEN_BEAST_442:BRAIN +!CREATURE:FORGOTTEN_BEAST_442:LUNG +"CREATURE:FORGOTTEN_BEAST_442:HEART +"CREATURE:FORGOTTEN_BEAST_442:LIVER + CREATURE:FORGOTTEN_BEAST_442:GUT +$CREATURE:FORGOTTEN_BEAST_442:STOMACH +$CREATURE:FORGOTTEN_BEAST_442:GIZZARD +%CREATURE:FORGOTTEN_BEAST_442:PANCREAS +#CREATURE:FORGOTTEN_BEAST_442:SPLEEN +#CREATURE:FORGOTTEN_BEAST_442:KIDNEY +#CREATURE:FORGOTTEN_BEAST_444:MUSCLE + CREATURE:FORGOTTEN_BEAST_444:EYE +"CREATURE:FORGOTTEN_BEAST_444:BRAIN +!CREATURE:FORGOTTEN_BEAST_444:LUNG +"CREATURE:FORGOTTEN_BEAST_444:HEART +"CREATURE:FORGOTTEN_BEAST_444:LIVER + CREATURE:FORGOTTEN_BEAST_444:GUT +$CREATURE:FORGOTTEN_BEAST_444:STOMACH +$CREATURE:FORGOTTEN_BEAST_444:GIZZARD +%CREATURE:FORGOTTEN_BEAST_444:PANCREAS +#CREATURE:FORGOTTEN_BEAST_444:SPLEEN +#CREATURE:FORGOTTEN_BEAST_444:KIDNEY +#CREATURE:FORGOTTEN_BEAST_446:MUSCLE + CREATURE:FORGOTTEN_BEAST_446:EYE +"CREATURE:FORGOTTEN_BEAST_446:BRAIN +!CREATURE:FORGOTTEN_BEAST_446:LUNG +"CREATURE:FORGOTTEN_BEAST_446:HEART +"CREATURE:FORGOTTEN_BEAST_446:LIVER + CREATURE:FORGOTTEN_BEAST_446:GUT +$CREATURE:FORGOTTEN_BEAST_446:STOMACH +$CREATURE:FORGOTTEN_BEAST_446:GIZZARD +%CREATURE:FORGOTTEN_BEAST_446:PANCREAS +#CREATURE:FORGOTTEN_BEAST_446:SPLEEN +#CREATURE:FORGOTTEN_BEAST_446:KIDNEY +#CREATURE:FORGOTTEN_BEAST_447:MUSCLE + CREATURE:FORGOTTEN_BEAST_447:EYE +"CREATURE:FORGOTTEN_BEAST_447:BRAIN +!CREATURE:FORGOTTEN_BEAST_447:LUNG +"CREATURE:FORGOTTEN_BEAST_447:HEART +"CREATURE:FORGOTTEN_BEAST_447:LIVER + CREATURE:FORGOTTEN_BEAST_447:GUT +$CREATURE:FORGOTTEN_BEAST_447:STOMACH +$CREATURE:FORGOTTEN_BEAST_447:GIZZARD +%CREATURE:FORGOTTEN_BEAST_447:PANCREAS +#CREATURE:FORGOTTEN_BEAST_447:SPLEEN +#CREATURE:FORGOTTEN_BEAST_447:KIDNEY +#CREATURE:FORGOTTEN_BEAST_448:MUSCLE + CREATURE:FORGOTTEN_BEAST_448:EYE +"CREATURE:FORGOTTEN_BEAST_448:BRAIN +!CREATURE:FORGOTTEN_BEAST_448:LUNG +"CREATURE:FORGOTTEN_BEAST_448:HEART +"CREATURE:FORGOTTEN_BEAST_448:LIVER + CREATURE:FORGOTTEN_BEAST_448:GUT +$CREATURE:FORGOTTEN_BEAST_448:STOMACH +$CREATURE:FORGOTTEN_BEAST_448:GIZZARD +%CREATURE:FORGOTTEN_BEAST_448:PANCREAS +#CREATURE:FORGOTTEN_BEAST_448:SPLEEN +#CREATURE:FORGOTTEN_BEAST_448:KIDNEY +#CREATURE:FORGOTTEN_BEAST_449:MUSCLE + CREATURE:FORGOTTEN_BEAST_449:EYE +"CREATURE:FORGOTTEN_BEAST_449:BRAIN +!CREATURE:FORGOTTEN_BEAST_449:LUNG +"CREATURE:FORGOTTEN_BEAST_449:HEART +"CREATURE:FORGOTTEN_BEAST_449:LIVER + CREATURE:FORGOTTEN_BEAST_449:GUT +$CREATURE:FORGOTTEN_BEAST_449:STOMACH +$CREATURE:FORGOTTEN_BEAST_449:GIZZARD +%CREATURE:FORGOTTEN_BEAST_449:PANCREAS +#CREATURE:FORGOTTEN_BEAST_449:SPLEEN +#CREATURE:FORGOTTEN_BEAST_449:KIDNEY +#CREATURE:FORGOTTEN_BEAST_450:MUSCLE + CREATURE:FORGOTTEN_BEAST_450:EYE +"CREATURE:FORGOTTEN_BEAST_450:BRAIN +!CREATURE:FORGOTTEN_BEAST_450:LUNG +"CREATURE:FORGOTTEN_BEAST_450:HEART +"CREATURE:FORGOTTEN_BEAST_450:LIVER + CREATURE:FORGOTTEN_BEAST_450:GUT +$CREATURE:FORGOTTEN_BEAST_450:STOMACH +$CREATURE:FORGOTTEN_BEAST_450:GIZZARD +%CREATURE:FORGOTTEN_BEAST_450:PANCREAS +#CREATURE:FORGOTTEN_BEAST_450:SPLEEN +#CREATURE:FORGOTTEN_BEAST_450:KIDNEY +#CREATURE:FORGOTTEN_BEAST_451:MUSCLE + CREATURE:FORGOTTEN_BEAST_451:EYE +"CREATURE:FORGOTTEN_BEAST_451:BRAIN +!CREATURE:FORGOTTEN_BEAST_451:LUNG +"CREATURE:FORGOTTEN_BEAST_451:HEART +"CREATURE:FORGOTTEN_BEAST_451:LIVER + CREATURE:FORGOTTEN_BEAST_451:GUT +$CREATURE:FORGOTTEN_BEAST_451:STOMACH +$CREATURE:FORGOTTEN_BEAST_451:GIZZARD +%CREATURE:FORGOTTEN_BEAST_451:PANCREAS +#CREATURE:FORGOTTEN_BEAST_451:SPLEEN +#CREATURE:FORGOTTEN_BEAST_451:KIDNEY +#CREATURE:FORGOTTEN_BEAST_453:MUSCLE + CREATURE:FORGOTTEN_BEAST_453:EYE +"CREATURE:FORGOTTEN_BEAST_453:BRAIN +!CREATURE:FORGOTTEN_BEAST_453:LUNG +"CREATURE:FORGOTTEN_BEAST_453:HEART +"CREATURE:FORGOTTEN_BEAST_453:LIVER + CREATURE:FORGOTTEN_BEAST_453:GUT +$CREATURE:FORGOTTEN_BEAST_453:STOMACH +$CREATURE:FORGOTTEN_BEAST_453:GIZZARD +%CREATURE:FORGOTTEN_BEAST_453:PANCREAS +#CREATURE:FORGOTTEN_BEAST_453:SPLEEN +#CREATURE:FORGOTTEN_BEAST_453:KIDNEY +#CREATURE:FORGOTTEN_BEAST_454:MUSCLE + CREATURE:FORGOTTEN_BEAST_454:EYE +"CREATURE:FORGOTTEN_BEAST_454:BRAIN +!CREATURE:FORGOTTEN_BEAST_454:LUNG +"CREATURE:FORGOTTEN_BEAST_454:HEART +"CREATURE:FORGOTTEN_BEAST_454:LIVER + CREATURE:FORGOTTEN_BEAST_454:GUT +$CREATURE:FORGOTTEN_BEAST_454:STOMACH +$CREATURE:FORGOTTEN_BEAST_454:GIZZARD +%CREATURE:FORGOTTEN_BEAST_454:PANCREAS +#CREATURE:FORGOTTEN_BEAST_454:SPLEEN +#CREATURE:FORGOTTEN_BEAST_454:KIDNEY +#CREATURE:FORGOTTEN_BEAST_455:MUSCLE + CREATURE:FORGOTTEN_BEAST_455:EYE +"CREATURE:FORGOTTEN_BEAST_455:BRAIN +!CREATURE:FORGOTTEN_BEAST_455:LUNG +"CREATURE:FORGOTTEN_BEAST_455:HEART +"CREATURE:FORGOTTEN_BEAST_455:LIVER + CREATURE:FORGOTTEN_BEAST_455:GUT +$CREATURE:FORGOTTEN_BEAST_455:STOMACH +$CREATURE:FORGOTTEN_BEAST_455:GIZZARD +%CREATURE:FORGOTTEN_BEAST_455:PANCREAS +#CREATURE:FORGOTTEN_BEAST_455:SPLEEN +#CREATURE:FORGOTTEN_BEAST_455:KIDNEY +#CREATURE:FORGOTTEN_BEAST_457:MUSCLE + CREATURE:FORGOTTEN_BEAST_457:EYE +"CREATURE:FORGOTTEN_BEAST_457:BRAIN +!CREATURE:FORGOTTEN_BEAST_457:LUNG +"CREATURE:FORGOTTEN_BEAST_457:HEART +"CREATURE:FORGOTTEN_BEAST_457:LIVER + CREATURE:FORGOTTEN_BEAST_457:GUT +$CREATURE:FORGOTTEN_BEAST_457:STOMACH +$CREATURE:FORGOTTEN_BEAST_457:GIZZARD +%CREATURE:FORGOTTEN_BEAST_457:PANCREAS +#CREATURE:FORGOTTEN_BEAST_457:SPLEEN +#CREATURE:FORGOTTEN_BEAST_457:KIDNEY +#CREATURE:FORGOTTEN_BEAST_459:MUSCLE + CREATURE:FORGOTTEN_BEAST_459:EYE +"CREATURE:FORGOTTEN_BEAST_459:BRAIN +!CREATURE:FORGOTTEN_BEAST_459:LUNG +"CREATURE:FORGOTTEN_BEAST_459:HEART +"CREATURE:FORGOTTEN_BEAST_459:LIVER + CREATURE:FORGOTTEN_BEAST_459:GUT +$CREATURE:FORGOTTEN_BEAST_459:STOMACH +$CREATURE:FORGOTTEN_BEAST_459:GIZZARD +%CREATURE:FORGOTTEN_BEAST_459:PANCREAS +#CREATURE:FORGOTTEN_BEAST_459:SPLEEN +#CREATURE:FORGOTTEN_BEAST_459:KIDNEY +#CREATURE:FORGOTTEN_BEAST_461:MUSCLE + CREATURE:FORGOTTEN_BEAST_461:EYE +"CREATURE:FORGOTTEN_BEAST_461:BRAIN +!CREATURE:FORGOTTEN_BEAST_461:LUNG +"CREATURE:FORGOTTEN_BEAST_461:HEART +"CREATURE:FORGOTTEN_BEAST_461:LIVER + CREATURE:FORGOTTEN_BEAST_461:GUT +$CREATURE:FORGOTTEN_BEAST_461:STOMACH +$CREATURE:FORGOTTEN_BEAST_461:GIZZARD +%CREATURE:FORGOTTEN_BEAST_461:PANCREAS +#CREATURE:FORGOTTEN_BEAST_461:SPLEEN +#CREATURE:FORGOTTEN_BEAST_461:KIDNEY +#CREATURE:FORGOTTEN_BEAST_462:MUSCLE + CREATURE:FORGOTTEN_BEAST_462:EYE +"CREATURE:FORGOTTEN_BEAST_462:BRAIN +!CREATURE:FORGOTTEN_BEAST_462:LUNG +"CREATURE:FORGOTTEN_BEAST_462:HEART +"CREATURE:FORGOTTEN_BEAST_462:LIVER + CREATURE:FORGOTTEN_BEAST_462:GUT +$CREATURE:FORGOTTEN_BEAST_462:STOMACH +$CREATURE:FORGOTTEN_BEAST_462:GIZZARD +%CREATURE:FORGOTTEN_BEAST_462:PANCREAS +#CREATURE:FORGOTTEN_BEAST_462:SPLEEN +#CREATURE:FORGOTTEN_BEAST_462:KIDNEY +#CREATURE:FORGOTTEN_BEAST_463:MUSCLE + CREATURE:FORGOTTEN_BEAST_463:EYE +"CREATURE:FORGOTTEN_BEAST_463:BRAIN +!CREATURE:FORGOTTEN_BEAST_463:LUNG +"CREATURE:FORGOTTEN_BEAST_463:HEART +"CREATURE:FORGOTTEN_BEAST_463:LIVER + CREATURE:FORGOTTEN_BEAST_463:GUT +$CREATURE:FORGOTTEN_BEAST_463:STOMACH +$CREATURE:FORGOTTEN_BEAST_463:GIZZARD +%CREATURE:FORGOTTEN_BEAST_463:PANCREAS +#CREATURE:FORGOTTEN_BEAST_463:SPLEEN +#CREATURE:FORGOTTEN_BEAST_463:KIDNEY +#CREATURE:FORGOTTEN_BEAST_465:MUSCLE + CREATURE:FORGOTTEN_BEAST_465:EYE +"CREATURE:FORGOTTEN_BEAST_465:BRAIN +!CREATURE:FORGOTTEN_BEAST_465:LUNG +"CREATURE:FORGOTTEN_BEAST_465:HEART +"CREATURE:FORGOTTEN_BEAST_465:LIVER + CREATURE:FORGOTTEN_BEAST_465:GUT +$CREATURE:FORGOTTEN_BEAST_465:STOMACH +$CREATURE:FORGOTTEN_BEAST_465:GIZZARD +%CREATURE:FORGOTTEN_BEAST_465:PANCREAS +#CREATURE:FORGOTTEN_BEAST_465:SPLEEN +#CREATURE:FORGOTTEN_BEAST_465:KIDNEY +#CREATURE:FORGOTTEN_BEAST_466:MUSCLE + CREATURE:FORGOTTEN_BEAST_466:EYE +"CREATURE:FORGOTTEN_BEAST_466:BRAIN +!CREATURE:FORGOTTEN_BEAST_466:LUNG +"CREATURE:FORGOTTEN_BEAST_466:HEART +"CREATURE:FORGOTTEN_BEAST_466:LIVER + CREATURE:FORGOTTEN_BEAST_466:GUT +$CREATURE:FORGOTTEN_BEAST_466:STOMACH +$CREATURE:FORGOTTEN_BEAST_466:GIZZARD +%CREATURE:FORGOTTEN_BEAST_466:PANCREAS +#CREATURE:FORGOTTEN_BEAST_466:SPLEEN +#CREATURE:FORGOTTEN_BEAST_466:KIDNEY +#CREATURE:FORGOTTEN_BEAST_468:MUSCLE + CREATURE:FORGOTTEN_BEAST_468:EYE +"CREATURE:FORGOTTEN_BEAST_468:BRAIN +!CREATURE:FORGOTTEN_BEAST_468:LUNG +"CREATURE:FORGOTTEN_BEAST_468:HEART +"CREATURE:FORGOTTEN_BEAST_468:LIVER + CREATURE:FORGOTTEN_BEAST_468:GUT +$CREATURE:FORGOTTEN_BEAST_468:STOMACH +$CREATURE:FORGOTTEN_BEAST_468:GIZZARD +%CREATURE:FORGOTTEN_BEAST_468:PANCREAS +#CREATURE:FORGOTTEN_BEAST_468:SPLEEN +#CREATURE:FORGOTTEN_BEAST_468:KIDNEY +#CREATURE:FORGOTTEN_BEAST_469:MUSCLE + CREATURE:FORGOTTEN_BEAST_469:EYE +"CREATURE:FORGOTTEN_BEAST_469:BRAIN +!CREATURE:FORGOTTEN_BEAST_469:LUNG +"CREATURE:FORGOTTEN_BEAST_469:HEART +"CREATURE:FORGOTTEN_BEAST_469:LIVER + CREATURE:FORGOTTEN_BEAST_469:GUT +$CREATURE:FORGOTTEN_BEAST_469:STOMACH +$CREATURE:FORGOTTEN_BEAST_469:GIZZARD +%CREATURE:FORGOTTEN_BEAST_469:PANCREAS +#CREATURE:FORGOTTEN_BEAST_469:SPLEEN +#CREATURE:FORGOTTEN_BEAST_469:KIDNEY +#CREATURE:FORGOTTEN_BEAST_470:MUSCLE + CREATURE:FORGOTTEN_BEAST_470:EYE +"CREATURE:FORGOTTEN_BEAST_470:BRAIN +!CREATURE:FORGOTTEN_BEAST_470:LUNG +"CREATURE:FORGOTTEN_BEAST_470:HEART +"CREATURE:FORGOTTEN_BEAST_470:LIVER + CREATURE:FORGOTTEN_BEAST_470:GUT +$CREATURE:FORGOTTEN_BEAST_470:STOMACH +$CREATURE:FORGOTTEN_BEAST_470:GIZZARD +%CREATURE:FORGOTTEN_BEAST_470:PANCREAS +#CREATURE:FORGOTTEN_BEAST_470:SPLEEN +#CREATURE:FORGOTTEN_BEAST_470:KIDNEY +#CREATURE:FORGOTTEN_BEAST_471:MUSCLE + CREATURE:FORGOTTEN_BEAST_471:EYE +"CREATURE:FORGOTTEN_BEAST_471:BRAIN +!CREATURE:FORGOTTEN_BEAST_471:LUNG +"CREATURE:FORGOTTEN_BEAST_471:HEART +"CREATURE:FORGOTTEN_BEAST_471:LIVER + CREATURE:FORGOTTEN_BEAST_471:GUT +$CREATURE:FORGOTTEN_BEAST_471:STOMACH +$CREATURE:FORGOTTEN_BEAST_471:GIZZARD +%CREATURE:FORGOTTEN_BEAST_471:PANCREAS +#CREATURE:FORGOTTEN_BEAST_471:SPLEEN +#CREATURE:FORGOTTEN_BEAST_471:KIDNEY +#CREATURE:FORGOTTEN_BEAST_472:MUSCLE + CREATURE:FORGOTTEN_BEAST_472:EYE +"CREATURE:FORGOTTEN_BEAST_472:BRAIN +!CREATURE:FORGOTTEN_BEAST_472:LUNG +"CREATURE:FORGOTTEN_BEAST_472:HEART +"CREATURE:FORGOTTEN_BEAST_472:LIVER + CREATURE:FORGOTTEN_BEAST_472:GUT +$CREATURE:FORGOTTEN_BEAST_472:STOMACH +$CREATURE:FORGOTTEN_BEAST_472:GIZZARD +%CREATURE:FORGOTTEN_BEAST_472:PANCREAS +#CREATURE:FORGOTTEN_BEAST_472:SPLEEN +#CREATURE:FORGOTTEN_BEAST_472:KIDNEY +#CREATURE:FORGOTTEN_BEAST_474:MUSCLE + CREATURE:FORGOTTEN_BEAST_474:EYE +"CREATURE:FORGOTTEN_BEAST_474:BRAIN +!CREATURE:FORGOTTEN_BEAST_474:LUNG +"CREATURE:FORGOTTEN_BEAST_474:HEART +"CREATURE:FORGOTTEN_BEAST_474:LIVER + CREATURE:FORGOTTEN_BEAST_474:GUT +$CREATURE:FORGOTTEN_BEAST_474:STOMACH +$CREATURE:FORGOTTEN_BEAST_474:GIZZARD +%CREATURE:FORGOTTEN_BEAST_474:PANCREAS +#CREATURE:FORGOTTEN_BEAST_474:SPLEEN +#CREATURE:FORGOTTEN_BEAST_474:KIDNEY +#CREATURE:FORGOTTEN_BEAST_475:MUSCLE + CREATURE:FORGOTTEN_BEAST_475:EYE +"CREATURE:FORGOTTEN_BEAST_475:BRAIN +!CREATURE:FORGOTTEN_BEAST_475:LUNG +"CREATURE:FORGOTTEN_BEAST_475:HEART +"CREATURE:FORGOTTEN_BEAST_475:LIVER + CREATURE:FORGOTTEN_BEAST_475:GUT +$CREATURE:FORGOTTEN_BEAST_475:STOMACH +$CREATURE:FORGOTTEN_BEAST_475:GIZZARD +%CREATURE:FORGOTTEN_BEAST_475:PANCREAS +#CREATURE:FORGOTTEN_BEAST_475:SPLEEN +#CREATURE:FORGOTTEN_BEAST_475:KIDNEY +#CREATURE:FORGOTTEN_BEAST_476:MUSCLE + CREATURE:FORGOTTEN_BEAST_476:EYE +"CREATURE:FORGOTTEN_BEAST_476:BRAIN +!CREATURE:FORGOTTEN_BEAST_476:LUNG +"CREATURE:FORGOTTEN_BEAST_476:HEART +"CREATURE:FORGOTTEN_BEAST_476:LIVER + CREATURE:FORGOTTEN_BEAST_476:GUT +$CREATURE:FORGOTTEN_BEAST_476:STOMACH +$CREATURE:FORGOTTEN_BEAST_476:GIZZARD +%CREATURE:FORGOTTEN_BEAST_476:PANCREAS +#CREATURE:FORGOTTEN_BEAST_476:SPLEEN +#CREATURE:FORGOTTEN_BEAST_476:KIDNEY +#CREATURE:FORGOTTEN_BEAST_478:MUSCLE + CREATURE:FORGOTTEN_BEAST_478:EYE +"CREATURE:FORGOTTEN_BEAST_478:BRAIN +!CREATURE:FORGOTTEN_BEAST_478:LUNG +"CREATURE:FORGOTTEN_BEAST_478:HEART +"CREATURE:FORGOTTEN_BEAST_478:LIVER + CREATURE:FORGOTTEN_BEAST_478:GUT +$CREATURE:FORGOTTEN_BEAST_478:STOMACH +$CREATURE:FORGOTTEN_BEAST_478:GIZZARD +%CREATURE:FORGOTTEN_BEAST_478:PANCREAS +#CREATURE:FORGOTTEN_BEAST_478:SPLEEN +#CREATURE:FORGOTTEN_BEAST_478:KIDNEY +#CREATURE:FORGOTTEN_BEAST_479:MUSCLE + CREATURE:FORGOTTEN_BEAST_479:EYE +"CREATURE:FORGOTTEN_BEAST_479:BRAIN +!CREATURE:FORGOTTEN_BEAST_479:LUNG +"CREATURE:FORGOTTEN_BEAST_479:HEART +"CREATURE:FORGOTTEN_BEAST_479:LIVER + CREATURE:FORGOTTEN_BEAST_479:GUT +$CREATURE:FORGOTTEN_BEAST_479:STOMACH +$CREATURE:FORGOTTEN_BEAST_479:GIZZARD +%CREATURE:FORGOTTEN_BEAST_479:PANCREAS +#CREATURE:FORGOTTEN_BEAST_479:SPLEEN +#CREATURE:FORGOTTEN_BEAST_479:KIDNEY +#CREATURE:FORGOTTEN_BEAST_480:MUSCLE + CREATURE:FORGOTTEN_BEAST_480:EYE +"CREATURE:FORGOTTEN_BEAST_480:BRAIN +!CREATURE:FORGOTTEN_BEAST_480:LUNG +"CREATURE:FORGOTTEN_BEAST_480:HEART +"CREATURE:FORGOTTEN_BEAST_480:LIVER + CREATURE:FORGOTTEN_BEAST_480:GUT +$CREATURE:FORGOTTEN_BEAST_480:STOMACH +$CREATURE:FORGOTTEN_BEAST_480:GIZZARD +%CREATURE:FORGOTTEN_BEAST_480:PANCREAS +#CREATURE:FORGOTTEN_BEAST_480:SPLEEN +#CREATURE:FORGOTTEN_BEAST_480:KIDNEY +#CREATURE:FORGOTTEN_BEAST_481:MUSCLE + CREATURE:FORGOTTEN_BEAST_481:EYE +"CREATURE:FORGOTTEN_BEAST_481:BRAIN +!CREATURE:FORGOTTEN_BEAST_481:LUNG +"CREATURE:FORGOTTEN_BEAST_481:HEART +"CREATURE:FORGOTTEN_BEAST_481:LIVER + CREATURE:FORGOTTEN_BEAST_481:GUT +$CREATURE:FORGOTTEN_BEAST_481:STOMACH +$CREATURE:FORGOTTEN_BEAST_481:GIZZARD +%CREATURE:FORGOTTEN_BEAST_481:PANCREAS +#CREATURE:FORGOTTEN_BEAST_481:SPLEEN +#CREATURE:FORGOTTEN_BEAST_481:KIDNEY +#CREATURE:FORGOTTEN_BEAST_483:MUSCLE + CREATURE:FORGOTTEN_BEAST_483:EYE +"CREATURE:FORGOTTEN_BEAST_483:BRAIN +!CREATURE:FORGOTTEN_BEAST_483:LUNG +"CREATURE:FORGOTTEN_BEAST_483:HEART +"CREATURE:FORGOTTEN_BEAST_483:LIVER + CREATURE:FORGOTTEN_BEAST_483:GUT +$CREATURE:FORGOTTEN_BEAST_483:STOMACH +$CREATURE:FORGOTTEN_BEAST_483:GIZZARD +%CREATURE:FORGOTTEN_BEAST_483:PANCREAS +#CREATURE:FORGOTTEN_BEAST_483:SPLEEN +#CREATURE:FORGOTTEN_BEAST_483:KIDNEY +#CREATURE:FORGOTTEN_BEAST_486:MUSCLE + CREATURE:FORGOTTEN_BEAST_486:EYE +"CREATURE:FORGOTTEN_BEAST_486:BRAIN +!CREATURE:FORGOTTEN_BEAST_486:LUNG +"CREATURE:FORGOTTEN_BEAST_486:HEART +"CREATURE:FORGOTTEN_BEAST_486:LIVER + CREATURE:FORGOTTEN_BEAST_486:GUT +$CREATURE:FORGOTTEN_BEAST_486:STOMACH +$CREATURE:FORGOTTEN_BEAST_486:GIZZARD +%CREATURE:FORGOTTEN_BEAST_486:PANCREAS +#CREATURE:FORGOTTEN_BEAST_486:SPLEEN +#CREATURE:FORGOTTEN_BEAST_486:KIDNEY +#CREATURE:FORGOTTEN_BEAST_487:MUSCLE + CREATURE:FORGOTTEN_BEAST_487:EYE +"CREATURE:FORGOTTEN_BEAST_487:BRAIN +!CREATURE:FORGOTTEN_BEAST_487:LUNG +"CREATURE:FORGOTTEN_BEAST_487:HEART +"CREATURE:FORGOTTEN_BEAST_487:LIVER + CREATURE:FORGOTTEN_BEAST_487:GUT +$CREATURE:FORGOTTEN_BEAST_487:STOMACH +$CREATURE:FORGOTTEN_BEAST_487:GIZZARD +%CREATURE:FORGOTTEN_BEAST_487:PANCREAS +#CREATURE:FORGOTTEN_BEAST_487:SPLEEN +#CREATURE:FORGOTTEN_BEAST_487:KIDNEY +#CREATURE:FORGOTTEN_BEAST_489:MUSCLE + CREATURE:FORGOTTEN_BEAST_489:EYE +"CREATURE:FORGOTTEN_BEAST_489:BRAIN +!CREATURE:FORGOTTEN_BEAST_489:LUNG +"CREATURE:FORGOTTEN_BEAST_489:HEART +"CREATURE:FORGOTTEN_BEAST_489:LIVER + CREATURE:FORGOTTEN_BEAST_489:GUT +$CREATURE:FORGOTTEN_BEAST_489:STOMACH +$CREATURE:FORGOTTEN_BEAST_489:GIZZARD +%CREATURE:FORGOTTEN_BEAST_489:PANCREAS +#CREATURE:FORGOTTEN_BEAST_489:SPLEEN +#CREATURE:FORGOTTEN_BEAST_489:KIDNEY +#CREATURE:FORGOTTEN_BEAST_492:MUSCLE + CREATURE:FORGOTTEN_BEAST_492:EYE +"CREATURE:FORGOTTEN_BEAST_492:BRAIN +!CREATURE:FORGOTTEN_BEAST_492:LUNG +"CREATURE:FORGOTTEN_BEAST_492:HEART +"CREATURE:FORGOTTEN_BEAST_492:LIVER + CREATURE:FORGOTTEN_BEAST_492:GUT +$CREATURE:FORGOTTEN_BEAST_492:STOMACH +$CREATURE:FORGOTTEN_BEAST_492:GIZZARD +%CREATURE:FORGOTTEN_BEAST_492:PANCREAS +#CREATURE:FORGOTTEN_BEAST_492:SPLEEN +#CREATURE:FORGOTTEN_BEAST_492:KIDNEY +#CREATURE:FORGOTTEN_BEAST_494:MUSCLE + CREATURE:FORGOTTEN_BEAST_494:EYE +"CREATURE:FORGOTTEN_BEAST_494:BRAIN +!CREATURE:FORGOTTEN_BEAST_494:LUNG +"CREATURE:FORGOTTEN_BEAST_494:HEART +"CREATURE:FORGOTTEN_BEAST_494:LIVER + CREATURE:FORGOTTEN_BEAST_494:GUT +$CREATURE:FORGOTTEN_BEAST_494:STOMACH +$CREATURE:FORGOTTEN_BEAST_494:GIZZARD +%CREATURE:FORGOTTEN_BEAST_494:PANCREAS +#CREATURE:FORGOTTEN_BEAST_494:SPLEEN +#CREATURE:FORGOTTEN_BEAST_494:KIDNEY +#CREATURE:FORGOTTEN_BEAST_495:MUSCLE + CREATURE:FORGOTTEN_BEAST_495:EYE +"CREATURE:FORGOTTEN_BEAST_495:BRAIN +!CREATURE:FORGOTTEN_BEAST_495:LUNG +"CREATURE:FORGOTTEN_BEAST_495:HEART +"CREATURE:FORGOTTEN_BEAST_495:LIVER + CREATURE:FORGOTTEN_BEAST_495:GUT +$CREATURE:FORGOTTEN_BEAST_495:STOMACH +$CREATURE:FORGOTTEN_BEAST_495:GIZZARD +%CREATURE:FORGOTTEN_BEAST_495:PANCREAS +#CREATURE:FORGOTTEN_BEAST_495:SPLEEN +#CREATURE:FORGOTTEN_BEAST_495:KIDNEY +#CREATURE:FORGOTTEN_BEAST_496:MUSCLE + CREATURE:FORGOTTEN_BEAST_496:EYE +"CREATURE:FORGOTTEN_BEAST_496:BRAIN +!CREATURE:FORGOTTEN_BEAST_496:LUNG +"CREATURE:FORGOTTEN_BEAST_496:HEART +"CREATURE:FORGOTTEN_BEAST_496:LIVER + CREATURE:FORGOTTEN_BEAST_496:GUT +$CREATURE:FORGOTTEN_BEAST_496:STOMACH +$CREATURE:FORGOTTEN_BEAST_496:GIZZARD +%CREATURE:FORGOTTEN_BEAST_496:PANCREAS +#CREATURE:FORGOTTEN_BEAST_496:SPLEEN +#CREATURE:FORGOTTEN_BEAST_496:KIDNEY +#CREATURE:FORGOTTEN_BEAST_497:MUSCLE + CREATURE:FORGOTTEN_BEAST_497:EYE +"CREATURE:FORGOTTEN_BEAST_497:BRAIN +!CREATURE:FORGOTTEN_BEAST_497:LUNG +"CREATURE:FORGOTTEN_BEAST_497:HEART +"CREATURE:FORGOTTEN_BEAST_497:LIVER + CREATURE:FORGOTTEN_BEAST_497:GUT +$CREATURE:FORGOTTEN_BEAST_497:STOMACH +$CREATURE:FORGOTTEN_BEAST_497:GIZZARD +%CREATURE:FORGOTTEN_BEAST_497:PANCREAS +#CREATURE:FORGOTTEN_BEAST_497:SPLEEN +#CREATURE:FORGOTTEN_BEAST_497:KIDNEY +#CREATURE:FORGOTTEN_BEAST_498:MUSCLE + CREATURE:FORGOTTEN_BEAST_498:EYE +"CREATURE:FORGOTTEN_BEAST_498:BRAIN +!CREATURE:FORGOTTEN_BEAST_498:LUNG +"CREATURE:FORGOTTEN_BEAST_498:HEART +"CREATURE:FORGOTTEN_BEAST_498:LIVER + CREATURE:FORGOTTEN_BEAST_498:GUT +$CREATURE:FORGOTTEN_BEAST_498:STOMACH +$CREATURE:FORGOTTEN_BEAST_498:GIZZARD +%CREATURE:FORGOTTEN_BEAST_498:PANCREAS +#CREATURE:FORGOTTEN_BEAST_498:SPLEEN +#CREATURE:FORGOTTEN_BEAST_498:KIDNEY +#CREATURE:FORGOTTEN_BEAST_499:MUSCLE + CREATURE:FORGOTTEN_BEAST_499:EYE +"CREATURE:FORGOTTEN_BEAST_499:BRAIN +!CREATURE:FORGOTTEN_BEAST_499:LUNG +"CREATURE:FORGOTTEN_BEAST_499:HEART +"CREATURE:FORGOTTEN_BEAST_499:LIVER + CREATURE:FORGOTTEN_BEAST_499:GUT +$CREATURE:FORGOTTEN_BEAST_499:STOMACH +$CREATURE:FORGOTTEN_BEAST_499:GIZZARD +%CREATURE:FORGOTTEN_BEAST_499:PANCREAS +#CREATURE:FORGOTTEN_BEAST_499:SPLEEN +#CREATURE:FORGOTTEN_BEAST_499:KIDNEY +#CREATURE:FORGOTTEN_BEAST_501:MUSCLE + CREATURE:FORGOTTEN_BEAST_501:EYE +"CREATURE:FORGOTTEN_BEAST_501:BRAIN +!CREATURE:FORGOTTEN_BEAST_501:LUNG +"CREATURE:FORGOTTEN_BEAST_501:HEART +"CREATURE:FORGOTTEN_BEAST_501:LIVER + CREATURE:FORGOTTEN_BEAST_501:GUT +$CREATURE:FORGOTTEN_BEAST_501:STOMACH +$CREATURE:FORGOTTEN_BEAST_501:GIZZARD +%CREATURE:FORGOTTEN_BEAST_501:PANCREAS +#CREATURE:FORGOTTEN_BEAST_501:SPLEEN +#CREATURE:FORGOTTEN_BEAST_501:KIDNEY +#CREATURE:FORGOTTEN_BEAST_503:MUSCLE + CREATURE:FORGOTTEN_BEAST_503:EYE +"CREATURE:FORGOTTEN_BEAST_503:BRAIN +!CREATURE:FORGOTTEN_BEAST_503:LUNG +"CREATURE:FORGOTTEN_BEAST_503:HEART +"CREATURE:FORGOTTEN_BEAST_503:LIVER + CREATURE:FORGOTTEN_BEAST_503:GUT +$CREATURE:FORGOTTEN_BEAST_503:STOMACH +$CREATURE:FORGOTTEN_BEAST_503:GIZZARD +%CREATURE:FORGOTTEN_BEAST_503:PANCREAS +#CREATURE:FORGOTTEN_BEAST_503:SPLEEN +#CREATURE:FORGOTTEN_BEAST_503:KIDNEY +#CREATURE:FORGOTTEN_BEAST_504:MUSCLE + CREATURE:FORGOTTEN_BEAST_504:EYE +"CREATURE:FORGOTTEN_BEAST_504:BRAIN +!CREATURE:FORGOTTEN_BEAST_504:LUNG +"CREATURE:FORGOTTEN_BEAST_504:HEART +"CREATURE:FORGOTTEN_BEAST_504:LIVER + CREATURE:FORGOTTEN_BEAST_504:GUT +$CREATURE:FORGOTTEN_BEAST_504:STOMACH +$CREATURE:FORGOTTEN_BEAST_504:GIZZARD +%CREATURE:FORGOTTEN_BEAST_504:PANCREAS +#CREATURE:FORGOTTEN_BEAST_504:SPLEEN +#CREATURE:FORGOTTEN_BEAST_504:KIDNEY +#CREATURE:FORGOTTEN_BEAST_505:MUSCLE + CREATURE:FORGOTTEN_BEAST_505:EYE +"CREATURE:FORGOTTEN_BEAST_505:BRAIN +!CREATURE:FORGOTTEN_BEAST_505:LUNG +"CREATURE:FORGOTTEN_BEAST_505:HEART +"CREATURE:FORGOTTEN_BEAST_505:LIVER + CREATURE:FORGOTTEN_BEAST_505:GUT +$CREATURE:FORGOTTEN_BEAST_505:STOMACH +$CREATURE:FORGOTTEN_BEAST_505:GIZZARD +%CREATURE:FORGOTTEN_BEAST_505:PANCREAS +#CREATURE:FORGOTTEN_BEAST_505:SPLEEN +#CREATURE:FORGOTTEN_BEAST_505:KIDNEY +#CREATURE:FORGOTTEN_BEAST_507:MUSCLE + CREATURE:FORGOTTEN_BEAST_507:EYE +"CREATURE:FORGOTTEN_BEAST_507:BRAIN +!CREATURE:FORGOTTEN_BEAST_507:LUNG +"CREATURE:FORGOTTEN_BEAST_507:HEART +"CREATURE:FORGOTTEN_BEAST_507:LIVER + CREATURE:FORGOTTEN_BEAST_507:GUT +$CREATURE:FORGOTTEN_BEAST_507:STOMACH +$CREATURE:FORGOTTEN_BEAST_507:GIZZARD +%CREATURE:FORGOTTEN_BEAST_507:PANCREAS +#CREATURE:FORGOTTEN_BEAST_507:SPLEEN +#CREATURE:FORGOTTEN_BEAST_507:KIDNEY +#CREATURE:FORGOTTEN_BEAST_508:MUSCLE + CREATURE:FORGOTTEN_BEAST_508:EYE +"CREATURE:FORGOTTEN_BEAST_508:BRAIN +!CREATURE:FORGOTTEN_BEAST_508:LUNG +"CREATURE:FORGOTTEN_BEAST_508:HEART +"CREATURE:FORGOTTEN_BEAST_508:LIVER + CREATURE:FORGOTTEN_BEAST_508:GUT +$CREATURE:FORGOTTEN_BEAST_508:STOMACH +$CREATURE:FORGOTTEN_BEAST_508:GIZZARD +%CREATURE:FORGOTTEN_BEAST_508:PANCREAS +#CREATURE:FORGOTTEN_BEAST_508:SPLEEN +#CREATURE:FORGOTTEN_BEAST_508:KIDNEY +#CREATURE:FORGOTTEN_BEAST_510:MUSCLE + CREATURE:FORGOTTEN_BEAST_510:EYE +"CREATURE:FORGOTTEN_BEAST_510:BRAIN +!CREATURE:FORGOTTEN_BEAST_510:LUNG +"CREATURE:FORGOTTEN_BEAST_510:HEART +"CREATURE:FORGOTTEN_BEAST_510:LIVER + CREATURE:FORGOTTEN_BEAST_510:GUT +$CREATURE:FORGOTTEN_BEAST_510:STOMACH +$CREATURE:FORGOTTEN_BEAST_510:GIZZARD +%CREATURE:FORGOTTEN_BEAST_510:PANCREAS +#CREATURE:FORGOTTEN_BEAST_510:SPLEEN +#CREATURE:FORGOTTEN_BEAST_510:KIDNEY +#CREATURE:FORGOTTEN_BEAST_512:MUSCLE + CREATURE:FORGOTTEN_BEAST_512:EYE +"CREATURE:FORGOTTEN_BEAST_512:BRAIN +!CREATURE:FORGOTTEN_BEAST_512:LUNG +"CREATURE:FORGOTTEN_BEAST_512:HEART +"CREATURE:FORGOTTEN_BEAST_512:LIVER + CREATURE:FORGOTTEN_BEAST_512:GUT +$CREATURE:FORGOTTEN_BEAST_512:STOMACH +$CREATURE:FORGOTTEN_BEAST_512:GIZZARD +%CREATURE:FORGOTTEN_BEAST_512:PANCREAS +#CREATURE:FORGOTTEN_BEAST_512:SPLEEN +#CREATURE:FORGOTTEN_BEAST_512:KIDNEY +#CREATURE:FORGOTTEN_BEAST_513:MUSCLE + CREATURE:FORGOTTEN_BEAST_513:EYE +"CREATURE:FORGOTTEN_BEAST_513:BRAIN +!CREATURE:FORGOTTEN_BEAST_513:LUNG +"CREATURE:FORGOTTEN_BEAST_513:HEART +"CREATURE:FORGOTTEN_BEAST_513:LIVER + CREATURE:FORGOTTEN_BEAST_513:GUT +$CREATURE:FORGOTTEN_BEAST_513:STOMACH +$CREATURE:FORGOTTEN_BEAST_513:GIZZARD +%CREATURE:FORGOTTEN_BEAST_513:PANCREAS +#CREATURE:FORGOTTEN_BEAST_513:SPLEEN +#CREATURE:FORGOTTEN_BEAST_513:KIDNEY +#CREATURE:FORGOTTEN_BEAST_514:MUSCLE + CREATURE:FORGOTTEN_BEAST_514:EYE +"CREATURE:FORGOTTEN_BEAST_514:BRAIN +!CREATURE:FORGOTTEN_BEAST_514:LUNG +"CREATURE:FORGOTTEN_BEAST_514:HEART +"CREATURE:FORGOTTEN_BEAST_514:LIVER + CREATURE:FORGOTTEN_BEAST_514:GUT +$CREATURE:FORGOTTEN_BEAST_514:STOMACH +$CREATURE:FORGOTTEN_BEAST_514:GIZZARD +%CREATURE:FORGOTTEN_BEAST_514:PANCREAS +#CREATURE:FORGOTTEN_BEAST_514:SPLEEN +#CREATURE:FORGOTTEN_BEAST_514:KIDNEY +#CREATURE:FORGOTTEN_BEAST_515:MUSCLE + CREATURE:FORGOTTEN_BEAST_515:EYE +"CREATURE:FORGOTTEN_BEAST_515:BRAIN +!CREATURE:FORGOTTEN_BEAST_515:LUNG +"CREATURE:FORGOTTEN_BEAST_515:HEART +"CREATURE:FORGOTTEN_BEAST_515:LIVER + CREATURE:FORGOTTEN_BEAST_515:GUT +$CREATURE:FORGOTTEN_BEAST_515:STOMACH +$CREATURE:FORGOTTEN_BEAST_515:GIZZARD +%CREATURE:FORGOTTEN_BEAST_515:PANCREAS +#CREATURE:FORGOTTEN_BEAST_515:SPLEEN +#CREATURE:FORGOTTEN_BEAST_515:KIDNEY +#CREATURE:FORGOTTEN_BEAST_516:MUSCLE + CREATURE:FORGOTTEN_BEAST_516:EYE +"CREATURE:FORGOTTEN_BEAST_516:BRAIN +!CREATURE:FORGOTTEN_BEAST_516:LUNG +"CREATURE:FORGOTTEN_BEAST_516:HEART +"CREATURE:FORGOTTEN_BEAST_516:LIVER + CREATURE:FORGOTTEN_BEAST_516:GUT +$CREATURE:FORGOTTEN_BEAST_516:STOMACH +$CREATURE:FORGOTTEN_BEAST_516:GIZZARD +%CREATURE:FORGOTTEN_BEAST_516:PANCREAS +#CREATURE:FORGOTTEN_BEAST_516:SPLEEN +#CREATURE:FORGOTTEN_BEAST_516:KIDNEY +#CREATURE:FORGOTTEN_BEAST_517:MUSCLE + CREATURE:FORGOTTEN_BEAST_517:EYE +"CREATURE:FORGOTTEN_BEAST_517:BRAIN +!CREATURE:FORGOTTEN_BEAST_517:LUNG +"CREATURE:FORGOTTEN_BEAST_517:HEART +"CREATURE:FORGOTTEN_BEAST_517:LIVER + CREATURE:FORGOTTEN_BEAST_517:GUT +$CREATURE:FORGOTTEN_BEAST_517:STOMACH +$CREATURE:FORGOTTEN_BEAST_517:GIZZARD +%CREATURE:FORGOTTEN_BEAST_517:PANCREAS +#CREATURE:FORGOTTEN_BEAST_517:SPLEEN +#CREATURE:FORGOTTEN_BEAST_517:KIDNEY +#CREATURE:FORGOTTEN_BEAST_518:MUSCLE + CREATURE:FORGOTTEN_BEAST_518:EYE +"CREATURE:FORGOTTEN_BEAST_518:BRAIN +!CREATURE:FORGOTTEN_BEAST_518:LUNG +"CREATURE:FORGOTTEN_BEAST_518:HEART +"CREATURE:FORGOTTEN_BEAST_518:LIVER + CREATURE:FORGOTTEN_BEAST_518:GUT +$CREATURE:FORGOTTEN_BEAST_518:STOMACH +$CREATURE:FORGOTTEN_BEAST_518:GIZZARD +%CREATURE:FORGOTTEN_BEAST_518:PANCREAS +#CREATURE:FORGOTTEN_BEAST_518:SPLEEN +#CREATURE:FORGOTTEN_BEAST_518:KIDNEY +#CREATURE:FORGOTTEN_BEAST_519:MUSCLE + CREATURE:FORGOTTEN_BEAST_519:EYE +"CREATURE:FORGOTTEN_BEAST_519:BRAIN +!CREATURE:FORGOTTEN_BEAST_519:LUNG +"CREATURE:FORGOTTEN_BEAST_519:HEART +"CREATURE:FORGOTTEN_BEAST_519:LIVER + CREATURE:FORGOTTEN_BEAST_519:GUT +$CREATURE:FORGOTTEN_BEAST_519:STOMACH +$CREATURE:FORGOTTEN_BEAST_519:GIZZARD +%CREATURE:FORGOTTEN_BEAST_519:PANCREAS +#CREATURE:FORGOTTEN_BEAST_519:SPLEEN +#CREATURE:FORGOTTEN_BEAST_519:KIDNEY +#CREATURE:FORGOTTEN_BEAST_520:MUSCLE + CREATURE:FORGOTTEN_BEAST_520:EYE +"CREATURE:FORGOTTEN_BEAST_520:BRAIN +!CREATURE:FORGOTTEN_BEAST_520:LUNG +"CREATURE:FORGOTTEN_BEAST_520:HEART +"CREATURE:FORGOTTEN_BEAST_520:LIVER + CREATURE:FORGOTTEN_BEAST_520:GUT +$CREATURE:FORGOTTEN_BEAST_520:STOMACH +$CREATURE:FORGOTTEN_BEAST_520:GIZZARD +%CREATURE:FORGOTTEN_BEAST_520:PANCREAS +#CREATURE:FORGOTTEN_BEAST_520:SPLEEN +#CREATURE:FORGOTTEN_BEAST_520:KIDNEY +#CREATURE:FORGOTTEN_BEAST_521:MUSCLE + CREATURE:FORGOTTEN_BEAST_521:EYE +"CREATURE:FORGOTTEN_BEAST_521:BRAIN +!CREATURE:FORGOTTEN_BEAST_521:LUNG +"CREATURE:FORGOTTEN_BEAST_521:HEART +"CREATURE:FORGOTTEN_BEAST_521:LIVER + CREATURE:FORGOTTEN_BEAST_521:GUT +$CREATURE:FORGOTTEN_BEAST_521:STOMACH +$CREATURE:FORGOTTEN_BEAST_521:GIZZARD +%CREATURE:FORGOTTEN_BEAST_521:PANCREAS +#CREATURE:FORGOTTEN_BEAST_521:SPLEEN +#CREATURE:FORGOTTEN_BEAST_521:KIDNEY +#CREATURE:FORGOTTEN_BEAST_522:MUSCLE + CREATURE:FORGOTTEN_BEAST_522:EYE +"CREATURE:FORGOTTEN_BEAST_522:BRAIN +!CREATURE:FORGOTTEN_BEAST_522:LUNG +"CREATURE:FORGOTTEN_BEAST_522:HEART +"CREATURE:FORGOTTEN_BEAST_522:LIVER + CREATURE:FORGOTTEN_BEAST_522:GUT +$CREATURE:FORGOTTEN_BEAST_522:STOMACH +$CREATURE:FORGOTTEN_BEAST_522:GIZZARD +%CREATURE:FORGOTTEN_BEAST_522:PANCREAS +#CREATURE:FORGOTTEN_BEAST_522:SPLEEN +#CREATURE:FORGOTTEN_BEAST_522:KIDNEY +#CREATURE:FORGOTTEN_BEAST_523:MUSCLE + CREATURE:FORGOTTEN_BEAST_523:EYE +"CREATURE:FORGOTTEN_BEAST_523:BRAIN +!CREATURE:FORGOTTEN_BEAST_523:LUNG +"CREATURE:FORGOTTEN_BEAST_523:HEART +"CREATURE:FORGOTTEN_BEAST_523:LIVER + CREATURE:FORGOTTEN_BEAST_523:GUT +$CREATURE:FORGOTTEN_BEAST_523:STOMACH +$CREATURE:FORGOTTEN_BEAST_523:GIZZARD +%CREATURE:FORGOTTEN_BEAST_523:PANCREAS +#CREATURE:FORGOTTEN_BEAST_523:SPLEEN +#CREATURE:FORGOTTEN_BEAST_523:KIDNEY +#CREATURE:FORGOTTEN_BEAST_525:MUSCLE + CREATURE:FORGOTTEN_BEAST_525:EYE +"CREATURE:FORGOTTEN_BEAST_525:BRAIN +!CREATURE:FORGOTTEN_BEAST_525:LUNG +"CREATURE:FORGOTTEN_BEAST_525:HEART +"CREATURE:FORGOTTEN_BEAST_525:LIVER + CREATURE:FORGOTTEN_BEAST_525:GUT +$CREATURE:FORGOTTEN_BEAST_525:STOMACH +$CREATURE:FORGOTTEN_BEAST_525:GIZZARD +%CREATURE:FORGOTTEN_BEAST_525:PANCREAS +#CREATURE:FORGOTTEN_BEAST_525:SPLEEN +#CREATURE:FORGOTTEN_BEAST_525:KIDNEY +#CREATURE:FORGOTTEN_BEAST_526:MUSCLE + CREATURE:FORGOTTEN_BEAST_526:EYE +"CREATURE:FORGOTTEN_BEAST_526:BRAIN +!CREATURE:FORGOTTEN_BEAST_526:LUNG +"CREATURE:FORGOTTEN_BEAST_526:HEART +"CREATURE:FORGOTTEN_BEAST_526:LIVER + CREATURE:FORGOTTEN_BEAST_526:GUT +$CREATURE:FORGOTTEN_BEAST_526:STOMACH +$CREATURE:FORGOTTEN_BEAST_526:GIZZARD +%CREATURE:FORGOTTEN_BEAST_526:PANCREAS +#CREATURE:FORGOTTEN_BEAST_526:SPLEEN +#CREATURE:FORGOTTEN_BEAST_526:KIDNEY +#CREATURE:FORGOTTEN_BEAST_527:MUSCLE + CREATURE:FORGOTTEN_BEAST_527:EYE +"CREATURE:FORGOTTEN_BEAST_527:BRAIN +!CREATURE:FORGOTTEN_BEAST_527:LUNG +"CREATURE:FORGOTTEN_BEAST_527:HEART +"CREATURE:FORGOTTEN_BEAST_527:LIVER + CREATURE:FORGOTTEN_BEAST_527:GUT +$CREATURE:FORGOTTEN_BEAST_527:STOMACH +$CREATURE:FORGOTTEN_BEAST_527:GIZZARD +%CREATURE:FORGOTTEN_BEAST_527:PANCREAS +#CREATURE:FORGOTTEN_BEAST_527:SPLEEN +#CREATURE:FORGOTTEN_BEAST_527:KIDNEY +#CREATURE:FORGOTTEN_BEAST_528:MUSCLE + CREATURE:FORGOTTEN_BEAST_528:EYE +"CREATURE:FORGOTTEN_BEAST_528:BRAIN +!CREATURE:FORGOTTEN_BEAST_528:LUNG +"CREATURE:FORGOTTEN_BEAST_528:HEART +"CREATURE:FORGOTTEN_BEAST_528:LIVER + CREATURE:FORGOTTEN_BEAST_528:GUT +$CREATURE:FORGOTTEN_BEAST_528:STOMACH +$CREATURE:FORGOTTEN_BEAST_528:GIZZARD +%CREATURE:FORGOTTEN_BEAST_528:PANCREAS +#CREATURE:FORGOTTEN_BEAST_528:SPLEEN +#CREATURE:FORGOTTEN_BEAST_528:KIDNEY +#CREATURE:FORGOTTEN_BEAST_529:MUSCLE + CREATURE:FORGOTTEN_BEAST_529:EYE +"CREATURE:FORGOTTEN_BEAST_529:BRAIN +!CREATURE:FORGOTTEN_BEAST_529:LUNG +"CREATURE:FORGOTTEN_BEAST_529:HEART +"CREATURE:FORGOTTEN_BEAST_529:LIVER + CREATURE:FORGOTTEN_BEAST_529:GUT +$CREATURE:FORGOTTEN_BEAST_529:STOMACH +$CREATURE:FORGOTTEN_BEAST_529:GIZZARD +%CREATURE:FORGOTTEN_BEAST_529:PANCREAS +#CREATURE:FORGOTTEN_BEAST_529:SPLEEN +#CREATURE:FORGOTTEN_BEAST_529:KIDNEY +#CREATURE:FORGOTTEN_BEAST_530:MUSCLE + CREATURE:FORGOTTEN_BEAST_530:EYE +"CREATURE:FORGOTTEN_BEAST_530:BRAIN +!CREATURE:FORGOTTEN_BEAST_530:LUNG +"CREATURE:FORGOTTEN_BEAST_530:HEART +"CREATURE:FORGOTTEN_BEAST_530:LIVER + CREATURE:FORGOTTEN_BEAST_530:GUT +$CREATURE:FORGOTTEN_BEAST_530:STOMACH +$CREATURE:FORGOTTEN_BEAST_530:GIZZARD +%CREATURE:FORGOTTEN_BEAST_530:PANCREAS +#CREATURE:FORGOTTEN_BEAST_530:SPLEEN +#CREATURE:FORGOTTEN_BEAST_530:KIDNEY +#CREATURE:FORGOTTEN_BEAST_531:MUSCLE + CREATURE:FORGOTTEN_BEAST_531:EYE +"CREATURE:FORGOTTEN_BEAST_531:BRAIN +!CREATURE:FORGOTTEN_BEAST_531:LUNG +"CREATURE:FORGOTTEN_BEAST_531:HEART +"CREATURE:FORGOTTEN_BEAST_531:LIVER + CREATURE:FORGOTTEN_BEAST_531:GUT +$CREATURE:FORGOTTEN_BEAST_531:STOMACH +$CREATURE:FORGOTTEN_BEAST_531:GIZZARD +%CREATURE:FORGOTTEN_BEAST_531:PANCREAS +#CREATURE:FORGOTTEN_BEAST_531:SPLEEN +#CREATURE:FORGOTTEN_BEAST_531:KIDNEY +#CREATURE:FORGOTTEN_BEAST_532:MUSCLE + CREATURE:FORGOTTEN_BEAST_532:EYE +"CREATURE:FORGOTTEN_BEAST_532:BRAIN +!CREATURE:FORGOTTEN_BEAST_532:LUNG +"CREATURE:FORGOTTEN_BEAST_532:HEART +"CREATURE:FORGOTTEN_BEAST_532:LIVER + CREATURE:FORGOTTEN_BEAST_532:GUT +$CREATURE:FORGOTTEN_BEAST_532:STOMACH +$CREATURE:FORGOTTEN_BEAST_532:GIZZARD +%CREATURE:FORGOTTEN_BEAST_532:PANCREAS +#CREATURE:FORGOTTEN_BEAST_532:SPLEEN +#CREATURE:FORGOTTEN_BEAST_532:KIDNEY +#CREATURE:FORGOTTEN_BEAST_533:MUSCLE + CREATURE:FORGOTTEN_BEAST_533:EYE +"CREATURE:FORGOTTEN_BEAST_533:BRAIN +!CREATURE:FORGOTTEN_BEAST_533:LUNG +"CREATURE:FORGOTTEN_BEAST_533:HEART +"CREATURE:FORGOTTEN_BEAST_533:LIVER + CREATURE:FORGOTTEN_BEAST_533:GUT +$CREATURE:FORGOTTEN_BEAST_533:STOMACH +$CREATURE:FORGOTTEN_BEAST_533:GIZZARD +%CREATURE:FORGOTTEN_BEAST_533:PANCREAS +#CREATURE:FORGOTTEN_BEAST_533:SPLEEN +#CREATURE:FORGOTTEN_BEAST_533:KIDNEY +#CREATURE:FORGOTTEN_BEAST_534:MUSCLE + CREATURE:FORGOTTEN_BEAST_534:EYE +"CREATURE:FORGOTTEN_BEAST_534:BRAIN +!CREATURE:FORGOTTEN_BEAST_534:LUNG +"CREATURE:FORGOTTEN_BEAST_534:HEART +"CREATURE:FORGOTTEN_BEAST_534:LIVER + CREATURE:FORGOTTEN_BEAST_534:GUT +$CREATURE:FORGOTTEN_BEAST_534:STOMACH +$CREATURE:FORGOTTEN_BEAST_534:GIZZARD +%CREATURE:FORGOTTEN_BEAST_534:PANCREAS +#CREATURE:FORGOTTEN_BEAST_534:SPLEEN +#CREATURE:FORGOTTEN_BEAST_534:KIDNEY +#CREATURE:FORGOTTEN_BEAST_535:MUSCLE + CREATURE:FORGOTTEN_BEAST_535:EYE +"CREATURE:FORGOTTEN_BEAST_535:BRAIN +!CREATURE:FORGOTTEN_BEAST_535:LUNG +"CREATURE:FORGOTTEN_BEAST_535:HEART +"CREATURE:FORGOTTEN_BEAST_535:LIVER + CREATURE:FORGOTTEN_BEAST_535:GUT +$CREATURE:FORGOTTEN_BEAST_535:STOMACH +$CREATURE:FORGOTTEN_BEAST_535:GIZZARD +%CREATURE:FORGOTTEN_BEAST_535:PANCREAS +#CREATURE:FORGOTTEN_BEAST_535:SPLEEN +#CREATURE:FORGOTTEN_BEAST_535:KIDNEY +#CREATURE:FORGOTTEN_BEAST_536:MUSCLE + CREATURE:FORGOTTEN_BEAST_536:EYE +"CREATURE:FORGOTTEN_BEAST_536:BRAIN +!CREATURE:FORGOTTEN_BEAST_536:LUNG +"CREATURE:FORGOTTEN_BEAST_536:HEART +"CREATURE:FORGOTTEN_BEAST_536:LIVER + CREATURE:FORGOTTEN_BEAST_536:GUT +$CREATURE:FORGOTTEN_BEAST_536:STOMACH +$CREATURE:FORGOTTEN_BEAST_536:GIZZARD +%CREATURE:FORGOTTEN_BEAST_536:PANCREAS +#CREATURE:FORGOTTEN_BEAST_536:SPLEEN +#CREATURE:FORGOTTEN_BEAST_536:KIDNEY +#CREATURE:FORGOTTEN_BEAST_539:MUSCLE + CREATURE:FORGOTTEN_BEAST_539:EYE +"CREATURE:FORGOTTEN_BEAST_539:BRAIN +!CREATURE:FORGOTTEN_BEAST_539:LUNG +"CREATURE:FORGOTTEN_BEAST_539:HEART +"CREATURE:FORGOTTEN_BEAST_539:LIVER + CREATURE:FORGOTTEN_BEAST_539:GUT +$CREATURE:FORGOTTEN_BEAST_539:STOMACH +$CREATURE:FORGOTTEN_BEAST_539:GIZZARD +%CREATURE:FORGOTTEN_BEAST_539:PANCREAS +#CREATURE:FORGOTTEN_BEAST_539:SPLEEN +#CREATURE:FORGOTTEN_BEAST_539:KIDNEY +#CREATURE:FORGOTTEN_BEAST_540:MUSCLE + CREATURE:FORGOTTEN_BEAST_540:EYE +"CREATURE:FORGOTTEN_BEAST_540:BRAIN +!CREATURE:FORGOTTEN_BEAST_540:LUNG +"CREATURE:FORGOTTEN_BEAST_540:HEART +"CREATURE:FORGOTTEN_BEAST_540:LIVER + CREATURE:FORGOTTEN_BEAST_540:GUT +$CREATURE:FORGOTTEN_BEAST_540:STOMACH +$CREATURE:FORGOTTEN_BEAST_540:GIZZARD +%CREATURE:FORGOTTEN_BEAST_540:PANCREAS +#CREATURE:FORGOTTEN_BEAST_540:SPLEEN +#CREATURE:FORGOTTEN_BEAST_540:KIDNEY +#CREATURE:FORGOTTEN_BEAST_541:MUSCLE + CREATURE:FORGOTTEN_BEAST_541:EYE +"CREATURE:FORGOTTEN_BEAST_541:BRAIN +!CREATURE:FORGOTTEN_BEAST_541:LUNG +"CREATURE:FORGOTTEN_BEAST_541:HEART +"CREATURE:FORGOTTEN_BEAST_541:LIVER + CREATURE:FORGOTTEN_BEAST_541:GUT +$CREATURE:FORGOTTEN_BEAST_541:STOMACH +$CREATURE:FORGOTTEN_BEAST_541:GIZZARD +%CREATURE:FORGOTTEN_BEAST_541:PANCREAS +#CREATURE:FORGOTTEN_BEAST_541:SPLEEN +#CREATURE:FORGOTTEN_BEAST_541:KIDNEY +#CREATURE:FORGOTTEN_BEAST_543:MUSCLE + CREATURE:FORGOTTEN_BEAST_543:EYE +"CREATURE:FORGOTTEN_BEAST_543:BRAIN +!CREATURE:FORGOTTEN_BEAST_543:LUNG +"CREATURE:FORGOTTEN_BEAST_543:HEART +"CREATURE:FORGOTTEN_BEAST_543:LIVER + CREATURE:FORGOTTEN_BEAST_543:GUT +$CREATURE:FORGOTTEN_BEAST_543:STOMACH +$CREATURE:FORGOTTEN_BEAST_543:GIZZARD +%CREATURE:FORGOTTEN_BEAST_543:PANCREAS +#CREATURE:FORGOTTEN_BEAST_543:SPLEEN +#CREATURE:FORGOTTEN_BEAST_543:KIDNEY +#CREATURE:FORGOTTEN_BEAST_545:MUSCLE + CREATURE:FORGOTTEN_BEAST_545:EYE +"CREATURE:FORGOTTEN_BEAST_545:BRAIN +!CREATURE:FORGOTTEN_BEAST_545:LUNG +"CREATURE:FORGOTTEN_BEAST_545:HEART +"CREATURE:FORGOTTEN_BEAST_545:LIVER + CREATURE:FORGOTTEN_BEAST_545:GUT +$CREATURE:FORGOTTEN_BEAST_545:STOMACH +$CREATURE:FORGOTTEN_BEAST_545:GIZZARD +%CREATURE:FORGOTTEN_BEAST_545:PANCREAS +#CREATURE:FORGOTTEN_BEAST_545:SPLEEN +#CREATURE:FORGOTTEN_BEAST_545:KIDNEY +#CREATURE:FORGOTTEN_BEAST_546:MUSCLE + CREATURE:FORGOTTEN_BEAST_546:EYE +"CREATURE:FORGOTTEN_BEAST_546:BRAIN +!CREATURE:FORGOTTEN_BEAST_546:LUNG +"CREATURE:FORGOTTEN_BEAST_546:HEART +"CREATURE:FORGOTTEN_BEAST_546:LIVER + CREATURE:FORGOTTEN_BEAST_546:GUT +$CREATURE:FORGOTTEN_BEAST_546:STOMACH +$CREATURE:FORGOTTEN_BEAST_546:GIZZARD +%CREATURE:FORGOTTEN_BEAST_546:PANCREAS +#CREATURE:FORGOTTEN_BEAST_546:SPLEEN +#CREATURE:FORGOTTEN_BEAST_546:KIDNEY +#CREATURE:FORGOTTEN_BEAST_547:MUSCLE + CREATURE:FORGOTTEN_BEAST_547:EYE +"CREATURE:FORGOTTEN_BEAST_547:BRAIN +!CREATURE:FORGOTTEN_BEAST_547:LUNG +"CREATURE:FORGOTTEN_BEAST_547:HEART +"CREATURE:FORGOTTEN_BEAST_547:LIVER + CREATURE:FORGOTTEN_BEAST_547:GUT +$CREATURE:FORGOTTEN_BEAST_547:STOMACH +$CREATURE:FORGOTTEN_BEAST_547:GIZZARD +%CREATURE:FORGOTTEN_BEAST_547:PANCREAS +#CREATURE:FORGOTTEN_BEAST_547:SPLEEN +#CREATURE:FORGOTTEN_BEAST_547:KIDNEY +#CREATURE:FORGOTTEN_BEAST_548:MUSCLE + CREATURE:FORGOTTEN_BEAST_548:EYE +"CREATURE:FORGOTTEN_BEAST_548:BRAIN +!CREATURE:FORGOTTEN_BEAST_548:LUNG +"CREATURE:FORGOTTEN_BEAST_548:HEART +"CREATURE:FORGOTTEN_BEAST_548:LIVER + CREATURE:FORGOTTEN_BEAST_548:GUT +$CREATURE:FORGOTTEN_BEAST_548:STOMACH +$CREATURE:FORGOTTEN_BEAST_548:GIZZARD +%CREATURE:FORGOTTEN_BEAST_548:PANCREAS +#CREATURE:FORGOTTEN_BEAST_548:SPLEEN +#CREATURE:FORGOTTEN_BEAST_548:KIDNEY +#CREATURE:FORGOTTEN_BEAST_549:MUSCLE + CREATURE:FORGOTTEN_BEAST_549:EYE +"CREATURE:FORGOTTEN_BEAST_549:BRAIN +!CREATURE:FORGOTTEN_BEAST_549:LUNG +"CREATURE:FORGOTTEN_BEAST_549:HEART +"CREATURE:FORGOTTEN_BEAST_549:LIVER + CREATURE:FORGOTTEN_BEAST_549:GUT +$CREATURE:FORGOTTEN_BEAST_549:STOMACH +$CREATURE:FORGOTTEN_BEAST_549:GIZZARD +%CREATURE:FORGOTTEN_BEAST_549:PANCREAS +#CREATURE:FORGOTTEN_BEAST_549:SPLEEN +#CREATURE:FORGOTTEN_BEAST_549:KIDNEY +#CREATURE:FORGOTTEN_BEAST_550:MUSCLE + CREATURE:FORGOTTEN_BEAST_550:EYE +"CREATURE:FORGOTTEN_BEAST_550:BRAIN +!CREATURE:FORGOTTEN_BEAST_550:LUNG +"CREATURE:FORGOTTEN_BEAST_550:HEART +"CREATURE:FORGOTTEN_BEAST_550:LIVER + CREATURE:FORGOTTEN_BEAST_550:GUT +$CREATURE:FORGOTTEN_BEAST_550:STOMACH +$CREATURE:FORGOTTEN_BEAST_550:GIZZARD +%CREATURE:FORGOTTEN_BEAST_550:PANCREAS +#CREATURE:FORGOTTEN_BEAST_550:SPLEEN +#CREATURE:FORGOTTEN_BEAST_550:KIDNEY +#CREATURE:FORGOTTEN_BEAST_551:MUSCLE + CREATURE:FORGOTTEN_BEAST_551:EYE +"CREATURE:FORGOTTEN_BEAST_551:BRAIN +!CREATURE:FORGOTTEN_BEAST_551:LUNG +"CREATURE:FORGOTTEN_BEAST_551:HEART +"CREATURE:FORGOTTEN_BEAST_551:LIVER + CREATURE:FORGOTTEN_BEAST_551:GUT +$CREATURE:FORGOTTEN_BEAST_551:STOMACH +$CREATURE:FORGOTTEN_BEAST_551:GIZZARD +%CREATURE:FORGOTTEN_BEAST_551:PANCREAS +#CREATURE:FORGOTTEN_BEAST_551:SPLEEN +#CREATURE:FORGOTTEN_BEAST_551:KIDNEY +#CREATURE:FORGOTTEN_BEAST_554:MUSCLE + CREATURE:FORGOTTEN_BEAST_554:EYE +"CREATURE:FORGOTTEN_BEAST_554:BRAIN +!CREATURE:FORGOTTEN_BEAST_554:LUNG +"CREATURE:FORGOTTEN_BEAST_554:HEART +"CREATURE:FORGOTTEN_BEAST_554:LIVER + CREATURE:FORGOTTEN_BEAST_554:GUT +$CREATURE:FORGOTTEN_BEAST_554:STOMACH +$CREATURE:FORGOTTEN_BEAST_554:GIZZARD +%CREATURE:FORGOTTEN_BEAST_554:PANCREAS +#CREATURE:FORGOTTEN_BEAST_554:SPLEEN +#CREATURE:FORGOTTEN_BEAST_554:KIDNEY +#CREATURE:FORGOTTEN_BEAST_555:MUSCLE + CREATURE:FORGOTTEN_BEAST_555:EYE +"CREATURE:FORGOTTEN_BEAST_555:BRAIN +!CREATURE:FORGOTTEN_BEAST_555:LUNG +"CREATURE:FORGOTTEN_BEAST_555:HEART +"CREATURE:FORGOTTEN_BEAST_555:LIVER + CREATURE:FORGOTTEN_BEAST_555:GUT +$CREATURE:FORGOTTEN_BEAST_555:STOMACH +$CREATURE:FORGOTTEN_BEAST_555:GIZZARD +%CREATURE:FORGOTTEN_BEAST_555:PANCREAS +#CREATURE:FORGOTTEN_BEAST_555:SPLEEN +#CREATURE:FORGOTTEN_BEAST_555:KIDNEY +#CREATURE:FORGOTTEN_BEAST_556:MUSCLE + CREATURE:FORGOTTEN_BEAST_556:EYE +"CREATURE:FORGOTTEN_BEAST_556:BRAIN +!CREATURE:FORGOTTEN_BEAST_556:LUNG +"CREATURE:FORGOTTEN_BEAST_556:HEART +"CREATURE:FORGOTTEN_BEAST_556:LIVER + CREATURE:FORGOTTEN_BEAST_556:GUT +$CREATURE:FORGOTTEN_BEAST_556:STOMACH +$CREATURE:FORGOTTEN_BEAST_556:GIZZARD +%CREATURE:FORGOTTEN_BEAST_556:PANCREAS +#CREATURE:FORGOTTEN_BEAST_556:SPLEEN +#CREATURE:FORGOTTEN_BEAST_556:KIDNEY +#CREATURE:FORGOTTEN_BEAST_557:MUSCLE + CREATURE:FORGOTTEN_BEAST_557:EYE +"CREATURE:FORGOTTEN_BEAST_557:BRAIN +!CREATURE:FORGOTTEN_BEAST_557:LUNG +"CREATURE:FORGOTTEN_BEAST_557:HEART +"CREATURE:FORGOTTEN_BEAST_557:LIVER + CREATURE:FORGOTTEN_BEAST_557:GUT +$CREATURE:FORGOTTEN_BEAST_557:STOMACH +$CREATURE:FORGOTTEN_BEAST_557:GIZZARD +%CREATURE:FORGOTTEN_BEAST_557:PANCREAS +#CREATURE:FORGOTTEN_BEAST_557:SPLEEN +#CREATURE:FORGOTTEN_BEAST_557:KIDNEY +#CREATURE:FORGOTTEN_BEAST_561:MUSCLE + CREATURE:FORGOTTEN_BEAST_561:EYE +"CREATURE:FORGOTTEN_BEAST_561:BRAIN +!CREATURE:FORGOTTEN_BEAST_561:LUNG +"CREATURE:FORGOTTEN_BEAST_561:HEART +"CREATURE:FORGOTTEN_BEAST_561:LIVER + CREATURE:FORGOTTEN_BEAST_561:GUT +$CREATURE:FORGOTTEN_BEAST_561:STOMACH +$CREATURE:FORGOTTEN_BEAST_561:GIZZARD +%CREATURE:FORGOTTEN_BEAST_561:PANCREAS +#CREATURE:FORGOTTEN_BEAST_561:SPLEEN +#CREATURE:FORGOTTEN_BEAST_561:KIDNEY +#CREATURE:FORGOTTEN_BEAST_562:MUSCLE + CREATURE:FORGOTTEN_BEAST_562:EYE +"CREATURE:FORGOTTEN_BEAST_562:BRAIN +!CREATURE:FORGOTTEN_BEAST_562:LUNG +"CREATURE:FORGOTTEN_BEAST_562:HEART +"CREATURE:FORGOTTEN_BEAST_562:LIVER + CREATURE:FORGOTTEN_BEAST_562:GUT +$CREATURE:FORGOTTEN_BEAST_562:STOMACH +$CREATURE:FORGOTTEN_BEAST_562:GIZZARD +%CREATURE:FORGOTTEN_BEAST_562:PANCREAS +#CREATURE:FORGOTTEN_BEAST_562:SPLEEN +#CREATURE:FORGOTTEN_BEAST_562:KIDNEY +#CREATURE:FORGOTTEN_BEAST_564:MUSCLE + CREATURE:FORGOTTEN_BEAST_564:EYE +"CREATURE:FORGOTTEN_BEAST_564:BRAIN +!CREATURE:FORGOTTEN_BEAST_564:LUNG +"CREATURE:FORGOTTEN_BEAST_564:HEART +"CREATURE:FORGOTTEN_BEAST_564:LIVER + CREATURE:FORGOTTEN_BEAST_564:GUT +$CREATURE:FORGOTTEN_BEAST_564:STOMACH +$CREATURE:FORGOTTEN_BEAST_564:GIZZARD +%CREATURE:FORGOTTEN_BEAST_564:PANCREAS +#CREATURE:FORGOTTEN_BEAST_564:SPLEEN +#CREATURE:FORGOTTEN_BEAST_564:KIDNEY +#CREATURE:FORGOTTEN_BEAST_569:MUSCLE + CREATURE:FORGOTTEN_BEAST_569:EYE +"CREATURE:FORGOTTEN_BEAST_569:BRAIN +!CREATURE:FORGOTTEN_BEAST_569:LUNG +"CREATURE:FORGOTTEN_BEAST_569:HEART +"CREATURE:FORGOTTEN_BEAST_569:LIVER + CREATURE:FORGOTTEN_BEAST_569:GUT +$CREATURE:FORGOTTEN_BEAST_569:STOMACH +$CREATURE:FORGOTTEN_BEAST_569:GIZZARD +%CREATURE:FORGOTTEN_BEAST_569:PANCREAS +#CREATURE:FORGOTTEN_BEAST_569:SPLEEN +#CREATURE:FORGOTTEN_BEAST_569:KIDNEY +#CREATURE:FORGOTTEN_BEAST_570:MUSCLE + CREATURE:FORGOTTEN_BEAST_570:EYE +"CREATURE:FORGOTTEN_BEAST_570:BRAIN +!CREATURE:FORGOTTEN_BEAST_570:LUNG +"CREATURE:FORGOTTEN_BEAST_570:HEART +"CREATURE:FORGOTTEN_BEAST_570:LIVER + CREATURE:FORGOTTEN_BEAST_570:GUT +$CREATURE:FORGOTTEN_BEAST_570:STOMACH +$CREATURE:FORGOTTEN_BEAST_570:GIZZARD +%CREATURE:FORGOTTEN_BEAST_570:PANCREAS +#CREATURE:FORGOTTEN_BEAST_570:SPLEEN +#CREATURE:FORGOTTEN_BEAST_570:KIDNEY +#CREATURE:FORGOTTEN_BEAST_571:MUSCLE + CREATURE:FORGOTTEN_BEAST_571:EYE +"CREATURE:FORGOTTEN_BEAST_571:BRAIN +!CREATURE:FORGOTTEN_BEAST_571:LUNG +"CREATURE:FORGOTTEN_BEAST_571:HEART +"CREATURE:FORGOTTEN_BEAST_571:LIVER + CREATURE:FORGOTTEN_BEAST_571:GUT +$CREATURE:FORGOTTEN_BEAST_571:STOMACH +$CREATURE:FORGOTTEN_BEAST_571:GIZZARD +%CREATURE:FORGOTTEN_BEAST_571:PANCREAS +#CREATURE:FORGOTTEN_BEAST_571:SPLEEN +#CREATURE:FORGOTTEN_BEAST_571:KIDNEY +#CREATURE:FORGOTTEN_BEAST_572:MUSCLE + CREATURE:FORGOTTEN_BEAST_572:EYE +"CREATURE:FORGOTTEN_BEAST_572:BRAIN +!CREATURE:FORGOTTEN_BEAST_572:LUNG +"CREATURE:FORGOTTEN_BEAST_572:HEART +"CREATURE:FORGOTTEN_BEAST_572:LIVER + CREATURE:FORGOTTEN_BEAST_572:GUT +$CREATURE:FORGOTTEN_BEAST_572:STOMACH +$CREATURE:FORGOTTEN_BEAST_572:GIZZARD +%CREATURE:FORGOTTEN_BEAST_572:PANCREAS +#CREATURE:FORGOTTEN_BEAST_572:SPLEEN +#CREATURE:FORGOTTEN_BEAST_572:KIDNEY +#CREATURE:FORGOTTEN_BEAST_574:MUSCLE + CREATURE:FORGOTTEN_BEAST_574:EYE +"CREATURE:FORGOTTEN_BEAST_574:BRAIN +!CREATURE:FORGOTTEN_BEAST_574:LUNG +"CREATURE:FORGOTTEN_BEAST_574:HEART +"CREATURE:FORGOTTEN_BEAST_574:LIVER + CREATURE:FORGOTTEN_BEAST_574:GUT +$CREATURE:FORGOTTEN_BEAST_574:STOMACH +$CREATURE:FORGOTTEN_BEAST_574:GIZZARD +%CREATURE:FORGOTTEN_BEAST_574:PANCREAS +#CREATURE:FORGOTTEN_BEAST_574:SPLEEN +#CREATURE:FORGOTTEN_BEAST_574:KIDNEY +#CREATURE:FORGOTTEN_BEAST_576:MUSCLE + CREATURE:FORGOTTEN_BEAST_576:EYE +"CREATURE:FORGOTTEN_BEAST_576:BRAIN +!CREATURE:FORGOTTEN_BEAST_576:LUNG +"CREATURE:FORGOTTEN_BEAST_576:HEART +"CREATURE:FORGOTTEN_BEAST_576:LIVER + CREATURE:FORGOTTEN_BEAST_576:GUT +$CREATURE:FORGOTTEN_BEAST_576:STOMACH +$CREATURE:FORGOTTEN_BEAST_576:GIZZARD +%CREATURE:FORGOTTEN_BEAST_576:PANCREAS +#CREATURE:FORGOTTEN_BEAST_576:SPLEEN +#CREATURE:FORGOTTEN_BEAST_576:KIDNEY +#CREATURE:FORGOTTEN_BEAST_578:MUSCLE + CREATURE:FORGOTTEN_BEAST_578:EYE +"CREATURE:FORGOTTEN_BEAST_578:BRAIN +!CREATURE:FORGOTTEN_BEAST_578:LUNG +"CREATURE:FORGOTTEN_BEAST_578:HEART +"CREATURE:FORGOTTEN_BEAST_578:LIVER + CREATURE:FORGOTTEN_BEAST_578:GUT +$CREATURE:FORGOTTEN_BEAST_578:STOMACH +$CREATURE:FORGOTTEN_BEAST_578:GIZZARD +%CREATURE:FORGOTTEN_BEAST_578:PANCREAS +#CREATURE:FORGOTTEN_BEAST_578:SPLEEN +#CREATURE:FORGOTTEN_BEAST_578:KIDNEY +#CREATURE:FORGOTTEN_BEAST_579:MUSCLE + CREATURE:FORGOTTEN_BEAST_579:EYE +"CREATURE:FORGOTTEN_BEAST_579:BRAIN +!CREATURE:FORGOTTEN_BEAST_579:LUNG +"CREATURE:FORGOTTEN_BEAST_579:HEART +"CREATURE:FORGOTTEN_BEAST_579:LIVER + CREATURE:FORGOTTEN_BEAST_579:GUT +$CREATURE:FORGOTTEN_BEAST_579:STOMACH +$CREATURE:FORGOTTEN_BEAST_579:GIZZARD +%CREATURE:FORGOTTEN_BEAST_579:PANCREAS +#CREATURE:FORGOTTEN_BEAST_579:SPLEEN +#CREATURE:FORGOTTEN_BEAST_579:KIDNEY +#CREATURE:FORGOTTEN_BEAST_580:MUSCLE + CREATURE:FORGOTTEN_BEAST_580:EYE +"CREATURE:FORGOTTEN_BEAST_580:BRAIN +!CREATURE:FORGOTTEN_BEAST_580:LUNG +"CREATURE:FORGOTTEN_BEAST_580:HEART +"CREATURE:FORGOTTEN_BEAST_580:LIVER + CREATURE:FORGOTTEN_BEAST_580:GUT +$CREATURE:FORGOTTEN_BEAST_580:STOMACH +$CREATURE:FORGOTTEN_BEAST_580:GIZZARD +%CREATURE:FORGOTTEN_BEAST_580:PANCREAS +#CREATURE:FORGOTTEN_BEAST_580:SPLEEN +#CREATURE:FORGOTTEN_BEAST_580:KIDNEY +#CREATURE:FORGOTTEN_BEAST_581:MUSCLE + CREATURE:FORGOTTEN_BEAST_581:EYE +"CREATURE:FORGOTTEN_BEAST_581:BRAIN +!CREATURE:FORGOTTEN_BEAST_581:LUNG +"CREATURE:FORGOTTEN_BEAST_581:HEART +"CREATURE:FORGOTTEN_BEAST_581:LIVER + CREATURE:FORGOTTEN_BEAST_581:GUT +$CREATURE:FORGOTTEN_BEAST_581:STOMACH +$CREATURE:FORGOTTEN_BEAST_581:GIZZARD +%CREATURE:FORGOTTEN_BEAST_581:PANCREAS +#CREATURE:FORGOTTEN_BEAST_581:SPLEEN +#CREATURE:FORGOTTEN_BEAST_581:KIDNEY +#CREATURE:FORGOTTEN_BEAST_583:MUSCLE + CREATURE:FORGOTTEN_BEAST_583:EYE +"CREATURE:FORGOTTEN_BEAST_583:BRAIN +!CREATURE:FORGOTTEN_BEAST_583:LUNG +"CREATURE:FORGOTTEN_BEAST_583:HEART +"CREATURE:FORGOTTEN_BEAST_583:LIVER + CREATURE:FORGOTTEN_BEAST_583:GUT +$CREATURE:FORGOTTEN_BEAST_583:STOMACH +$CREATURE:FORGOTTEN_BEAST_583:GIZZARD +%CREATURE:FORGOTTEN_BEAST_583:PANCREAS +#CREATURE:FORGOTTEN_BEAST_583:SPLEEN +#CREATURE:FORGOTTEN_BEAST_583:KIDNEY +#CREATURE:FORGOTTEN_BEAST_584:MUSCLE + CREATURE:FORGOTTEN_BEAST_584:EYE +"CREATURE:FORGOTTEN_BEAST_584:BRAIN +!CREATURE:FORGOTTEN_BEAST_584:LUNG +"CREATURE:FORGOTTEN_BEAST_584:HEART +"CREATURE:FORGOTTEN_BEAST_584:LIVER + CREATURE:FORGOTTEN_BEAST_584:GUT +$CREATURE:FORGOTTEN_BEAST_584:STOMACH +$CREATURE:FORGOTTEN_BEAST_584:GIZZARD +%CREATURE:FORGOTTEN_BEAST_584:PANCREAS +#CREATURE:FORGOTTEN_BEAST_584:SPLEEN +#CREATURE:FORGOTTEN_BEAST_584:KIDNEY +#CREATURE:FORGOTTEN_BEAST_586:MUSCLE + CREATURE:FORGOTTEN_BEAST_586:EYE +"CREATURE:FORGOTTEN_BEAST_586:BRAIN +!CREATURE:FORGOTTEN_BEAST_586:LUNG +"CREATURE:FORGOTTEN_BEAST_586:HEART +"CREATURE:FORGOTTEN_BEAST_586:LIVER + CREATURE:FORGOTTEN_BEAST_586:GUT +$CREATURE:FORGOTTEN_BEAST_586:STOMACH +$CREATURE:FORGOTTEN_BEAST_586:GIZZARD +%CREATURE:FORGOTTEN_BEAST_586:PANCREAS +#CREATURE:FORGOTTEN_BEAST_586:SPLEEN +#CREATURE:FORGOTTEN_BEAST_586:KIDNEY +#CREATURE:FORGOTTEN_BEAST_588:MUSCLE + CREATURE:FORGOTTEN_BEAST_588:EYE +"CREATURE:FORGOTTEN_BEAST_588:BRAIN +!CREATURE:FORGOTTEN_BEAST_588:LUNG +"CREATURE:FORGOTTEN_BEAST_588:HEART +"CREATURE:FORGOTTEN_BEAST_588:LIVER + CREATURE:FORGOTTEN_BEAST_588:GUT +$CREATURE:FORGOTTEN_BEAST_588:STOMACH +$CREATURE:FORGOTTEN_BEAST_588:GIZZARD +%CREATURE:FORGOTTEN_BEAST_588:PANCREAS +#CREATURE:FORGOTTEN_BEAST_588:SPLEEN +#CREATURE:FORGOTTEN_BEAST_588:KIDNEY +#CREATURE:FORGOTTEN_BEAST_589:MUSCLE + CREATURE:FORGOTTEN_BEAST_589:EYE +"CREATURE:FORGOTTEN_BEAST_589:BRAIN +!CREATURE:FORGOTTEN_BEAST_589:LUNG +"CREATURE:FORGOTTEN_BEAST_589:HEART +"CREATURE:FORGOTTEN_BEAST_589:LIVER + CREATURE:FORGOTTEN_BEAST_589:GUT +$CREATURE:FORGOTTEN_BEAST_589:STOMACH +$CREATURE:FORGOTTEN_BEAST_589:GIZZARD +%CREATURE:FORGOTTEN_BEAST_589:PANCREAS +#CREATURE:FORGOTTEN_BEAST_589:SPLEEN +#CREATURE:FORGOTTEN_BEAST_589:KIDNEY +#CREATURE:FORGOTTEN_BEAST_590:MUSCLE + CREATURE:FORGOTTEN_BEAST_590:EYE +"CREATURE:FORGOTTEN_BEAST_590:BRAIN +!CREATURE:FORGOTTEN_BEAST_590:LUNG +"CREATURE:FORGOTTEN_BEAST_590:HEART +"CREATURE:FORGOTTEN_BEAST_590:LIVER + CREATURE:FORGOTTEN_BEAST_590:GUT +$CREATURE:FORGOTTEN_BEAST_590:STOMACH +$CREATURE:FORGOTTEN_BEAST_590:GIZZARD +%CREATURE:FORGOTTEN_BEAST_590:PANCREAS +#CREATURE:FORGOTTEN_BEAST_590:SPLEEN +#CREATURE:FORGOTTEN_BEAST_590:KIDNEY +#CREATURE:FORGOTTEN_BEAST_592:MUSCLE + CREATURE:FORGOTTEN_BEAST_592:EYE +"CREATURE:FORGOTTEN_BEAST_592:BRAIN +!CREATURE:FORGOTTEN_BEAST_592:LUNG +"CREATURE:FORGOTTEN_BEAST_592:HEART +"CREATURE:FORGOTTEN_BEAST_592:LIVER + CREATURE:FORGOTTEN_BEAST_592:GUT +$CREATURE:FORGOTTEN_BEAST_592:STOMACH +$CREATURE:FORGOTTEN_BEAST_592:GIZZARD +%CREATURE:FORGOTTEN_BEAST_592:PANCREAS +#CREATURE:FORGOTTEN_BEAST_592:SPLEEN +#CREATURE:FORGOTTEN_BEAST_592:KIDNEY +#CREATURE:FORGOTTEN_BEAST_593:MUSCLE + CREATURE:FORGOTTEN_BEAST_593:EYE +"CREATURE:FORGOTTEN_BEAST_593:BRAIN +!CREATURE:FORGOTTEN_BEAST_593:LUNG +"CREATURE:FORGOTTEN_BEAST_593:HEART +"CREATURE:FORGOTTEN_BEAST_593:LIVER + CREATURE:FORGOTTEN_BEAST_593:GUT +$CREATURE:FORGOTTEN_BEAST_593:STOMACH +$CREATURE:FORGOTTEN_BEAST_593:GIZZARD +%CREATURE:FORGOTTEN_BEAST_593:PANCREAS +#CREATURE:FORGOTTEN_BEAST_593:SPLEEN +#CREATURE:FORGOTTEN_BEAST_593:KIDNEY +#CREATURE:FORGOTTEN_BEAST_594:MUSCLE + CREATURE:FORGOTTEN_BEAST_594:EYE +"CREATURE:FORGOTTEN_BEAST_594:BRAIN +!CREATURE:FORGOTTEN_BEAST_594:LUNG +"CREATURE:FORGOTTEN_BEAST_594:HEART +"CREATURE:FORGOTTEN_BEAST_594:LIVER + CREATURE:FORGOTTEN_BEAST_594:GUT +$CREATURE:FORGOTTEN_BEAST_594:STOMACH +$CREATURE:FORGOTTEN_BEAST_594:GIZZARD +%CREATURE:FORGOTTEN_BEAST_594:PANCREAS +#CREATURE:FORGOTTEN_BEAST_594:SPLEEN +#CREATURE:FORGOTTEN_BEAST_594:KIDNEY +#CREATURE:FORGOTTEN_BEAST_595:MUSCLE + CREATURE:FORGOTTEN_BEAST_595:EYE +"CREATURE:FORGOTTEN_BEAST_595:BRAIN +!CREATURE:FORGOTTEN_BEAST_595:LUNG +"CREATURE:FORGOTTEN_BEAST_595:HEART +"CREATURE:FORGOTTEN_BEAST_595:LIVER + CREATURE:FORGOTTEN_BEAST_595:GUT +$CREATURE:FORGOTTEN_BEAST_595:STOMACH +$CREATURE:FORGOTTEN_BEAST_595:GIZZARD +%CREATURE:FORGOTTEN_BEAST_595:PANCREAS +#CREATURE:FORGOTTEN_BEAST_595:SPLEEN +#CREATURE:FORGOTTEN_BEAST_595:KIDNEY +#CREATURE:FORGOTTEN_BEAST_596:MUSCLE + CREATURE:FORGOTTEN_BEAST_596:EYE +"CREATURE:FORGOTTEN_BEAST_596:BRAIN +!CREATURE:FORGOTTEN_BEAST_596:LUNG +"CREATURE:FORGOTTEN_BEAST_596:HEART +"CREATURE:FORGOTTEN_BEAST_596:LIVER + CREATURE:FORGOTTEN_BEAST_596:GUT +$CREATURE:FORGOTTEN_BEAST_596:STOMACH +$CREATURE:FORGOTTEN_BEAST_596:GIZZARD +%CREATURE:FORGOTTEN_BEAST_596:PANCREAS +#CREATURE:FORGOTTEN_BEAST_596:SPLEEN +#CREATURE:FORGOTTEN_BEAST_596:KIDNEY +#CREATURE:FORGOTTEN_BEAST_597:MUSCLE + CREATURE:FORGOTTEN_BEAST_597:EYE +"CREATURE:FORGOTTEN_BEAST_597:BRAIN +!CREATURE:FORGOTTEN_BEAST_597:LUNG +"CREATURE:FORGOTTEN_BEAST_597:HEART +"CREATURE:FORGOTTEN_BEAST_597:LIVER + CREATURE:FORGOTTEN_BEAST_597:GUT +$CREATURE:FORGOTTEN_BEAST_597:STOMACH +$CREATURE:FORGOTTEN_BEAST_597:GIZZARD +%CREATURE:FORGOTTEN_BEAST_597:PANCREAS +#CREATURE:FORGOTTEN_BEAST_597:SPLEEN +#CREATURE:FORGOTTEN_BEAST_597:KIDNEY +#CREATURE:FORGOTTEN_BEAST_599:MUSCLE + CREATURE:FORGOTTEN_BEAST_599:EYE +"CREATURE:FORGOTTEN_BEAST_599:BRAIN +!CREATURE:FORGOTTEN_BEAST_599:LUNG +"CREATURE:FORGOTTEN_BEAST_599:HEART +"CREATURE:FORGOTTEN_BEAST_599:LIVER + CREATURE:FORGOTTEN_BEAST_599:GUT +$CREATURE:FORGOTTEN_BEAST_599:STOMACH +$CREATURE:FORGOTTEN_BEAST_599:GIZZARD +%CREATURE:FORGOTTEN_BEAST_599:PANCREAS +#CREATURE:FORGOTTEN_BEAST_599:SPLEEN +#CREATURE:FORGOTTEN_BEAST_599:KIDNEY +#CREATURE:FORGOTTEN_BEAST_600:MUSCLE + CREATURE:FORGOTTEN_BEAST_600:EYE +"CREATURE:FORGOTTEN_BEAST_600:BRAIN +!CREATURE:FORGOTTEN_BEAST_600:LUNG +"CREATURE:FORGOTTEN_BEAST_600:HEART +"CREATURE:FORGOTTEN_BEAST_600:LIVER + CREATURE:FORGOTTEN_BEAST_600:GUT +$CREATURE:FORGOTTEN_BEAST_600:STOMACH +$CREATURE:FORGOTTEN_BEAST_600:GIZZARD +%CREATURE:FORGOTTEN_BEAST_600:PANCREAS +#CREATURE:FORGOTTEN_BEAST_600:SPLEEN +#CREATURE:FORGOTTEN_BEAST_600:KIDNEY +#CREATURE:FORGOTTEN_BEAST_601:MUSCLE + CREATURE:FORGOTTEN_BEAST_601:EYE +"CREATURE:FORGOTTEN_BEAST_601:BRAIN +!CREATURE:FORGOTTEN_BEAST_601:LUNG +"CREATURE:FORGOTTEN_BEAST_601:HEART +"CREATURE:FORGOTTEN_BEAST_601:LIVER + CREATURE:FORGOTTEN_BEAST_601:GUT +$CREATURE:FORGOTTEN_BEAST_601:STOMACH +$CREATURE:FORGOTTEN_BEAST_601:GIZZARD +%CREATURE:FORGOTTEN_BEAST_601:PANCREAS +#CREATURE:FORGOTTEN_BEAST_601:SPLEEN +#CREATURE:FORGOTTEN_BEAST_601:KIDNEY +#CREATURE:FORGOTTEN_BEAST_603:MUSCLE + CREATURE:FORGOTTEN_BEAST_603:EYE +"CREATURE:FORGOTTEN_BEAST_603:BRAIN +!CREATURE:FORGOTTEN_BEAST_603:LUNG +"CREATURE:FORGOTTEN_BEAST_603:HEART +"CREATURE:FORGOTTEN_BEAST_603:LIVER + CREATURE:FORGOTTEN_BEAST_603:GUT +$CREATURE:FORGOTTEN_BEAST_603:STOMACH +$CREATURE:FORGOTTEN_BEAST_603:GIZZARD +%CREATURE:FORGOTTEN_BEAST_603:PANCREAS +#CREATURE:FORGOTTEN_BEAST_603:SPLEEN +#CREATURE:FORGOTTEN_BEAST_603:KIDNEY +#CREATURE:FORGOTTEN_BEAST_605:MUSCLE + CREATURE:FORGOTTEN_BEAST_605:EYE +"CREATURE:FORGOTTEN_BEAST_605:BRAIN +!CREATURE:FORGOTTEN_BEAST_605:LUNG +"CREATURE:FORGOTTEN_BEAST_605:HEART +"CREATURE:FORGOTTEN_BEAST_605:LIVER + CREATURE:FORGOTTEN_BEAST_605:GUT +$CREATURE:FORGOTTEN_BEAST_605:STOMACH +$CREATURE:FORGOTTEN_BEAST_605:GIZZARD +%CREATURE:FORGOTTEN_BEAST_605:PANCREAS +#CREATURE:FORGOTTEN_BEAST_605:SPLEEN +#CREATURE:FORGOTTEN_BEAST_605:KIDNEY +#CREATURE:FORGOTTEN_BEAST_607:MUSCLE + CREATURE:FORGOTTEN_BEAST_607:EYE +"CREATURE:FORGOTTEN_BEAST_607:BRAIN +!CREATURE:FORGOTTEN_BEAST_607:LUNG +"CREATURE:FORGOTTEN_BEAST_607:HEART +"CREATURE:FORGOTTEN_BEAST_607:LIVER + CREATURE:FORGOTTEN_BEAST_607:GUT +$CREATURE:FORGOTTEN_BEAST_607:STOMACH +$CREATURE:FORGOTTEN_BEAST_607:GIZZARD +%CREATURE:FORGOTTEN_BEAST_607:PANCREAS +#CREATURE:FORGOTTEN_BEAST_607:SPLEEN +#CREATURE:FORGOTTEN_BEAST_607:KIDNEY +#CREATURE:FORGOTTEN_BEAST_608:MUSCLE + CREATURE:FORGOTTEN_BEAST_608:EYE +"CREATURE:FORGOTTEN_BEAST_608:BRAIN +!CREATURE:FORGOTTEN_BEAST_608:LUNG +"CREATURE:FORGOTTEN_BEAST_608:HEART +"CREATURE:FORGOTTEN_BEAST_608:LIVER + CREATURE:FORGOTTEN_BEAST_608:GUT +$CREATURE:FORGOTTEN_BEAST_608:STOMACH +$CREATURE:FORGOTTEN_BEAST_608:GIZZARD +%CREATURE:FORGOTTEN_BEAST_608:PANCREAS +#CREATURE:FORGOTTEN_BEAST_608:SPLEEN +#CREATURE:FORGOTTEN_BEAST_608:KIDNEY +#CREATURE:FORGOTTEN_BEAST_609:MUSCLE + CREATURE:FORGOTTEN_BEAST_609:EYE +"CREATURE:FORGOTTEN_BEAST_609:BRAIN +!CREATURE:FORGOTTEN_BEAST_609:LUNG +"CREATURE:FORGOTTEN_BEAST_609:HEART +"CREATURE:FORGOTTEN_BEAST_609:LIVER + CREATURE:FORGOTTEN_BEAST_609:GUT +$CREATURE:FORGOTTEN_BEAST_609:STOMACH +$CREATURE:FORGOTTEN_BEAST_609:GIZZARD +%CREATURE:FORGOTTEN_BEAST_609:PANCREAS +#CREATURE:FORGOTTEN_BEAST_609:SPLEEN +#CREATURE:FORGOTTEN_BEAST_609:KIDNEY +#CREATURE:FORGOTTEN_BEAST_610:MUSCLE + CREATURE:FORGOTTEN_BEAST_610:EYE +"CREATURE:FORGOTTEN_BEAST_610:BRAIN +!CREATURE:FORGOTTEN_BEAST_610:LUNG +"CREATURE:FORGOTTEN_BEAST_610:HEART +"CREATURE:FORGOTTEN_BEAST_610:LIVER + CREATURE:FORGOTTEN_BEAST_610:GUT +$CREATURE:FORGOTTEN_BEAST_610:STOMACH +$CREATURE:FORGOTTEN_BEAST_610:GIZZARD +%CREATURE:FORGOTTEN_BEAST_610:PANCREAS +#CREATURE:FORGOTTEN_BEAST_610:SPLEEN +#CREATURE:FORGOTTEN_BEAST_610:KIDNEY +#CREATURE:FORGOTTEN_BEAST_611:MUSCLE + CREATURE:FORGOTTEN_BEAST_611:EYE +"CREATURE:FORGOTTEN_BEAST_611:BRAIN +!CREATURE:FORGOTTEN_BEAST_611:LUNG +"CREATURE:FORGOTTEN_BEAST_611:HEART +"CREATURE:FORGOTTEN_BEAST_611:LIVER + CREATURE:FORGOTTEN_BEAST_611:GUT +$CREATURE:FORGOTTEN_BEAST_611:STOMACH +$CREATURE:FORGOTTEN_BEAST_611:GIZZARD +%CREATURE:FORGOTTEN_BEAST_611:PANCREAS +#CREATURE:FORGOTTEN_BEAST_611:SPLEEN +#CREATURE:FORGOTTEN_BEAST_611:KIDNEY +#CREATURE:FORGOTTEN_BEAST_612:MUSCLE + CREATURE:FORGOTTEN_BEAST_612:EYE +"CREATURE:FORGOTTEN_BEAST_612:BRAIN +!CREATURE:FORGOTTEN_BEAST_612:LUNG +"CREATURE:FORGOTTEN_BEAST_612:HEART +"CREATURE:FORGOTTEN_BEAST_612:LIVER + CREATURE:FORGOTTEN_BEAST_612:GUT +$CREATURE:FORGOTTEN_BEAST_612:STOMACH +$CREATURE:FORGOTTEN_BEAST_612:GIZZARD +%CREATURE:FORGOTTEN_BEAST_612:PANCREAS +#CREATURE:FORGOTTEN_BEAST_612:SPLEEN +#CREATURE:FORGOTTEN_BEAST_612:KIDNEY +#CREATURE:FORGOTTEN_BEAST_613:MUSCLE + CREATURE:FORGOTTEN_BEAST_613:EYE +"CREATURE:FORGOTTEN_BEAST_613:BRAIN +!CREATURE:FORGOTTEN_BEAST_613:LUNG +"CREATURE:FORGOTTEN_BEAST_613:HEART +"CREATURE:FORGOTTEN_BEAST_613:LIVER + CREATURE:FORGOTTEN_BEAST_613:GUT +$CREATURE:FORGOTTEN_BEAST_613:STOMACH +$CREATURE:FORGOTTEN_BEAST_613:GIZZARD +%CREATURE:FORGOTTEN_BEAST_613:PANCREAS +#CREATURE:FORGOTTEN_BEAST_613:SPLEEN +#CREATURE:FORGOTTEN_BEAST_613:KIDNEY +#CREATURE:FORGOTTEN_BEAST_614:MUSCLE + CREATURE:FORGOTTEN_BEAST_614:EYE +"CREATURE:FORGOTTEN_BEAST_614:BRAIN +!CREATURE:FORGOTTEN_BEAST_614:LUNG +"CREATURE:FORGOTTEN_BEAST_614:HEART +"CREATURE:FORGOTTEN_BEAST_614:LIVER + CREATURE:FORGOTTEN_BEAST_614:GUT +$CREATURE:FORGOTTEN_BEAST_614:STOMACH +$CREATURE:FORGOTTEN_BEAST_614:GIZZARD +%CREATURE:FORGOTTEN_BEAST_614:PANCREAS +#CREATURE:FORGOTTEN_BEAST_614:SPLEEN +#CREATURE:FORGOTTEN_BEAST_614:KIDNEY +#CREATURE:FORGOTTEN_BEAST_616:MUSCLE + CREATURE:FORGOTTEN_BEAST_616:EYE +"CREATURE:FORGOTTEN_BEAST_616:BRAIN +!CREATURE:FORGOTTEN_BEAST_616:LUNG +"CREATURE:FORGOTTEN_BEAST_616:HEART +"CREATURE:FORGOTTEN_BEAST_616:LIVER + CREATURE:FORGOTTEN_BEAST_616:GUT +$CREATURE:FORGOTTEN_BEAST_616:STOMACH +$CREATURE:FORGOTTEN_BEAST_616:GIZZARD +%CREATURE:FORGOTTEN_BEAST_616:PANCREAS +#CREATURE:FORGOTTEN_BEAST_616:SPLEEN +#CREATURE:FORGOTTEN_BEAST_616:KIDNEY +#CREATURE:FORGOTTEN_BEAST_619:MUSCLE + CREATURE:FORGOTTEN_BEAST_619:EYE +"CREATURE:FORGOTTEN_BEAST_619:BRAIN +!CREATURE:FORGOTTEN_BEAST_619:LUNG +"CREATURE:FORGOTTEN_BEAST_619:HEART +"CREATURE:FORGOTTEN_BEAST_619:LIVER + CREATURE:FORGOTTEN_BEAST_619:GUT +$CREATURE:FORGOTTEN_BEAST_619:STOMACH +$CREATURE:FORGOTTEN_BEAST_619:GIZZARD +%CREATURE:FORGOTTEN_BEAST_619:PANCREAS +#CREATURE:FORGOTTEN_BEAST_619:SPLEEN +#CREATURE:FORGOTTEN_BEAST_619:KIDNEY +#CREATURE:FORGOTTEN_BEAST_620:MUSCLE + CREATURE:FORGOTTEN_BEAST_620:EYE +"CREATURE:FORGOTTEN_BEAST_620:BRAIN +!CREATURE:FORGOTTEN_BEAST_620:LUNG +"CREATURE:FORGOTTEN_BEAST_620:HEART +"CREATURE:FORGOTTEN_BEAST_620:LIVER + CREATURE:FORGOTTEN_BEAST_620:GUT +$CREATURE:FORGOTTEN_BEAST_620:STOMACH +$CREATURE:FORGOTTEN_BEAST_620:GIZZARD +%CREATURE:FORGOTTEN_BEAST_620:PANCREAS +#CREATURE:FORGOTTEN_BEAST_620:SPLEEN +#CREATURE:FORGOTTEN_BEAST_620:KIDNEY +#CREATURE:FORGOTTEN_BEAST_621:MUSCLE + CREATURE:FORGOTTEN_BEAST_621:EYE +"CREATURE:FORGOTTEN_BEAST_621:BRAIN +!CREATURE:FORGOTTEN_BEAST_621:LUNG +"CREATURE:FORGOTTEN_BEAST_621:HEART +"CREATURE:FORGOTTEN_BEAST_621:LIVER + CREATURE:FORGOTTEN_BEAST_621:GUT +$CREATURE:FORGOTTEN_BEAST_621:STOMACH +$CREATURE:FORGOTTEN_BEAST_621:GIZZARD +%CREATURE:FORGOTTEN_BEAST_621:PANCREAS +#CREATURE:FORGOTTEN_BEAST_621:SPLEEN +#CREATURE:FORGOTTEN_BEAST_621:KIDNEY +#CREATURE:FORGOTTEN_BEAST_623:MUSCLE + CREATURE:FORGOTTEN_BEAST_623:EYE +"CREATURE:FORGOTTEN_BEAST_623:BRAIN +!CREATURE:FORGOTTEN_BEAST_623:LUNG +"CREATURE:FORGOTTEN_BEAST_623:HEART +"CREATURE:FORGOTTEN_BEAST_623:LIVER + CREATURE:FORGOTTEN_BEAST_623:GUT +$CREATURE:FORGOTTEN_BEAST_623:STOMACH +$CREATURE:FORGOTTEN_BEAST_623:GIZZARD +%CREATURE:FORGOTTEN_BEAST_623:PANCREAS +#CREATURE:FORGOTTEN_BEAST_623:SPLEEN +#CREATURE:FORGOTTEN_BEAST_623:KIDNEY +#CREATURE:FORGOTTEN_BEAST_624:MUSCLE + CREATURE:FORGOTTEN_BEAST_624:EYE +"CREATURE:FORGOTTEN_BEAST_624:BRAIN +!CREATURE:FORGOTTEN_BEAST_624:LUNG +"CREATURE:FORGOTTEN_BEAST_624:HEART +"CREATURE:FORGOTTEN_BEAST_624:LIVER + CREATURE:FORGOTTEN_BEAST_624:GUT +$CREATURE:FORGOTTEN_BEAST_624:STOMACH +$CREATURE:FORGOTTEN_BEAST_624:GIZZARD +%CREATURE:FORGOTTEN_BEAST_624:PANCREAS +#CREATURE:FORGOTTEN_BEAST_624:SPLEEN +#CREATURE:FORGOTTEN_BEAST_624:KIDNEY +#CREATURE:FORGOTTEN_BEAST_625:MUSCLE + CREATURE:FORGOTTEN_BEAST_625:EYE +"CREATURE:FORGOTTEN_BEAST_625:BRAIN +!CREATURE:FORGOTTEN_BEAST_625:LUNG +"CREATURE:FORGOTTEN_BEAST_625:HEART +"CREATURE:FORGOTTEN_BEAST_625:LIVER + CREATURE:FORGOTTEN_BEAST_625:GUT +$CREATURE:FORGOTTEN_BEAST_625:STOMACH +$CREATURE:FORGOTTEN_BEAST_625:GIZZARD +%CREATURE:FORGOTTEN_BEAST_625:PANCREAS +#CREATURE:FORGOTTEN_BEAST_625:SPLEEN +#CREATURE:FORGOTTEN_BEAST_625:KIDNEY +#CREATURE:FORGOTTEN_BEAST_626:MUSCLE + CREATURE:FORGOTTEN_BEAST_626:EYE +"CREATURE:FORGOTTEN_BEAST_626:BRAIN +!CREATURE:FORGOTTEN_BEAST_626:LUNG +"CREATURE:FORGOTTEN_BEAST_626:HEART +"CREATURE:FORGOTTEN_BEAST_626:LIVER + CREATURE:FORGOTTEN_BEAST_626:GUT +$CREATURE:FORGOTTEN_BEAST_626:STOMACH +$CREATURE:FORGOTTEN_BEAST_626:GIZZARD +%CREATURE:FORGOTTEN_BEAST_626:PANCREAS +#CREATURE:FORGOTTEN_BEAST_626:SPLEEN +#CREATURE:FORGOTTEN_BEAST_626:KIDNEY +#CREATURE:FORGOTTEN_BEAST_627:MUSCLE + CREATURE:FORGOTTEN_BEAST_627:EYE +"CREATURE:FORGOTTEN_BEAST_627:BRAIN +!CREATURE:FORGOTTEN_BEAST_627:LUNG +"CREATURE:FORGOTTEN_BEAST_627:HEART +"CREATURE:FORGOTTEN_BEAST_627:LIVER + CREATURE:FORGOTTEN_BEAST_627:GUT +$CREATURE:FORGOTTEN_BEAST_627:STOMACH +$CREATURE:FORGOTTEN_BEAST_627:GIZZARD +%CREATURE:FORGOTTEN_BEAST_627:PANCREAS +#CREATURE:FORGOTTEN_BEAST_627:SPLEEN +#CREATURE:FORGOTTEN_BEAST_627:KIDNEY +#CREATURE:FORGOTTEN_BEAST_628:MUSCLE + CREATURE:FORGOTTEN_BEAST_628:EYE +"CREATURE:FORGOTTEN_BEAST_628:BRAIN +!CREATURE:FORGOTTEN_BEAST_628:LUNG +"CREATURE:FORGOTTEN_BEAST_628:HEART +"CREATURE:FORGOTTEN_BEAST_628:LIVER + CREATURE:FORGOTTEN_BEAST_628:GUT +$CREATURE:FORGOTTEN_BEAST_628:STOMACH +$CREATURE:FORGOTTEN_BEAST_628:GIZZARD +%CREATURE:FORGOTTEN_BEAST_628:PANCREAS +#CREATURE:FORGOTTEN_BEAST_628:SPLEEN +#CREATURE:FORGOTTEN_BEAST_628:KIDNEY +#CREATURE:FORGOTTEN_BEAST_629:MUSCLE + CREATURE:FORGOTTEN_BEAST_629:EYE +"CREATURE:FORGOTTEN_BEAST_629:BRAIN +!CREATURE:FORGOTTEN_BEAST_629:LUNG +"CREATURE:FORGOTTEN_BEAST_629:HEART +"CREATURE:FORGOTTEN_BEAST_629:LIVER + CREATURE:FORGOTTEN_BEAST_629:GUT +$CREATURE:FORGOTTEN_BEAST_629:STOMACH +$CREATURE:FORGOTTEN_BEAST_629:GIZZARD +%CREATURE:FORGOTTEN_BEAST_629:PANCREAS +#CREATURE:FORGOTTEN_BEAST_629:SPLEEN +#CREATURE:FORGOTTEN_BEAST_629:KIDNEY +#CREATURE:FORGOTTEN_BEAST_630:MUSCLE + CREATURE:FORGOTTEN_BEAST_630:EYE +"CREATURE:FORGOTTEN_BEAST_630:BRAIN +!CREATURE:FORGOTTEN_BEAST_630:LUNG +"CREATURE:FORGOTTEN_BEAST_630:HEART +"CREATURE:FORGOTTEN_BEAST_630:LIVER + CREATURE:FORGOTTEN_BEAST_630:GUT +$CREATURE:FORGOTTEN_BEAST_630:STOMACH +$CREATURE:FORGOTTEN_BEAST_630:GIZZARD +%CREATURE:FORGOTTEN_BEAST_630:PANCREAS +#CREATURE:FORGOTTEN_BEAST_630:SPLEEN +#CREATURE:FORGOTTEN_BEAST_630:KIDNEY +#CREATURE:FORGOTTEN_BEAST_631:MUSCLE + CREATURE:FORGOTTEN_BEAST_631:EYE +"CREATURE:FORGOTTEN_BEAST_631:BRAIN +!CREATURE:FORGOTTEN_BEAST_631:LUNG +"CREATURE:FORGOTTEN_BEAST_631:HEART +"CREATURE:FORGOTTEN_BEAST_631:LIVER + CREATURE:FORGOTTEN_BEAST_631:GUT +$CREATURE:FORGOTTEN_BEAST_631:STOMACH +$CREATURE:FORGOTTEN_BEAST_631:GIZZARD +%CREATURE:FORGOTTEN_BEAST_631:PANCREAS +#CREATURE:FORGOTTEN_BEAST_631:SPLEEN +#CREATURE:FORGOTTEN_BEAST_631:KIDNEY +#CREATURE:FORGOTTEN_BEAST_632:MUSCLE + CREATURE:FORGOTTEN_BEAST_632:EYE +"CREATURE:FORGOTTEN_BEAST_632:BRAIN +!CREATURE:FORGOTTEN_BEAST_632:LUNG +"CREATURE:FORGOTTEN_BEAST_632:HEART +"CREATURE:FORGOTTEN_BEAST_632:LIVER + CREATURE:FORGOTTEN_BEAST_632:GUT +$CREATURE:FORGOTTEN_BEAST_632:STOMACH +$CREATURE:FORGOTTEN_BEAST_632:GIZZARD +%CREATURE:FORGOTTEN_BEAST_632:PANCREAS +#CREATURE:FORGOTTEN_BEAST_632:SPLEEN +#CREATURE:FORGOTTEN_BEAST_632:KIDNEY +#CREATURE:FORGOTTEN_BEAST_633:MUSCLE + CREATURE:FORGOTTEN_BEAST_633:EYE +"CREATURE:FORGOTTEN_BEAST_633:BRAIN +!CREATURE:FORGOTTEN_BEAST_633:LUNG +"CREATURE:FORGOTTEN_BEAST_633:HEART +"CREATURE:FORGOTTEN_BEAST_633:LIVER + CREATURE:FORGOTTEN_BEAST_633:GUT +$CREATURE:FORGOTTEN_BEAST_633:STOMACH +$CREATURE:FORGOTTEN_BEAST_633:GIZZARD +%CREATURE:FORGOTTEN_BEAST_633:PANCREAS +#CREATURE:FORGOTTEN_BEAST_633:SPLEEN +#CREATURE:FORGOTTEN_BEAST_633:KIDNEY +#CREATURE:FORGOTTEN_BEAST_634:MUSCLE + CREATURE:FORGOTTEN_BEAST_634:EYE +"CREATURE:FORGOTTEN_BEAST_634:BRAIN +!CREATURE:FORGOTTEN_BEAST_634:LUNG +"CREATURE:FORGOTTEN_BEAST_634:HEART +"CREATURE:FORGOTTEN_BEAST_634:LIVER + CREATURE:FORGOTTEN_BEAST_634:GUT +$CREATURE:FORGOTTEN_BEAST_634:STOMACH +$CREATURE:FORGOTTEN_BEAST_634:GIZZARD +%CREATURE:FORGOTTEN_BEAST_634:PANCREAS +#CREATURE:FORGOTTEN_BEAST_634:SPLEEN +#CREATURE:FORGOTTEN_BEAST_634:KIDNEY +#CREATURE:FORGOTTEN_BEAST_635:MUSCLE + CREATURE:FORGOTTEN_BEAST_635:EYE +"CREATURE:FORGOTTEN_BEAST_635:BRAIN +!CREATURE:FORGOTTEN_BEAST_635:LUNG +"CREATURE:FORGOTTEN_BEAST_635:HEART +"CREATURE:FORGOTTEN_BEAST_635:LIVER + CREATURE:FORGOTTEN_BEAST_635:GUT +$CREATURE:FORGOTTEN_BEAST_635:STOMACH +$CREATURE:FORGOTTEN_BEAST_635:GIZZARD +%CREATURE:FORGOTTEN_BEAST_635:PANCREAS +#CREATURE:FORGOTTEN_BEAST_635:SPLEEN +#CREATURE:FORGOTTEN_BEAST_635:KIDNEY +#CREATURE:FORGOTTEN_BEAST_636:MUSCLE + CREATURE:FORGOTTEN_BEAST_636:EYE +"CREATURE:FORGOTTEN_BEAST_636:BRAIN +!CREATURE:FORGOTTEN_BEAST_636:LUNG +"CREATURE:FORGOTTEN_BEAST_636:HEART +"CREATURE:FORGOTTEN_BEAST_636:LIVER + CREATURE:FORGOTTEN_BEAST_636:GUT +$CREATURE:FORGOTTEN_BEAST_636:STOMACH +$CREATURE:FORGOTTEN_BEAST_636:GIZZARD +%CREATURE:FORGOTTEN_BEAST_636:PANCREAS +#CREATURE:FORGOTTEN_BEAST_636:SPLEEN +#CREATURE:FORGOTTEN_BEAST_636:KIDNEY +#CREATURE:FORGOTTEN_BEAST_637:MUSCLE + CREATURE:FORGOTTEN_BEAST_637:EYE +"CREATURE:FORGOTTEN_BEAST_637:BRAIN +!CREATURE:FORGOTTEN_BEAST_637:LUNG +"CREATURE:FORGOTTEN_BEAST_637:HEART +"CREATURE:FORGOTTEN_BEAST_637:LIVER + CREATURE:FORGOTTEN_BEAST_637:GUT +$CREATURE:FORGOTTEN_BEAST_637:STOMACH +$CREATURE:FORGOTTEN_BEAST_637:GIZZARD +%CREATURE:FORGOTTEN_BEAST_637:PANCREAS +#CREATURE:FORGOTTEN_BEAST_637:SPLEEN +#CREATURE:FORGOTTEN_BEAST_637:KIDNEY +#CREATURE:FORGOTTEN_BEAST_639:MUSCLE + CREATURE:FORGOTTEN_BEAST_639:EYE +"CREATURE:FORGOTTEN_BEAST_639:BRAIN +!CREATURE:FORGOTTEN_BEAST_639:LUNG +"CREATURE:FORGOTTEN_BEAST_639:HEART +"CREATURE:FORGOTTEN_BEAST_639:LIVER + CREATURE:FORGOTTEN_BEAST_639:GUT +$CREATURE:FORGOTTEN_BEAST_639:STOMACH +$CREATURE:FORGOTTEN_BEAST_639:GIZZARD +%CREATURE:FORGOTTEN_BEAST_639:PANCREAS +#CREATURE:FORGOTTEN_BEAST_639:SPLEEN +#CREATURE:FORGOTTEN_BEAST_639:KIDNEY +#CREATURE:FORGOTTEN_BEAST_640:MUSCLE + CREATURE:FORGOTTEN_BEAST_640:EYE +"CREATURE:FORGOTTEN_BEAST_640:BRAIN +!CREATURE:FORGOTTEN_BEAST_640:LUNG +"CREATURE:FORGOTTEN_BEAST_640:HEART +"CREATURE:FORGOTTEN_BEAST_640:LIVER + CREATURE:FORGOTTEN_BEAST_640:GUT +$CREATURE:FORGOTTEN_BEAST_640:STOMACH +$CREATURE:FORGOTTEN_BEAST_640:GIZZARD +%CREATURE:FORGOTTEN_BEAST_640:PANCREAS +#CREATURE:FORGOTTEN_BEAST_640:SPLEEN +#CREATURE:FORGOTTEN_BEAST_640:KIDNEY +#CREATURE:FORGOTTEN_BEAST_643:MUSCLE + CREATURE:FORGOTTEN_BEAST_643:EYE +"CREATURE:FORGOTTEN_BEAST_643:BRAIN +!CREATURE:FORGOTTEN_BEAST_643:LUNG +"CREATURE:FORGOTTEN_BEAST_643:HEART +"CREATURE:FORGOTTEN_BEAST_643:LIVER + CREATURE:FORGOTTEN_BEAST_643:GUT +$CREATURE:FORGOTTEN_BEAST_643:STOMACH +$CREATURE:FORGOTTEN_BEAST_643:GIZZARD +%CREATURE:FORGOTTEN_BEAST_643:PANCREAS +#CREATURE:FORGOTTEN_BEAST_643:SPLEEN +#CREATURE:FORGOTTEN_BEAST_643:KIDNEY +#CREATURE:FORGOTTEN_BEAST_644:MUSCLE + CREATURE:FORGOTTEN_BEAST_644:EYE +"CREATURE:FORGOTTEN_BEAST_644:BRAIN +!CREATURE:FORGOTTEN_BEAST_644:LUNG +"CREATURE:FORGOTTEN_BEAST_644:HEART +"CREATURE:FORGOTTEN_BEAST_644:LIVER + CREATURE:FORGOTTEN_BEAST_644:GUT +$CREATURE:FORGOTTEN_BEAST_644:STOMACH +$CREATURE:FORGOTTEN_BEAST_644:GIZZARD +%CREATURE:FORGOTTEN_BEAST_644:PANCREAS +#CREATURE:FORGOTTEN_BEAST_644:SPLEEN +#CREATURE:FORGOTTEN_BEAST_644:KIDNEY +#CREATURE:FORGOTTEN_BEAST_645:MUSCLE + CREATURE:FORGOTTEN_BEAST_645:EYE +"CREATURE:FORGOTTEN_BEAST_645:BRAIN +!CREATURE:FORGOTTEN_BEAST_645:LUNG +"CREATURE:FORGOTTEN_BEAST_645:HEART +"CREATURE:FORGOTTEN_BEAST_645:LIVER + CREATURE:FORGOTTEN_BEAST_645:GUT +$CREATURE:FORGOTTEN_BEAST_645:STOMACH +$CREATURE:FORGOTTEN_BEAST_645:GIZZARD +%CREATURE:FORGOTTEN_BEAST_645:PANCREAS +#CREATURE:FORGOTTEN_BEAST_645:SPLEEN +#CREATURE:FORGOTTEN_BEAST_645:KIDNEY +#CREATURE:FORGOTTEN_BEAST_646:MUSCLE + CREATURE:FORGOTTEN_BEAST_646:EYE +"CREATURE:FORGOTTEN_BEAST_646:BRAIN +!CREATURE:FORGOTTEN_BEAST_646:LUNG +"CREATURE:FORGOTTEN_BEAST_646:HEART +"CREATURE:FORGOTTEN_BEAST_646:LIVER + CREATURE:FORGOTTEN_BEAST_646:GUT +$CREATURE:FORGOTTEN_BEAST_646:STOMACH +$CREATURE:FORGOTTEN_BEAST_646:GIZZARD +%CREATURE:FORGOTTEN_BEAST_646:PANCREAS +#CREATURE:FORGOTTEN_BEAST_646:SPLEEN +#CREATURE:FORGOTTEN_BEAST_646:KIDNEY +#CREATURE:FORGOTTEN_BEAST_647:MUSCLE + CREATURE:FORGOTTEN_BEAST_647:EYE +"CREATURE:FORGOTTEN_BEAST_647:BRAIN +!CREATURE:FORGOTTEN_BEAST_647:LUNG +"CREATURE:FORGOTTEN_BEAST_647:HEART +"CREATURE:FORGOTTEN_BEAST_647:LIVER + CREATURE:FORGOTTEN_BEAST_647:GUT +$CREATURE:FORGOTTEN_BEAST_647:STOMACH +$CREATURE:FORGOTTEN_BEAST_647:GIZZARD +%CREATURE:FORGOTTEN_BEAST_647:PANCREAS +#CREATURE:FORGOTTEN_BEAST_647:SPLEEN +#CREATURE:FORGOTTEN_BEAST_647:KIDNEY +#CREATURE:FORGOTTEN_BEAST_649:MUSCLE + CREATURE:FORGOTTEN_BEAST_649:EYE +"CREATURE:FORGOTTEN_BEAST_649:BRAIN +!CREATURE:FORGOTTEN_BEAST_649:LUNG +"CREATURE:FORGOTTEN_BEAST_649:HEART +"CREATURE:FORGOTTEN_BEAST_649:LIVER + CREATURE:FORGOTTEN_BEAST_649:GUT +$CREATURE:FORGOTTEN_BEAST_649:STOMACH +$CREATURE:FORGOTTEN_BEAST_649:GIZZARD +%CREATURE:FORGOTTEN_BEAST_649:PANCREAS +#CREATURE:FORGOTTEN_BEAST_649:SPLEEN +#CREATURE:FORGOTTEN_BEAST_649:KIDNEY +#CREATURE:FORGOTTEN_BEAST_650:MUSCLE + CREATURE:FORGOTTEN_BEAST_650:EYE +"CREATURE:FORGOTTEN_BEAST_650:BRAIN +!CREATURE:FORGOTTEN_BEAST_650:LUNG +"CREATURE:FORGOTTEN_BEAST_650:HEART +"CREATURE:FORGOTTEN_BEAST_650:LIVER + CREATURE:FORGOTTEN_BEAST_650:GUT +$CREATURE:FORGOTTEN_BEAST_650:STOMACH +$CREATURE:FORGOTTEN_BEAST_650:GIZZARD +%CREATURE:FORGOTTEN_BEAST_650:PANCREAS +#CREATURE:FORGOTTEN_BEAST_650:SPLEEN +#CREATURE:FORGOTTEN_BEAST_650:KIDNEY +#CREATURE:FORGOTTEN_BEAST_651:MUSCLE + CREATURE:FORGOTTEN_BEAST_651:EYE +"CREATURE:FORGOTTEN_BEAST_651:BRAIN +!CREATURE:FORGOTTEN_BEAST_651:LUNG +"CREATURE:FORGOTTEN_BEAST_651:HEART +"CREATURE:FORGOTTEN_BEAST_651:LIVER + CREATURE:FORGOTTEN_BEAST_651:GUT +$CREATURE:FORGOTTEN_BEAST_651:STOMACH +$CREATURE:FORGOTTEN_BEAST_651:GIZZARD +%CREATURE:FORGOTTEN_BEAST_651:PANCREAS +#CREATURE:FORGOTTEN_BEAST_651:SPLEEN +#CREATURE:FORGOTTEN_BEAST_651:KIDNEY +#CREATURE:FORGOTTEN_BEAST_652:MUSCLE + CREATURE:FORGOTTEN_BEAST_652:EYE +"CREATURE:FORGOTTEN_BEAST_652:BRAIN +!CREATURE:FORGOTTEN_BEAST_652:LUNG +"CREATURE:FORGOTTEN_BEAST_652:HEART +"CREATURE:FORGOTTEN_BEAST_652:LIVER + CREATURE:FORGOTTEN_BEAST_652:GUT +$CREATURE:FORGOTTEN_BEAST_652:STOMACH +$CREATURE:FORGOTTEN_BEAST_652:GIZZARD +%CREATURE:FORGOTTEN_BEAST_652:PANCREAS +#CREATURE:FORGOTTEN_BEAST_652:SPLEEN +#CREATURE:FORGOTTEN_BEAST_652:KIDNEY +#CREATURE:FORGOTTEN_BEAST_656:MUSCLE + CREATURE:FORGOTTEN_BEAST_656:EYE +"CREATURE:FORGOTTEN_BEAST_656:BRAIN +!CREATURE:FORGOTTEN_BEAST_656:LUNG +"CREATURE:FORGOTTEN_BEAST_656:HEART +"CREATURE:FORGOTTEN_BEAST_656:LIVER + CREATURE:FORGOTTEN_BEAST_656:GUT +$CREATURE:FORGOTTEN_BEAST_656:STOMACH +$CREATURE:FORGOTTEN_BEAST_656:GIZZARD +%CREATURE:FORGOTTEN_BEAST_656:PANCREAS +#CREATURE:FORGOTTEN_BEAST_656:SPLEEN +#CREATURE:FORGOTTEN_BEAST_656:KIDNEY +#CREATURE:FORGOTTEN_BEAST_658:MUSCLE + CREATURE:FORGOTTEN_BEAST_658:EYE +"CREATURE:FORGOTTEN_BEAST_658:BRAIN +!CREATURE:FORGOTTEN_BEAST_658:LUNG +"CREATURE:FORGOTTEN_BEAST_658:HEART +"CREATURE:FORGOTTEN_BEAST_658:LIVER + CREATURE:FORGOTTEN_BEAST_658:GUT +$CREATURE:FORGOTTEN_BEAST_658:STOMACH +$CREATURE:FORGOTTEN_BEAST_658:GIZZARD +%CREATURE:FORGOTTEN_BEAST_658:PANCREAS +#CREATURE:FORGOTTEN_BEAST_658:SPLEEN +#CREATURE:FORGOTTEN_BEAST_658:KIDNEY +#CREATURE:FORGOTTEN_BEAST_659:MUSCLE + CREATURE:FORGOTTEN_BEAST_659:EYE +"CREATURE:FORGOTTEN_BEAST_659:BRAIN +!CREATURE:FORGOTTEN_BEAST_659:LUNG +"CREATURE:FORGOTTEN_BEAST_659:HEART +"CREATURE:FORGOTTEN_BEAST_659:LIVER + CREATURE:FORGOTTEN_BEAST_659:GUT +$CREATURE:FORGOTTEN_BEAST_659:STOMACH +$CREATURE:FORGOTTEN_BEAST_659:GIZZARD +%CREATURE:FORGOTTEN_BEAST_659:PANCREAS +#CREATURE:FORGOTTEN_BEAST_659:SPLEEN +#CREATURE:FORGOTTEN_BEAST_659:KIDNEY +#CREATURE:FORGOTTEN_BEAST_661:MUSCLE + CREATURE:FORGOTTEN_BEAST_661:EYE +"CREATURE:FORGOTTEN_BEAST_661:BRAIN +!CREATURE:FORGOTTEN_BEAST_661:LUNG +"CREATURE:FORGOTTEN_BEAST_661:HEART +"CREATURE:FORGOTTEN_BEAST_661:LIVER + CREATURE:FORGOTTEN_BEAST_661:GUT +$CREATURE:FORGOTTEN_BEAST_661:STOMACH +$CREATURE:FORGOTTEN_BEAST_661:GIZZARD +%CREATURE:FORGOTTEN_BEAST_661:PANCREAS +#CREATURE:FORGOTTEN_BEAST_661:SPLEEN +#CREATURE:FORGOTTEN_BEAST_661:KIDNEY +#CREATURE:FORGOTTEN_BEAST_663:MUSCLE + CREATURE:FORGOTTEN_BEAST_663:EYE +"CREATURE:FORGOTTEN_BEAST_663:BRAIN +!CREATURE:FORGOTTEN_BEAST_663:LUNG +"CREATURE:FORGOTTEN_BEAST_663:HEART +"CREATURE:FORGOTTEN_BEAST_663:LIVER + CREATURE:FORGOTTEN_BEAST_663:GUT +$CREATURE:FORGOTTEN_BEAST_663:STOMACH +$CREATURE:FORGOTTEN_BEAST_663:GIZZARD +%CREATURE:FORGOTTEN_BEAST_663:PANCREAS +#CREATURE:FORGOTTEN_BEAST_663:SPLEEN +#CREATURE:FORGOTTEN_BEAST_663:KIDNEY +#CREATURE:FORGOTTEN_BEAST_664:MUSCLE + CREATURE:FORGOTTEN_BEAST_664:EYE +"CREATURE:FORGOTTEN_BEAST_664:BRAIN +!CREATURE:FORGOTTEN_BEAST_664:LUNG +"CREATURE:FORGOTTEN_BEAST_664:HEART +"CREATURE:FORGOTTEN_BEAST_664:LIVER + CREATURE:FORGOTTEN_BEAST_664:GUT +$CREATURE:FORGOTTEN_BEAST_664:STOMACH +$CREATURE:FORGOTTEN_BEAST_664:GIZZARD +%CREATURE:FORGOTTEN_BEAST_664:PANCREAS +#CREATURE:FORGOTTEN_BEAST_664:SPLEEN +#CREATURE:FORGOTTEN_BEAST_664:KIDNEY +#CREATURE:FORGOTTEN_BEAST_666:MUSCLE + CREATURE:FORGOTTEN_BEAST_666:EYE +"CREATURE:FORGOTTEN_BEAST_666:BRAIN +!CREATURE:FORGOTTEN_BEAST_666:LUNG +"CREATURE:FORGOTTEN_BEAST_666:HEART +"CREATURE:FORGOTTEN_BEAST_666:LIVER + CREATURE:FORGOTTEN_BEAST_666:GUT +$CREATURE:FORGOTTEN_BEAST_666:STOMACH +$CREATURE:FORGOTTEN_BEAST_666:GIZZARD +%CREATURE:FORGOTTEN_BEAST_666:PANCREAS +#CREATURE:FORGOTTEN_BEAST_666:SPLEEN +#CREATURE:FORGOTTEN_BEAST_666:KIDNEY +#CREATURE:FORGOTTEN_BEAST_667:MUSCLE + CREATURE:FORGOTTEN_BEAST_667:EYE +"CREATURE:FORGOTTEN_BEAST_667:BRAIN +!CREATURE:FORGOTTEN_BEAST_667:LUNG +"CREATURE:FORGOTTEN_BEAST_667:HEART +"CREATURE:FORGOTTEN_BEAST_667:LIVER + CREATURE:FORGOTTEN_BEAST_667:GUT +$CREATURE:FORGOTTEN_BEAST_667:STOMACH +$CREATURE:FORGOTTEN_BEAST_667:GIZZARD +%CREATURE:FORGOTTEN_BEAST_667:PANCREAS +#CREATURE:FORGOTTEN_BEAST_667:SPLEEN +#CREATURE:FORGOTTEN_BEAST_667:KIDNEY +#CREATURE:FORGOTTEN_BEAST_669:MUSCLE + CREATURE:FORGOTTEN_BEAST_669:EYE +"CREATURE:FORGOTTEN_BEAST_669:BRAIN +!CREATURE:FORGOTTEN_BEAST_669:LUNG +"CREATURE:FORGOTTEN_BEAST_669:HEART +"CREATURE:FORGOTTEN_BEAST_669:LIVER + CREATURE:FORGOTTEN_BEAST_669:GUT +$CREATURE:FORGOTTEN_BEAST_669:STOMACH +$CREATURE:FORGOTTEN_BEAST_669:GIZZARD +%CREATURE:FORGOTTEN_BEAST_669:PANCREAS +#CREATURE:FORGOTTEN_BEAST_669:SPLEEN +#CREATURE:FORGOTTEN_BEAST_669:KIDNEY +#CREATURE:FORGOTTEN_BEAST_670:MUSCLE + CREATURE:FORGOTTEN_BEAST_670:EYE +"CREATURE:FORGOTTEN_BEAST_670:BRAIN +!CREATURE:FORGOTTEN_BEAST_670:LUNG +"CREATURE:FORGOTTEN_BEAST_670:HEART +"CREATURE:FORGOTTEN_BEAST_670:LIVER + CREATURE:FORGOTTEN_BEAST_670:GUT +$CREATURE:FORGOTTEN_BEAST_670:STOMACH +$CREATURE:FORGOTTEN_BEAST_670:GIZZARD +%CREATURE:FORGOTTEN_BEAST_670:PANCREAS +#CREATURE:FORGOTTEN_BEAST_670:SPLEEN +#CREATURE:FORGOTTEN_BEAST_670:KIDNEY +#CREATURE:FORGOTTEN_BEAST_671:MUSCLE + CREATURE:FORGOTTEN_BEAST_671:EYE +"CREATURE:FORGOTTEN_BEAST_671:BRAIN +!CREATURE:FORGOTTEN_BEAST_671:LUNG +"CREATURE:FORGOTTEN_BEAST_671:HEART +"CREATURE:FORGOTTEN_BEAST_671:LIVER + CREATURE:FORGOTTEN_BEAST_671:GUT +$CREATURE:FORGOTTEN_BEAST_671:STOMACH +$CREATURE:FORGOTTEN_BEAST_671:GIZZARD +%CREATURE:FORGOTTEN_BEAST_671:PANCREAS +#CREATURE:FORGOTTEN_BEAST_671:SPLEEN +#CREATURE:FORGOTTEN_BEAST_671:KIDNEY +#CREATURE:FORGOTTEN_BEAST_674:MUSCLE + CREATURE:FORGOTTEN_BEAST_674:EYE +"CREATURE:FORGOTTEN_BEAST_674:BRAIN +!CREATURE:FORGOTTEN_BEAST_674:LUNG +"CREATURE:FORGOTTEN_BEAST_674:HEART +"CREATURE:FORGOTTEN_BEAST_674:LIVER + CREATURE:FORGOTTEN_BEAST_674:GUT +$CREATURE:FORGOTTEN_BEAST_674:STOMACH +$CREATURE:FORGOTTEN_BEAST_674:GIZZARD +%CREATURE:FORGOTTEN_BEAST_674:PANCREAS +#CREATURE:FORGOTTEN_BEAST_674:SPLEEN +#CREATURE:FORGOTTEN_BEAST_674:KIDNEY +#CREATURE:FORGOTTEN_BEAST_675:MUSCLE + CREATURE:FORGOTTEN_BEAST_675:EYE +"CREATURE:FORGOTTEN_BEAST_675:BRAIN +!CREATURE:FORGOTTEN_BEAST_675:LUNG +"CREATURE:FORGOTTEN_BEAST_675:HEART +"CREATURE:FORGOTTEN_BEAST_675:LIVER + CREATURE:FORGOTTEN_BEAST_675:GUT +$CREATURE:FORGOTTEN_BEAST_675:STOMACH +$CREATURE:FORGOTTEN_BEAST_675:GIZZARD +%CREATURE:FORGOTTEN_BEAST_675:PANCREAS +#CREATURE:FORGOTTEN_BEAST_675:SPLEEN +#CREATURE:FORGOTTEN_BEAST_675:KIDNEY +#CREATURE:FORGOTTEN_BEAST_678:MUSCLE + CREATURE:FORGOTTEN_BEAST_678:EYE +"CREATURE:FORGOTTEN_BEAST_678:BRAIN +!CREATURE:FORGOTTEN_BEAST_678:LUNG +"CREATURE:FORGOTTEN_BEAST_678:HEART +"CREATURE:FORGOTTEN_BEAST_678:LIVER + CREATURE:FORGOTTEN_BEAST_678:GUT +$CREATURE:FORGOTTEN_BEAST_678:STOMACH +$CREATURE:FORGOTTEN_BEAST_678:GIZZARD +%CREATURE:FORGOTTEN_BEAST_678:PANCREAS +#CREATURE:FORGOTTEN_BEAST_678:SPLEEN +#CREATURE:FORGOTTEN_BEAST_678:KIDNEY +#CREATURE:FORGOTTEN_BEAST_680:MUSCLE + CREATURE:FORGOTTEN_BEAST_680:EYE +"CREATURE:FORGOTTEN_BEAST_680:BRAIN +!CREATURE:FORGOTTEN_BEAST_680:LUNG +"CREATURE:FORGOTTEN_BEAST_680:HEART +"CREATURE:FORGOTTEN_BEAST_680:LIVER + CREATURE:FORGOTTEN_BEAST_680:GUT +$CREATURE:FORGOTTEN_BEAST_680:STOMACH +$CREATURE:FORGOTTEN_BEAST_680:GIZZARD +%CREATURE:FORGOTTEN_BEAST_680:PANCREAS +#CREATURE:FORGOTTEN_BEAST_680:SPLEEN +#CREATURE:FORGOTTEN_BEAST_680:KIDNEY +#CREATURE:FORGOTTEN_BEAST_681:MUSCLE + CREATURE:FORGOTTEN_BEAST_681:EYE +"CREATURE:FORGOTTEN_BEAST_681:BRAIN +!CREATURE:FORGOTTEN_BEAST_681:LUNG +"CREATURE:FORGOTTEN_BEAST_681:HEART +"CREATURE:FORGOTTEN_BEAST_681:LIVER + CREATURE:FORGOTTEN_BEAST_681:GUT +$CREATURE:FORGOTTEN_BEAST_681:STOMACH +$CREATURE:FORGOTTEN_BEAST_681:GIZZARD +%CREATURE:FORGOTTEN_BEAST_681:PANCREAS +#CREATURE:FORGOTTEN_BEAST_681:SPLEEN +#CREATURE:FORGOTTEN_BEAST_681:KIDNEY +#CREATURE:FORGOTTEN_BEAST_682:MUSCLE + CREATURE:FORGOTTEN_BEAST_682:EYE +"CREATURE:FORGOTTEN_BEAST_682:BRAIN +!CREATURE:FORGOTTEN_BEAST_682:LUNG +"CREATURE:FORGOTTEN_BEAST_682:HEART +"CREATURE:FORGOTTEN_BEAST_682:LIVER + CREATURE:FORGOTTEN_BEAST_682:GUT +$CREATURE:FORGOTTEN_BEAST_682:STOMACH +$CREATURE:FORGOTTEN_BEAST_682:GIZZARD +%CREATURE:FORGOTTEN_BEAST_682:PANCREAS +#CREATURE:FORGOTTEN_BEAST_682:SPLEEN +#CREATURE:FORGOTTEN_BEAST_682:KIDNEY +#CREATURE:FORGOTTEN_BEAST_684:MUSCLE + CREATURE:FORGOTTEN_BEAST_684:EYE +"CREATURE:FORGOTTEN_BEAST_684:BRAIN +!CREATURE:FORGOTTEN_BEAST_684:LUNG +"CREATURE:FORGOTTEN_BEAST_684:HEART +"CREATURE:FORGOTTEN_BEAST_684:LIVER + CREATURE:FORGOTTEN_BEAST_684:GUT +$CREATURE:FORGOTTEN_BEAST_684:STOMACH +$CREATURE:FORGOTTEN_BEAST_684:GIZZARD +%CREATURE:FORGOTTEN_BEAST_684:PANCREAS +#CREATURE:FORGOTTEN_BEAST_684:SPLEEN +#CREATURE:FORGOTTEN_BEAST_684:KIDNEY +#CREATURE:FORGOTTEN_BEAST_685:MUSCLE + CREATURE:FORGOTTEN_BEAST_685:EYE +"CREATURE:FORGOTTEN_BEAST_685:BRAIN +!CREATURE:FORGOTTEN_BEAST_685:LUNG +"CREATURE:FORGOTTEN_BEAST_685:HEART +"CREATURE:FORGOTTEN_BEAST_685:LIVER + CREATURE:FORGOTTEN_BEAST_685:GUT +$CREATURE:FORGOTTEN_BEAST_685:STOMACH +$CREATURE:FORGOTTEN_BEAST_685:GIZZARD +%CREATURE:FORGOTTEN_BEAST_685:PANCREAS +#CREATURE:FORGOTTEN_BEAST_685:SPLEEN +#CREATURE:FORGOTTEN_BEAST_685:KIDNEY +#CREATURE:FORGOTTEN_BEAST_686:MUSCLE + CREATURE:FORGOTTEN_BEAST_686:EYE +"CREATURE:FORGOTTEN_BEAST_686:BRAIN +!CREATURE:FORGOTTEN_BEAST_686:LUNG +"CREATURE:FORGOTTEN_BEAST_686:HEART +"CREATURE:FORGOTTEN_BEAST_686:LIVER + CREATURE:FORGOTTEN_BEAST_686:GUT +$CREATURE:FORGOTTEN_BEAST_686:STOMACH +$CREATURE:FORGOTTEN_BEAST_686:GIZZARD +%CREATURE:FORGOTTEN_BEAST_686:PANCREAS +#CREATURE:FORGOTTEN_BEAST_686:SPLEEN +#CREATURE:FORGOTTEN_BEAST_686:KIDNEY +#CREATURE:FORGOTTEN_BEAST_687:MUSCLE + CREATURE:FORGOTTEN_BEAST_687:EYE +"CREATURE:FORGOTTEN_BEAST_687:BRAIN +!CREATURE:FORGOTTEN_BEAST_687:LUNG +"CREATURE:FORGOTTEN_BEAST_687:HEART +"CREATURE:FORGOTTEN_BEAST_687:LIVER + CREATURE:FORGOTTEN_BEAST_687:GUT +$CREATURE:FORGOTTEN_BEAST_687:STOMACH +$CREATURE:FORGOTTEN_BEAST_687:GIZZARD +%CREATURE:FORGOTTEN_BEAST_687:PANCREAS +#CREATURE:FORGOTTEN_BEAST_687:SPLEEN +#CREATURE:FORGOTTEN_BEAST_687:KIDNEY +#CREATURE:FORGOTTEN_BEAST_688:MUSCLE + CREATURE:FORGOTTEN_BEAST_688:EYE +"CREATURE:FORGOTTEN_BEAST_688:BRAIN +!CREATURE:FORGOTTEN_BEAST_688:LUNG +"CREATURE:FORGOTTEN_BEAST_688:HEART +"CREATURE:FORGOTTEN_BEAST_688:LIVER + CREATURE:FORGOTTEN_BEAST_688:GUT +$CREATURE:FORGOTTEN_BEAST_688:STOMACH +$CREATURE:FORGOTTEN_BEAST_688:GIZZARD +%CREATURE:FORGOTTEN_BEAST_688:PANCREAS +#CREATURE:FORGOTTEN_BEAST_688:SPLEEN +#CREATURE:FORGOTTEN_BEAST_688:KIDNEY +#CREATURE:FORGOTTEN_BEAST_689:MUSCLE + CREATURE:FORGOTTEN_BEAST_689:EYE +"CREATURE:FORGOTTEN_BEAST_689:BRAIN +!CREATURE:FORGOTTEN_BEAST_689:LUNG +"CREATURE:FORGOTTEN_BEAST_689:HEART +"CREATURE:FORGOTTEN_BEAST_689:LIVER + CREATURE:FORGOTTEN_BEAST_689:GUT +$CREATURE:FORGOTTEN_BEAST_689:STOMACH +$CREATURE:FORGOTTEN_BEAST_689:GIZZARD +%CREATURE:FORGOTTEN_BEAST_689:PANCREAS +#CREATURE:FORGOTTEN_BEAST_689:SPLEEN +#CREATURE:FORGOTTEN_BEAST_689:KIDNEY +#CREATURE:FORGOTTEN_BEAST_691:MUSCLE + CREATURE:FORGOTTEN_BEAST_691:EYE +"CREATURE:FORGOTTEN_BEAST_691:BRAIN +!CREATURE:FORGOTTEN_BEAST_691:LUNG +"CREATURE:FORGOTTEN_BEAST_691:HEART +"CREATURE:FORGOTTEN_BEAST_691:LIVER + CREATURE:FORGOTTEN_BEAST_691:GUT +$CREATURE:FORGOTTEN_BEAST_691:STOMACH +$CREATURE:FORGOTTEN_BEAST_691:GIZZARD +%CREATURE:FORGOTTEN_BEAST_691:PANCREAS +#CREATURE:FORGOTTEN_BEAST_691:SPLEEN +#CREATURE:FORGOTTEN_BEAST_691:KIDNEY +#CREATURE:FORGOTTEN_BEAST_692:MUSCLE + CREATURE:FORGOTTEN_BEAST_692:EYE +"CREATURE:FORGOTTEN_BEAST_692:BRAIN +!CREATURE:FORGOTTEN_BEAST_692:LUNG +"CREATURE:FORGOTTEN_BEAST_692:HEART +"CREATURE:FORGOTTEN_BEAST_692:LIVER + CREATURE:FORGOTTEN_BEAST_692:GUT +$CREATURE:FORGOTTEN_BEAST_692:STOMACH +$CREATURE:FORGOTTEN_BEAST_692:GIZZARD +%CREATURE:FORGOTTEN_BEAST_692:PANCREAS +#CREATURE:FORGOTTEN_BEAST_692:SPLEEN +#CREATURE:FORGOTTEN_BEAST_692:KIDNEY +#CREATURE:FORGOTTEN_BEAST_695:MUSCLE + CREATURE:FORGOTTEN_BEAST_695:EYE +"CREATURE:FORGOTTEN_BEAST_695:BRAIN +!CREATURE:FORGOTTEN_BEAST_695:LUNG +"CREATURE:FORGOTTEN_BEAST_695:HEART +"CREATURE:FORGOTTEN_BEAST_695:LIVER + CREATURE:FORGOTTEN_BEAST_695:GUT +$CREATURE:FORGOTTEN_BEAST_695:STOMACH +$CREATURE:FORGOTTEN_BEAST_695:GIZZARD +%CREATURE:FORGOTTEN_BEAST_695:PANCREAS +#CREATURE:FORGOTTEN_BEAST_695:SPLEEN +#CREATURE:FORGOTTEN_BEAST_695:KIDNEY +#CREATURE:FORGOTTEN_BEAST_696:MUSCLE + CREATURE:FORGOTTEN_BEAST_696:EYE +"CREATURE:FORGOTTEN_BEAST_696:BRAIN +!CREATURE:FORGOTTEN_BEAST_696:LUNG +"CREATURE:FORGOTTEN_BEAST_696:HEART +"CREATURE:FORGOTTEN_BEAST_696:LIVER + CREATURE:FORGOTTEN_BEAST_696:GUT +$CREATURE:FORGOTTEN_BEAST_696:STOMACH +$CREATURE:FORGOTTEN_BEAST_696:GIZZARD +%CREATURE:FORGOTTEN_BEAST_696:PANCREAS +#CREATURE:FORGOTTEN_BEAST_696:SPLEEN +#CREATURE:FORGOTTEN_BEAST_696:KIDNEY +#CREATURE:FORGOTTEN_BEAST_697:MUSCLE + CREATURE:FORGOTTEN_BEAST_697:EYE +"CREATURE:FORGOTTEN_BEAST_697:BRAIN +!CREATURE:FORGOTTEN_BEAST_697:LUNG +"CREATURE:FORGOTTEN_BEAST_697:HEART +"CREATURE:FORGOTTEN_BEAST_697:LIVER + CREATURE:FORGOTTEN_BEAST_697:GUT +$CREATURE:FORGOTTEN_BEAST_697:STOMACH +$CREATURE:FORGOTTEN_BEAST_697:GIZZARD +%CREATURE:FORGOTTEN_BEAST_697:PANCREAS +#CREATURE:FORGOTTEN_BEAST_697:SPLEEN +#CREATURE:FORGOTTEN_BEAST_697:KIDNEY +#CREATURE:FORGOTTEN_BEAST_698:MUSCLE + CREATURE:FORGOTTEN_BEAST_698:EYE +"CREATURE:FORGOTTEN_BEAST_698:BRAIN +!CREATURE:FORGOTTEN_BEAST_698:LUNG +"CREATURE:FORGOTTEN_BEAST_698:HEART +"CREATURE:FORGOTTEN_BEAST_698:LIVER + CREATURE:FORGOTTEN_BEAST_698:GUT +$CREATURE:FORGOTTEN_BEAST_698:STOMACH +$CREATURE:FORGOTTEN_BEAST_698:GIZZARD +%CREATURE:FORGOTTEN_BEAST_698:PANCREAS +#CREATURE:FORGOTTEN_BEAST_698:SPLEEN +#CREATURE:FORGOTTEN_BEAST_698:KIDNEY +#CREATURE:FORGOTTEN_BEAST_699:MUSCLE + CREATURE:FORGOTTEN_BEAST_699:EYE +"CREATURE:FORGOTTEN_BEAST_699:BRAIN +!CREATURE:FORGOTTEN_BEAST_699:LUNG +"CREATURE:FORGOTTEN_BEAST_699:HEART +"CREATURE:FORGOTTEN_BEAST_699:LIVER + CREATURE:FORGOTTEN_BEAST_699:GUT +$CREATURE:FORGOTTEN_BEAST_699:STOMACH +$CREATURE:FORGOTTEN_BEAST_699:GIZZARD +%CREATURE:FORGOTTEN_BEAST_699:PANCREAS +#CREATURE:FORGOTTEN_BEAST_699:SPLEEN +#CREATURE:FORGOTTEN_BEAST_699:KIDNEY +#CREATURE:FORGOTTEN_BEAST_700:MUSCLE + CREATURE:FORGOTTEN_BEAST_700:EYE +"CREATURE:FORGOTTEN_BEAST_700:BRAIN +!CREATURE:FORGOTTEN_BEAST_700:LUNG +"CREATURE:FORGOTTEN_BEAST_700:HEART +"CREATURE:FORGOTTEN_BEAST_700:LIVER + CREATURE:FORGOTTEN_BEAST_700:GUT +$CREATURE:FORGOTTEN_BEAST_700:STOMACH +$CREATURE:FORGOTTEN_BEAST_700:GIZZARD +%CREATURE:FORGOTTEN_BEAST_700:PANCREAS +#CREATURE:FORGOTTEN_BEAST_700:SPLEEN +#CREATURE:FORGOTTEN_BEAST_700:KIDNEY +#CREATURE:FORGOTTEN_BEAST_701:MUSCLE + CREATURE:FORGOTTEN_BEAST_701:EYE +"CREATURE:FORGOTTEN_BEAST_701:BRAIN +!CREATURE:FORGOTTEN_BEAST_701:LUNG +"CREATURE:FORGOTTEN_BEAST_701:HEART +"CREATURE:FORGOTTEN_BEAST_701:LIVER + CREATURE:FORGOTTEN_BEAST_701:GUT +$CREATURE:FORGOTTEN_BEAST_701:STOMACH +$CREATURE:FORGOTTEN_BEAST_701:GIZZARD +%CREATURE:FORGOTTEN_BEAST_701:PANCREAS +#CREATURE:FORGOTTEN_BEAST_701:SPLEEN +#CREATURE:FORGOTTEN_BEAST_701:KIDNEY +#CREATURE:FORGOTTEN_BEAST_702:MUSCLE + CREATURE:FORGOTTEN_BEAST_702:EYE +"CREATURE:FORGOTTEN_BEAST_702:BRAIN +!CREATURE:FORGOTTEN_BEAST_702:LUNG +"CREATURE:FORGOTTEN_BEAST_702:HEART +"CREATURE:FORGOTTEN_BEAST_702:LIVER + CREATURE:FORGOTTEN_BEAST_702:GUT +$CREATURE:FORGOTTEN_BEAST_702:STOMACH +$CREATURE:FORGOTTEN_BEAST_702:GIZZARD +%CREATURE:FORGOTTEN_BEAST_702:PANCREAS +#CREATURE:FORGOTTEN_BEAST_702:SPLEEN +#CREATURE:FORGOTTEN_BEAST_702:KIDNEY +#CREATURE:FORGOTTEN_BEAST_704:MUSCLE + CREATURE:FORGOTTEN_BEAST_704:EYE +"CREATURE:FORGOTTEN_BEAST_704:BRAIN +!CREATURE:FORGOTTEN_BEAST_704:LUNG +"CREATURE:FORGOTTEN_BEAST_704:HEART +"CREATURE:FORGOTTEN_BEAST_704:LIVER + CREATURE:FORGOTTEN_BEAST_704:GUT +$CREATURE:FORGOTTEN_BEAST_704:STOMACH +$CREATURE:FORGOTTEN_BEAST_704:GIZZARD +%CREATURE:FORGOTTEN_BEAST_704:PANCREAS +#CREATURE:FORGOTTEN_BEAST_704:SPLEEN +#CREATURE:FORGOTTEN_BEAST_704:KIDNEY +#CREATURE:FORGOTTEN_BEAST_706:MUSCLE + CREATURE:FORGOTTEN_BEAST_706:EYE +"CREATURE:FORGOTTEN_BEAST_706:BRAIN +!CREATURE:FORGOTTEN_BEAST_706:LUNG +"CREATURE:FORGOTTEN_BEAST_706:HEART +"CREATURE:FORGOTTEN_BEAST_706:LIVER + CREATURE:FORGOTTEN_BEAST_706:GUT +$CREATURE:FORGOTTEN_BEAST_706:STOMACH +$CREATURE:FORGOTTEN_BEAST_706:GIZZARD +%CREATURE:FORGOTTEN_BEAST_706:PANCREAS +#CREATURE:FORGOTTEN_BEAST_706:SPLEEN +#CREATURE:FORGOTTEN_BEAST_706:KIDNEY +#CREATURE:FORGOTTEN_BEAST_708:MUSCLE + CREATURE:FORGOTTEN_BEAST_708:EYE +"CREATURE:FORGOTTEN_BEAST_708:BRAIN +!CREATURE:FORGOTTEN_BEAST_708:LUNG +"CREATURE:FORGOTTEN_BEAST_708:HEART +"CREATURE:FORGOTTEN_BEAST_708:LIVER + CREATURE:FORGOTTEN_BEAST_708:GUT +$CREATURE:FORGOTTEN_BEAST_708:STOMACH +$CREATURE:FORGOTTEN_BEAST_708:GIZZARD +%CREATURE:FORGOTTEN_BEAST_708:PANCREAS +#CREATURE:FORGOTTEN_BEAST_708:SPLEEN +#CREATURE:FORGOTTEN_BEAST_708:KIDNEY +#CREATURE:FORGOTTEN_BEAST_709:MUSCLE + CREATURE:FORGOTTEN_BEAST_709:EYE +"CREATURE:FORGOTTEN_BEAST_709:BRAIN +!CREATURE:FORGOTTEN_BEAST_709:LUNG +"CREATURE:FORGOTTEN_BEAST_709:HEART +"CREATURE:FORGOTTEN_BEAST_709:LIVER + CREATURE:FORGOTTEN_BEAST_709:GUT +$CREATURE:FORGOTTEN_BEAST_709:STOMACH +$CREATURE:FORGOTTEN_BEAST_709:GIZZARD +%CREATURE:FORGOTTEN_BEAST_709:PANCREAS +#CREATURE:FORGOTTEN_BEAST_709:SPLEEN +#CREATURE:FORGOTTEN_BEAST_709:KIDNEY +#CREATURE:FORGOTTEN_BEAST_711:MUSCLE + CREATURE:FORGOTTEN_BEAST_711:EYE +"CREATURE:FORGOTTEN_BEAST_711:BRAIN +!CREATURE:FORGOTTEN_BEAST_711:LUNG +"CREATURE:FORGOTTEN_BEAST_711:HEART +"CREATURE:FORGOTTEN_BEAST_711:LIVER + CREATURE:FORGOTTEN_BEAST_711:GUT +$CREATURE:FORGOTTEN_BEAST_711:STOMACH +$CREATURE:FORGOTTEN_BEAST_711:GIZZARD +%CREATURE:FORGOTTEN_BEAST_711:PANCREAS +#CREATURE:FORGOTTEN_BEAST_711:SPLEEN +#CREATURE:FORGOTTEN_BEAST_711:KIDNEY +#CREATURE:FORGOTTEN_BEAST_712:MUSCLE + CREATURE:FORGOTTEN_BEAST_712:EYE +"CREATURE:FORGOTTEN_BEAST_712:BRAIN +!CREATURE:FORGOTTEN_BEAST_712:LUNG +"CREATURE:FORGOTTEN_BEAST_712:HEART +"CREATURE:FORGOTTEN_BEAST_712:LIVER + CREATURE:FORGOTTEN_BEAST_712:GUT +$CREATURE:FORGOTTEN_BEAST_712:STOMACH +$CREATURE:FORGOTTEN_BEAST_712:GIZZARD +%CREATURE:FORGOTTEN_BEAST_712:PANCREAS +#CREATURE:FORGOTTEN_BEAST_712:SPLEEN +#CREATURE:FORGOTTEN_BEAST_712:KIDNEY +#CREATURE:FORGOTTEN_BEAST_713:MUSCLE + CREATURE:FORGOTTEN_BEAST_713:EYE +"CREATURE:FORGOTTEN_BEAST_713:BRAIN +!CREATURE:FORGOTTEN_BEAST_713:LUNG +"CREATURE:FORGOTTEN_BEAST_713:HEART +"CREATURE:FORGOTTEN_BEAST_713:LIVER + CREATURE:FORGOTTEN_BEAST_713:GUT +$CREATURE:FORGOTTEN_BEAST_713:STOMACH +$CREATURE:FORGOTTEN_BEAST_713:GIZZARD +%CREATURE:FORGOTTEN_BEAST_713:PANCREAS +#CREATURE:FORGOTTEN_BEAST_713:SPLEEN +#CREATURE:FORGOTTEN_BEAST_713:KIDNEY +#CREATURE:FORGOTTEN_BEAST_714:MUSCLE + CREATURE:FORGOTTEN_BEAST_714:EYE +"CREATURE:FORGOTTEN_BEAST_714:BRAIN +!CREATURE:FORGOTTEN_BEAST_714:LUNG +"CREATURE:FORGOTTEN_BEAST_714:HEART +"CREATURE:FORGOTTEN_BEAST_714:LIVER + CREATURE:FORGOTTEN_BEAST_714:GUT +$CREATURE:FORGOTTEN_BEAST_714:STOMACH +$CREATURE:FORGOTTEN_BEAST_714:GIZZARD +%CREATURE:FORGOTTEN_BEAST_714:PANCREAS +#CREATURE:FORGOTTEN_BEAST_714:SPLEEN +#CREATURE:FORGOTTEN_BEAST_714:KIDNEY +#CREATURE:FORGOTTEN_BEAST_715:MUSCLE + CREATURE:FORGOTTEN_BEAST_715:EYE +"CREATURE:FORGOTTEN_BEAST_715:BRAIN +!CREATURE:FORGOTTEN_BEAST_715:LUNG +"CREATURE:FORGOTTEN_BEAST_715:HEART +"CREATURE:FORGOTTEN_BEAST_715:LIVER + CREATURE:FORGOTTEN_BEAST_715:GUT +$CREATURE:FORGOTTEN_BEAST_715:STOMACH +$CREATURE:FORGOTTEN_BEAST_715:GIZZARD +%CREATURE:FORGOTTEN_BEAST_715:PANCREAS +#CREATURE:FORGOTTEN_BEAST_715:SPLEEN +#CREATURE:FORGOTTEN_BEAST_715:KIDNEY +#CREATURE:FORGOTTEN_BEAST_717:MUSCLE + CREATURE:FORGOTTEN_BEAST_717:EYE +"CREATURE:FORGOTTEN_BEAST_717:BRAIN +!CREATURE:FORGOTTEN_BEAST_717:LUNG +"CREATURE:FORGOTTEN_BEAST_717:HEART +"CREATURE:FORGOTTEN_BEAST_717:LIVER + CREATURE:FORGOTTEN_BEAST_717:GUT +$CREATURE:FORGOTTEN_BEAST_717:STOMACH +$CREATURE:FORGOTTEN_BEAST_717:GIZZARD +%CREATURE:FORGOTTEN_BEAST_717:PANCREAS +#CREATURE:FORGOTTEN_BEAST_717:SPLEEN +#CREATURE:FORGOTTEN_BEAST_717:KIDNEY +#CREATURE:FORGOTTEN_BEAST_718:MUSCLE + CREATURE:FORGOTTEN_BEAST_718:EYE +"CREATURE:FORGOTTEN_BEAST_718:BRAIN +!CREATURE:FORGOTTEN_BEAST_718:LUNG +"CREATURE:FORGOTTEN_BEAST_718:HEART +"CREATURE:FORGOTTEN_BEAST_718:LIVER + CREATURE:FORGOTTEN_BEAST_718:GUT +$CREATURE:FORGOTTEN_BEAST_718:STOMACH +$CREATURE:FORGOTTEN_BEAST_718:GIZZARD +%CREATURE:FORGOTTEN_BEAST_718:PANCREAS +#CREATURE:FORGOTTEN_BEAST_718:SPLEEN +#CREATURE:FORGOTTEN_BEAST_718:KIDNEY +#CREATURE:FORGOTTEN_BEAST_719:MUSCLE + CREATURE:FORGOTTEN_BEAST_719:EYE +"CREATURE:FORGOTTEN_BEAST_719:BRAIN +!CREATURE:FORGOTTEN_BEAST_719:LUNG +"CREATURE:FORGOTTEN_BEAST_719:HEART +"CREATURE:FORGOTTEN_BEAST_719:LIVER + CREATURE:FORGOTTEN_BEAST_719:GUT +$CREATURE:FORGOTTEN_BEAST_719:STOMACH +$CREATURE:FORGOTTEN_BEAST_719:GIZZARD +%CREATURE:FORGOTTEN_BEAST_719:PANCREAS +#CREATURE:FORGOTTEN_BEAST_719:SPLEEN +#CREATURE:FORGOTTEN_BEAST_719:KIDNEY +#CREATURE:FORGOTTEN_BEAST_720:MUSCLE + CREATURE:FORGOTTEN_BEAST_720:EYE +"CREATURE:FORGOTTEN_BEAST_720:BRAIN +!CREATURE:FORGOTTEN_BEAST_720:LUNG +"CREATURE:FORGOTTEN_BEAST_720:HEART +"CREATURE:FORGOTTEN_BEAST_720:LIVER + CREATURE:FORGOTTEN_BEAST_720:GUT +$CREATURE:FORGOTTEN_BEAST_720:STOMACH +$CREATURE:FORGOTTEN_BEAST_720:GIZZARD +%CREATURE:FORGOTTEN_BEAST_720:PANCREAS +#CREATURE:FORGOTTEN_BEAST_720:SPLEEN +#CREATURE:FORGOTTEN_BEAST_720:KIDNEY +#CREATURE:FORGOTTEN_BEAST_721:MUSCLE + CREATURE:FORGOTTEN_BEAST_721:EYE +"CREATURE:FORGOTTEN_BEAST_721:BRAIN +!CREATURE:FORGOTTEN_BEAST_721:LUNG +"CREATURE:FORGOTTEN_BEAST_721:HEART +"CREATURE:FORGOTTEN_BEAST_721:LIVER + CREATURE:FORGOTTEN_BEAST_721:GUT +$CREATURE:FORGOTTEN_BEAST_721:STOMACH +$CREATURE:FORGOTTEN_BEAST_721:GIZZARD +%CREATURE:FORGOTTEN_BEAST_721:PANCREAS +#CREATURE:FORGOTTEN_BEAST_721:SPLEEN +#CREATURE:FORGOTTEN_BEAST_721:KIDNEY +#CREATURE:FORGOTTEN_BEAST_722:MUSCLE + CREATURE:FORGOTTEN_BEAST_722:EYE +"CREATURE:FORGOTTEN_BEAST_722:BRAIN +!CREATURE:FORGOTTEN_BEAST_722:LUNG +"CREATURE:FORGOTTEN_BEAST_722:HEART +"CREATURE:FORGOTTEN_BEAST_722:LIVER + CREATURE:FORGOTTEN_BEAST_722:GUT +$CREATURE:FORGOTTEN_BEAST_722:STOMACH +$CREATURE:FORGOTTEN_BEAST_722:GIZZARD +%CREATURE:FORGOTTEN_BEAST_722:PANCREAS +#CREATURE:FORGOTTEN_BEAST_722:SPLEEN +#CREATURE:FORGOTTEN_BEAST_722:KIDNEY +#CREATURE:FORGOTTEN_BEAST_723:MUSCLE + CREATURE:FORGOTTEN_BEAST_723:EYE +"CREATURE:FORGOTTEN_BEAST_723:BRAIN +!CREATURE:FORGOTTEN_BEAST_723:LUNG +"CREATURE:FORGOTTEN_BEAST_723:HEART +"CREATURE:FORGOTTEN_BEAST_723:LIVER + CREATURE:FORGOTTEN_BEAST_723:GUT +$CREATURE:FORGOTTEN_BEAST_723:STOMACH +$CREATURE:FORGOTTEN_BEAST_723:GIZZARD +%CREATURE:FORGOTTEN_BEAST_723:PANCREAS +#CREATURE:FORGOTTEN_BEAST_723:SPLEEN +#CREATURE:FORGOTTEN_BEAST_723:KIDNEY +#CREATURE:FORGOTTEN_BEAST_724:MUSCLE + CREATURE:FORGOTTEN_BEAST_724:EYE +"CREATURE:FORGOTTEN_BEAST_724:BRAIN +!CREATURE:FORGOTTEN_BEAST_724:LUNG +"CREATURE:FORGOTTEN_BEAST_724:HEART +"CREATURE:FORGOTTEN_BEAST_724:LIVER + CREATURE:FORGOTTEN_BEAST_724:GUT +$CREATURE:FORGOTTEN_BEAST_724:STOMACH +$CREATURE:FORGOTTEN_BEAST_724:GIZZARD +%CREATURE:FORGOTTEN_BEAST_724:PANCREAS +#CREATURE:FORGOTTEN_BEAST_724:SPLEEN +#CREATURE:FORGOTTEN_BEAST_724:KIDNEY +#CREATURE:FORGOTTEN_BEAST_726:MUSCLE + CREATURE:FORGOTTEN_BEAST_726:EYE +"CREATURE:FORGOTTEN_BEAST_726:BRAIN +!CREATURE:FORGOTTEN_BEAST_726:LUNG +"CREATURE:FORGOTTEN_BEAST_726:HEART +"CREATURE:FORGOTTEN_BEAST_726:LIVER + CREATURE:FORGOTTEN_BEAST_726:GUT +$CREATURE:FORGOTTEN_BEAST_726:STOMACH +$CREATURE:FORGOTTEN_BEAST_726:GIZZARD +%CREATURE:FORGOTTEN_BEAST_726:PANCREAS +#CREATURE:FORGOTTEN_BEAST_726:SPLEEN +#CREATURE:FORGOTTEN_BEAST_726:KIDNEY +#CREATURE:FORGOTTEN_BEAST_730:MUSCLE + CREATURE:FORGOTTEN_BEAST_730:EYE +"CREATURE:FORGOTTEN_BEAST_730:BRAIN +!CREATURE:FORGOTTEN_BEAST_730:LUNG +"CREATURE:FORGOTTEN_BEAST_730:HEART +"CREATURE:FORGOTTEN_BEAST_730:LIVER + CREATURE:FORGOTTEN_BEAST_730:GUT +$CREATURE:FORGOTTEN_BEAST_730:STOMACH +$CREATURE:FORGOTTEN_BEAST_730:GIZZARD +%CREATURE:FORGOTTEN_BEAST_730:PANCREAS +#CREATURE:FORGOTTEN_BEAST_730:SPLEEN +#CREATURE:FORGOTTEN_BEAST_730:KIDNEY +#CREATURE:FORGOTTEN_BEAST_731:MUSCLE + CREATURE:FORGOTTEN_BEAST_731:EYE +"CREATURE:FORGOTTEN_BEAST_731:BRAIN +!CREATURE:FORGOTTEN_BEAST_731:LUNG +"CREATURE:FORGOTTEN_BEAST_731:HEART +"CREATURE:FORGOTTEN_BEAST_731:LIVER + CREATURE:FORGOTTEN_BEAST_731:GUT +$CREATURE:FORGOTTEN_BEAST_731:STOMACH +$CREATURE:FORGOTTEN_BEAST_731:GIZZARD +%CREATURE:FORGOTTEN_BEAST_731:PANCREAS +#CREATURE:FORGOTTEN_BEAST_731:SPLEEN +#CREATURE:FORGOTTEN_BEAST_731:KIDNEY +#CREATURE:FORGOTTEN_BEAST_734:MUSCLE + CREATURE:FORGOTTEN_BEAST_734:EYE +"CREATURE:FORGOTTEN_BEAST_734:BRAIN +!CREATURE:FORGOTTEN_BEAST_734:LUNG +"CREATURE:FORGOTTEN_BEAST_734:HEART +"CREATURE:FORGOTTEN_BEAST_734:LIVER + CREATURE:FORGOTTEN_BEAST_734:GUT +$CREATURE:FORGOTTEN_BEAST_734:STOMACH +$CREATURE:FORGOTTEN_BEAST_734:GIZZARD +%CREATURE:FORGOTTEN_BEAST_734:PANCREAS +#CREATURE:FORGOTTEN_BEAST_734:SPLEEN +#CREATURE:FORGOTTEN_BEAST_734:KIDNEY +#CREATURE:FORGOTTEN_BEAST_735:MUSCLE + CREATURE:FORGOTTEN_BEAST_735:EYE +"CREATURE:FORGOTTEN_BEAST_735:BRAIN +!CREATURE:FORGOTTEN_BEAST_735:LUNG +"CREATURE:FORGOTTEN_BEAST_735:HEART +"CREATURE:FORGOTTEN_BEAST_735:LIVER + CREATURE:FORGOTTEN_BEAST_735:GUT +$CREATURE:FORGOTTEN_BEAST_735:STOMACH +$CREATURE:FORGOTTEN_BEAST_735:GIZZARD +%CREATURE:FORGOTTEN_BEAST_735:PANCREAS +#CREATURE:FORGOTTEN_BEAST_735:SPLEEN +#CREATURE:FORGOTTEN_BEAST_735:KIDNEY +#CREATURE:FORGOTTEN_BEAST_737:MUSCLE + CREATURE:FORGOTTEN_BEAST_737:EYE +"CREATURE:FORGOTTEN_BEAST_737:BRAIN +!CREATURE:FORGOTTEN_BEAST_737:LUNG +"CREATURE:FORGOTTEN_BEAST_737:HEART +"CREATURE:FORGOTTEN_BEAST_737:LIVER + CREATURE:FORGOTTEN_BEAST_737:GUT +$CREATURE:FORGOTTEN_BEAST_737:STOMACH +$CREATURE:FORGOTTEN_BEAST_737:GIZZARD +%CREATURE:FORGOTTEN_BEAST_737:PANCREAS +#CREATURE:FORGOTTEN_BEAST_737:SPLEEN +#CREATURE:FORGOTTEN_BEAST_737:KIDNEY +#CREATURE:FORGOTTEN_BEAST_738:MUSCLE + CREATURE:FORGOTTEN_BEAST_738:EYE +"CREATURE:FORGOTTEN_BEAST_738:BRAIN +!CREATURE:FORGOTTEN_BEAST_738:LUNG +"CREATURE:FORGOTTEN_BEAST_738:HEART +"CREATURE:FORGOTTEN_BEAST_738:LIVER + CREATURE:FORGOTTEN_BEAST_738:GUT +$CREATURE:FORGOTTEN_BEAST_738:STOMACH +$CREATURE:FORGOTTEN_BEAST_738:GIZZARD +%CREATURE:FORGOTTEN_BEAST_738:PANCREAS +#CREATURE:FORGOTTEN_BEAST_738:SPLEEN +#CREATURE:FORGOTTEN_BEAST_738:KIDNEY +#CREATURE:FORGOTTEN_BEAST_739:MUSCLE + CREATURE:FORGOTTEN_BEAST_739:EYE +"CREATURE:FORGOTTEN_BEAST_739:BRAIN +!CREATURE:FORGOTTEN_BEAST_739:LUNG +"CREATURE:FORGOTTEN_BEAST_739:HEART +"CREATURE:FORGOTTEN_BEAST_739:LIVER + CREATURE:FORGOTTEN_BEAST_739:GUT +$CREATURE:FORGOTTEN_BEAST_739:STOMACH +$CREATURE:FORGOTTEN_BEAST_739:GIZZARD +%CREATURE:FORGOTTEN_BEAST_739:PANCREAS +#CREATURE:FORGOTTEN_BEAST_739:SPLEEN +#CREATURE:FORGOTTEN_BEAST_739:KIDNEY +#CREATURE:FORGOTTEN_BEAST_740:MUSCLE + CREATURE:FORGOTTEN_BEAST_740:EYE +"CREATURE:FORGOTTEN_BEAST_740:BRAIN +!CREATURE:FORGOTTEN_BEAST_740:LUNG +"CREATURE:FORGOTTEN_BEAST_740:HEART +"CREATURE:FORGOTTEN_BEAST_740:LIVER + CREATURE:FORGOTTEN_BEAST_740:GUT +$CREATURE:FORGOTTEN_BEAST_740:STOMACH +$CREATURE:FORGOTTEN_BEAST_740:GIZZARD +%CREATURE:FORGOTTEN_BEAST_740:PANCREAS +#CREATURE:FORGOTTEN_BEAST_740:SPLEEN +#CREATURE:FORGOTTEN_BEAST_740:KIDNEY +#CREATURE:FORGOTTEN_BEAST_741:MUSCLE + CREATURE:FORGOTTEN_BEAST_741:EYE +"CREATURE:FORGOTTEN_BEAST_741:BRAIN +!CREATURE:FORGOTTEN_BEAST_741:LUNG +"CREATURE:FORGOTTEN_BEAST_741:HEART +"CREATURE:FORGOTTEN_BEAST_741:LIVER + CREATURE:FORGOTTEN_BEAST_741:GUT +$CREATURE:FORGOTTEN_BEAST_741:STOMACH +$CREATURE:FORGOTTEN_BEAST_741:GIZZARD +%CREATURE:FORGOTTEN_BEAST_741:PANCREAS +#CREATURE:FORGOTTEN_BEAST_741:SPLEEN +#CREATURE:FORGOTTEN_BEAST_741:KIDNEY +#CREATURE:FORGOTTEN_BEAST_742:MUSCLE + CREATURE:FORGOTTEN_BEAST_742:EYE +"CREATURE:FORGOTTEN_BEAST_742:BRAIN +!CREATURE:FORGOTTEN_BEAST_742:LUNG +"CREATURE:FORGOTTEN_BEAST_742:HEART +"CREATURE:FORGOTTEN_BEAST_742:LIVER + CREATURE:FORGOTTEN_BEAST_742:GUT +$CREATURE:FORGOTTEN_BEAST_742:STOMACH +$CREATURE:FORGOTTEN_BEAST_742:GIZZARD +%CREATURE:FORGOTTEN_BEAST_742:PANCREAS +#CREATURE:FORGOTTEN_BEAST_742:SPLEEN +#CREATURE:FORGOTTEN_BEAST_742:KIDNEY +#CREATURE:FORGOTTEN_BEAST_743:MUSCLE + CREATURE:FORGOTTEN_BEAST_743:EYE +"CREATURE:FORGOTTEN_BEAST_743:BRAIN +!CREATURE:FORGOTTEN_BEAST_743:LUNG +"CREATURE:FORGOTTEN_BEAST_743:HEART +"CREATURE:FORGOTTEN_BEAST_743:LIVER + CREATURE:FORGOTTEN_BEAST_743:GUT +$CREATURE:FORGOTTEN_BEAST_743:STOMACH +$CREATURE:FORGOTTEN_BEAST_743:GIZZARD +%CREATURE:FORGOTTEN_BEAST_743:PANCREAS +#CREATURE:FORGOTTEN_BEAST_743:SPLEEN +#CREATURE:FORGOTTEN_BEAST_743:KIDNEY +#CREATURE:FORGOTTEN_BEAST_744:MUSCLE + CREATURE:FORGOTTEN_BEAST_744:EYE +"CREATURE:FORGOTTEN_BEAST_744:BRAIN +!CREATURE:FORGOTTEN_BEAST_744:LUNG +"CREATURE:FORGOTTEN_BEAST_744:HEART +"CREATURE:FORGOTTEN_BEAST_744:LIVER + CREATURE:FORGOTTEN_BEAST_744:GUT +$CREATURE:FORGOTTEN_BEAST_744:STOMACH +$CREATURE:FORGOTTEN_BEAST_744:GIZZARD +%CREATURE:FORGOTTEN_BEAST_744:PANCREAS +#CREATURE:FORGOTTEN_BEAST_744:SPLEEN +#CREATURE:FORGOTTEN_BEAST_744:KIDNEY +#CREATURE:FORGOTTEN_BEAST_746:MUSCLE + CREATURE:FORGOTTEN_BEAST_746:EYE +"CREATURE:FORGOTTEN_BEAST_746:BRAIN +!CREATURE:FORGOTTEN_BEAST_746:LUNG +"CREATURE:FORGOTTEN_BEAST_746:HEART +"CREATURE:FORGOTTEN_BEAST_746:LIVER + CREATURE:FORGOTTEN_BEAST_746:GUT +$CREATURE:FORGOTTEN_BEAST_746:STOMACH +$CREATURE:FORGOTTEN_BEAST_746:GIZZARD +%CREATURE:FORGOTTEN_BEAST_746:PANCREAS +#CREATURE:FORGOTTEN_BEAST_746:SPLEEN +#CREATURE:FORGOTTEN_BEAST_746:KIDNEY +#CREATURE:FORGOTTEN_BEAST_747:MUSCLE + CREATURE:FORGOTTEN_BEAST_747:EYE +"CREATURE:FORGOTTEN_BEAST_747:BRAIN +!CREATURE:FORGOTTEN_BEAST_747:LUNG +"CREATURE:FORGOTTEN_BEAST_747:HEART +"CREATURE:FORGOTTEN_BEAST_747:LIVER + CREATURE:FORGOTTEN_BEAST_747:GUT +$CREATURE:FORGOTTEN_BEAST_747:STOMACH +$CREATURE:FORGOTTEN_BEAST_747:GIZZARD +%CREATURE:FORGOTTEN_BEAST_747:PANCREAS +#CREATURE:FORGOTTEN_BEAST_747:SPLEEN +#CREATURE:FORGOTTEN_BEAST_747:KIDNEY +#CREATURE:FORGOTTEN_BEAST_749:MUSCLE + CREATURE:FORGOTTEN_BEAST_749:EYE +"CREATURE:FORGOTTEN_BEAST_749:BRAIN +!CREATURE:FORGOTTEN_BEAST_749:LUNG +"CREATURE:FORGOTTEN_BEAST_749:HEART +"CREATURE:FORGOTTEN_BEAST_749:LIVER + CREATURE:FORGOTTEN_BEAST_749:GUT +$CREATURE:FORGOTTEN_BEAST_749:STOMACH +$CREATURE:FORGOTTEN_BEAST_749:GIZZARD +%CREATURE:FORGOTTEN_BEAST_749:PANCREAS +#CREATURE:FORGOTTEN_BEAST_749:SPLEEN +#CREATURE:FORGOTTEN_BEAST_749:KIDNEY +#CREATURE:FORGOTTEN_BEAST_750:MUSCLE + CREATURE:FORGOTTEN_BEAST_750:EYE +"CREATURE:FORGOTTEN_BEAST_750:BRAIN +!CREATURE:FORGOTTEN_BEAST_750:LUNG +"CREATURE:FORGOTTEN_BEAST_750:HEART +"CREATURE:FORGOTTEN_BEAST_750:LIVER + CREATURE:FORGOTTEN_BEAST_750:GUT +$CREATURE:FORGOTTEN_BEAST_750:STOMACH +$CREATURE:FORGOTTEN_BEAST_750:GIZZARD +%CREATURE:FORGOTTEN_BEAST_750:PANCREAS +#CREATURE:FORGOTTEN_BEAST_750:SPLEEN +#CREATURE:FORGOTTEN_BEAST_750:KIDNEY +#CREATURE:FORGOTTEN_BEAST_751:MUSCLE + CREATURE:FORGOTTEN_BEAST_751:EYE +"CREATURE:FORGOTTEN_BEAST_751:BRAIN +!CREATURE:FORGOTTEN_BEAST_751:LUNG +"CREATURE:FORGOTTEN_BEAST_751:HEART +"CREATURE:FORGOTTEN_BEAST_751:LIVER + CREATURE:FORGOTTEN_BEAST_751:GUT +$CREATURE:FORGOTTEN_BEAST_751:STOMACH +$CREATURE:FORGOTTEN_BEAST_751:GIZZARD +%CREATURE:FORGOTTEN_BEAST_751:PANCREAS +#CREATURE:FORGOTTEN_BEAST_751:SPLEEN +#CREATURE:FORGOTTEN_BEAST_751:KIDNEY +#CREATURE:FORGOTTEN_BEAST_752:MUSCLE + CREATURE:FORGOTTEN_BEAST_752:EYE +"CREATURE:FORGOTTEN_BEAST_752:BRAIN +!CREATURE:FORGOTTEN_BEAST_752:LUNG +"CREATURE:FORGOTTEN_BEAST_752:HEART +"CREATURE:FORGOTTEN_BEAST_752:LIVER + CREATURE:FORGOTTEN_BEAST_752:GUT +$CREATURE:FORGOTTEN_BEAST_752:STOMACH +$CREATURE:FORGOTTEN_BEAST_752:GIZZARD +%CREATURE:FORGOTTEN_BEAST_752:PANCREAS +#CREATURE:FORGOTTEN_BEAST_752:SPLEEN +#CREATURE:FORGOTTEN_BEAST_752:KIDNEY +#CREATURE:FORGOTTEN_BEAST_753:MUSCLE + CREATURE:FORGOTTEN_BEAST_753:EYE +"CREATURE:FORGOTTEN_BEAST_753:BRAIN +!CREATURE:FORGOTTEN_BEAST_753:LUNG +"CREATURE:FORGOTTEN_BEAST_753:HEART +"CREATURE:FORGOTTEN_BEAST_753:LIVER + CREATURE:FORGOTTEN_BEAST_753:GUT +$CREATURE:FORGOTTEN_BEAST_753:STOMACH +$CREATURE:FORGOTTEN_BEAST_753:GIZZARD +%CREATURE:FORGOTTEN_BEAST_753:PANCREAS +#CREATURE:FORGOTTEN_BEAST_753:SPLEEN +#CREATURE:FORGOTTEN_BEAST_753:KIDNEY +#CREATURE:FORGOTTEN_BEAST_754:MUSCLE + CREATURE:FORGOTTEN_BEAST_754:EYE +"CREATURE:FORGOTTEN_BEAST_754:BRAIN +!CREATURE:FORGOTTEN_BEAST_754:LUNG +"CREATURE:FORGOTTEN_BEAST_754:HEART +"CREATURE:FORGOTTEN_BEAST_754:LIVER + CREATURE:FORGOTTEN_BEAST_754:GUT +$CREATURE:FORGOTTEN_BEAST_754:STOMACH +$CREATURE:FORGOTTEN_BEAST_754:GIZZARD +%CREATURE:FORGOTTEN_BEAST_754:PANCREAS +#CREATURE:FORGOTTEN_BEAST_754:SPLEEN +#CREATURE:FORGOTTEN_BEAST_754:KIDNEY +#CREATURE:FORGOTTEN_BEAST_755:MUSCLE + CREATURE:FORGOTTEN_BEAST_755:EYE +"CREATURE:FORGOTTEN_BEAST_755:BRAIN +!CREATURE:FORGOTTEN_BEAST_755:LUNG +"CREATURE:FORGOTTEN_BEAST_755:HEART +"CREATURE:FORGOTTEN_BEAST_755:LIVER + CREATURE:FORGOTTEN_BEAST_755:GUT +$CREATURE:FORGOTTEN_BEAST_755:STOMACH +$CREATURE:FORGOTTEN_BEAST_755:GIZZARD +%CREATURE:FORGOTTEN_BEAST_755:PANCREAS +#CREATURE:FORGOTTEN_BEAST_755:SPLEEN +#CREATURE:FORGOTTEN_BEAST_755:KIDNEY +#CREATURE:FORGOTTEN_BEAST_756:MUSCLE + CREATURE:FORGOTTEN_BEAST_756:EYE +"CREATURE:FORGOTTEN_BEAST_756:BRAIN +!CREATURE:FORGOTTEN_BEAST_756:LUNG +"CREATURE:FORGOTTEN_BEAST_756:HEART +"CREATURE:FORGOTTEN_BEAST_756:LIVER + CREATURE:FORGOTTEN_BEAST_756:GUT +$CREATURE:FORGOTTEN_BEAST_756:STOMACH +$CREATURE:FORGOTTEN_BEAST_756:GIZZARD +%CREATURE:FORGOTTEN_BEAST_756:PANCREAS +#CREATURE:FORGOTTEN_BEAST_756:SPLEEN +#CREATURE:FORGOTTEN_BEAST_756:KIDNEY +#CREATURE:FORGOTTEN_BEAST_757:MUSCLE + CREATURE:FORGOTTEN_BEAST_757:EYE +"CREATURE:FORGOTTEN_BEAST_757:BRAIN +!CREATURE:FORGOTTEN_BEAST_757:LUNG +"CREATURE:FORGOTTEN_BEAST_757:HEART +"CREATURE:FORGOTTEN_BEAST_757:LIVER + CREATURE:FORGOTTEN_BEAST_757:GUT +$CREATURE:FORGOTTEN_BEAST_757:STOMACH +$CREATURE:FORGOTTEN_BEAST_757:GIZZARD +%CREATURE:FORGOTTEN_BEAST_757:PANCREAS +#CREATURE:FORGOTTEN_BEAST_757:SPLEEN +#CREATURE:FORGOTTEN_BEAST_757:KIDNEY +#CREATURE:FORGOTTEN_BEAST_758:MUSCLE + CREATURE:FORGOTTEN_BEAST_758:EYE +"CREATURE:FORGOTTEN_BEAST_758:BRAIN +!CREATURE:FORGOTTEN_BEAST_758:LUNG +"CREATURE:FORGOTTEN_BEAST_758:HEART +"CREATURE:FORGOTTEN_BEAST_758:LIVER + CREATURE:FORGOTTEN_BEAST_758:GUT +$CREATURE:FORGOTTEN_BEAST_758:STOMACH +$CREATURE:FORGOTTEN_BEAST_758:GIZZARD +%CREATURE:FORGOTTEN_BEAST_758:PANCREAS +#CREATURE:FORGOTTEN_BEAST_758:SPLEEN +#CREATURE:FORGOTTEN_BEAST_758:KIDNEY +#CREATURE:FORGOTTEN_BEAST_759:MUSCLE + CREATURE:FORGOTTEN_BEAST_759:EYE +"CREATURE:FORGOTTEN_BEAST_759:BRAIN +!CREATURE:FORGOTTEN_BEAST_759:LUNG +"CREATURE:FORGOTTEN_BEAST_759:HEART +"CREATURE:FORGOTTEN_BEAST_759:LIVER + CREATURE:FORGOTTEN_BEAST_759:GUT +$CREATURE:FORGOTTEN_BEAST_759:STOMACH +$CREATURE:FORGOTTEN_BEAST_759:GIZZARD +%CREATURE:FORGOTTEN_BEAST_759:PANCREAS +#CREATURE:FORGOTTEN_BEAST_759:SPLEEN +#CREATURE:FORGOTTEN_BEAST_759:KIDNEY +#CREATURE:FORGOTTEN_BEAST_760:MUSCLE + CREATURE:FORGOTTEN_BEAST_760:EYE +"CREATURE:FORGOTTEN_BEAST_760:BRAIN +!CREATURE:FORGOTTEN_BEAST_760:LUNG +"CREATURE:FORGOTTEN_BEAST_760:HEART +"CREATURE:FORGOTTEN_BEAST_760:LIVER + CREATURE:FORGOTTEN_BEAST_760:GUT +$CREATURE:FORGOTTEN_BEAST_760:STOMACH +$CREATURE:FORGOTTEN_BEAST_760:GIZZARD +%CREATURE:FORGOTTEN_BEAST_760:PANCREAS +#CREATURE:FORGOTTEN_BEAST_760:SPLEEN +#CREATURE:FORGOTTEN_BEAST_760:KIDNEY +#CREATURE:FORGOTTEN_BEAST_761:MUSCLE + CREATURE:FORGOTTEN_BEAST_761:EYE +"CREATURE:FORGOTTEN_BEAST_761:BRAIN +!CREATURE:FORGOTTEN_BEAST_761:LUNG +"CREATURE:FORGOTTEN_BEAST_761:HEART +"CREATURE:FORGOTTEN_BEAST_761:LIVER + CREATURE:FORGOTTEN_BEAST_761:GUT +$CREATURE:FORGOTTEN_BEAST_761:STOMACH +$CREATURE:FORGOTTEN_BEAST_761:GIZZARD +%CREATURE:FORGOTTEN_BEAST_761:PANCREAS +#CREATURE:FORGOTTEN_BEAST_761:SPLEEN +#CREATURE:FORGOTTEN_BEAST_761:KIDNEY +#CREATURE:FORGOTTEN_BEAST_762:MUSCLE + CREATURE:FORGOTTEN_BEAST_762:EYE +"CREATURE:FORGOTTEN_BEAST_762:BRAIN +!CREATURE:FORGOTTEN_BEAST_762:LUNG +"CREATURE:FORGOTTEN_BEAST_762:HEART +"CREATURE:FORGOTTEN_BEAST_762:LIVER + CREATURE:FORGOTTEN_BEAST_762:GUT +$CREATURE:FORGOTTEN_BEAST_762:STOMACH +$CREATURE:FORGOTTEN_BEAST_762:GIZZARD +%CREATURE:FORGOTTEN_BEAST_762:PANCREAS +#CREATURE:FORGOTTEN_BEAST_762:SPLEEN +#CREATURE:FORGOTTEN_BEAST_762:KIDNEY +#CREATURE:FORGOTTEN_BEAST_764:MUSCLE + CREATURE:FORGOTTEN_BEAST_764:EYE +"CREATURE:FORGOTTEN_BEAST_764:BRAIN +!CREATURE:FORGOTTEN_BEAST_764:LUNG +"CREATURE:FORGOTTEN_BEAST_764:HEART +"CREATURE:FORGOTTEN_BEAST_764:LIVER + CREATURE:FORGOTTEN_BEAST_764:GUT +$CREATURE:FORGOTTEN_BEAST_764:STOMACH +$CREATURE:FORGOTTEN_BEAST_764:GIZZARD +%CREATURE:FORGOTTEN_BEAST_764:PANCREAS +#CREATURE:FORGOTTEN_BEAST_764:SPLEEN +#CREATURE:FORGOTTEN_BEAST_764:KIDNEY +#CREATURE:FORGOTTEN_BEAST_767:MUSCLE + CREATURE:FORGOTTEN_BEAST_767:EYE +"CREATURE:FORGOTTEN_BEAST_767:BRAIN +!CREATURE:FORGOTTEN_BEAST_767:LUNG +"CREATURE:FORGOTTEN_BEAST_767:HEART +"CREATURE:FORGOTTEN_BEAST_767:LIVER + CREATURE:FORGOTTEN_BEAST_767:GUT +$CREATURE:FORGOTTEN_BEAST_767:STOMACH +$CREATURE:FORGOTTEN_BEAST_767:GIZZARD +%CREATURE:FORGOTTEN_BEAST_767:PANCREAS +#CREATURE:FORGOTTEN_BEAST_767:SPLEEN +#CREATURE:FORGOTTEN_BEAST_767:KIDNEY +#CREATURE:FORGOTTEN_BEAST_768:MUSCLE + CREATURE:FORGOTTEN_BEAST_768:EYE +"CREATURE:FORGOTTEN_BEAST_768:BRAIN +!CREATURE:FORGOTTEN_BEAST_768:LUNG +"CREATURE:FORGOTTEN_BEAST_768:HEART +"CREATURE:FORGOTTEN_BEAST_768:LIVER + CREATURE:FORGOTTEN_BEAST_768:GUT +$CREATURE:FORGOTTEN_BEAST_768:STOMACH +$CREATURE:FORGOTTEN_BEAST_768:GIZZARD +%CREATURE:FORGOTTEN_BEAST_768:PANCREAS +#CREATURE:FORGOTTEN_BEAST_768:SPLEEN +#CREATURE:FORGOTTEN_BEAST_768:KIDNEY +#CREATURE:FORGOTTEN_BEAST_769:MUSCLE + CREATURE:FORGOTTEN_BEAST_769:EYE +"CREATURE:FORGOTTEN_BEAST_769:BRAIN +!CREATURE:FORGOTTEN_BEAST_769:LUNG +"CREATURE:FORGOTTEN_BEAST_769:HEART +"CREATURE:FORGOTTEN_BEAST_769:LIVER + CREATURE:FORGOTTEN_BEAST_769:GUT +$CREATURE:FORGOTTEN_BEAST_769:STOMACH +$CREATURE:FORGOTTEN_BEAST_769:GIZZARD +%CREATURE:FORGOTTEN_BEAST_769:PANCREAS +#CREATURE:FORGOTTEN_BEAST_769:SPLEEN +#CREATURE:FORGOTTEN_BEAST_769:KIDNEY +#CREATURE:FORGOTTEN_BEAST_770:MUSCLE + CREATURE:FORGOTTEN_BEAST_770:EYE +"CREATURE:FORGOTTEN_BEAST_770:BRAIN +!CREATURE:FORGOTTEN_BEAST_770:LUNG +"CREATURE:FORGOTTEN_BEAST_770:HEART +"CREATURE:FORGOTTEN_BEAST_770:LIVER + CREATURE:FORGOTTEN_BEAST_770:GUT +$CREATURE:FORGOTTEN_BEAST_770:STOMACH +$CREATURE:FORGOTTEN_BEAST_770:GIZZARD +%CREATURE:FORGOTTEN_BEAST_770:PANCREAS +#CREATURE:FORGOTTEN_BEAST_770:SPLEEN +#CREATURE:FORGOTTEN_BEAST_770:KIDNEY +#CREATURE:FORGOTTEN_BEAST_773:MUSCLE + CREATURE:FORGOTTEN_BEAST_773:EYE +"CREATURE:FORGOTTEN_BEAST_773:BRAIN +!CREATURE:FORGOTTEN_BEAST_773:LUNG +"CREATURE:FORGOTTEN_BEAST_773:HEART +"CREATURE:FORGOTTEN_BEAST_773:LIVER + CREATURE:FORGOTTEN_BEAST_773:GUT +$CREATURE:FORGOTTEN_BEAST_773:STOMACH +$CREATURE:FORGOTTEN_BEAST_773:GIZZARD +%CREATURE:FORGOTTEN_BEAST_773:PANCREAS +#CREATURE:FORGOTTEN_BEAST_773:SPLEEN +#CREATURE:FORGOTTEN_BEAST_773:KIDNEY +#CREATURE:FORGOTTEN_BEAST_774:MUSCLE + CREATURE:FORGOTTEN_BEAST_774:EYE +"CREATURE:FORGOTTEN_BEAST_774:BRAIN +!CREATURE:FORGOTTEN_BEAST_774:LUNG +"CREATURE:FORGOTTEN_BEAST_774:HEART +"CREATURE:FORGOTTEN_BEAST_774:LIVER + CREATURE:FORGOTTEN_BEAST_774:GUT +$CREATURE:FORGOTTEN_BEAST_774:STOMACH +$CREATURE:FORGOTTEN_BEAST_774:GIZZARD +%CREATURE:FORGOTTEN_BEAST_774:PANCREAS +#CREATURE:FORGOTTEN_BEAST_774:SPLEEN +#CREATURE:FORGOTTEN_BEAST_774:KIDNEY +#CREATURE:FORGOTTEN_BEAST_776:MUSCLE + CREATURE:FORGOTTEN_BEAST_776:EYE +"CREATURE:FORGOTTEN_BEAST_776:BRAIN +!CREATURE:FORGOTTEN_BEAST_776:LUNG +"CREATURE:FORGOTTEN_BEAST_776:HEART +"CREATURE:FORGOTTEN_BEAST_776:LIVER + CREATURE:FORGOTTEN_BEAST_776:GUT +$CREATURE:FORGOTTEN_BEAST_776:STOMACH +$CREATURE:FORGOTTEN_BEAST_776:GIZZARD +%CREATURE:FORGOTTEN_BEAST_776:PANCREAS +#CREATURE:FORGOTTEN_BEAST_776:SPLEEN +#CREATURE:FORGOTTEN_BEAST_776:KIDNEY +#CREATURE:FORGOTTEN_BEAST_777:MUSCLE + CREATURE:FORGOTTEN_BEAST_777:EYE +"CREATURE:FORGOTTEN_BEAST_777:BRAIN +!CREATURE:FORGOTTEN_BEAST_777:LUNG +"CREATURE:FORGOTTEN_BEAST_777:HEART +"CREATURE:FORGOTTEN_BEAST_777:LIVER + CREATURE:FORGOTTEN_BEAST_777:GUT +$CREATURE:FORGOTTEN_BEAST_777:STOMACH +$CREATURE:FORGOTTEN_BEAST_777:GIZZARD +%CREATURE:FORGOTTEN_BEAST_777:PANCREAS +#CREATURE:FORGOTTEN_BEAST_777:SPLEEN +#CREATURE:FORGOTTEN_BEAST_777:KIDNEY +#CREATURE:FORGOTTEN_BEAST_778:MUSCLE + CREATURE:FORGOTTEN_BEAST_778:EYE +"CREATURE:FORGOTTEN_BEAST_778:BRAIN +!CREATURE:FORGOTTEN_BEAST_778:LUNG +"CREATURE:FORGOTTEN_BEAST_778:HEART +"CREATURE:FORGOTTEN_BEAST_778:LIVER + CREATURE:FORGOTTEN_BEAST_778:GUT +$CREATURE:FORGOTTEN_BEAST_778:STOMACH +$CREATURE:FORGOTTEN_BEAST_778:GIZZARD +%CREATURE:FORGOTTEN_BEAST_778:PANCREAS +#CREATURE:FORGOTTEN_BEAST_778:SPLEEN +#CREATURE:FORGOTTEN_BEAST_778:KIDNEY +#CREATURE:FORGOTTEN_BEAST_779:MUSCLE + CREATURE:FORGOTTEN_BEAST_779:EYE +"CREATURE:FORGOTTEN_BEAST_779:BRAIN +!CREATURE:FORGOTTEN_BEAST_779:LUNG +"CREATURE:FORGOTTEN_BEAST_779:HEART +"CREATURE:FORGOTTEN_BEAST_779:LIVER + CREATURE:FORGOTTEN_BEAST_779:GUT +$CREATURE:FORGOTTEN_BEAST_779:STOMACH +$CREATURE:FORGOTTEN_BEAST_779:GIZZARD +%CREATURE:FORGOTTEN_BEAST_779:PANCREAS +#CREATURE:FORGOTTEN_BEAST_779:SPLEEN +#CREATURE:FORGOTTEN_BEAST_779:KIDNEY +#CREATURE:FORGOTTEN_BEAST_780:MUSCLE + CREATURE:FORGOTTEN_BEAST_780:EYE +"CREATURE:FORGOTTEN_BEAST_780:BRAIN +!CREATURE:FORGOTTEN_BEAST_780:LUNG +"CREATURE:FORGOTTEN_BEAST_780:HEART +"CREATURE:FORGOTTEN_BEAST_780:LIVER + CREATURE:FORGOTTEN_BEAST_780:GUT +$CREATURE:FORGOTTEN_BEAST_780:STOMACH +$CREATURE:FORGOTTEN_BEAST_780:GIZZARD +%CREATURE:FORGOTTEN_BEAST_780:PANCREAS +#CREATURE:FORGOTTEN_BEAST_780:SPLEEN +#CREATURE:FORGOTTEN_BEAST_780:KIDNEY +#CREATURE:FORGOTTEN_BEAST_781:MUSCLE + CREATURE:FORGOTTEN_BEAST_781:EYE +"CREATURE:FORGOTTEN_BEAST_781:BRAIN +!CREATURE:FORGOTTEN_BEAST_781:LUNG +"CREATURE:FORGOTTEN_BEAST_781:HEART +"CREATURE:FORGOTTEN_BEAST_781:LIVER + CREATURE:FORGOTTEN_BEAST_781:GUT +$CREATURE:FORGOTTEN_BEAST_781:STOMACH +$CREATURE:FORGOTTEN_BEAST_781:GIZZARD +%CREATURE:FORGOTTEN_BEAST_781:PANCREAS +#CREATURE:FORGOTTEN_BEAST_781:SPLEEN +#CREATURE:FORGOTTEN_BEAST_781:KIDNEY +#CREATURE:FORGOTTEN_BEAST_782:MUSCLE + CREATURE:FORGOTTEN_BEAST_782:EYE +"CREATURE:FORGOTTEN_BEAST_782:BRAIN +!CREATURE:FORGOTTEN_BEAST_782:LUNG +"CREATURE:FORGOTTEN_BEAST_782:HEART +"CREATURE:FORGOTTEN_BEAST_782:LIVER + CREATURE:FORGOTTEN_BEAST_782:GUT +$CREATURE:FORGOTTEN_BEAST_782:STOMACH +$CREATURE:FORGOTTEN_BEAST_782:GIZZARD +%CREATURE:FORGOTTEN_BEAST_782:PANCREAS +#CREATURE:FORGOTTEN_BEAST_782:SPLEEN +#CREATURE:FORGOTTEN_BEAST_782:KIDNEY +#CREATURE:FORGOTTEN_BEAST_783:MUSCLE + CREATURE:FORGOTTEN_BEAST_783:EYE +"CREATURE:FORGOTTEN_BEAST_783:BRAIN +!CREATURE:FORGOTTEN_BEAST_783:LUNG +"CREATURE:FORGOTTEN_BEAST_783:HEART +"CREATURE:FORGOTTEN_BEAST_783:LIVER + CREATURE:FORGOTTEN_BEAST_783:GUT +$CREATURE:FORGOTTEN_BEAST_783:STOMACH +$CREATURE:FORGOTTEN_BEAST_783:GIZZARD +%CREATURE:FORGOTTEN_BEAST_783:PANCREAS +#CREATURE:FORGOTTEN_BEAST_783:SPLEEN +#CREATURE:FORGOTTEN_BEAST_783:KIDNEY +#CREATURE:FORGOTTEN_BEAST_784:MUSCLE + CREATURE:FORGOTTEN_BEAST_784:EYE +"CREATURE:FORGOTTEN_BEAST_784:BRAIN +!CREATURE:FORGOTTEN_BEAST_784:LUNG +"CREATURE:FORGOTTEN_BEAST_784:HEART +"CREATURE:FORGOTTEN_BEAST_784:LIVER + CREATURE:FORGOTTEN_BEAST_784:GUT +$CREATURE:FORGOTTEN_BEAST_784:STOMACH +$CREATURE:FORGOTTEN_BEAST_784:GIZZARD +%CREATURE:FORGOTTEN_BEAST_784:PANCREAS +#CREATURE:FORGOTTEN_BEAST_784:SPLEEN +#CREATURE:FORGOTTEN_BEAST_784:KIDNEY +#CREATURE:FORGOTTEN_BEAST_785:MUSCLE + CREATURE:FORGOTTEN_BEAST_785:EYE +"CREATURE:FORGOTTEN_BEAST_785:BRAIN +!CREATURE:FORGOTTEN_BEAST_785:LUNG +"CREATURE:FORGOTTEN_BEAST_785:HEART +"CREATURE:FORGOTTEN_BEAST_785:LIVER + CREATURE:FORGOTTEN_BEAST_785:GUT +$CREATURE:FORGOTTEN_BEAST_785:STOMACH +$CREATURE:FORGOTTEN_BEAST_785:GIZZARD +%CREATURE:FORGOTTEN_BEAST_785:PANCREAS +#CREATURE:FORGOTTEN_BEAST_785:SPLEEN +#CREATURE:FORGOTTEN_BEAST_785:KIDNEY +#CREATURE:FORGOTTEN_BEAST_786:MUSCLE + CREATURE:FORGOTTEN_BEAST_786:EYE +"CREATURE:FORGOTTEN_BEAST_786:BRAIN +!CREATURE:FORGOTTEN_BEAST_786:LUNG +"CREATURE:FORGOTTEN_BEAST_786:HEART +"CREATURE:FORGOTTEN_BEAST_786:LIVER + CREATURE:FORGOTTEN_BEAST_786:GUT +$CREATURE:FORGOTTEN_BEAST_786:STOMACH +$CREATURE:FORGOTTEN_BEAST_786:GIZZARD +%CREATURE:FORGOTTEN_BEAST_786:PANCREAS +#CREATURE:FORGOTTEN_BEAST_786:SPLEEN +#CREATURE:FORGOTTEN_BEAST_786:KIDNEY +#CREATURE:FORGOTTEN_BEAST_787:MUSCLE + CREATURE:FORGOTTEN_BEAST_787:EYE +"CREATURE:FORGOTTEN_BEAST_787:BRAIN +!CREATURE:FORGOTTEN_BEAST_787:LUNG +"CREATURE:FORGOTTEN_BEAST_787:HEART +"CREATURE:FORGOTTEN_BEAST_787:LIVER + CREATURE:FORGOTTEN_BEAST_787:GUT +$CREATURE:FORGOTTEN_BEAST_787:STOMACH +$CREATURE:FORGOTTEN_BEAST_787:GIZZARD +%CREATURE:FORGOTTEN_BEAST_787:PANCREAS +#CREATURE:FORGOTTEN_BEAST_787:SPLEEN +#CREATURE:FORGOTTEN_BEAST_787:KIDNEY +#CREATURE:FORGOTTEN_BEAST_789:MUSCLE + CREATURE:FORGOTTEN_BEAST_789:EYE +"CREATURE:FORGOTTEN_BEAST_789:BRAIN +!CREATURE:FORGOTTEN_BEAST_789:LUNG +"CREATURE:FORGOTTEN_BEAST_789:HEART +"CREATURE:FORGOTTEN_BEAST_789:LIVER + CREATURE:FORGOTTEN_BEAST_789:GUT +$CREATURE:FORGOTTEN_BEAST_789:STOMACH +$CREATURE:FORGOTTEN_BEAST_789:GIZZARD +%CREATURE:FORGOTTEN_BEAST_789:PANCREAS +#CREATURE:FORGOTTEN_BEAST_789:SPLEEN +#CREATURE:FORGOTTEN_BEAST_789:KIDNEY +#CREATURE:FORGOTTEN_BEAST_792:MUSCLE + CREATURE:FORGOTTEN_BEAST_792:EYE +"CREATURE:FORGOTTEN_BEAST_792:BRAIN +!CREATURE:FORGOTTEN_BEAST_792:LUNG +"CREATURE:FORGOTTEN_BEAST_792:HEART +"CREATURE:FORGOTTEN_BEAST_792:LIVER + CREATURE:FORGOTTEN_BEAST_792:GUT +$CREATURE:FORGOTTEN_BEAST_792:STOMACH +$CREATURE:FORGOTTEN_BEAST_792:GIZZARD +%CREATURE:FORGOTTEN_BEAST_792:PANCREAS +#CREATURE:FORGOTTEN_BEAST_792:SPLEEN +#CREATURE:FORGOTTEN_BEAST_792:KIDNEY +#CREATURE:FORGOTTEN_BEAST_793:MUSCLE + CREATURE:FORGOTTEN_BEAST_793:EYE +"CREATURE:FORGOTTEN_BEAST_793:BRAIN +!CREATURE:FORGOTTEN_BEAST_793:LUNG +"CREATURE:FORGOTTEN_BEAST_793:HEART +"CREATURE:FORGOTTEN_BEAST_793:LIVER + CREATURE:FORGOTTEN_BEAST_793:GUT +$CREATURE:FORGOTTEN_BEAST_793:STOMACH +$CREATURE:FORGOTTEN_BEAST_793:GIZZARD +%CREATURE:FORGOTTEN_BEAST_793:PANCREAS +#CREATURE:FORGOTTEN_BEAST_793:SPLEEN +#CREATURE:FORGOTTEN_BEAST_793:KIDNEY +#CREATURE:FORGOTTEN_BEAST_794:MUSCLE + CREATURE:FORGOTTEN_BEAST_794:EYE +"CREATURE:FORGOTTEN_BEAST_794:BRAIN +!CREATURE:FORGOTTEN_BEAST_794:LUNG +"CREATURE:FORGOTTEN_BEAST_794:HEART +"CREATURE:FORGOTTEN_BEAST_794:LIVER + CREATURE:FORGOTTEN_BEAST_794:GUT +$CREATURE:FORGOTTEN_BEAST_794:STOMACH +$CREATURE:FORGOTTEN_BEAST_794:GIZZARD +%CREATURE:FORGOTTEN_BEAST_794:PANCREAS +#CREATURE:FORGOTTEN_BEAST_794:SPLEEN +#CREATURE:FORGOTTEN_BEAST_794:KIDNEY +#CREATURE:FORGOTTEN_BEAST_795:MUSCLE + CREATURE:FORGOTTEN_BEAST_795:EYE +"CREATURE:FORGOTTEN_BEAST_795:BRAIN +!CREATURE:FORGOTTEN_BEAST_795:LUNG +"CREATURE:FORGOTTEN_BEAST_795:HEART +"CREATURE:FORGOTTEN_BEAST_795:LIVER + CREATURE:FORGOTTEN_BEAST_795:GUT +$CREATURE:FORGOTTEN_BEAST_795:STOMACH +$CREATURE:FORGOTTEN_BEAST_795:GIZZARD +%CREATURE:FORGOTTEN_BEAST_795:PANCREAS +#CREATURE:FORGOTTEN_BEAST_795:SPLEEN +#CREATURE:FORGOTTEN_BEAST_795:KIDNEY +#CREATURE:FORGOTTEN_BEAST_796:MUSCLE + CREATURE:FORGOTTEN_BEAST_796:EYE +"CREATURE:FORGOTTEN_BEAST_796:BRAIN +!CREATURE:FORGOTTEN_BEAST_796:LUNG +"CREATURE:FORGOTTEN_BEAST_796:HEART +"CREATURE:FORGOTTEN_BEAST_796:LIVER + CREATURE:FORGOTTEN_BEAST_796:GUT +$CREATURE:FORGOTTEN_BEAST_796:STOMACH +$CREATURE:FORGOTTEN_BEAST_796:GIZZARD +%CREATURE:FORGOTTEN_BEAST_796:PANCREAS +#CREATURE:FORGOTTEN_BEAST_796:SPLEEN +#CREATURE:FORGOTTEN_BEAST_796:KIDNEY +#CREATURE:FORGOTTEN_BEAST_799:MUSCLE + CREATURE:FORGOTTEN_BEAST_799:EYE +"CREATURE:FORGOTTEN_BEAST_799:BRAIN +!CREATURE:FORGOTTEN_BEAST_799:LUNG +"CREATURE:FORGOTTEN_BEAST_799:HEART +"CREATURE:FORGOTTEN_BEAST_799:LIVER + CREATURE:FORGOTTEN_BEAST_799:GUT +$CREATURE:FORGOTTEN_BEAST_799:STOMACH +$CREATURE:FORGOTTEN_BEAST_799:GIZZARD +%CREATURE:FORGOTTEN_BEAST_799:PANCREAS +#CREATURE:FORGOTTEN_BEAST_799:SPLEEN +#CREATURE:FORGOTTEN_BEAST_799:KIDNEY +#CREATURE:FORGOTTEN_BEAST_800:MUSCLE + CREATURE:FORGOTTEN_BEAST_800:EYE +"CREATURE:FORGOTTEN_BEAST_800:BRAIN +!CREATURE:FORGOTTEN_BEAST_800:LUNG +"CREATURE:FORGOTTEN_BEAST_800:HEART +"CREATURE:FORGOTTEN_BEAST_800:LIVER + CREATURE:FORGOTTEN_BEAST_800:GUT +$CREATURE:FORGOTTEN_BEAST_800:STOMACH +$CREATURE:FORGOTTEN_BEAST_800:GIZZARD +%CREATURE:FORGOTTEN_BEAST_800:PANCREAS +#CREATURE:FORGOTTEN_BEAST_800:SPLEEN +#CREATURE:FORGOTTEN_BEAST_800:KIDNEY +#CREATURE:FORGOTTEN_BEAST_801:MUSCLE + CREATURE:FORGOTTEN_BEAST_801:EYE +"CREATURE:FORGOTTEN_BEAST_801:BRAIN +!CREATURE:FORGOTTEN_BEAST_801:LUNG +"CREATURE:FORGOTTEN_BEAST_801:HEART +"CREATURE:FORGOTTEN_BEAST_801:LIVER + CREATURE:FORGOTTEN_BEAST_801:GUT +$CREATURE:FORGOTTEN_BEAST_801:STOMACH +$CREATURE:FORGOTTEN_BEAST_801:GIZZARD +%CREATURE:FORGOTTEN_BEAST_801:PANCREAS +#CREATURE:FORGOTTEN_BEAST_801:SPLEEN +#CREATURE:FORGOTTEN_BEAST_801:KIDNEY +#CREATURE:FORGOTTEN_BEAST_802:MUSCLE + CREATURE:FORGOTTEN_BEAST_802:EYE +"CREATURE:FORGOTTEN_BEAST_802:BRAIN +!CREATURE:FORGOTTEN_BEAST_802:LUNG +"CREATURE:FORGOTTEN_BEAST_802:HEART +"CREATURE:FORGOTTEN_BEAST_802:LIVER + CREATURE:FORGOTTEN_BEAST_802:GUT +$CREATURE:FORGOTTEN_BEAST_802:STOMACH +$CREATURE:FORGOTTEN_BEAST_802:GIZZARD +%CREATURE:FORGOTTEN_BEAST_802:PANCREAS +#CREATURE:FORGOTTEN_BEAST_802:SPLEEN +#CREATURE:FORGOTTEN_BEAST_802:KIDNEY +#CREATURE:FORGOTTEN_BEAST_803:MUSCLE + CREATURE:FORGOTTEN_BEAST_803:EYE +"CREATURE:FORGOTTEN_BEAST_803:BRAIN +!CREATURE:FORGOTTEN_BEAST_803:LUNG +"CREATURE:FORGOTTEN_BEAST_803:HEART +"CREATURE:FORGOTTEN_BEAST_803:LIVER + CREATURE:FORGOTTEN_BEAST_803:GUT +$CREATURE:FORGOTTEN_BEAST_803:STOMACH +$CREATURE:FORGOTTEN_BEAST_803:GIZZARD +%CREATURE:FORGOTTEN_BEAST_803:PANCREAS +#CREATURE:FORGOTTEN_BEAST_803:SPLEEN +#CREATURE:FORGOTTEN_BEAST_803:KIDNEY +#CREATURE:FORGOTTEN_BEAST_804:MUSCLE + CREATURE:FORGOTTEN_BEAST_804:EYE +"CREATURE:FORGOTTEN_BEAST_804:BRAIN +!CREATURE:FORGOTTEN_BEAST_804:LUNG +"CREATURE:FORGOTTEN_BEAST_804:HEART +"CREATURE:FORGOTTEN_BEAST_804:LIVER + CREATURE:FORGOTTEN_BEAST_804:GUT +$CREATURE:FORGOTTEN_BEAST_804:STOMACH +$CREATURE:FORGOTTEN_BEAST_804:GIZZARD +%CREATURE:FORGOTTEN_BEAST_804:PANCREAS +#CREATURE:FORGOTTEN_BEAST_804:SPLEEN +#CREATURE:FORGOTTEN_BEAST_804:KIDNEY +#CREATURE:FORGOTTEN_BEAST_806:MUSCLE + CREATURE:FORGOTTEN_BEAST_806:EYE +"CREATURE:FORGOTTEN_BEAST_806:BRAIN +!CREATURE:FORGOTTEN_BEAST_806:LUNG +"CREATURE:FORGOTTEN_BEAST_806:HEART +"CREATURE:FORGOTTEN_BEAST_806:LIVER + CREATURE:FORGOTTEN_BEAST_806:GUT +$CREATURE:FORGOTTEN_BEAST_806:STOMACH +$CREATURE:FORGOTTEN_BEAST_806:GIZZARD +%CREATURE:FORGOTTEN_BEAST_806:PANCREAS +#CREATURE:FORGOTTEN_BEAST_806:SPLEEN +#CREATURE:FORGOTTEN_BEAST_806:KIDNEY +#CREATURE:FORGOTTEN_BEAST_807:MUSCLE + CREATURE:FORGOTTEN_BEAST_807:EYE +"CREATURE:FORGOTTEN_BEAST_807:BRAIN +!CREATURE:FORGOTTEN_BEAST_807:LUNG +"CREATURE:FORGOTTEN_BEAST_807:HEART +"CREATURE:FORGOTTEN_BEAST_807:LIVER + CREATURE:FORGOTTEN_BEAST_807:GUT +$CREATURE:FORGOTTEN_BEAST_807:STOMACH +$CREATURE:FORGOTTEN_BEAST_807:GIZZARD +%CREATURE:FORGOTTEN_BEAST_807:PANCREAS +#CREATURE:FORGOTTEN_BEAST_807:SPLEEN +#CREATURE:FORGOTTEN_BEAST_807:KIDNEY +#CREATURE:FORGOTTEN_BEAST_809:MUSCLE + CREATURE:FORGOTTEN_BEAST_809:EYE +"CREATURE:FORGOTTEN_BEAST_809:BRAIN +!CREATURE:FORGOTTEN_BEAST_809:LUNG +"CREATURE:FORGOTTEN_BEAST_809:HEART +"CREATURE:FORGOTTEN_BEAST_809:LIVER + CREATURE:FORGOTTEN_BEAST_809:GUT +$CREATURE:FORGOTTEN_BEAST_809:STOMACH +$CREATURE:FORGOTTEN_BEAST_809:GIZZARD +%CREATURE:FORGOTTEN_BEAST_809:PANCREAS +#CREATURE:FORGOTTEN_BEAST_809:SPLEEN +#CREATURE:FORGOTTEN_BEAST_809:KIDNEY +#CREATURE:FORGOTTEN_BEAST_810:MUSCLE + CREATURE:FORGOTTEN_BEAST_810:EYE +"CREATURE:FORGOTTEN_BEAST_810:BRAIN +!CREATURE:FORGOTTEN_BEAST_810:LUNG +"CREATURE:FORGOTTEN_BEAST_810:HEART +"CREATURE:FORGOTTEN_BEAST_810:LIVER + CREATURE:FORGOTTEN_BEAST_810:GUT +$CREATURE:FORGOTTEN_BEAST_810:STOMACH +$CREATURE:FORGOTTEN_BEAST_810:GIZZARD +%CREATURE:FORGOTTEN_BEAST_810:PANCREAS +#CREATURE:FORGOTTEN_BEAST_810:SPLEEN +#CREATURE:FORGOTTEN_BEAST_810:KIDNEY +#CREATURE:FORGOTTEN_BEAST_811:MUSCLE + CREATURE:FORGOTTEN_BEAST_811:EYE +"CREATURE:FORGOTTEN_BEAST_811:BRAIN +!CREATURE:FORGOTTEN_BEAST_811:LUNG +"CREATURE:FORGOTTEN_BEAST_811:HEART +"CREATURE:FORGOTTEN_BEAST_811:LIVER + CREATURE:FORGOTTEN_BEAST_811:GUT +$CREATURE:FORGOTTEN_BEAST_811:STOMACH +$CREATURE:FORGOTTEN_BEAST_811:GIZZARD +%CREATURE:FORGOTTEN_BEAST_811:PANCREAS +#CREATURE:FORGOTTEN_BEAST_811:SPLEEN +#CREATURE:FORGOTTEN_BEAST_811:KIDNEY +#CREATURE:FORGOTTEN_BEAST_812:MUSCLE + CREATURE:FORGOTTEN_BEAST_812:EYE +"CREATURE:FORGOTTEN_BEAST_812:BRAIN +!CREATURE:FORGOTTEN_BEAST_812:LUNG +"CREATURE:FORGOTTEN_BEAST_812:HEART +"CREATURE:FORGOTTEN_BEAST_812:LIVER + CREATURE:FORGOTTEN_BEAST_812:GUT +$CREATURE:FORGOTTEN_BEAST_812:STOMACH +$CREATURE:FORGOTTEN_BEAST_812:GIZZARD +%CREATURE:FORGOTTEN_BEAST_812:PANCREAS +#CREATURE:FORGOTTEN_BEAST_812:SPLEEN +#CREATURE:FORGOTTEN_BEAST_812:KIDNEY +#CREATURE:FORGOTTEN_BEAST_815:MUSCLE + CREATURE:FORGOTTEN_BEAST_815:EYE +"CREATURE:FORGOTTEN_BEAST_815:BRAIN +!CREATURE:FORGOTTEN_BEAST_815:LUNG +"CREATURE:FORGOTTEN_BEAST_815:HEART +"CREATURE:FORGOTTEN_BEAST_815:LIVER + CREATURE:FORGOTTEN_BEAST_815:GUT +$CREATURE:FORGOTTEN_BEAST_815:STOMACH +$CREATURE:FORGOTTEN_BEAST_815:GIZZARD +%CREATURE:FORGOTTEN_BEAST_815:PANCREAS +#CREATURE:FORGOTTEN_BEAST_815:SPLEEN +#CREATURE:FORGOTTEN_BEAST_815:KIDNEY +#CREATURE:FORGOTTEN_BEAST_817:MUSCLE + CREATURE:FORGOTTEN_BEAST_817:EYE +"CREATURE:FORGOTTEN_BEAST_817:BRAIN +!CREATURE:FORGOTTEN_BEAST_817:LUNG +"CREATURE:FORGOTTEN_BEAST_817:HEART +"CREATURE:FORGOTTEN_BEAST_817:LIVER + CREATURE:FORGOTTEN_BEAST_817:GUT +$CREATURE:FORGOTTEN_BEAST_817:STOMACH +$CREATURE:FORGOTTEN_BEAST_817:GIZZARD +%CREATURE:FORGOTTEN_BEAST_817:PANCREAS +#CREATURE:FORGOTTEN_BEAST_817:SPLEEN +#CREATURE:FORGOTTEN_BEAST_817:KIDNEY +#CREATURE:FORGOTTEN_BEAST_818:MUSCLE + CREATURE:FORGOTTEN_BEAST_818:EYE +"CREATURE:FORGOTTEN_BEAST_818:BRAIN +!CREATURE:FORGOTTEN_BEAST_818:LUNG +"CREATURE:FORGOTTEN_BEAST_818:HEART +"CREATURE:FORGOTTEN_BEAST_818:LIVER + CREATURE:FORGOTTEN_BEAST_818:GUT +$CREATURE:FORGOTTEN_BEAST_818:STOMACH +$CREATURE:FORGOTTEN_BEAST_818:GIZZARD +%CREATURE:FORGOTTEN_BEAST_818:PANCREAS +#CREATURE:FORGOTTEN_BEAST_818:SPLEEN +#CREATURE:FORGOTTEN_BEAST_818:KIDNEY +#CREATURE:FORGOTTEN_BEAST_819:MUSCLE + CREATURE:FORGOTTEN_BEAST_819:EYE +"CREATURE:FORGOTTEN_BEAST_819:BRAIN +!CREATURE:FORGOTTEN_BEAST_819:LUNG +"CREATURE:FORGOTTEN_BEAST_819:HEART +"CREATURE:FORGOTTEN_BEAST_819:LIVER + CREATURE:FORGOTTEN_BEAST_819:GUT +$CREATURE:FORGOTTEN_BEAST_819:STOMACH +$CREATURE:FORGOTTEN_BEAST_819:GIZZARD +%CREATURE:FORGOTTEN_BEAST_819:PANCREAS +#CREATURE:FORGOTTEN_BEAST_819:SPLEEN +#CREATURE:FORGOTTEN_BEAST_819:KIDNEY +#CREATURE:FORGOTTEN_BEAST_820:MUSCLE + CREATURE:FORGOTTEN_BEAST_820:EYE +"CREATURE:FORGOTTEN_BEAST_820:BRAIN +!CREATURE:FORGOTTEN_BEAST_820:LUNG +"CREATURE:FORGOTTEN_BEAST_820:HEART +"CREATURE:FORGOTTEN_BEAST_820:LIVER + CREATURE:FORGOTTEN_BEAST_820:GUT +$CREATURE:FORGOTTEN_BEAST_820:STOMACH +$CREATURE:FORGOTTEN_BEAST_820:GIZZARD +%CREATURE:FORGOTTEN_BEAST_820:PANCREAS +#CREATURE:FORGOTTEN_BEAST_820:SPLEEN +#CREATURE:FORGOTTEN_BEAST_820:KIDNEY +#CREATURE:FORGOTTEN_BEAST_821:MUSCLE + CREATURE:FORGOTTEN_BEAST_821:EYE +"CREATURE:FORGOTTEN_BEAST_821:BRAIN +!CREATURE:FORGOTTEN_BEAST_821:LUNG +"CREATURE:FORGOTTEN_BEAST_821:HEART +"CREATURE:FORGOTTEN_BEAST_821:LIVER + CREATURE:FORGOTTEN_BEAST_821:GUT +$CREATURE:FORGOTTEN_BEAST_821:STOMACH +$CREATURE:FORGOTTEN_BEAST_821:GIZZARD +%CREATURE:FORGOTTEN_BEAST_821:PANCREAS +#CREATURE:FORGOTTEN_BEAST_821:SPLEEN +#CREATURE:FORGOTTEN_BEAST_821:KIDNEY +#CREATURE:FORGOTTEN_BEAST_822:MUSCLE + CREATURE:FORGOTTEN_BEAST_822:EYE +"CREATURE:FORGOTTEN_BEAST_822:BRAIN +!CREATURE:FORGOTTEN_BEAST_822:LUNG +"CREATURE:FORGOTTEN_BEAST_822:HEART +"CREATURE:FORGOTTEN_BEAST_822:LIVER + CREATURE:FORGOTTEN_BEAST_822:GUT +$CREATURE:FORGOTTEN_BEAST_822:STOMACH +$CREATURE:FORGOTTEN_BEAST_822:GIZZARD +%CREATURE:FORGOTTEN_BEAST_822:PANCREAS +#CREATURE:FORGOTTEN_BEAST_822:SPLEEN +#CREATURE:FORGOTTEN_BEAST_822:KIDNEY +#CREATURE:FORGOTTEN_BEAST_824:MUSCLE + CREATURE:FORGOTTEN_BEAST_824:EYE +"CREATURE:FORGOTTEN_BEAST_824:BRAIN +!CREATURE:FORGOTTEN_BEAST_824:LUNG +"CREATURE:FORGOTTEN_BEAST_824:HEART +"CREATURE:FORGOTTEN_BEAST_824:LIVER + CREATURE:FORGOTTEN_BEAST_824:GUT +$CREATURE:FORGOTTEN_BEAST_824:STOMACH +$CREATURE:FORGOTTEN_BEAST_824:GIZZARD +%CREATURE:FORGOTTEN_BEAST_824:PANCREAS +#CREATURE:FORGOTTEN_BEAST_824:SPLEEN +#CREATURE:FORGOTTEN_BEAST_824:KIDNEY +#CREATURE:FORGOTTEN_BEAST_825:MUSCLE + CREATURE:FORGOTTEN_BEAST_825:EYE +"CREATURE:FORGOTTEN_BEAST_825:BRAIN +!CREATURE:FORGOTTEN_BEAST_825:LUNG +"CREATURE:FORGOTTEN_BEAST_825:HEART +"CREATURE:FORGOTTEN_BEAST_825:LIVER + CREATURE:FORGOTTEN_BEAST_825:GUT +$CREATURE:FORGOTTEN_BEAST_825:STOMACH +$CREATURE:FORGOTTEN_BEAST_825:GIZZARD +%CREATURE:FORGOTTEN_BEAST_825:PANCREAS +#CREATURE:FORGOTTEN_BEAST_825:SPLEEN +#CREATURE:FORGOTTEN_BEAST_825:KIDNEY +#CREATURE:FORGOTTEN_BEAST_826:MUSCLE + CREATURE:FORGOTTEN_BEAST_826:EYE +"CREATURE:FORGOTTEN_BEAST_826:BRAIN +!CREATURE:FORGOTTEN_BEAST_826:LUNG +"CREATURE:FORGOTTEN_BEAST_826:HEART +"CREATURE:FORGOTTEN_BEAST_826:LIVER + CREATURE:FORGOTTEN_BEAST_826:GUT +$CREATURE:FORGOTTEN_BEAST_826:STOMACH +$CREATURE:FORGOTTEN_BEAST_826:GIZZARD +%CREATURE:FORGOTTEN_BEAST_826:PANCREAS +#CREATURE:FORGOTTEN_BEAST_826:SPLEEN +#CREATURE:FORGOTTEN_BEAST_826:KIDNEY +#CREATURE:FORGOTTEN_BEAST_827:MUSCLE + CREATURE:FORGOTTEN_BEAST_827:EYE +"CREATURE:FORGOTTEN_BEAST_827:BRAIN +!CREATURE:FORGOTTEN_BEAST_827:LUNG +"CREATURE:FORGOTTEN_BEAST_827:HEART +"CREATURE:FORGOTTEN_BEAST_827:LIVER + CREATURE:FORGOTTEN_BEAST_827:GUT +$CREATURE:FORGOTTEN_BEAST_827:STOMACH +$CREATURE:FORGOTTEN_BEAST_827:GIZZARD +%CREATURE:FORGOTTEN_BEAST_827:PANCREAS +#CREATURE:FORGOTTEN_BEAST_827:SPLEEN +#CREATURE:FORGOTTEN_BEAST_827:KIDNEY +#CREATURE:FORGOTTEN_BEAST_828:MUSCLE + CREATURE:FORGOTTEN_BEAST_828:EYE +"CREATURE:FORGOTTEN_BEAST_828:BRAIN +!CREATURE:FORGOTTEN_BEAST_828:LUNG +"CREATURE:FORGOTTEN_BEAST_828:HEART +"CREATURE:FORGOTTEN_BEAST_828:LIVER + CREATURE:FORGOTTEN_BEAST_828:GUT +$CREATURE:FORGOTTEN_BEAST_828:STOMACH +$CREATURE:FORGOTTEN_BEAST_828:GIZZARD +%CREATURE:FORGOTTEN_BEAST_828:PANCREAS +#CREATURE:FORGOTTEN_BEAST_828:SPLEEN +#CREATURE:FORGOTTEN_BEAST_828:KIDNEY +#CREATURE:FORGOTTEN_BEAST_831:MUSCLE + CREATURE:FORGOTTEN_BEAST_831:EYE +"CREATURE:FORGOTTEN_BEAST_831:BRAIN +!CREATURE:FORGOTTEN_BEAST_831:LUNG +"CREATURE:FORGOTTEN_BEAST_831:HEART +"CREATURE:FORGOTTEN_BEAST_831:LIVER + CREATURE:FORGOTTEN_BEAST_831:GUT +$CREATURE:FORGOTTEN_BEAST_831:STOMACH +$CREATURE:FORGOTTEN_BEAST_831:GIZZARD +%CREATURE:FORGOTTEN_BEAST_831:PANCREAS +#CREATURE:FORGOTTEN_BEAST_831:SPLEEN +#CREATURE:FORGOTTEN_BEAST_831:KIDNEY +#CREATURE:FORGOTTEN_BEAST_833:MUSCLE + CREATURE:FORGOTTEN_BEAST_833:EYE +"CREATURE:FORGOTTEN_BEAST_833:BRAIN +!CREATURE:FORGOTTEN_BEAST_833:LUNG +"CREATURE:FORGOTTEN_BEAST_833:HEART +"CREATURE:FORGOTTEN_BEAST_833:LIVER + CREATURE:FORGOTTEN_BEAST_833:GUT +$CREATURE:FORGOTTEN_BEAST_833:STOMACH +$CREATURE:FORGOTTEN_BEAST_833:GIZZARD +%CREATURE:FORGOTTEN_BEAST_833:PANCREAS +#CREATURE:FORGOTTEN_BEAST_833:SPLEEN +#CREATURE:FORGOTTEN_BEAST_833:KIDNEY +#CREATURE:FORGOTTEN_BEAST_835:MUSCLE + CREATURE:FORGOTTEN_BEAST_835:EYE +"CREATURE:FORGOTTEN_BEAST_835:BRAIN +!CREATURE:FORGOTTEN_BEAST_835:LUNG +"CREATURE:FORGOTTEN_BEAST_835:HEART +"CREATURE:FORGOTTEN_BEAST_835:LIVER + CREATURE:FORGOTTEN_BEAST_835:GUT +$CREATURE:FORGOTTEN_BEAST_835:STOMACH +$CREATURE:FORGOTTEN_BEAST_835:GIZZARD +%CREATURE:FORGOTTEN_BEAST_835:PANCREAS +#CREATURE:FORGOTTEN_BEAST_835:SPLEEN +#CREATURE:FORGOTTEN_BEAST_835:KIDNEY +#CREATURE:FORGOTTEN_BEAST_837:MUSCLE + CREATURE:FORGOTTEN_BEAST_837:EYE +"CREATURE:FORGOTTEN_BEAST_837:BRAIN +!CREATURE:FORGOTTEN_BEAST_837:LUNG +"CREATURE:FORGOTTEN_BEAST_837:HEART +"CREATURE:FORGOTTEN_BEAST_837:LIVER + CREATURE:FORGOTTEN_BEAST_837:GUT +$CREATURE:FORGOTTEN_BEAST_837:STOMACH +$CREATURE:FORGOTTEN_BEAST_837:GIZZARD +%CREATURE:FORGOTTEN_BEAST_837:PANCREAS +#CREATURE:FORGOTTEN_BEAST_837:SPLEEN +#CREATURE:FORGOTTEN_BEAST_837:KIDNEY +#CREATURE:FORGOTTEN_BEAST_838:MUSCLE + CREATURE:FORGOTTEN_BEAST_838:EYE +"CREATURE:FORGOTTEN_BEAST_838:BRAIN +!CREATURE:FORGOTTEN_BEAST_838:LUNG +"CREATURE:FORGOTTEN_BEAST_838:HEART +"CREATURE:FORGOTTEN_BEAST_838:LIVER + CREATURE:FORGOTTEN_BEAST_838:GUT +$CREATURE:FORGOTTEN_BEAST_838:STOMACH +$CREATURE:FORGOTTEN_BEAST_838:GIZZARD +%CREATURE:FORGOTTEN_BEAST_838:PANCREAS +#CREATURE:FORGOTTEN_BEAST_838:SPLEEN +#CREATURE:FORGOTTEN_BEAST_838:KIDNEY +#CREATURE:FORGOTTEN_BEAST_842:MUSCLE + CREATURE:FORGOTTEN_BEAST_842:EYE +"CREATURE:FORGOTTEN_BEAST_842:BRAIN +!CREATURE:FORGOTTEN_BEAST_842:LUNG +"CREATURE:FORGOTTEN_BEAST_842:HEART +"CREATURE:FORGOTTEN_BEAST_842:LIVER + CREATURE:FORGOTTEN_BEAST_842:GUT +$CREATURE:FORGOTTEN_BEAST_842:STOMACH +$CREATURE:FORGOTTEN_BEAST_842:GIZZARD +%CREATURE:FORGOTTEN_BEAST_842:PANCREAS +#CREATURE:FORGOTTEN_BEAST_842:SPLEEN +#CREATURE:FORGOTTEN_BEAST_842:KIDNEY +#CREATURE:FORGOTTEN_BEAST_843:MUSCLE + CREATURE:FORGOTTEN_BEAST_843:EYE +"CREATURE:FORGOTTEN_BEAST_843:BRAIN +!CREATURE:FORGOTTEN_BEAST_843:LUNG +"CREATURE:FORGOTTEN_BEAST_843:HEART +"CREATURE:FORGOTTEN_BEAST_843:LIVER + CREATURE:FORGOTTEN_BEAST_843:GUT +$CREATURE:FORGOTTEN_BEAST_843:STOMACH +$CREATURE:FORGOTTEN_BEAST_843:GIZZARD +%CREATURE:FORGOTTEN_BEAST_843:PANCREAS +#CREATURE:FORGOTTEN_BEAST_843:SPLEEN +#CREATURE:FORGOTTEN_BEAST_843:KIDNEY +#CREATURE:FORGOTTEN_BEAST_844:MUSCLE + CREATURE:FORGOTTEN_BEAST_844:EYE +"CREATURE:FORGOTTEN_BEAST_844:BRAIN +!CREATURE:FORGOTTEN_BEAST_844:LUNG +"CREATURE:FORGOTTEN_BEAST_844:HEART +"CREATURE:FORGOTTEN_BEAST_844:LIVER + CREATURE:FORGOTTEN_BEAST_844:GUT +$CREATURE:FORGOTTEN_BEAST_844:STOMACH +$CREATURE:FORGOTTEN_BEAST_844:GIZZARD +%CREATURE:FORGOTTEN_BEAST_844:PANCREAS +#CREATURE:FORGOTTEN_BEAST_844:SPLEEN +#CREATURE:FORGOTTEN_BEAST_844:KIDNEY +#CREATURE:FORGOTTEN_BEAST_845:MUSCLE + CREATURE:FORGOTTEN_BEAST_845:EYE +"CREATURE:FORGOTTEN_BEAST_845:BRAIN +!CREATURE:FORGOTTEN_BEAST_845:LUNG +"CREATURE:FORGOTTEN_BEAST_845:HEART +"CREATURE:FORGOTTEN_BEAST_845:LIVER + CREATURE:FORGOTTEN_BEAST_845:GUT +$CREATURE:FORGOTTEN_BEAST_845:STOMACH +$CREATURE:FORGOTTEN_BEAST_845:GIZZARD +%CREATURE:FORGOTTEN_BEAST_845:PANCREAS +#CREATURE:FORGOTTEN_BEAST_845:SPLEEN +#CREATURE:FORGOTTEN_BEAST_845:KIDNEY +#CREATURE:FORGOTTEN_BEAST_846:MUSCLE + CREATURE:FORGOTTEN_BEAST_846:EYE +"CREATURE:FORGOTTEN_BEAST_846:BRAIN +!CREATURE:FORGOTTEN_BEAST_846:LUNG +"CREATURE:FORGOTTEN_BEAST_846:HEART +"CREATURE:FORGOTTEN_BEAST_846:LIVER + CREATURE:FORGOTTEN_BEAST_846:GUT +$CREATURE:FORGOTTEN_BEAST_846:STOMACH +$CREATURE:FORGOTTEN_BEAST_846:GIZZARD +%CREATURE:FORGOTTEN_BEAST_846:PANCREAS +#CREATURE:FORGOTTEN_BEAST_846:SPLEEN +#CREATURE:FORGOTTEN_BEAST_846:KIDNEY +#CREATURE:FORGOTTEN_BEAST_847:MUSCLE + CREATURE:FORGOTTEN_BEAST_847:EYE +"CREATURE:FORGOTTEN_BEAST_847:BRAIN +!CREATURE:FORGOTTEN_BEAST_847:LUNG +"CREATURE:FORGOTTEN_BEAST_847:HEART +"CREATURE:FORGOTTEN_BEAST_847:LIVER + CREATURE:FORGOTTEN_BEAST_847:GUT +$CREATURE:FORGOTTEN_BEAST_847:STOMACH +$CREATURE:FORGOTTEN_BEAST_847:GIZZARD +%CREATURE:FORGOTTEN_BEAST_847:PANCREAS +#CREATURE:FORGOTTEN_BEAST_847:SPLEEN +#CREATURE:FORGOTTEN_BEAST_847:KIDNEY +#CREATURE:FORGOTTEN_BEAST_848:MUSCLE + CREATURE:FORGOTTEN_BEAST_848:EYE +"CREATURE:FORGOTTEN_BEAST_848:BRAIN +!CREATURE:FORGOTTEN_BEAST_848:LUNG +"CREATURE:FORGOTTEN_BEAST_848:HEART +"CREATURE:FORGOTTEN_BEAST_848:LIVER + CREATURE:FORGOTTEN_BEAST_848:GUT +$CREATURE:FORGOTTEN_BEAST_848:STOMACH +$CREATURE:FORGOTTEN_BEAST_848:GIZZARD +%CREATURE:FORGOTTEN_BEAST_848:PANCREAS +#CREATURE:FORGOTTEN_BEAST_848:SPLEEN +#CREATURE:FORGOTTEN_BEAST_848:KIDNEY +#CREATURE:FORGOTTEN_BEAST_849:MUSCLE + CREATURE:FORGOTTEN_BEAST_849:EYE +"CREATURE:FORGOTTEN_BEAST_849:BRAIN +!CREATURE:FORGOTTEN_BEAST_849:LUNG +"CREATURE:FORGOTTEN_BEAST_849:HEART +"CREATURE:FORGOTTEN_BEAST_849:LIVER + CREATURE:FORGOTTEN_BEAST_849:GUT +$CREATURE:FORGOTTEN_BEAST_849:STOMACH +$CREATURE:FORGOTTEN_BEAST_849:GIZZARD +%CREATURE:FORGOTTEN_BEAST_849:PANCREAS +#CREATURE:FORGOTTEN_BEAST_849:SPLEEN +#CREATURE:FORGOTTEN_BEAST_849:KIDNEY +#CREATURE:FORGOTTEN_BEAST_851:MUSCLE + CREATURE:FORGOTTEN_BEAST_851:EYE +"CREATURE:FORGOTTEN_BEAST_851:BRAIN +!CREATURE:FORGOTTEN_BEAST_851:LUNG +"CREATURE:FORGOTTEN_BEAST_851:HEART +"CREATURE:FORGOTTEN_BEAST_851:LIVER + CREATURE:FORGOTTEN_BEAST_851:GUT +$CREATURE:FORGOTTEN_BEAST_851:STOMACH +$CREATURE:FORGOTTEN_BEAST_851:GIZZARD +%CREATURE:FORGOTTEN_BEAST_851:PANCREAS +#CREATURE:FORGOTTEN_BEAST_851:SPLEEN +#CREATURE:FORGOTTEN_BEAST_851:KIDNEY +#CREATURE:FORGOTTEN_BEAST_853:MUSCLE + CREATURE:FORGOTTEN_BEAST_853:EYE +"CREATURE:FORGOTTEN_BEAST_853:BRAIN +!CREATURE:FORGOTTEN_BEAST_853:LUNG +"CREATURE:FORGOTTEN_BEAST_853:HEART +"CREATURE:FORGOTTEN_BEAST_853:LIVER + CREATURE:FORGOTTEN_BEAST_853:GUT +$CREATURE:FORGOTTEN_BEAST_853:STOMACH +$CREATURE:FORGOTTEN_BEAST_853:GIZZARD +%CREATURE:FORGOTTEN_BEAST_853:PANCREAS +#CREATURE:FORGOTTEN_BEAST_853:SPLEEN +#CREATURE:FORGOTTEN_BEAST_853:KIDNEY +#CREATURE:FORGOTTEN_BEAST_854:MUSCLE + CREATURE:FORGOTTEN_BEAST_854:EYE +"CREATURE:FORGOTTEN_BEAST_854:BRAIN +!CREATURE:FORGOTTEN_BEAST_854:LUNG +"CREATURE:FORGOTTEN_BEAST_854:HEART +"CREATURE:FORGOTTEN_BEAST_854:LIVER + CREATURE:FORGOTTEN_BEAST_854:GUT +$CREATURE:FORGOTTEN_BEAST_854:STOMACH +$CREATURE:FORGOTTEN_BEAST_854:GIZZARD +%CREATURE:FORGOTTEN_BEAST_854:PANCREAS +#CREATURE:FORGOTTEN_BEAST_854:SPLEEN +#CREATURE:FORGOTTEN_BEAST_854:KIDNEY +#CREATURE:FORGOTTEN_BEAST_855:MUSCLE + CREATURE:FORGOTTEN_BEAST_855:EYE +"CREATURE:FORGOTTEN_BEAST_855:BRAIN +!CREATURE:FORGOTTEN_BEAST_855:LUNG +"CREATURE:FORGOTTEN_BEAST_855:HEART +"CREATURE:FORGOTTEN_BEAST_855:LIVER + CREATURE:FORGOTTEN_BEAST_855:GUT +$CREATURE:FORGOTTEN_BEAST_855:STOMACH +$CREATURE:FORGOTTEN_BEAST_855:GIZZARD +%CREATURE:FORGOTTEN_BEAST_855:PANCREAS +#CREATURE:FORGOTTEN_BEAST_855:SPLEEN +#CREATURE:FORGOTTEN_BEAST_855:KIDNEY +#CREATURE:FORGOTTEN_BEAST_857:MUSCLE + CREATURE:FORGOTTEN_BEAST_857:EYE +"CREATURE:FORGOTTEN_BEAST_857:BRAIN +!CREATURE:FORGOTTEN_BEAST_857:LUNG +"CREATURE:FORGOTTEN_BEAST_857:HEART +"CREATURE:FORGOTTEN_BEAST_857:LIVER + CREATURE:FORGOTTEN_BEAST_857:GUT +$CREATURE:FORGOTTEN_BEAST_857:STOMACH +$CREATURE:FORGOTTEN_BEAST_857:GIZZARD +%CREATURE:FORGOTTEN_BEAST_857:PANCREAS +#CREATURE:FORGOTTEN_BEAST_857:SPLEEN +#CREATURE:FORGOTTEN_BEAST_857:KIDNEY +#CREATURE:FORGOTTEN_BEAST_858:MUSCLE + CREATURE:FORGOTTEN_BEAST_858:EYE +"CREATURE:FORGOTTEN_BEAST_858:BRAIN +!CREATURE:FORGOTTEN_BEAST_858:LUNG +"CREATURE:FORGOTTEN_BEAST_858:HEART +"CREATURE:FORGOTTEN_BEAST_858:LIVER + CREATURE:FORGOTTEN_BEAST_858:GUT +$CREATURE:FORGOTTEN_BEAST_858:STOMACH +$CREATURE:FORGOTTEN_BEAST_858:GIZZARD +%CREATURE:FORGOTTEN_BEAST_858:PANCREAS +#CREATURE:FORGOTTEN_BEAST_858:SPLEEN +#CREATURE:FORGOTTEN_BEAST_858:KIDNEY +#CREATURE:FORGOTTEN_BEAST_859:MUSCLE + CREATURE:FORGOTTEN_BEAST_859:EYE +"CREATURE:FORGOTTEN_BEAST_859:BRAIN +!CREATURE:FORGOTTEN_BEAST_859:LUNG +"CREATURE:FORGOTTEN_BEAST_859:HEART +"CREATURE:FORGOTTEN_BEAST_859:LIVER + CREATURE:FORGOTTEN_BEAST_859:GUT +$CREATURE:FORGOTTEN_BEAST_859:STOMACH +$CREATURE:FORGOTTEN_BEAST_859:GIZZARD +%CREATURE:FORGOTTEN_BEAST_859:PANCREAS +#CREATURE:FORGOTTEN_BEAST_859:SPLEEN +#CREATURE:FORGOTTEN_BEAST_859:KIDNEY +#CREATURE:FORGOTTEN_BEAST_860:MUSCLE + CREATURE:FORGOTTEN_BEAST_860:EYE +"CREATURE:FORGOTTEN_BEAST_860:BRAIN +!CREATURE:FORGOTTEN_BEAST_860:LUNG +"CREATURE:FORGOTTEN_BEAST_860:HEART +"CREATURE:FORGOTTEN_BEAST_860:LIVER + CREATURE:FORGOTTEN_BEAST_860:GUT +$CREATURE:FORGOTTEN_BEAST_860:STOMACH +$CREATURE:FORGOTTEN_BEAST_860:GIZZARD +%CREATURE:FORGOTTEN_BEAST_860:PANCREAS +#CREATURE:FORGOTTEN_BEAST_860:SPLEEN +#CREATURE:FORGOTTEN_BEAST_860:KIDNEY +#CREATURE:FORGOTTEN_BEAST_861:MUSCLE + CREATURE:FORGOTTEN_BEAST_861:EYE +"CREATURE:FORGOTTEN_BEAST_861:BRAIN +!CREATURE:FORGOTTEN_BEAST_861:LUNG +"CREATURE:FORGOTTEN_BEAST_861:HEART +"CREATURE:FORGOTTEN_BEAST_861:LIVER + CREATURE:FORGOTTEN_BEAST_861:GUT +$CREATURE:FORGOTTEN_BEAST_861:STOMACH +$CREATURE:FORGOTTEN_BEAST_861:GIZZARD +%CREATURE:FORGOTTEN_BEAST_861:PANCREAS +#CREATURE:FORGOTTEN_BEAST_861:SPLEEN +#CREATURE:FORGOTTEN_BEAST_861:KIDNEY +#CREATURE:FORGOTTEN_BEAST_862:MUSCLE + CREATURE:FORGOTTEN_BEAST_862:EYE +"CREATURE:FORGOTTEN_BEAST_862:BRAIN +!CREATURE:FORGOTTEN_BEAST_862:LUNG +"CREATURE:FORGOTTEN_BEAST_862:HEART +"CREATURE:FORGOTTEN_BEAST_862:LIVER + CREATURE:FORGOTTEN_BEAST_862:GUT +$CREATURE:FORGOTTEN_BEAST_862:STOMACH +$CREATURE:FORGOTTEN_BEAST_862:GIZZARD +%CREATURE:FORGOTTEN_BEAST_862:PANCREAS +#CREATURE:FORGOTTEN_BEAST_862:SPLEEN +#CREATURE:FORGOTTEN_BEAST_862:KIDNEY +#CREATURE:FORGOTTEN_BEAST_865:MUSCLE + CREATURE:FORGOTTEN_BEAST_865:EYE +"CREATURE:FORGOTTEN_BEAST_865:BRAIN +!CREATURE:FORGOTTEN_BEAST_865:LUNG +"CREATURE:FORGOTTEN_BEAST_865:HEART +"CREATURE:FORGOTTEN_BEAST_865:LIVER + CREATURE:FORGOTTEN_BEAST_865:GUT +$CREATURE:FORGOTTEN_BEAST_865:STOMACH +$CREATURE:FORGOTTEN_BEAST_865:GIZZARD +%CREATURE:FORGOTTEN_BEAST_865:PANCREAS +#CREATURE:FORGOTTEN_BEAST_865:SPLEEN +#CREATURE:FORGOTTEN_BEAST_865:KIDNEY +#CREATURE:FORGOTTEN_BEAST_866:MUSCLE + CREATURE:FORGOTTEN_BEAST_866:EYE +"CREATURE:FORGOTTEN_BEAST_866:BRAIN +!CREATURE:FORGOTTEN_BEAST_866:LUNG +"CREATURE:FORGOTTEN_BEAST_866:HEART +"CREATURE:FORGOTTEN_BEAST_866:LIVER + CREATURE:FORGOTTEN_BEAST_866:GUT +$CREATURE:FORGOTTEN_BEAST_866:STOMACH +$CREATURE:FORGOTTEN_BEAST_866:GIZZARD +%CREATURE:FORGOTTEN_BEAST_866:PANCREAS +#CREATURE:FORGOTTEN_BEAST_866:SPLEEN +#CREATURE:FORGOTTEN_BEAST_866:KIDNEY +#CREATURE:FORGOTTEN_BEAST_867:MUSCLE + CREATURE:FORGOTTEN_BEAST_867:EYE +"CREATURE:FORGOTTEN_BEAST_867:BRAIN +!CREATURE:FORGOTTEN_BEAST_867:LUNG +"CREATURE:FORGOTTEN_BEAST_867:HEART +"CREATURE:FORGOTTEN_BEAST_867:LIVER + CREATURE:FORGOTTEN_BEAST_867:GUT +$CREATURE:FORGOTTEN_BEAST_867:STOMACH +$CREATURE:FORGOTTEN_BEAST_867:GIZZARD +%CREATURE:FORGOTTEN_BEAST_867:PANCREAS +#CREATURE:FORGOTTEN_BEAST_867:SPLEEN +#CREATURE:FORGOTTEN_BEAST_867:KIDNEY +CREATURE:TITAN_1:MUSCLE +CREATURE:TITAN_1:EYE +CREATURE:TITAN_1:BRAIN +CREATURE:TITAN_1:LUNG +CREATURE:TITAN_1:HEART +CREATURE:TITAN_1:LIVER +CREATURE:TITAN_1:GUT +CREATURE:TITAN_1:STOMACH +CREATURE:TITAN_1:GIZZARD +CREATURE:TITAN_1:PANCREAS +CREATURE:TITAN_1:SPLEEN +CREATURE:TITAN_1:KIDNEY +CREATURE:TITAN_3:MUSCLE +CREATURE:TITAN_3:EYE +CREATURE:TITAN_3:BRAIN +CREATURE:TITAN_3:LUNG +CREATURE:TITAN_3:HEART +CREATURE:TITAN_3:LIVER +CREATURE:TITAN_3:GUT +CREATURE:TITAN_3:STOMACH +CREATURE:TITAN_3:GIZZARD +CREATURE:TITAN_3:PANCREAS +CREATURE:TITAN_3:SPLEEN +CREATURE:TITAN_3:KIDNEY +CREATURE:TITAN_4:MUSCLE +CREATURE:TITAN_4:EYE +CREATURE:TITAN_4:BRAIN +CREATURE:TITAN_4:LUNG +CREATURE:TITAN_4:HEART +CREATURE:TITAN_4:LIVER +CREATURE:TITAN_4:GUT +CREATURE:TITAN_4:STOMACH +CREATURE:TITAN_4:GIZZARD +CREATURE:TITAN_4:PANCREAS +CREATURE:TITAN_4:SPLEEN +CREATURE:TITAN_4:KIDNEY +CREATURE:TITAN_6:MUSCLE +CREATURE:TITAN_6:EYE +CREATURE:TITAN_6:BRAIN +CREATURE:TITAN_6:LUNG +CREATURE:TITAN_6:HEART +CREATURE:TITAN_6:LIVER +CREATURE:TITAN_6:GUT +CREATURE:TITAN_6:STOMACH +CREATURE:TITAN_6:GIZZARD +CREATURE:TITAN_6:PANCREAS +CREATURE:TITAN_6:SPLEEN +CREATURE:TITAN_6:KIDNEY +CREATURE:TITAN_7:MUSCLE +CREATURE:TITAN_7:EYE +CREATURE:TITAN_7:BRAIN +CREATURE:TITAN_7:LUNG +CREATURE:TITAN_7:HEART +CREATURE:TITAN_7:LIVER +CREATURE:TITAN_7:GUT +CREATURE:TITAN_7:STOMACH +CREATURE:TITAN_7:GIZZARD +CREATURE:TITAN_7:PANCREAS +CREATURE:TITAN_7:SPLEEN +CREATURE:TITAN_7:KIDNEY +CREATURE:TITAN_8:MUSCLE +CREATURE:TITAN_8:EYE +CREATURE:TITAN_8:BRAIN +CREATURE:TITAN_8:LUNG +CREATURE:TITAN_8:HEART +CREATURE:TITAN_8:LIVER +CREATURE:TITAN_8:GUT +CREATURE:TITAN_8:STOMACH +CREATURE:TITAN_8:GIZZARD +CREATURE:TITAN_8:PANCREAS +CREATURE:TITAN_8:SPLEEN +CREATURE:TITAN_8:KIDNEY +CREATURE:TITAN_9:MUSCLE +CREATURE:TITAN_9:EYE +CREATURE:TITAN_9:BRAIN +CREATURE:TITAN_9:LUNG +CREATURE:TITAN_9:HEART +CREATURE:TITAN_9:LIVER +CREATURE:TITAN_9:GUT +CREATURE:TITAN_9:STOMACH +CREATURE:TITAN_9:GIZZARD +CREATURE:TITAN_9:PANCREAS +CREATURE:TITAN_9:SPLEEN +CREATURE:TITAN_9:KIDNEY +CREATURE:TITAN_10:MUSCLE +CREATURE:TITAN_10:EYE +CREATURE:TITAN_10:BRAIN +CREATURE:TITAN_10:LUNG +CREATURE:TITAN_10:HEART +CREATURE:TITAN_10:LIVER +CREATURE:TITAN_10:GUT +CREATURE:TITAN_10:STOMACH +CREATURE:TITAN_10:GIZZARD +CREATURE:TITAN_10:PANCREAS +CREATURE:TITAN_10:SPLEEN +CREATURE:TITAN_10:KIDNEY +CREATURE:TITAN_11:MUSCLE +CREATURE:TITAN_11:EYE +CREATURE:TITAN_11:BRAIN +CREATURE:TITAN_11:LUNG +CREATURE:TITAN_11:HEART +CREATURE:TITAN_11:LIVER +CREATURE:TITAN_11:GUT +CREATURE:TITAN_11:STOMACH +CREATURE:TITAN_11:GIZZARD +CREATURE:TITAN_11:PANCREAS +CREATURE:TITAN_11:SPLEEN +CREATURE:TITAN_11:KIDNEY +CREATURE:TITAN_12:MUSCLE +CREATURE:TITAN_12:EYE +CREATURE:TITAN_12:BRAIN +CREATURE:TITAN_12:LUNG +CREATURE:TITAN_12:HEART +CREATURE:TITAN_12:LIVER +CREATURE:TITAN_12:GUT +CREATURE:TITAN_12:STOMACH +CREATURE:TITAN_12:GIZZARD +CREATURE:TITAN_12:PANCREAS +CREATURE:TITAN_12:SPLEEN +CREATURE:TITAN_12:KIDNEY +CREATURE:TITAN_13:MUSCLE +CREATURE:TITAN_13:EYE +CREATURE:TITAN_13:BRAIN +CREATURE:TITAN_13:LUNG +CREATURE:TITAN_13:HEART +CREATURE:TITAN_13:LIVER +CREATURE:TITAN_13:GUT +CREATURE:TITAN_13:STOMACH +CREATURE:TITAN_13:GIZZARD +CREATURE:TITAN_13:PANCREAS +CREATURE:TITAN_13:SPLEEN +CREATURE:TITAN_13:KIDNEY +CREATURE:TITAN_14:MUSCLE +CREATURE:TITAN_14:EYE +CREATURE:TITAN_14:BRAIN +CREATURE:TITAN_14:LUNG +CREATURE:TITAN_14:HEART +CREATURE:TITAN_14:LIVER +CREATURE:TITAN_14:GUT +CREATURE:TITAN_14:STOMACH +CREATURE:TITAN_14:GIZZARD +CREATURE:TITAN_14:PANCREAS +CREATURE:TITAN_14:SPLEEN +CREATURE:TITAN_14:KIDNEY +CREATURE:TITAN_15:MUSCLE +CREATURE:TITAN_15:EYE +CREATURE:TITAN_15:BRAIN +CREATURE:TITAN_15:LUNG +CREATURE:TITAN_15:HEART +CREATURE:TITAN_15:LIVER +CREATURE:TITAN_15:GUT +CREATURE:TITAN_15:STOMACH +CREATURE:TITAN_15:GIZZARD +CREATURE:TITAN_15:PANCREAS +CREATURE:TITAN_15:SPLEEN +CREATURE:TITAN_15:KIDNEY +CREATURE:TITAN_18:MUSCLE +CREATURE:TITAN_18:EYE +CREATURE:TITAN_18:BRAIN +CREATURE:TITAN_18:LUNG +CREATURE:TITAN_18:HEART +CREATURE:TITAN_18:LIVER +CREATURE:TITAN_18:GUT +CREATURE:TITAN_18:STOMACH +CREATURE:TITAN_18:GIZZARD +CREATURE:TITAN_18:PANCREAS +CREATURE:TITAN_18:SPLEEN +CREATURE:TITAN_18:KIDNEY +CREATURE:TITAN_19:MUSCLE +CREATURE:TITAN_19:EYE +CREATURE:TITAN_19:BRAIN +CREATURE:TITAN_19:LUNG +CREATURE:TITAN_19:HEART +CREATURE:TITAN_19:LIVER +CREATURE:TITAN_19:GUT +CREATURE:TITAN_19:STOMACH +CREATURE:TITAN_19:GIZZARD +CREATURE:TITAN_19:PANCREAS +CREATURE:TITAN_19:SPLEEN +CREATURE:TITAN_19:KIDNEY +CREATURE:TITAN_21:MUSCLE +CREATURE:TITAN_21:EYE +CREATURE:TITAN_21:BRAIN +CREATURE:TITAN_21:LUNG +CREATURE:TITAN_21:HEART +CREATURE:TITAN_21:LIVER +CREATURE:TITAN_21:GUT +CREATURE:TITAN_21:STOMACH +CREATURE:TITAN_21:GIZZARD +CREATURE:TITAN_21:PANCREAS +CREATURE:TITAN_21:SPLEEN +CREATURE:TITAN_21:KIDNEY +CREATURE:TITAN_23:MUSCLE +CREATURE:TITAN_23:EYE +CREATURE:TITAN_23:BRAIN +CREATURE:TITAN_23:LUNG +CREATURE:TITAN_23:HEART +CREATURE:TITAN_23:LIVER +CREATURE:TITAN_23:GUT +CREATURE:TITAN_23:STOMACH +CREATURE:TITAN_23:GIZZARD +CREATURE:TITAN_23:PANCREAS +CREATURE:TITAN_23:SPLEEN +CREATURE:TITAN_23:KIDNEY +CREATURE:TITAN_24:MUSCLE +CREATURE:TITAN_24:EYE +CREATURE:TITAN_24:BRAIN +CREATURE:TITAN_24:LUNG +CREATURE:TITAN_24:HEART +CREATURE:TITAN_24:LIVER +CREATURE:TITAN_24:GUT +CREATURE:TITAN_24:STOMACH +CREATURE:TITAN_24:GIZZARD +CREATURE:TITAN_24:PANCREAS +CREATURE:TITAN_24:SPLEEN +CREATURE:TITAN_24:KIDNEY +CREATURE:TITAN_25:MUSCLE +CREATURE:TITAN_25:EYE +CREATURE:TITAN_25:BRAIN +CREATURE:TITAN_25:LUNG +CREATURE:TITAN_25:HEART +CREATURE:TITAN_25:LIVER +CREATURE:TITAN_25:GUT +CREATURE:TITAN_25:STOMACH +CREATURE:TITAN_25:GIZZARD +CREATURE:TITAN_25:PANCREAS +CREATURE:TITAN_25:SPLEEN +CREATURE:TITAN_25:KIDNEY +CREATURE:TITAN_26:MUSCLE +CREATURE:TITAN_26:EYE +CREATURE:TITAN_26:BRAIN +CREATURE:TITAN_26:LUNG +CREATURE:TITAN_26:HEART +CREATURE:TITAN_26:LIVER +CREATURE:TITAN_26:GUT +CREATURE:TITAN_26:STOMACH +CREATURE:TITAN_26:GIZZARD +CREATURE:TITAN_26:PANCREAS +CREATURE:TITAN_26:SPLEEN +CREATURE:TITAN_26:KIDNEY +CREATURE:TITAN_27:MUSCLE +CREATURE:TITAN_27:EYE +CREATURE:TITAN_27:BRAIN +CREATURE:TITAN_27:LUNG +CREATURE:TITAN_27:HEART +CREATURE:TITAN_27:LIVER +CREATURE:TITAN_27:GUT +CREATURE:TITAN_27:STOMACH +CREATURE:TITAN_27:GIZZARD +CREATURE:TITAN_27:PANCREAS +CREATURE:TITAN_27:SPLEEN +CREATURE:TITAN_27:KIDNEY +CREATURE:TITAN_28:MUSCLE +CREATURE:TITAN_28:EYE +CREATURE:TITAN_28:BRAIN +CREATURE:TITAN_28:LUNG +CREATURE:TITAN_28:HEART +CREATURE:TITAN_28:LIVER +CREATURE:TITAN_28:GUT +CREATURE:TITAN_28:STOMACH +CREATURE:TITAN_28:GIZZARD +CREATURE:TITAN_28:PANCREAS +CREATURE:TITAN_28:SPLEEN +CREATURE:TITAN_28:KIDNEY +CREATURE:TITAN_29:MUSCLE +CREATURE:TITAN_29:EYE +CREATURE:TITAN_29:BRAIN +CREATURE:TITAN_29:LUNG +CREATURE:TITAN_29:HEART +CREATURE:TITAN_29:LIVER +CREATURE:TITAN_29:GUT +CREATURE:TITAN_29:STOMACH +CREATURE:TITAN_29:GIZZARD +CREATURE:TITAN_29:PANCREAS +CREATURE:TITAN_29:SPLEEN +CREATURE:TITAN_29:KIDNEY +CREATURE:TITAN_30:MUSCLE +CREATURE:TITAN_30:EYE +CREATURE:TITAN_30:BRAIN +CREATURE:TITAN_30:LUNG +CREATURE:TITAN_30:HEART +CREATURE:TITAN_30:LIVER +CREATURE:TITAN_30:GUT +CREATURE:TITAN_30:STOMACH +CREATURE:TITAN_30:GIZZARD +CREATURE:TITAN_30:PANCREAS +CREATURE:TITAN_30:SPLEEN +CREATURE:TITAN_30:KIDNEY +CREATURE:TITAN_32:MUSCLE +CREATURE:TITAN_32:EYE +CREATURE:TITAN_32:BRAIN +CREATURE:TITAN_32:LUNG +CREATURE:TITAN_32:HEART +CREATURE:TITAN_32:LIVER +CREATURE:TITAN_32:GUT +CREATURE:TITAN_32:STOMACH +CREATURE:TITAN_32:GIZZARD +CREATURE:TITAN_32:PANCREAS +CREATURE:TITAN_32:SPLEEN +CREATURE:TITAN_32:KIDNEY +CREATURE:TITAN_33:MUSCLE +CREATURE:TITAN_33:EYE +CREATURE:TITAN_33:BRAIN +CREATURE:TITAN_33:LUNG +CREATURE:TITAN_33:HEART +CREATURE:TITAN_33:LIVER +CREATURE:TITAN_33:GUT +CREATURE:TITAN_33:STOMACH +CREATURE:TITAN_33:GIZZARD +CREATURE:TITAN_33:PANCREAS +CREATURE:TITAN_33:SPLEEN +CREATURE:TITAN_33:KIDNEY +CREATURE:DEMON_7:MUSCLE +CREATURE:DEMON_7:EYE +CREATURE:DEMON_7:BRAIN +CREATURE:DEMON_7:LUNG +CREATURE:DEMON_7:HEART +CREATURE:DEMON_7:LIVER +CREATURE:DEMON_7:GUT +CREATURE:DEMON_7:STOMACH +CREATURE:DEMON_7:GIZZARD +CREATURE:DEMON_7:PANCREAS +CREATURE:DEMON_7:SPLEEN +CREATURE:DEMON_7:KIDNEY +CREATURE:DEMON_8:MUSCLE +CREATURE:DEMON_8:EYE +CREATURE:DEMON_8:BRAIN +CREATURE:DEMON_8:LUNG +CREATURE:DEMON_8:HEART +CREATURE:DEMON_8:LIVER +CREATURE:DEMON_8:GUT +CREATURE:DEMON_8:STOMACH +CREATURE:DEMON_8:GIZZARD +CREATURE:DEMON_8:PANCREAS +CREATURE:DEMON_8:SPLEEN +CREATURE:DEMON_8:KIDNEY +CREATURE:DEMON_9:MUSCLE +CREATURE:DEMON_9:EYE +CREATURE:DEMON_9:BRAIN +CREATURE:DEMON_9:LUNG +CREATURE:DEMON_9:HEART +CREATURE:DEMON_9:LIVER +CREATURE:DEMON_9:GUT +CREATURE:DEMON_9:STOMACH +CREATURE:DEMON_9:GIZZARD +CREATURE:DEMON_9:PANCREAS +CREATURE:DEMON_9:SPLEEN +CREATURE:DEMON_9:KIDNEY +CREATURE:DEMON_10:MUSCLE +CREATURE:DEMON_10:EYE +CREATURE:DEMON_10:BRAIN +CREATURE:DEMON_10:LUNG +CREATURE:DEMON_10:HEART +CREATURE:DEMON_10:LIVER +CREATURE:DEMON_10:GUT +CREATURE:DEMON_10:STOMACH +CREATURE:DEMON_10:GIZZARD +CREATURE:DEMON_10:PANCREAS +CREATURE:DEMON_10:SPLEEN +CREATURE:DEMON_10:KIDNEY +CREATURE:DEMON_11:MUSCLE +CREATURE:DEMON_11:EYE +CREATURE:DEMON_11:BRAIN +CREATURE:DEMON_11:LUNG +CREATURE:DEMON_11:HEART +CREATURE:DEMON_11:LIVER +CREATURE:DEMON_11:GUT +CREATURE:DEMON_11:STOMACH +CREATURE:DEMON_11:GIZZARD +CREATURE:DEMON_11:PANCREAS +CREATURE:DEMON_11:SPLEEN +CREATURE:DEMON_11:KIDNEY +CREATURE:DEMON_12:MUSCLE +CREATURE:DEMON_12:EYE +CREATURE:DEMON_12:BRAIN +CREATURE:DEMON_12:LUNG +CREATURE:DEMON_12:HEART +CREATURE:DEMON_12:LIVER +CREATURE:DEMON_12:GUT +CREATURE:DEMON_12:STOMACH +CREATURE:DEMON_12:GIZZARD +CREATURE:DEMON_12:PANCREAS +CREATURE:DEMON_12:SPLEEN +CREATURE:DEMON_12:KIDNEY +CREATURE:DEMON_13:MUSCLE +CREATURE:DEMON_13:EYE +CREATURE:DEMON_13:BRAIN +CREATURE:DEMON_13:LUNG +CREATURE:DEMON_13:HEART +CREATURE:DEMON_13:LIVER +CREATURE:DEMON_13:GUT +CREATURE:DEMON_13:STOMACH +CREATURE:DEMON_13:GIZZARD +CREATURE:DEMON_13:PANCREAS +CREATURE:DEMON_13:SPLEEN +CREATURE:DEMON_13:KIDNEY +CREATURE:DEMON_14:MUSCLE +CREATURE:DEMON_14:EYE +CREATURE:DEMON_14:BRAIN +CREATURE:DEMON_14:LUNG +CREATURE:DEMON_14:HEART +CREATURE:DEMON_14:LIVER +CREATURE:DEMON_14:GUT +CREATURE:DEMON_14:STOMACH +CREATURE:DEMON_14:GIZZARD +CREATURE:DEMON_14:PANCREAS +CREATURE:DEMON_14:SPLEEN +CREATURE:DEMON_14:KIDNEY +CREATURE:DEMON_15:MUSCLE +CREATURE:DEMON_15:EYE +CREATURE:DEMON_15:BRAIN +CREATURE:DEMON_15:LUNG +CREATURE:DEMON_15:HEART +CREATURE:DEMON_15:LIVER +CREATURE:DEMON_15:GUT +CREATURE:DEMON_15:STOMACH +CREATURE:DEMON_15:GIZZARD +CREATURE:DEMON_15:PANCREAS +CREATURE:DEMON_15:SPLEEN +CREATURE:DEMON_15:KIDNEY +CREATURE:DEMON_16:MUSCLE +CREATURE:DEMON_16:EYE +CREATURE:DEMON_16:BRAIN +CREATURE:DEMON_16:LUNG +CREATURE:DEMON_16:HEART +CREATURE:DEMON_16:LIVER +CREATURE:DEMON_16:GUT +CREATURE:DEMON_16:STOMACH +CREATURE:DEMON_16:GIZZARD +CREATURE:DEMON_16:PANCREAS +CREATURE:DEMON_16:SPLEEN +CREATURE:DEMON_16:KIDNEY +CREATURE:DEMON_17:MUSCLE +CREATURE:DEMON_17:EYE +CREATURE:DEMON_17:BRAIN +CREATURE:DEMON_17:LUNG +CREATURE:DEMON_17:HEART +CREATURE:DEMON_17:LIVER +CREATURE:DEMON_17:GUT +CREATURE:DEMON_17:STOMACH +CREATURE:DEMON_17:GIZZARD +CREATURE:DEMON_17:PANCREAS +CREATURE:DEMON_17:SPLEEN +CREATURE:DEMON_17:KIDNEY +CREATURE:DEMON_18:MUSCLE +CREATURE:DEMON_18:EYE +CREATURE:DEMON_18:BRAIN +CREATURE:DEMON_18:LUNG +CREATURE:DEMON_18:HEART +CREATURE:DEMON_18:LIVER +CREATURE:DEMON_18:GUT +CREATURE:DEMON_18:STOMACH +CREATURE:DEMON_18:GIZZARD +CREATURE:DEMON_18:PANCREAS +CREATURE:DEMON_18:SPLEEN +CREATURE:DEMON_18:KIDNEY +CREATURE:DEMON_19:MUSCLE +CREATURE:DEMON_19:EYE +CREATURE:DEMON_19:BRAIN +CREATURE:DEMON_19:LUNG +CREATURE:DEMON_19:HEART +CREATURE:DEMON_19:LIVER +CREATURE:DEMON_19:GUT +CREATURE:DEMON_19:STOMACH +CREATURE:DEMON_19:GIZZARD +CREATURE:DEMON_19:PANCREAS +CREATURE:DEMON_19:SPLEEN +CREATURE:DEMON_19:KIDNEY +CREATURE:DEMON_20:MUSCLE +CREATURE:DEMON_20:EYE +CREATURE:DEMON_20:BRAIN +CREATURE:DEMON_20:LUNG +CREATURE:DEMON_20:HEART +CREATURE:DEMON_20:LIVER +CREATURE:DEMON_20:GUT +CREATURE:DEMON_20:STOMACH +CREATURE:DEMON_20:GIZZARD +CREATURE:DEMON_20:PANCREAS +CREATURE:DEMON_20:SPLEEN +CREATURE:DEMON_20:KIDNEY +CREATURE:DEMON_21:MUSCLE +CREATURE:DEMON_21:EYE +CREATURE:DEMON_21:BRAIN +CREATURE:DEMON_21:LUNG +CREATURE:DEMON_21:HEART +CREATURE:DEMON_21:LIVER +CREATURE:DEMON_21:GUT +CREATURE:DEMON_21:STOMACH +CREATURE:DEMON_21:GIZZARD +CREATURE:DEMON_21:PANCREAS +CREATURE:DEMON_21:SPLEEN +CREATURE:DEMON_21:KIDNEY +CREATURE:DEMON_22:MUSCLE +CREATURE:DEMON_22:EYE +CREATURE:DEMON_22:BRAIN +CREATURE:DEMON_22:LUNG +CREATURE:DEMON_22:HEART +CREATURE:DEMON_22:LIVER +CREATURE:DEMON_22:GUT +CREATURE:DEMON_22:STOMACH +CREATURE:DEMON_22:GIZZARD +CREATURE:DEMON_22:PANCREAS +CREATURE:DEMON_22:SPLEEN +CREATURE:DEMON_22:KIDNEY +CREATURE:DEMON_23:MUSCLE +CREATURE:DEMON_23:EYE +CREATURE:DEMON_23:BRAIN +CREATURE:DEMON_23:LUNG +CREATURE:DEMON_23:HEART +CREATURE:DEMON_23:LIVER +CREATURE:DEMON_23:GUT +CREATURE:DEMON_23:STOMACH +CREATURE:DEMON_23:GIZZARD +CREATURE:DEMON_23:PANCREAS +CREATURE:DEMON_23:SPLEEN +CREATURE:DEMON_23:KIDNEY +CREATURE:DEMON_24:MUSCLE +CREATURE:DEMON_24:EYE +CREATURE:DEMON_24:BRAIN +CREATURE:DEMON_24:LUNG +CREATURE:DEMON_24:HEART +CREATURE:DEMON_24:LIVER +CREATURE:DEMON_24:GUT +CREATURE:DEMON_24:STOMACH +CREATURE:DEMON_24:GIZZARD +CREATURE:DEMON_24:PANCREAS +CREATURE:DEMON_24:SPLEEN +CREATURE:DEMON_24:KIDNEY +CREATURE:DEMON_25:MUSCLE +CREATURE:DEMON_25:EYE +CREATURE:DEMON_25:BRAIN +CREATURE:DEMON_25:LUNG +CREATURE:DEMON_25:HEART +CREATURE:DEMON_25:LIVER +CREATURE:DEMON_25:GUT +CREATURE:DEMON_25:STOMACH +CREATURE:DEMON_25:GIZZARD +CREATURE:DEMON_25:PANCREAS +CREATURE:DEMON_25:SPLEEN +CREATURE:DEMON_25:KIDNEY +CREATURE:DEMON_26:MUSCLE +CREATURE:DEMON_26:EYE +CREATURE:DEMON_26:BRAIN +CREATURE:DEMON_26:LUNG +CREATURE:DEMON_26:HEART +CREATURE:DEMON_26:LIVER +CREATURE:DEMON_26:GUT +CREATURE:DEMON_26:STOMACH +CREATURE:DEMON_26:GIZZARD +CREATURE:DEMON_26:PANCREAS +CREATURE:DEMON_26:SPLEEN +CREATURE:DEMON_26:KIDNEY +CREATURE:DEMON_27:MUSCLE +CREATURE:DEMON_27:EYE +CREATURE:DEMON_27:BRAIN +CREATURE:DEMON_27:LUNG +CREATURE:DEMON_27:HEART +CREATURE:DEMON_27:LIVER +CREATURE:DEMON_27:GUT +CREATURE:DEMON_27:STOMACH +CREATURE:DEMON_27:GIZZARD +CREATURE:DEMON_27:PANCREAS +CREATURE:DEMON_27:SPLEEN +CREATURE:DEMON_27:KIDNEY +CREATURE:DEMON_28:MUSCLE +CREATURE:DEMON_28:EYE +CREATURE:DEMON_28:BRAIN +CREATURE:DEMON_28:LUNG +CREATURE:DEMON_28:HEART +CREATURE:DEMON_28:LIVER +CREATURE:DEMON_28:GUT +CREATURE:DEMON_28:STOMACH +CREATURE:DEMON_28:GIZZARD +CREATURE:DEMON_28:PANCREAS +CREATURE:DEMON_28:SPLEEN +CREATURE:DEMON_28:KIDNEY +CREATURE:DEMON_29:MUSCLE +CREATURE:DEMON_29:EYE +CREATURE:DEMON_29:BRAIN +CREATURE:DEMON_29:LUNG +CREATURE:DEMON_29:HEART +CREATURE:DEMON_29:LIVER +CREATURE:DEMON_29:GUT +CREATURE:DEMON_29:STOMACH +CREATURE:DEMON_29:GIZZARD +CREATURE:DEMON_29:PANCREAS +CREATURE:DEMON_29:SPLEEN +CREATURE:DEMON_29:KIDNEY +CREATURE:DEMON_31:MUSCLE +CREATURE:DEMON_31:EYE +CREATURE:DEMON_31:BRAIN +CREATURE:DEMON_31:LUNG +CREATURE:DEMON_31:HEART +CREATURE:DEMON_31:LIVER +CREATURE:DEMON_31:GUT +CREATURE:DEMON_31:STOMACH +CREATURE:DEMON_31:GIZZARD +CREATURE:DEMON_31:PANCREAS +CREATURE:DEMON_31:SPLEEN +CREATURE:DEMON_31:KIDNEY +CREATURE:DEMON_32:MUSCLE +CREATURE:DEMON_32:EYE +CREATURE:DEMON_32:BRAIN +CREATURE:DEMON_32:LUNG +CREATURE:DEMON_32:HEART +CREATURE:DEMON_32:LIVER +CREATURE:DEMON_32:GUT +CREATURE:DEMON_32:STOMACH +CREATURE:DEMON_32:GIZZARD +CREATURE:DEMON_32:PANCREAS +CREATURE:DEMON_32:SPLEEN +CREATURE:DEMON_32:KIDNEY +CREATURE:DEMON_38:MUSCLE +CREATURE:DEMON_38:EYE +CREATURE:DEMON_38:BRAIN +CREATURE:DEMON_38:LUNG +CREATURE:DEMON_38:HEART +CREATURE:DEMON_38:LIVER +CREATURE:DEMON_38:GUT +CREATURE:DEMON_38:STOMACH +CREATURE:DEMON_38:GIZZARD +CREATURE:DEMON_38:PANCREAS +CREATURE:DEMON_38:SPLEEN +CREATURE:DEMON_38:KIDNEY +CREATURE:DEMON_39:MUSCLE +CREATURE:DEMON_39:EYE +CREATURE:DEMON_39:BRAIN +CREATURE:DEMON_39:LUNG +CREATURE:DEMON_39:HEART +CREATURE:DEMON_39:LIVER +CREATURE:DEMON_39:GUT +CREATURE:DEMON_39:STOMACH +CREATURE:DEMON_39:GIZZARD +CREATURE:DEMON_39:PANCREAS +CREATURE:DEMON_39:SPLEEN +CREATURE:DEMON_39:KIDNEY +CREATURE:DEMON_40:MUSCLE +CREATURE:DEMON_40:EYE +CREATURE:DEMON_40:BRAIN +CREATURE:DEMON_40:LUNG +CREATURE:DEMON_40:HEART +CREATURE:DEMON_40:LIVER +CREATURE:DEMON_40:GUT +CREATURE:DEMON_40:STOMACH +CREATURE:DEMON_40:GIZZARD +CREATURE:DEMON_40:PANCREAS +CREATURE:DEMON_40:SPLEEN +CREATURE:DEMON_40:KIDNEY +CREATURE:DEMON_41:MUSCLE +CREATURE:DEMON_41:EYE +CREATURE:DEMON_41:BRAIN +CREATURE:DEMON_41:LUNG +CREATURE:DEMON_41:HEART +CREATURE:DEMON_41:LIVER +CREATURE:DEMON_41:GUT +CREATURE:DEMON_41:STOMACH +CREATURE:DEMON_41:GIZZARD +CREATURE:DEMON_41:PANCREAS +CREATURE:DEMON_41:SPLEEN +CREATURE:DEMON_41:KIDNEY +CREATURE:DEMON_42:MUSCLE +CREATURE:DEMON_42:EYE +CREATURE:DEMON_42:BRAIN +CREATURE:DEMON_42:LUNG +CREATURE:DEMON_42:HEART +CREATURE:DEMON_42:LIVER +CREATURE:DEMON_42:GUT +CREATURE:DEMON_42:STOMACH +CREATURE:DEMON_42:GIZZARD +CREATURE:DEMON_42:PANCREAS +CREATURE:DEMON_42:SPLEEN +CREATURE:DEMON_42:KIDNEY +CREATURE:DEMON_43:MUSCLE +CREATURE:DEMON_43:EYE +CREATURE:DEMON_43:BRAIN +CREATURE:DEMON_43:LUNG +CREATURE:DEMON_43:HEART +CREATURE:DEMON_43:LIVER +CREATURE:DEMON_43:GUT +CREATURE:DEMON_43:STOMACH +CREATURE:DEMON_43:GIZZARD +CREATURE:DEMON_43:PANCREAS +CREATURE:DEMON_43:SPLEEN +CREATURE:DEMON_43:KIDNEY +CREATURE:DEMON_44:MUSCLE +CREATURE:DEMON_44:EYE +CREATURE:DEMON_44:BRAIN +CREATURE:DEMON_44:LUNG +CREATURE:DEMON_44:HEART +CREATURE:DEMON_44:LIVER +CREATURE:DEMON_44:GUT +CREATURE:DEMON_44:STOMACH +CREATURE:DEMON_44:GIZZARD +CREATURE:DEMON_44:PANCREAS +CREATURE:DEMON_44:SPLEEN +CREATURE:DEMON_44:KIDNEY +CREATURE:DEMON_45:MUSCLE +CREATURE:DEMON_45:EYE +CREATURE:DEMON_45:BRAIN +CREATURE:DEMON_45:LUNG +CREATURE:DEMON_45:HEART +CREATURE:DEMON_45:LIVER +CREATURE:DEMON_45:GUT +CREATURE:DEMON_45:STOMACH +CREATURE:DEMON_45:GIZZARD +CREATURE:DEMON_45:PANCREAS +CREATURE:DEMON_45:SPLEEN +CREATURE:DEMON_45:KIDNEY +CREATURE:DEMON_47:MUSCLE +CREATURE:DEMON_47:EYE +CREATURE:DEMON_47:BRAIN +CREATURE:DEMON_47:LUNG +CREATURE:DEMON_47:HEART +CREATURE:DEMON_47:LIVER +CREATURE:DEMON_47:GUT +CREATURE:DEMON_47:STOMACH +CREATURE:DEMON_47:GIZZARD +CREATURE:DEMON_47:PANCREAS +CREATURE:DEMON_47:SPLEEN +CREATURE:DEMON_47:KIDNEY +CREATURE:DEMON_48:MUSCLE +CREATURE:DEMON_48:EYE +CREATURE:DEMON_48:BRAIN +CREATURE:DEMON_48:LUNG +CREATURE:DEMON_48:HEART +CREATURE:DEMON_48:LIVER +CREATURE:DEMON_48:GUT +CREATURE:DEMON_48:STOMACH +CREATURE:DEMON_48:GIZZARD +CREATURE:DEMON_48:PANCREAS +CREATURE:DEMON_48:SPLEEN +CREATURE:DEMON_48:KIDNEY +CREATURE:DEMON_49:MUSCLE +CREATURE:DEMON_49:EYE +CREATURE:DEMON_49:BRAIN +CREATURE:DEMON_49:LUNG +CREATURE:DEMON_49:HEART +CREATURE:DEMON_49:LIVER +CREATURE:DEMON_49:GUT +CREATURE:DEMON_49:STOMACH +CREATURE:DEMON_49:GIZZARD +CREATURE:DEMON_49:PANCREAS +CREATURE:DEMON_49:SPLEEN +CREATURE:DEMON_49:KIDNEY +CREATURE:DEMON_52:MUSCLE +CREATURE:DEMON_52:EYE +CREATURE:DEMON_52:BRAIN +CREATURE:DEMON_52:LUNG +CREATURE:DEMON_52:HEART +CREATURE:DEMON_52:LIVER +CREATURE:DEMON_52:GUT +CREATURE:DEMON_52:STOMACH +CREATURE:DEMON_52:GIZZARD +CREATURE:DEMON_52:PANCREAS +CREATURE:DEMON_52:SPLEEN +CREATURE:DEMON_52:KIDNEY + CREATURE:NIGHT_CREATURE_1:MUSCLE +CREATURE:NIGHT_CREATURE_1:EYE +CREATURE:NIGHT_CREATURE_1:BRAIN +CREATURE:NIGHT_CREATURE_1:LUNG +CREATURE:NIGHT_CREATURE_1:HEART +CREATURE:NIGHT_CREATURE_1:LIVER +CREATURE:NIGHT_CREATURE_1:GUT +!CREATURE:NIGHT_CREATURE_1:STOMACH +!CREATURE:NIGHT_CREATURE_1:GIZZARD +"CREATURE:NIGHT_CREATURE_1:PANCREAS + CREATURE:NIGHT_CREATURE_1:SPLEEN + CREATURE:NIGHT_CREATURE_1:KIDNEY + CREATURE:NIGHT_CREATURE_2:MUSCLE +CREATURE:NIGHT_CREATURE_2:EYE +CREATURE:NIGHT_CREATURE_2:BRAIN +CREATURE:NIGHT_CREATURE_2:LUNG +CREATURE:NIGHT_CREATURE_2:HEART +CREATURE:NIGHT_CREATURE_2:LIVER +CREATURE:NIGHT_CREATURE_2:GUT +!CREATURE:NIGHT_CREATURE_2:STOMACH +!CREATURE:NIGHT_CREATURE_2:GIZZARD +"CREATURE:NIGHT_CREATURE_2:PANCREAS + CREATURE:NIGHT_CREATURE_2:SPLEEN + CREATURE:NIGHT_CREATURE_2:KIDNEY + CREATURE:NIGHT_CREATURE_3:MUSCLE +CREATURE:NIGHT_CREATURE_3:EYE +CREATURE:NIGHT_CREATURE_3:BRAIN +CREATURE:NIGHT_CREATURE_3:LUNG +CREATURE:NIGHT_CREATURE_3:HEART +CREATURE:NIGHT_CREATURE_3:LIVER +CREATURE:NIGHT_CREATURE_3:GUT +!CREATURE:NIGHT_CREATURE_3:STOMACH +!CREATURE:NIGHT_CREATURE_3:GIZZARD +"CREATURE:NIGHT_CREATURE_3:PANCREAS + CREATURE:NIGHT_CREATURE_3:SPLEEN + CREATURE:NIGHT_CREATURE_3:KIDNEY + CREATURE:NIGHT_CREATURE_4:MUSCLE +CREATURE:NIGHT_CREATURE_4:EYE +CREATURE:NIGHT_CREATURE_4:BRAIN +CREATURE:NIGHT_CREATURE_4:LUNG +CREATURE:NIGHT_CREATURE_4:HEART +CREATURE:NIGHT_CREATURE_4:LIVER +CREATURE:NIGHT_CREATURE_4:GUT +!CREATURE:NIGHT_CREATURE_4:STOMACH +!CREATURE:NIGHT_CREATURE_4:GIZZARD +"CREATURE:NIGHT_CREATURE_4:PANCREAS + CREATURE:NIGHT_CREATURE_4:SPLEEN + CREATURE:NIGHT_CREATURE_4:KIDNEY + CREATURE:NIGHT_CREATURE_5:MUSCLE +CREATURE:NIGHT_CREATURE_5:EYE +CREATURE:NIGHT_CREATURE_5:BRAIN +CREATURE:NIGHT_CREATURE_5:LUNG +CREATURE:NIGHT_CREATURE_5:HEART +CREATURE:NIGHT_CREATURE_5:LIVER +CREATURE:NIGHT_CREATURE_5:GUT +!CREATURE:NIGHT_CREATURE_5:STOMACH +!CREATURE:NIGHT_CREATURE_5:GIZZARD +"CREATURE:NIGHT_CREATURE_5:PANCREAS + CREATURE:NIGHT_CREATURE_5:SPLEEN + CREATURE:NIGHT_CREATURE_5:KIDNEY + CREATURE:NIGHT_CREATURE_6:MUSCLE +CREATURE:NIGHT_CREATURE_6:EYE +CREATURE:NIGHT_CREATURE_6:BRAIN +CREATURE:NIGHT_CREATURE_6:LUNG +CREATURE:NIGHT_CREATURE_6:HEART +CREATURE:NIGHT_CREATURE_6:LIVER +CREATURE:NIGHT_CREATURE_6:GUT +!CREATURE:NIGHT_CREATURE_6:STOMACH +!CREATURE:NIGHT_CREATURE_6:GIZZARD +"CREATURE:NIGHT_CREATURE_6:PANCREAS + CREATURE:NIGHT_CREATURE_6:SPLEEN + CREATURE:NIGHT_CREATURE_6:KIDNEY + CREATURE:NIGHT_CREATURE_7:MUSCLE +CREATURE:NIGHT_CREATURE_7:EYE +CREATURE:NIGHT_CREATURE_7:BRAIN +CREATURE:NIGHT_CREATURE_7:LUNG +CREATURE:NIGHT_CREATURE_7:HEART +CREATURE:NIGHT_CREATURE_7:LIVER +CREATURE:NIGHT_CREATURE_7:GUT +!CREATURE:NIGHT_CREATURE_7:STOMACH +!CREATURE:NIGHT_CREATURE_7:GIZZARD +"CREATURE:NIGHT_CREATURE_7:PANCREAS + CREATURE:NIGHT_CREATURE_7:SPLEEN + CREATURE:NIGHT_CREATURE_7:KIDNEY + CREATURE:NIGHT_CREATURE_8:MUSCLE +CREATURE:NIGHT_CREATURE_8:EYE +CREATURE:NIGHT_CREATURE_8:BRAIN +CREATURE:NIGHT_CREATURE_8:LUNG +CREATURE:NIGHT_CREATURE_8:HEART +CREATURE:NIGHT_CREATURE_8:LIVER +CREATURE:NIGHT_CREATURE_8:GUT +!CREATURE:NIGHT_CREATURE_8:STOMACH +!CREATURE:NIGHT_CREATURE_8:GIZZARD +"CREATURE:NIGHT_CREATURE_8:PANCREAS + CREATURE:NIGHT_CREATURE_8:SPLEEN + CREATURE:NIGHT_CREATURE_8:KIDNEY + CREATURE:NIGHT_CREATURE_9:MUSCLE +CREATURE:NIGHT_CREATURE_9:EYE +CREATURE:NIGHT_CREATURE_9:BRAIN +CREATURE:NIGHT_CREATURE_9:LUNG +CREATURE:NIGHT_CREATURE_9:HEART +CREATURE:NIGHT_CREATURE_9:LIVER +CREATURE:NIGHT_CREATURE_9:GUT +!CREATURE:NIGHT_CREATURE_9:STOMACH +!CREATURE:NIGHT_CREATURE_9:GIZZARD +"CREATURE:NIGHT_CREATURE_9:PANCREAS + CREATURE:NIGHT_CREATURE_9:SPLEEN + CREATURE:NIGHT_CREATURE_9:KIDNEY +!CREATURE:NIGHT_CREATURE_10:MUSCLE +CREATURE:NIGHT_CREATURE_10:EYE + CREATURE:NIGHT_CREATURE_10:BRAIN +CREATURE:NIGHT_CREATURE_10:LUNG + CREATURE:NIGHT_CREATURE_10:HEART + CREATURE:NIGHT_CREATURE_10:LIVER +CREATURE:NIGHT_CREATURE_10:GUT +"CREATURE:NIGHT_CREATURE_10:STOMACH +"CREATURE:NIGHT_CREATURE_10:GIZZARD +#CREATURE:NIGHT_CREATURE_10:PANCREAS +!CREATURE:NIGHT_CREATURE_10:SPLEEN +!CREATURE:NIGHT_CREATURE_10:KIDNEY +!CREATURE:NIGHT_CREATURE_11:MUSCLE +CREATURE:NIGHT_CREATURE_11:EYE + CREATURE:NIGHT_CREATURE_11:BRAIN +CREATURE:NIGHT_CREATURE_11:LUNG + CREATURE:NIGHT_CREATURE_11:HEART + CREATURE:NIGHT_CREATURE_11:LIVER +CREATURE:NIGHT_CREATURE_11:GUT +"CREATURE:NIGHT_CREATURE_11:STOMACH +"CREATURE:NIGHT_CREATURE_11:GIZZARD +#CREATURE:NIGHT_CREATURE_11:PANCREAS +!CREATURE:NIGHT_CREATURE_11:SPLEEN +!CREATURE:NIGHT_CREATURE_11:KIDNEY +!CREATURE:NIGHT_CREATURE_12:MUSCLE +CREATURE:NIGHT_CREATURE_12:EYE + CREATURE:NIGHT_CREATURE_12:BRAIN +CREATURE:NIGHT_CREATURE_12:LUNG + CREATURE:NIGHT_CREATURE_12:HEART + CREATURE:NIGHT_CREATURE_12:LIVER +CREATURE:NIGHT_CREATURE_12:GUT +"CREATURE:NIGHT_CREATURE_12:STOMACH +"CREATURE:NIGHT_CREATURE_12:GIZZARD +#CREATURE:NIGHT_CREATURE_12:PANCREAS +!CREATURE:NIGHT_CREATURE_12:SPLEEN +!CREATURE:NIGHT_CREATURE_12:KIDNEY +!CREATURE:NIGHT_CREATURE_13:MUSCLE +CREATURE:NIGHT_CREATURE_13:EYE + CREATURE:NIGHT_CREATURE_13:BRAIN +CREATURE:NIGHT_CREATURE_13:LUNG + CREATURE:NIGHT_CREATURE_13:HEART + CREATURE:NIGHT_CREATURE_13:LIVER +CREATURE:NIGHT_CREATURE_13:GUT +"CREATURE:NIGHT_CREATURE_13:STOMACH +"CREATURE:NIGHT_CREATURE_13:GIZZARD +#CREATURE:NIGHT_CREATURE_13:PANCREAS +!CREATURE:NIGHT_CREATURE_13:SPLEEN +!CREATURE:NIGHT_CREATURE_13:KIDNEY +!CREATURE:NIGHT_CREATURE_14:MUSCLE +CREATURE:NIGHT_CREATURE_14:EYE + CREATURE:NIGHT_CREATURE_14:BRAIN +CREATURE:NIGHT_CREATURE_14:LUNG + CREATURE:NIGHT_CREATURE_14:HEART + CREATURE:NIGHT_CREATURE_14:LIVER +CREATURE:NIGHT_CREATURE_14:GUT +"CREATURE:NIGHT_CREATURE_14:STOMACH +"CREATURE:NIGHT_CREATURE_14:GIZZARD +#CREATURE:NIGHT_CREATURE_14:PANCREAS +!CREATURE:NIGHT_CREATURE_14:SPLEEN +!CREATURE:NIGHT_CREATURE_14:KIDNEY +!CREATURE:NIGHT_CREATURE_15:MUSCLE +CREATURE:NIGHT_CREATURE_15:EYE + CREATURE:NIGHT_CREATURE_15:BRAIN +CREATURE:NIGHT_CREATURE_15:LUNG + CREATURE:NIGHT_CREATURE_15:HEART + CREATURE:NIGHT_CREATURE_15:LIVER +CREATURE:NIGHT_CREATURE_15:GUT +"CREATURE:NIGHT_CREATURE_15:STOMACH +"CREATURE:NIGHT_CREATURE_15:GIZZARD +#CREATURE:NIGHT_CREATURE_15:PANCREAS +!CREATURE:NIGHT_CREATURE_15:SPLEEN +!CREATURE:NIGHT_CREATURE_15:KIDNEY +!CREATURE:NIGHT_CREATURE_16:MUSCLE +CREATURE:NIGHT_CREATURE_16:EYE + CREATURE:NIGHT_CREATURE_16:BRAIN +CREATURE:NIGHT_CREATURE_16:LUNG + CREATURE:NIGHT_CREATURE_16:HEART + CREATURE:NIGHT_CREATURE_16:LIVER +CREATURE:NIGHT_CREATURE_16:GUT +"CREATURE:NIGHT_CREATURE_16:STOMACH +"CREATURE:NIGHT_CREATURE_16:GIZZARD +#CREATURE:NIGHT_CREATURE_16:PANCREAS +!CREATURE:NIGHT_CREATURE_16:SPLEEN +!CREATURE:NIGHT_CREATURE_16:KIDNEY +!CREATURE:NIGHT_CREATURE_17:MUSCLE +CREATURE:NIGHT_CREATURE_17:EYE + CREATURE:NIGHT_CREATURE_17:BRAIN +CREATURE:NIGHT_CREATURE_17:LUNG + CREATURE:NIGHT_CREATURE_17:HEART + CREATURE:NIGHT_CREATURE_17:LIVER +CREATURE:NIGHT_CREATURE_17:GUT +"CREATURE:NIGHT_CREATURE_17:STOMACH +"CREATURE:NIGHT_CREATURE_17:GIZZARD +#CREATURE:NIGHT_CREATURE_17:PANCREAS +!CREATURE:NIGHT_CREATURE_17:SPLEEN +!CREATURE:NIGHT_CREATURE_17:KIDNEY +!CREATURE:NIGHT_CREATURE_18:MUSCLE +CREATURE:NIGHT_CREATURE_18:EYE + CREATURE:NIGHT_CREATURE_18:BRAIN +CREATURE:NIGHT_CREATURE_18:LUNG + CREATURE:NIGHT_CREATURE_18:HEART + CREATURE:NIGHT_CREATURE_18:LIVER +CREATURE:NIGHT_CREATURE_18:GUT +"CREATURE:NIGHT_CREATURE_18:STOMACH +"CREATURE:NIGHT_CREATURE_18:GIZZARD +#CREATURE:NIGHT_CREATURE_18:PANCREAS +!CREATURE:NIGHT_CREATURE_18:SPLEEN +!CREATURE:NIGHT_CREATURE_18:KIDNEY +!CREATURE:NIGHT_CREATURE_19:MUSCLE +CREATURE:NIGHT_CREATURE_19:EYE + CREATURE:NIGHT_CREATURE_19:BRAIN +CREATURE:NIGHT_CREATURE_19:LUNG + CREATURE:NIGHT_CREATURE_19:HEART + CREATURE:NIGHT_CREATURE_19:LIVER +CREATURE:NIGHT_CREATURE_19:GUT +"CREATURE:NIGHT_CREATURE_19:STOMACH +"CREATURE:NIGHT_CREATURE_19:GIZZARD +#CREATURE:NIGHT_CREATURE_19:PANCREAS +!CREATURE:NIGHT_CREATURE_19:SPLEEN +!CREATURE:NIGHT_CREATURE_19:KIDNEY +!CREATURE:NIGHT_CREATURE_20:MUSCLE +CREATURE:NIGHT_CREATURE_20:EYE + CREATURE:NIGHT_CREATURE_20:BRAIN +CREATURE:NIGHT_CREATURE_20:LUNG + CREATURE:NIGHT_CREATURE_20:HEART + CREATURE:NIGHT_CREATURE_20:LIVER +CREATURE:NIGHT_CREATURE_20:GUT +"CREATURE:NIGHT_CREATURE_20:STOMACH +"CREATURE:NIGHT_CREATURE_20:GIZZARD +#CREATURE:NIGHT_CREATURE_20:PANCREAS +!CREATURE:NIGHT_CREATURE_20:SPLEEN +!CREATURE:NIGHT_CREATURE_20:KIDNEY +!CREATURE:NIGHT_CREATURE_21:MUSCLE +CREATURE:NIGHT_CREATURE_21:EYE + CREATURE:NIGHT_CREATURE_21:BRAIN +CREATURE:NIGHT_CREATURE_21:LUNG + CREATURE:NIGHT_CREATURE_21:HEART + CREATURE:NIGHT_CREATURE_21:LIVER +CREATURE:NIGHT_CREATURE_21:GUT +"CREATURE:NIGHT_CREATURE_21:STOMACH +"CREATURE:NIGHT_CREATURE_21:GIZZARD +#CREATURE:NIGHT_CREATURE_21:PANCREAS +!CREATURE:NIGHT_CREATURE_21:SPLEEN +!CREATURE:NIGHT_CREATURE_21:KIDNEY +!CREATURE:NIGHT_CREATURE_22:MUSCLE +CREATURE:NIGHT_CREATURE_22:EYE + CREATURE:NIGHT_CREATURE_22:BRAIN +CREATURE:NIGHT_CREATURE_22:LUNG + CREATURE:NIGHT_CREATURE_22:HEART + CREATURE:NIGHT_CREATURE_22:LIVER +CREATURE:NIGHT_CREATURE_22:GUT +"CREATURE:NIGHT_CREATURE_22:STOMACH +"CREATURE:NIGHT_CREATURE_22:GIZZARD +#CREATURE:NIGHT_CREATURE_22:PANCREAS +!CREATURE:NIGHT_CREATURE_22:SPLEEN +!CREATURE:NIGHT_CREATURE_22:KIDNEY +!CREATURE:NIGHT_CREATURE_23:MUSCLE +CREATURE:NIGHT_CREATURE_23:EYE + CREATURE:NIGHT_CREATURE_23:BRAIN +CREATURE:NIGHT_CREATURE_23:LUNG + CREATURE:NIGHT_CREATURE_23:HEART + CREATURE:NIGHT_CREATURE_23:LIVER +CREATURE:NIGHT_CREATURE_23:GUT +"CREATURE:NIGHT_CREATURE_23:STOMACH +"CREATURE:NIGHT_CREATURE_23:GIZZARD +#CREATURE:NIGHT_CREATURE_23:PANCREAS +!CREATURE:NIGHT_CREATURE_23:SPLEEN +!CREATURE:NIGHT_CREATURE_23:KIDNEY +!CREATURE:NIGHT_CREATURE_24:MUSCLE +CREATURE:NIGHT_CREATURE_24:EYE + CREATURE:NIGHT_CREATURE_24:BRAIN +CREATURE:NIGHT_CREATURE_24:LUNG + CREATURE:NIGHT_CREATURE_24:HEART + CREATURE:NIGHT_CREATURE_24:LIVER +CREATURE:NIGHT_CREATURE_24:GUT +"CREATURE:NIGHT_CREATURE_24:STOMACH +"CREATURE:NIGHT_CREATURE_24:GIZZARD +#CREATURE:NIGHT_CREATURE_24:PANCREAS +!CREATURE:NIGHT_CREATURE_24:SPLEEN +!CREATURE:NIGHT_CREATURE_24:KIDNEY +!CREATURE:NIGHT_CREATURE_25:MUSCLE +CREATURE:NIGHT_CREATURE_25:EYE + CREATURE:NIGHT_CREATURE_25:BRAIN +CREATURE:NIGHT_CREATURE_25:LUNG + CREATURE:NIGHT_CREATURE_25:HEART + CREATURE:NIGHT_CREATURE_25:LIVER +CREATURE:NIGHT_CREATURE_25:GUT +"CREATURE:NIGHT_CREATURE_25:STOMACH +"CREATURE:NIGHT_CREATURE_25:GIZZARD +#CREATURE:NIGHT_CREATURE_25:PANCREAS +!CREATURE:NIGHT_CREATURE_25:SPLEEN +!CREATURE:NIGHT_CREATURE_25:KIDNEY +!CREATURE:NIGHT_CREATURE_26:MUSCLE +CREATURE:NIGHT_CREATURE_26:EYE + CREATURE:NIGHT_CREATURE_26:BRAIN +CREATURE:NIGHT_CREATURE_26:LUNG + CREATURE:NIGHT_CREATURE_26:HEART + CREATURE:NIGHT_CREATURE_26:LIVER +CREATURE:NIGHT_CREATURE_26:GUT +"CREATURE:NIGHT_CREATURE_26:STOMACH +"CREATURE:NIGHT_CREATURE_26:GIZZARD +#CREATURE:NIGHT_CREATURE_26:PANCREAS +!CREATURE:NIGHT_CREATURE_26:SPLEEN +!CREATURE:NIGHT_CREATURE_26:KIDNEY +!CREATURE:NIGHT_CREATURE_27:MUSCLE +CREATURE:NIGHT_CREATURE_27:EYE + CREATURE:NIGHT_CREATURE_27:BRAIN +CREATURE:NIGHT_CREATURE_27:LUNG + CREATURE:NIGHT_CREATURE_27:HEART + CREATURE:NIGHT_CREATURE_27:LIVER +CREATURE:NIGHT_CREATURE_27:GUT +"CREATURE:NIGHT_CREATURE_27:STOMACH +"CREATURE:NIGHT_CREATURE_27:GIZZARD +#CREATURE:NIGHT_CREATURE_27:PANCREAS +!CREATURE:NIGHT_CREATURE_27:SPLEEN +!CREATURE:NIGHT_CREATURE_27:KIDNEY +!CREATURE:NIGHT_CREATURE_28:MUSCLE +CREATURE:NIGHT_CREATURE_28:EYE + CREATURE:NIGHT_CREATURE_28:BRAIN +CREATURE:NIGHT_CREATURE_28:LUNG + CREATURE:NIGHT_CREATURE_28:HEART + CREATURE:NIGHT_CREATURE_28:LIVER +CREATURE:NIGHT_CREATURE_28:GUT +"CREATURE:NIGHT_CREATURE_28:STOMACH +"CREATURE:NIGHT_CREATURE_28:GIZZARD +#CREATURE:NIGHT_CREATURE_28:PANCREAS +!CREATURE:NIGHT_CREATURE_28:SPLEEN +!CREATURE:NIGHT_CREATURE_28:KIDNEY +!CREATURE:NIGHT_CREATURE_29:MUSCLE +CREATURE:NIGHT_CREATURE_29:EYE + CREATURE:NIGHT_CREATURE_29:BRAIN +CREATURE:NIGHT_CREATURE_29:LUNG + CREATURE:NIGHT_CREATURE_29:HEART + CREATURE:NIGHT_CREATURE_29:LIVER +CREATURE:NIGHT_CREATURE_29:GUT +"CREATURE:NIGHT_CREATURE_29:STOMACH +"CREATURE:NIGHT_CREATURE_29:GIZZARD +#CREATURE:NIGHT_CREATURE_29:PANCREAS +!CREATURE:NIGHT_CREATURE_29:SPLEEN +!CREATURE:NIGHT_CREATURE_29:KIDNEY +!CREATURE:NIGHT_CREATURE_30:MUSCLE +CREATURE:NIGHT_CREATURE_30:EYE + CREATURE:NIGHT_CREATURE_30:BRAIN +CREATURE:NIGHT_CREATURE_30:LUNG + CREATURE:NIGHT_CREATURE_30:HEART + CREATURE:NIGHT_CREATURE_30:LIVER +CREATURE:NIGHT_CREATURE_30:GUT +"CREATURE:NIGHT_CREATURE_30:STOMACH +"CREATURE:NIGHT_CREATURE_30:GIZZARD +#CREATURE:NIGHT_CREATURE_30:PANCREAS +!CREATURE:NIGHT_CREATURE_30:SPLEEN +!CREATURE:NIGHT_CREATURE_30:KIDNEY +!CREATURE:NIGHT_CREATURE_31:MUSCLE +CREATURE:NIGHT_CREATURE_31:EYE + CREATURE:NIGHT_CREATURE_31:BRAIN +CREATURE:NIGHT_CREATURE_31:LUNG + CREATURE:NIGHT_CREATURE_31:HEART + CREATURE:NIGHT_CREATURE_31:LIVER +CREATURE:NIGHT_CREATURE_31:GUT +"CREATURE:NIGHT_CREATURE_31:STOMACH +"CREATURE:NIGHT_CREATURE_31:GIZZARD +#CREATURE:NIGHT_CREATURE_31:PANCREAS +!CREATURE:NIGHT_CREATURE_31:SPLEEN +!CREATURE:NIGHT_CREATURE_31:KIDNEY +!CREATURE:NIGHT_CREATURE_32:MUSCLE +CREATURE:NIGHT_CREATURE_32:EYE + CREATURE:NIGHT_CREATURE_32:BRAIN +CREATURE:NIGHT_CREATURE_32:LUNG + CREATURE:NIGHT_CREATURE_32:HEART + CREATURE:NIGHT_CREATURE_32:LIVER +CREATURE:NIGHT_CREATURE_32:GUT +"CREATURE:NIGHT_CREATURE_32:STOMACH +"CREATURE:NIGHT_CREATURE_32:GIZZARD +#CREATURE:NIGHT_CREATURE_32:PANCREAS +!CREATURE:NIGHT_CREATURE_32:SPLEEN +!CREATURE:NIGHT_CREATURE_32:KIDNEY +!CREATURE:NIGHT_CREATURE_33:MUSCLE +CREATURE:NIGHT_CREATURE_33:EYE + CREATURE:NIGHT_CREATURE_33:BRAIN +CREATURE:NIGHT_CREATURE_33:LUNG + CREATURE:NIGHT_CREATURE_33:HEART + CREATURE:NIGHT_CREATURE_33:LIVER +CREATURE:NIGHT_CREATURE_33:GUT +"CREATURE:NIGHT_CREATURE_33:STOMACH +"CREATURE:NIGHT_CREATURE_33:GIZZARD +#CREATURE:NIGHT_CREATURE_33:PANCREAS +!CREATURE:NIGHT_CREATURE_33:SPLEEN +!CREATURE:NIGHT_CREATURE_33:KIDNEY +!CREATURE:NIGHT_CREATURE_34:MUSCLE +CREATURE:NIGHT_CREATURE_34:EYE + CREATURE:NIGHT_CREATURE_34:BRAIN +CREATURE:NIGHT_CREATURE_34:LUNG + CREATURE:NIGHT_CREATURE_34:HEART + CREATURE:NIGHT_CREATURE_34:LIVER +CREATURE:NIGHT_CREATURE_34:GUT +"CREATURE:NIGHT_CREATURE_34:STOMACH +"CREATURE:NIGHT_CREATURE_34:GIZZARD +#CREATURE:NIGHT_CREATURE_34:PANCREAS +!CREATURE:NIGHT_CREATURE_34:SPLEEN +!CREATURE:NIGHT_CREATURE_34:KIDNEY +!CREATURE:NIGHT_CREATURE_35:MUSCLE +CREATURE:NIGHT_CREATURE_35:EYE + CREATURE:NIGHT_CREATURE_35:BRAIN +CREATURE:NIGHT_CREATURE_35:LUNG + CREATURE:NIGHT_CREATURE_35:HEART + CREATURE:NIGHT_CREATURE_35:LIVER +CREATURE:NIGHT_CREATURE_35:GUT +"CREATURE:NIGHT_CREATURE_35:STOMACH +"CREATURE:NIGHT_CREATURE_35:GIZZARD +#CREATURE:NIGHT_CREATURE_35:PANCREAS +!CREATURE:NIGHT_CREATURE_35:SPLEEN +!CREATURE:NIGHT_CREATURE_35:KIDNEY +!CREATURE:NIGHT_CREATURE_36:MUSCLE +CREATURE:NIGHT_CREATURE_36:EYE + CREATURE:NIGHT_CREATURE_36:BRAIN +CREATURE:NIGHT_CREATURE_36:LUNG + CREATURE:NIGHT_CREATURE_36:HEART + CREATURE:NIGHT_CREATURE_36:LIVER +CREATURE:NIGHT_CREATURE_36:GUT +"CREATURE:NIGHT_CREATURE_36:STOMACH +"CREATURE:NIGHT_CREATURE_36:GIZZARD +#CREATURE:NIGHT_CREATURE_36:PANCREAS +!CREATURE:NIGHT_CREATURE_36:SPLEEN +!CREATURE:NIGHT_CREATURE_36:KIDNEY +!CREATURE:NIGHT_CREATURE_37:MUSCLE +CREATURE:NIGHT_CREATURE_37:EYE + CREATURE:NIGHT_CREATURE_37:BRAIN +CREATURE:NIGHT_CREATURE_37:LUNG + CREATURE:NIGHT_CREATURE_37:HEART + CREATURE:NIGHT_CREATURE_37:LIVER +CREATURE:NIGHT_CREATURE_37:GUT +"CREATURE:NIGHT_CREATURE_37:STOMACH +"CREATURE:NIGHT_CREATURE_37:GIZZARD +#CREATURE:NIGHT_CREATURE_37:PANCREAS +!CREATURE:NIGHT_CREATURE_37:SPLEEN +!CREATURE:NIGHT_CREATURE_37:KIDNEY +!CREATURE:NIGHT_CREATURE_38:MUSCLE +CREATURE:NIGHT_CREATURE_38:EYE + CREATURE:NIGHT_CREATURE_38:BRAIN +CREATURE:NIGHT_CREATURE_38:LUNG + CREATURE:NIGHT_CREATURE_38:HEART + CREATURE:NIGHT_CREATURE_38:LIVER +CREATURE:NIGHT_CREATURE_38:GUT +"CREATURE:NIGHT_CREATURE_38:STOMACH +"CREATURE:NIGHT_CREATURE_38:GIZZARD +#CREATURE:NIGHT_CREATURE_38:PANCREAS +!CREATURE:NIGHT_CREATURE_38:SPLEEN +!CREATURE:NIGHT_CREATURE_38:KIDNEY +!CREATURE:NIGHT_CREATURE_39:MUSCLE +CREATURE:NIGHT_CREATURE_39:EYE + CREATURE:NIGHT_CREATURE_39:BRAIN +CREATURE:NIGHT_CREATURE_39:LUNG + CREATURE:NIGHT_CREATURE_39:HEART + CREATURE:NIGHT_CREATURE_39:LIVER +CREATURE:NIGHT_CREATURE_39:GUT +"CREATURE:NIGHT_CREATURE_39:STOMACH +"CREATURE:NIGHT_CREATURE_39:GIZZARD +#CREATURE:NIGHT_CREATURE_39:PANCREAS +!CREATURE:NIGHT_CREATURE_39:SPLEEN +!CREATURE:NIGHT_CREATURE_39:KIDNEY +!CREATURE:NIGHT_CREATURE_40:MUSCLE +CREATURE:NIGHT_CREATURE_40:EYE + CREATURE:NIGHT_CREATURE_40:BRAIN +CREATURE:NIGHT_CREATURE_40:LUNG + CREATURE:NIGHT_CREATURE_40:HEART + CREATURE:NIGHT_CREATURE_40:LIVER +CREATURE:NIGHT_CREATURE_40:GUT +"CREATURE:NIGHT_CREATURE_40:STOMACH +"CREATURE:NIGHT_CREATURE_40:GIZZARD +#CREATURE:NIGHT_CREATURE_40:PANCREAS +!CREATURE:NIGHT_CREATURE_40:SPLEEN +!CREATURE:NIGHT_CREATURE_40:KIDNEY +!CREATURE:NIGHT_CREATURE_41:MUSCLE +CREATURE:NIGHT_CREATURE_41:EYE + CREATURE:NIGHT_CREATURE_41:BRAIN +CREATURE:NIGHT_CREATURE_41:LUNG + CREATURE:NIGHT_CREATURE_41:HEART + CREATURE:NIGHT_CREATURE_41:LIVER +CREATURE:NIGHT_CREATURE_41:GUT +"CREATURE:NIGHT_CREATURE_41:STOMACH +"CREATURE:NIGHT_CREATURE_41:GIZZARD +#CREATURE:NIGHT_CREATURE_41:PANCREAS +!CREATURE:NIGHT_CREATURE_41:SPLEEN +!CREATURE:NIGHT_CREATURE_41:KIDNEY +!CREATURE:NIGHT_CREATURE_42:MUSCLE +CREATURE:NIGHT_CREATURE_42:EYE + CREATURE:NIGHT_CREATURE_42:BRAIN +CREATURE:NIGHT_CREATURE_42:LUNG + CREATURE:NIGHT_CREATURE_42:HEART + CREATURE:NIGHT_CREATURE_42:LIVER +CREATURE:NIGHT_CREATURE_42:GUT +"CREATURE:NIGHT_CREATURE_42:STOMACH +"CREATURE:NIGHT_CREATURE_42:GIZZARD +#CREATURE:NIGHT_CREATURE_42:PANCREAS +!CREATURE:NIGHT_CREATURE_42:SPLEEN +!CREATURE:NIGHT_CREATURE_42:KIDNEY +!CREATURE:NIGHT_CREATURE_43:MUSCLE +CREATURE:NIGHT_CREATURE_43:EYE + CREATURE:NIGHT_CREATURE_43:BRAIN +CREATURE:NIGHT_CREATURE_43:LUNG + CREATURE:NIGHT_CREATURE_43:HEART + CREATURE:NIGHT_CREATURE_43:LIVER +CREATURE:NIGHT_CREATURE_43:GUT +"CREATURE:NIGHT_CREATURE_43:STOMACH +"CREATURE:NIGHT_CREATURE_43:GIZZARD +#CREATURE:NIGHT_CREATURE_43:PANCREAS +!CREATURE:NIGHT_CREATURE_43:SPLEEN +!CREATURE:NIGHT_CREATURE_43:KIDNEY +!CREATURE:NIGHT_CREATURE_44:MUSCLE +CREATURE:NIGHT_CREATURE_44:EYE + CREATURE:NIGHT_CREATURE_44:BRAIN +CREATURE:NIGHT_CREATURE_44:LUNG + CREATURE:NIGHT_CREATURE_44:HEART + CREATURE:NIGHT_CREATURE_44:LIVER +CREATURE:NIGHT_CREATURE_44:GUT +"CREATURE:NIGHT_CREATURE_44:STOMACH +"CREATURE:NIGHT_CREATURE_44:GIZZARD +#CREATURE:NIGHT_CREATURE_44:PANCREAS +!CREATURE:NIGHT_CREATURE_44:SPLEEN +!CREATURE:NIGHT_CREATURE_44:KIDNEY +!CREATURE:NIGHT_CREATURE_45:MUSCLE +CREATURE:NIGHT_CREATURE_45:EYE + CREATURE:NIGHT_CREATURE_45:BRAIN +CREATURE:NIGHT_CREATURE_45:LUNG + CREATURE:NIGHT_CREATURE_45:HEART + CREATURE:NIGHT_CREATURE_45:LIVER +CREATURE:NIGHT_CREATURE_45:GUT +"CREATURE:NIGHT_CREATURE_45:STOMACH +"CREATURE:NIGHT_CREATURE_45:GIZZARD +#CREATURE:NIGHT_CREATURE_45:PANCREAS +!CREATURE:NIGHT_CREATURE_45:SPLEEN +!CREATURE:NIGHT_CREATURE_45:KIDNEY +!CREATURE:NIGHT_CREATURE_46:MUSCLE +CREATURE:NIGHT_CREATURE_46:EYE + CREATURE:NIGHT_CREATURE_46:BRAIN +CREATURE:NIGHT_CREATURE_46:LUNG + CREATURE:NIGHT_CREATURE_46:HEART + CREATURE:NIGHT_CREATURE_46:LIVER +CREATURE:NIGHT_CREATURE_46:GUT +"CREATURE:NIGHT_CREATURE_46:STOMACH +"CREATURE:NIGHT_CREATURE_46:GIZZARD +#CREATURE:NIGHT_CREATURE_46:PANCREAS +!CREATURE:NIGHT_CREATURE_46:SPLEEN +!CREATURE:NIGHT_CREATURE_46:KIDNEY +!CREATURE:NIGHT_CREATURE_47:MUSCLE +CREATURE:NIGHT_CREATURE_47:EYE + CREATURE:NIGHT_CREATURE_47:BRAIN +CREATURE:NIGHT_CREATURE_47:LUNG + CREATURE:NIGHT_CREATURE_47:HEART + CREATURE:NIGHT_CREATURE_47:LIVER +CREATURE:NIGHT_CREATURE_47:GUT +"CREATURE:NIGHT_CREATURE_47:STOMACH +"CREATURE:NIGHT_CREATURE_47:GIZZARD +#CREATURE:NIGHT_CREATURE_47:PANCREAS +!CREATURE:NIGHT_CREATURE_47:SPLEEN +!CREATURE:NIGHT_CREATURE_47:KIDNEY +!CREATURE:NIGHT_CREATURE_48:MUSCLE +CREATURE:NIGHT_CREATURE_48:EYE + CREATURE:NIGHT_CREATURE_48:BRAIN +CREATURE:NIGHT_CREATURE_48:LUNG + CREATURE:NIGHT_CREATURE_48:HEART + CREATURE:NIGHT_CREATURE_48:LIVER +CREATURE:NIGHT_CREATURE_48:GUT +"CREATURE:NIGHT_CREATURE_48:STOMACH +"CREATURE:NIGHT_CREATURE_48:GIZZARD +#CREATURE:NIGHT_CREATURE_48:PANCREAS +!CREATURE:NIGHT_CREATURE_48:SPLEEN +!CREATURE:NIGHT_CREATURE_48:KIDNEY +!CREATURE:NIGHT_CREATURE_49:MUSCLE +CREATURE:NIGHT_CREATURE_49:EYE + CREATURE:NIGHT_CREATURE_49:BRAIN +CREATURE:NIGHT_CREATURE_49:LUNG + CREATURE:NIGHT_CREATURE_49:HEART + CREATURE:NIGHT_CREATURE_49:LIVER +CREATURE:NIGHT_CREATURE_49:GUT +"CREATURE:NIGHT_CREATURE_49:STOMACH +"CREATURE:NIGHT_CREATURE_49:GIZZARD +#CREATURE:NIGHT_CREATURE_49:PANCREAS +!CREATURE:NIGHT_CREATURE_49:SPLEEN +!CREATURE:NIGHT_CREATURE_49:KIDNEY +!CREATURE:NIGHT_CREATURE_50:MUSCLE +CREATURE:NIGHT_CREATURE_50:EYE + CREATURE:NIGHT_CREATURE_50:BRAIN +CREATURE:NIGHT_CREATURE_50:LUNG + CREATURE:NIGHT_CREATURE_50:HEART + CREATURE:NIGHT_CREATURE_50:LIVER +CREATURE:NIGHT_CREATURE_50:GUT +"CREATURE:NIGHT_CREATURE_50:STOMACH +"CREATURE:NIGHT_CREATURE_50:GIZZARD +#CREATURE:NIGHT_CREATURE_50:PANCREAS +!CREATURE:NIGHT_CREATURE_50:SPLEEN +!CREATURE:NIGHT_CREATURE_50:KIDNEY +!CREATURE:NIGHT_CREATURE_51:MUSCLE +CREATURE:NIGHT_CREATURE_51:EYE + CREATURE:NIGHT_CREATURE_51:BRAIN +CREATURE:NIGHT_CREATURE_51:LUNG + CREATURE:NIGHT_CREATURE_51:HEART + CREATURE:NIGHT_CREATURE_51:LIVER +CREATURE:NIGHT_CREATURE_51:GUT +"CREATURE:NIGHT_CREATURE_51:STOMACH +"CREATURE:NIGHT_CREATURE_51:GIZZARD +#CREATURE:NIGHT_CREATURE_51:PANCREAS +!CREATURE:NIGHT_CREATURE_51:SPLEEN +!CREATURE:NIGHT_CREATURE_51:KIDNEY +!CREATURE:NIGHT_CREATURE_52:MUSCLE +CREATURE:NIGHT_CREATURE_52:EYE + CREATURE:NIGHT_CREATURE_52:BRAIN +CREATURE:NIGHT_CREATURE_52:LUNG + CREATURE:NIGHT_CREATURE_52:HEART + CREATURE:NIGHT_CREATURE_52:LIVER +CREATURE:NIGHT_CREATURE_52:GUT +"CREATURE:NIGHT_CREATURE_52:STOMACH +"CREATURE:NIGHT_CREATURE_52:GIZZARD +#CREATURE:NIGHT_CREATURE_52:PANCREAS +!CREATURE:NIGHT_CREATURE_52:SPLEEN +!CREATURE:NIGHT_CREATURE_52:KIDNEY +!CREATURE:NIGHT_CREATURE_53:MUSCLE +CREATURE:NIGHT_CREATURE_53:EYE + CREATURE:NIGHT_CREATURE_53:BRAIN +CREATURE:NIGHT_CREATURE_53:LUNG + CREATURE:NIGHT_CREATURE_53:HEART + CREATURE:NIGHT_CREATURE_53:LIVER +CREATURE:NIGHT_CREATURE_53:GUT +"CREATURE:NIGHT_CREATURE_53:STOMACH +"CREATURE:NIGHT_CREATURE_53:GIZZARD +#CREATURE:NIGHT_CREATURE_53:PANCREAS +!CREATURE:NIGHT_CREATURE_53:SPLEEN +!CREATURE:NIGHT_CREATURE_53:KIDNEY +!CREATURE:NIGHT_CREATURE_54:MUSCLE +CREATURE:NIGHT_CREATURE_54:EYE + CREATURE:NIGHT_CREATURE_54:BRAIN +CREATURE:NIGHT_CREATURE_54:LUNG + CREATURE:NIGHT_CREATURE_54:HEART + CREATURE:NIGHT_CREATURE_54:LIVER +CREATURE:NIGHT_CREATURE_54:GUT +"CREATURE:NIGHT_CREATURE_54:STOMACH +"CREATURE:NIGHT_CREATURE_54:GIZZARD +#CREATURE:NIGHT_CREATURE_54:PANCREAS +!CREATURE:NIGHT_CREATURE_54:SPLEEN +!CREATURE:NIGHT_CREATURE_54:KIDNEY +!CREATURE:NIGHT_CREATURE_55:MUSCLE +CREATURE:NIGHT_CREATURE_55:EYE + CREATURE:NIGHT_CREATURE_55:BRAIN +CREATURE:NIGHT_CREATURE_55:LUNG + CREATURE:NIGHT_CREATURE_55:HEART + CREATURE:NIGHT_CREATURE_55:LIVER +CREATURE:NIGHT_CREATURE_55:GUT +"CREATURE:NIGHT_CREATURE_55:STOMACH +"CREATURE:NIGHT_CREATURE_55:GIZZARD +#CREATURE:NIGHT_CREATURE_55:PANCREAS +!CREATURE:NIGHT_CREATURE_55:SPLEEN +!CREATURE:NIGHT_CREATURE_55:KIDNEY +!CREATURE:NIGHT_CREATURE_56:MUSCLE +CREATURE:NIGHT_CREATURE_56:EYE + CREATURE:NIGHT_CREATURE_56:BRAIN +CREATURE:NIGHT_CREATURE_56:LUNG + CREATURE:NIGHT_CREATURE_56:HEART + CREATURE:NIGHT_CREATURE_56:LIVER +CREATURE:NIGHT_CREATURE_56:GUT +"CREATURE:NIGHT_CREATURE_56:STOMACH +"CREATURE:NIGHT_CREATURE_56:GIZZARD +#CREATURE:NIGHT_CREATURE_56:PANCREAS +!CREATURE:NIGHT_CREATURE_56:SPLEEN +!CREATURE:NIGHT_CREATURE_56:KIDNEY +!CREATURE:NIGHT_CREATURE_57:MUSCLE +CREATURE:NIGHT_CREATURE_57:EYE + CREATURE:NIGHT_CREATURE_57:BRAIN +CREATURE:NIGHT_CREATURE_57:LUNG + CREATURE:NIGHT_CREATURE_57:HEART + CREATURE:NIGHT_CREATURE_57:LIVER +CREATURE:NIGHT_CREATURE_57:GUT +"CREATURE:NIGHT_CREATURE_57:STOMACH +"CREATURE:NIGHT_CREATURE_57:GIZZARD +#CREATURE:NIGHT_CREATURE_57:PANCREAS +!CREATURE:NIGHT_CREATURE_57:SPLEEN +!CREATURE:NIGHT_CREATURE_57:KIDNEY +!CREATURE:NIGHT_CREATURE_58:MUSCLE +CREATURE:NIGHT_CREATURE_58:EYE + CREATURE:NIGHT_CREATURE_58:BRAIN +CREATURE:NIGHT_CREATURE_58:LUNG + CREATURE:NIGHT_CREATURE_58:HEART + CREATURE:NIGHT_CREATURE_58:LIVER +CREATURE:NIGHT_CREATURE_58:GUT +"CREATURE:NIGHT_CREATURE_58:STOMACH +"CREATURE:NIGHT_CREATURE_58:GIZZARD +#CREATURE:NIGHT_CREATURE_58:PANCREAS +!CREATURE:NIGHT_CREATURE_58:SPLEEN +!CREATURE:NIGHT_CREATURE_58:KIDNEY +!CREATURE:NIGHT_CREATURE_59:MUSCLE +CREATURE:NIGHT_CREATURE_59:EYE + CREATURE:NIGHT_CREATURE_59:BRAIN +CREATURE:NIGHT_CREATURE_59:LUNG + CREATURE:NIGHT_CREATURE_59:HEART + CREATURE:NIGHT_CREATURE_59:LIVER +CREATURE:NIGHT_CREATURE_59:GUT +"CREATURE:NIGHT_CREATURE_59:STOMACH +"CREATURE:NIGHT_CREATURE_59:GIZZARD +#CREATURE:NIGHT_CREATURE_59:PANCREAS +!CREATURE:NIGHT_CREATURE_59:SPLEEN +!CREATURE:NIGHT_CREATURE_59:KIDNEY +!CREATURE:NIGHT_CREATURE_60:MUSCLE +CREATURE:NIGHT_CREATURE_60:EYE + CREATURE:NIGHT_CREATURE_60:BRAIN +CREATURE:NIGHT_CREATURE_60:LUNG + CREATURE:NIGHT_CREATURE_60:HEART + CREATURE:NIGHT_CREATURE_60:LIVER +CREATURE:NIGHT_CREATURE_60:GUT +"CREATURE:NIGHT_CREATURE_60:STOMACH +"CREATURE:NIGHT_CREATURE_60:GIZZARD +#CREATURE:NIGHT_CREATURE_60:PANCREAS +!CREATURE:NIGHT_CREATURE_60:SPLEEN +!CREATURE:NIGHT_CREATURE_60:KIDNEY +!CREATURE:NIGHT_CREATURE_61:MUSCLE +CREATURE:NIGHT_CREATURE_61:EYE + CREATURE:NIGHT_CREATURE_61:BRAIN +CREATURE:NIGHT_CREATURE_61:LUNG + CREATURE:NIGHT_CREATURE_61:HEART + CREATURE:NIGHT_CREATURE_61:LIVER +CREATURE:NIGHT_CREATURE_61:GUT +"CREATURE:NIGHT_CREATURE_61:STOMACH +"CREATURE:NIGHT_CREATURE_61:GIZZARD +#CREATURE:NIGHT_CREATURE_61:PANCREAS +!CREATURE:NIGHT_CREATURE_61:SPLEEN +!CREATURE:NIGHT_CREATURE_61:KIDNEY +!CREATURE:NIGHT_CREATURE_62:MUSCLE +CREATURE:NIGHT_CREATURE_62:EYE + CREATURE:NIGHT_CREATURE_62:BRAIN +CREATURE:NIGHT_CREATURE_62:LUNG + CREATURE:NIGHT_CREATURE_62:HEART + CREATURE:NIGHT_CREATURE_62:LIVER +CREATURE:NIGHT_CREATURE_62:GUT +"CREATURE:NIGHT_CREATURE_62:STOMACH +"CREATURE:NIGHT_CREATURE_62:GIZZARD +#CREATURE:NIGHT_CREATURE_62:PANCREAS +!CREATURE:NIGHT_CREATURE_62:SPLEEN +!CREATURE:NIGHT_CREATURE_62:KIDNEY +!CREATURE:NIGHT_CREATURE_63:MUSCLE +CREATURE:NIGHT_CREATURE_63:EYE + CREATURE:NIGHT_CREATURE_63:BRAIN +CREATURE:NIGHT_CREATURE_63:LUNG + CREATURE:NIGHT_CREATURE_63:HEART + CREATURE:NIGHT_CREATURE_63:LIVER +CREATURE:NIGHT_CREATURE_63:GUT +"CREATURE:NIGHT_CREATURE_63:STOMACH +"CREATURE:NIGHT_CREATURE_63:GIZZARD +#CREATURE:NIGHT_CREATURE_63:PANCREAS +!CREATURE:NIGHT_CREATURE_63:SPLEEN +!CREATURE:NIGHT_CREATURE_63:KIDNEY +!CREATURE:NIGHT_CREATURE_64:MUSCLE +CREATURE:NIGHT_CREATURE_64:EYE + CREATURE:NIGHT_CREATURE_64:BRAIN +CREATURE:NIGHT_CREATURE_64:LUNG + CREATURE:NIGHT_CREATURE_64:HEART + CREATURE:NIGHT_CREATURE_64:LIVER +CREATURE:NIGHT_CREATURE_64:GUT +"CREATURE:NIGHT_CREATURE_64:STOMACH +"CREATURE:NIGHT_CREATURE_64:GIZZARD +#CREATURE:NIGHT_CREATURE_64:PANCREAS +!CREATURE:NIGHT_CREATURE_64:SPLEEN +!CREATURE:NIGHT_CREATURE_64:KIDNEY +!CREATURE:NIGHT_CREATURE_65:MUSCLE +CREATURE:NIGHT_CREATURE_65:EYE + CREATURE:NIGHT_CREATURE_65:BRAIN +CREATURE:NIGHT_CREATURE_65:LUNG + CREATURE:NIGHT_CREATURE_65:HEART + CREATURE:NIGHT_CREATURE_65:LIVER +CREATURE:NIGHT_CREATURE_65:GUT +"CREATURE:NIGHT_CREATURE_65:STOMACH +"CREATURE:NIGHT_CREATURE_65:GIZZARD +#CREATURE:NIGHT_CREATURE_65:PANCREAS +!CREATURE:NIGHT_CREATURE_65:SPLEEN +!CREATURE:NIGHT_CREATURE_65:KIDNEY +!CREATURE:NIGHT_CREATURE_66:MUSCLE +CREATURE:NIGHT_CREATURE_66:EYE + CREATURE:NIGHT_CREATURE_66:BRAIN +CREATURE:NIGHT_CREATURE_66:LUNG + CREATURE:NIGHT_CREATURE_66:HEART + CREATURE:NIGHT_CREATURE_66:LIVER +CREATURE:NIGHT_CREATURE_66:GUT +"CREATURE:NIGHT_CREATURE_66:STOMACH +"CREATURE:NIGHT_CREATURE_66:GIZZARD +#CREATURE:NIGHT_CREATURE_66:PANCREAS +!CREATURE:NIGHT_CREATURE_66:SPLEEN +!CREATURE:NIGHT_CREATURE_66:KIDNEY +!CREATURE:NIGHT_CREATURE_67:MUSCLE +CREATURE:NIGHT_CREATURE_67:EYE + CREATURE:NIGHT_CREATURE_67:BRAIN +CREATURE:NIGHT_CREATURE_67:LUNG + CREATURE:NIGHT_CREATURE_67:HEART + CREATURE:NIGHT_CREATURE_67:LIVER +CREATURE:NIGHT_CREATURE_67:GUT +"CREATURE:NIGHT_CREATURE_67:STOMACH +"CREATURE:NIGHT_CREATURE_67:GIZZARD +#CREATURE:NIGHT_CREATURE_67:PANCREAS +!CREATURE:NIGHT_CREATURE_67:SPLEEN +!CREATURE:NIGHT_CREATURE_67:KIDNEY +!CREATURE:NIGHT_CREATURE_68:MUSCLE +CREATURE:NIGHT_CREATURE_68:EYE + CREATURE:NIGHT_CREATURE_68:BRAIN +CREATURE:NIGHT_CREATURE_68:LUNG + CREATURE:NIGHT_CREATURE_68:HEART + CREATURE:NIGHT_CREATURE_68:LIVER +CREATURE:NIGHT_CREATURE_68:GUT +"CREATURE:NIGHT_CREATURE_68:STOMACH +"CREATURE:NIGHT_CREATURE_68:GIZZARD +#CREATURE:NIGHT_CREATURE_68:PANCREAS +!CREATURE:NIGHT_CREATURE_68:SPLEEN +!CREATURE:NIGHT_CREATURE_68:KIDNEY +!CREATURE:NIGHT_CREATURE_69:MUSCLE +CREATURE:NIGHT_CREATURE_69:EYE + CREATURE:NIGHT_CREATURE_69:BRAIN +CREATURE:NIGHT_CREATURE_69:LUNG + CREATURE:NIGHT_CREATURE_69:HEART + CREATURE:NIGHT_CREATURE_69:LIVER +CREATURE:NIGHT_CREATURE_69:GUT +"CREATURE:NIGHT_CREATURE_69:STOMACH +"CREATURE:NIGHT_CREATURE_69:GIZZARD +#CREATURE:NIGHT_CREATURE_69:PANCREAS +!CREATURE:NIGHT_CREATURE_69:SPLEEN +!CREATURE:NIGHT_CREATURE_69:KIDNEY +!CREATURE:NIGHT_CREATURE_70:MUSCLE +CREATURE:NIGHT_CREATURE_70:EYE + CREATURE:NIGHT_CREATURE_70:BRAIN +CREATURE:NIGHT_CREATURE_70:LUNG + CREATURE:NIGHT_CREATURE_70:HEART + CREATURE:NIGHT_CREATURE_70:LIVER +CREATURE:NIGHT_CREATURE_70:GUT +"CREATURE:NIGHT_CREATURE_70:STOMACH +"CREATURE:NIGHT_CREATURE_70:GIZZARD +#CREATURE:NIGHT_CREATURE_70:PANCREAS +!CREATURE:NIGHT_CREATURE_70:SPLEEN +!CREATURE:NIGHT_CREATURE_70:KIDNEY +!CREATURE:NIGHT_CREATURE_71:MUSCLE +CREATURE:NIGHT_CREATURE_71:EYE + CREATURE:NIGHT_CREATURE_71:BRAIN +CREATURE:NIGHT_CREATURE_71:LUNG + CREATURE:NIGHT_CREATURE_71:HEART + CREATURE:NIGHT_CREATURE_71:LIVER +CREATURE:NIGHT_CREATURE_71:GUT +"CREATURE:NIGHT_CREATURE_71:STOMACH +"CREATURE:NIGHT_CREATURE_71:GIZZARD +#CREATURE:NIGHT_CREATURE_71:PANCREAS +!CREATURE:NIGHT_CREATURE_71:SPLEEN +!CREATURE:NIGHT_CREATURE_71:KIDNEY +!CREATURE:NIGHT_CREATURE_72:MUSCLE +CREATURE:NIGHT_CREATURE_72:EYE + CREATURE:NIGHT_CREATURE_72:BRAIN +CREATURE:NIGHT_CREATURE_72:LUNG + CREATURE:NIGHT_CREATURE_72:HEART + CREATURE:NIGHT_CREATURE_72:LIVER +CREATURE:NIGHT_CREATURE_72:GUT +"CREATURE:NIGHT_CREATURE_72:STOMACH +"CREATURE:NIGHT_CREATURE_72:GIZZARD +#CREATURE:NIGHT_CREATURE_72:PANCREAS +!CREATURE:NIGHT_CREATURE_72:SPLEEN +!CREATURE:NIGHT_CREATURE_72:KIDNEY +!CREATURE:NIGHT_CREATURE_73:MUSCLE +CREATURE:NIGHT_CREATURE_73:EYE + CREATURE:NIGHT_CREATURE_73:BRAIN +CREATURE:NIGHT_CREATURE_73:LUNG + CREATURE:NIGHT_CREATURE_73:HEART + CREATURE:NIGHT_CREATURE_73:LIVER +CREATURE:NIGHT_CREATURE_73:GUT +"CREATURE:NIGHT_CREATURE_73:STOMACH +"CREATURE:NIGHT_CREATURE_73:GIZZARD +#CREATURE:NIGHT_CREATURE_73:PANCREAS +!CREATURE:NIGHT_CREATURE_73:SPLEEN +!CREATURE:NIGHT_CREATURE_73:KIDNEY +!CREATURE:NIGHT_CREATURE_74:MUSCLE +CREATURE:NIGHT_CREATURE_74:EYE + CREATURE:NIGHT_CREATURE_74:BRAIN +CREATURE:NIGHT_CREATURE_74:LUNG + CREATURE:NIGHT_CREATURE_74:HEART + CREATURE:NIGHT_CREATURE_74:LIVER +CREATURE:NIGHT_CREATURE_74:GUT +"CREATURE:NIGHT_CREATURE_74:STOMACH +"CREATURE:NIGHT_CREATURE_74:GIZZARD +#CREATURE:NIGHT_CREATURE_74:PANCREAS +!CREATURE:NIGHT_CREATURE_74:SPLEEN +!CREATURE:NIGHT_CREATURE_74:KIDNEY +!CREATURE:NIGHT_CREATURE_75:MUSCLE +CREATURE:NIGHT_CREATURE_75:EYE + CREATURE:NIGHT_CREATURE_75:BRAIN +CREATURE:NIGHT_CREATURE_75:LUNG + CREATURE:NIGHT_CREATURE_75:HEART + CREATURE:NIGHT_CREATURE_75:LIVER +CREATURE:NIGHT_CREATURE_75:GUT +"CREATURE:NIGHT_CREATURE_75:STOMACH +"CREATURE:NIGHT_CREATURE_75:GIZZARD +#CREATURE:NIGHT_CREATURE_75:PANCREAS +!CREATURE:NIGHT_CREATURE_75:SPLEEN +!CREATURE:NIGHT_CREATURE_75:KIDNEY +!CREATURE:NIGHT_CREATURE_76:MUSCLE +CREATURE:NIGHT_CREATURE_76:EYE + CREATURE:NIGHT_CREATURE_76:BRAIN +CREATURE:NIGHT_CREATURE_76:LUNG + CREATURE:NIGHT_CREATURE_76:HEART + CREATURE:NIGHT_CREATURE_76:LIVER +CREATURE:NIGHT_CREATURE_76:GUT +"CREATURE:NIGHT_CREATURE_76:STOMACH +"CREATURE:NIGHT_CREATURE_76:GIZZARD +#CREATURE:NIGHT_CREATURE_76:PANCREAS +!CREATURE:NIGHT_CREATURE_76:SPLEEN +!CREATURE:NIGHT_CREATURE_76:KIDNEY +!CREATURE:NIGHT_CREATURE_77:MUSCLE +CREATURE:NIGHT_CREATURE_77:EYE + CREATURE:NIGHT_CREATURE_77:BRAIN +CREATURE:NIGHT_CREATURE_77:LUNG + CREATURE:NIGHT_CREATURE_77:HEART + CREATURE:NIGHT_CREATURE_77:LIVER +CREATURE:NIGHT_CREATURE_77:GUT +"CREATURE:NIGHT_CREATURE_77:STOMACH +"CREATURE:NIGHT_CREATURE_77:GIZZARD +#CREATURE:NIGHT_CREATURE_77:PANCREAS +!CREATURE:NIGHT_CREATURE_77:SPLEEN +!CREATURE:NIGHT_CREATURE_77:KIDNEY +!CREATURE:NIGHT_CREATURE_78:MUSCLE +CREATURE:NIGHT_CREATURE_78:EYE + CREATURE:NIGHT_CREATURE_78:BRAIN +CREATURE:NIGHT_CREATURE_78:LUNG + CREATURE:NIGHT_CREATURE_78:HEART + CREATURE:NIGHT_CREATURE_78:LIVER +CREATURE:NIGHT_CREATURE_78:GUT +"CREATURE:NIGHT_CREATURE_78:STOMACH +"CREATURE:NIGHT_CREATURE_78:GIZZARD +#CREATURE:NIGHT_CREATURE_78:PANCREAS +!CREATURE:NIGHT_CREATURE_78:SPLEEN +!CREATURE:NIGHT_CREATURE_78:KIDNEY +!CREATURE:NIGHT_CREATURE_79:MUSCLE +CREATURE:NIGHT_CREATURE_79:EYE + CREATURE:NIGHT_CREATURE_79:BRAIN +CREATURE:NIGHT_CREATURE_79:LUNG + CREATURE:NIGHT_CREATURE_79:HEART + CREATURE:NIGHT_CREATURE_79:LIVER +CREATURE:NIGHT_CREATURE_79:GUT +"CREATURE:NIGHT_CREATURE_79:STOMACH +"CREATURE:NIGHT_CREATURE_79:GIZZARD +#CREATURE:NIGHT_CREATURE_79:PANCREAS +!CREATURE:NIGHT_CREATURE_79:SPLEEN +!CREATURE:NIGHT_CREATURE_79:KIDNEY +!CREATURE:NIGHT_CREATURE_80:MUSCLE +CREATURE:NIGHT_CREATURE_80:EYE + CREATURE:NIGHT_CREATURE_80:BRAIN +CREATURE:NIGHT_CREATURE_80:LUNG + CREATURE:NIGHT_CREATURE_80:HEART + CREATURE:NIGHT_CREATURE_80:LIVER +CREATURE:NIGHT_CREATURE_80:GUT +"CREATURE:NIGHT_CREATURE_80:STOMACH +"CREATURE:NIGHT_CREATURE_80:GIZZARD +#CREATURE:NIGHT_CREATURE_80:PANCREAS +!CREATURE:NIGHT_CREATURE_80:SPLEEN +!CREATURE:NIGHT_CREATURE_80:KIDNEY +!CREATURE:NIGHT_CREATURE_81:MUSCLE +CREATURE:NIGHT_CREATURE_81:EYE + CREATURE:NIGHT_CREATURE_81:BRAIN +CREATURE:NIGHT_CREATURE_81:LUNG + CREATURE:NIGHT_CREATURE_81:HEART + CREATURE:NIGHT_CREATURE_81:LIVER +CREATURE:NIGHT_CREATURE_81:GUT +"CREATURE:NIGHT_CREATURE_81:STOMACH +"CREATURE:NIGHT_CREATURE_81:GIZZARD +#CREATURE:NIGHT_CREATURE_81:PANCREAS +!CREATURE:NIGHT_CREATURE_81:SPLEEN +!CREATURE:NIGHT_CREATURE_81:KIDNEY +!CREATURE:NIGHT_CREATURE_82:MUSCLE +CREATURE:NIGHT_CREATURE_82:EYE + CREATURE:NIGHT_CREATURE_82:BRAIN +CREATURE:NIGHT_CREATURE_82:LUNG + CREATURE:NIGHT_CREATURE_82:HEART + CREATURE:NIGHT_CREATURE_82:LIVER +CREATURE:NIGHT_CREATURE_82:GUT +"CREATURE:NIGHT_CREATURE_82:STOMACH +"CREATURE:NIGHT_CREATURE_82:GIZZARD +#CREATURE:NIGHT_CREATURE_82:PANCREAS +!CREATURE:NIGHT_CREATURE_82:SPLEEN +!CREATURE:NIGHT_CREATURE_82:KIDNEY +!CREATURE:NIGHT_CREATURE_83:MUSCLE +CREATURE:NIGHT_CREATURE_83:EYE + CREATURE:NIGHT_CREATURE_83:BRAIN +CREATURE:NIGHT_CREATURE_83:LUNG + CREATURE:NIGHT_CREATURE_83:HEART + CREATURE:NIGHT_CREATURE_83:LIVER +CREATURE:NIGHT_CREATURE_83:GUT +"CREATURE:NIGHT_CREATURE_83:STOMACH +"CREATURE:NIGHT_CREATURE_83:GIZZARD +#CREATURE:NIGHT_CREATURE_83:PANCREAS +!CREATURE:NIGHT_CREATURE_83:SPLEEN +!CREATURE:NIGHT_CREATURE_83:KIDNEY +!CREATURE:NIGHT_CREATURE_84:MUSCLE +CREATURE:NIGHT_CREATURE_84:EYE + CREATURE:NIGHT_CREATURE_84:BRAIN +CREATURE:NIGHT_CREATURE_84:LUNG + CREATURE:NIGHT_CREATURE_84:HEART + CREATURE:NIGHT_CREATURE_84:LIVER +CREATURE:NIGHT_CREATURE_84:GUT +"CREATURE:NIGHT_CREATURE_84:STOMACH +"CREATURE:NIGHT_CREATURE_84:GIZZARD +#CREATURE:NIGHT_CREATURE_84:PANCREAS +!CREATURE:NIGHT_CREATURE_84:SPLEEN +!CREATURE:NIGHT_CREATURE_84:KIDNEY +!CREATURE:NIGHT_CREATURE_85:MUSCLE +CREATURE:NIGHT_CREATURE_85:EYE + CREATURE:NIGHT_CREATURE_85:BRAIN +CREATURE:NIGHT_CREATURE_85:LUNG + CREATURE:NIGHT_CREATURE_85:HEART + CREATURE:NIGHT_CREATURE_85:LIVER +CREATURE:NIGHT_CREATURE_85:GUT +"CREATURE:NIGHT_CREATURE_85:STOMACH +"CREATURE:NIGHT_CREATURE_85:GIZZARD +#CREATURE:NIGHT_CREATURE_85:PANCREAS +!CREATURE:NIGHT_CREATURE_85:SPLEEN +!CREATURE:NIGHT_CREATURE_85:KIDNEY +!CREATURE:NIGHT_CREATURE_86:MUSCLE +CREATURE:NIGHT_CREATURE_86:EYE + CREATURE:NIGHT_CREATURE_86:BRAIN +CREATURE:NIGHT_CREATURE_86:LUNG + CREATURE:NIGHT_CREATURE_86:HEART + CREATURE:NIGHT_CREATURE_86:LIVER +CREATURE:NIGHT_CREATURE_86:GUT +"CREATURE:NIGHT_CREATURE_86:STOMACH +"CREATURE:NIGHT_CREATURE_86:GIZZARD +#CREATURE:NIGHT_CREATURE_86:PANCREAS +!CREATURE:NIGHT_CREATURE_86:SPLEEN +!CREATURE:NIGHT_CREATURE_86:KIDNEY +!CREATURE:NIGHT_CREATURE_87:MUSCLE +CREATURE:NIGHT_CREATURE_87:EYE + CREATURE:NIGHT_CREATURE_87:BRAIN +CREATURE:NIGHT_CREATURE_87:LUNG + CREATURE:NIGHT_CREATURE_87:HEART + CREATURE:NIGHT_CREATURE_87:LIVER +CREATURE:NIGHT_CREATURE_87:GUT +"CREATURE:NIGHT_CREATURE_87:STOMACH +"CREATURE:NIGHT_CREATURE_87:GIZZARD +#CREATURE:NIGHT_CREATURE_87:PANCREAS +!CREATURE:NIGHT_CREATURE_87:SPLEEN +!CREATURE:NIGHT_CREATURE_87:KIDNEY +!CREATURE:NIGHT_CREATURE_88:MUSCLE +CREATURE:NIGHT_CREATURE_88:EYE + CREATURE:NIGHT_CREATURE_88:BRAIN +CREATURE:NIGHT_CREATURE_88:LUNG + CREATURE:NIGHT_CREATURE_88:HEART + CREATURE:NIGHT_CREATURE_88:LIVER +CREATURE:NIGHT_CREATURE_88:GUT +"CREATURE:NIGHT_CREATURE_88:STOMACH +"CREATURE:NIGHT_CREATURE_88:GIZZARD +#CREATURE:NIGHT_CREATURE_88:PANCREAS +!CREATURE:NIGHT_CREATURE_88:SPLEEN +!CREATURE:NIGHT_CREATURE_88:KIDNEY +!CREATURE:NIGHT_CREATURE_89:MUSCLE +CREATURE:NIGHT_CREATURE_89:EYE + CREATURE:NIGHT_CREATURE_89:BRAIN +CREATURE:NIGHT_CREATURE_89:LUNG + CREATURE:NIGHT_CREATURE_89:HEART + CREATURE:NIGHT_CREATURE_89:LIVER +CREATURE:NIGHT_CREATURE_89:GUT +"CREATURE:NIGHT_CREATURE_89:STOMACH +"CREATURE:NIGHT_CREATURE_89:GIZZARD +#CREATURE:NIGHT_CREATURE_89:PANCREAS +!CREATURE:NIGHT_CREATURE_89:SPLEEN +!CREATURE:NIGHT_CREATURE_89:KIDNEY +!CREATURE:NIGHT_CREATURE_90:MUSCLE +CREATURE:NIGHT_CREATURE_90:EYE + CREATURE:NIGHT_CREATURE_90:BRAIN +CREATURE:NIGHT_CREATURE_90:LUNG + CREATURE:NIGHT_CREATURE_90:HEART + CREATURE:NIGHT_CREATURE_90:LIVER +CREATURE:NIGHT_CREATURE_90:GUT +"CREATURE:NIGHT_CREATURE_90:STOMACH +"CREATURE:NIGHT_CREATURE_90:GIZZARD +#CREATURE:NIGHT_CREATURE_90:PANCREAS +!CREATURE:NIGHT_CREATURE_90:SPLEEN +!CREATURE:NIGHT_CREATURE_90:KIDNEY +!CREATURE:NIGHT_CREATURE_91:MUSCLE +CREATURE:NIGHT_CREATURE_91:EYE + CREATURE:NIGHT_CREATURE_91:BRAIN +CREATURE:NIGHT_CREATURE_91:LUNG + CREATURE:NIGHT_CREATURE_91:HEART + CREATURE:NIGHT_CREATURE_91:LIVER +CREATURE:NIGHT_CREATURE_91:GUT +"CREATURE:NIGHT_CREATURE_91:STOMACH +"CREATURE:NIGHT_CREATURE_91:GIZZARD +#CREATURE:NIGHT_CREATURE_91:PANCREAS +!CREATURE:NIGHT_CREATURE_91:SPLEEN +!CREATURE:NIGHT_CREATURE_91:KIDNEY +!CREATURE:NIGHT_CREATURE_92:MUSCLE +CREATURE:NIGHT_CREATURE_92:EYE + CREATURE:NIGHT_CREATURE_92:BRAIN +CREATURE:NIGHT_CREATURE_92:LUNG + CREATURE:NIGHT_CREATURE_92:HEART + CREATURE:NIGHT_CREATURE_92:LIVER +CREATURE:NIGHT_CREATURE_92:GUT +"CREATURE:NIGHT_CREATURE_92:STOMACH +"CREATURE:NIGHT_CREATURE_92:GIZZARD +#CREATURE:NIGHT_CREATURE_92:PANCREAS +!CREATURE:NIGHT_CREATURE_92:SPLEEN +!CREATURE:NIGHT_CREATURE_92:KIDNEY +!CREATURE:NIGHT_CREATURE_93:MUSCLE +CREATURE:NIGHT_CREATURE_93:EYE + CREATURE:NIGHT_CREATURE_93:BRAIN +CREATURE:NIGHT_CREATURE_93:LUNG + CREATURE:NIGHT_CREATURE_93:HEART + CREATURE:NIGHT_CREATURE_93:LIVER +CREATURE:NIGHT_CREATURE_93:GUT +"CREATURE:NIGHT_CREATURE_93:STOMACH +"CREATURE:NIGHT_CREATURE_93:GIZZARD +#CREATURE:NIGHT_CREATURE_93:PANCREAS +!CREATURE:NIGHT_CREATURE_93:SPLEEN +!CREATURE:NIGHT_CREATURE_93:KIDNEY +!CREATURE:NIGHT_CREATURE_94:MUSCLE +CREATURE:NIGHT_CREATURE_94:EYE + CREATURE:NIGHT_CREATURE_94:BRAIN +CREATURE:NIGHT_CREATURE_94:LUNG + CREATURE:NIGHT_CREATURE_94:HEART + CREATURE:NIGHT_CREATURE_94:LIVER +CREATURE:NIGHT_CREATURE_94:GUT +"CREATURE:NIGHT_CREATURE_94:STOMACH +"CREATURE:NIGHT_CREATURE_94:GIZZARD +#CREATURE:NIGHT_CREATURE_94:PANCREAS +!CREATURE:NIGHT_CREATURE_94:SPLEEN +!CREATURE:NIGHT_CREATURE_94:KIDNEY +!CREATURE:NIGHT_CREATURE_95:MUSCLE +CREATURE:NIGHT_CREATURE_95:EYE + CREATURE:NIGHT_CREATURE_95:BRAIN +CREATURE:NIGHT_CREATURE_95:LUNG + CREATURE:NIGHT_CREATURE_95:HEART + CREATURE:NIGHT_CREATURE_95:LIVER +CREATURE:NIGHT_CREATURE_95:GUT +"CREATURE:NIGHT_CREATURE_95:STOMACH +"CREATURE:NIGHT_CREATURE_95:GIZZARD +#CREATURE:NIGHT_CREATURE_95:PANCREAS +!CREATURE:NIGHT_CREATURE_95:SPLEEN +!CREATURE:NIGHT_CREATURE_95:KIDNEY +!CREATURE:NIGHT_CREATURE_96:MUSCLE +CREATURE:NIGHT_CREATURE_96:EYE + CREATURE:NIGHT_CREATURE_96:BRAIN +CREATURE:NIGHT_CREATURE_96:LUNG + CREATURE:NIGHT_CREATURE_96:HEART + CREATURE:NIGHT_CREATURE_96:LIVER +CREATURE:NIGHT_CREATURE_96:GUT +"CREATURE:NIGHT_CREATURE_96:STOMACH +"CREATURE:NIGHT_CREATURE_96:GIZZARD +#CREATURE:NIGHT_CREATURE_96:PANCREAS +!CREATURE:NIGHT_CREATURE_96:SPLEEN +!CREATURE:NIGHT_CREATURE_96:KIDNEY +!CREATURE:NIGHT_CREATURE_97:MUSCLE +CREATURE:NIGHT_CREATURE_97:EYE + CREATURE:NIGHT_CREATURE_97:BRAIN +CREATURE:NIGHT_CREATURE_97:LUNG + CREATURE:NIGHT_CREATURE_97:HEART + CREATURE:NIGHT_CREATURE_97:LIVER +CREATURE:NIGHT_CREATURE_97:GUT +"CREATURE:NIGHT_CREATURE_97:STOMACH +"CREATURE:NIGHT_CREATURE_97:GIZZARD +#CREATURE:NIGHT_CREATURE_97:PANCREAS +!CREATURE:NIGHT_CREATURE_97:SPLEEN +!CREATURE:NIGHT_CREATURE_97:KIDNEY +!CREATURE:NIGHT_CREATURE_98:MUSCLE +CREATURE:NIGHT_CREATURE_98:EYE + CREATURE:NIGHT_CREATURE_98:BRAIN +CREATURE:NIGHT_CREATURE_98:LUNG + CREATURE:NIGHT_CREATURE_98:HEART + CREATURE:NIGHT_CREATURE_98:LIVER +CREATURE:NIGHT_CREATURE_98:GUT +"CREATURE:NIGHT_CREATURE_98:STOMACH +"CREATURE:NIGHT_CREATURE_98:GIZZARD +#CREATURE:NIGHT_CREATURE_98:PANCREAS +!CREATURE:NIGHT_CREATURE_98:SPLEEN +!CREATURE:NIGHT_CREATURE_98:KIDNEY +!CREATURE:NIGHT_CREATURE_99:MUSCLE +CREATURE:NIGHT_CREATURE_99:EYE + CREATURE:NIGHT_CREATURE_99:BRAIN +CREATURE:NIGHT_CREATURE_99:LUNG + CREATURE:NIGHT_CREATURE_99:HEART + CREATURE:NIGHT_CREATURE_99:LIVER +CREATURE:NIGHT_CREATURE_99:GUT +"CREATURE:NIGHT_CREATURE_99:STOMACH +"CREATURE:NIGHT_CREATURE_99:GIZZARD +#CREATURE:NIGHT_CREATURE_99:PANCREAS +!CREATURE:NIGHT_CREATURE_99:SPLEEN +!CREATURE:NIGHT_CREATURE_99:KIDNEY +"CREATURE:NIGHT_CREATURE_100:MUSCLE +CREATURE:NIGHT_CREATURE_100:EYE +!CREATURE:NIGHT_CREATURE_100:BRAIN + CREATURE:NIGHT_CREATURE_100:LUNG +!CREATURE:NIGHT_CREATURE_100:HEART +!CREATURE:NIGHT_CREATURE_100:LIVER +CREATURE:NIGHT_CREATURE_100:GUT +#CREATURE:NIGHT_CREATURE_100:STOMACH +#CREATURE:NIGHT_CREATURE_100:GIZZARD +$CREATURE:NIGHT_CREATURE_100:PANCREAS +"CREATURE:NIGHT_CREATURE_100:SPLEEN +"CREATURE:NIGHT_CREATURE_100:KIDNEY +"CREATURE:NIGHT_CREATURE_101:MUSCLE +CREATURE:NIGHT_CREATURE_101:EYE +!CREATURE:NIGHT_CREATURE_101:BRAIN + CREATURE:NIGHT_CREATURE_101:LUNG +!CREATURE:NIGHT_CREATURE_101:HEART +!CREATURE:NIGHT_CREATURE_101:LIVER +CREATURE:NIGHT_CREATURE_101:GUT +#CREATURE:NIGHT_CREATURE_101:STOMACH +#CREATURE:NIGHT_CREATURE_101:GIZZARD +$CREATURE:NIGHT_CREATURE_101:PANCREAS +"CREATURE:NIGHT_CREATURE_101:SPLEEN +"CREATURE:NIGHT_CREATURE_101:KIDNEY +"CREATURE:NIGHT_CREATURE_102:MUSCLE +CREATURE:NIGHT_CREATURE_102:EYE +!CREATURE:NIGHT_CREATURE_102:BRAIN + CREATURE:NIGHT_CREATURE_102:LUNG +!CREATURE:NIGHT_CREATURE_102:HEART +!CREATURE:NIGHT_CREATURE_102:LIVER +CREATURE:NIGHT_CREATURE_102:GUT +#CREATURE:NIGHT_CREATURE_102:STOMACH +#CREATURE:NIGHT_CREATURE_102:GIZZARD +$CREATURE:NIGHT_CREATURE_102:PANCREAS +"CREATURE:NIGHT_CREATURE_102:SPLEEN +"CREATURE:NIGHT_CREATURE_102:KIDNEY +"CREATURE:NIGHT_CREATURE_103:MUSCLE +CREATURE:NIGHT_CREATURE_103:EYE +!CREATURE:NIGHT_CREATURE_103:BRAIN + CREATURE:NIGHT_CREATURE_103:LUNG +!CREATURE:NIGHT_CREATURE_103:HEART +!CREATURE:NIGHT_CREATURE_103:LIVER +CREATURE:NIGHT_CREATURE_103:GUT +#CREATURE:NIGHT_CREATURE_103:STOMACH +#CREATURE:NIGHT_CREATURE_103:GIZZARD +$CREATURE:NIGHT_CREATURE_103:PANCREAS +"CREATURE:NIGHT_CREATURE_103:SPLEEN +"CREATURE:NIGHT_CREATURE_103:KIDNEY +"CREATURE:NIGHT_CREATURE_104:MUSCLE +CREATURE:NIGHT_CREATURE_104:EYE +!CREATURE:NIGHT_CREATURE_104:BRAIN + CREATURE:NIGHT_CREATURE_104:LUNG +!CREATURE:NIGHT_CREATURE_104:HEART +!CREATURE:NIGHT_CREATURE_104:LIVER +CREATURE:NIGHT_CREATURE_104:GUT +#CREATURE:NIGHT_CREATURE_104:STOMACH +#CREATURE:NIGHT_CREATURE_104:GIZZARD +$CREATURE:NIGHT_CREATURE_104:PANCREAS +"CREATURE:NIGHT_CREATURE_104:SPLEEN +"CREATURE:NIGHT_CREATURE_104:KIDNEY +CREATURE:HF1248 DIVINE_1:MUSCLE +CREATURE:HF1248 DIVINE_1:EYE +CREATURE:HF1248 DIVINE_1:BRAIN +CREATURE:HF1248 DIVINE_1:LUNG +CREATURE:HF1248 DIVINE_1:HEART +CREATURE:HF1248 DIVINE_1:LIVER +CREATURE:HF1248 DIVINE_1:GUT + CREATURE:HF1248 DIVINE_1:STOMACH + CREATURE:HF1248 DIVINE_1:GIZZARD +!CREATURE:HF1248 DIVINE_1:PANCREAS +CREATURE:HF1248 DIVINE_1:SPLEEN +CREATURE:HF1248 DIVINE_1:KIDNEY +CREATURE:HF1248 DIVINE_2:MUSCLE +CREATURE:HF1248 DIVINE_2:EYE +CREATURE:HF1248 DIVINE_2:BRAIN +CREATURE:HF1248 DIVINE_2:LUNG +CREATURE:HF1248 DIVINE_2:HEART +CREATURE:HF1248 DIVINE_2:LIVER +CREATURE:HF1248 DIVINE_2:GUT + CREATURE:HF1248 DIVINE_2:STOMACH + CREATURE:HF1248 DIVINE_2:GIZZARD +!CREATURE:HF1248 DIVINE_2:PANCREAS +CREATURE:HF1248 DIVINE_2:SPLEEN +CREATURE:HF1248 DIVINE_2:KIDNEY +CREATURE:HF1248 DIVINE_3:MUSCLE +CREATURE:HF1248 DIVINE_3:EYE +CREATURE:HF1248 DIVINE_3:BRAIN +CREATURE:HF1248 DIVINE_3:LUNG +CREATURE:HF1248 DIVINE_3:HEART +CREATURE:HF1248 DIVINE_3:LIVER +CREATURE:HF1248 DIVINE_3:GUT + CREATURE:HF1248 DIVINE_3:STOMACH + CREATURE:HF1248 DIVINE_3:GIZZARD +!CREATURE:HF1248 DIVINE_3:PANCREAS +CREATURE:HF1248 DIVINE_3:SPLEEN +CREATURE:HF1248 DIVINE_3:KIDNEY +CREATURE:HF1108 DIVINE_2:MUSCLE +CREATURE:HF1108 DIVINE_2:EYE +CREATURE:HF1108 DIVINE_2:BRAIN +CREATURE:HF1108 DIVINE_2:LUNG +CREATURE:HF1108 DIVINE_2:HEART +CREATURE:HF1108 DIVINE_2:LIVER +CREATURE:HF1108 DIVINE_2:GUT + CREATURE:HF1108 DIVINE_2:STOMACH + CREATURE:HF1108 DIVINE_2:GIZZARD +!CREATURE:HF1108 DIVINE_2:PANCREAS +CREATURE:HF1108 DIVINE_2:SPLEEN +CREATURE:HF1108 DIVINE_2:KIDNEY +CREATURE:HF1249 DIVINE_1:MUSCLE +CREATURE:HF1249 DIVINE_1:EYE +CREATURE:HF1249 DIVINE_1:BRAIN +CREATURE:HF1249 DIVINE_1:LUNG +CREATURE:HF1249 DIVINE_1:HEART +CREATURE:HF1249 DIVINE_1:LIVER +CREATURE:HF1249 DIVINE_1:GUT + CREATURE:HF1249 DIVINE_1:STOMACH + CREATURE:HF1249 DIVINE_1:GIZZARD +!CREATURE:HF1249 DIVINE_1:PANCREAS +CREATURE:HF1249 DIVINE_1:SPLEEN +CREATURE:HF1249 DIVINE_1:KIDNEY +CREATURE:HF1249 DIVINE_3:MUSCLE +CREATURE:HF1249 DIVINE_3:EYE +CREATURE:HF1249 DIVINE_3:BRAIN +CREATURE:HF1249 DIVINE_3:LUNG +CREATURE:HF1249 DIVINE_3:HEART +CREATURE:HF1249 DIVINE_3:LIVER +CREATURE:HF1249 DIVINE_3:GUT + CREATURE:HF1249 DIVINE_3:STOMACH + CREATURE:HF1249 DIVINE_3:GIZZARD +!CREATURE:HF1249 DIVINE_3:PANCREAS +CREATURE:HF1249 DIVINE_3:SPLEEN +CREATURE:HF1249 DIVINE_3:KIDNEY +CREATURE:HF1345 DIVINE_3:MUSCLE +CREATURE:HF1345 DIVINE_3:EYE +CREATURE:HF1345 DIVINE_3:BRAIN +CREATURE:HF1345 DIVINE_3:LUNG +CREATURE:HF1345 DIVINE_3:HEART +CREATURE:HF1345 DIVINE_3:LIVER +CREATURE:HF1345 DIVINE_3:GUT + CREATURE:HF1345 DIVINE_3:STOMACH + CREATURE:HF1345 DIVINE_3:GIZZARD +!CREATURE:HF1345 DIVINE_3:PANCREAS +CREATURE:HF1345 DIVINE_3:SPLEEN +CREATURE:HF1345 DIVINE_3:KIDNEYCUTTLEFISH:FEMALECUTTLEFISH:MALENAUTILUS:FEMALE NAUTILUS:MALEMOGHOPPER:FEMALEMOGHOPPER:MALEPOND_TURTLE:FEMALEPOND_TURTLE:MALEMUSSEL:DEFAULTOYSTER:DEFAULTFISH_SALMON:FEMALEFISH_SALMON:MALEFISH_CLOWNFISH:FEMALEFISH_CLOWNFISH:MALEFISH_HAGFISH:FEMALEFISH_HAGFISH:MALEFISH_LAMPREY_BROOK:FEMALEFISH_LAMPREY_BROOK:MALEFISH_RAY_BAT:FEMALEFISH_RAY_BAT:MALEFISH_RAY_THORNBACK:FEMALEFISH_RAY_THORNBACK:MALEFISH_RATFISH_SPOTTED:FEMALEFISH_RATFISH_SPOTTED:MALEFISH_HERRING:FEMALEFISH_HERRING:MALEFISH_SHAD:FEMALEFISH_SHAD:MALEFISH_ANCHOVY:FEMALEFISH_ANCHOVY:MALEFISH_TROUT_STEELHEAD:FEMALEFISH_TROUT_STEELHEAD:MALEFISH_HAKE:FEMALEFISH_HAKE:MALEFISH_SEAHORSE:FEMALEFISH_SEAHORSE:MALEFISH_GLASSEYE:FEMALEFISH_GLASSEYE:MALE FISH_PUFFER_WHITE_SPOTTED:FEMALEFISH_PUFFER_WHITE_SPOTTED:MALEFISH_SOLE:FEMALEFISH_SOLE:MALEFISH_FLOUNDER:FEMALEFISH_FLOUNDER:MALEFISH_MACKEREL:FEMALEFISH_MACKEREL:MALEJELLYFISH_SEA_NETTLE:DEFAULT SQUID:FEMALE +SQUID:MALEFISH_LUNGFISH:FEMALEFISH_LUNGFISH:MALEFISH_LOACH_CLOWN:FEMALEFISH_LOACH_CLOWN:MALEFISH_BULLHEAD_BROWN:FEMALEFISH_BULLHEAD_BROWN:MALEFISH_BULLHEAD_YELLOW:FEMALEFISH_BULLHEAD_YELLOW:MALEFISH_BULLHEAD_BLACK:FEMALEFISH_BULLHEAD_BLACK:MALEFISH_KNIFEFISH_BANDED:FEMALEFISH_KNIFEFISH_BANDED:MALEFISH_CHAR:FEMALEFISH_CHAR:MALEFISH_TROUT_RAINBOW:FEMALEFISH_TROUT_RAINBOW:MALEFISH_MOLLY_SAILFIN:FEMALEFISH_MOLLY_SAILFIN:MALEFISH_GUPPY:FEMALEFISH_GUPPY:MALEFISH_PERCH:FEMALEFISH_PERCH:MALEFISH_CAVE:FEMALEFISH_CAVE:MALELOBSTER_CAVE:FEMALELOBSTER_CAVE:MALEBIRD_BLUEJAY:FEMALEBLUEJAY_MAN:FEMALEGIANT_BLUEJAY:FEMALEBIRD_CARDINAL:FEMALECARDINAL_MAN:FEMALEGIANT_CARDINAL:FEMALEBIRD_GRACKLE:FEMALEGRACKLE_MAN:FEMALEGIANT_GRACKLE:FEMALEBIRD_ORIOLE:FEMALEORIOLE_MAN:FEMALEGIANT_ORIOLE:FEMALEBIRD_RW_BLACKBIRD:FEMALERW_BLACKBIRD_MAN:FEMALEGIANT_RW_BLACKBIRD:FEMALEBIRD_PENGUIN:FEMALEBIRD_PENGUIN_LITTLE:FEMALEBIRD_PENGUIN_EMPEROR:FEMALEPENGUIN MAN:FEMALEBIRD_PENGUIN_GIANT:FEMALEBIRD_FALCON_PEREGRINE:FEMALEPEREGRINE FALCON MAN:FEMALEGIANT PEREGRINE FALCON:FEMALEBIRD_KIWI:FEMALEKIWI MAN:FEMALEBIRD_KIWI_GIANT:FEMALEBIRD_OSTRICH:FEMALEOSTRICH MAN:FEMALEBIRD_OSTRICH_GIANT:FEMALEBIRD_CROW:FEMALECROW_MAN:FEMALEGIANT_CROW:FEMALEBIRD_RAVEN:FEMALERAVEN_MAN:FEMALEGIANT_RAVEN:FEMALEBIRD_CASSOWARY:FEMALECASSOWARY_MAN:FEMALEGIANT_CASSOWARY:FEMALEBIRD_KEA:FEMALEKEA_MAN:FEMALEGIANT_KEA:FEMALEBIRD_OWL_SNOWY:FEMALESNOWY_OWL_MAN:FEMALEGIANT_SNOWY_OWL:FEMALESPARROW:FEMALESPARROW_MAN:FEMALEGIANT_SPARROW:FEMALEBIRD_STORK_WHITE:FEMALEWHITE_STORK_MAN:FEMALEGIANT_WHITE_STORK:FEMALEBIRD_LOON:FEMALELOON_MAN:FEMALEGIANT_LOON:FEMALEBIRD_OWL_BARN:FEMALEBARN_OWL_MAN:FEMALEGIANT_BARN_OWL:FEMALEBIRD_PARAKEET:FEMALEPARAKEET_MAN:FEMALEGIANT_PARAKEET:FEMALEBIRD_KAKAPO:FEMALEKAKAPO_MAN:FEMALEGIANT_KAKAPO:FEMALEBIRD_PARROT_GREY:FEMALEGREY_PARROT_MAN:FEMALEGIANT_GREY_PARROT:FEMALEBIRD_PUFFIN:FEMALEPUFFIN_MAN:FEMALEGIANT_PUFFIN:FEMALEBIRD_SWAN:FEMALESWAN_MAN:FEMALEGIANT_SWAN:FEMALEBIRD_LORIKEET:FEMALELORIKEET_MAN:FEMALEGIANT_LORIKEET:FEMALEBIRD_WREN:FEMALEWREN_MAN:FEMALEGIANT_WREN:FEMALEBIRD_OSPREY:FEMALEOSPREY_MAN:FEMALEGIANT_OSPREY:FEMALEBIRD_EMU:FEMALEEMU_MAN:FEMALEGIANT_EMU:FEMALEBIRD_COCKATIEL:FEMALECOCKATIEL_MAN:FEMALEGIANT_COCKATIEL:FEMALE BIRD_LOVEBIRD_PEACH-FACED:FEMALEPEACH-FACED_LOVEBIRD_MAN:FEMALE!GIANT_PEACH-FACED_LOVEBIRD:FEMALEBIRD_MAGPIE:FEMALEMAGPIE_MAN:FEMALEGIANT_MAGPIE:FEMALEBIRD_KESTREL:FEMALEKESTREL_MAN:FEMALEGIANT_KESTREL:FEMALEBIRD_ALBATROSS:FEMALEALBATROSS_MAN:FEMALEGIANT_ALBATROSS:FEMALEBIRD_OWL_GREAT_HORNED:FEMALEGREAT_HORNED_OWL_MAN:FEMALEGIANT_GREAT_HORNED_OWL:FEMALEBIRD_EAGLE:FEMALEEAGLE_MAN:FEMALEGIANT_EAGLE:FEMALEBIRD_HORNBILL:FEMALEHORNBILL_MAN:FEMALEGIANT_HORNBILL:FEMALEBIRD_LOVEBIRD_MASKED:FEMALEMASKED_LOVEBIRD_MAN:FEMALEGIANT_MASKED_LOVEBIRD:FEMALEBIRD_BUSHTIT:FEMALEBUSHTIT_MAN:FEMALEGIANT_BUSHTIT:FEMALEDESERT TORTOISE:FEMALEDESERT_TORTOISE_MAN:FEMALEGIANT_DESERT_TORTOISE:FEMALEGILA_MONSTER:FEMALEGILA_MONSTER_MAN:FEMALEGIANT_GILA_MONSTER:FEMALEBIRD_CHICKEN:FEMALEBIRD_DUCK:FEMALEBIRD_GOOSE:FEMALEBIRD_GUINEAFOWL:FEMALEBIRD_PEAFOWL_BLUE:FEMALEBIRD_TURKEY:FEMALEPLATYPUS:FEMALEPLATYPUS MAN:FEMALEPLATYPUS, GIANT:FEMALEALLIGATOR:FEMALEALLIGATOR_MAN:FEMALEGIANT_ALLIGATOR:FEMALEBIRD_BUZZARD:FEMALEBUZZARD_MAN:FEMALEGIANT_BUZZARD:FEMALECROCODILE_SALTWATER:FEMALECROCODILE_SALTWATER_MAN:FEMALE GIANT_CROCODILE_SALTWATER:FEMALEBIRD_VULTURE:FEMALEVULTURE_MAN:FEMALEGIANT_VULTURE:FEMALEGIANT TORTOISE:FEMALEGIANT TORTOISE MAN:FEMALEGIGANTIC TORTOISE:FEMALECRUNDLE:FEMALEELK_BIRD:FEMALEHELMET_SNAKE:FEMALEJABBERER:FEMALECAVE_DRAGON:FEMALELIZARD_RHINO_TWO_LEGGED:FEMALE SKINK:FEMALESKINK_MAN:FEMALEGIANT_SKINK:FEMALECHAMELEON:FEMALECHAMELEON_MAN:FEMALEGIANT_CHAMELEON:FEMALE ANOLE:FEMALEANOLE_MAN:FEMALEGIANT_ANOLE:FEMALE IGUANA:FEMALEIGUANA_MAN:FEMALEGIANT_IGUANA:FEMALESNAPPING TURTLE:FEMALE ALLIGATOR SNAPPING TURTLE:FEMALESNAPPING_TURTLE_MAN:FEMALEGIANT_SNAPPING_TURTLE:FEMALEPOND_TURTLE:FEMALEPOND_TURTLE_MAN:FEMALEGIANT_POND_TURTLE:FEMALE KOBOLD:FEMALE DRAGON:FEMALEBEAK_DOG:FEMALESEA_SERPENT:FEMALEBIRD_ROC:FEMALECROCODILE_CAVE:FEMALEBIRD_SWALLOW_CAVE:FEMALECAVE_SWALLOW_MAN:FEMALEBIRD_SWALLOW_CAVE_GIANT:FEMALEREPTILE_MAN:FEMALESERPENT_MAN:FEMALE ADDER:FEMALEADDER_MAN:FEMALEGIANT_ADDER:FEMALEECHIDNA:FEMALEECHIDNA_MAN:FEMALEGIANT_ECHIDNA:FEMALEKINGSNAKE:FEMALEKINGSNAKE_MAN:FEMALEGIANT_KINGSNAKE:FEMALEMONITOR_LIZARD:FEMALEMONITOR_LIZARD_MAN:FEMALEGIANT_MONITOR_LIZARD:FEMALEKING_COBRA:FEMALEKING_COBRA_MAN:FEMALEGIANT_KING_COBRA:FEMALEBLACK_MAMBA:FEMALEBLACK_MAMBA_MAN:FEMALEGIANT_BLACK_MAMBA:FEMALEBUSHMASTER:FEMALEBUSHMASTER_MAN:FEMALEGIANT_BUSHMASTER:FEMALE PYTHON:FEMALEPYTHON_MAN:FEMALEGIANT_PYTHON:FEMALENAGA:FEMALE_TWONAGA:FEMALE_FOURNAGA:FEMALE_SIX"#PLANT:SINGLE-GRAIN_WHEAT:STRUCTURAL" PLANT:TWO-GRAIN_WHEAT:STRUCTURAL"PLANT:SOFT_WHEAT:STRUCTURAL"PLANT:HARD_WHEAT:STRUCTURAL"PLANT:SPELT:STRUCTURAL"PLANT:BARLEY:STRUCTURAL"PLANT:BUCKWHEAT:STRUCTURAL"PLANT:OATS:STRUCTURAL"PLANT:ALFALFA:STRUCTURAL"PLANT:RYE:STRUCTURAL"PLANT:SORGHUM:STRUCTURAL"PLANT:RICE:STRUCTURAL"PLANT:MAIZE:STRUCTURAL"PLANT:QUINOA:STRUCTURAL"PLANT:KANIWA:STRUCTURAL"PLANT:BITTER_VETCH:STRUCTURAL"!PLANT:PENDANT_AMARANTH:STRUCTURAL"PLANT:BLOOD_AMARANTH:STRUCTURAL" PLANT:PURPLE_AMARANTH:STRUCTURAL"PLANT:RED_SPINACH:STRUCTURAL"'PLANT:ELEPHANT-HEAD_AMARANTH:STRUCTURAL"PLANT:PEARL_MILLET:STRUCTURAL"PLANT:WHITE_MILLET:STRUCTURAL"PLANT:FINGER_MILLET:STRUCTURAL"PLANT:FOXTAIL_MILLET:STRUCTURAL"PLANT:FONIO:STRUCTURAL"PLANT:TEFF:STRUCTURAL"PLANT:FLAX:STRUCTURAL"PLANT:JUTE:STRUCTURAL"PLANT:HEMP:STRUCTURAL"PLANT:COTTON:STRUCTURAL"PLANT:RAMIE:STRUCTURAL"PLANT:KENAF:STRUCTURAL"PLANT:PAPYRUS_SEDGE:STRUCTURAL"PLANT:ARTICHOKE:STRUCTURAL"PLANT:ASPARAGUS:STRUCTURAL""PLANT:BAMBARA_GROUNDNUT:STRUCTURAL"PLANT:STRING_BEAN:STRUCTURAL"PLANT:BROAD_BEAN:STRUCTURAL"PLANT:BEET:STRUCTURAL"PLANT:BITTER_MELON:STRUCTURAL"PLANT:CABBAGE:STRUCTURAL"PLANT:CAPER:STRUCTURAL"PLANT:WILD_CARROT:STRUCTURAL"PLANT:CASSAVA:STRUCTURAL"PLANT:CELERY:STRUCTURAL"PLANT:CHICKPEA:STRUCTURAL"PLANT:CHICORY:STRUCTURAL"PLANT:COWPEA:STRUCTURAL"PLANT:CUCUMBER:STRUCTURAL"PLANT:EGGPLANT:STRUCTURAL"PLANT:GARDEN_CRESS:STRUCTURAL"PLANT:GARLIC:STRUCTURAL"PLANT:HORNED_MELON:STRUCTURAL"PLANT:LEEK:STRUCTURAL"PLANT:LENTIL:STRUCTURAL"PLANT:LETTUCE:STRUCTURAL"PLANT:MUNG_BEAN:STRUCTURAL"PLANT:MUSKMELON:STRUCTURAL"PLANT:ONION:STRUCTURAL"PLANT:PARSNIP:STRUCTURAL"PLANT:PEA:STRUCTURAL"PLANT:PEANUT:STRUCTURAL"PLANT:PEPPER:STRUCTURAL"PLANT:POTATO:STRUCTURAL"PLANT:RADISH:STRUCTURAL"PLANT:RED_BEAN:STRUCTURAL"PLANT:RHUBARB:STRUCTURAL"PLANT:SOYBEAN:STRUCTURAL"PLANT:SPINACH:STRUCTURAL"PLANT:SQUASH:STRUCTURAL"PLANT:SWEET_POTATO:STRUCTURAL"PLANT:TARO:STRUCTURAL"PLANT:TOMATO:STRUCTURAL"PLANT:TOMATILLO:STRUCTURAL"PLANT:TURNIP:STRUCTURAL"PLANT:URAD_BEAN:STRUCTURAL"PLANT:WATERMELON:STRUCTURAL"PLANT:WINTER_MELON:STRUCTURAL"PLANT:LESSER_YAM:STRUCTURAL"PLANT:LONG_YAM:STRUCTURAL"PLANT:PURPLE_YAM:STRUCTURAL"PLANT:WHITE_YAM:STRUCTURAL"PLANT:PASSION_FRUIT:STRUCTURAL"PLANT:GRAPE:STRUCTURAL"PLANT:CRANBERRY:STRUCTURAL"PLANT:BILBERRY:STRUCTURAL"PLANT:BLUEBERRY:STRUCTURAL"PLANT:BLACKBERRY:STRUCTURAL"PLANT:RASPBERRY:STRUCTURAL"PLANT:PINEAPPLE:STRUCTURAL"PLANT:MEADOW-GRASS:STRUCTURAL"PLANT:HAIR GRASS:STRUCTURAL"PLANT:BENTGRASS:STRUCTURAL"PLANT:RYEGRASS:STRUCTURAL"PLANT:FESCUE GRASS:STRUCTURAL"PLANT:REEDGRASS:STRUCTURAL"PLANT:KNOTGRASS:STRUCTURAL"PLANT:ZOYSIA:STRUCTURAL""PLANT:DOG'S TOOTH GRASS:STRUCTURAL"PLANT:DALLISGRASS:STRUCTURAL"PLANT:CARPETGRASS:STRUCTURAL"PLANT:SATINTAIL:STRUCTURAL"PLANT:GRAMA:STRUCTURAL"PLANT:DROPSEED GRASS:STRUCTURAL"PLANT:NEEDLE GRASS:STRUCTURAL"$PLANT:BABY TOES SUCCULENT:STRUCTURAL"PLANT:PEBBLE PLANTS:STRUCTURAL"PLANT:BLUE SEDGE:STRUCTURAL"PLANT:FIELD SEDGE:STRUCTURAL""PLANT:PURPLE MOOR GRASS:STRUCTURAL"PLANT:VELVET GRASS:STRUCTURAL"PLANT:MEADOWSWEET:STRUCTURAL"PLANT:RUSH:STRUCTURAL"PLANT:MARSH THISTLE:STRUCTURAL"PLANT:COMMON REED:STRUCTURAL"PLANT:CATTAIL:STRUCTURAL"PLANT:SAWGRASS:STRUCTURAL"PLANT:COTTONGRASS:STRUCTURAL"'PLANT:WHITE MOUNTAIN HEATHER:STRUCTURAL"PLANT:MOUNTAIN AVENS:STRUCTURAL"PLANT:CLOUDBERRY:STRUCTURAL"PLANT:WORMY TENDRILS:STRUCTURAL"PLANT:EYEBALL:STRUCTURAL"PLANT:BUBBLE BULBS:STRUCTURAL"PLANT:DOWNY GRASS:STRUCTURAL"PLANT:CAVE MOSS:STRUCTURAL"PLANT:FLOOR FUNGI:STRUCTURAL"PLANT:UNDERLICHEN:STRUCTURAL"PLANT:BAMBOO, ARROW:STRUCTURAL"PLANT:BAMBOO, GOLDEN:STRUCTURAL"PLANT:BAMBOO, HEDGE:STRUCTURAL"PLANT:ABACA:STRUCTURAL"PLANT:BANANA:STRUCTURAL"PLANT:CARAMBOLA:STRUCTURAL"PLANT:CASHEW:STRUCTURAL"PLANT:COFFEE:STRUCTURAL"PLANT:DURIAN:STRUCTURAL"PLANT:GUAVA:STRUCTURAL"PLANT:PAPAYA:STRUCTURAL"PLANT:PARADISE_NUT:STRUCTURAL"PLANT:RAMBUTAN:STRUCTURAL"PLANT:TEA:STRUCTURAL"PLANT:AVOCADO:STRUCTURAL"PLANT:LIME:STRUCTURAL"PLANT:POMELO:STRUCTURAL"PLANT:CITRON:STRUCTURAL"PLANT:ORANGE:STRUCTURAL"PLANT:BITTER_ORANGE:STRUCTURAL"PLANT:FINGER_LIME:STRUCTURAL"PLANT:ROUND_LIME:STRUCTURAL"PLANT:DESERT_LIME:STRUCTURAL"PLANT:KUMQUAT:STRUCTURAL"PLANT:CUSTARD-APPLE:STRUCTURAL"PLANT:DATE_PALM:STRUCTURAL"PLANT:LYCHEE:STRUCTURAL"PLANT:MACADAMIA:STRUCTURAL"PLANT:OLIVE:STRUCTURAL"PLANT:POMEGRANATE:STRUCTURAL"PLANT:ALMOND:STRUCTURAL"PLANT:APPLE:STRUCTURAL"PLANT:APRICOT:STRUCTURAL"PLANT:BAYBERRY:STRUCTURAL"PLANT:CHERRY:STRUCTURAL"PLANT:GINKGO:STRUCTURAL"PLANT:HAZEL:STRUCTURAL"PLANT:PEACH:STRUCTURAL"PLANT:PEAR:STRUCTURAL"PLANT:PECAN:STRUCTURAL"PLANT:PERSIMMON:STRUCTURAL"PLANT:PLUM:STRUCTURAL"PLANT:SAND_PEAR:STRUCTURAL"PLANT:WALNUT:STRUCTURAL"&PLANT:MUSHROOM_HELMET_PLUMP:STRUCTURAL"PLANT:GRASS_TAIL_PIG:STRUCTURAL"!PLANT:GRASS_WHEAT_CAVE:STRUCTURAL"PLANT:POD_SWEET:STRUCTURAL"PLANT:BUSH_QUARRY:STRUCTURAL"PLANT:ROOT_MUCK:STRUCTURAL"PLANT:TUBER_BLOATED:STRUCTURAL"PLANT:BULB_KOBOLD:STRUCTURAL" PLANT:BERRIES_PRICKLE:STRUCTURAL"PLANT:BERRIES_STRAW:STRUCTURAL"PLANT:GRASS_LONGLAND:STRUCTURAL"PLANT:HERB_VALLEY:STRUCTURAL"PLANT:WEED_RAT:STRUCTURAL"PLANT:BERRIES_FISHER:STRUCTURAL"PLANT:REED_ROPE:STRUCTURAL"$PLANT:MUSHROOM_CUP_DIMPLE:STRUCTURAL"PLANT:WEED_BLADE:STRUCTURAL"PLANT:ROOT_HIDE:STRUCTURAL"PLANT:SLIVER_BARB:STRUCTURAL"PLANT:BERRY_SUN:STRUCTURAL"PLANT:VINE_WHIP:STRUCTURAL"PLANT:MANGROVE:STRUCTURAL"PLANT:SAGUARO:STRUCTURAL"PLANT:PINE:STRUCTURAL"PLANT:CEDAR:STRUCTURAL"PLANT:OAK:STRUCTURAL"PLANT:MAHOGANY:STRUCTURAL"PLANT:ACACIA:STRUCTURAL"PLANT:KAPOK:STRUCTURAL"PLANT:MAPLE:STRUCTURAL"PLANT:WILLOW:STRUCTURAL"PLANT:TOWER_CAP:STRUCTURAL"PLANT:BLACK_CAP:STRUCTURAL"PLANT:NETHER_CAP:STRUCTURAL"PLANT:GOBLIN_CAP:STRUCTURAL"PLANT:FUNGIWOOD:STRUCTURAL"PLANT:TUNNEL_TUBE:STRUCTURAL"PLANT:SPORE_TREE:STRUCTURAL"PLANT:BLOOD_THORN:STRUCTURAL"PLANT:GLUMPRONG:STRUCTURAL"PLANT:FEATHER:STRUCTURAL"PLANT:HIGHWOOD:STRUCTURAL"PLANT:LARCH:STRUCTURAL"PLANT:CHESTNUT:STRUCTURAL"PLANT:ALDER:STRUCTURAL"PLANT:BIRCH:STRUCTURAL"PLANT:ASH:STRUCTURAL"PLANT:CANDLENUT:STRUCTURAL"PLANT:MANGO:STRUCTURAL"PLANT:RUBBER:STRUCTURAL"PLANT:CACAO:STRUCTURAL"PLANT:PALM:STRUCTURAL*PLANT:SINGLE-GRAIN_WHEAT:DRINK*PLANT:TWO-GRAIN_WHEAT:DRINK*PLANT:SOFT_WHEAT:DRINK*PLANT:HARD_WHEAT:DRINK*PLANT:SPELT:DRINK*PLANT:BARLEY:DRINK*PLANT:BUCKWHEAT:DRINK*PLANT:RYE:DRINK*PLANT:SORGHUM:DRINK*PLANT:RICE:DRINK*PLANT:MAIZE:DRINK*PLANT:QUINOA:DRINK*PLANT:KANIWA:DRINK*PLANT:PENDANT_AMARANTH:DRINK*PLANT:BLOOD_AMARANTH:DRINK*PLANT:PURPLE_AMARANTH:DRINK*PLANT:PEARL_MILLET:DRINK*PLANT:WHITE_MILLET:DRINK*PLANT:FINGER_MILLET:DRINK*PLANT:FOXTAIL_MILLET:DRINK*PLANT:FONIO:DRINK*PLANT:TEFF:DRINK*PLANT:ARTICHOKE:DRINK*PLANT:BEET:DRINK*PLANT:WILD_CARROT:DRINK*PLANT:CASSAVA:DRINK*PLANT:PARSNIP:DRINK*PLANT:POTATO:DRINK*PLANT:RADISH:DRINK*PLANT:SWEET_POTATO:DRINK*PLANT:TOMATO:DRINK*PLANT:TOMATILLO:DRINK*PLANT:TURNIP:DRINK*PLANT:PASSION_FRUIT:DRINK*PLANT:GRAPE:DRINK*PLANT:CRANBERRY:DRINK*PLANT:BILBERRY:DRINK*PLANT:BLUEBERRY:DRINK*PLANT:BLACKBERRY:DRINK*PLANT:RASPBERRY:DRINK*PLANT:PINEAPPLE:DRINK*PLANT:BANANA:DRINK*PLANT:CARAMBOLA:DRINK*PLANT:DURIAN:DRINK*PLANT:GUAVA:DRINK*PLANT:PAPAYA:DRINK*PLANT:RAMBUTAN:DRINK*PLANT:CUSTARD-APPLE:DRINK*PLANT:DATE_PALM:DRINK*PLANT:LYCHEE:DRINK*PLANT:POMEGRANATE:DRINK*PLANT:APPLE:DRINK*PLANT:APRICOT:DRINK*PLANT:BAYBERRY:DRINK*PLANT:CHERRY:DRINK*PLANT:PEACH:DRINK*PLANT:PEAR:DRINK*PLANT:PERSIMMON:DRINK*PLANT:PLUM:DRINK*PLANT:SAND_PEAR:DRINK*!PLANT:MUSHROOM_HELMET_PLUMP:DRINK*PLANT:GRASS_TAIL_PIG:DRINK*PLANT:GRASS_WHEAT_CAVE:DRINK*PLANT:POD_SWEET:DRINK*PLANT:ROOT_MUCK:DRINK*PLANT:TUBER_BLOATED:DRINK*PLANT:BERRIES_PRICKLE:DRINK*PLANT:BERRIES_STRAW:DRINK*PLANT:GRASS_LONGLAND:DRINK*PLANT:WEED_RAT:DRINK*PLANT:BERRIES_FISHER:DRINK*PLANT:REED_ROPE:DRINK*PLANT:SLIVER_BARB:DRINK*PLANT:BERRY_SUN:DRINK*PLANT:VINE_WHIP:DRINK*PLANT:MANGO:DRINK2CREATURE:HONEY_BEE:MEAD2CREATURE:BUMBLEBEE:MEADBCREATURE:DONKEY:CHEESEBCREATURE:HORSE:CHEESEBCREATURE:COW:CHEESEBCREATURE:SHEEP:CHEESEBCREATURE:PIG:CHEESEBCREATURE:GOAT:CHEESEBCREATURE:WATER_BUFFALO:CHEESEBCREATURE:REINDEER:CHEESEBCREATURE:YAK:CHEESEBCREATURE:LLAMA:CHEESEBCREATURE:ALPACA:CHEESEBCREATURE:CAMEL_1_HUMP:CHEESEB CREATURE:CAMEL_1_HUMP_MAN:CHEESEB"CREATURE:GIANT_CAMEL_1_HUMP:CHEESEBCREATURE:CAMEL_2_HUMP:CHEESEB CREATURE:CAMEL_2_HUMP_MAN:CHEESEB"CREATURE:GIANT_CAMEL_2_HUMP:CHEESEBCREATURE:MAGGOT_PURRING:CHEESEBCREATURE:KANGAROO:CHEESEBCREATURE:KANGAROO_MAN:CHEESEBCREATURE:GIANT_KANGAROO:CHEESEBCREATURE:TAPIR:CHEESEBCREATURE:TAPIR_MAN:CHEESEBCREATURE:GIANT_TAPIR:CHEESEJPLANT:SINGLE-GRAIN_WHEAT:SEEDJPLANT:TWO-GRAIN_WHEAT:SEEDJPLANT:SOFT_WHEAT:SEEDJPLANT:HARD_WHEAT:SEEDJPLANT:SPELT:SEEDJPLANT:BARLEY:SEEDJPLANT:BUCKWHEAT:SEEDJPLANT:OATS:SEEDJPLANT:ALFALFA:SEEDJPLANT:RYE:SEEDJPLANT:SORGHUM:SEEDJPLANT:RICE:SEEDJPLANT:MAIZE:SEEDJPLANT:QUINOA:SEEDJPLANT:KANIWA:SEEDJPLANT:BITTER_VETCH:SEEDJPLANT:PENDANT_AMARANTH:SEEDJPLANT:BLOOD_AMARANTH:SEEDJPLANT:PURPLE_AMARANTH:SEEDJPLANT:RED_SPINACH:SEEDJ!PLANT:ELEPHANT-HEAD_AMARANTH:SEEDJPLANT:PEARL_MILLET:SEEDJPLANT:WHITE_MILLET:SEEDJPLANT:FINGER_MILLET:SEEDJPLANT:FOXTAIL_MILLET:SEEDJPLANT:FONIO:SEEDJPLANT:TEFF:SEEDJPLANT:FLAX:SEEDJPLANT:JUTE:SEEDJPLANT:HEMP:SEEDJPLANT:COTTON:SEEDJPLANT:RAMIE:SEEDJPLANT:KENAF:SEEDJPLANT:PAPYRUS_SEDGE:SEEDJPLANT:ARTICHOKE:SEEDJPLANT:ASPARAGUS:SEEDJPLANT:BAMBARA_GROUNDNUT:SEEDJPLANT:STRING_BEAN:SEEDJPLANT:BROAD_BEAN:SEEDJPLANT:BEET:SEEDJPLANT:BITTER_MELON:SEEDJPLANT:CABBAGE:SEEDJPLANT:CAPER:SEEDJPLANT:WILD_CARROT:SEEDJPLANT:CASSAVA:SEEDJPLANT:CELERY:SEEDJPLANT:CHICKPEA:SEEDJPLANT:CHICORY:SEEDJPLANT:COWPEA:SEEDJPLANT:CUCUMBER:SEEDJPLANT:EGGPLANT:SEEDJPLANT:GARDEN_CRESS:SEEDJPLANT:GARLIC:SEEDJPLANT:HORNED_MELON:SEEDJPLANT:LEEK:SEEDJPLANT:LENTIL:SEEDJPLANT:LETTUCE:SEEDJPLANT:MUNG_BEAN:SEEDJPLANT:MUSKMELON:SEEDJPLANT:ONION:SEEDJPLANT:PARSNIP:SEEDJPLANT:PEA:SEEDJPLANT:PEANUT:SEEDJPLANT:PEPPER:SEEDJPLANT:POTATO:SEEDJPLANT:RADISH:SEEDJPLANT:RED_BEAN:SEEDJPLANT:RHUBARB:SEEDJPLANT:SOYBEAN:SEEDJPLANT:SPINACH:SEEDJPLANT:SQUASH:SEEDJPLANT:SWEET_POTATO:SEEDJPLANT:TARO:SEEDJPLANT:TOMATO:SEEDJPLANT:TOMATILLO:SEEDJPLANT:TURNIP:SEEDJPLANT:URAD_BEAN:SEEDJPLANT:WATERMELON:SEEDJPLANT:WINTER_MELON:SEEDJPLANT:LESSER_YAM:SEEDJPLANT:LONG_YAM:SEEDJPLANT:PURPLE_YAM:SEEDJPLANT:WHITE_YAM:SEEDJPLANT:PASSION_FRUIT:SEEDJPLANT:GRAPE:SEEDJPLANT:CRANBERRY:SEEDJPLANT:BILBERRY:SEEDJPLANT:BLUEBERRY:SEEDJPLANT:BLACKBERRY:SEEDJPLANT:RASPBERRY:SEEDJPLANT:PINEAPPLE:SEEDJPLANT:ABACA:SEEDJPLANT:BANANA:SEEDJPLANT:CARAMBOLA:SEEDJPLANT:CASHEW:SEEDJPLANT:COFFEE:SEEDJPLANT:DURIAN:SEEDJPLANT:GUAVA:SEEDJPLANT:PAPAYA:SEEDJPLANT:PARADISE_NUT:SEEDJPLANT:RAMBUTAN:SEEDJPLANT:TEA:SEEDJPLANT:AVOCADO:SEEDJPLANT:LIME:SEEDJPLANT:POMELO:SEEDJPLANT:CITRON:SEEDJPLANT:ORANGE:SEEDJPLANT:BITTER_ORANGE:SEEDJPLANT:FINGER_LIME:SEEDJPLANT:ROUND_LIME:SEEDJPLANT:DESERT_LIME:SEEDJPLANT:KUMQUAT:SEEDJPLANT:CUSTARD-APPLE:SEEDJPLANT:DATE_PALM:SEEDJPLANT:LYCHEE:SEEDJPLANT:MACADAMIA:SEEDJPLANT:OLIVE:SEEDJPLANT:POMEGRANATE:SEEDJPLANT:ALMOND:SEEDJPLANT:APPLE:SEEDJPLANT:APRICOT:SEEDJPLANT:BAYBERRY:SEEDJPLANT:CHERRY:SEEDJPLANT:GINKGO:SEEDJPLANT:HAZEL:SEEDJPLANT:PEACH:SEEDJPLANT:PEAR:SEEDJPLANT:PECAN:SEEDJPLANT:PERSIMMON:SEEDJPLANT:PLUM:SEEDJPLANT:SAND_PEAR:SEEDJPLANT:WALNUT:SEEDJ PLANT:MUSHROOM_HELMET_PLUMP:SEEDJPLANT:GRASS_TAIL_PIG:SEEDJPLANT:GRASS_WHEAT_CAVE:SEEDJPLANT:POD_SWEET:SEEDJPLANT:BUSH_QUARRY:SEEDJPLANT:ROOT_MUCK:SEEDJPLANT:TUBER_BLOATED:SEEDJPLANT:BERRIES_PRICKLE:SEEDJPLANT:BERRIES_STRAW:SEEDJPLANT:GRASS_LONGLAND:SEEDJPLANT:WEED_RAT:SEEDJPLANT:BERRIES_FISHER:SEEDJPLANT:REED_ROPE:SEEDJPLANT:MUSHROOM_CUP_DIMPLE:SEEDJPLANT:WEED_BLADE:SEEDJPLANT:ROOT_HIDE:SEEDJPLANT:SLIVER_BARB:SEEDJPLANT:BERRY_SUN:SEEDJPLANT:VINE_WHIP:SEEDJPLANT:OAK:SEEDJPLANT:ACACIA:SEEDJPLANT:CHESTNUT:SEEDJPLANT:CANDLENUT:SEEDJPLANT:MANGO:SEEDJPLANT:CACAO:SEEDRPLANT:BITTER_VETCH:LEAFRPLANT:BLOOD_AMARANTH:LEAFRPLANT:PURPLE_AMARANTH:LEAFRPLANT:RED_SPINACH:LEAFR!PLANT:ELEPHANT-HEAD_AMARANTH:LEAFRPLANT:ARTICHOKE:HEARTRPLANT:BITTER_MELON:LEAFRPLANT:BITTER_MELON:FRUITRPLANT:CAPER:LEAFRPLANT:CAPER:BUDRPLANT:CAPER:FRUITRPLANT:CUCUMBER:FRUITRPLANT:EGGPLANT:FRUITRPLANT:GARDEN_CRESS:LEAFRPLANT:GARLIC:BULBRPLANT:HORNED_MELON:FRUITRPLANT:LETTUCE:LEAFRPLANT:MUSKMELON:FRUITRPLANT:ONION:BULBRPLANT:PEPPER:FRUITRPLANT:SPINACH:LEAFRPLANT:SQUASH:FRUITRPLANT:TOMATO:FRUITRPLANT:TOMATILLO:FRUITRPLANT:WATERMELON:FRUITRPLANT:WINTER_MELON:FRUITRPLANT:PASSION_FRUIT:FRUITRPLANT:GRAPE:FRUITRPLANT:CRANBERRY:FRUITRPLANT:BILBERRY:FRUITRPLANT:BLUEBERRY:FRUITRPLANT:BLACKBERRY:FRUITRPLANT:RASPBERRY:FRUITRPLANT:PINEAPPLE:FRUITRPLANT:BANANA:FRUITRPLANT:CARAMBOLA:FRUITRPLANT:CASHEW:FRUITRPLANT:COFFEE:FRUITRPLANT:DURIAN:FRUITRPLANT:GUAVA:FRUITRPLANT:PAPAYA:FRUITRPLANT:PARADISE_NUT:FRUITRPLANT:RAMBUTAN:FRUITRPLANT:AVOCADO:FRUITRPLANT:LIME:FRUITRPLANT:POMELO:FRUITRPLANT:CITRON:FRUITRPLANT:ORANGE:FRUITRPLANT:BITTER_ORANGE:FRUITRPLANT:FINGER_LIME:FRUITRPLANT:ROUND_LIME:FRUITRPLANT:DESERT_LIME:FRUITRPLANT:KUMQUAT:FRUITRPLANT:CUSTARD-APPLE:FRUITRPLANT:DATE_PALM:FLOWERRPLANT:DATE_PALM:FRUITRPLANT:LYCHEE:FRUITRPLANT:OLIVE:FRUITRPLANT:POMEGRANATE:FRUITRPLANT:APPLE:FRUITRPLANT:APRICOT:FRUITRPLANT:BAYBERRY:FRUITRPLANT:CHERRY:FRUITRPLANT:PEACH:FRUITRPLANT:PEAR:FRUITRPLANT:PERSIMMON:FRUITRPLANT:PLUM:FRUITRPLANT:SAND_PEAR:FRUITRPLANT:BUSH_QUARRY:LEAFRPLANT:BERRIES_STRAW:FRUITRPLANT:SAGUARO:FRUITRPLANT:FEATHER:EGGRPLANT:MANGO:FRUITRPLANT:PALM:NUTZPLANT:SINGLE-GRAIN_WHEAT:MILLZPLANT:TWO-GRAIN_WHEAT:MILLZPLANT:SOFT_WHEAT:MILLZPLANT:HARD_WHEAT:MILLZPLANT:SPELT:MILLZPLANT:BARLEY:MILLZPLANT:BUCKWHEAT:MILLZPLANT:OATS:MILLZPLANT:RYE:MILLZPLANT:SORGHUM:MILLZPLANT:RICE:MILLZPLANT:MAIZE:MILLZPLANT:QUINOA:MILLZPLANT:KANIWA:MILLZPLANT:PENDANT_AMARANTH:MILLZPLANT:BLOOD_AMARANTH:MILLZPLANT:PURPLE_AMARANTH:MILLZPLANT:PEARL_MILLET:MILLZPLANT:WHITE_MILLET:MILLZPLANT:FINGER_MILLET:MILLZPLANT:FOXTAIL_MILLET:MILLZPLANT:FONIO:MILLZPLANT:TEFF:MILLZPLANT:FLAX:MILLZPLANT:HEMP:MILLZPLANT:GRASS_WHEAT_CAVE:MILLZPLANT:POD_SWEET:MILLZPLANT:GRASS_LONGLAND:MILLZPLANT:MUSHROOM_CUP_DIMPLE:MILLZPLANT:WEED_BLADE:MILLZPLANT:ROOT_HIDE:MILLZPLANT:SLIVER_BARB:MILLZPLANT:VINE_WHIP:MILLjCREATURE:TOAD:FATjCREATURE:TOAD:TALLOWjCREATURE:TOAD_MAN:FATjCREATURE:TOAD_MAN:TALLOWjCREATURE:GIANT_TOAD:FATjCREATURE:GIANT_TOAD:TALLOWjCREATURE:WORM:FATjCREATURE:WORM:TALLOWjCREATURE:WORM_MAN:FATjCREATURE:WORM_MAN:TALLOWjCREATURE:BIRD_BLUEJAY:FATjCREATURE:BIRD_BLUEJAY:TALLOWjCREATURE:BLUEJAY_MAN:FATjCREATURE:BLUEJAY_MAN:TALLOWjCREATURE:GIANT_BLUEJAY:FATjCREATURE:GIANT_BLUEJAY:TALLOWjCREATURE:BIRD_CARDINAL:FATjCREATURE:BIRD_CARDINAL:TALLOWjCREATURE:CARDINAL_MAN:FATjCREATURE:CARDINAL_MAN:TALLOWjCREATURE:GIANT_CARDINAL:FATjCREATURE:GIANT_CARDINAL:TALLOWjCREATURE:BIRD_GRACKLE:FATjCREATURE:BIRD_GRACKLE:TALLOWjCREATURE:GRACKLE_MAN:FATjCREATURE:GRACKLE_MAN:TALLOWjCREATURE:GIANT_GRACKLE:FATjCREATURE:GIANT_GRACKLE:TALLOWjCREATURE:BIRD_ORIOLE:FATjCREATURE:BIRD_ORIOLE:TALLOWjCREATURE:ORIOLE_MAN:FATjCREATURE:ORIOLE_MAN:TALLOWjCREATURE:GIANT_ORIOLE:FATjCREATURE:GIANT_ORIOLE:TALLOWjCREATURE:BIRD_RW_BLACKBIRD:FATj!CREATURE:BIRD_RW_BLACKBIRD:TALLOWjCREATURE:RW_BLACKBIRD_MAN:FATj CREATURE:RW_BLACKBIRD_MAN:TALLOWjCREATURE:GIANT_RW_BLACKBIRD:FATj"CREATURE:GIANT_RW_BLACKBIRD:TALLOWjCREATURE:BIRD_PENGUIN:FATjCREATURE:BIRD_PENGUIN:TALLOWj CREATURE:BIRD_PENGUIN_LITTLE:FATj#CREATURE:BIRD_PENGUIN_LITTLE:TALLOWj!CREATURE:BIRD_PENGUIN_EMPEROR:FATj$CREATURE:BIRD_PENGUIN_EMPEROR:TALLOWjCREATURE:PENGUIN MAN:FATjCREATURE:PENGUIN MAN:TALLOWjCREATURE:BIRD_PENGUIN_GIANT:FATj"CREATURE:BIRD_PENGUIN_GIANT:TALLOWj"CREATURE:BIRD_FALCON_PEREGRINE:FATj%CREATURE:BIRD_FALCON_PEREGRINE:TALLOWj!CREATURE:PEREGRINE FALCON MAN:FATj$CREATURE:PEREGRINE FALCON MAN:TALLOWj#CREATURE:GIANT PEREGRINE FALCON:FATj&CREATURE:GIANT PEREGRINE FALCON:TALLOWjCREATURE:BIRD_KIWI:FATjCREATURE:BIRD_KIWI:TALLOWjCREATURE:KIWI MAN:FATjCREATURE:KIWI MAN:TALLOWjCREATURE:BIRD_KIWI_GIANT:FATjCREATURE:BIRD_KIWI_GIANT:TALLOWjCREATURE:BIRD_OSTRICH:FATjCREATURE:BIRD_OSTRICH:TALLOWjCREATURE:OSTRICH MAN:FATjCREATURE:OSTRICH MAN:TALLOWjCREATURE:BIRD_OSTRICH_GIANT:FATj"CREATURE:BIRD_OSTRICH_GIANT:TALLOWjCREATURE:BIRD_CROW:FATjCREATURE:BIRD_CROW:TALLOWjCREATURE:CROW_MAN:FATjCREATURE:CROW_MAN:TALLOWjCREATURE:GIANT_CROW:FATjCREATURE:GIANT_CROW:TALLOWjCREATURE:BIRD_RAVEN:FATjCREATURE:BIRD_RAVEN:TALLOWjCREATURE:RAVEN_MAN:FATjCREATURE:RAVEN_MAN:TALLOWjCREATURE:GIANT_RAVEN:FATjCREATURE:GIANT_RAVEN:TALLOWjCREATURE:BIRD_CASSOWARY:FATjCREATURE:BIRD_CASSOWARY:TALLOWjCREATURE:CASSOWARY_MAN:FATjCREATURE:CASSOWARY_MAN:TALLOWjCREATURE:GIANT_CASSOWARY:FATjCREATURE:GIANT_CASSOWARY:TALLOWjCREATURE:BIRD_KEA:FATjCREATURE:BIRD_KEA:TALLOWjCREATURE:KEA_MAN:FATjCREATURE:KEA_MAN:TALLOWjCREATURE:GIANT_KEA:FATjCREATURE:GIANT_KEA:TALLOWjCREATURE:BIRD_OWL_SNOWY:FATjCREATURE:BIRD_OWL_SNOWY:TALLOWjCREATURE:SNOWY_OWL_MAN:FATjCREATURE:SNOWY_OWL_MAN:TALLOWjCREATURE:GIANT_SNOWY_OWL:FATjCREATURE:GIANT_SNOWY_OWL:TALLOWjCREATURE:SPARROW:FATjCREATURE:SPARROW:TALLOWjCREATURE:SPARROW_MAN:FATjCREATURE:SPARROW_MAN:TALLOWjCREATURE:GIANT_SPARROW:FATjCREATURE:GIANT_SPARROW:TALLOWjCREATURE:BIRD_STORK_WHITE:FATj CREATURE:BIRD_STORK_WHITE:TALLOWjCREATURE:WHITE_STORK_MAN:FATjCREATURE:WHITE_STORK_MAN:TALLOWjCREATURE:GIANT_WHITE_STORK:FATj!CREATURE:GIANT_WHITE_STORK:TALLOWjCREATURE:BIRD_LOON:FATjCREATURE:BIRD_LOON:TALLOWjCREATURE:LOON_MAN:FATjCREATURE:LOON_MAN:TALLOWjCREATURE:GIANT_LOON:FATjCREATURE:GIANT_LOON:TALLOWjCREATURE:BIRD_OWL_BARN:FATjCREATURE:BIRD_OWL_BARN:TALLOWjCREATURE:BARN_OWL_MAN:FATjCREATURE:BARN_OWL_MAN:TALLOWjCREATURE:GIANT_BARN_OWL:FATjCREATURE:GIANT_BARN_OWL:TALLOWjCREATURE:BIRD_PARAKEET:FATjCREATURE:BIRD_PARAKEET:TALLOWjCREATURE:PARAKEET_MAN:FATjCREATURE:PARAKEET_MAN:TALLOWjCREATURE:GIANT_PARAKEET:FATjCREATURE:GIANT_PARAKEET:TALLOWjCREATURE:BIRD_KAKAPO:FATjCREATURE:BIRD_KAKAPO:TALLOWjCREATURE:KAKAPO_MAN:FATjCREATURE:KAKAPO_MAN:TALLOWjCREATURE:GIANT_KAKAPO:FATjCREATURE:GIANT_KAKAPO:TALLOWjCREATURE:BIRD_PARROT_GREY:FATj CREATURE:BIRD_PARROT_GREY:TALLOWjCREATURE:GREY_PARROT_MAN:FATjCREATURE:GREY_PARROT_MAN:TALLOWjCREATURE:GIANT_GREY_PARROT:FATj!CREATURE:GIANT_GREY_PARROT:TALLOWjCREATURE:BIRD_PUFFIN:FATjCREATURE:BIRD_PUFFIN:TALLOWjCREATURE:PUFFIN_MAN:FATjCREATURE:PUFFIN_MAN:TALLOWjCREATURE:GIANT_PUFFIN:FATjCREATURE:GIANT_PUFFIN:TALLOWjCREATURE:BIRD_SWAN:FATjCREATURE:BIRD_SWAN:TALLOWjCREATURE:SWAN_MAN:FATjCREATURE:SWAN_MAN:TALLOWjCREATURE:GIANT_SWAN:FATjCREATURE:GIANT_SWAN:TALLOWjCREATURE:BIRD_LORIKEET:FATjCREATURE:BIRD_LORIKEET:TALLOWjCREATURE:LORIKEET_MAN:FATjCREATURE:LORIKEET_MAN:TALLOWjCREATURE:GIANT_LORIKEET:FATjCREATURE:GIANT_LORIKEET:TALLOWjCREATURE:BIRD_WREN:FATjCREATURE:BIRD_WREN:TALLOWjCREATURE:WREN_MAN:FATjCREATURE:WREN_MAN:TALLOWjCREATURE:GIANT_WREN:FATjCREATURE:GIANT_WREN:TALLOWjCREATURE:BIRD_OSPREY:FATjCREATURE:BIRD_OSPREY:TALLOWjCREATURE:OSPREY_MAN:FATjCREATURE:OSPREY_MAN:TALLOWjCREATURE:GIANT_OSPREY:FATjCREATURE:GIANT_OSPREY:TALLOWjCREATURE:BIRD_EMU:FATjCREATURE:BIRD_EMU:TALLOWjCREATURE:EMU_MAN:FATjCREATURE:EMU_MAN:TALLOWjCREATURE:GIANT_EMU:FATjCREATURE:GIANT_EMU:TALLOWjCREATURE:BIRD_COCKATIEL:FATjCREATURE:BIRD_COCKATIEL:TALLOWjCREATURE:COCKATIEL_MAN:FATjCREATURE:COCKATIEL_MAN:TALLOWjCREATURE:GIANT_COCKATIEL:FATjCREATURE:GIANT_COCKATIEL:TALLOWj&CREATURE:BIRD_LOVEBIRD_PEACH-FACED:FATj)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:TALLOWj%CREATURE:PEACH-FACED_LOVEBIRD_MAN:FATj(CREATURE:PEACH-FACED_LOVEBIRD_MAN:TALLOWj'CREATURE:GIANT_PEACH-FACED_LOVEBIRD:FATj*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:TALLOWjCREATURE:BIRD_MAGPIE:FATjCREATURE:BIRD_MAGPIE:TALLOWjCREATURE:MAGPIE_MAN:FATjCREATURE:MAGPIE_MAN:TALLOWjCREATURE:GIANT_MAGPIE:FATjCREATURE:GIANT_MAGPIE:TALLOWjCREATURE:BIRD_KESTREL:FATjCREATURE:BIRD_KESTREL:TALLOWjCREATURE:KESTREL_MAN:FATjCREATURE:KESTREL_MAN:TALLOWjCREATURE:GIANT_KESTREL:FATjCREATURE:GIANT_KESTREL:TALLOWjCREATURE:BIRD_ALBATROSS:FATjCREATURE:BIRD_ALBATROSS:TALLOWjCREATURE:ALBATROSS_MAN:FATjCREATURE:ALBATROSS_MAN:TALLOWjCREATURE:GIANT_ALBATROSS:FATjCREATURE:GIANT_ALBATROSS:TALLOWj"CREATURE:BIRD_OWL_GREAT_HORNED:FATj%CREATURE:BIRD_OWL_GREAT_HORNED:TALLOWj!CREATURE:GREAT_HORNED_OWL_MAN:FATj$CREATURE:GREAT_HORNED_OWL_MAN:TALLOWj#CREATURE:GIANT_GREAT_HORNED_OWL:FATj&CREATURE:GIANT_GREAT_HORNED_OWL:TALLOWjCREATURE:BIRD_EAGLE:FATjCREATURE:BIRD_EAGLE:TALLOWjCREATURE:EAGLE_MAN:FATjCREATURE:EAGLE_MAN:TALLOWjCREATURE:GIANT_EAGLE:FATjCREATURE:GIANT_EAGLE:TALLOWjCREATURE:BIRD_HORNBILL:FATjCREATURE:BIRD_HORNBILL:TALLOWjCREATURE:HORNBILL_MAN:FATjCREATURE:HORNBILL_MAN:TALLOWjCREATURE:GIANT_HORNBILL:FATjCREATURE:GIANT_HORNBILL:TALLOWj!CREATURE:BIRD_LOVEBIRD_MASKED:FATj$CREATURE:BIRD_LOVEBIRD_MASKED:TALLOWj CREATURE:MASKED_LOVEBIRD_MAN:FATj#CREATURE:MASKED_LOVEBIRD_MAN:TALLOWj"CREATURE:GIANT_MASKED_LOVEBIRD:FATj%CREATURE:GIANT_MASKED_LOVEBIRD:TALLOWjCREATURE:BIRD_BUSHTIT:FATjCREATURE:BIRD_BUSHTIT:TALLOWjCREATURE:BUSHTIT_MAN:FATjCREATURE:BUSHTIT_MAN:TALLOWjCREATURE:GIANT_BUSHTIT:FATjCREATURE:GIANT_BUSHTIT:TALLOWjCREATURE:DAMSELFLY:FATjCREATURE:DAMSELFLY:TALLOWjCREATURE:DAMSELFLY_MAN:FATjCREATURE:DAMSELFLY_MAN:TALLOWjCREATURE:GIANT_DAMSELFLY:FATjCREATURE:GIANT_DAMSELFLY:TALLOWjCREATURE:MOTH:FATjCREATURE:MOTH:TALLOWjCREATURE:MOTH_MAN:FATjCREATURE:MOTH_MAN:TALLOWjCREATURE:GIANT_MOTH:FATjCREATURE:GIANT_MOTH:TALLOWjCREATURE:GRASSHOPPER:FATjCREATURE:GRASSHOPPER:TALLOWjCREATURE:GRASSHOPPER_MAN:FATjCREATURE:GRASSHOPPER_MAN:TALLOWjCREATURE:GIANT_GRASSHOPPER:FATj!CREATURE:GIANT_GRASSHOPPER:TALLOWjCREATURE:BARK_SCORPION:FATjCREATURE:BARK_SCORPION:TALLOWjCREATURE:BARK_SCORPION_MAN:FATj!CREATURE:BARK_SCORPION_MAN:TALLOWj CREATURE:GIANT_BARK_SCORPION:FATj#CREATURE:GIANT_BARK_SCORPION:TALLOWjCREATURE:MANTIS:FATjCREATURE:MANTIS:TALLOWjCREATURE:MANTIS_MAN:FATjCREATURE:MANTIS_MAN:TALLOWjCREATURE:GIANT_MANTIS:FATjCREATURE:GIANT_MANTIS:TALLOWjCREATURE:TICK:FATjCREATURE:TICK:TALLOWjCREATURE:TICK_MAN:FATjCREATURE:TICK_MAN:TALLOWjCREATURE:GIANT_TICK:FATjCREATURE:GIANT_TICK:TALLOWjCREATURE:LOUSE:FATjCREATURE:LOUSE:TALLOWjCREATURE:LOUSE_MAN:FATjCREATURE:LOUSE_MAN:TALLOWjCREATURE:GIANT_LOUSE:FATjCREATURE:GIANT_LOUSE:TALLOWjCREATURE:THRIPS:FATjCREATURE:THRIPS:TALLOWjCREATURE:THRIPS_MAN:FATjCREATURE:THRIPS_MAN:TALLOWjCREATURE:GIANT_THRIPS:FATjCREATURE:GIANT_THRIPS:TALLOWjCREATURE:SLUG:FATjCREATURE:SLUG:TALLOWjCREATURE:SLUG_MAN:FATjCREATURE:SLUG_MAN:TALLOWjCREATURE:GIANT_SLUG:FATjCREATURE:GIANT_SLUG:TALLOWjCREATURE:MOSQUITO:FATjCREATURE:MOSQUITO:TALLOWjCREATURE:MOSQUITO_MAN:FATjCREATURE:MOSQUITO_MAN:TALLOWjCREATURE:GIANT_MOSQUITO:FATjCREATURE:GIANT_MOSQUITO:TALLOWjCREATURE:SPIDER_JUMPING:FATjCREATURE:SPIDER_JUMPING:TALLOWjCREATURE:JUMPING_SPIDER_MAN:FATj"CREATURE:JUMPING_SPIDER_MAN:TALLOWj!CREATURE:GIANT_JUMPING_SPIDER:FATj$CREATURE:GIANT_JUMPING_SPIDER:TALLOWjCREATURE:TERMITE:FATjCREATURE:TERMITE:TALLOWjCREATURE:MOON_SNAIL:FATjCREATURE:MOON_SNAIL:TALLOWjCREATURE:MOON_SNAIL_MAN:FATjCREATURE:MOON_SNAIL_MAN:TALLOWjCREATURE:GIANT_MOON_SNAIL:FATj CREATURE:GIANT_MOON_SNAIL:TALLOWj!CREATURE:SPIDER_BROWN_RECLUSE:FATj$CREATURE:SPIDER_BROWN_RECLUSE:TALLOWj%CREATURE:BROWN_RECLUSE_SPIDER_MAN:FATj(CREATURE:BROWN_RECLUSE_SPIDER_MAN:TALLOWj'CREATURE:GIANT_BROWN_RECLUSE_SPIDER:FATj*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:TALLOWjCREATURE:SNAIL:FATjCREATURE:SNAIL:TALLOWjCREATURE:SNAIL_MAN:FATjCREATURE:SNAIL_MAN:TALLOWjCREATURE:GIANT_SNAIL:FATjCREATURE:GIANT_SNAIL:TALLOWjCREATURE:GECKO_LEOPARD:FATjCREATURE:GECKO_LEOPARD:TALLOWjCREATURE:LEOPARD_GECKO_MAN:FATj!CREATURE:LEOPARD_GECKO_MAN:TALLOWj CREATURE:GIANT_LEOPARD_GECKO:FATj#CREATURE:GIANT_LEOPARD_GECKO:TALLOWjCREATURE:DESERT TORTOISE:FATjCREATURE:DESERT TORTOISE:TALLOWj CREATURE:DESERT_TORTOISE_MAN:FATj#CREATURE:DESERT_TORTOISE_MAN:TALLOWj"CREATURE:GIANT_DESERT_TORTOISE:FATj%CREATURE:GIANT_DESERT_TORTOISE:TALLOWjCREATURE:GILA_MONSTER:FATjCREATURE:GILA_MONSTER:TALLOWjCREATURE:GILA_MONSTER_MAN:FATj CREATURE:GILA_MONSTER_MAN:TALLOWjCREATURE:GIANT_GILA_MONSTER:FATj"CREATURE:GIANT_GILA_MONSTER:TALLOWjCREATURE:DOG:FATjCREATURE:DOG:TALLOWjCREATURE:CAT:FATjCREATURE:CAT:TALLOWjCREATURE:MULE:FATjCREATURE:MULE:TALLOWjCREATURE:DONKEY:FATjCREATURE:DONKEY:TALLOWjCREATURE:HORSE:FATjCREATURE:HORSE:TALLOWjCREATURE:COW:FATjCREATURE:COW:TALLOWjCREATURE:SHEEP:FATjCREATURE:SHEEP:TALLOWjCREATURE:PIG:FATjCREATURE:PIG:TALLOWjCREATURE:GOAT:FATjCREATURE:GOAT:TALLOWjCREATURE:BIRD_CHICKEN:FATjCREATURE:BIRD_CHICKEN:TALLOWjCREATURE:CAVY:FATjCREATURE:CAVY:TALLOWjCREATURE:BIRD_DUCK:FATjCREATURE:BIRD_DUCK:TALLOWjCREATURE:WATER_BUFFALO:FATjCREATURE:WATER_BUFFALO:TALLOWjCREATURE:REINDEER:FATjCREATURE:REINDEER:TALLOWjCREATURE:BIRD_GOOSE:FATjCREATURE:BIRD_GOOSE:TALLOWjCREATURE:YAK:FATjCREATURE:YAK:TALLOWjCREATURE:LLAMA:FATjCREATURE:LLAMA:TALLOWjCREATURE:ALPACA:FATjCREATURE:ALPACA:TALLOWjCREATURE:BIRD_GUINEAFOWL:FATjCREATURE:BIRD_GUINEAFOWL:TALLOWjCREATURE:BIRD_PEAFOWL_BLUE:FATj!CREATURE:BIRD_PEAFOWL_BLUE:TALLOWjCREATURE:BIRD_TURKEY:FATjCREATURE:BIRD_TURKEY:TALLOWjCREATURE:RABBIT:FATjCREATURE:RABBIT:TALLOWjCREATURE:FLY:FATjCREATURE:FLY:TALLOWjCREATURE:FLY_MAN:FATjCREATURE:FLY_MAN:TALLOWjCREATURE:GIANT_FLY:FATjCREATURE:GIANT_FLY:TALLOWjCREATURE:ROACH_LARGE:FATjCREATURE:ROACH_LARGE:TALLOWjCREATURE:ROACH_MAN:FATjCREATURE:ROACH_MAN:TALLOWjCREATURE:GIANT_ROACH:FATjCREATURE:GIANT_ROACH:TALLOWjCREATURE:BEETLE:FATjCREATURE:BEETLE:TALLOWjCREATURE:BEETLE_MAN:FATjCREATURE:BEETLE_MAN:TALLOWjCREATURE:GIANT_BEETLE:FATjCREATURE:GIANT_BEETLE:TALLOWjCREATURE:ANT:FATjCREATURE:ANT:TALLOWjCREATURE:BUTTERFLY_MONARCH:FATj!CREATURE:BUTTERFLY_MONARCH:TALLOWj"CREATURE:BUTTERFLY_MONARCH_MAN:FATj%CREATURE:BUTTERFLY_MONARCH_MAN:TALLOWj$CREATURE:GIANT_BUTTERFLY_MONARCH:FATj'CREATURE:GIANT_BUTTERFLY_MONARCH:TALLOWjCREATURE:FIREFLY:FATjCREATURE:FIREFLY:TALLOWjCREATURE:FIREFLY_MAN:FATjCREATURE:FIREFLY_MAN:TALLOWjCREATURE:GIANT_FIREFLY:FATjCREATURE:GIANT_FIREFLY:TALLOWjCREATURE:DRAGONFLY:FATjCREATURE:DRAGONFLY:TALLOWjCREATURE:DRAGONFLY_MAN:FATjCREATURE:DRAGONFLY_MAN:TALLOWjCREATURE:GIANT_DRAGONFLY:FATjCREATURE:GIANT_DRAGONFLY:TALLOWjCREATURE:HONEY_BEE:WAXjCREATURE:HONEY_BEE:FATjCREATURE:HONEY_BEE:TALLOWjCREATURE:BUMBLEBEE:WAXjCREATURE:BUMBLEBEE:FATjCREATURE:BUMBLEBEE:TALLOWjCREATURE:GOAT_MOUNTAIN:FATjCREATURE:GOAT_MOUNTAIN:TALLOWjCREATURE:GOAT_MOUNTAIN_MAN:FATj!CREATURE:GOAT_MOUNTAIN_MAN:TALLOWj CREATURE:GIANT_GOAT_MOUNTAIN:FATj#CREATURE:GIANT_GOAT_MOUNTAIN:TALLOWjCREATURE:MARMOT_HOARY:FATjCREATURE:MARMOT_HOARY:TALLOWjCREATURE:MARMOT_HOARY_MAN:FATj CREATURE:MARMOT_HOARY_MAN:TALLOWjCREATURE:GIANT_MARMOT_HOARY:FATj"CREATURE:GIANT_MARMOT_HOARY:TALLOWjCREATURE:GNOME_MOUNTAIN:FATjCREATURE:GNOME_MOUNTAIN:TALLOWjCREATURE:GNOME_DARK:FATjCREATURE:GNOME_DARK:TALLOWjCREATURE:WALRUS:FATjCREATURE:WALRUS:TALLOWjCREATURE:WALRUS_MAN:FATjCREATURE:WALRUS_MAN:TALLOWjCREATURE:GIANT_WALRUS:FATjCREATURE:GIANT_WALRUS:TALLOWjCREATURE:FISH_LAMPREY_SEA:FATj CREATURE:FISH_LAMPREY_SEA:TALLOWjCREATURE:SHARK_GREAT_WHITE:FATj!CREATURE:SHARK_GREAT_WHITE:TALLOWjCREATURE:SHARK_FRILL:FATjCREATURE:SHARK_FRILL:TALLOWj CREATURE:SHARK_SPINY_DOGFISH:FATj#CREATURE:SHARK_SPINY_DOGFISH:TALLOWj$CREATURE:SHARK_WOBBEGONG_SPOTTED:FATj'CREATURE:SHARK_WOBBEGONG_SPOTTED:TALLOWjCREATURE:SHARK_WHALE:FATjCREATURE:SHARK_WHALE:TALLOWjCREATURE:SHARK_BASKING:FATjCREATURE:SHARK_BASKING:TALLOWjCREATURE:SHARK_NURSE:FATjCREATURE:SHARK_NURSE:TALLOWj CREATURE:SHARK_MAKO_SHORTFIN:FATj#CREATURE:SHARK_MAKO_SHORTFIN:TALLOWjCREATURE:SHARK_MAKO_LONGFIN:FATj"CREATURE:SHARK_MAKO_LONGFIN:TALLOWjCREATURE:SHARK_TIGER:FATjCREATURE:SHARK_TIGER:TALLOWjCREATURE:SHARK_BULL:FATjCREATURE:SHARK_BULL:TALLOWj CREATURE:SHARK_REEF_BLACKTIP:FATj#CREATURE:SHARK_REEF_BLACKTIP:TALLOWj CREATURE:SHARK_REEF_WHITETIP:FATj#CREATURE:SHARK_REEF_WHITETIP:TALLOWjCREATURE:SHARK_BLUE:FATjCREATURE:SHARK_BLUE:TALLOWjCREATURE:SHARK_HAMMERHEAD:FATj CREATURE:SHARK_HAMMERHEAD:TALLOWjCREATURE:SHARK_ANGEL:FATjCREATURE:SHARK_ANGEL:TALLOWjCREATURE:FISH_SKATE_COMMON:FATj!CREATURE:FISH_SKATE_COMMON:TALLOWjCREATURE:FISH_RAY_MANTA:FATjCREATURE:FISH_RAY_MANTA:TALLOWjCREATURE:FISH_STINGRAY:FATjCREATURE:FISH_STINGRAY:TALLOWjCREATURE:FISH_COELACANTH:FATjCREATURE:FISH_COELACANTH:TALLOWjCREATURE:FISH_STURGEON:FATjCREATURE:FISH_STURGEON:TALLOWjCREATURE:FISH_CONGER_EEL:FATjCREATURE:FISH_CONGER_EEL:TALLOWjCREATURE:FISH_MILKFISH:FATjCREATURE:FISH_MILKFISH:TALLOWjCREATURE:FISH_COD:FATjCREATURE:FISH_COD:TALLOWjCREATURE:FISH_OPAH:FATjCREATURE:FISH_OPAH:TALLOWjCREATURE:FISH_GROUPER_GIANT:FATj"CREATURE:FISH_GROUPER_GIANT:TALLOWjCREATURE:FISH_BLUEFISH:FATjCREATURE:FISH_BLUEFISH:TALLOWjCREATURE:FISH_SUNFISH_OCEAN:FATj"CREATURE:FISH_SUNFISH_OCEAN:TALLOWjCREATURE:FISH_SWORDFISH:FATjCREATURE:FISH_SWORDFISH:TALLOWjCREATURE:FISH_MARLIN:FATjCREATURE:FISH_MARLIN:TALLOWjCREATURE:FISH_HALIBUT:FATjCREATURE:FISH_HALIBUT:TALLOWj!CREATURE:FISH_BARRACUDA_GREAT:FATj$CREATURE:FISH_BARRACUDA_GREAT:TALLOWjCREATURE:FISH_TUNA_BLUEFIN:FATj!CREATURE:FISH_TUNA_BLUEFIN:TALLOWjCREATURE:NARWHAL:FATjCREATURE:NARWHAL:TALLOWjCREATURE:NARWHAL MAN:FATjCREATURE:NARWHAL MAN:TALLOWjCREATURE:NARWHAL, GIANT:FATjCREATURE:NARWHAL, GIANT:TALLOWjCREATURE:HIPPO:FATjCREATURE:HIPPO:TALLOWjCREATURE:HIPPO_MAN:FATjCREATURE:HIPPO_MAN:TALLOWjCREATURE:GIANT_HIPPO:FATjCREATURE:GIANT_HIPPO:TALLOWjCREATURE:FISH_GAR_LONGNOSE:FATj!CREATURE:FISH_GAR_LONGNOSE:TALLOWjCREATURE:FISH_CARP:FATjCREATURE:FISH_CARP:TALLOWjCREATURE:FISH_TIGERFISH:FATjCREATURE:FISH_TIGERFISH:TALLOWjCREATURE:FISH_PIKE:FATjCREATURE:FISH_PIKE:TALLOWjCREATURE:PLATYPUS:FATjCREATURE:PLATYPUS:TALLOWjCREATURE:PLATYPUS MAN:FATjCREATURE:PLATYPUS MAN:TALLOWjCREATURE:PLATYPUS, GIANT:FATjCREATURE:PLATYPUS, GIANT:TALLOWjCREATURE:BEAR_GRIZZLY:FATjCREATURE:BEAR_GRIZZLY:TALLOWjCREATURE:BEAR_GRIZZLY_MAN:FATj CREATURE:BEAR_GRIZZLY_MAN:TALLOWjCREATURE:GIANT_BEAR_GRIZZLY:FATj"CREATURE:GIANT_BEAR_GRIZZLY:TALLOWjCREATURE:BEAR_BLACK:FATjCREATURE:BEAR_BLACK:TALLOWjCREATURE:BEAR_BLACK_MAN:FATjCREATURE:BEAR_BLACK_MAN:TALLOWjCREATURE:GIANT_BEAR_BLACK:FATj CREATURE:GIANT_BEAR_BLACK:TALLOWjCREATURE:DEER:FATjCREATURE:DEER:TALLOWjCREATURE:DEER_MAN:FATjCREATURE:DEER_MAN:TALLOWjCREATURE:GIANT_DEER:FATjCREATURE:GIANT_DEER:TALLOWjCREATURE:FOX:FATjCREATURE:FOX:TALLOWjCREATURE:FOX_MAN:FATjCREATURE:FOX_MAN:TALLOWjCREATURE:GIANT_FOX:FATjCREATURE:GIANT_FOX:TALLOWjCREATURE:RACCOON:FATjCREATURE:RACCOON:TALLOWjCREATURE:RACCOON_MAN:FATjCREATURE:RACCOON_MAN:TALLOWjCREATURE:GIANT_RACCOON:FATjCREATURE:GIANT_RACCOON:TALLOWjCREATURE:MACAQUE_RHESUS:FATjCREATURE:MACAQUE_RHESUS:TALLOWjCREATURE:MACAQUE_RHESUS_MAN:FATj"CREATURE:MACAQUE_RHESUS_MAN:TALLOWj!CREATURE:GIANT_MACAQUE_RHESUS:FATj$CREATURE:GIANT_MACAQUE_RHESUS:TALLOWjCREATURE:COUGAR:FATjCREATURE:COUGAR:TALLOWjCREATURE:COUGAR_MAN:FATjCREATURE:COUGAR_MAN:TALLOWjCREATURE:GIANT_COUGAR:FATjCREATURE:GIANT_COUGAR:TALLOWjCREATURE:WOLF:FATjCREATURE:WOLF:TALLOWjCREATURE:WOLF_MAN:FATjCREATURE:WOLF_MAN:TALLOWjCREATURE:GIANT_WOLF:FATjCREATURE:GIANT_WOLF:TALLOWjCREATURE:GROUNDHOG:FATjCREATURE:GROUNDHOG:TALLOWjCREATURE:GROUNDHOG_MAN:FATjCREATURE:GROUNDHOG_MAN:TALLOWjCREATURE:GIANT_GROUNDHOG:FATjCREATURE:GIANT_GROUNDHOG:TALLOWjCREATURE:ALLIGATOR:FATjCREATURE:ALLIGATOR:TALLOWjCREATURE:ALLIGATOR_MAN:FATjCREATURE:ALLIGATOR_MAN:TALLOWjCREATURE:GIANT_ALLIGATOR:FATjCREATURE:GIANT_ALLIGATOR:TALLOWjCREATURE:BIRD_BUZZARD:FATjCREATURE:BIRD_BUZZARD:TALLOWjCREATURE:BUZZARD_MAN:FATjCREATURE:BUZZARD_MAN:TALLOWjCREATURE:GIANT_BUZZARD:FATjCREATURE:GIANT_BUZZARD:TALLOWjCREATURE:PANDA:FATjCREATURE:PANDA:TALLOWjCREATURE:PANDA, GIGANTIC:FATjCREATURE:PANDA, GIGANTIC:TALLOWjCREATURE:PANDA MAN:FATjCREATURE:PANDA MAN:TALLOWjCREATURE:CAPYBARA:FATjCREATURE:CAPYBARA:TALLOWjCREATURE:CAPYBARA, GIANT:FATjCREATURE:CAPYBARA, GIANT:TALLOWjCREATURE:CAPYBARA MAN:FATjCREATURE:CAPYBARA MAN:TALLOWjCREATURE:BADGER:FATjCREATURE:BADGER:TALLOWjCREATURE:BADGER MAN:FATjCREATURE:BADGER MAN:TALLOWjCREATURE:BADGER, GIANT:FATjCREATURE:BADGER, GIANT:TALLOWjCREATURE:MOOSE:FATjCREATURE:MOOSE:TALLOWjCREATURE:MOOSE MAN:FATjCREATURE:MOOSE MAN:TALLOWjCREATURE:MOOSE, GIANT:FATjCREATURE:MOOSE, GIANT:TALLOWjCREATURE:RED PANDA:FATjCREATURE:RED PANDA:TALLOWjCREATURE:RED PANDA MAN:FATjCREATURE:RED PANDA MAN:TALLOWjCREATURE:RED PANDA, GIANT:FATj CREATURE:RED PANDA, GIANT:TALLOWjCREATURE:ELEPHANT:FATjCREATURE:ELEPHANT:TALLOWjCREATURE:ELEPHANT_MAN:FATjCREATURE:ELEPHANT_MAN:TALLOWjCREATURE:GIANT_ELEPHANT:FATjCREATURE:GIANT_ELEPHANT:TALLOWjCREATURE:WARTHOG:FATjCREATURE:WARTHOG:TALLOWjCREATURE:WARTHOG_MAN:FATjCREATURE:WARTHOG_MAN:TALLOWjCREATURE:GIANT_WARTHOG:FATjCREATURE:GIANT_WARTHOG:TALLOWjCREATURE:LION:FATjCREATURE:LION:TALLOWjCREATURE:LION_MAN:FATjCREATURE:LION_MAN:TALLOWjCREATURE:GIANT_LION:FATjCREATURE:GIANT_LION:TALLOWjCREATURE:LEOPARD:FATjCREATURE:LEOPARD:TALLOWjCREATURE:LEOPARD_MAN:FATjCREATURE:LEOPARD_MAN:TALLOWjCREATURE:GIANT_LEOPARD:FATjCREATURE:GIANT_LEOPARD:TALLOWjCREATURE:JAGUAR:FATjCREATURE:JAGUAR:TALLOWjCREATURE:JAGUAR_MAN:FATjCREATURE:JAGUAR_MAN:TALLOWjCREATURE:GIANT_JAGUAR:FATjCREATURE:GIANT_JAGUAR:TALLOWjCREATURE:TIGER:FATjCREATURE:TIGER:TALLOWjCREATURE:TIGER_MAN:FATjCREATURE:TIGER_MAN:TALLOWjCREATURE:GIANT_TIGER:FATjCREATURE:GIANT_TIGER:TALLOWjCREATURE:CHEETAH:FATjCREATURE:CHEETAH:TALLOWjCREATURE:CHEETAH_MAN:FATjCREATURE:CHEETAH_MAN:TALLOWjCREATURE:GIANT_CHEETAH:FATjCREATURE:GIANT_CHEETAH:TALLOWjCREATURE:GAZELLE:FATjCREATURE:GAZELLE:TALLOWjCREATURE:GAZELLE_MAN:FATjCREATURE:GAZELLE_MAN:TALLOWjCREATURE:GIANT_GAZELLE:FATjCREATURE:GIANT_GAZELLE:TALLOWjCREATURE:MANDRILL:FATjCREATURE:MANDRILL:TALLOWjCREATURE:MANDRILL_MAN:FATjCREATURE:MANDRILL_MAN:TALLOWjCREATURE:GIANT_MANDRILL:FATjCREATURE:GIANT_MANDRILL:TALLOWjCREATURE:CHIMPANZEE:FATjCREATURE:CHIMPANZEE:TALLOWjCREATURE:BONOBO:FATjCREATURE:BONOBO:TALLOWjCREATURE:GORILLA:FATjCREATURE:GORILLA:TALLOWjCREATURE:ORANGUTAN:FATjCREATURE:ORANGUTAN:TALLOWjCREATURE:GIBBON_SIAMANG:FATjCREATURE:GIBBON_SIAMANG:TALLOWj CREATURE:GIBBON_WHITE_HANDED:FATj#CREATURE:GIBBON_WHITE_HANDED:TALLOWj CREATURE:GIBBON_BLACK_HANDED:FATj#CREATURE:GIBBON_BLACK_HANDED:TALLOWjCREATURE:GIBBON_GRAY:FATjCREATURE:GIBBON_GRAY:TALLOWjCREATURE:GIBBON_SILVERY:FATjCREATURE:GIBBON_SILVERY:TALLOWjCREATURE:GIBBON_PILEATED:FATjCREATURE:GIBBON_PILEATED:TALLOWjCREATURE:GIBBON_BILOU:FATjCREATURE:GIBBON_BILOU:TALLOWj CREATURE:GIBBON_WHITE_BROWED:FATj#CREATURE:GIBBON_WHITE_BROWED:TALLOWj!CREATURE:GIBBON_BLACK_CRESTED:FATj$CREATURE:GIBBON_BLACK_CRESTED:TALLOWjCREATURE:CAMEL_1_HUMP:FATjCREATURE:CAMEL_1_HUMP:TALLOWjCREATURE:CAMEL_1_HUMP_MAN:FATj CREATURE:CAMEL_1_HUMP_MAN:TALLOWjCREATURE:GIANT_CAMEL_1_HUMP:FATj"CREATURE:GIANT_CAMEL_1_HUMP:TALLOWjCREATURE:CAMEL_2_HUMP:FATjCREATURE:CAMEL_2_HUMP:TALLOWjCREATURE:CAMEL_2_HUMP_MAN:FATj CREATURE:CAMEL_2_HUMP_MAN:TALLOWjCREATURE:GIANT_CAMEL_2_HUMP:FATj"CREATURE:GIANT_CAMEL_2_HUMP:TALLOWj CREATURE:CROCODILE_SALTWATER:FATj#CREATURE:CROCODILE_SALTWATER:TALLOWj$CREATURE:CROCODILE_SALTWATER_MAN:FATj'CREATURE:CROCODILE_SALTWATER_MAN:TALLOWj&CREATURE:GIANT_CROCODILE_SALTWATER:FATj)CREATURE:GIANT_CROCODILE_SALTWATER:TALLOWjCREATURE:BIRD_VULTURE:FATjCREATURE:BIRD_VULTURE:TALLOWjCREATURE:VULTURE_MAN:FATjCREATURE:VULTURE_MAN:TALLOWjCREATURE:GIANT_VULTURE:FATjCREATURE:GIANT_VULTURE:TALLOWjCREATURE:RHINOCEROS:FATjCREATURE:RHINOCEROS:TALLOWjCREATURE:RHINOCEROS_MAN:FATjCREATURE:RHINOCEROS_MAN:TALLOWjCREATURE:GIANT_RHINOCEROS:FATj CREATURE:GIANT_RHINOCEROS:TALLOWjCREATURE:GIRAFFE:FATjCREATURE:GIRAFFE:TALLOWjCREATURE:GIRAFFE_MAN:FATjCREATURE:GIRAFFE_MAN:TALLOWjCREATURE:GIANT_GIRAFFE:FATjCREATURE:GIANT_GIRAFFE:TALLOWjCREATURE:HONEY BADGER:FATjCREATURE:HONEY BADGER:TALLOWjCREATURE:HONEY BADGER MAN:FATj CREATURE:HONEY BADGER MAN:TALLOWj CREATURE:HONEY BADGER, GIANT:FATj#CREATURE:HONEY BADGER, GIANT:TALLOWjCREATURE:GIANT TORTOISE:FATjCREATURE:GIANT TORTOISE:TALLOWjCREATURE:GIANT TORTOISE MAN:FATj"CREATURE:GIANT TORTOISE MAN:TALLOWjCREATURE:GIGANTIC TORTOISE:FATj!CREATURE:GIGANTIC TORTOISE:TALLOWjCREATURE:ARMADILLO:FATjCREATURE:ARMADILLO:TALLOWjCREATURE:ARMADILLO MAN:FATjCREATURE:ARMADILLO MAN:TALLOWjCREATURE:ARMADILLO, GIANT:FATj CREATURE:ARMADILLO, GIANT:TALLOWjCREATURE:MUSKOX:FATjCREATURE:MUSKOX:TALLOWjCREATURE:MUSKOX_MAN:FATjCREATURE:MUSKOX_MAN:TALLOWjCREATURE:GIANT_MUSKOX:FATjCREATURE:GIANT_MUSKOX:TALLOWjCREATURE:ELK:FATjCREATURE:ELK:TALLOWjCREATURE:ELK_MAN:FATjCREATURE:ELK_MAN:TALLOWjCREATURE:GIANT_ELK:FATjCREATURE:GIANT_ELK:TALLOWjCREATURE:BEAR_POLAR:FATjCREATURE:BEAR_POLAR:TALLOWjCREATURE:BEAR_POLAR_MAN:FATjCREATURE:BEAR_POLAR_MAN:TALLOWjCREATURE:GIANT_BEAR_POLAR:FATj CREATURE:GIANT_BEAR_POLAR:TALLOWjCREATURE:WOLVERINE:FATjCREATURE:WOLVERINE:TALLOWjCREATURE:WOLVERINE_MAN:FATjCREATURE:WOLVERINE_MAN:TALLOWjCREATURE:GIANT_WOLVERINE:FATjCREATURE:GIANT_WOLVERINE:TALLOWjCREATURE:CHINCHILLA:FATjCREATURE:CHINCHILLA:TALLOWjCREATURE:CHINCHILLA_MAN:FATjCREATURE:CHINCHILLA_MAN:TALLOWjCREATURE:GIANT_CHINCHILLA:FATj CREATURE:GIANT_CHINCHILLA:TALLOWjCREATURE:FLOATING_GUTS:FATjCREATURE:FLOATING_GUTS:TALLOWjCREATURE:DRUNIAN:FATjCREATURE:DRUNIAN:TALLOWjCREATURE:CREEPING_EYE:FATjCREATURE:CREEPING_EYE:TALLOWj#CREATURE:VORACIOUS_CAVE_CRAWLER:FATj&CREATURE:VORACIOUS_CAVE_CRAWLER:TALLOWjCREATURE:BLIND_CAVE_OGRE:FATjCREATURE:BLIND_CAVE_OGRE:TALLOWjCREATURE:CAP_HOPPER:FATjCREATURE:CAP_HOPPER:TALLOWjCREATURE:MAGMA_CRAB:FATjCREATURE:MAGMA_CRAB:TALLOWjCREATURE:CRUNDLE:FATjCREATURE:CRUNDLE:TALLOWjCREATURE:HUNGRY_HEAD:FATjCREATURE:HUNGRY_HEAD:TALLOWjCREATURE:ELK_BIRD:FATjCREATURE:ELK_BIRD:TALLOWjCREATURE:HELMET_SNAKE:FATjCREATURE:HELMET_SNAKE:TALLOWjCREATURE:GREEN_DEVOURER:FATjCREATURE:GREEN_DEVOURER:TALLOWjCREATURE:RUTHERER:FATjCREATURE:RUTHERER:TALLOWjCREATURE:CREEPY_CRAWLER:FATjCREATURE:CREEPY_CRAWLER:TALLOWjCREATURE:DRALTHA:FATjCREATURE:DRALTHA:TALLOWjCREATURE:GIANT_EARTHWORM:FATjCREATURE:GIANT_EARTHWORM:TALLOWjCREATURE:BUGBAT:FATjCREATURE:BUGBAT:TALLOWjCREATURE:MANERA:FATjCREATURE:MANERA:TALLOWjCREATURE:MOLEMARIAN:FATjCREATURE:MOLEMARIAN:TALLOWjCREATURE:JABBERER:FATjCREATURE:JABBERER:TALLOWjCREATURE:POND_GRABBER:FATjCREATURE:POND_GRABBER:TALLOWjCREATURE:BLIND_CAVE_BEAR:FATjCREATURE:BLIND_CAVE_BEAR:TALLOWjCREATURE:CAVE_DRAGON:FATjCREATURE:CAVE_DRAGON:TALLOWjCREATURE:REACHER:FATjCREATURE:REACHER:TALLOWjCREATURE:GORLAK:FATjCREATURE:GORLAK:TALLOWjCREATURE:OCTOPUS:FATjCREATURE:OCTOPUS:TALLOWjCREATURE:OCTOPUS_MAN:FATjCREATURE:OCTOPUS_MAN:TALLOWjCREATURE:GIANT_OCTOPUS:FATjCREATURE:GIANT_OCTOPUS:TALLOWjCREATURE:CRAB:FATjCREATURE:CRAB:TALLOWjCREATURE:CRAB_MAN:FATjCREATURE:CRAB_MAN:TALLOWjCREATURE:GIANT_CRAB:FATjCREATURE:GIANT_CRAB:TALLOWjCREATURE:LEOPARD_SEAL:FATjCREATURE:LEOPARD_SEAL:TALLOWjCREATURE:LEOPARD_SEAL_MAN:FATj CREATURE:LEOPARD_SEAL_MAN:TALLOWjCREATURE:GIANT_LEOPARD_SEAL:FATj"CREATURE:GIANT_LEOPARD_SEAL:TALLOWjCREATURE:CUTTLEFISH:FATjCREATURE:CUTTLEFISH:TALLOWjCREATURE:CUTTLEFISH_MAN:FATjCREATURE:CUTTLEFISH_MAN:TALLOWjCREATURE:GIANT_CUTTLEFISH:FATj CREATURE:GIANT_CUTTLEFISH:TALLOWjCREATURE:ORCA:FATjCREATURE:ORCA:TALLOWjCREATURE:ORCA_MAN:FATjCREATURE:ORCA_MAN:TALLOWjCREATURE:GIANT_ORCA:FATjCREATURE:GIANT_ORCA:TALLOWjCREATURE:HORSESHOE_CRAB:FATjCREATURE:HORSESHOE_CRAB:TALLOWjCREATURE:HORSESHOE_CRAB_MAN:FATj"CREATURE:HORSESHOE_CRAB_MAN:TALLOWj!CREATURE:GIANT_HORSESHOE_CRAB:FATj$CREATURE:GIANT_HORSESHOE_CRAB:TALLOWjCREATURE:SPERM_WHALE:FATjCREATURE:SPERM_WHALE:TALLOWjCREATURE:SPERM_WHALE_MAN:FATjCREATURE:SPERM_WHALE_MAN:TALLOWjCREATURE:GIANT_SPERM_WHALE:FATj!CREATURE:GIANT_SPERM_WHALE:TALLOWjCREATURE:ELEPHANT_SEAL:FATjCREATURE:ELEPHANT_SEAL:TALLOWjCREATURE:ELEPHANT_SEAL_MAN:FATj!CREATURE:ELEPHANT_SEAL_MAN:TALLOWj CREATURE:GIANT_ELEPHANT_SEAL:FATj#CREATURE:GIANT_ELEPHANT_SEAL:TALLOWjCREATURE:HARP_SEAL:FATjCREATURE:HARP_SEAL:TALLOWjCREATURE:HARP_SEAL_MAN:FATjCREATURE:HARP_SEAL_MAN:TALLOWjCREATURE:GIANT_HARP_SEAL:FATjCREATURE:GIANT_HARP_SEAL:TALLOWjCREATURE:NAUTILUS:FATjCREATURE:NAUTILUS:TALLOWjCREATURE:NAUTILUS_MAN:FATjCREATURE:NAUTILUS_MAN:TALLOWjCREATURE:GIANT_NAUTILUS:FATjCREATURE:GIANT_NAUTILUS:TALLOWjCREATURE:FOXSQUIRREL:FATjCREATURE:FOXSQUIRREL:TALLOWjCREATURE:MOGHOPPER:FATjCREATURE:MOGHOPPER:TALLOWjCREATURE:RAT_DEMON:FATjCREATURE:RAT_DEMON:TALLOWjCREATURE:WAMBLER_FLUFFY:TALLOWjCREATURE:WAMBLER_FLUFFY:FATj$CREATURE:LIZARD_RHINO_TWO_LEGGED:FATj'CREATURE:LIZARD_RHINO_TWO_LEGGED:TALLOWjCREATURE:WORM_KNUCKLE:FATjCREATURE:WORM_KNUCKLE:TALLOWjCREATURE:SPIDER_PHANTOM:FATjCREATURE:SPIDER_PHANTOM:TALLOWjCREATURE:FLY_ACORN:FATjCREATURE:FLY_ACORN:TALLOWjCREATURE:GNAT_BLOOD:FATjCREATURE:GNAT_BLOOD:TALLOWjCREATURE:LIZARD:FATjCREATURE:LIZARD:TALLOWjCREATURE:LIZARD_MAN:FATjCREATURE:LIZARD_MAN:TALLOWjCREATURE:GIANT_LIZARD:FATjCREATURE:GIANT_LIZARD:TALLOWjCREATURE:SKINK:FATjCREATURE:SKINK:TALLOWjCREATURE:SKINK_MAN:FATjCREATURE:SKINK_MAN:TALLOWjCREATURE:GIANT_SKINK:FATjCREATURE:GIANT_SKINK:TALLOWjCREATURE:CHAMELEON:FATjCREATURE:CHAMELEON:TALLOWjCREATURE:CHAMELEON_MAN:FATjCREATURE:CHAMELEON_MAN:TALLOWjCREATURE:GIANT_CHAMELEON:FATjCREATURE:GIANT_CHAMELEON:TALLOWjCREATURE:ANOLE:FATjCREATURE:ANOLE:TALLOWjCREATURE:ANOLE_MAN:FATjCREATURE:ANOLE_MAN:TALLOWjCREATURE:GIANT_ANOLE:FATjCREATURE:GIANT_ANOLE:TALLOWjCREATURE:IGUANA:FATjCREATURE:IGUANA:TALLOWjCREATURE:IGUANA_MAN:FATjCREATURE:IGUANA_MAN:TALLOWjCREATURE:GIANT_IGUANA:FATjCREATURE:GIANT_IGUANA:TALLOWjCREATURE:RIVER OTTER:FATjCREATURE:RIVER OTTER:TALLOWjCREATURE:SEA OTTER:FATjCREATURE:SEA OTTER:TALLOWjCREATURE:OTTER_MAN:FATjCREATURE:OTTER_MAN:TALLOWjCREATURE:GIANT_OTTER:FATjCREATURE:GIANT_OTTER:TALLOWjCREATURE:SNAPPING TURTLE:FATjCREATURE:SNAPPING TURTLE:TALLOWj&CREATURE:ALLIGATOR SNAPPING TURTLE:FATj)CREATURE:ALLIGATOR SNAPPING TURTLE:TALLOWj CREATURE:SNAPPING_TURTLE_MAN:FATj#CREATURE:SNAPPING_TURTLE_MAN:TALLOWj"CREATURE:GIANT_SNAPPING_TURTLE:FATj%CREATURE:GIANT_SNAPPING_TURTLE:TALLOWjCREATURE:BEAVER:FATjCREATURE:BEAVER:TALLOWjCREATURE:BEAVER_MAN:FATjCREATURE:BEAVER_MAN:TALLOWjCREATURE:GIANT_BEAVER:FATjCREATURE:GIANT_BEAVER:TALLOWjCREATURE:LEECH:FATjCREATURE:LEECH:TALLOWjCREATURE:LEECH_MAN:FATjCREATURE:LEECH_MAN:TALLOWjCREATURE:GIANT_LEECH:FATjCREATURE:GIANT_LEECH:TALLOWjCREATURE:AXOLOTL:FATjCREATURE:AXOLOTL:TALLOWjCREATURE:AXOLOTL_MAN:FATjCREATURE:AXOLOTL_MAN:TALLOWjCREATURE:GIANT_AXOLOTL:FATjCREATURE:GIANT_AXOLOTL:TALLOWjCREATURE:MINK:FATjCREATURE:MINK:TALLOWjCREATURE:MINK_MAN:FATjCREATURE:MINK_MAN:TALLOWjCREATURE:GIANT_MINK:FATjCREATURE:GIANT_MINK:TALLOWjCREATURE:POND_TURTLE:FATjCREATURE:POND_TURTLE:TALLOWjCREATURE:POND_TURTLE_MAN:FATjCREATURE:POND_TURTLE_MAN:TALLOWjCREATURE:GIANT_POND_TURTLE:FATj!CREATURE:GIANT_POND_TURTLE:TALLOWjCREATURE:RAT:FATjCREATURE:RAT:TALLOWjCREATURE:RAT_MAN:FATjCREATURE:RAT_MAN:TALLOWjCREATURE:SQUIRREL_GRAY:FATjCREATURE:SQUIRREL_GRAY:TALLOWjCREATURE:SQUIRREL_GRAY_MAN:FATj!CREATURE:SQUIRREL_GRAY_MAN:TALLOWj CREATURE:GIANT_SQUIRREL_GRAY:FATj#CREATURE:GIANT_SQUIRREL_GRAY:TALLOWjCREATURE:SQUIRREL_RED:FATjCREATURE:SQUIRREL_RED:TALLOWjCREATURE:SQUIRREL_RED_MAN:FATj CREATURE:SQUIRREL_RED_MAN:TALLOWjCREATURE:GIANT_SQUIRREL_RED:FATj"CREATURE:GIANT_SQUIRREL_RED:TALLOWjCREATURE:CHIPMUNK:FATjCREATURE:CHIPMUNK:TALLOWjCREATURE:CHIPMUNK_MAN:FATjCREATURE:CHIPMUNK_MAN:TALLOWjCREATURE:GIANT_CHIPMUNK:FATjCREATURE:GIANT_CHIPMUNK:TALLOWjCREATURE:HAMSTER:FATjCREATURE:HAMSTER:TALLOWjCREATURE:HAMSTER_MAN:FATjCREATURE:HAMSTER_MAN:TALLOWjCREATURE:GIANT_HAMSTER:FATjCREATURE:GIANT_HAMSTER:TALLOWjCREATURE:HEDGEHOG:FATjCREATURE:HEDGEHOG:TALLOWjCREATURE:HEDGEHOG_MAN:FATjCREATURE:HEDGEHOG_MAN:TALLOWjCREATURE:GIANT_HEDGEHOG:FATjCREATURE:GIANT_HEDGEHOG:TALLOWjCREATURE:SQUIRREL_FLYING:FATjCREATURE:SQUIRREL_FLYING:TALLOWj CREATURE:FLYING_SQUIRREL_MAN:FATj#CREATURE:FLYING_SQUIRREL_MAN:TALLOWj"CREATURE:GIANT_FLYING_SQUIRREL:FATj%CREATURE:GIANT_FLYING_SQUIRREL:TALLOWjCREATURE:MUSSEL:FATjCREATURE:MUSSEL:TALLOWjCREATURE:OYSTER:FATjCREATURE:OYSTER:TALLOWjCREATURE:FISH_SALMON:FATjCREATURE:FISH_SALMON:TALLOWjCREATURE:FISH_CLOWNFISH:FATjCREATURE:FISH_CLOWNFISH:TALLOWjCREATURE:FISH_HAGFISH:FATjCREATURE:FISH_HAGFISH:TALLOWjCREATURE:FISH_LAMPREY_BROOK:FATj"CREATURE:FISH_LAMPREY_BROOK:TALLOWjCREATURE:FISH_RAY_BAT:FATjCREATURE:FISH_RAY_BAT:TALLOWjCREATURE:FISH_RAY_THORNBACK:FATj"CREATURE:FISH_RAY_THORNBACK:TALLOWj!CREATURE:FISH_RATFISH_SPOTTED:FATj$CREATURE:FISH_RATFISH_SPOTTED:TALLOWjCREATURE:FISH_HERRING:FATjCREATURE:FISH_HERRING:TALLOWjCREATURE:FISH_SHAD:FATjCREATURE:FISH_SHAD:TALLOWjCREATURE:FISH_ANCHOVY:FATjCREATURE:FISH_ANCHOVY:TALLOWj!CREATURE:FISH_TROUT_STEELHEAD:FATj$CREATURE:FISH_TROUT_STEELHEAD:TALLOWjCREATURE:FISH_HAKE:FATjCREATURE:FISH_HAKE:TALLOWjCREATURE:FISH_SEAHORSE:FATjCREATURE:FISH_SEAHORSE:TALLOWjCREATURE:FISH_GLASSEYE:FATjCREATURE:FISH_GLASSEYE:TALLOWj&CREATURE:FISH_PUFFER_WHITE_SPOTTED:FATj)CREATURE:FISH_PUFFER_WHITE_SPOTTED:TALLOWjCREATURE:FISH_SOLE:FATjCREATURE:FISH_SOLE:TALLOWjCREATURE:FISH_FLOUNDER:FATjCREATURE:FISH_FLOUNDER:TALLOWjCREATURE:FISH_MACKEREL:FATjCREATURE:FISH_MACKEREL:TALLOWj!CREATURE:JELLYFISH_SEA_NETTLE:FATj$CREATURE:JELLYFISH_SEA_NETTLE:TALLOWjCREATURE:SQUID:FATjCREATURE:SQUID:TALLOWjCREATURE:SQUID MAN:FATjCREATURE:SQUID MAN:TALLOWjCREATURE:GIGANTIC SQUID:FATjCREATURE:GIGANTIC SQUID:TALLOWjCREATURE:FISH_LUNGFISH:FATjCREATURE:FISH_LUNGFISH:TALLOWjCREATURE:FISH_LOACH_CLOWN:FATj CREATURE:FISH_LOACH_CLOWN:TALLOWj CREATURE:FISH_BULLHEAD_BROWN:FATj#CREATURE:FISH_BULLHEAD_BROWN:TALLOWj!CREATURE:FISH_BULLHEAD_YELLOW:FATj$CREATURE:FISH_BULLHEAD_YELLOW:TALLOWj CREATURE:FISH_BULLHEAD_BLACK:FATj#CREATURE:FISH_BULLHEAD_BLACK:TALLOWj"CREATURE:FISH_KNIFEFISH_BANDED:FATj%CREATURE:FISH_KNIFEFISH_BANDED:TALLOWjCREATURE:FISH_CHAR:FATjCREATURE:FISH_CHAR:TALLOWjCREATURE:FISH_TROUT_RAINBOW:FATj"CREATURE:FISH_TROUT_RAINBOW:TALLOWjCREATURE:FISH_MOLLY_SAILFIN:FATj"CREATURE:FISH_MOLLY_SAILFIN:TALLOWjCREATURE:FISH_GUPPY:FATjCREATURE:FISH_GUPPY:TALLOWjCREATURE:FISH_PERCH:FATjCREATURE:FISH_PERCH:TALLOWjCREATURE:DWARF:FATjCREATURE:DWARF:TALLOWjCREATURE:HUMAN:FATjCREATURE:HUMAN:TALLOWjCREATURE:ELF:FATjCREATURE:ELF:TALLOWjCREATURE:GOBLIN:FATjCREATURE:GOBLIN:TALLOWjCREATURE:KOBOLD:FATjCREATURE:KOBOLD:TALLOWjCREATURE:GREMLIN:FATjCREATURE:GREMLIN:TALLOWjCREATURE:TROLL:FATjCREATURE:TROLL:TALLOWjCREATURE:OGRE:FATjCREATURE:OGRE:TALLOWjCREATURE:UNICORN:FATjCREATURE:UNICORN:TALLOWjCREATURE:DRAGON:FATjCREATURE:DRAGON:TALLOWjCREATURE:SATYR:FATjCREATURE:SATYR:TALLOWjCREATURE:GIANT:FATjCREATURE:GIANT:TALLOWjCREATURE:CYCLOPS:FATjCREATURE:CYCLOPS:TALLOWjCREATURE:ETTIN:FATjCREATURE:ETTIN:TALLOWjCREATURE:MINOTAUR:FATjCREATURE:MINOTAUR:TALLOWjCREATURE:YETI:FATjCREATURE:YETI:TALLOWjCREATURE:SASQUATCH:FATjCREATURE:SASQUATCH:TALLOWjCREATURE:BLIZZARD_MAN:FATjCREATURE:BLIZZARD_MAN:TALLOWjCREATURE:WOLF_ICE:FATjCREATURE:WOLF_ICE:TALLOWjCREATURE:FAIRY:FATjCREATURE:FAIRY:TALLOWjCREATURE:PIXIE:FATjCREATURE:PIXIE:TALLOWjCREATURE:BEAK_DOG:FATjCREATURE:BEAK_DOG:TALLOWjCREATURE:GRIMELING:FATjCREATURE:GRIMELING:TALLOWjCREATURE:BLENDEC_FOUL:FATjCREATURE:BLENDEC_FOUL:TALLOWjCREATURE:STRANGLER:FATjCREATURE:STRANGLER:TALLOWjCREATURE:NIGHTWING:FATjCREATURE:NIGHTWING:TALLOWjCREATURE:HARPY:FATjCREATURE:HARPY:TALLOWjCREATURE:HYDRA:FATjCREATURE:HYDRA:TALLOWjCREATURE:MERPERSON:FATjCREATURE:MERPERSON:TALLOWjCREATURE:SEA_SERPENT:FATjCREATURE:SEA_SERPENT:TALLOWjCREATURE:SEA_MONSTER:FATjCREATURE:SEA_MONSTER:TALLOWjCREATURE:BIRD_ROC:FATjCREATURE:BIRD_ROC:TALLOWjCREATURE:CROCODILE_CAVE:FATjCREATURE:CROCODILE_CAVE:TALLOWjCREATURE:TOAD_GIANT_CAVE:FATjCREATURE:TOAD_GIANT_CAVE:TALLOWjCREATURE:OLM_GIANT:FATjCREATURE:OLM_GIANT:TALLOWjCREATURE:BAT_GIANT:FATjCREATURE:BAT_GIANT:TALLOWjCREATURE:RAT_GIANT:FATjCREATURE:RAT_GIANT:TALLOWjCREATURE:RAT_LARGE:FATjCREATURE:RAT_LARGE:TALLOWjCREATURE:MOLE_DOG_NAKED:FATjCREATURE:MOLE_DOG_NAKED:TALLOWjCREATURE:TROGLODYTE:FATjCREATURE:TROGLODYTE:TALLOWjCREATURE:MOLE_GIANT:FATjCREATURE:MOLE_GIANT:TALLOWjCREATURE:IMP_FIRE:FATjCREATURE:IMP_FIRE:TALLOWjCREATURE:SPIDER_CAVE_GIANT:FATj!CREATURE:SPIDER_CAVE_GIANT:TALLOWjCREATURE:SPIDER_CAVE:FATjCREATURE:SPIDER_CAVE:TALLOWjCREATURE:FISH_CAVE:FATjCREATURE:FISH_CAVE:TALLOWjCREATURE:CAVE_FISH_MAN:FATjCREATURE:CAVE_FISH_MAN:TALLOWjCREATURE:LOBSTER_CAVE:FATjCREATURE:LOBSTER_CAVE:TALLOWjCREATURE:OLM:FATjCREATURE:OLM:TALLOWjCREATURE:OLM_MAN:FATjCREATURE:OLM_MAN:TALLOWjCREATURE:BAT:FATjCREATURE:BAT:TALLOWjCREATURE:BAT_MAN:FATjCREATURE:BAT_MAN:TALLOWjCREATURE:MAGGOT_PURRING:FATjCREATURE:MAGGOT_PURRING:TALLOWjCREATURE:BIRD_SWALLOW_CAVE:FATj!CREATURE:BIRD_SWALLOW_CAVE:TALLOWjCREATURE:CAVE_SWALLOW_MAN:FATj CREATURE:CAVE_SWALLOW_MAN:TALLOWj$CREATURE:BIRD_SWALLOW_CAVE_GIANT:FATj'CREATURE:BIRD_SWALLOW_CAVE_GIANT:TALLOWjCREATURE:AMPHIBIAN_MAN:FATjCREATURE:AMPHIBIAN_MAN:TALLOWjCREATURE:REPTILE_MAN:FATjCREATURE:REPTILE_MAN:TALLOWjCREATURE:SERPENT_MAN:FATjCREATURE:SERPENT_MAN:TALLOWjCREATURE:ANT_MAN:FATjCREATURE:ANT_MAN:TALLOWjCREATURE:RODENT MAN:FATjCREATURE:RODENT MAN:TALLOWjCREATURE:WILD_BOAR:FATjCREATURE:WILD_BOAR:TALLOWjCREATURE:WILD_BOAR_MAN:FATjCREATURE:WILD_BOAR_MAN:TALLOWjCREATURE:GIANT_WILD_BOAR:FATjCREATURE:GIANT_WILD_BOAR:TALLOWjCREATURE:COYOTE:FATjCREATURE:COYOTE:TALLOWjCREATURE:COYOTE_MAN:FATjCREATURE:COYOTE_MAN:TALLOWjCREATURE:GIANT_COYOTE:FATjCREATURE:GIANT_COYOTE:TALLOWjCREATURE:KANGAROO:FATjCREATURE:KANGAROO:TALLOWjCREATURE:KANGAROO_MAN:FATjCREATURE:KANGAROO_MAN:TALLOWjCREATURE:GIANT_KANGAROO:FATjCREATURE:GIANT_KANGAROO:TALLOWjCREATURE:KOALA:FATjCREATURE:KOALA:TALLOWjCREATURE:KOALA_MAN:FATjCREATURE:KOALA_MAN:TALLOWjCREATURE:GIANT_KOALA:FATjCREATURE:GIANT_KOALA:TALLOWjCREATURE:ADDER:FATjCREATURE:ADDER:TALLOWjCREATURE:ADDER_MAN:FATjCREATURE:ADDER_MAN:TALLOWjCREATURE:GIANT_ADDER:FATjCREATURE:GIANT_ADDER:TALLOWjCREATURE:ECHIDNA:FATjCREATURE:ECHIDNA:TALLOWjCREATURE:ECHIDNA_MAN:FATjCREATURE:ECHIDNA_MAN:TALLOWjCREATURE:GIANT_ECHIDNA:FATjCREATURE:GIANT_ECHIDNA:TALLOWjCREATURE:PORCUPINE:FATjCREATURE:PORCUPINE:TALLOWjCREATURE:PORCUPINE_MAN:FATjCREATURE:PORCUPINE_MAN:TALLOWjCREATURE:GIANT_PORCUPINE:FATjCREATURE:GIANT_PORCUPINE:TALLOWjCREATURE:KINGSNAKE:FATjCREATURE:KINGSNAKE:TALLOWjCREATURE:KINGSNAKE_MAN:FATjCREATURE:KINGSNAKE_MAN:TALLOWjCREATURE:GIANT_KINGSNAKE:FATjCREATURE:GIANT_KINGSNAKE:TALLOWjCREATURE:GRAY_LANGUR:FATjCREATURE:GRAY_LANGUR:TALLOWjCREATURE:GRAY_LANGUR_MAN:FATjCREATURE:GRAY_LANGUR_MAN:TALLOWjCREATURE:GIANT_GRAY_LANGUR:FATj!CREATURE:GIANT_GRAY_LANGUR:TALLOWjCREATURE:BOBCAT:FATjCREATURE:BOBCAT:TALLOWjCREATURE:BOBCAT_MAN:FATjCREATURE:BOBCAT_MAN:TALLOWjCREATURE:GIANT_BOBCAT:FATjCREATURE:GIANT_BOBCAT:TALLOWjCREATURE:SKUNK:FATjCREATURE:SKUNK:TALLOWjCREATURE:SKUNK_MAN:FATjCREATURE:SKUNK_MAN:TALLOWjCREATURE:GIANT_SKUNK:FATjCREATURE:GIANT_SKUNK:TALLOWjCREATURE:GREEN_TREE_FROG:FATjCREATURE:GREEN_TREE_FROG:TALLOWj CREATURE:GREEN_TREE_FROG_MAN:FATj#CREATURE:GREEN_TREE_FROG_MAN:TALLOWj"CREATURE:GIANT_GREEN_TREE_FROG:FATj%CREATURE:GIANT_GREEN_TREE_FROG:TALLOWjCREATURE:HARE:FATjCREATURE:HARE:TALLOWjCREATURE:HARE_MAN:FATjCREATURE:HARE_MAN:TALLOWjCREATURE:GIANT_HARE:FATjCREATURE:GIANT_HARE:TALLOWjCREATURE:RATTLESNAKE:FATjCREATURE:RATTLESNAKE:TALLOWjCREATURE:RATTLESNAKE_MAN:FATjCREATURE:RATTLESNAKE_MAN:TALLOWjCREATURE:GIANT_RATTLESNAKE:FATj!CREATURE:GIANT_RATTLESNAKE:TALLOWjCREATURE:WEASEL:FATjCREATURE:WEASEL:TALLOWjCREATURE:WEASEL_MAN:FATjCREATURE:WEASEL_MAN:TALLOWjCREATURE:GIANT_WEASEL:FATjCREATURE:GIANT_WEASEL:TALLOWjCREATURE:COPPERHEAD_SNAKE:FATj CREATURE:COPPERHEAD_SNAKE:TALLOWj!CREATURE:COPPERHEAD_SNAKE_MAN:FATj$CREATURE:COPPERHEAD_SNAKE_MAN:TALLOWj#CREATURE:GIANT_COPPERHEAD_SNAKE:FATj&CREATURE:GIANT_COPPERHEAD_SNAKE:TALLOWjCREATURE:IBEX:FATjCREATURE:IBEX:TALLOWjCREATURE:IBEX_MAN:FATjCREATURE:IBEX_MAN:TALLOWjCREATURE:GIANT_IBEX:FATjCREATURE:GIANT_IBEX:TALLOWjCREATURE:WOMBAT:FATjCREATURE:WOMBAT:TALLOWjCREATURE:WOMBAT_MAN:FATjCREATURE:WOMBAT_MAN:TALLOWjCREATURE:GIANT_WOMBAT:FATjCREATURE:GIANT_WOMBAT:TALLOWjCREATURE:DINGO:FATjCREATURE:DINGO:TALLOWjCREATURE:DINGO_MAN:FATjCREATURE:DINGO_MAN:TALLOWjCREATURE:GIANT_DINGO:FATjCREATURE:GIANT_DINGO:TALLOWjCREATURE:COATI:FATjCREATURE:COATI:TALLOWjCREATURE:COATI_MAN:FATjCREATURE:COATI_MAN:TALLOWjCREATURE:GIANT_COATI:FATjCREATURE:GIANT_COATI:TALLOWjCREATURE:OPOSSUM:FATjCREATURE:OPOSSUM:TALLOWjCREATURE:OPOSSUM_MAN:FATjCREATURE:OPOSSUM_MAN:TALLOWjCREATURE:GIANT_OPOSSUM:FATjCREATURE:GIANT_OPOSSUM:TALLOWjCREATURE:MONGOOSE:FATjCREATURE:MONGOOSE:TALLOWjCREATURE:MONGOOSE_MAN:FATjCREATURE:MONGOOSE_MAN:TALLOWjCREATURE:GIANT_MONGOOSE:FATjCREATURE:GIANT_MONGOOSE:TALLOWjCREATURE:HYENA:FATjCREATURE:HYENA:TALLOWjCREATURE:HYENA_MAN:FATjCREATURE:HYENA_MAN:TALLOWjCREATURE:GIANT_HYENA:FATjCREATURE:GIANT_HYENA:TALLOWjCREATURE:ANACONDA:FATjCREATURE:ANACONDA:TALLOWjCREATURE:ANACONDA_MAN:FATjCREATURE:ANACONDA_MAN:TALLOWjCREATURE:GIANT_ANACONDA:FATjCREATURE:GIANT_ANACONDA:TALLOWjCREATURE:MONITOR_LIZARD:FATjCREATURE:MONITOR_LIZARD:TALLOWjCREATURE:MONITOR_LIZARD_MAN:FATj"CREATURE:MONITOR_LIZARD_MAN:TALLOWj!CREATURE:GIANT_MONITOR_LIZARD:FATj$CREATURE:GIANT_MONITOR_LIZARD:TALLOWjCREATURE:KING_COBRA:FATjCREATURE:KING_COBRA:TALLOWjCREATURE:KING_COBRA_MAN:FATjCREATURE:KING_COBRA_MAN:TALLOWjCREATURE:GIANT_KING_COBRA:FATj CREATURE:GIANT_KING_COBRA:TALLOWjCREATURE:OCELOT:FATjCREATURE:OCELOT:TALLOWjCREATURE:OCELOT_MAN:FATjCREATURE:OCELOT_MAN:TALLOWjCREATURE:GIANT_OCELOT:FATjCREATURE:GIANT_OCELOT:TALLOWjCREATURE:JACKAL:FATjCREATURE:JACKAL:TALLOWjCREATURE:JACKAL_MAN:FATjCREATURE:JACKAL_MAN:TALLOWjCREATURE:GIANT_JACKAL:FATjCREATURE:GIANT_JACKAL:TALLOWjCREATURE:CAPUCHIN:FATjCREATURE:CAPUCHIN:TALLOWjCREATURE:CAPUCHIN_MAN:FATjCREATURE:CAPUCHIN_MAN:TALLOWjCREATURE:GIANT_CAPUCHIN:FATjCREATURE:GIANT_CAPUCHIN:TALLOWjCREATURE:SLOTH:FATjCREATURE:SLOTH:TALLOWjCREATURE:SLOTH_MAN:FATjCREATURE:SLOTH_MAN:TALLOWjCREATURE:GIANT_SLOTH:FATjCREATURE:GIANT_SLOTH:TALLOWjCREATURE:SPIDER_MONKEY:FATjCREATURE:SPIDER_MONKEY:TALLOWjCREATURE:SPIDER_MONKEY_MAN:FATj!CREATURE:SPIDER_MONKEY_MAN:TALLOWj CREATURE:GIANT_SPIDER_MONKEY:FATj#CREATURE:GIANT_SPIDER_MONKEY:TALLOWjCREATURE:PANGOLIN:FATjCREATURE:PANGOLIN:TALLOWjCREATURE:PANGOLIN_MAN:FATjCREATURE:PANGOLIN_MAN:TALLOWjCREATURE:GIANT_PANGOLIN:FATjCREATURE:GIANT_PANGOLIN:TALLOWjCREATURE:BLACK_MAMBA:FATjCREATURE:BLACK_MAMBA:TALLOWjCREATURE:BLACK_MAMBA_MAN:FATjCREATURE:BLACK_MAMBA_MAN:TALLOWjCREATURE:GIANT_BLACK_MAMBA:FATj!CREATURE:GIANT_BLACK_MAMBA:TALLOWjCREATURE:BEAR_SLOTH:FATjCREATURE:BEAR_SLOTH:TALLOWjCREATURE:SLOTH_BEAR_MAN:FATjCREATURE:SLOTH_BEAR_MAN:TALLOWjCREATURE:GIANT_SLOTH_BEAR:FATj CREATURE:GIANT_SLOTH_BEAR:TALLOWjCREATURE:AYE-AYE:FATjCREATURE:AYE-AYE:TALLOWjCREATURE:AYE-AYE_MAN:FATjCREATURE:AYE-AYE_MAN:TALLOWjCREATURE:GIANT_AYE-AYE:FATjCREATURE:GIANT_AYE-AYE:TALLOWjCREATURE:BUSHMASTER:FATjCREATURE:BUSHMASTER:TALLOWjCREATURE:BUSHMASTER_MAN:FATjCREATURE:BUSHMASTER_MAN:TALLOWjCREATURE:GIANT_BUSHMASTER:FATj CREATURE:GIANT_BUSHMASTER:TALLOWjCREATURE:PYTHON:FATjCREATURE:PYTHON:TALLOWjCREATURE:PYTHON_MAN:FATjCREATURE:PYTHON_MAN:TALLOWjCREATURE:GIANT_PYTHON:FATjCREATURE:GIANT_PYTHON:TALLOWjCREATURE:TAPIR:FATjCREATURE:TAPIR:TALLOWjCREATURE:TAPIR_MAN:FATjCREATURE:TAPIR_MAN:TALLOWjCREATURE:GIANT_TAPIR:FATjCREATURE:GIANT_TAPIR:TALLOWjCREATURE:IMPALA:FATjCREATURE:IMPALA:TALLOWjCREATURE:IMPALA_MAN:FATjCREATURE:IMPALA_MAN:TALLOWjCREATURE:GIANT_IMPALA:FATjCREATURE:GIANT_IMPALA:TALLOWjCREATURE:AARDVARK:FATjCREATURE:AARDVARK:TALLOWjCREATURE:AARDVARK_MAN:FATjCREATURE:AARDVARK_MAN:TALLOWjCREATURE:GIANT_AARDVARK:FATjCREATURE:GIANT_AARDVARK:TALLOWjCREATURE:LION_TAMARIN:FATjCREATURE:LION_TAMARIN:TALLOWjCREATURE:LION_TAMARIN_MAN:FATj CREATURE:LION_TAMARIN_MAN:TALLOWjCREATURE:GIANT_LION_TAMARIN:FATj"CREATURE:GIANT_LION_TAMARIN:TALLOWjCREATURE:STOAT:FATjCREATURE:STOAT:TALLOWjCREATURE:STOAT_MAN:FATjCREATURE:STOAT_MAN:TALLOWjCREATURE:GIANT_STOAT:FATjCREATURE:GIANT_STOAT:TALLOWjCREATURE:LYNX:FATjCREATURE:LYNX:TALLOWjCREATURE:LYNX_MAN:FATjCREATURE:LYNX_MAN:TALLOWjCREATURE:GIANT_LYNX:FATjCREATURE:GIANT_LYNX:TALLOWjCREATURE:GNOLL:FATjCREATURE:GNOLL:TALLOWjCREATURE:NAGA:FATjCREATURE:NAGA:TALLOWjCREATURE:FORGOTTEN_BEAST_2:FATj!CREATURE:FORGOTTEN_BEAST_2:TALLOWjCREATURE:FORGOTTEN_BEAST_4:FATj!CREATURE:FORGOTTEN_BEAST_4:TALLOWjCREATURE:FORGOTTEN_BEAST_5:FATj!CREATURE:FORGOTTEN_BEAST_5:TALLOWjCREATURE:FORGOTTEN_BEAST_6:FATj!CREATURE:FORGOTTEN_BEAST_6:TALLOWjCREATURE:FORGOTTEN_BEAST_7:FATj!CREATURE:FORGOTTEN_BEAST_7:TALLOWjCREATURE:FORGOTTEN_BEAST_10:FATj"CREATURE:FORGOTTEN_BEAST_10:TALLOWjCREATURE:FORGOTTEN_BEAST_12:FATj"CREATURE:FORGOTTEN_BEAST_12:TALLOWjCREATURE:FORGOTTEN_BEAST_13:FATj"CREATURE:FORGOTTEN_BEAST_13:TALLOWjCREATURE:FORGOTTEN_BEAST_16:FATj"CREATURE:FORGOTTEN_BEAST_16:TALLOWjCREATURE:FORGOTTEN_BEAST_17:FATj"CREATURE:FORGOTTEN_BEAST_17:TALLOWjCREATURE:FORGOTTEN_BEAST_18:FATj"CREATURE:FORGOTTEN_BEAST_18:TALLOWjCREATURE:FORGOTTEN_BEAST_19:FATj"CREATURE:FORGOTTEN_BEAST_19:TALLOWjCREATURE:FORGOTTEN_BEAST_20:FATj"CREATURE:FORGOTTEN_BEAST_20:TALLOWjCREATURE:FORGOTTEN_BEAST_22:FATj"CREATURE:FORGOTTEN_BEAST_22:TALLOWjCREATURE:FORGOTTEN_BEAST_23:FATj"CREATURE:FORGOTTEN_BEAST_23:TALLOWjCREATURE:FORGOTTEN_BEAST_24:FATj"CREATURE:FORGOTTEN_BEAST_24:TALLOWjCREATURE:FORGOTTEN_BEAST_25:FATj"CREATURE:FORGOTTEN_BEAST_25:TALLOWjCREATURE:FORGOTTEN_BEAST_26:FATj"CREATURE:FORGOTTEN_BEAST_26:TALLOWjCREATURE:FORGOTTEN_BEAST_27:FATj"CREATURE:FORGOTTEN_BEAST_27:TALLOWjCREATURE:FORGOTTEN_BEAST_28:FATj"CREATURE:FORGOTTEN_BEAST_28:TALLOWjCREATURE:FORGOTTEN_BEAST_29:FATj"CREATURE:FORGOTTEN_BEAST_29:TALLOWjCREATURE:FORGOTTEN_BEAST_32:FATj"CREATURE:FORGOTTEN_BEAST_32:TALLOWjCREATURE:FORGOTTEN_BEAST_33:FATj"CREATURE:FORGOTTEN_BEAST_33:TALLOWjCREATURE:FORGOTTEN_BEAST_34:FATj"CREATURE:FORGOTTEN_BEAST_34:TALLOWjCREATURE:FORGOTTEN_BEAST_35:FATj"CREATURE:FORGOTTEN_BEAST_35:TALLOWjCREATURE:FORGOTTEN_BEAST_36:FATj"CREATURE:FORGOTTEN_BEAST_36:TALLOWjCREATURE:FORGOTTEN_BEAST_39:FATj"CREATURE:FORGOTTEN_BEAST_39:TALLOWjCREATURE:FORGOTTEN_BEAST_41:FATj"CREATURE:FORGOTTEN_BEAST_41:TALLOWjCREATURE:FORGOTTEN_BEAST_42:FATj"CREATURE:FORGOTTEN_BEAST_42:TALLOWjCREATURE:FORGOTTEN_BEAST_43:FATj"CREATURE:FORGOTTEN_BEAST_43:TALLOWjCREATURE:FORGOTTEN_BEAST_44:FATj"CREATURE:FORGOTTEN_BEAST_44:TALLOWjCREATURE:FORGOTTEN_BEAST_45:FATj"CREATURE:FORGOTTEN_BEAST_45:TALLOWjCREATURE:FORGOTTEN_BEAST_47:FATj"CREATURE:FORGOTTEN_BEAST_47:TALLOWjCREATURE:FORGOTTEN_BEAST_50:FATj"CREATURE:FORGOTTEN_BEAST_50:TALLOWjCREATURE:FORGOTTEN_BEAST_52:FATj"CREATURE:FORGOTTEN_BEAST_52:TALLOWjCREATURE:FORGOTTEN_BEAST_53:FATj"CREATURE:FORGOTTEN_BEAST_53:TALLOWjCREATURE:FORGOTTEN_BEAST_55:FATj"CREATURE:FORGOTTEN_BEAST_55:TALLOWjCREATURE:FORGOTTEN_BEAST_56:FATj"CREATURE:FORGOTTEN_BEAST_56:TALLOWjCREATURE:FORGOTTEN_BEAST_58:FATj"CREATURE:FORGOTTEN_BEAST_58:TALLOWjCREATURE:FORGOTTEN_BEAST_59:FATj"CREATURE:FORGOTTEN_BEAST_59:TALLOWjCREATURE:FORGOTTEN_BEAST_60:FATj"CREATURE:FORGOTTEN_BEAST_60:TALLOWjCREATURE:FORGOTTEN_BEAST_61:FATj"CREATURE:FORGOTTEN_BEAST_61:TALLOWjCREATURE:FORGOTTEN_BEAST_64:FATj"CREATURE:FORGOTTEN_BEAST_64:TALLOWjCREATURE:FORGOTTEN_BEAST_66:FATj"CREATURE:FORGOTTEN_BEAST_66:TALLOWjCREATURE:FORGOTTEN_BEAST_67:FATj"CREATURE:FORGOTTEN_BEAST_67:TALLOWjCREATURE:FORGOTTEN_BEAST_69:FATj"CREATURE:FORGOTTEN_BEAST_69:TALLOWjCREATURE:FORGOTTEN_BEAST_71:FATj"CREATURE:FORGOTTEN_BEAST_71:TALLOWjCREATURE:FORGOTTEN_BEAST_72:FATj"CREATURE:FORGOTTEN_BEAST_72:TALLOWjCREATURE:FORGOTTEN_BEAST_73:FATj"CREATURE:FORGOTTEN_BEAST_73:TALLOWjCREATURE:FORGOTTEN_BEAST_74:FATj"CREATURE:FORGOTTEN_BEAST_74:TALLOWjCREATURE:FORGOTTEN_BEAST_75:FATj"CREATURE:FORGOTTEN_BEAST_75:TALLOWjCREATURE:FORGOTTEN_BEAST_78:FATj"CREATURE:FORGOTTEN_BEAST_78:TALLOWjCREATURE:FORGOTTEN_BEAST_80:FATj"CREATURE:FORGOTTEN_BEAST_80:TALLOWjCREATURE:FORGOTTEN_BEAST_81:FATj"CREATURE:FORGOTTEN_BEAST_81:TALLOWjCREATURE:FORGOTTEN_BEAST_82:FATj"CREATURE:FORGOTTEN_BEAST_82:TALLOWjCREATURE:FORGOTTEN_BEAST_83:FATj"CREATURE:FORGOTTEN_BEAST_83:TALLOWjCREATURE:FORGOTTEN_BEAST_84:FATj"CREATURE:FORGOTTEN_BEAST_84:TALLOWjCREATURE:FORGOTTEN_BEAST_86:FATj"CREATURE:FORGOTTEN_BEAST_86:TALLOWjCREATURE:FORGOTTEN_BEAST_87:FATj"CREATURE:FORGOTTEN_BEAST_87:TALLOWjCREATURE:FORGOTTEN_BEAST_89:FATj"CREATURE:FORGOTTEN_BEAST_89:TALLOWjCREATURE:FORGOTTEN_BEAST_90:FATj"CREATURE:FORGOTTEN_BEAST_90:TALLOWjCREATURE:FORGOTTEN_BEAST_92:FATj"CREATURE:FORGOTTEN_BEAST_92:TALLOWjCREATURE:FORGOTTEN_BEAST_94:FATj"CREATURE:FORGOTTEN_BEAST_94:TALLOWjCREATURE:FORGOTTEN_BEAST_95:FATj"CREATURE:FORGOTTEN_BEAST_95:TALLOWjCREATURE:FORGOTTEN_BEAST_96:FATj"CREATURE:FORGOTTEN_BEAST_96:TALLOWjCREATURE:FORGOTTEN_BEAST_97:FATj"CREATURE:FORGOTTEN_BEAST_97:TALLOWjCREATURE:FORGOTTEN_BEAST_98:FATj"CREATURE:FORGOTTEN_BEAST_98:TALLOWj CREATURE:FORGOTTEN_BEAST_100:FATj#CREATURE:FORGOTTEN_BEAST_100:TALLOWj CREATURE:FORGOTTEN_BEAST_105:FATj#CREATURE:FORGOTTEN_BEAST_105:TALLOWj CREATURE:FORGOTTEN_BEAST_106:FATj#CREATURE:FORGOTTEN_BEAST_106:TALLOWj CREATURE:FORGOTTEN_BEAST_107:FATj#CREATURE:FORGOTTEN_BEAST_107:TALLOWj CREATURE:FORGOTTEN_BEAST_108:FATj#CREATURE:FORGOTTEN_BEAST_108:TALLOWj CREATURE:FORGOTTEN_BEAST_109:FATj#CREATURE:FORGOTTEN_BEAST_109:TALLOWj CREATURE:FORGOTTEN_BEAST_111:FATj#CREATURE:FORGOTTEN_BEAST_111:TALLOWj CREATURE:FORGOTTEN_BEAST_112:FATj#CREATURE:FORGOTTEN_BEAST_112:TALLOWj CREATURE:FORGOTTEN_BEAST_113:FATj#CREATURE:FORGOTTEN_BEAST_113:TALLOWj CREATURE:FORGOTTEN_BEAST_114:FATj#CREATURE:FORGOTTEN_BEAST_114:TALLOWj CREATURE:FORGOTTEN_BEAST_115:FATj#CREATURE:FORGOTTEN_BEAST_115:TALLOWj CREATURE:FORGOTTEN_BEAST_116:FATj#CREATURE:FORGOTTEN_BEAST_116:TALLOWj CREATURE:FORGOTTEN_BEAST_117:FATj#CREATURE:FORGOTTEN_BEAST_117:TALLOWj CREATURE:FORGOTTEN_BEAST_118:FATj#CREATURE:FORGOTTEN_BEAST_118:TALLOWj CREATURE:FORGOTTEN_BEAST_119:FATj#CREATURE:FORGOTTEN_BEAST_119:TALLOWj CREATURE:FORGOTTEN_BEAST_120:FATj#CREATURE:FORGOTTEN_BEAST_120:TALLOWj CREATURE:FORGOTTEN_BEAST_122:FATj#CREATURE:FORGOTTEN_BEAST_122:TALLOWj CREATURE:FORGOTTEN_BEAST_123:FATj#CREATURE:FORGOTTEN_BEAST_123:TALLOWj CREATURE:FORGOTTEN_BEAST_124:FATj#CREATURE:FORGOTTEN_BEAST_124:TALLOWj CREATURE:FORGOTTEN_BEAST_125:FATj#CREATURE:FORGOTTEN_BEAST_125:TALLOWj CREATURE:FORGOTTEN_BEAST_127:FATj#CREATURE:FORGOTTEN_BEAST_127:TALLOWj CREATURE:FORGOTTEN_BEAST_128:FATj#CREATURE:FORGOTTEN_BEAST_128:TALLOWj CREATURE:FORGOTTEN_BEAST_130:FATj#CREATURE:FORGOTTEN_BEAST_130:TALLOWj CREATURE:FORGOTTEN_BEAST_131:FATj#CREATURE:FORGOTTEN_BEAST_131:TALLOWj CREATURE:FORGOTTEN_BEAST_132:FATj#CREATURE:FORGOTTEN_BEAST_132:TALLOWj CREATURE:FORGOTTEN_BEAST_133:FATj#CREATURE:FORGOTTEN_BEAST_133:TALLOWj CREATURE:FORGOTTEN_BEAST_134:FATj#CREATURE:FORGOTTEN_BEAST_134:TALLOWj CREATURE:FORGOTTEN_BEAST_135:FATj#CREATURE:FORGOTTEN_BEAST_135:TALLOWj CREATURE:FORGOTTEN_BEAST_137:FATj#CREATURE:FORGOTTEN_BEAST_137:TALLOWj CREATURE:FORGOTTEN_BEAST_138:FATj#CREATURE:FORGOTTEN_BEAST_138:TALLOWj CREATURE:FORGOTTEN_BEAST_139:FATj#CREATURE:FORGOTTEN_BEAST_139:TALLOWj CREATURE:FORGOTTEN_BEAST_141:FATj#CREATURE:FORGOTTEN_BEAST_141:TALLOWj CREATURE:FORGOTTEN_BEAST_142:FATj#CREATURE:FORGOTTEN_BEAST_142:TALLOWj CREATURE:FORGOTTEN_BEAST_144:FATj#CREATURE:FORGOTTEN_BEAST_144:TALLOWj CREATURE:FORGOTTEN_BEAST_146:FATj#CREATURE:FORGOTTEN_BEAST_146:TALLOWj CREATURE:FORGOTTEN_BEAST_148:FATj#CREATURE:FORGOTTEN_BEAST_148:TALLOWj CREATURE:FORGOTTEN_BEAST_149:FATj#CREATURE:FORGOTTEN_BEAST_149:TALLOWj CREATURE:FORGOTTEN_BEAST_150:FATj#CREATURE:FORGOTTEN_BEAST_150:TALLOWj CREATURE:FORGOTTEN_BEAST_152:FATj#CREATURE:FORGOTTEN_BEAST_152:TALLOWj CREATURE:FORGOTTEN_BEAST_154:FATj#CREATURE:FORGOTTEN_BEAST_154:TALLOWj CREATURE:FORGOTTEN_BEAST_156:FATj#CREATURE:FORGOTTEN_BEAST_156:TALLOWj CREATURE:FORGOTTEN_BEAST_157:FATj#CREATURE:FORGOTTEN_BEAST_157:TALLOWj CREATURE:FORGOTTEN_BEAST_158:FATj#CREATURE:FORGOTTEN_BEAST_158:TALLOWj CREATURE:FORGOTTEN_BEAST_159:FATj#CREATURE:FORGOTTEN_BEAST_159:TALLOWj CREATURE:FORGOTTEN_BEAST_161:FATj#CREATURE:FORGOTTEN_BEAST_161:TALLOWj CREATURE:FORGOTTEN_BEAST_162:FATj#CREATURE:FORGOTTEN_BEAST_162:TALLOWj CREATURE:FORGOTTEN_BEAST_163:FATj#CREATURE:FORGOTTEN_BEAST_163:TALLOWj CREATURE:FORGOTTEN_BEAST_165:FATj#CREATURE:FORGOTTEN_BEAST_165:TALLOWj CREATURE:FORGOTTEN_BEAST_167:FATj#CREATURE:FORGOTTEN_BEAST_167:TALLOWj CREATURE:FORGOTTEN_BEAST_168:FATj#CREATURE:FORGOTTEN_BEAST_168:TALLOWj CREATURE:FORGOTTEN_BEAST_169:FATj#CREATURE:FORGOTTEN_BEAST_169:TALLOWj CREATURE:FORGOTTEN_BEAST_170:FATj#CREATURE:FORGOTTEN_BEAST_170:TALLOWj CREATURE:FORGOTTEN_BEAST_171:FATj#CREATURE:FORGOTTEN_BEAST_171:TALLOWj CREATURE:FORGOTTEN_BEAST_172:FATj#CREATURE:FORGOTTEN_BEAST_172:TALLOWj CREATURE:FORGOTTEN_BEAST_173:FATj#CREATURE:FORGOTTEN_BEAST_173:TALLOWj CREATURE:FORGOTTEN_BEAST_176:FATj#CREATURE:FORGOTTEN_BEAST_176:TALLOWj CREATURE:FORGOTTEN_BEAST_177:FATj#CREATURE:FORGOTTEN_BEAST_177:TALLOWj CREATURE:FORGOTTEN_BEAST_178:FATj#CREATURE:FORGOTTEN_BEAST_178:TALLOWj CREATURE:FORGOTTEN_BEAST_179:FATj#CREATURE:FORGOTTEN_BEAST_179:TALLOWj CREATURE:FORGOTTEN_BEAST_180:FATj#CREATURE:FORGOTTEN_BEAST_180:TALLOWj CREATURE:FORGOTTEN_BEAST_181:FATj#CREATURE:FORGOTTEN_BEAST_181:TALLOWj CREATURE:FORGOTTEN_BEAST_182:FATj#CREATURE:FORGOTTEN_BEAST_182:TALLOWj CREATURE:FORGOTTEN_BEAST_183:FATj#CREATURE:FORGOTTEN_BEAST_183:TALLOWj CREATURE:FORGOTTEN_BEAST_184:FATj#CREATURE:FORGOTTEN_BEAST_184:TALLOWj CREATURE:FORGOTTEN_BEAST_185:FATj#CREATURE:FORGOTTEN_BEAST_185:TALLOWj CREATURE:FORGOTTEN_BEAST_186:FATj#CREATURE:FORGOTTEN_BEAST_186:TALLOWj CREATURE:FORGOTTEN_BEAST_188:FATj#CREATURE:FORGOTTEN_BEAST_188:TALLOWj CREATURE:FORGOTTEN_BEAST_189:FATj#CREATURE:FORGOTTEN_BEAST_189:TALLOWj CREATURE:FORGOTTEN_BEAST_190:FATj#CREATURE:FORGOTTEN_BEAST_190:TALLOWj CREATURE:FORGOTTEN_BEAST_191:FATj#CREATURE:FORGOTTEN_BEAST_191:TALLOWj CREATURE:FORGOTTEN_BEAST_193:FATj#CREATURE:FORGOTTEN_BEAST_193:TALLOWj CREATURE:FORGOTTEN_BEAST_194:FATj#CREATURE:FORGOTTEN_BEAST_194:TALLOWj CREATURE:FORGOTTEN_BEAST_195:FATj#CREATURE:FORGOTTEN_BEAST_195:TALLOWj CREATURE:FORGOTTEN_BEAST_196:FATj#CREATURE:FORGOTTEN_BEAST_196:TALLOWj CREATURE:FORGOTTEN_BEAST_197:FATj#CREATURE:FORGOTTEN_BEAST_197:TALLOWj CREATURE:FORGOTTEN_BEAST_199:FATj#CREATURE:FORGOTTEN_BEAST_199:TALLOWj CREATURE:FORGOTTEN_BEAST_200:FATj#CREATURE:FORGOTTEN_BEAST_200:TALLOWj CREATURE:FORGOTTEN_BEAST_201:FATj#CREATURE:FORGOTTEN_BEAST_201:TALLOWj CREATURE:FORGOTTEN_BEAST_204:FATj#CREATURE:FORGOTTEN_BEAST_204:TALLOWj CREATURE:FORGOTTEN_BEAST_205:FATj#CREATURE:FORGOTTEN_BEAST_205:TALLOWj CREATURE:FORGOTTEN_BEAST_206:FATj#CREATURE:FORGOTTEN_BEAST_206:TALLOWj CREATURE:FORGOTTEN_BEAST_207:FATj#CREATURE:FORGOTTEN_BEAST_207:TALLOWj CREATURE:FORGOTTEN_BEAST_208:FATj#CREATURE:FORGOTTEN_BEAST_208:TALLOWj CREATURE:FORGOTTEN_BEAST_209:FATj#CREATURE:FORGOTTEN_BEAST_209:TALLOWj CREATURE:FORGOTTEN_BEAST_210:FATj#CREATURE:FORGOTTEN_BEAST_210:TALLOWj CREATURE:FORGOTTEN_BEAST_211:FATj#CREATURE:FORGOTTEN_BEAST_211:TALLOWj CREATURE:FORGOTTEN_BEAST_212:FATj#CREATURE:FORGOTTEN_BEAST_212:TALLOWj CREATURE:FORGOTTEN_BEAST_213:FATj#CREATURE:FORGOTTEN_BEAST_213:TALLOWj CREATURE:FORGOTTEN_BEAST_214:FATj#CREATURE:FORGOTTEN_BEAST_214:TALLOWj CREATURE:FORGOTTEN_BEAST_215:FATj#CREATURE:FORGOTTEN_BEAST_215:TALLOWj CREATURE:FORGOTTEN_BEAST_216:FATj#CREATURE:FORGOTTEN_BEAST_216:TALLOWj CREATURE:FORGOTTEN_BEAST_217:FATj#CREATURE:FORGOTTEN_BEAST_217:TALLOWj CREATURE:FORGOTTEN_BEAST_218:FATj#CREATURE:FORGOTTEN_BEAST_218:TALLOWj CREATURE:FORGOTTEN_BEAST_220:FATj#CREATURE:FORGOTTEN_BEAST_220:TALLOWj CREATURE:FORGOTTEN_BEAST_221:FATj#CREATURE:FORGOTTEN_BEAST_221:TALLOWj CREATURE:FORGOTTEN_BEAST_224:FATj#CREATURE:FORGOTTEN_BEAST_224:TALLOWj CREATURE:FORGOTTEN_BEAST_225:FATj#CREATURE:FORGOTTEN_BEAST_225:TALLOWj CREATURE:FORGOTTEN_BEAST_228:FATj#CREATURE:FORGOTTEN_BEAST_228:TALLOWj CREATURE:FORGOTTEN_BEAST_231:FATj#CREATURE:FORGOTTEN_BEAST_231:TALLOWj CREATURE:FORGOTTEN_BEAST_232:FATj#CREATURE:FORGOTTEN_BEAST_232:TALLOWj CREATURE:FORGOTTEN_BEAST_235:FATj#CREATURE:FORGOTTEN_BEAST_235:TALLOWj CREATURE:FORGOTTEN_BEAST_236:FATj#CREATURE:FORGOTTEN_BEAST_236:TALLOWj CREATURE:FORGOTTEN_BEAST_237:FATj#CREATURE:FORGOTTEN_BEAST_237:TALLOWj CREATURE:FORGOTTEN_BEAST_239:FATj#CREATURE:FORGOTTEN_BEAST_239:TALLOWj CREATURE:FORGOTTEN_BEAST_240:FATj#CREATURE:FORGOTTEN_BEAST_240:TALLOWj CREATURE:FORGOTTEN_BEAST_242:FATj#CREATURE:FORGOTTEN_BEAST_242:TALLOWj CREATURE:FORGOTTEN_BEAST_243:FATj#CREATURE:FORGOTTEN_BEAST_243:TALLOWj CREATURE:FORGOTTEN_BEAST_244:FATj#CREATURE:FORGOTTEN_BEAST_244:TALLOWj CREATURE:FORGOTTEN_BEAST_245:FATj#CREATURE:FORGOTTEN_BEAST_245:TALLOWj CREATURE:FORGOTTEN_BEAST_246:FATj#CREATURE:FORGOTTEN_BEAST_246:TALLOWj CREATURE:FORGOTTEN_BEAST_247:FATj#CREATURE:FORGOTTEN_BEAST_247:TALLOWj CREATURE:FORGOTTEN_BEAST_248:FATj#CREATURE:FORGOTTEN_BEAST_248:TALLOWj CREATURE:FORGOTTEN_BEAST_249:FATj#CREATURE:FORGOTTEN_BEAST_249:TALLOWj CREATURE:FORGOTTEN_BEAST_253:FATj#CREATURE:FORGOTTEN_BEAST_253:TALLOWj CREATURE:FORGOTTEN_BEAST_255:FATj#CREATURE:FORGOTTEN_BEAST_255:TALLOWj CREATURE:FORGOTTEN_BEAST_256:FATj#CREATURE:FORGOTTEN_BEAST_256:TALLOWj CREATURE:FORGOTTEN_BEAST_259:FATj#CREATURE:FORGOTTEN_BEAST_259:TALLOWj CREATURE:FORGOTTEN_BEAST_260:FATj#CREATURE:FORGOTTEN_BEAST_260:TALLOWj CREATURE:FORGOTTEN_BEAST_263:FATj#CREATURE:FORGOTTEN_BEAST_263:TALLOWj CREATURE:FORGOTTEN_BEAST_264:FATj#CREATURE:FORGOTTEN_BEAST_264:TALLOWj CREATURE:FORGOTTEN_BEAST_265:FATj#CREATURE:FORGOTTEN_BEAST_265:TALLOWj CREATURE:FORGOTTEN_BEAST_266:FATj#CREATURE:FORGOTTEN_BEAST_266:TALLOWj CREATURE:FORGOTTEN_BEAST_268:FATj#CREATURE:FORGOTTEN_BEAST_268:TALLOWj CREATURE:FORGOTTEN_BEAST_269:FATj#CREATURE:FORGOTTEN_BEAST_269:TALLOWj CREATURE:FORGOTTEN_BEAST_270:FATj#CREATURE:FORGOTTEN_BEAST_270:TALLOWj CREATURE:FORGOTTEN_BEAST_271:FATj#CREATURE:FORGOTTEN_BEAST_271:TALLOWj CREATURE:FORGOTTEN_BEAST_272:FATj#CREATURE:FORGOTTEN_BEAST_272:TALLOWj CREATURE:FORGOTTEN_BEAST_273:FATj#CREATURE:FORGOTTEN_BEAST_273:TALLOWj CREATURE:FORGOTTEN_BEAST_274:FATj#CREATURE:FORGOTTEN_BEAST_274:TALLOWj CREATURE:FORGOTTEN_BEAST_275:FATj#CREATURE:FORGOTTEN_BEAST_275:TALLOWj CREATURE:FORGOTTEN_BEAST_276:FATj#CREATURE:FORGOTTEN_BEAST_276:TALLOWj CREATURE:FORGOTTEN_BEAST_277:FATj#CREATURE:FORGOTTEN_BEAST_277:TALLOWj CREATURE:FORGOTTEN_BEAST_279:FATj#CREATURE:FORGOTTEN_BEAST_279:TALLOWj CREATURE:FORGOTTEN_BEAST_280:FATj#CREATURE:FORGOTTEN_BEAST_280:TALLOWj CREATURE:FORGOTTEN_BEAST_281:FATj#CREATURE:FORGOTTEN_BEAST_281:TALLOWj CREATURE:FORGOTTEN_BEAST_282:FATj#CREATURE:FORGOTTEN_BEAST_282:TALLOWj CREATURE:FORGOTTEN_BEAST_283:FATj#CREATURE:FORGOTTEN_BEAST_283:TALLOWj CREATURE:FORGOTTEN_BEAST_285:FATj#CREATURE:FORGOTTEN_BEAST_285:TALLOWj CREATURE:FORGOTTEN_BEAST_286:FATj#CREATURE:FORGOTTEN_BEAST_286:TALLOWj CREATURE:FORGOTTEN_BEAST_287:FATj#CREATURE:FORGOTTEN_BEAST_287:TALLOWj CREATURE:FORGOTTEN_BEAST_288:FATj#CREATURE:FORGOTTEN_BEAST_288:TALLOWj CREATURE:FORGOTTEN_BEAST_289:FATj#CREATURE:FORGOTTEN_BEAST_289:TALLOWj CREATURE:FORGOTTEN_BEAST_290:FATj#CREATURE:FORGOTTEN_BEAST_290:TALLOWj CREATURE:FORGOTTEN_BEAST_293:FATj#CREATURE:FORGOTTEN_BEAST_293:TALLOWj CREATURE:FORGOTTEN_BEAST_295:FATj#CREATURE:FORGOTTEN_BEAST_295:TALLOWj CREATURE:FORGOTTEN_BEAST_297:FATj#CREATURE:FORGOTTEN_BEAST_297:TALLOWj CREATURE:FORGOTTEN_BEAST_300:FATj#CREATURE:FORGOTTEN_BEAST_300:TALLOWj CREATURE:FORGOTTEN_BEAST_302:FATj#CREATURE:FORGOTTEN_BEAST_302:TALLOWj CREATURE:FORGOTTEN_BEAST_306:FATj#CREATURE:FORGOTTEN_BEAST_306:TALLOWj CREATURE:FORGOTTEN_BEAST_307:FATj#CREATURE:FORGOTTEN_BEAST_307:TALLOWj CREATURE:FORGOTTEN_BEAST_310:FATj#CREATURE:FORGOTTEN_BEAST_310:TALLOWj CREATURE:FORGOTTEN_BEAST_311:FATj#CREATURE:FORGOTTEN_BEAST_311:TALLOWj CREATURE:FORGOTTEN_BEAST_312:FATj#CREATURE:FORGOTTEN_BEAST_312:TALLOWj CREATURE:FORGOTTEN_BEAST_314:FATj#CREATURE:FORGOTTEN_BEAST_314:TALLOWj CREATURE:FORGOTTEN_BEAST_316:FATj#CREATURE:FORGOTTEN_BEAST_316:TALLOWj CREATURE:FORGOTTEN_BEAST_317:FATj#CREATURE:FORGOTTEN_BEAST_317:TALLOWj CREATURE:FORGOTTEN_BEAST_318:FATj#CREATURE:FORGOTTEN_BEAST_318:TALLOWj CREATURE:FORGOTTEN_BEAST_320:FATj#CREATURE:FORGOTTEN_BEAST_320:TALLOWj CREATURE:FORGOTTEN_BEAST_321:FATj#CREATURE:FORGOTTEN_BEAST_321:TALLOWj CREATURE:FORGOTTEN_BEAST_322:FATj#CREATURE:FORGOTTEN_BEAST_322:TALLOWj CREATURE:FORGOTTEN_BEAST_323:FATj#CREATURE:FORGOTTEN_BEAST_323:TALLOWj CREATURE:FORGOTTEN_BEAST_324:FATj#CREATURE:FORGOTTEN_BEAST_324:TALLOWj CREATURE:FORGOTTEN_BEAST_325:FATj#CREATURE:FORGOTTEN_BEAST_325:TALLOWj CREATURE:FORGOTTEN_BEAST_326:FATj#CREATURE:FORGOTTEN_BEAST_326:TALLOWj CREATURE:FORGOTTEN_BEAST_327:FATj#CREATURE:FORGOTTEN_BEAST_327:TALLOWj CREATURE:FORGOTTEN_BEAST_328:FATj#CREATURE:FORGOTTEN_BEAST_328:TALLOWj CREATURE:FORGOTTEN_BEAST_329:FATj#CREATURE:FORGOTTEN_BEAST_329:TALLOWj CREATURE:FORGOTTEN_BEAST_330:FATj#CREATURE:FORGOTTEN_BEAST_330:TALLOWj CREATURE:FORGOTTEN_BEAST_332:FATj#CREATURE:FORGOTTEN_BEAST_332:TALLOWj CREATURE:FORGOTTEN_BEAST_333:FATj#CREATURE:FORGOTTEN_BEAST_333:TALLOWj CREATURE:FORGOTTEN_BEAST_335:FATj#CREATURE:FORGOTTEN_BEAST_335:TALLOWj CREATURE:FORGOTTEN_BEAST_336:FATj#CREATURE:FORGOTTEN_BEAST_336:TALLOWj CREATURE:FORGOTTEN_BEAST_337:FATj#CREATURE:FORGOTTEN_BEAST_337:TALLOWj CREATURE:FORGOTTEN_BEAST_338:FATj#CREATURE:FORGOTTEN_BEAST_338:TALLOWj CREATURE:FORGOTTEN_BEAST_339:FATj#CREATURE:FORGOTTEN_BEAST_339:TALLOWj CREATURE:FORGOTTEN_BEAST_341:FATj#CREATURE:FORGOTTEN_BEAST_341:TALLOWj CREATURE:FORGOTTEN_BEAST_342:FATj#CREATURE:FORGOTTEN_BEAST_342:TALLOWj CREATURE:FORGOTTEN_BEAST_343:FATj#CREATURE:FORGOTTEN_BEAST_343:TALLOWj CREATURE:FORGOTTEN_BEAST_344:FATj#CREATURE:FORGOTTEN_BEAST_344:TALLOWj CREATURE:FORGOTTEN_BEAST_347:FATj#CREATURE:FORGOTTEN_BEAST_347:TALLOWj CREATURE:FORGOTTEN_BEAST_348:FATj#CREATURE:FORGOTTEN_BEAST_348:TALLOWj CREATURE:FORGOTTEN_BEAST_349:FATj#CREATURE:FORGOTTEN_BEAST_349:TALLOWj CREATURE:FORGOTTEN_BEAST_351:FATj#CREATURE:FORGOTTEN_BEAST_351:TALLOWj CREATURE:FORGOTTEN_BEAST_352:FATj#CREATURE:FORGOTTEN_BEAST_352:TALLOWj CREATURE:FORGOTTEN_BEAST_353:FATj#CREATURE:FORGOTTEN_BEAST_353:TALLOWj CREATURE:FORGOTTEN_BEAST_354:FATj#CREATURE:FORGOTTEN_BEAST_354:TALLOWj CREATURE:FORGOTTEN_BEAST_355:FATj#CREATURE:FORGOTTEN_BEAST_355:TALLOWj CREATURE:FORGOTTEN_BEAST_356:FATj#CREATURE:FORGOTTEN_BEAST_356:TALLOWj CREATURE:FORGOTTEN_BEAST_357:FATj#CREATURE:FORGOTTEN_BEAST_357:TALLOWj CREATURE:FORGOTTEN_BEAST_358:FATj#CREATURE:FORGOTTEN_BEAST_358:TALLOWj CREATURE:FORGOTTEN_BEAST_359:FATj#CREATURE:FORGOTTEN_BEAST_359:TALLOWj CREATURE:FORGOTTEN_BEAST_361:FATj#CREATURE:FORGOTTEN_BEAST_361:TALLOWj CREATURE:FORGOTTEN_BEAST_363:FATj#CREATURE:FORGOTTEN_BEAST_363:TALLOWj CREATURE:FORGOTTEN_BEAST_364:FATj#CREATURE:FORGOTTEN_BEAST_364:TALLOWj CREATURE:FORGOTTEN_BEAST_365:FATj#CREATURE:FORGOTTEN_BEAST_365:TALLOWj CREATURE:FORGOTTEN_BEAST_366:FATj#CREATURE:FORGOTTEN_BEAST_366:TALLOWj CREATURE:FORGOTTEN_BEAST_367:FATj#CREATURE:FORGOTTEN_BEAST_367:TALLOWj CREATURE:FORGOTTEN_BEAST_368:FATj#CREATURE:FORGOTTEN_BEAST_368:TALLOWj CREATURE:FORGOTTEN_BEAST_370:FATj#CREATURE:FORGOTTEN_BEAST_370:TALLOWj CREATURE:FORGOTTEN_BEAST_372:FATj#CREATURE:FORGOTTEN_BEAST_372:TALLOWj CREATURE:FORGOTTEN_BEAST_374:FATj#CREATURE:FORGOTTEN_BEAST_374:TALLOWj CREATURE:FORGOTTEN_BEAST_375:FATj#CREATURE:FORGOTTEN_BEAST_375:TALLOWj CREATURE:FORGOTTEN_BEAST_377:FATj#CREATURE:FORGOTTEN_BEAST_377:TALLOWj CREATURE:FORGOTTEN_BEAST_378:FATj#CREATURE:FORGOTTEN_BEAST_378:TALLOWj CREATURE:FORGOTTEN_BEAST_379:FATj#CREATURE:FORGOTTEN_BEAST_379:TALLOWj CREATURE:FORGOTTEN_BEAST_380:FATj#CREATURE:FORGOTTEN_BEAST_380:TALLOWj CREATURE:FORGOTTEN_BEAST_381:FATj#CREATURE:FORGOTTEN_BEAST_381:TALLOWj CREATURE:FORGOTTEN_BEAST_382:FATj#CREATURE:FORGOTTEN_BEAST_382:TALLOWj CREATURE:FORGOTTEN_BEAST_383:FATj#CREATURE:FORGOTTEN_BEAST_383:TALLOWj CREATURE:FORGOTTEN_BEAST_384:FATj#CREATURE:FORGOTTEN_BEAST_384:TALLOWj CREATURE:FORGOTTEN_BEAST_385:FATj#CREATURE:FORGOTTEN_BEAST_385:TALLOWj CREATURE:FORGOTTEN_BEAST_386:FATj#CREATURE:FORGOTTEN_BEAST_386:TALLOWj CREATURE:FORGOTTEN_BEAST_387:FATj#CREATURE:FORGOTTEN_BEAST_387:TALLOWj CREATURE:FORGOTTEN_BEAST_388:FATj#CREATURE:FORGOTTEN_BEAST_388:TALLOWj CREATURE:FORGOTTEN_BEAST_389:FATj#CREATURE:FORGOTTEN_BEAST_389:TALLOWj CREATURE:FORGOTTEN_BEAST_390:FATj#CREATURE:FORGOTTEN_BEAST_390:TALLOWj CREATURE:FORGOTTEN_BEAST_391:FATj#CREATURE:FORGOTTEN_BEAST_391:TALLOWj CREATURE:FORGOTTEN_BEAST_392:FATj#CREATURE:FORGOTTEN_BEAST_392:TALLOWj CREATURE:FORGOTTEN_BEAST_393:FATj#CREATURE:FORGOTTEN_BEAST_393:TALLOWj CREATURE:FORGOTTEN_BEAST_396:FATj#CREATURE:FORGOTTEN_BEAST_396:TALLOWj CREATURE:FORGOTTEN_BEAST_397:FATj#CREATURE:FORGOTTEN_BEAST_397:TALLOWj CREATURE:FORGOTTEN_BEAST_398:FATj#CREATURE:FORGOTTEN_BEAST_398:TALLOWj CREATURE:FORGOTTEN_BEAST_400:FATj#CREATURE:FORGOTTEN_BEAST_400:TALLOWj CREATURE:FORGOTTEN_BEAST_403:FATj#CREATURE:FORGOTTEN_BEAST_403:TALLOWj CREATURE:FORGOTTEN_BEAST_404:FATj#CREATURE:FORGOTTEN_BEAST_404:TALLOWj CREATURE:FORGOTTEN_BEAST_405:FATj#CREATURE:FORGOTTEN_BEAST_405:TALLOWj CREATURE:FORGOTTEN_BEAST_406:FATj#CREATURE:FORGOTTEN_BEAST_406:TALLOWj CREATURE:FORGOTTEN_BEAST_407:FATj#CREATURE:FORGOTTEN_BEAST_407:TALLOWj CREATURE:FORGOTTEN_BEAST_408:FATj#CREATURE:FORGOTTEN_BEAST_408:TALLOWj CREATURE:FORGOTTEN_BEAST_409:FATj#CREATURE:FORGOTTEN_BEAST_409:TALLOWj CREATURE:FORGOTTEN_BEAST_410:FATj#CREATURE:FORGOTTEN_BEAST_410:TALLOWj CREATURE:FORGOTTEN_BEAST_411:FATj#CREATURE:FORGOTTEN_BEAST_411:TALLOWj CREATURE:FORGOTTEN_BEAST_412:FATj#CREATURE:FORGOTTEN_BEAST_412:TALLOWj CREATURE:FORGOTTEN_BEAST_413:FATj#CREATURE:FORGOTTEN_BEAST_413:TALLOWj CREATURE:FORGOTTEN_BEAST_414:FATj#CREATURE:FORGOTTEN_BEAST_414:TALLOWj CREATURE:FORGOTTEN_BEAST_416:FATj#CREATURE:FORGOTTEN_BEAST_416:TALLOWj CREATURE:FORGOTTEN_BEAST_417:FATj#CREATURE:FORGOTTEN_BEAST_417:TALLOWj CREATURE:FORGOTTEN_BEAST_418:FATj#CREATURE:FORGOTTEN_BEAST_418:TALLOWj CREATURE:FORGOTTEN_BEAST_420:FATj#CREATURE:FORGOTTEN_BEAST_420:TALLOWj CREATURE:FORGOTTEN_BEAST_421:FATj#CREATURE:FORGOTTEN_BEAST_421:TALLOWj CREATURE:FORGOTTEN_BEAST_422:FATj#CREATURE:FORGOTTEN_BEAST_422:TALLOWj CREATURE:FORGOTTEN_BEAST_423:FATj#CREATURE:FORGOTTEN_BEAST_423:TALLOWj CREATURE:FORGOTTEN_BEAST_424:FATj#CREATURE:FORGOTTEN_BEAST_424:TALLOWj CREATURE:FORGOTTEN_BEAST_427:FATj#CREATURE:FORGOTTEN_BEAST_427:TALLOWj CREATURE:FORGOTTEN_BEAST_429:FATj#CREATURE:FORGOTTEN_BEAST_429:TALLOWj CREATURE:FORGOTTEN_BEAST_430:FATj#CREATURE:FORGOTTEN_BEAST_430:TALLOWj CREATURE:FORGOTTEN_BEAST_432:FATj#CREATURE:FORGOTTEN_BEAST_432:TALLOWj CREATURE:FORGOTTEN_BEAST_433:FATj#CREATURE:FORGOTTEN_BEAST_433:TALLOWj CREATURE:FORGOTTEN_BEAST_434:FATj#CREATURE:FORGOTTEN_BEAST_434:TALLOWj CREATURE:FORGOTTEN_BEAST_435:FATj#CREATURE:FORGOTTEN_BEAST_435:TALLOWj CREATURE:FORGOTTEN_BEAST_436:FATj#CREATURE:FORGOTTEN_BEAST_436:TALLOWj CREATURE:FORGOTTEN_BEAST_437:FATj#CREATURE:FORGOTTEN_BEAST_437:TALLOWj CREATURE:FORGOTTEN_BEAST_438:FATj#CREATURE:FORGOTTEN_BEAST_438:TALLOWj CREATURE:FORGOTTEN_BEAST_440:FATj#CREATURE:FORGOTTEN_BEAST_440:TALLOWj CREATURE:FORGOTTEN_BEAST_441:FATj#CREATURE:FORGOTTEN_BEAST_441:TALLOWj CREATURE:FORGOTTEN_BEAST_442:FATj#CREATURE:FORGOTTEN_BEAST_442:TALLOWj CREATURE:FORGOTTEN_BEAST_444:FATj#CREATURE:FORGOTTEN_BEAST_444:TALLOWj CREATURE:FORGOTTEN_BEAST_446:FATj#CREATURE:FORGOTTEN_BEAST_446:TALLOWj CREATURE:FORGOTTEN_BEAST_447:FATj#CREATURE:FORGOTTEN_BEAST_447:TALLOWj CREATURE:FORGOTTEN_BEAST_448:FATj#CREATURE:FORGOTTEN_BEAST_448:TALLOWj CREATURE:FORGOTTEN_BEAST_449:FATj#CREATURE:FORGOTTEN_BEAST_449:TALLOWj CREATURE:FORGOTTEN_BEAST_450:FATj#CREATURE:FORGOTTEN_BEAST_450:TALLOWj CREATURE:FORGOTTEN_BEAST_451:FATj#CREATURE:FORGOTTEN_BEAST_451:TALLOWj CREATURE:FORGOTTEN_BEAST_453:FATj#CREATURE:FORGOTTEN_BEAST_453:TALLOWj CREATURE:FORGOTTEN_BEAST_454:FATj#CREATURE:FORGOTTEN_BEAST_454:TALLOWj CREATURE:FORGOTTEN_BEAST_455:FATj#CREATURE:FORGOTTEN_BEAST_455:TALLOWj CREATURE:FORGOTTEN_BEAST_457:FATj#CREATURE:FORGOTTEN_BEAST_457:TALLOWj CREATURE:FORGOTTEN_BEAST_459:FATj#CREATURE:FORGOTTEN_BEAST_459:TALLOWj CREATURE:FORGOTTEN_BEAST_461:FATj#CREATURE:FORGOTTEN_BEAST_461:TALLOWj CREATURE:FORGOTTEN_BEAST_462:FATj#CREATURE:FORGOTTEN_BEAST_462:TALLOWj CREATURE:FORGOTTEN_BEAST_463:FATj#CREATURE:FORGOTTEN_BEAST_463:TALLOWj CREATURE:FORGOTTEN_BEAST_465:FATj#CREATURE:FORGOTTEN_BEAST_465:TALLOWj CREATURE:FORGOTTEN_BEAST_466:FATj#CREATURE:FORGOTTEN_BEAST_466:TALLOWj CREATURE:FORGOTTEN_BEAST_468:FATj#CREATURE:FORGOTTEN_BEAST_468:TALLOWj CREATURE:FORGOTTEN_BEAST_469:FATj#CREATURE:FORGOTTEN_BEAST_469:TALLOWj CREATURE:FORGOTTEN_BEAST_470:FATj#CREATURE:FORGOTTEN_BEAST_470:TALLOWj CREATURE:FORGOTTEN_BEAST_471:FATj#CREATURE:FORGOTTEN_BEAST_471:TALLOWj CREATURE:FORGOTTEN_BEAST_472:FATj#CREATURE:FORGOTTEN_BEAST_472:TALLOWj CREATURE:FORGOTTEN_BEAST_474:FATj#CREATURE:FORGOTTEN_BEAST_474:TALLOWj CREATURE:FORGOTTEN_BEAST_475:FATj#CREATURE:FORGOTTEN_BEAST_475:TALLOWj CREATURE:FORGOTTEN_BEAST_476:FATj#CREATURE:FORGOTTEN_BEAST_476:TALLOWj CREATURE:FORGOTTEN_BEAST_478:FATj#CREATURE:FORGOTTEN_BEAST_478:TALLOWj CREATURE:FORGOTTEN_BEAST_479:FATj#CREATURE:FORGOTTEN_BEAST_479:TALLOWj CREATURE:FORGOTTEN_BEAST_480:FATj#CREATURE:FORGOTTEN_BEAST_480:TALLOWj CREATURE:FORGOTTEN_BEAST_481:FATj#CREATURE:FORGOTTEN_BEAST_481:TALLOWj CREATURE:FORGOTTEN_BEAST_483:FATj#CREATURE:FORGOTTEN_BEAST_483:TALLOWj CREATURE:FORGOTTEN_BEAST_486:FATj#CREATURE:FORGOTTEN_BEAST_486:TALLOWj CREATURE:FORGOTTEN_BEAST_487:FATj#CREATURE:FORGOTTEN_BEAST_487:TALLOWj CREATURE:FORGOTTEN_BEAST_489:FATj#CREATURE:FORGOTTEN_BEAST_489:TALLOWj CREATURE:FORGOTTEN_BEAST_492:FATj#CREATURE:FORGOTTEN_BEAST_492:TALLOWj CREATURE:FORGOTTEN_BEAST_494:FATj#CREATURE:FORGOTTEN_BEAST_494:TALLOWj CREATURE:FORGOTTEN_BEAST_495:FATj#CREATURE:FORGOTTEN_BEAST_495:TALLOWj CREATURE:FORGOTTEN_BEAST_496:FATj#CREATURE:FORGOTTEN_BEAST_496:TALLOWj CREATURE:FORGOTTEN_BEAST_497:FATj#CREATURE:FORGOTTEN_BEAST_497:TALLOWj CREATURE:FORGOTTEN_BEAST_498:FATj#CREATURE:FORGOTTEN_BEAST_498:TALLOWj CREATURE:FORGOTTEN_BEAST_499:FATj#CREATURE:FORGOTTEN_BEAST_499:TALLOWj CREATURE:FORGOTTEN_BEAST_501:FATj#CREATURE:FORGOTTEN_BEAST_501:TALLOWj CREATURE:FORGOTTEN_BEAST_503:FATj#CREATURE:FORGOTTEN_BEAST_503:TALLOWj CREATURE:FORGOTTEN_BEAST_504:FATj#CREATURE:FORGOTTEN_BEAST_504:TALLOWj CREATURE:FORGOTTEN_BEAST_505:FATj#CREATURE:FORGOTTEN_BEAST_505:TALLOWj CREATURE:FORGOTTEN_BEAST_507:FATj#CREATURE:FORGOTTEN_BEAST_507:TALLOWj CREATURE:FORGOTTEN_BEAST_508:FATj#CREATURE:FORGOTTEN_BEAST_508:TALLOWj CREATURE:FORGOTTEN_BEAST_510:FATj#CREATURE:FORGOTTEN_BEAST_510:TALLOWj CREATURE:FORGOTTEN_BEAST_512:FATj#CREATURE:FORGOTTEN_BEAST_512:TALLOWj CREATURE:FORGOTTEN_BEAST_513:FATj#CREATURE:FORGOTTEN_BEAST_513:TALLOWj CREATURE:FORGOTTEN_BEAST_514:FATj#CREATURE:FORGOTTEN_BEAST_514:TALLOWj CREATURE:FORGOTTEN_BEAST_515:FATj#CREATURE:FORGOTTEN_BEAST_515:TALLOWj CREATURE:FORGOTTEN_BEAST_516:FATj#CREATURE:FORGOTTEN_BEAST_516:TALLOWj CREATURE:FORGOTTEN_BEAST_517:FATj#CREATURE:FORGOTTEN_BEAST_517:TALLOWj CREATURE:FORGOTTEN_BEAST_518:FATj#CREATURE:FORGOTTEN_BEAST_518:TALLOWj CREATURE:FORGOTTEN_BEAST_519:FATj#CREATURE:FORGOTTEN_BEAST_519:TALLOWj CREATURE:FORGOTTEN_BEAST_520:FATj#CREATURE:FORGOTTEN_BEAST_520:TALLOWj CREATURE:FORGOTTEN_BEAST_521:FATj#CREATURE:FORGOTTEN_BEAST_521:TALLOWj CREATURE:FORGOTTEN_BEAST_522:FATj#CREATURE:FORGOTTEN_BEAST_522:TALLOWj CREATURE:FORGOTTEN_BEAST_523:FATj#CREATURE:FORGOTTEN_BEAST_523:TALLOWj CREATURE:FORGOTTEN_BEAST_525:FATj#CREATURE:FORGOTTEN_BEAST_525:TALLOWj CREATURE:FORGOTTEN_BEAST_526:FATj#CREATURE:FORGOTTEN_BEAST_526:TALLOWj CREATURE:FORGOTTEN_BEAST_527:FATj#CREATURE:FORGOTTEN_BEAST_527:TALLOWj CREATURE:FORGOTTEN_BEAST_528:FATj#CREATURE:FORGOTTEN_BEAST_528:TALLOWj CREATURE:FORGOTTEN_BEAST_529:FATj#CREATURE:FORGOTTEN_BEAST_529:TALLOWj CREATURE:FORGOTTEN_BEAST_530:FATj#CREATURE:FORGOTTEN_BEAST_530:TALLOWj CREATURE:FORGOTTEN_BEAST_531:FATj#CREATURE:FORGOTTEN_BEAST_531:TALLOWj CREATURE:FORGOTTEN_BEAST_532:FATj#CREATURE:FORGOTTEN_BEAST_532:TALLOWj CREATURE:FORGOTTEN_BEAST_533:FATj#CREATURE:FORGOTTEN_BEAST_533:TALLOWj CREATURE:FORGOTTEN_BEAST_534:FATj#CREATURE:FORGOTTEN_BEAST_534:TALLOWj CREATURE:FORGOTTEN_BEAST_535:FATj#CREATURE:FORGOTTEN_BEAST_535:TALLOWj CREATURE:FORGOTTEN_BEAST_536:FATj#CREATURE:FORGOTTEN_BEAST_536:TALLOWj CREATURE:FORGOTTEN_BEAST_539:FATj#CREATURE:FORGOTTEN_BEAST_539:TALLOWj CREATURE:FORGOTTEN_BEAST_540:FATj#CREATURE:FORGOTTEN_BEAST_540:TALLOWj CREATURE:FORGOTTEN_BEAST_541:FATj#CREATURE:FORGOTTEN_BEAST_541:TALLOWj CREATURE:FORGOTTEN_BEAST_543:FATj#CREATURE:FORGOTTEN_BEAST_543:TALLOWj CREATURE:FORGOTTEN_BEAST_545:FATj#CREATURE:FORGOTTEN_BEAST_545:TALLOWj CREATURE:FORGOTTEN_BEAST_546:FATj#CREATURE:FORGOTTEN_BEAST_546:TALLOWj CREATURE:FORGOTTEN_BEAST_547:FATj#CREATURE:FORGOTTEN_BEAST_547:TALLOWj CREATURE:FORGOTTEN_BEAST_548:FATj#CREATURE:FORGOTTEN_BEAST_548:TALLOWj CREATURE:FORGOTTEN_BEAST_549:FATj#CREATURE:FORGOTTEN_BEAST_549:TALLOWj CREATURE:FORGOTTEN_BEAST_550:FATj#CREATURE:FORGOTTEN_BEAST_550:TALLOWj CREATURE:FORGOTTEN_BEAST_551:FATj#CREATURE:FORGOTTEN_BEAST_551:TALLOWj CREATURE:FORGOTTEN_BEAST_554:FATj#CREATURE:FORGOTTEN_BEAST_554:TALLOWj CREATURE:FORGOTTEN_BEAST_555:FATj#CREATURE:FORGOTTEN_BEAST_555:TALLOWj CREATURE:FORGOTTEN_BEAST_556:FATj#CREATURE:FORGOTTEN_BEAST_556:TALLOWj CREATURE:FORGOTTEN_BEAST_557:FATj#CREATURE:FORGOTTEN_BEAST_557:TALLOWj CREATURE:FORGOTTEN_BEAST_561:FATj#CREATURE:FORGOTTEN_BEAST_561:TALLOWj CREATURE:FORGOTTEN_BEAST_562:FATj#CREATURE:FORGOTTEN_BEAST_562:TALLOWj CREATURE:FORGOTTEN_BEAST_564:FATj#CREATURE:FORGOTTEN_BEAST_564:TALLOWj CREATURE:FORGOTTEN_BEAST_569:FATj#CREATURE:FORGOTTEN_BEAST_569:TALLOWj CREATURE:FORGOTTEN_BEAST_570:FATj#CREATURE:FORGOTTEN_BEAST_570:TALLOWj CREATURE:FORGOTTEN_BEAST_571:FATj#CREATURE:FORGOTTEN_BEAST_571:TALLOWj CREATURE:FORGOTTEN_BEAST_572:FATj#CREATURE:FORGOTTEN_BEAST_572:TALLOWj CREATURE:FORGOTTEN_BEAST_574:FATj#CREATURE:FORGOTTEN_BEAST_574:TALLOWj CREATURE:FORGOTTEN_BEAST_576:FATj#CREATURE:FORGOTTEN_BEAST_576:TALLOWj CREATURE:FORGOTTEN_BEAST_578:FATj#CREATURE:FORGOTTEN_BEAST_578:TALLOWj CREATURE:FORGOTTEN_BEAST_579:FATj#CREATURE:FORGOTTEN_BEAST_579:TALLOWj CREATURE:FORGOTTEN_BEAST_580:FATj#CREATURE:FORGOTTEN_BEAST_580:TALLOWj CREATURE:FORGOTTEN_BEAST_581:FATj#CREATURE:FORGOTTEN_BEAST_581:TALLOWj CREATURE:FORGOTTEN_BEAST_583:FATj#CREATURE:FORGOTTEN_BEAST_583:TALLOWj CREATURE:FORGOTTEN_BEAST_584:FATj#CREATURE:FORGOTTEN_BEAST_584:TALLOWj CREATURE:FORGOTTEN_BEAST_586:FATj#CREATURE:FORGOTTEN_BEAST_586:TALLOWj CREATURE:FORGOTTEN_BEAST_588:FATj#CREATURE:FORGOTTEN_BEAST_588:TALLOWj CREATURE:FORGOTTEN_BEAST_589:FATj#CREATURE:FORGOTTEN_BEAST_589:TALLOWj CREATURE:FORGOTTEN_BEAST_590:FATj#CREATURE:FORGOTTEN_BEAST_590:TALLOWj CREATURE:FORGOTTEN_BEAST_592:FATj#CREATURE:FORGOTTEN_BEAST_592:TALLOWj CREATURE:FORGOTTEN_BEAST_593:FATj#CREATURE:FORGOTTEN_BEAST_593:TALLOWj CREATURE:FORGOTTEN_BEAST_594:FATj#CREATURE:FORGOTTEN_BEAST_594:TALLOWj CREATURE:FORGOTTEN_BEAST_595:FATj#CREATURE:FORGOTTEN_BEAST_595:TALLOWj CREATURE:FORGOTTEN_BEAST_596:FATj#CREATURE:FORGOTTEN_BEAST_596:TALLOWj CREATURE:FORGOTTEN_BEAST_597:FATj#CREATURE:FORGOTTEN_BEAST_597:TALLOWj CREATURE:FORGOTTEN_BEAST_599:FATj#CREATURE:FORGOTTEN_BEAST_599:TALLOWj CREATURE:FORGOTTEN_BEAST_600:FATj#CREATURE:FORGOTTEN_BEAST_600:TALLOWj CREATURE:FORGOTTEN_BEAST_601:FATj#CREATURE:FORGOTTEN_BEAST_601:TALLOWj CREATURE:FORGOTTEN_BEAST_603:FATj#CREATURE:FORGOTTEN_BEAST_603:TALLOWj CREATURE:FORGOTTEN_BEAST_605:FATj#CREATURE:FORGOTTEN_BEAST_605:TALLOWj CREATURE:FORGOTTEN_BEAST_607:FATj#CREATURE:FORGOTTEN_BEAST_607:TALLOWj CREATURE:FORGOTTEN_BEAST_608:FATj#CREATURE:FORGOTTEN_BEAST_608:TALLOWj CREATURE:FORGOTTEN_BEAST_609:FATj#CREATURE:FORGOTTEN_BEAST_609:TALLOWj CREATURE:FORGOTTEN_BEAST_610:FATj#CREATURE:FORGOTTEN_BEAST_610:TALLOWj CREATURE:FORGOTTEN_BEAST_611:FATj#CREATURE:FORGOTTEN_BEAST_611:TALLOWj CREATURE:FORGOTTEN_BEAST_612:FATj#CREATURE:FORGOTTEN_BEAST_612:TALLOWj CREATURE:FORGOTTEN_BEAST_613:FATj#CREATURE:FORGOTTEN_BEAST_613:TALLOWj CREATURE:FORGOTTEN_BEAST_614:FATj#CREATURE:FORGOTTEN_BEAST_614:TALLOWj CREATURE:FORGOTTEN_BEAST_616:FATj#CREATURE:FORGOTTEN_BEAST_616:TALLOWj CREATURE:FORGOTTEN_BEAST_619:FATj#CREATURE:FORGOTTEN_BEAST_619:TALLOWj CREATURE:FORGOTTEN_BEAST_620:FATj#CREATURE:FORGOTTEN_BEAST_620:TALLOWj CREATURE:FORGOTTEN_BEAST_621:FATj#CREATURE:FORGOTTEN_BEAST_621:TALLOWj CREATURE:FORGOTTEN_BEAST_623:FATj#CREATURE:FORGOTTEN_BEAST_623:TALLOWj CREATURE:FORGOTTEN_BEAST_624:FATj#CREATURE:FORGOTTEN_BEAST_624:TALLOWj CREATURE:FORGOTTEN_BEAST_625:FATj#CREATURE:FORGOTTEN_BEAST_625:TALLOWj CREATURE:FORGOTTEN_BEAST_626:FATj#CREATURE:FORGOTTEN_BEAST_626:TALLOWj CREATURE:FORGOTTEN_BEAST_627:FATj#CREATURE:FORGOTTEN_BEAST_627:TALLOWj CREATURE:FORGOTTEN_BEAST_628:FATj#CREATURE:FORGOTTEN_BEAST_628:TALLOWj CREATURE:FORGOTTEN_BEAST_629:FATj#CREATURE:FORGOTTEN_BEAST_629:TALLOWj CREATURE:FORGOTTEN_BEAST_630:FATj#CREATURE:FORGOTTEN_BEAST_630:TALLOWj CREATURE:FORGOTTEN_BEAST_631:FATj#CREATURE:FORGOTTEN_BEAST_631:TALLOWj CREATURE:FORGOTTEN_BEAST_632:FATj#CREATURE:FORGOTTEN_BEAST_632:TALLOWj CREATURE:FORGOTTEN_BEAST_633:FATj#CREATURE:FORGOTTEN_BEAST_633:TALLOWj CREATURE:FORGOTTEN_BEAST_634:FATj#CREATURE:FORGOTTEN_BEAST_634:TALLOWj CREATURE:FORGOTTEN_BEAST_635:FATj#CREATURE:FORGOTTEN_BEAST_635:TALLOWj CREATURE:FORGOTTEN_BEAST_636:FATj#CREATURE:FORGOTTEN_BEAST_636:TALLOWj CREATURE:FORGOTTEN_BEAST_637:FATj#CREATURE:FORGOTTEN_BEAST_637:TALLOWj CREATURE:FORGOTTEN_BEAST_639:FATj#CREATURE:FORGOTTEN_BEAST_639:TALLOWj CREATURE:FORGOTTEN_BEAST_640:FATj#CREATURE:FORGOTTEN_BEAST_640:TALLOWj CREATURE:FORGOTTEN_BEAST_643:FATj#CREATURE:FORGOTTEN_BEAST_643:TALLOWj CREATURE:FORGOTTEN_BEAST_644:FATj#CREATURE:FORGOTTEN_BEAST_644:TALLOWj CREATURE:FORGOTTEN_BEAST_645:FATj#CREATURE:FORGOTTEN_BEAST_645:TALLOWj CREATURE:FORGOTTEN_BEAST_646:FATj#CREATURE:FORGOTTEN_BEAST_646:TALLOWj CREATURE:FORGOTTEN_BEAST_647:FATj#CREATURE:FORGOTTEN_BEAST_647:TALLOWj CREATURE:FORGOTTEN_BEAST_649:FATj#CREATURE:FORGOTTEN_BEAST_649:TALLOWj CREATURE:FORGOTTEN_BEAST_650:FATj#CREATURE:FORGOTTEN_BEAST_650:TALLOWj CREATURE:FORGOTTEN_BEAST_651:FATj#CREATURE:FORGOTTEN_BEAST_651:TALLOWj CREATURE:FORGOTTEN_BEAST_652:FATj#CREATURE:FORGOTTEN_BEAST_652:TALLOWj CREATURE:FORGOTTEN_BEAST_656:FATj#CREATURE:FORGOTTEN_BEAST_656:TALLOWj CREATURE:FORGOTTEN_BEAST_658:FATj#CREATURE:FORGOTTEN_BEAST_658:TALLOWj CREATURE:FORGOTTEN_BEAST_659:FATj#CREATURE:FORGOTTEN_BEAST_659:TALLOWj CREATURE:FORGOTTEN_BEAST_661:FATj#CREATURE:FORGOTTEN_BEAST_661:TALLOWj CREATURE:FORGOTTEN_BEAST_663:FATj#CREATURE:FORGOTTEN_BEAST_663:TALLOWj CREATURE:FORGOTTEN_BEAST_664:FATj#CREATURE:FORGOTTEN_BEAST_664:TALLOWj CREATURE:FORGOTTEN_BEAST_666:FATj#CREATURE:FORGOTTEN_BEAST_666:TALLOWj CREATURE:FORGOTTEN_BEAST_667:FATj#CREATURE:FORGOTTEN_BEAST_667:TALLOWj CREATURE:FORGOTTEN_BEAST_669:FATj#CREATURE:FORGOTTEN_BEAST_669:TALLOWj CREATURE:FORGOTTEN_BEAST_670:FATj#CREATURE:FORGOTTEN_BEAST_670:TALLOWj CREATURE:FORGOTTEN_BEAST_671:FATj#CREATURE:FORGOTTEN_BEAST_671:TALLOWj CREATURE:FORGOTTEN_BEAST_674:FATj#CREATURE:FORGOTTEN_BEAST_674:TALLOWj CREATURE:FORGOTTEN_BEAST_675:FATj#CREATURE:FORGOTTEN_BEAST_675:TALLOWj CREATURE:FORGOTTEN_BEAST_678:FATj#CREATURE:FORGOTTEN_BEAST_678:TALLOWj CREATURE:FORGOTTEN_BEAST_680:FATj#CREATURE:FORGOTTEN_BEAST_680:TALLOWj CREATURE:FORGOTTEN_BEAST_681:FATj#CREATURE:FORGOTTEN_BEAST_681:TALLOWj CREATURE:FORGOTTEN_BEAST_682:FATj#CREATURE:FORGOTTEN_BEAST_682:TALLOWj CREATURE:FORGOTTEN_BEAST_684:FATj#CREATURE:FORGOTTEN_BEAST_684:TALLOWj CREATURE:FORGOTTEN_BEAST_685:FATj#CREATURE:FORGOTTEN_BEAST_685:TALLOWj CREATURE:FORGOTTEN_BEAST_686:FATj#CREATURE:FORGOTTEN_BEAST_686:TALLOWj CREATURE:FORGOTTEN_BEAST_687:FATj#CREATURE:FORGOTTEN_BEAST_687:TALLOWj CREATURE:FORGOTTEN_BEAST_688:FATj#CREATURE:FORGOTTEN_BEAST_688:TALLOWj CREATURE:FORGOTTEN_BEAST_689:FATj#CREATURE:FORGOTTEN_BEAST_689:TALLOWj CREATURE:FORGOTTEN_BEAST_691:FATj#CREATURE:FORGOTTEN_BEAST_691:TALLOWj CREATURE:FORGOTTEN_BEAST_692:FATj#CREATURE:FORGOTTEN_BEAST_692:TALLOWj CREATURE:FORGOTTEN_BEAST_695:FATj#CREATURE:FORGOTTEN_BEAST_695:TALLOWj CREATURE:FORGOTTEN_BEAST_696:FATj#CREATURE:FORGOTTEN_BEAST_696:TALLOWj CREATURE:FORGOTTEN_BEAST_697:FATj#CREATURE:FORGOTTEN_BEAST_697:TALLOWj CREATURE:FORGOTTEN_BEAST_698:FATj#CREATURE:FORGOTTEN_BEAST_698:TALLOWj CREATURE:FORGOTTEN_BEAST_699:FATj#CREATURE:FORGOTTEN_BEAST_699:TALLOWj CREATURE:FORGOTTEN_BEAST_700:FATj#CREATURE:FORGOTTEN_BEAST_700:TALLOWj CREATURE:FORGOTTEN_BEAST_701:FATj#CREATURE:FORGOTTEN_BEAST_701:TALLOWj CREATURE:FORGOTTEN_BEAST_702:FATj#CREATURE:FORGOTTEN_BEAST_702:TALLOWj CREATURE:FORGOTTEN_BEAST_704:FATj#CREATURE:FORGOTTEN_BEAST_704:TALLOWj CREATURE:FORGOTTEN_BEAST_706:FATj#CREATURE:FORGOTTEN_BEAST_706:TALLOWj CREATURE:FORGOTTEN_BEAST_708:FATj#CREATURE:FORGOTTEN_BEAST_708:TALLOWj CREATURE:FORGOTTEN_BEAST_709:FATj#CREATURE:FORGOTTEN_BEAST_709:TALLOWj CREATURE:FORGOTTEN_BEAST_711:FATj#CREATURE:FORGOTTEN_BEAST_711:TALLOWj CREATURE:FORGOTTEN_BEAST_712:FATj#CREATURE:FORGOTTEN_BEAST_712:TALLOWj CREATURE:FORGOTTEN_BEAST_713:FATj#CREATURE:FORGOTTEN_BEAST_713:TALLOWj CREATURE:FORGOTTEN_BEAST_714:FATj#CREATURE:FORGOTTEN_BEAST_714:TALLOWj CREATURE:FORGOTTEN_BEAST_715:FATj#CREATURE:FORGOTTEN_BEAST_715:TALLOWj CREATURE:FORGOTTEN_BEAST_717:FATj#CREATURE:FORGOTTEN_BEAST_717:TALLOWj CREATURE:FORGOTTEN_BEAST_718:FATj#CREATURE:FORGOTTEN_BEAST_718:TALLOWj CREATURE:FORGOTTEN_BEAST_719:FATj#CREATURE:FORGOTTEN_BEAST_719:TALLOWj CREATURE:FORGOTTEN_BEAST_720:FATj#CREATURE:FORGOTTEN_BEAST_720:TALLOWj CREATURE:FORGOTTEN_BEAST_721:FATj#CREATURE:FORGOTTEN_BEAST_721:TALLOWj CREATURE:FORGOTTEN_BEAST_722:FATj#CREATURE:FORGOTTEN_BEAST_722:TALLOWj CREATURE:FORGOTTEN_BEAST_723:FATj#CREATURE:FORGOTTEN_BEAST_723:TALLOWj CREATURE:FORGOTTEN_BEAST_724:FATj#CREATURE:FORGOTTEN_BEAST_724:TALLOWj CREATURE:FORGOTTEN_BEAST_726:FATj#CREATURE:FORGOTTEN_BEAST_726:TALLOWj CREATURE:FORGOTTEN_BEAST_730:FATj#CREATURE:FORGOTTEN_BEAST_730:TALLOWj CREATURE:FORGOTTEN_BEAST_731:FATj#CREATURE:FORGOTTEN_BEAST_731:TALLOWj CREATURE:FORGOTTEN_BEAST_734:FATj#CREATURE:FORGOTTEN_BEAST_734:TALLOWj CREATURE:FORGOTTEN_BEAST_735:FATj#CREATURE:FORGOTTEN_BEAST_735:TALLOWj CREATURE:FORGOTTEN_BEAST_737:FATj#CREATURE:FORGOTTEN_BEAST_737:TALLOWj CREATURE:FORGOTTEN_BEAST_738:FATj#CREATURE:FORGOTTEN_BEAST_738:TALLOWj CREATURE:FORGOTTEN_BEAST_739:FATj#CREATURE:FORGOTTEN_BEAST_739:TALLOWj CREATURE:FORGOTTEN_BEAST_740:FATj#CREATURE:FORGOTTEN_BEAST_740:TALLOWj CREATURE:FORGOTTEN_BEAST_741:FATj#CREATURE:FORGOTTEN_BEAST_741:TALLOWj CREATURE:FORGOTTEN_BEAST_742:FATj#CREATURE:FORGOTTEN_BEAST_742:TALLOWj CREATURE:FORGOTTEN_BEAST_743:FATj#CREATURE:FORGOTTEN_BEAST_743:TALLOWj CREATURE:FORGOTTEN_BEAST_744:FATj#CREATURE:FORGOTTEN_BEAST_744:TALLOWj CREATURE:FORGOTTEN_BEAST_746:FATj#CREATURE:FORGOTTEN_BEAST_746:TALLOWj CREATURE:FORGOTTEN_BEAST_747:FATj#CREATURE:FORGOTTEN_BEAST_747:TALLOWj CREATURE:FORGOTTEN_BEAST_749:FATj#CREATURE:FORGOTTEN_BEAST_749:TALLOWj CREATURE:FORGOTTEN_BEAST_750:FATj#CREATURE:FORGOTTEN_BEAST_750:TALLOWj CREATURE:FORGOTTEN_BEAST_751:FATj#CREATURE:FORGOTTEN_BEAST_751:TALLOWj CREATURE:FORGOTTEN_BEAST_752:FATj#CREATURE:FORGOTTEN_BEAST_752:TALLOWj CREATURE:FORGOTTEN_BEAST_753:FATj#CREATURE:FORGOTTEN_BEAST_753:TALLOWj CREATURE:FORGOTTEN_BEAST_754:FATj#CREATURE:FORGOTTEN_BEAST_754:TALLOWj CREATURE:FORGOTTEN_BEAST_755:FATj#CREATURE:FORGOTTEN_BEAST_755:TALLOWj CREATURE:FORGOTTEN_BEAST_756:FATj#CREATURE:FORGOTTEN_BEAST_756:TALLOWj CREATURE:FORGOTTEN_BEAST_757:FATj#CREATURE:FORGOTTEN_BEAST_757:TALLOWj CREATURE:FORGOTTEN_BEAST_758:FATj#CREATURE:FORGOTTEN_BEAST_758:TALLOWj CREATURE:FORGOTTEN_BEAST_759:FATj#CREATURE:FORGOTTEN_BEAST_759:TALLOWj CREATURE:FORGOTTEN_BEAST_760:FATj#CREATURE:FORGOTTEN_BEAST_760:TALLOWj CREATURE:FORGOTTEN_BEAST_761:FATj#CREATURE:FORGOTTEN_BEAST_761:TALLOWj CREATURE:FORGOTTEN_BEAST_762:FATj#CREATURE:FORGOTTEN_BEAST_762:TALLOWj CREATURE:FORGOTTEN_BEAST_764:FATj#CREATURE:FORGOTTEN_BEAST_764:TALLOWj CREATURE:FORGOTTEN_BEAST_767:FATj#CREATURE:FORGOTTEN_BEAST_767:TALLOWj CREATURE:FORGOTTEN_BEAST_768:FATj#CREATURE:FORGOTTEN_BEAST_768:TALLOWj CREATURE:FORGOTTEN_BEAST_769:FATj#CREATURE:FORGOTTEN_BEAST_769:TALLOWj CREATURE:FORGOTTEN_BEAST_770:FATj#CREATURE:FORGOTTEN_BEAST_770:TALLOWj CREATURE:FORGOTTEN_BEAST_773:FATj#CREATURE:FORGOTTEN_BEAST_773:TALLOWj CREATURE:FORGOTTEN_BEAST_774:FATj#CREATURE:FORGOTTEN_BEAST_774:TALLOWj CREATURE:FORGOTTEN_BEAST_776:FATj#CREATURE:FORGOTTEN_BEAST_776:TALLOWj CREATURE:FORGOTTEN_BEAST_777:FATj#CREATURE:FORGOTTEN_BEAST_777:TALLOWj CREATURE:FORGOTTEN_BEAST_778:FATj#CREATURE:FORGOTTEN_BEAST_778:TALLOWj CREATURE:FORGOTTEN_BEAST_779:FATj#CREATURE:FORGOTTEN_BEAST_779:TALLOWj CREATURE:FORGOTTEN_BEAST_780:FATj#CREATURE:FORGOTTEN_BEAST_780:TALLOWj CREATURE:FORGOTTEN_BEAST_781:FATj#CREATURE:FORGOTTEN_BEAST_781:TALLOWj CREATURE:FORGOTTEN_BEAST_782:FATj#CREATURE:FORGOTTEN_BEAST_782:TALLOWj CREATURE:FORGOTTEN_BEAST_783:FATj#CREATURE:FORGOTTEN_BEAST_783:TALLOWj CREATURE:FORGOTTEN_BEAST_784:FATj#CREATURE:FORGOTTEN_BEAST_784:TALLOWj CREATURE:FORGOTTEN_BEAST_785:FATj#CREATURE:FORGOTTEN_BEAST_785:TALLOWj CREATURE:FORGOTTEN_BEAST_786:FATj#CREATURE:FORGOTTEN_BEAST_786:TALLOWj CREATURE:FORGOTTEN_BEAST_787:FATj#CREATURE:FORGOTTEN_BEAST_787:TALLOWj CREATURE:FORGOTTEN_BEAST_789:FATj#CREATURE:FORGOTTEN_BEAST_789:TALLOWj CREATURE:FORGOTTEN_BEAST_792:FATj#CREATURE:FORGOTTEN_BEAST_792:TALLOWj CREATURE:FORGOTTEN_BEAST_793:FATj#CREATURE:FORGOTTEN_BEAST_793:TALLOWj CREATURE:FORGOTTEN_BEAST_794:FATj#CREATURE:FORGOTTEN_BEAST_794:TALLOWj CREATURE:FORGOTTEN_BEAST_795:FATj#CREATURE:FORGOTTEN_BEAST_795:TALLOWj CREATURE:FORGOTTEN_BEAST_796:FATj#CREATURE:FORGOTTEN_BEAST_796:TALLOWj CREATURE:FORGOTTEN_BEAST_799:FATj#CREATURE:FORGOTTEN_BEAST_799:TALLOWj CREATURE:FORGOTTEN_BEAST_800:FATj#CREATURE:FORGOTTEN_BEAST_800:TALLOWj CREATURE:FORGOTTEN_BEAST_801:FATj#CREATURE:FORGOTTEN_BEAST_801:TALLOWj CREATURE:FORGOTTEN_BEAST_802:FATj#CREATURE:FORGOTTEN_BEAST_802:TALLOWj CREATURE:FORGOTTEN_BEAST_803:FATj#CREATURE:FORGOTTEN_BEAST_803:TALLOWj CREATURE:FORGOTTEN_BEAST_804:FATj#CREATURE:FORGOTTEN_BEAST_804:TALLOWj CREATURE:FORGOTTEN_BEAST_806:FATj#CREATURE:FORGOTTEN_BEAST_806:TALLOWj CREATURE:FORGOTTEN_BEAST_807:FATj#CREATURE:FORGOTTEN_BEAST_807:TALLOWj CREATURE:FORGOTTEN_BEAST_809:FATj#CREATURE:FORGOTTEN_BEAST_809:TALLOWj CREATURE:FORGOTTEN_BEAST_810:FATj#CREATURE:FORGOTTEN_BEAST_810:TALLOWj CREATURE:FORGOTTEN_BEAST_811:FATj#CREATURE:FORGOTTEN_BEAST_811:TALLOWj CREATURE:FORGOTTEN_BEAST_812:FATj#CREATURE:FORGOTTEN_BEAST_812:TALLOWj CREATURE:FORGOTTEN_BEAST_815:FATj#CREATURE:FORGOTTEN_BEAST_815:TALLOWj CREATURE:FORGOTTEN_BEAST_817:FATj#CREATURE:FORGOTTEN_BEAST_817:TALLOWj CREATURE:FORGOTTEN_BEAST_818:FATj#CREATURE:FORGOTTEN_BEAST_818:TALLOWj CREATURE:FORGOTTEN_BEAST_819:FATj#CREATURE:FORGOTTEN_BEAST_819:TALLOWj CREATURE:FORGOTTEN_BEAST_820:FATj#CREATURE:FORGOTTEN_BEAST_820:TALLOWj CREATURE:FORGOTTEN_BEAST_821:FATj#CREATURE:FORGOTTEN_BEAST_821:TALLOWj CREATURE:FORGOTTEN_BEAST_822:FATj#CREATURE:FORGOTTEN_BEAST_822:TALLOWj CREATURE:FORGOTTEN_BEAST_824:FATj#CREATURE:FORGOTTEN_BEAST_824:TALLOWj CREATURE:FORGOTTEN_BEAST_825:FATj#CREATURE:FORGOTTEN_BEAST_825:TALLOWj CREATURE:FORGOTTEN_BEAST_826:FATj#CREATURE:FORGOTTEN_BEAST_826:TALLOWj CREATURE:FORGOTTEN_BEAST_827:FATj#CREATURE:FORGOTTEN_BEAST_827:TALLOWj CREATURE:FORGOTTEN_BEAST_828:FATj#CREATURE:FORGOTTEN_BEAST_828:TALLOWj CREATURE:FORGOTTEN_BEAST_831:FATj#CREATURE:FORGOTTEN_BEAST_831:TALLOWj CREATURE:FORGOTTEN_BEAST_833:FATj#CREATURE:FORGOTTEN_BEAST_833:TALLOWj CREATURE:FORGOTTEN_BEAST_835:FATj#CREATURE:FORGOTTEN_BEAST_835:TALLOWj CREATURE:FORGOTTEN_BEAST_837:FATj#CREATURE:FORGOTTEN_BEAST_837:TALLOWj CREATURE:FORGOTTEN_BEAST_838:FATj#CREATURE:FORGOTTEN_BEAST_838:TALLOWj CREATURE:FORGOTTEN_BEAST_842:FATj#CREATURE:FORGOTTEN_BEAST_842:TALLOWj CREATURE:FORGOTTEN_BEAST_843:FATj#CREATURE:FORGOTTEN_BEAST_843:TALLOWj CREATURE:FORGOTTEN_BEAST_844:FATj#CREATURE:FORGOTTEN_BEAST_844:TALLOWj CREATURE:FORGOTTEN_BEAST_845:FATj#CREATURE:FORGOTTEN_BEAST_845:TALLOWj CREATURE:FORGOTTEN_BEAST_846:FATj#CREATURE:FORGOTTEN_BEAST_846:TALLOWj CREATURE:FORGOTTEN_BEAST_847:FATj#CREATURE:FORGOTTEN_BEAST_847:TALLOWj CREATURE:FORGOTTEN_BEAST_848:FATj#CREATURE:FORGOTTEN_BEAST_848:TALLOWj CREATURE:FORGOTTEN_BEAST_849:FATj#CREATURE:FORGOTTEN_BEAST_849:TALLOWj CREATURE:FORGOTTEN_BEAST_851:FATj#CREATURE:FORGOTTEN_BEAST_851:TALLOWj CREATURE:FORGOTTEN_BEAST_853:FATj#CREATURE:FORGOTTEN_BEAST_853:TALLOWj CREATURE:FORGOTTEN_BEAST_854:FATj#CREATURE:FORGOTTEN_BEAST_854:TALLOWj CREATURE:FORGOTTEN_BEAST_855:FATj#CREATURE:FORGOTTEN_BEAST_855:TALLOWj CREATURE:FORGOTTEN_BEAST_857:FATj#CREATURE:FORGOTTEN_BEAST_857:TALLOWj CREATURE:FORGOTTEN_BEAST_858:FATj#CREATURE:FORGOTTEN_BEAST_858:TALLOWj CREATURE:FORGOTTEN_BEAST_859:FATj#CREATURE:FORGOTTEN_BEAST_859:TALLOWj CREATURE:FORGOTTEN_BEAST_860:FATj#CREATURE:FORGOTTEN_BEAST_860:TALLOWj CREATURE:FORGOTTEN_BEAST_861:FATj#CREATURE:FORGOTTEN_BEAST_861:TALLOWj CREATURE:FORGOTTEN_BEAST_862:FATj#CREATURE:FORGOTTEN_BEAST_862:TALLOWj CREATURE:FORGOTTEN_BEAST_865:FATj#CREATURE:FORGOTTEN_BEAST_865:TALLOWj CREATURE:FORGOTTEN_BEAST_866:FATj#CREATURE:FORGOTTEN_BEAST_866:TALLOWj CREATURE:FORGOTTEN_BEAST_867:FATj#CREATURE:FORGOTTEN_BEAST_867:TALLOWjCREATURE:TITAN_1:FATjCREATURE:TITAN_1:TALLOWjCREATURE:TITAN_3:FATjCREATURE:TITAN_3:TALLOWjCREATURE:TITAN_4:FATjCREATURE:TITAN_4:TALLOWjCREATURE:TITAN_6:FATjCREATURE:TITAN_6:TALLOWjCREATURE:TITAN_7:FATjCREATURE:TITAN_7:TALLOWjCREATURE:TITAN_8:FATjCREATURE:TITAN_8:TALLOWjCREATURE:TITAN_9:FATjCREATURE:TITAN_9:TALLOWjCREATURE:TITAN_10:FATjCREATURE:TITAN_10:TALLOWjCREATURE:TITAN_11:FATjCREATURE:TITAN_11:TALLOWjCREATURE:TITAN_12:FATjCREATURE:TITAN_12:TALLOWjCREATURE:TITAN_13:FATjCREATURE:TITAN_13:TALLOWjCREATURE:TITAN_14:FATjCREATURE:TITAN_14:TALLOWjCREATURE:TITAN_15:FATjCREATURE:TITAN_15:TALLOWjCREATURE:TITAN_18:FATjCREATURE:TITAN_18:TALLOWjCREATURE:TITAN_19:FATjCREATURE:TITAN_19:TALLOWjCREATURE:TITAN_21:FATjCREATURE:TITAN_21:TALLOWjCREATURE:TITAN_23:FATjCREATURE:TITAN_23:TALLOWjCREATURE:TITAN_24:FATjCREATURE:TITAN_24:TALLOWjCREATURE:TITAN_25:FATjCREATURE:TITAN_25:TALLOWjCREATURE:TITAN_26:FATjCREATURE:TITAN_26:TALLOWjCREATURE:TITAN_27:FATjCREATURE:TITAN_27:TALLOWjCREATURE:TITAN_28:FATjCREATURE:TITAN_28:TALLOWjCREATURE:TITAN_29:FATjCREATURE:TITAN_29:TALLOWjCREATURE:TITAN_30:FATjCREATURE:TITAN_30:TALLOWjCREATURE:TITAN_32:FATjCREATURE:TITAN_32:TALLOWjCREATURE:TITAN_33:FATjCREATURE:TITAN_33:TALLOWjCREATURE:DEMON_7:FATjCREATURE:DEMON_7:TALLOWjCREATURE:DEMON_8:FATjCREATURE:DEMON_8:TALLOWjCREATURE:DEMON_9:FATjCREATURE:DEMON_9:TALLOWjCREATURE:DEMON_10:FATjCREATURE:DEMON_10:TALLOWjCREATURE:DEMON_11:FATjCREATURE:DEMON_11:TALLOWjCREATURE:DEMON_12:FATjCREATURE:DEMON_12:TALLOWjCREATURE:DEMON_13:FATjCREATURE:DEMON_13:TALLOWjCREATURE:DEMON_14:FATjCREATURE:DEMON_14:TALLOWjCREATURE:DEMON_15:FATjCREATURE:DEMON_15:TALLOWjCREATURE:DEMON_16:FATjCREATURE:DEMON_16:TALLOWjCREATURE:DEMON_17:FATjCREATURE:DEMON_17:TALLOWjCREATURE:DEMON_18:FATjCREATURE:DEMON_18:TALLOWjCREATURE:DEMON_19:FATjCREATURE:DEMON_19:TALLOWjCREATURE:DEMON_20:FATjCREATURE:DEMON_20:TALLOWjCREATURE:DEMON_21:FATjCREATURE:DEMON_21:TALLOWjCREATURE:DEMON_22:FATjCREATURE:DEMON_22:TALLOWjCREATURE:DEMON_23:FATjCREATURE:DEMON_23:TALLOWjCREATURE:DEMON_24:FATjCREATURE:DEMON_24:TALLOWjCREATURE:DEMON_25:FATjCREATURE:DEMON_25:TALLOWjCREATURE:DEMON_26:FATjCREATURE:DEMON_26:TALLOWjCREATURE:DEMON_27:FATjCREATURE:DEMON_27:TALLOWjCREATURE:DEMON_28:FATjCREATURE:DEMON_28:TALLOWjCREATURE:DEMON_29:FATjCREATURE:DEMON_29:TALLOWjCREATURE:DEMON_31:FATjCREATURE:DEMON_31:TALLOWjCREATURE:DEMON_32:FATjCREATURE:DEMON_32:TALLOWjCREATURE:DEMON_38:FATjCREATURE:DEMON_38:TALLOWjCREATURE:DEMON_39:FATjCREATURE:DEMON_39:TALLOWjCREATURE:DEMON_40:FATjCREATURE:DEMON_40:TALLOWjCREATURE:DEMON_41:FATjCREATURE:DEMON_41:TALLOWjCREATURE:DEMON_42:FATjCREATURE:DEMON_42:TALLOWjCREATURE:DEMON_43:FATjCREATURE:DEMON_43:TALLOWjCREATURE:DEMON_44:FATjCREATURE:DEMON_44:TALLOWjCREATURE:DEMON_45:FATjCREATURE:DEMON_45:TALLOWjCREATURE:DEMON_47:FATjCREATURE:DEMON_47:TALLOWjCREATURE:DEMON_48:FATjCREATURE:DEMON_48:TALLOWjCREATURE:DEMON_49:FATjCREATURE:DEMON_49:TALLOWjCREATURE:DEMON_52:FATjCREATURE:DEMON_52:TALLOWjCREATURE:NIGHT_CREATURE_1:FATj CREATURE:NIGHT_CREATURE_1:TALLOWjCREATURE:NIGHT_CREATURE_2:FATj CREATURE:NIGHT_CREATURE_2:TALLOWjCREATURE:NIGHT_CREATURE_3:FATj CREATURE:NIGHT_CREATURE_3:TALLOWjCREATURE:NIGHT_CREATURE_4:FATj CREATURE:NIGHT_CREATURE_4:TALLOWjCREATURE:NIGHT_CREATURE_5:FATj CREATURE:NIGHT_CREATURE_5:TALLOWjCREATURE:NIGHT_CREATURE_6:FATj CREATURE:NIGHT_CREATURE_6:TALLOWjCREATURE:NIGHT_CREATURE_7:FATj CREATURE:NIGHT_CREATURE_7:TALLOWjCREATURE:NIGHT_CREATURE_8:FATj CREATURE:NIGHT_CREATURE_8:TALLOWjCREATURE:NIGHT_CREATURE_9:FATj CREATURE:NIGHT_CREATURE_9:TALLOWjCREATURE:NIGHT_CREATURE_10:FATj!CREATURE:NIGHT_CREATURE_10:TALLOWjCREATURE:NIGHT_CREATURE_11:FATj!CREATURE:NIGHT_CREATURE_11:TALLOWjCREATURE:NIGHT_CREATURE_12:FATj!CREATURE:NIGHT_CREATURE_12:TALLOWjCREATURE:NIGHT_CREATURE_13:FATj!CREATURE:NIGHT_CREATURE_13:TALLOWjCREATURE:NIGHT_CREATURE_14:FATj!CREATURE:NIGHT_CREATURE_14:TALLOWjCREATURE:NIGHT_CREATURE_15:FATj!CREATURE:NIGHT_CREATURE_15:TALLOWjCREATURE:NIGHT_CREATURE_16:FATj!CREATURE:NIGHT_CREATURE_16:TALLOWjCREATURE:NIGHT_CREATURE_17:FATj!CREATURE:NIGHT_CREATURE_17:TALLOWjCREATURE:NIGHT_CREATURE_18:FATj!CREATURE:NIGHT_CREATURE_18:TALLOWjCREATURE:NIGHT_CREATURE_19:FATj!CREATURE:NIGHT_CREATURE_19:TALLOWjCREATURE:NIGHT_CREATURE_20:FATj!CREATURE:NIGHT_CREATURE_20:TALLOWjCREATURE:NIGHT_CREATURE_21:FATj!CREATURE:NIGHT_CREATURE_21:TALLOWjCREATURE:NIGHT_CREATURE_22:FATj!CREATURE:NIGHT_CREATURE_22:TALLOWjCREATURE:NIGHT_CREATURE_23:FATj!CREATURE:NIGHT_CREATURE_23:TALLOWjCREATURE:NIGHT_CREATURE_24:FATj!CREATURE:NIGHT_CREATURE_24:TALLOWjCREATURE:NIGHT_CREATURE_25:FATj!CREATURE:NIGHT_CREATURE_25:TALLOWjCREATURE:NIGHT_CREATURE_26:FATj!CREATURE:NIGHT_CREATURE_26:TALLOWjCREATURE:NIGHT_CREATURE_27:FATj!CREATURE:NIGHT_CREATURE_27:TALLOWjCREATURE:NIGHT_CREATURE_28:FATj!CREATURE:NIGHT_CREATURE_28:TALLOWjCREATURE:NIGHT_CREATURE_29:FATj!CREATURE:NIGHT_CREATURE_29:TALLOWjCREATURE:NIGHT_CREATURE_30:FATj!CREATURE:NIGHT_CREATURE_30:TALLOWjCREATURE:NIGHT_CREATURE_31:FATj!CREATURE:NIGHT_CREATURE_31:TALLOWjCREATURE:NIGHT_CREATURE_32:FATj!CREATURE:NIGHT_CREATURE_32:TALLOWjCREATURE:NIGHT_CREATURE_33:FATj!CREATURE:NIGHT_CREATURE_33:TALLOWjCREATURE:NIGHT_CREATURE_34:FATj!CREATURE:NIGHT_CREATURE_34:TALLOWjCREATURE:NIGHT_CREATURE_35:FATj!CREATURE:NIGHT_CREATURE_35:TALLOWjCREATURE:NIGHT_CREATURE_36:FATj!CREATURE:NIGHT_CREATURE_36:TALLOWjCREATURE:NIGHT_CREATURE_37:FATj!CREATURE:NIGHT_CREATURE_37:TALLOWjCREATURE:NIGHT_CREATURE_38:FATj!CREATURE:NIGHT_CREATURE_38:TALLOWjCREATURE:NIGHT_CREATURE_39:FATj!CREATURE:NIGHT_CREATURE_39:TALLOWjCREATURE:NIGHT_CREATURE_40:FATj!CREATURE:NIGHT_CREATURE_40:TALLOWjCREATURE:NIGHT_CREATURE_41:FATj!CREATURE:NIGHT_CREATURE_41:TALLOWjCREATURE:NIGHT_CREATURE_42:FATj!CREATURE:NIGHT_CREATURE_42:TALLOWjCREATURE:NIGHT_CREATURE_43:FATj!CREATURE:NIGHT_CREATURE_43:TALLOWjCREATURE:NIGHT_CREATURE_44:FATj!CREATURE:NIGHT_CREATURE_44:TALLOWjCREATURE:NIGHT_CREATURE_45:FATj!CREATURE:NIGHT_CREATURE_45:TALLOWjCREATURE:NIGHT_CREATURE_46:FATj!CREATURE:NIGHT_CREATURE_46:TALLOWjCREATURE:NIGHT_CREATURE_47:FATj!CREATURE:NIGHT_CREATURE_47:TALLOWjCREATURE:NIGHT_CREATURE_48:FATj!CREATURE:NIGHT_CREATURE_48:TALLOWjCREATURE:NIGHT_CREATURE_49:FATj!CREATURE:NIGHT_CREATURE_49:TALLOWjCREATURE:NIGHT_CREATURE_50:FATj!CREATURE:NIGHT_CREATURE_50:TALLOWjCREATURE:NIGHT_CREATURE_51:FATj!CREATURE:NIGHT_CREATURE_51:TALLOWjCREATURE:NIGHT_CREATURE_52:FATj!CREATURE:NIGHT_CREATURE_52:TALLOWjCREATURE:NIGHT_CREATURE_53:FATj!CREATURE:NIGHT_CREATURE_53:TALLOWjCREATURE:NIGHT_CREATURE_54:FATj!CREATURE:NIGHT_CREATURE_54:TALLOWjCREATURE:NIGHT_CREATURE_55:FATj!CREATURE:NIGHT_CREATURE_55:TALLOWjCREATURE:NIGHT_CREATURE_56:FATj!CREATURE:NIGHT_CREATURE_56:TALLOWjCREATURE:NIGHT_CREATURE_57:FATj!CREATURE:NIGHT_CREATURE_57:TALLOWjCREATURE:NIGHT_CREATURE_58:FATj!CREATURE:NIGHT_CREATURE_58:TALLOWjCREATURE:NIGHT_CREATURE_59:FATj!CREATURE:NIGHT_CREATURE_59:TALLOWjCREATURE:NIGHT_CREATURE_60:FATj!CREATURE:NIGHT_CREATURE_60:TALLOWjCREATURE:NIGHT_CREATURE_61:FATj!CREATURE:NIGHT_CREATURE_61:TALLOWjCREATURE:NIGHT_CREATURE_62:FATj!CREATURE:NIGHT_CREATURE_62:TALLOWjCREATURE:NIGHT_CREATURE_63:FATj!CREATURE:NIGHT_CREATURE_63:TALLOWjCREATURE:NIGHT_CREATURE_64:FATj!CREATURE:NIGHT_CREATURE_64:TALLOWjCREATURE:NIGHT_CREATURE_65:FATj!CREATURE:NIGHT_CREATURE_65:TALLOWjCREATURE:NIGHT_CREATURE_66:FATj!CREATURE:NIGHT_CREATURE_66:TALLOWjCREATURE:NIGHT_CREATURE_67:FATj!CREATURE:NIGHT_CREATURE_67:TALLOWjCREATURE:NIGHT_CREATURE_68:FATj!CREATURE:NIGHT_CREATURE_68:TALLOWjCREATURE:NIGHT_CREATURE_69:FATj!CREATURE:NIGHT_CREATURE_69:TALLOWjCREATURE:NIGHT_CREATURE_70:FATj!CREATURE:NIGHT_CREATURE_70:TALLOWjCREATURE:NIGHT_CREATURE_71:FATj!CREATURE:NIGHT_CREATURE_71:TALLOWjCREATURE:NIGHT_CREATURE_72:FATj!CREATURE:NIGHT_CREATURE_72:TALLOWjCREATURE:NIGHT_CREATURE_73:FATj!CREATURE:NIGHT_CREATURE_73:TALLOWjCREATURE:NIGHT_CREATURE_74:FATj!CREATURE:NIGHT_CREATURE_74:TALLOWjCREATURE:NIGHT_CREATURE_75:FATj!CREATURE:NIGHT_CREATURE_75:TALLOWjCREATURE:NIGHT_CREATURE_76:FATj!CREATURE:NIGHT_CREATURE_76:TALLOWjCREATURE:NIGHT_CREATURE_77:FATj!CREATURE:NIGHT_CREATURE_77:TALLOWjCREATURE:NIGHT_CREATURE_78:FATj!CREATURE:NIGHT_CREATURE_78:TALLOWjCREATURE:NIGHT_CREATURE_79:FATj!CREATURE:NIGHT_CREATURE_79:TALLOWjCREATURE:NIGHT_CREATURE_80:FATj!CREATURE:NIGHT_CREATURE_80:TALLOWjCREATURE:NIGHT_CREATURE_81:FATj!CREATURE:NIGHT_CREATURE_81:TALLOWjCREATURE:NIGHT_CREATURE_82:FATj!CREATURE:NIGHT_CREATURE_82:TALLOWjCREATURE:NIGHT_CREATURE_83:FATj!CREATURE:NIGHT_CREATURE_83:TALLOWjCREATURE:NIGHT_CREATURE_84:FATj!CREATURE:NIGHT_CREATURE_84:TALLOWjCREATURE:NIGHT_CREATURE_85:FATj!CREATURE:NIGHT_CREATURE_85:TALLOWjCREATURE:NIGHT_CREATURE_86:FATj!CREATURE:NIGHT_CREATURE_86:TALLOWjCREATURE:NIGHT_CREATURE_87:FATj!CREATURE:NIGHT_CREATURE_87:TALLOWjCREATURE:NIGHT_CREATURE_88:FATj!CREATURE:NIGHT_CREATURE_88:TALLOWjCREATURE:NIGHT_CREATURE_89:FATj!CREATURE:NIGHT_CREATURE_89:TALLOWjCREATURE:NIGHT_CREATURE_90:FATj!CREATURE:NIGHT_CREATURE_90:TALLOWjCREATURE:NIGHT_CREATURE_91:FATj!CREATURE:NIGHT_CREATURE_91:TALLOWjCREATURE:NIGHT_CREATURE_92:FATj!CREATURE:NIGHT_CREATURE_92:TALLOWjCREATURE:NIGHT_CREATURE_93:FATj!CREATURE:NIGHT_CREATURE_93:TALLOWjCREATURE:NIGHT_CREATURE_94:FATj!CREATURE:NIGHT_CREATURE_94:TALLOWjCREATURE:NIGHT_CREATURE_95:FATj!CREATURE:NIGHT_CREATURE_95:TALLOWjCREATURE:NIGHT_CREATURE_96:FATj!CREATURE:NIGHT_CREATURE_96:TALLOWjCREATURE:NIGHT_CREATURE_97:FATj!CREATURE:NIGHT_CREATURE_97:TALLOWjCREATURE:NIGHT_CREATURE_98:FATj!CREATURE:NIGHT_CREATURE_98:TALLOWjCREATURE:NIGHT_CREATURE_99:FATj!CREATURE:NIGHT_CREATURE_99:TALLOWjCREATURE:NIGHT_CREATURE_100:FATj"CREATURE:NIGHT_CREATURE_100:TALLOWjCREATURE:NIGHT_CREATURE_101:FATj"CREATURE:NIGHT_CREATURE_101:TALLOWjCREATURE:NIGHT_CREATURE_102:FATj"CREATURE:NIGHT_CREATURE_102:TALLOWjCREATURE:NIGHT_CREATURE_103:FATj"CREATURE:NIGHT_CREATURE_103:TALLOWjCREATURE:NIGHT_CREATURE_104:FATj"CREATURE:NIGHT_CREATURE_104:TALLOWjCREATURE:HF1248 DIVINE_1:FATjCREATURE:HF1248 DIVINE_1:TALLOWjCREATURE:HF1248 DIVINE_2:FATjCREATURE:HF1248 DIVINE_2:TALLOWjCREATURE:HF1248 DIVINE_3:FATjCREATURE:HF1248 DIVINE_3:TALLOWjCREATURE:HF1108 DIVINE_2:FATjCREATURE:HF1108 DIVINE_2:TALLOWjCREATURE:HF1249 DIVINE_1:FATjCREATURE:HF1249 DIVINE_1:TALLOWjCREATURE:HF1249 DIVINE_3:FATjCREATURE:HF1249 DIVINE_3:TALLOWjCREATURE:HF1345 DIVINE_3:FATjCREATURE:HF1345 DIVINE_3:TALLOWrPLANT:FLAX:SEEDrPLANT:FLAX:THREADrPLANT:JUTE:THREADrPLANT:HEMP:SEEDrPLANT:HEMP:THREADrPLANT:COTTON:SEEDrPLANT:COTTON:THREADrPLANT:RAMIE:THREADrPLANT:KENAF:SEEDrPLANT:KENAF:THREADrPLANT:GRASS_TAIL_PIG:THREADrPLANT:BUSH_QUARRY:SEEDrPLANT:REED_ROPE:THREADzPLANT:FLAX:SEEDzPLANT:HEMP:SEEDzPLANT:COTTON:SEEDzPLANT:KENAF:SEEDzPLANT:OLIVE:FRUITzPLANT:BUSH_QUARRY:SEEDzCREATURE:HONEY_BEE:WAX‚PLANT:FLAX:OIL‚PLANT:HEMP:OIL‚PLANT:COTTON:OIL‚PLANT:KENAF:OIL‚PLANT:OLIVE:OIL‚PLANT:POD_SWEET:EXTRACT‚PLANT:BUSH_QUARRY:OIL‚PLANT:BULB_KOBOLD:EXTRACT‚PLANT:HERB_VALLEY:EXTRACTŠCREATURE:BARK_SCORPION:VENOMŠ CREATURE:BARK_SCORPION_MAN:VENOMŠ"CREATURE:GIANT_BARK_SCORPION:VENOMŠ#CREATURE:SPIDER_BROWN_RECLUSE:VENOMŠ'CREATURE:BROWN_RECLUSE_SPIDER_MAN:VENOMŠ)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:VENOMŠCREATURE:GILA_MONSTER:VENOMŠCREATURE:GILA_MONSTER_MAN:VENOMŠ!CREATURE:GIANT_GILA_MONSTER:VENOMŠCREATURE:DONKEY:MILKŠCREATURE:HORSE:MILKŠCREATURE:COW:MILKŠCREATURE:SHEEP:MILKŠCREATURE:PIG:MILKŠCREATURE:GOAT:MILKŠCREATURE:WATER_BUFFALO:MILKŠCREATURE:REINDEER:MILKŠCREATURE:YAK:MILKŠCREATURE:LLAMA:MILKŠCREATURE:ALPACA:MILKŠCREATURE:HONEY_BEE:ROYAL_JELLYŠCREATURE:HONEY_BEE:HONEYŠCREATURE:HONEY_BEE:VENOMŠCREATURE:BUMBLEBEE:ROYAL_JELLYŠCREATURE:BUMBLEBEE:HONEYŠCREATURE:BUMBLEBEE:VENOMŠCREATURE:PLATYPUS:VENOMŠCREATURE:PLATYPUS MAN:VENOMŠCREATURE:PLATYPUS, GIANT:VENOMŠCREATURE:CAMEL_1_HUMP:MILKŠCREATURE:CAMEL_1_HUMP_MAN:MILKŠ CREATURE:GIANT_CAMEL_1_HUMP:MILKŠCREATURE:CAMEL_2_HUMP:MILKŠCREATURE:CAMEL_2_HUMP_MAN:MILKŠ CREATURE:GIANT_CAMEL_2_HUMP:MILKŠCREATURE:HELMET_SNAKE:VENOMŠCREATURE:CAVE_FLOATER:POD_JUICEŠCREATURE:CAVE_BLOB:FLUIDŠCREATURE:OCTOPUS:INKŠCREATURE:OCTOPUS_MAN:INKŠCREATURE:GIANT_OCTOPUS:INKŠCREATURE:CUTTLEFISH:INKŠCREATURE:CUTTLEFISH_MAN:INKŠCREATURE:GIANT_CUTTLEFISH:INKŠCREATURE:MOGHOPPER:MOG_JUICEŠCREATURE:SPIDER_PHANTOM:VENOMŠCREATURE:SQUID:INKŠCREATURE:SQUID MAN:INKŠCREATURE:GIGANTIC SQUID:INKŠ!CREATURE:SPIDER_CAVE_GIANT:POISONŠCREATURE:SPIDER_CAVE:VENOMŠCREATURE:MAGGOT_PURRING:MILKŠCREATURE:ELEMENTMAN_IRON:GASŠCREATURE:SERPENT_MAN:VENOMŠCREATURE:KANGAROO:MILKŠCREATURE:KANGAROO_MAN:MILKŠCREATURE:GIANT_KANGAROO:MILKŠCREATURE:ADDER:VENOMŠCREATURE:ADDER_MAN:VENOMŠCREATURE:GIANT_ADDER:VENOMŠCREATURE:RATTLESNAKE:VENOMŠCREATURE:RATTLESNAKE_MAN:VENOMŠ CREATURE:GIANT_RATTLESNAKE:VENOMŠCREATURE:COPPERHEAD_SNAKE:VENOMŠ#CREATURE:COPPERHEAD_SNAKE_MAN:VENOMŠ%CREATURE:GIANT_COPPERHEAD_SNAKE:VENOMŠCREATURE:KING_COBRA:VENOMŠCREATURE:KING_COBRA_MAN:VENOMŠCREATURE:GIANT_KING_COBRA:VENOMŠCREATURE:BLACK_MAMBA:VENOMŠCREATURE:BLACK_MAMBA_MAN:VENOMŠ CREATURE:GIANT_BLACK_MAMBA:VENOMŠCREATURE:BUSHMASTER:VENOMŠCREATURE:BUSHMASTER_MAN:VENOMŠCREATURE:GIANT_BUSHMASTER:VENOMŠCREATURE:TAPIR:MILKŠCREATURE:TAPIR_MAN:MILKŠCREATURE:GIANT_TAPIR:MILKŠ!CREATURE:FORGOTTEN_BEAST_2:POISONŠ!CREATURE:FORGOTTEN_BEAST_4:POISONŠ!CREATURE:FORGOTTEN_BEAST_5:POISONŠ!CREATURE:FORGOTTEN_BEAST_7:POISONŠ!CREATURE:FORGOTTEN_BEAST_8:POISONŠ!CREATURE:FORGOTTEN_BEAST_9:POISONŠ"CREATURE:FORGOTTEN_BEAST_11:POISONŠ"CREATURE:FORGOTTEN_BEAST_13:POISONŠ"CREATURE:FORGOTTEN_BEAST_15:POISONŠ"CREATURE:FORGOTTEN_BEAST_16:POISONŠ"CREATURE:FORGOTTEN_BEAST_18:POISONŠ"CREATURE:FORGOTTEN_BEAST_19:POISONŠ"CREATURE:FORGOTTEN_BEAST_20:POISONŠ"CREATURE:FORGOTTEN_BEAST_21:POISONŠ"CREATURE:FORGOTTEN_BEAST_22:POISONŠ"CREATURE:FORGOTTEN_BEAST_24:POISONŠ"CREATURE:FORGOTTEN_BEAST_25:POISONŠ"CREATURE:FORGOTTEN_BEAST_27:POISONŠ"CREATURE:FORGOTTEN_BEAST_28:POISONŠ"CREATURE:FORGOTTEN_BEAST_33:POISONŠ"CREATURE:FORGOTTEN_BEAST_36:POISONŠ"CREATURE:FORGOTTEN_BEAST_37:POISONŠ"CREATURE:FORGOTTEN_BEAST_39:POISONŠ"CREATURE:FORGOTTEN_BEAST_40:POISONŠ"CREATURE:FORGOTTEN_BEAST_41:POISONŠ"CREATURE:FORGOTTEN_BEAST_43:POISONŠ"CREATURE:FORGOTTEN_BEAST_44:POISONŠ"CREATURE:FORGOTTEN_BEAST_45:POISONŠ"CREATURE:FORGOTTEN_BEAST_46:POISONŠ"CREATURE:FORGOTTEN_BEAST_48:POISONŠ"CREATURE:FORGOTTEN_BEAST_49:POISONŠ"CREATURE:FORGOTTEN_BEAST_50:POISONŠ"CREATURE:FORGOTTEN_BEAST_51:POISONŠ"CREATURE:FORGOTTEN_BEAST_56:POISONŠ"CREATURE:FORGOTTEN_BEAST_59:POISONŠ"CREATURE:FORGOTTEN_BEAST_61:POISONŠ"CREATURE:FORGOTTEN_BEAST_62:POISONŠ"CREATURE:FORGOTTEN_BEAST_64:POISONŠ"CREATURE:FORGOTTEN_BEAST_66:POISONŠ"CREATURE:FORGOTTEN_BEAST_67:POISONŠ"CREATURE:FORGOTTEN_BEAST_69:POISONŠ"CREATURE:FORGOTTEN_BEAST_70:POISONŠ"CREATURE:FORGOTTEN_BEAST_72:POISONŠ"CREATURE:FORGOTTEN_BEAST_73:POISONŠ"CREATURE:FORGOTTEN_BEAST_75:POISONŠ"CREATURE:FORGOTTEN_BEAST_77:POISONŠ"CREATURE:FORGOTTEN_BEAST_78:POISONŠ"CREATURE:FORGOTTEN_BEAST_80:POISONŠ"CREATURE:FORGOTTEN_BEAST_82:POISONŠ"CREATURE:FORGOTTEN_BEAST_84:POISONŠ"CREATURE:FORGOTTEN_BEAST_88:POISONŠ"CREATURE:FORGOTTEN_BEAST_89:POISONŠ"CREATURE:FORGOTTEN_BEAST_90:POISONŠ"CREATURE:FORGOTTEN_BEAST_92:POISONŠ"CREATURE:FORGOTTEN_BEAST_93:POISONŠ"CREATURE:FORGOTTEN_BEAST_94:POISONŠ"CREATURE:FORGOTTEN_BEAST_95:POISONŠ"CREATURE:FORGOTTEN_BEAST_97:POISONŠ"CREATURE:FORGOTTEN_BEAST_98:POISONŠ#CREATURE:FORGOTTEN_BEAST_100:POISONŠ#CREATURE:FORGOTTEN_BEAST_104:POISONŠ#CREATURE:FORGOTTEN_BEAST_105:POISONŠ#CREATURE:FORGOTTEN_BEAST_106:POISONŠ#CREATURE:FORGOTTEN_BEAST_107:POISONŠ#CREATURE:FORGOTTEN_BEAST_108:POISONŠ#CREATURE:FORGOTTEN_BEAST_110:POISONŠ#CREATURE:FORGOTTEN_BEAST_114:POISONŠ#CREATURE:FORGOTTEN_BEAST_115:POISONŠ#CREATURE:FORGOTTEN_BEAST_116:POISONŠ#CREATURE:FORGOTTEN_BEAST_117:POISONŠ#CREATURE:FORGOTTEN_BEAST_118:POISONŠ#CREATURE:FORGOTTEN_BEAST_120:POISONŠ#CREATURE:FORGOTTEN_BEAST_122:POISONŠ#CREATURE:FORGOTTEN_BEAST_123:POISONŠ#CREATURE:FORGOTTEN_BEAST_124:POISONŠ#CREATURE:FORGOTTEN_BEAST_126:POISONŠ#CREATURE:FORGOTTEN_BEAST_127:POISONŠ#CREATURE:FORGOTTEN_BEAST_130:POISONŠ#CREATURE:FORGOTTEN_BEAST_133:POISONŠ#CREATURE:FORGOTTEN_BEAST_134:POISONŠ#CREATURE:FORGOTTEN_BEAST_135:POISONŠ#CREATURE:FORGOTTEN_BEAST_136:POISONŠ#CREATURE:FORGOTTEN_BEAST_138:POISONŠ#CREATURE:FORGOTTEN_BEAST_139:POISONŠ#CREATURE:FORGOTTEN_BEAST_141:POISONŠ#CREATURE:FORGOTTEN_BEAST_143:POISONŠ#CREATURE:FORGOTTEN_BEAST_145:POISONŠ#CREATURE:FORGOTTEN_BEAST_147:POISONŠ#CREATURE:FORGOTTEN_BEAST_148:POISONŠ#CREATURE:FORGOTTEN_BEAST_151:POISONŠ#CREATURE:FORGOTTEN_BEAST_154:POISONŠ#CREATURE:FORGOTTEN_BEAST_155:POISONŠ#CREATURE:FORGOTTEN_BEAST_156:POISONŠ#CREATURE:FORGOTTEN_BEAST_157:POISONŠ#CREATURE:FORGOTTEN_BEAST_158:POISONŠ#CREATURE:FORGOTTEN_BEAST_160:POISONŠ#CREATURE:FORGOTTEN_BEAST_163:POISONŠ#CREATURE:FORGOTTEN_BEAST_165:POISONŠ#CREATURE:FORGOTTEN_BEAST_167:POISONŠ#CREATURE:FORGOTTEN_BEAST_170:POISONŠ#CREATURE:FORGOTTEN_BEAST_171:POISONŠ#CREATURE:FORGOTTEN_BEAST_172:POISONŠ#CREATURE:FORGOTTEN_BEAST_175:POISONŠ#CREATURE:FORGOTTEN_BEAST_176:POISONŠ#CREATURE:FORGOTTEN_BEAST_178:POISONŠ#CREATURE:FORGOTTEN_BEAST_179:POISONŠ#CREATURE:FORGOTTEN_BEAST_182:POISONŠ#CREATURE:FORGOTTEN_BEAST_183:POISONŠ#CREATURE:FORGOTTEN_BEAST_184:POISONŠ#CREATURE:FORGOTTEN_BEAST_185:POISONŠ#CREATURE:FORGOTTEN_BEAST_187:POISONŠ#CREATURE:FORGOTTEN_BEAST_188:POISONŠ#CREATURE:FORGOTTEN_BEAST_189:POISONŠ#CREATURE:FORGOTTEN_BEAST_190:POISONŠ#CREATURE:FORGOTTEN_BEAST_191:POISONŠ#CREATURE:FORGOTTEN_BEAST_192:POISONŠ#CREATURE:FORGOTTEN_BEAST_193:POISONŠ#CREATURE:FORGOTTEN_BEAST_194:POISONŠ#CREATURE:FORGOTTEN_BEAST_196:POISONŠ#CREATURE:FORGOTTEN_BEAST_197:POISONŠ#CREATURE:FORGOTTEN_BEAST_198:POISONŠ#CREATURE:FORGOTTEN_BEAST_199:POISONŠ#CREATURE:FORGOTTEN_BEAST_201:POISONŠ#CREATURE:FORGOTTEN_BEAST_203:POISONŠ#CREATURE:FORGOTTEN_BEAST_206:POISONŠ#CREATURE:FORGOTTEN_BEAST_207:POISONŠ#CREATURE:FORGOTTEN_BEAST_208:POISONŠ#CREATURE:FORGOTTEN_BEAST_210:POISONŠ#CREATURE:FORGOTTEN_BEAST_212:POISONŠ#CREATURE:FORGOTTEN_BEAST_213:POISONŠ#CREATURE:FORGOTTEN_BEAST_215:POISONŠ#CREATURE:FORGOTTEN_BEAST_216:POISONŠ#CREATURE:FORGOTTEN_BEAST_217:POISONŠ#CREATURE:FORGOTTEN_BEAST_218:POISONŠ#CREATURE:FORGOTTEN_BEAST_219:POISONŠ#CREATURE:FORGOTTEN_BEAST_220:POISONŠ#CREATURE:FORGOTTEN_BEAST_221:POISONŠ#CREATURE:FORGOTTEN_BEAST_223:POISONŠ#CREATURE:FORGOTTEN_BEAST_225:POISONŠ#CREATURE:FORGOTTEN_BEAST_227:POISONŠ#CREATURE:FORGOTTEN_BEAST_228:POISONŠ#CREATURE:FORGOTTEN_BEAST_230:POISONŠ#CREATURE:FORGOTTEN_BEAST_232:POISONŠ#CREATURE:FORGOTTEN_BEAST_233:POISONŠ#CREATURE:FORGOTTEN_BEAST_234:POISONŠ#CREATURE:FORGOTTEN_BEAST_236:POISONŠ#CREATURE:FORGOTTEN_BEAST_237:POISONŠ#CREATURE:FORGOTTEN_BEAST_240:POISONŠ#CREATURE:FORGOTTEN_BEAST_243:POISONŠ#CREATURE:FORGOTTEN_BEAST_244:POISONŠ#CREATURE:FORGOTTEN_BEAST_245:POISONŠ#CREATURE:FORGOTTEN_BEAST_247:POISONŠ#CREATURE:FORGOTTEN_BEAST_249:POISONŠ#CREATURE:FORGOTTEN_BEAST_252:POISONŠ#CREATURE:FORGOTTEN_BEAST_253:POISONŠ#CREATURE:FORGOTTEN_BEAST_254:POISONŠ#CREATURE:FORGOTTEN_BEAST_255:POISONŠ#CREATURE:FORGOTTEN_BEAST_256:POISONŠ#CREATURE:FORGOTTEN_BEAST_257:POISONŠ#CREATURE:FORGOTTEN_BEAST_258:POISONŠ#CREATURE:FORGOTTEN_BEAST_259:POISONŠ#CREATURE:FORGOTTEN_BEAST_260:POISONŠ#CREATURE:FORGOTTEN_BEAST_263:POISONŠ#CREATURE:FORGOTTEN_BEAST_264:POISONŠ#CREATURE:FORGOTTEN_BEAST_265:POISONŠ#CREATURE:FORGOTTEN_BEAST_266:POISONŠ#CREATURE:FORGOTTEN_BEAST_268:POISONŠ#CREATURE:FORGOTTEN_BEAST_269:POISONŠ#CREATURE:FORGOTTEN_BEAST_270:POISONŠ#CREATURE:FORGOTTEN_BEAST_271:POISONŠ#CREATURE:FORGOTTEN_BEAST_272:POISONŠ#CREATURE:FORGOTTEN_BEAST_273:POISONŠ#CREATURE:FORGOTTEN_BEAST_274:POISONŠ#CREATURE:FORGOTTEN_BEAST_275:POISONŠ#CREATURE:FORGOTTEN_BEAST_276:POISONŠ#CREATURE:FORGOTTEN_BEAST_278:POISONŠ#CREATURE:FORGOTTEN_BEAST_279:POISONŠ#CREATURE:FORGOTTEN_BEAST_283:POISONŠ#CREATURE:FORGOTTEN_BEAST_286:POISONŠ#CREATURE:FORGOTTEN_BEAST_288:POISONŠ#CREATURE:FORGOTTEN_BEAST_291:POISONŠ#CREATURE:FORGOTTEN_BEAST_295:POISONŠ#CREATURE:FORGOTTEN_BEAST_296:POISONŠ#CREATURE:FORGOTTEN_BEAST_297:POISONŠ#CREATURE:FORGOTTEN_BEAST_299:POISONŠ#CREATURE:FORGOTTEN_BEAST_300:POISONŠ#CREATURE:FORGOTTEN_BEAST_301:POISONŠ#CREATURE:FORGOTTEN_BEAST_302:POISONŠ#CREATURE:FORGOTTEN_BEAST_303:POISONŠ#CREATURE:FORGOTTEN_BEAST_305:POISONŠ#CREATURE:FORGOTTEN_BEAST_306:POISONŠ#CREATURE:FORGOTTEN_BEAST_307:POISONŠ#CREATURE:FORGOTTEN_BEAST_310:POISONŠ#CREATURE:FORGOTTEN_BEAST_312:POISONŠ#CREATURE:FORGOTTEN_BEAST_314:POISONŠ#CREATURE:FORGOTTEN_BEAST_315:POISONŠ#CREATURE:FORGOTTEN_BEAST_316:POISONŠ#CREATURE:FORGOTTEN_BEAST_319:POISONŠ#CREATURE:FORGOTTEN_BEAST_321:POISONŠ#CREATURE:FORGOTTEN_BEAST_322:POISONŠ#CREATURE:FORGOTTEN_BEAST_323:POISONŠ#CREATURE:FORGOTTEN_BEAST_324:POISONŠ#CREATURE:FORGOTTEN_BEAST_325:POISONŠ#CREATURE:FORGOTTEN_BEAST_327:POISONŠ#CREATURE:FORGOTTEN_BEAST_328:POISONŠ#CREATURE:FORGOTTEN_BEAST_329:POISONŠ#CREATURE:FORGOTTEN_BEAST_332:POISONŠ#CREATURE:FORGOTTEN_BEAST_334:POISONŠ#CREATURE:FORGOTTEN_BEAST_335:POISONŠ#CREATURE:FORGOTTEN_BEAST_336:POISONŠ#CREATURE:FORGOTTEN_BEAST_337:POISONŠ#CREATURE:FORGOTTEN_BEAST_338:POISONŠ#CREATURE:FORGOTTEN_BEAST_339:POISONŠ#CREATURE:FORGOTTEN_BEAST_341:POISONŠ#CREATURE:FORGOTTEN_BEAST_342:POISONŠ#CREATURE:FORGOTTEN_BEAST_343:POISONŠ#CREATURE:FORGOTTEN_BEAST_344:POISONŠ#CREATURE:FORGOTTEN_BEAST_348:POISONŠ#CREATURE:FORGOTTEN_BEAST_349:POISONŠ#CREATURE:FORGOTTEN_BEAST_351:POISONŠ#CREATURE:FORGOTTEN_BEAST_352:POISONŠ#CREATURE:FORGOTTEN_BEAST_353:POISONŠ#CREATURE:FORGOTTEN_BEAST_354:POISONŠ#CREATURE:FORGOTTEN_BEAST_355:POISONŠ#CREATURE:FORGOTTEN_BEAST_356:POISONŠ#CREATURE:FORGOTTEN_BEAST_357:POISONŠ#CREATURE:FORGOTTEN_BEAST_358:POISONŠ#CREATURE:FORGOTTEN_BEAST_359:POISONŠ#CREATURE:FORGOTTEN_BEAST_361:POISONŠ#CREATURE:FORGOTTEN_BEAST_363:POISONŠ#CREATURE:FORGOTTEN_BEAST_364:POISONŠ#CREATURE:FORGOTTEN_BEAST_365:POISONŠ#CREATURE:FORGOTTEN_BEAST_366:POISONŠ#CREATURE:FORGOTTEN_BEAST_367:POISONŠ#CREATURE:FORGOTTEN_BEAST_368:POISONŠ#CREATURE:FORGOTTEN_BEAST_369:POISONŠ#CREATURE:FORGOTTEN_BEAST_370:POISONŠ#CREATURE:FORGOTTEN_BEAST_375:POISONŠ#CREATURE:FORGOTTEN_BEAST_377:POISONŠ#CREATURE:FORGOTTEN_BEAST_378:POISONŠ#CREATURE:FORGOTTEN_BEAST_382:POISONŠ#CREATURE:FORGOTTEN_BEAST_385:POISONŠ#CREATURE:FORGOTTEN_BEAST_386:POISONŠ#CREATURE:FORGOTTEN_BEAST_387:POISONŠ#CREATURE:FORGOTTEN_BEAST_388:POISONŠ#CREATURE:FORGOTTEN_BEAST_389:POISONŠ#CREATURE:FORGOTTEN_BEAST_390:POISONŠ#CREATURE:FORGOTTEN_BEAST_391:POISONŠ#CREATURE:FORGOTTEN_BEAST_392:POISONŠ#CREATURE:FORGOTTEN_BEAST_394:POISONŠ#CREATURE:FORGOTTEN_BEAST_395:POISONŠ#CREATURE:FORGOTTEN_BEAST_398:POISONŠ#CREATURE:FORGOTTEN_BEAST_399:POISONŠ#CREATURE:FORGOTTEN_BEAST_400:POISONŠ#CREATURE:FORGOTTEN_BEAST_402:POISONŠ#CREATURE:FORGOTTEN_BEAST_405:POISONŠ#CREATURE:FORGOTTEN_BEAST_408:POISONŠ#CREATURE:FORGOTTEN_BEAST_409:POISONŠ#CREATURE:FORGOTTEN_BEAST_410:POISONŠ#CREATURE:FORGOTTEN_BEAST_412:POISONŠ#CREATURE:FORGOTTEN_BEAST_413:POISONŠ#CREATURE:FORGOTTEN_BEAST_414:POISONŠ#CREATURE:FORGOTTEN_BEAST_415:POISONŠ#CREATURE:FORGOTTEN_BEAST_416:POISONŠ#CREATURE:FORGOTTEN_BEAST_417:POISONŠ#CREATURE:FORGOTTEN_BEAST_418:POISONŠ#CREATURE:FORGOTTEN_BEAST_419:POISONŠ#CREATURE:FORGOTTEN_BEAST_420:POISONŠ#CREATURE:FORGOTTEN_BEAST_421:POISONŠ#CREATURE:FORGOTTEN_BEAST_422:POISONŠ#CREATURE:FORGOTTEN_BEAST_423:POISONŠ#CREATURE:FORGOTTEN_BEAST_425:POISONŠ#CREATURE:FORGOTTEN_BEAST_431:POISONŠ#CREATURE:FORGOTTEN_BEAST_433:POISONŠ#CREATURE:FORGOTTEN_BEAST_434:POISONŠ#CREATURE:FORGOTTEN_BEAST_436:POISONŠ#CREATURE:FORGOTTEN_BEAST_437:POISONŠ#CREATURE:FORGOTTEN_BEAST_439:POISONŠ#CREATURE:FORGOTTEN_BEAST_441:POISONŠ#CREATURE:FORGOTTEN_BEAST_443:POISONŠ#CREATURE:FORGOTTEN_BEAST_444:POISONŠ#CREATURE:FORGOTTEN_BEAST_445:POISONŠ#CREATURE:FORGOTTEN_BEAST_447:POISONŠ#CREATURE:FORGOTTEN_BEAST_449:POISONŠ#CREATURE:FORGOTTEN_BEAST_450:POISONŠ#CREATURE:FORGOTTEN_BEAST_451:POISONŠ#CREATURE:FORGOTTEN_BEAST_452:POISONŠ#CREATURE:FORGOTTEN_BEAST_453:POISONŠ#CREATURE:FORGOTTEN_BEAST_454:POISONŠ#CREATURE:FORGOTTEN_BEAST_455:POISONŠ#CREATURE:FORGOTTEN_BEAST_459:POISONŠ#CREATURE:FORGOTTEN_BEAST_461:POISONŠ#CREATURE:FORGOTTEN_BEAST_462:POISONŠ#CREATURE:FORGOTTEN_BEAST_463:POISONŠ#CREATURE:FORGOTTEN_BEAST_464:POISONŠ#CREATURE:FORGOTTEN_BEAST_469:POISONŠ#CREATURE:FORGOTTEN_BEAST_470:POISONŠ#CREATURE:FORGOTTEN_BEAST_474:POISONŠ#CREATURE:FORGOTTEN_BEAST_475:POISONŠ#CREATURE:FORGOTTEN_BEAST_476:POISONŠ#CREATURE:FORGOTTEN_BEAST_477:POISONŠ#CREATURE:FORGOTTEN_BEAST_478:POISONŠ#CREATURE:FORGOTTEN_BEAST_480:POISONŠ#CREATURE:FORGOTTEN_BEAST_481:POISONŠ#CREATURE:FORGOTTEN_BEAST_482:POISONŠ#CREATURE:FORGOTTEN_BEAST_483:POISONŠ#CREATURE:FORGOTTEN_BEAST_484:POISONŠ#CREATURE:FORGOTTEN_BEAST_485:POISONŠ#CREATURE:FORGOTTEN_BEAST_487:POISONŠ#CREATURE:FORGOTTEN_BEAST_489:POISONŠ#CREATURE:FORGOTTEN_BEAST_492:POISONŠ#CREATURE:FORGOTTEN_BEAST_494:POISONŠ#CREATURE:FORGOTTEN_BEAST_495:POISONŠ#CREATURE:FORGOTTEN_BEAST_497:POISONŠ#CREATURE:FORGOTTEN_BEAST_498:POISONŠ#CREATURE:FORGOTTEN_BEAST_499:POISONŠ#CREATURE:FORGOTTEN_BEAST_500:POISONŠ#CREATURE:FORGOTTEN_BEAST_501:POISONŠ#CREATURE:FORGOTTEN_BEAST_502:POISONŠ#CREATURE:FORGOTTEN_BEAST_503:POISONŠ#CREATURE:FORGOTTEN_BEAST_505:POISONŠ#CREATURE:FORGOTTEN_BEAST_506:POISONŠ#CREATURE:FORGOTTEN_BEAST_507:POISONŠ#CREATURE:FORGOTTEN_BEAST_509:POISONŠ#CREATURE:FORGOTTEN_BEAST_512:POISONŠ#CREATURE:FORGOTTEN_BEAST_513:POISONŠ#CREATURE:FORGOTTEN_BEAST_514:POISONŠ#CREATURE:FORGOTTEN_BEAST_515:POISONŠ#CREATURE:FORGOTTEN_BEAST_516:POISONŠ#CREATURE:FORGOTTEN_BEAST_518:POISONŠ#CREATURE:FORGOTTEN_BEAST_519:POISONŠ#CREATURE:FORGOTTEN_BEAST_522:POISONŠ#CREATURE:FORGOTTEN_BEAST_524:POISONŠ#CREATURE:FORGOTTEN_BEAST_525:POISONŠ#CREATURE:FORGOTTEN_BEAST_526:POISONŠ#CREATURE:FORGOTTEN_BEAST_527:POISONŠ#CREATURE:FORGOTTEN_BEAST_528:POISONŠ#CREATURE:FORGOTTEN_BEAST_529:POISONŠ#CREATURE:FORGOTTEN_BEAST_532:POISONŠ#CREATURE:FORGOTTEN_BEAST_533:POISONŠ#CREATURE:FORGOTTEN_BEAST_534:POISONŠ#CREATURE:FORGOTTEN_BEAST_535:POISONŠ#CREATURE:FORGOTTEN_BEAST_536:POISONŠ#CREATURE:FORGOTTEN_BEAST_537:POISONŠ#CREATURE:FORGOTTEN_BEAST_539:POISONŠ#CREATURE:FORGOTTEN_BEAST_540:POISONŠ#CREATURE:FORGOTTEN_BEAST_543:POISONŠ#CREATURE:FORGOTTEN_BEAST_544:POISONŠ#CREATURE:FORGOTTEN_BEAST_545:POISONŠ#CREATURE:FORGOTTEN_BEAST_546:POISONŠ#CREATURE:FORGOTTEN_BEAST_547:POISONŠ#CREATURE:FORGOTTEN_BEAST_548:POISONŠ#CREATURE:FORGOTTEN_BEAST_550:POISONŠ#CREATURE:FORGOTTEN_BEAST_551:POISONŠ#CREATURE:FORGOTTEN_BEAST_554:POISONŠ#CREATURE:FORGOTTEN_BEAST_555:POISONŠ#CREATURE:FORGOTTEN_BEAST_557:POISONŠ#CREATURE:FORGOTTEN_BEAST_558:POISONŠ#CREATURE:FORGOTTEN_BEAST_559:POISONŠ#CREATURE:FORGOTTEN_BEAST_565:POISONŠ#CREATURE:FORGOTTEN_BEAST_569:POISONŠ#CREATURE:FORGOTTEN_BEAST_570:POISONŠ#CREATURE:FORGOTTEN_BEAST_571:POISONŠ#CREATURE:FORGOTTEN_BEAST_572:POISONŠ#CREATURE:FORGOTTEN_BEAST_574:POISONŠ#CREATURE:FORGOTTEN_BEAST_577:POISONŠ#CREATURE:FORGOTTEN_BEAST_578:POISONŠ#CREATURE:FORGOTTEN_BEAST_579:POISONŠ#CREATURE:FORGOTTEN_BEAST_581:POISONŠ#CREATURE:FORGOTTEN_BEAST_583:POISONŠ#CREATURE:FORGOTTEN_BEAST_584:POISONŠ#CREATURE:FORGOTTEN_BEAST_585:POISONŠ#CREATURE:FORGOTTEN_BEAST_586:POISONŠ#CREATURE:FORGOTTEN_BEAST_587:POISONŠ#CREATURE:FORGOTTEN_BEAST_589:POISONŠ#CREATURE:FORGOTTEN_BEAST_590:POISONŠ#CREATURE:FORGOTTEN_BEAST_591:POISONŠ#CREATURE:FORGOTTEN_BEAST_592:POISONŠ#CREATURE:FORGOTTEN_BEAST_593:POISONŠ#CREATURE:FORGOTTEN_BEAST_594:POISONŠ#CREATURE:FORGOTTEN_BEAST_595:POISONŠ#CREATURE:FORGOTTEN_BEAST_597:POISONŠ#CREATURE:FORGOTTEN_BEAST_598:POISONŠ#CREATURE:FORGOTTEN_BEAST_599:POISONŠ#CREATURE:FORGOTTEN_BEAST_601:POISONŠ#CREATURE:FORGOTTEN_BEAST_602:POISONŠ#CREATURE:FORGOTTEN_BEAST_604:POISONŠ#CREATURE:FORGOTTEN_BEAST_607:POISONŠ#CREATURE:FORGOTTEN_BEAST_608:POISONŠ#CREATURE:FORGOTTEN_BEAST_609:POISONŠ#CREATURE:FORGOTTEN_BEAST_610:POISONŠ#CREATURE:FORGOTTEN_BEAST_618:POISONŠ#CREATURE:FORGOTTEN_BEAST_620:POISONŠ#CREATURE:FORGOTTEN_BEAST_621:POISONŠ#CREATURE:FORGOTTEN_BEAST_622:POISONŠ#CREATURE:FORGOTTEN_BEAST_624:POISONŠ#CREATURE:FORGOTTEN_BEAST_626:POISONŠ#CREATURE:FORGOTTEN_BEAST_627:POISONŠ#CREATURE:FORGOTTEN_BEAST_629:POISONŠ#CREATURE:FORGOTTEN_BEAST_632:POISONŠ#CREATURE:FORGOTTEN_BEAST_633:POISONŠ#CREATURE:FORGOTTEN_BEAST_634:POISONŠ#CREATURE:FORGOTTEN_BEAST_636:POISONŠ#CREATURE:FORGOTTEN_BEAST_638:POISONŠ#CREATURE:FORGOTTEN_BEAST_640:POISONŠ#CREATURE:FORGOTTEN_BEAST_641:POISONŠ#CREATURE:FORGOTTEN_BEAST_644:POISONŠ#CREATURE:FORGOTTEN_BEAST_645:POISONŠ#CREATURE:FORGOTTEN_BEAST_646:POISONŠ#CREATURE:FORGOTTEN_BEAST_647:POISONŠ#CREATURE:FORGOTTEN_BEAST_648:POISONŠ#CREATURE:FORGOTTEN_BEAST_649:POISONŠ#CREATURE:FORGOTTEN_BEAST_652:POISONŠ#CREATURE:FORGOTTEN_BEAST_656:POISONŠ#CREATURE:FORGOTTEN_BEAST_658:POISONŠ#CREATURE:FORGOTTEN_BEAST_659:POISONŠ#CREATURE:FORGOTTEN_BEAST_660:POISONŠ#CREATURE:FORGOTTEN_BEAST_663:POISONŠ#CREATURE:FORGOTTEN_BEAST_664:POISONŠ#CREATURE:FORGOTTEN_BEAST_666:POISONŠ#CREATURE:FORGOTTEN_BEAST_667:POISONŠ#CREATURE:FORGOTTEN_BEAST_668:POISONŠ#CREATURE:FORGOTTEN_BEAST_669:POISONŠ#CREATURE:FORGOTTEN_BEAST_670:POISONŠ#CREATURE:FORGOTTEN_BEAST_671:POISONŠ#CREATURE:FORGOTTEN_BEAST_674:POISONŠ#CREATURE:FORGOTTEN_BEAST_675:POISONŠ#CREATURE:FORGOTTEN_BEAST_678:POISONŠ#CREATURE:FORGOTTEN_BEAST_679:POISONŠ#CREATURE:FORGOTTEN_BEAST_681:POISONŠ#CREATURE:FORGOTTEN_BEAST_682:POISONŠ#CREATURE:FORGOTTEN_BEAST_686:POISONŠ#CREATURE:FORGOTTEN_BEAST_688:POISONŠ#CREATURE:FORGOTTEN_BEAST_689:POISONŠ#CREATURE:FORGOTTEN_BEAST_691:POISONŠ#CREATURE:FORGOTTEN_BEAST_692:POISONŠ#CREATURE:FORGOTTEN_BEAST_696:POISONŠ#CREATURE:FORGOTTEN_BEAST_698:POISONŠ#CREATURE:FORGOTTEN_BEAST_699:POISONŠ#CREATURE:FORGOTTEN_BEAST_702:POISONŠ#CREATURE:FORGOTTEN_BEAST_703:POISONŠ#CREATURE:FORGOTTEN_BEAST_704:POISONŠ#CREATURE:FORGOTTEN_BEAST_705:POISONŠ#CREATURE:FORGOTTEN_BEAST_707:POISONŠ#CREATURE:FORGOTTEN_BEAST_708:POISONŠ#CREATURE:FORGOTTEN_BEAST_709:POISONŠ#CREATURE:FORGOTTEN_BEAST_711:POISONŠ#CREATURE:FORGOTTEN_BEAST_712:POISONŠ#CREATURE:FORGOTTEN_BEAST_713:POISONŠ#CREATURE:FORGOTTEN_BEAST_714:POISONŠ#CREATURE:FORGOTTEN_BEAST_715:POISONŠ#CREATURE:FORGOTTEN_BEAST_718:POISONŠ#CREATURE:FORGOTTEN_BEAST_719:POISONŠ#CREATURE:FORGOTTEN_BEAST_721:POISONŠ#CREATURE:FORGOTTEN_BEAST_722:POISONŠ#CREATURE:FORGOTTEN_BEAST_724:POISONŠ#CREATURE:FORGOTTEN_BEAST_725:POISONŠ#CREATURE:FORGOTTEN_BEAST_726:POISONŠ#CREATURE:FORGOTTEN_BEAST_727:POISONŠ#CREATURE:FORGOTTEN_BEAST_731:POISONŠ#CREATURE:FORGOTTEN_BEAST_732:POISONŠ#CREATURE:FORGOTTEN_BEAST_733:POISONŠ#CREATURE:FORGOTTEN_BEAST_735:POISONŠ#CREATURE:FORGOTTEN_BEAST_737:POISONŠ#CREATURE:FORGOTTEN_BEAST_738:POISONŠ#CREATURE:FORGOTTEN_BEAST_739:POISONŠ#CREATURE:FORGOTTEN_BEAST_740:POISONŠ#CREATURE:FORGOTTEN_BEAST_741:POISONŠ#CREATURE:FORGOTTEN_BEAST_742:POISONŠ#CREATURE:FORGOTTEN_BEAST_744:POISONŠ#CREATURE:FORGOTTEN_BEAST_746:POISONŠ#CREATURE:FORGOTTEN_BEAST_748:POISONŠ#CREATURE:FORGOTTEN_BEAST_749:POISONŠ#CREATURE:FORGOTTEN_BEAST_750:POISONŠ#CREATURE:FORGOTTEN_BEAST_751:POISONŠ#CREATURE:FORGOTTEN_BEAST_752:POISONŠ#CREATURE:FORGOTTEN_BEAST_753:POISONŠ#CREATURE:FORGOTTEN_BEAST_756:POISONŠ#CREATURE:FORGOTTEN_BEAST_758:POISONŠ#CREATURE:FORGOTTEN_BEAST_760:POISONŠ#CREATURE:FORGOTTEN_BEAST_761:POISONŠ#CREATURE:FORGOTTEN_BEAST_762:POISONŠ#CREATURE:FORGOTTEN_BEAST_764:POISONŠ#CREATURE:FORGOTTEN_BEAST_766:POISONŠ#CREATURE:FORGOTTEN_BEAST_767:POISONŠ#CREATURE:FORGOTTEN_BEAST_769:POISONŠ#CREATURE:FORGOTTEN_BEAST_770:POISONŠ#CREATURE:FORGOTTEN_BEAST_771:POISONŠ#CREATURE:FORGOTTEN_BEAST_772:POISONŠ#CREATURE:FORGOTTEN_BEAST_773:POISONŠ#CREATURE:FORGOTTEN_BEAST_777:POISONŠ#CREATURE:FORGOTTEN_BEAST_778:POISONŠ#CREATURE:FORGOTTEN_BEAST_779:POISONŠ#CREATURE:FORGOTTEN_BEAST_780:POISONŠ#CREATURE:FORGOTTEN_BEAST_781:POISONŠ#CREATURE:FORGOTTEN_BEAST_783:POISONŠ#CREATURE:FORGOTTEN_BEAST_785:POISONŠ#CREATURE:FORGOTTEN_BEAST_787:POISONŠ#CREATURE:FORGOTTEN_BEAST_788:POISONŠ#CREATURE:FORGOTTEN_BEAST_790:POISONŠ#CREATURE:FORGOTTEN_BEAST_792:POISONŠ#CREATURE:FORGOTTEN_BEAST_793:POISONŠ#CREATURE:FORGOTTEN_BEAST_794:POISONŠ#CREATURE:FORGOTTEN_BEAST_795:POISONŠ#CREATURE:FORGOTTEN_BEAST_796:POISONŠ#CREATURE:FORGOTTEN_BEAST_798:POISONŠ#CREATURE:FORGOTTEN_BEAST_799:POISONŠ#CREATURE:FORGOTTEN_BEAST_800:POISONŠ#CREATURE:FORGOTTEN_BEAST_801:POISONŠ#CREATURE:FORGOTTEN_BEAST_802:POISONŠ#CREATURE:FORGOTTEN_BEAST_803:POISONŠ#CREATURE:FORGOTTEN_BEAST_806:POISONŠ#CREATURE:FORGOTTEN_BEAST_807:POISONŠ#CREATURE:FORGOTTEN_BEAST_810:POISONŠ#CREATURE:FORGOTTEN_BEAST_811:POISONŠ#CREATURE:FORGOTTEN_BEAST_813:POISONŠ#CREATURE:FORGOTTEN_BEAST_815:POISONŠ#CREATURE:FORGOTTEN_BEAST_818:POISONŠ#CREATURE:FORGOTTEN_BEAST_819:POISONŠ#CREATURE:FORGOTTEN_BEAST_820:POISONŠ#CREATURE:FORGOTTEN_BEAST_822:POISONŠ#CREATURE:FORGOTTEN_BEAST_823:POISONŠ#CREATURE:FORGOTTEN_BEAST_825:POISONŠ#CREATURE:FORGOTTEN_BEAST_826:POISONŠ#CREATURE:FORGOTTEN_BEAST_828:POISONŠ#CREATURE:FORGOTTEN_BEAST_830:POISONŠ#CREATURE:FORGOTTEN_BEAST_831:POISONŠ#CREATURE:FORGOTTEN_BEAST_832:POISONŠ#CREATURE:FORGOTTEN_BEAST_835:POISONŠ#CREATURE:FORGOTTEN_BEAST_836:POISONŠ#CREATURE:FORGOTTEN_BEAST_837:POISONŠ#CREATURE:FORGOTTEN_BEAST_839:POISONŠ#CREATURE:FORGOTTEN_BEAST_840:POISONŠ#CREATURE:FORGOTTEN_BEAST_841:POISONŠ#CREATURE:FORGOTTEN_BEAST_844:POISONŠ#CREATURE:FORGOTTEN_BEAST_845:POISONŠ#CREATURE:FORGOTTEN_BEAST_846:POISONŠ#CREATURE:FORGOTTEN_BEAST_847:POISONŠ#CREATURE:FORGOTTEN_BEAST_848:POISONŠ#CREATURE:FORGOTTEN_BEAST_849:POISONŠ#CREATURE:FORGOTTEN_BEAST_850:POISONŠ#CREATURE:FORGOTTEN_BEAST_851:POISONŠ#CREATURE:FORGOTTEN_BEAST_852:POISONŠ#CREATURE:FORGOTTEN_BEAST_853:POISONŠ#CREATURE:FORGOTTEN_BEAST_854:POISONŠ#CREATURE:FORGOTTEN_BEAST_856:POISONŠ#CREATURE:FORGOTTEN_BEAST_857:POISONŠ#CREATURE:FORGOTTEN_BEAST_859:POISONŠ#CREATURE:FORGOTTEN_BEAST_861:POISONŠ#CREATURE:FORGOTTEN_BEAST_862:POISONŠ#CREATURE:FORGOTTEN_BEAST_865:POISONŠCREATURE:TITAN_1:POISONŠCREATURE:TITAN_2:POISONŠCREATURE:TITAN_3:POISONŠCREATURE:TITAN_5:POISONŠCREATURE:TITAN_9:POISONŠCREATURE:TITAN_10:POISONŠCREATURE:TITAN_11:POISONŠCREATURE:TITAN_12:POISONŠCREATURE:TITAN_13:POISONŠCREATURE:TITAN_14:POISONŠCREATURE:TITAN_17:POISONŠCREATURE:TITAN_18:POISONŠCREATURE:TITAN_19:POISONŠCREATURE:TITAN_20:POISONŠCREATURE:TITAN_24:POISONŠCREATURE:TITAN_25:POISONŠCREATURE:TITAN_27:POISONŠCREATURE:TITAN_29:POISONŠCREATURE:TITAN_30:POISONŠCREATURE:TITAN_31:POISONŠCREATURE:DEMON_2:POISONŠCREATURE:DEMON_4:POISONŠCREATURE:DEMON_6:POISONŠCREATURE:DEMON_7:POISONŠCREATURE:DEMON_8:POISONŠCREATURE:DEMON_9:POISONŠCREATURE:DEMON_10:POISONŠCREATURE:DEMON_11:POISONŠCREATURE:DEMON_12:POISONŠCREATURE:DEMON_14:POISONŠCREATURE:DEMON_15:POISONŠCREATURE:DEMON_16:POISONŠCREATURE:DEMON_17:POISONŠCREATURE:DEMON_18:POISONŠCREATURE:DEMON_20:POISONŠCREATURE:DEMON_21:POISONŠCREATURE:DEMON_22:POISONŠCREATURE:DEMON_24:POISONŠCREATURE:DEMON_25:POISONŠCREATURE:DEMON_26:POISONŠCREATURE:DEMON_28:POISONŠCREATURE:DEMON_30:POISONŠCREATURE:DEMON_31:POISONŠCREATURE:DEMON_32:POISONŠCREATURE:DEMON_40:POISONŠCREATURE:DEMON_41:POISONŠCREATURE:DEMON_43:POISONŠCREATURE:DEMON_44:POISONŠCREATURE:DEMON_45:POISONŠCREATURE:DEMON_47:POISONŠCREATURE:DEMON_49:POISONŠ!CREATURE:NIGHT_CREATURE_64:POISONŠ!CREATURE:NIGHT_CREATURE_66:POISONŠ!CREATURE:NIGHT_CREATURE_75:POISONŠ!CREATURE:NIGHT_CREATURE_83:POISONŠ!CREATURE:NIGHT_CREATURE_85:POISONŠCREATURE:HF1108 DIVINE_3:POISONŠCREATURE:HF1249 DIVINE_3:POISONŠCREATURE:HF1345 DIVINE_1:POISON’LYE’INORGANIC:MILK_OF_LIME˜¢CUTTLEFISH:FEMALE¢CUTTLEFISH:MALE¢NAUTILUS:FEMALE¢ NAUTILUS:MALE¢MOGHOPPER:FEMALE¢MOGHOPPER:MALE¢POND_TURTLE:FEMALE¢POND_TURTLE:MALE¢MUSSEL:DEFAULT¢OYSTER:DEFAULT¢FISH_SALMON:FEMALE¢FISH_SALMON:MALE¢FISH_CLOWNFISH:FEMALE¢FISH_CLOWNFISH:MALE¢FISH_HAGFISH:FEMALE¢FISH_HAGFISH:MALE¢FISH_LAMPREY_BROOK:FEMALE¢FISH_LAMPREY_BROOK:MALE¢FISH_RAY_BAT:FEMALE¢FISH_RAY_BAT:MALE¢FISH_RAY_THORNBACK:FEMALE¢FISH_RAY_THORNBACK:MALE¢FISH_RATFISH_SPOTTED:FEMALE¢FISH_RATFISH_SPOTTED:MALE¢FISH_HERRING:FEMALE¢FISH_HERRING:MALE¢FISH_SHAD:FEMALE¢FISH_SHAD:MALE¢FISH_ANCHOVY:FEMALE¢FISH_ANCHOVY:MALE¢FISH_TROUT_STEELHEAD:FEMALE¢FISH_TROUT_STEELHEAD:MALE¢FISH_HAKE:FEMALE¢FISH_HAKE:MALE¢FISH_SEAHORSE:FEMALE¢FISH_SEAHORSE:MALE¢FISH_GLASSEYE:FEMALE¢FISH_GLASSEYE:MALE¢ FISH_PUFFER_WHITE_SPOTTED:FEMALE¢FISH_PUFFER_WHITE_SPOTTED:MALE¢FISH_SOLE:FEMALE¢FISH_SOLE:MALE¢FISH_FLOUNDER:FEMALE¢FISH_FLOUNDER:MALE¢FISH_MACKEREL:FEMALE¢FISH_MACKEREL:MALE¢JELLYFISH_SEA_NETTLE:DEFAULT¢ SQUID:FEMALE¢ +SQUID:MALE¢FISH_LUNGFISH:FEMALE¢FISH_LUNGFISH:MALE¢FISH_LOACH_CLOWN:FEMALE¢FISH_LOACH_CLOWN:MALE¢FISH_BULLHEAD_BROWN:FEMALE¢FISH_BULLHEAD_BROWN:MALE¢FISH_BULLHEAD_YELLOW:FEMALE¢FISH_BULLHEAD_YELLOW:MALE¢FISH_BULLHEAD_BLACK:FEMALE¢FISH_BULLHEAD_BLACK:MALE¢FISH_KNIFEFISH_BANDED:FEMALE¢FISH_KNIFEFISH_BANDED:MALE¢FISH_CHAR:FEMALE¢FISH_CHAR:MALE¢FISH_TROUT_RAINBOW:FEMALE¢FISH_TROUT_RAINBOW:MALE¢FISH_MOLLY_SAILFIN:FEMALE¢FISH_MOLLY_SAILFIN:MALE¢FISH_GUPPY:FEMALE¢FISH_GUPPY:MALE¢FISH_PERCH:FEMALE¢FISH_PERCH:MALE¢FISH_CAVE:FEMALE¢FISH_CAVE:MALE¢LOBSTER_CAVE:FEMALE¢LOBSTER_CAVE:MALE˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/furnitureprefix.dfstock b/data/stockpiles/furnitureprefix.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..6c52781fb100a82428db8d6c2005d998841ffe1a GIT binary patch literal 3259 zcmZ`*O>Y}F5Va7?v8gz1)X%8s#Yf$OAPCaiESK74#U(c+*NSpk7>NuRFq}YjfaYKH z*kgfSdhD^s{aWXN^r5Qyf202BU*V3IUFZ!8pu*1|j zFHR*zDk~F9@-c|hgpAPvP6>W1MBw&en;tG8acPZBsWBeVLPn=17TA z;z+v5L|btLJ+XqNU?>s&*Ol^CoD|xa5S>**kT0BvkWGb{DJq?X`l)y*DbZF%(In%oIJ#M`C>4)NU8*{$)?@K#f^5{V>?u>? zxPS$TAjJT}$~0OK$P*WHY$$*yv3>T;)KBNa1L>ktlUmx88BgP}H_6xSTSmjt6$SxeKAuH=ARrW)UR;q15QR z9XNVDF>3Vn&Idzt9u%^ga>HaQFaU;`%2g`r-K-^`EHeFcV*~+vqiuF4{O#sbV!+{g zowTnuxOYL-ZH1m}z(j|liuvgK9q3L2i;Pk#K)NOoOa+M8cr*HOqe3cAg_bp#1lHLZ zc{TcB_jB8Y|M#(UUMfSV1&e_~-f$6YU?3dY1)HX6^>ayNHm*QMi=tW!GJ=JiP*i3^ zqMSSGyhEY`naCxLF4Rhr)kHd*8CM`JQE?We4yXpkY)kZM>;hz_JmZ+3wzk9RL+X%97FnhZ<%Y2Rz z-}N=f97Dh3y;T}L&f+P^W4Lo4a#f(CyV{X{*CvPYHpAG`s?87UYm2+*>yF?}xPsSB zxcgx}!5B9RLdWG>5oI8dB|aBI*^p}63yDdFt1Zm>TRKeLM8{@GxGL~c8=bWQGU;_F z=tT5Fcfd()En&HEib{uF)h3QnG%D=YT&3F%HrwQG%CKr=^D@8^TL#z@l8@1!RU9$> zWtFBFSgY1x^)>+FbW^g^)^meOwMFx!E zmYgrqwKj4rM4hx(nRQSQ^=c~3S})Aa`4$PWHdl?t?qcm}Op(xGur@He#T;Kn-5ov! zWq6Hj+sOTDbg)E}bMH*mI>?A#YP`MBI_PWecS6;hM&~Y%?spSw;{;EIH~cyRJa0Au zGv82UZHEOuC5W~`GSQ%XiG*({a99^^l_VyMO@c`a9g5QpC~4?gL+)9lPcGtDB4E=d;0VaeXb9 z7niq-_h+Y*tDD93=ey%^`1EnHy!x;_8>nC3Ek52}eYm-}K07Hcez{#NFF#$M9nhj{et{^=e3+dKFVF(_?_ literal 0 HcmV?d00001 diff --git a/data/stockpiles/gemsprefix.dfstock b/data/stockpiles/gemsprefix.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..8d7b229a1145587d2dc0cda9e7cda76c80d8ed76 GIT binary patch literal 7728 zcmZ`;yOQL%5!`m~;-uB;b=NvYbkNa1DCB@7hQu~VZ~?GqI8OhP%rj-mlqpl6ro@9p zlAJTU0Ms+9kVL=#@{jMn@3e64*;y&a^+%(nu;2ZVRvNoFFZ37Qxc-P6zw9?&f1^fY zJ29%}?`B-yuAj^A!B}NRmbj)jR$u>6_Gr<_o9Kj>*WVXut!H`rDq4B{QxR%0DRz~V3Eglj|Y|0_UFsbpL zgj54R*J}+(`l9SAC4-ZmhgD3qsjYb(q1a8*UVki(OserS^yC#f;RbVGZr^5M{ri=o zd=+mg9P;`Vl{?i_3^f8g7O68jZ~a~I0!6b5b*Bt1Qfu?N`bGA=>ZFy+4kS@_Qx;&R zoo*gaaI(^=F*!wzFfBH~=1Lxgp1XN7+d=5y+D~Pzvtqe5z0i#e_2#7(RfQ_mWOPuu zT#txO>8JtsBqZanJ-lHHe=WvejP>e8HNvBHvlS};p!9t$8Wm_T=A4UUCU!AtNJvON z?SL{$F-c9;0^`#fhzY5ABtqWY zSzcpy-EZ&8Hoyh#Pjb}UOp@_3NR2TG9Q>uETaB&i3r5WL%TI%OCTi}v` zBD8#ihp`4^&WrIqRhWdh1jFqJ%|Dm2Ka|nZ-!Ls5rn(QIQr%-jx$czj`#ioM^fYQ5 z#ehaFnIS7Znt!?FNtg0Kx&MlJk#7zLZye;ghLnq}<&5?)aOIfOOvdv84w3F`j{>|i za-twrfF@N|Qlg{8+PPK@V%Ya;oU7-a=?vy$tO9Akko%jvg;`Gth$LqPF?E0#r0>Cv z*lB@@F@P1Ie3aM>8-S0Cnux-w3IT}EDPWS37o||}0=Cw(?zj*K%t;!@Ek_df=HYeP z-JpxiNvh>TjeLJc9lfwxew(pEd5SAQ>W8ie3KJJ7Ev*VjZJ&B!v#a!F;n5-oX@zc? zI-%SPPg956qCcchTE$_tI8$BR5FJpqeKLg9nCRg_RZEAnS6ZBEPmc8H-jCYODzUfYuYF|6Q^W zvnUG>#J>7m##bWtEJ?(^qH-5v&+0c~UlEj;*jF?pBCBSdh1j#S5POyuV$b$BV$Z^j z*jF@!iP)dTk=R$1p}@^qyOcSg9iIR}NUdFw{(xm_}`=M3d5BhgH@zY=>k zRfs+BT!}sJEX1B+pNM@$H&(hn3LU9_o!Ilzf!MRQqhL^H6r$mR3`Q;XJUVrC%(#f zS&2Q59qv zn*L!WCyH;JmDqE`hOHaH{-v5*z@X{*mJE4v1eGM7n)o{x>54H%nNiYGqGpm`2Z1n zzOy5bXKxCzXH;h;rS4qZmDscUX|Cqn(dLcVb7?kWf7X!Wq}z8T_Uv>a_AD*Lo{LJv zo;N3c95Bhqi&CIB68qEkICxIdIBq$Ts3Z@s)9y&@Ptr*2xpkwCjo6>G1F0Xnz7l&j zu##fEd?bBY80wkWGj$3)m?zRom^p2$iHHJD{boe5Q6rFMEl=ewTcpT=uk(jWZhC3`ULf?Hi;4%!@M+DWR>c=8=1QHYF@xBe z?U(q)&%0_71E72$ad=dP`p@M9q!r;Eo^_epDHL({fs?NNLpV+!VxIa%hnFALkIxz9 zJWIM!D(6^&5C0lPAy0d}v-yKxNWY26q02E$F@?u7*rX4R5oaIr8OAQ-FN*<{2fhml ze|e!X6YguSI9`+m{NG2^0YIbR26a;a)zOOve-Ghk6ccrA44x@!<>vuKm>ri|t1bpe zyR&Qfn8oMhJaCTU#a4@*!;Pr{+Tbuj)JtzgFXJN{rwM-`jnAA7LPWPr4wmSX4F6&^ z)ei+TU!`aL)7;{Tu}iJNA2zUy2XNUw!^a7`4w&P`0bWvD*H#Tl1=aVi!e0{+Qxs6G z+%WrI9b3gpp@9gtWbA~l9X-pOS9Lr})&W7(E4V~Y2yW4jAR=Jmu1JkWX9LN@6mh$a zO2ce8OqsQ_SNq{J2z0{{=(q;c=%7Rd2B_!gAOU?+zUk3A=xg@77V}#$ea4Z%e@+oc zG!biK#Ty?-fDb&xF~S2>vKy^z#pLcl7ggw(<<}_p@MdV3@$jID?UK0VBf-Mu`oK3_BPZ4lptR0Omsq A1poj5 literal 0 HcmV?d00001 diff --git a/data/stockpiles/leatherprefix.dfstock b/data/stockpiles/leatherprefix.dfstock new file mode 100644 index 000000000..d8979ca40 --- /dev/null +++ b/data/stockpiles/leatherprefix.dfstock @@ -0,0 +1,1363 @@ +jâê +CREATURE:TOAD:LEATHER +CREATURE:TOAD_MAN:LEATHER +CREATURE:GIANT_TOAD:LEATHER +CREATURE:WORM:LEATHER +CREATURE:WORM_MAN:LEATHER +CREATURE:BIRD_BLUEJAY:LEATHER +CREATURE:BLUEJAY_MAN:LEATHER +CREATURE:GIANT_BLUEJAY:LEATHER +CREATURE:BIRD_CARDINAL:LEATHER +CREATURE:CARDINAL_MAN:LEATHER +CREATURE:GIANT_CARDINAL:LEATHER +CREATURE:BIRD_GRACKLE:LEATHER +CREATURE:GRACKLE_MAN:LEATHER +CREATURE:GIANT_GRACKLE:LEATHER +CREATURE:BIRD_ORIOLE:LEATHER +CREATURE:ORIOLE_MAN:LEATHER +CREATURE:GIANT_ORIOLE:LEATHER +"CREATURE:BIRD_RW_BLACKBIRD:LEATHER +!CREATURE:RW_BLACKBIRD_MAN:LEATHER +#CREATURE:GIANT_RW_BLACKBIRD:LEATHER +CREATURE:BIRD_PENGUIN:LEATHER +$CREATURE:BIRD_PENGUIN_LITTLE:LEATHER +%CREATURE:BIRD_PENGUIN_EMPEROR:LEATHER +CREATURE:PENGUIN MAN:LEATHER +#CREATURE:BIRD_PENGUIN_GIANT:LEATHER +&CREATURE:BIRD_FALCON_PEREGRINE:LEATHER +%CREATURE:PEREGRINE FALCON MAN:LEATHER +'CREATURE:GIANT PEREGRINE FALCON:LEATHER +CREATURE:BIRD_KIWI:LEATHER +CREATURE:KIWI MAN:LEATHER + CREATURE:BIRD_KIWI_GIANT:LEATHER +CREATURE:BIRD_OSTRICH:LEATHER +CREATURE:OSTRICH MAN:LEATHER +#CREATURE:BIRD_OSTRICH_GIANT:LEATHER +CREATURE:BIRD_CROW:LEATHER +CREATURE:CROW_MAN:LEATHER +CREATURE:GIANT_CROW:LEATHER +CREATURE:BIRD_RAVEN:LEATHER +CREATURE:RAVEN_MAN:LEATHER +CREATURE:GIANT_RAVEN:LEATHER +CREATURE:BIRD_CASSOWARY:LEATHER +CREATURE:CASSOWARY_MAN:LEATHER + CREATURE:GIANT_CASSOWARY:LEATHER +CREATURE:BIRD_KEA:LEATHER +CREATURE:KEA_MAN:LEATHER +CREATURE:GIANT_KEA:LEATHER +CREATURE:BIRD_OWL_SNOWY:LEATHER +CREATURE:SNOWY_OWL_MAN:LEATHER + CREATURE:GIANT_SNOWY_OWL:LEATHER +CREATURE:SPARROW:LEATHER +CREATURE:SPARROW_MAN:LEATHER +CREATURE:GIANT_SPARROW:LEATHER +!CREATURE:BIRD_STORK_WHITE:LEATHER + CREATURE:WHITE_STORK_MAN:LEATHER +"CREATURE:GIANT_WHITE_STORK:LEATHER +CREATURE:BIRD_LOON:LEATHER +CREATURE:LOON_MAN:LEATHER +CREATURE:GIANT_LOON:LEATHER +CREATURE:BIRD_OWL_BARN:LEATHER +CREATURE:BARN_OWL_MAN:LEATHER +CREATURE:GIANT_BARN_OWL:LEATHER +CREATURE:BIRD_PARAKEET:LEATHER +CREATURE:PARAKEET_MAN:LEATHER +CREATURE:GIANT_PARAKEET:LEATHER +CREATURE:BIRD_KAKAPO:LEATHER +CREATURE:KAKAPO_MAN:LEATHER +CREATURE:GIANT_KAKAPO:LEATHER +!CREATURE:BIRD_PARROT_GREY:LEATHER + CREATURE:GREY_PARROT_MAN:LEATHER +"CREATURE:GIANT_GREY_PARROT:LEATHER +CREATURE:BIRD_PUFFIN:LEATHER +CREATURE:PUFFIN_MAN:LEATHER +CREATURE:GIANT_PUFFIN:LEATHER +CREATURE:BIRD_SWAN:LEATHER +CREATURE:SWAN_MAN:LEATHER +CREATURE:GIANT_SWAN:LEATHER +CREATURE:BIRD_LORIKEET:LEATHER +CREATURE:LORIKEET_MAN:LEATHER +CREATURE:GIANT_LORIKEET:LEATHER +CREATURE:BIRD_WREN:LEATHER +CREATURE:WREN_MAN:LEATHER +CREATURE:GIANT_WREN:LEATHER +CREATURE:BIRD_OSPREY:LEATHER +CREATURE:OSPREY_MAN:LEATHER +CREATURE:GIANT_OSPREY:LEATHER +CREATURE:BIRD_EMU:LEATHER +CREATURE:EMU_MAN:LEATHER +CREATURE:GIANT_EMU:LEATHER +CREATURE:BIRD_COCKATIEL:LEATHER +CREATURE:COCKATIEL_MAN:LEATHER + CREATURE:GIANT_COCKATIEL:LEATHER +*CREATURE:BIRD_LOVEBIRD_PEACH-FACED:LEATHER +)CREATURE:PEACH-FACED_LOVEBIRD_MAN:LEATHER ++CREATURE:GIANT_PEACH-FACED_LOVEBIRD:LEATHER +CREATURE:BIRD_MAGPIE:LEATHER +CREATURE:MAGPIE_MAN:LEATHER +CREATURE:GIANT_MAGPIE:LEATHER +CREATURE:BIRD_KESTREL:LEATHER +CREATURE:KESTREL_MAN:LEATHER +CREATURE:GIANT_KESTREL:LEATHER +CREATURE:BIRD_ALBATROSS:LEATHER +CREATURE:ALBATROSS_MAN:LEATHER + CREATURE:GIANT_ALBATROSS:LEATHER +&CREATURE:BIRD_OWL_GREAT_HORNED:LEATHER +%CREATURE:GREAT_HORNED_OWL_MAN:LEATHER +'CREATURE:GIANT_GREAT_HORNED_OWL:LEATHER +CREATURE:BIRD_EAGLE:LEATHER +CREATURE:EAGLE_MAN:LEATHER +CREATURE:GIANT_EAGLE:LEATHER +CREATURE:BIRD_HORNBILL:LEATHER +CREATURE:HORNBILL_MAN:LEATHER +CREATURE:GIANT_HORNBILL:LEATHER +%CREATURE:BIRD_LOVEBIRD_MASKED:LEATHER +$CREATURE:MASKED_LOVEBIRD_MAN:LEATHER +&CREATURE:GIANT_MASKED_LOVEBIRD:LEATHER +CREATURE:BIRD_BUSHTIT:LEATHER +CREATURE:BUSHTIT_MAN:LEATHER +CREATURE:GIANT_BUSHTIT:LEATHER +CREATURE:SLUG:LEATHER +CREATURE:SLUG_MAN:LEATHER +CREATURE:GIANT_SLUG:LEATHER +CREATURE:MOON_SNAIL:LEATHER +CREATURE:MOON_SNAIL_MAN:LEATHER +!CREATURE:GIANT_MOON_SNAIL:LEATHER +CREATURE:SNAIL:LEATHER +CREATURE:SNAIL_MAN:LEATHER +CREATURE:GIANT_SNAIL:LEATHER +CREATURE:DOG:LEATHER +CREATURE:CAT:LEATHER +CREATURE:MULE:LEATHER +CREATURE:DONKEY:LEATHER +CREATURE:HORSE:LEATHER +CREATURE:COW:LEATHER +CREATURE:SHEEP:LEATHER +CREATURE:PIG:LEATHER +CREATURE:GOAT:LEATHER +CREATURE:BIRD_CHICKEN:LEATHER +CREATURE:CAVY:LEATHER +CREATURE:BIRD_DUCK:LEATHER +CREATURE:WATER_BUFFALO:LEATHER +CREATURE:REINDEER:LEATHER +CREATURE:BIRD_GOOSE:LEATHER +CREATURE:YAK:LEATHER +CREATURE:LLAMA:LEATHER +CREATURE:ALPACA:LEATHER + CREATURE:BIRD_GUINEAFOWL:LEATHER +"CREATURE:BIRD_PEAFOWL_BLUE:LEATHER +CREATURE:BIRD_TURKEY:LEATHER +CREATURE:RABBIT:LEATHER +CREATURE:GOAT_MOUNTAIN:LEATHER +"CREATURE:GOAT_MOUNTAIN_MAN:LEATHER +$CREATURE:GIANT_GOAT_MOUNTAIN:LEATHER +CREATURE:MARMOT_HOARY:LEATHER +!CREATURE:MARMOT_HOARY_MAN:LEATHER +#CREATURE:GIANT_MARMOT_HOARY:LEATHER +CREATURE:GNOME_MOUNTAIN:LEATHER +CREATURE:GNOME_DARK:LEATHER +CREATURE:WALRUS:LEATHER +CREATURE:WALRUS_MAN:LEATHER +CREATURE:GIANT_WALRUS:LEATHER +!CREATURE:FISH_LAMPREY_SEA:LEATHER +"CREATURE:SHARK_GREAT_WHITE:LEATHER +CREATURE:SHARK_FRILL:LEATHER +$CREATURE:SHARK_SPINY_DOGFISH:LEATHER +(CREATURE:SHARK_WOBBEGONG_SPOTTED:LEATHER +CREATURE:SHARK_WHALE:LEATHER +CREATURE:SHARK_BASKING:LEATHER +CREATURE:SHARK_NURSE:LEATHER +$CREATURE:SHARK_MAKO_SHORTFIN:LEATHER +#CREATURE:SHARK_MAKO_LONGFIN:LEATHER +CREATURE:SHARK_TIGER:LEATHER +CREATURE:SHARK_BULL:LEATHER +$CREATURE:SHARK_REEF_BLACKTIP:LEATHER +$CREATURE:SHARK_REEF_WHITETIP:LEATHER +CREATURE:SHARK_BLUE:LEATHER +!CREATURE:SHARK_HAMMERHEAD:LEATHER +CREATURE:SHARK_ANGEL:LEATHER +"CREATURE:FISH_SKATE_COMMON:LEATHER +CREATURE:FISH_RAY_MANTA:LEATHER +CREATURE:FISH_STINGRAY:LEATHER + CREATURE:FISH_CONGER_EEL:LEATHER +CREATURE:NARWHAL:LEATHER +CREATURE:NARWHAL MAN:LEATHER +CREATURE:NARWHAL, GIANT:LEATHER +CREATURE:HIPPO:LEATHER +CREATURE:HIPPO_MAN:LEATHER +CREATURE:GIANT_HIPPO:LEATHER +CREATURE:PLATYPUS:LEATHER +CREATURE:PLATYPUS MAN:LEATHER + CREATURE:PLATYPUS, GIANT:LEATHER +CREATURE:BEAR_GRIZZLY:LEATHER +!CREATURE:BEAR_GRIZZLY_MAN:LEATHER +#CREATURE:GIANT_BEAR_GRIZZLY:LEATHER +CREATURE:BEAR_BLACK:LEATHER +CREATURE:BEAR_BLACK_MAN:LEATHER +!CREATURE:GIANT_BEAR_BLACK:LEATHER +CREATURE:DEER:LEATHER +CREATURE:DEER_MAN:LEATHER +CREATURE:GIANT_DEER:LEATHER +CREATURE:FOX:LEATHER +CREATURE:FOX_MAN:LEATHER +CREATURE:GIANT_FOX:LEATHER +CREATURE:RACCOON:LEATHER +CREATURE:RACCOON_MAN:LEATHER +CREATURE:GIANT_RACCOON:LEATHER +CREATURE:MACAQUE_RHESUS:LEATHER +#CREATURE:MACAQUE_RHESUS_MAN:LEATHER +%CREATURE:GIANT_MACAQUE_RHESUS:LEATHER +CREATURE:COUGAR:LEATHER +CREATURE:COUGAR_MAN:LEATHER +CREATURE:GIANT_COUGAR:LEATHER +CREATURE:WOLF:LEATHER +CREATURE:WOLF_MAN:LEATHER +CREATURE:GIANT_WOLF:LEATHER +CREATURE:GROUNDHOG:LEATHER +CREATURE:GROUNDHOG_MAN:LEATHER + CREATURE:GIANT_GROUNDHOG:LEATHER +CREATURE:BIRD_BUZZARD:LEATHER +CREATURE:BUZZARD_MAN:LEATHER +CREATURE:GIANT_BUZZARD:LEATHER +CREATURE:PANDA:LEATHER + CREATURE:PANDA, GIGANTIC:LEATHER +CREATURE:PANDA MAN:LEATHER +CREATURE:CAPYBARA:LEATHER + CREATURE:CAPYBARA, GIANT:LEATHER +CREATURE:CAPYBARA MAN:LEATHER +CREATURE:BADGER:LEATHER +CREATURE:BADGER MAN:LEATHER +CREATURE:BADGER, GIANT:LEATHER +CREATURE:MOOSE:LEATHER +CREATURE:MOOSE MAN:LEATHER +CREATURE:MOOSE, GIANT:LEATHER +CREATURE:RED PANDA:LEATHER +CREATURE:RED PANDA MAN:LEATHER +!CREATURE:RED PANDA, GIANT:LEATHER +CREATURE:ELEPHANT:LEATHER +CREATURE:ELEPHANT_MAN:LEATHER +CREATURE:GIANT_ELEPHANT:LEATHER +CREATURE:WARTHOG:LEATHER +CREATURE:WARTHOG_MAN:LEATHER +CREATURE:GIANT_WARTHOG:LEATHER +CREATURE:LION:LEATHER +CREATURE:LION_MAN:LEATHER +CREATURE:GIANT_LION:LEATHER +CREATURE:LEOPARD:LEATHER +CREATURE:LEOPARD_MAN:LEATHER +CREATURE:GIANT_LEOPARD:LEATHER +CREATURE:JAGUAR:LEATHER +CREATURE:JAGUAR_MAN:LEATHER +CREATURE:GIANT_JAGUAR:LEATHER +CREATURE:TIGER:LEATHER +CREATURE:TIGER_MAN:LEATHER +CREATURE:GIANT_TIGER:LEATHER +CREATURE:CHEETAH:LEATHER +CREATURE:CHEETAH_MAN:LEATHER +CREATURE:GIANT_CHEETAH:LEATHER +CREATURE:GAZELLE:LEATHER +CREATURE:GAZELLE_MAN:LEATHER +CREATURE:GIANT_GAZELLE:LEATHER +CREATURE:MANDRILL:LEATHER +CREATURE:MANDRILL_MAN:LEATHER +CREATURE:GIANT_MANDRILL:LEATHER +CREATURE:CHIMPANZEE:LEATHER +CREATURE:BONOBO:LEATHER +CREATURE:GORILLA:LEATHER +CREATURE:ORANGUTAN:LEATHER +CREATURE:GIBBON_SIAMANG:LEATHER +$CREATURE:GIBBON_WHITE_HANDED:LEATHER +$CREATURE:GIBBON_BLACK_HANDED:LEATHER +CREATURE:GIBBON_GRAY:LEATHER +CREATURE:GIBBON_SILVERY:LEATHER + CREATURE:GIBBON_PILEATED:LEATHER +CREATURE:GIBBON_BILOU:LEATHER +$CREATURE:GIBBON_WHITE_BROWED:LEATHER +%CREATURE:GIBBON_BLACK_CRESTED:LEATHER +CREATURE:CAMEL_1_HUMP:LEATHER +!CREATURE:CAMEL_1_HUMP_MAN:LEATHER +#CREATURE:GIANT_CAMEL_1_HUMP:LEATHER +CREATURE:CAMEL_2_HUMP:LEATHER +!CREATURE:CAMEL_2_HUMP_MAN:LEATHER +#CREATURE:GIANT_CAMEL_2_HUMP:LEATHER +CREATURE:BIRD_VULTURE:LEATHER +CREATURE:VULTURE_MAN:LEATHER +CREATURE:GIANT_VULTURE:LEATHER +CREATURE:RHINOCEROS:LEATHER +CREATURE:RHINOCEROS_MAN:LEATHER +!CREATURE:GIANT_RHINOCEROS:LEATHER +CREATURE:GIRAFFE:LEATHER +CREATURE:GIRAFFE_MAN:LEATHER +CREATURE:GIANT_GIRAFFE:LEATHER +CREATURE:HONEY BADGER:LEATHER +!CREATURE:HONEY BADGER MAN:LEATHER +$CREATURE:HONEY BADGER, GIANT:LEATHER +CREATURE:ARMADILLO:LEATHER +CREATURE:ARMADILLO MAN:LEATHER +!CREATURE:ARMADILLO, GIANT:LEATHER +CREATURE:MUSKOX:LEATHER +CREATURE:MUSKOX_MAN:LEATHER +CREATURE:GIANT_MUSKOX:LEATHER +CREATURE:ELK:LEATHER +CREATURE:ELK_MAN:LEATHER +CREATURE:GIANT_ELK:LEATHER +CREATURE:BEAR_POLAR:LEATHER +CREATURE:BEAR_POLAR_MAN:LEATHER +!CREATURE:GIANT_BEAR_POLAR:LEATHER +CREATURE:WOLVERINE:LEATHER +CREATURE:WOLVERINE_MAN:LEATHER + CREATURE:GIANT_WOLVERINE:LEATHER +CREATURE:CHINCHILLA:LEATHER +CREATURE:CHINCHILLA_MAN:LEATHER +!CREATURE:GIANT_CHINCHILLA:LEATHER +CREATURE:FLOATING_GUTS:LEATHER +CREATURE:DRUNIAN:LEATHER +CREATURE:CREEPING_EYE:LEATHER +'CREATURE:VORACIOUS_CAVE_CRAWLER:LEATHER + CREATURE:BLIND_CAVE_OGRE:LEATHER +CREATURE:CAP_HOPPER:LEATHER +CREATURE:HUNGRY_HEAD:LEATHER +CREATURE:ELK_BIRD:LEATHER +CREATURE:GREEN_DEVOURER:LEATHER +CREATURE:RUTHERER:LEATHER +CREATURE:CREEPY_CRAWLER:LEATHER +CREATURE:DRALTHA:LEATHER + CREATURE:GIANT_EARTHWORM:LEATHER +CREATURE:BUGBAT:LEATHER +CREATURE:MANERA:LEATHER +CREATURE:MOLEMARIAN:LEATHER +CREATURE:JABBERER:LEATHER +CREATURE:POND_GRABBER:LEATHER + CREATURE:BLIND_CAVE_BEAR:LEATHER +CREATURE:REACHER:LEATHER +CREATURE:GORLAK:LEATHER +CREATURE:CAVE_FLOATER:LEATHER +CREATURE:CAVE_BLOB:LEATHER +CREATURE:OCTOPUS:LEATHER +CREATURE:OCTOPUS_MAN:LEATHER +CREATURE:GIANT_OCTOPUS:LEATHER +CREATURE:LEOPARD_SEAL:LEATHER +!CREATURE:LEOPARD_SEAL_MAN:LEATHER +#CREATURE:GIANT_LEOPARD_SEAL:LEATHER +CREATURE:CUTTLEFISH:LEATHER +CREATURE:CUTTLEFISH_MAN:LEATHER +!CREATURE:GIANT_CUTTLEFISH:LEATHER +CREATURE:ORCA:LEATHER +CREATURE:ORCA_MAN:LEATHER +CREATURE:GIANT_ORCA:LEATHER +CREATURE:SPERM_WHALE:LEATHER + CREATURE:SPERM_WHALE_MAN:LEATHER +"CREATURE:GIANT_SPERM_WHALE:LEATHER +CREATURE:ELEPHANT_SEAL:LEATHER +"CREATURE:ELEPHANT_SEAL_MAN:LEATHER +$CREATURE:GIANT_ELEPHANT_SEAL:LEATHER +CREATURE:HARP_SEAL:LEATHER +CREATURE:HARP_SEAL_MAN:LEATHER + CREATURE:GIANT_HARP_SEAL:LEATHER +CREATURE:NAUTILUS:LEATHER +CREATURE:NAUTILUS_MAN:LEATHER +CREATURE:GIANT_NAUTILUS:LEATHER +CREATURE:FOXSQUIRREL:LEATHER +CREATURE:MOGHOPPER:LEATHER +CREATURE:RAT_DEMON:LEATHER +CREATURE:WAMBLER_FLUFFY:LEATHER +CREATURE:WORM_KNUCKLE:LEATHER +CREATURE:RIVER OTTER:LEATHER +CREATURE:SEA OTTER:LEATHER +CREATURE:OTTER_MAN:LEATHER +CREATURE:GIANT_OTTER:LEATHER +CREATURE:BEAVER:LEATHER +CREATURE:BEAVER_MAN:LEATHER +CREATURE:GIANT_BEAVER:LEATHER +CREATURE:LEECH:LEATHER +CREATURE:LEECH_MAN:LEATHER +CREATURE:GIANT_LEECH:LEATHER +CREATURE:AXOLOTL:LEATHER +CREATURE:AXOLOTL_MAN:LEATHER +CREATURE:GIANT_AXOLOTL:LEATHER +CREATURE:MINK:LEATHER +CREATURE:MINK_MAN:LEATHER +CREATURE:GIANT_MINK:LEATHER +CREATURE:RAT:LEATHER +CREATURE:RAT_MAN:LEATHER +CREATURE:SQUIRREL_GRAY:LEATHER +"CREATURE:SQUIRREL_GRAY_MAN:LEATHER +$CREATURE:GIANT_SQUIRREL_GRAY:LEATHER +CREATURE:SQUIRREL_RED:LEATHER +!CREATURE:SQUIRREL_RED_MAN:LEATHER +#CREATURE:GIANT_SQUIRREL_RED:LEATHER +CREATURE:CHIPMUNK:LEATHER +CREATURE:CHIPMUNK_MAN:LEATHER +CREATURE:GIANT_CHIPMUNK:LEATHER +CREATURE:HAMSTER:LEATHER +CREATURE:HAMSTER_MAN:LEATHER +CREATURE:GIANT_HAMSTER:LEATHER +CREATURE:HEDGEHOG:LEATHER +CREATURE:HEDGEHOG_MAN:LEATHER +CREATURE:GIANT_HEDGEHOG:LEATHER + CREATURE:SQUIRREL_FLYING:LEATHER +$CREATURE:FLYING_SQUIRREL_MAN:LEATHER +&CREATURE:GIANT_FLYING_SQUIRREL:LEATHER +CREATURE:MUSSEL:LEATHER +CREATURE:OYSTER:LEATHER +CREATURE:FISH_HAGFISH:LEATHER +#CREATURE:FISH_LAMPREY_BROOK:LEATHER +CREATURE:FISH_RAY_BAT:LEATHER +#CREATURE:FISH_RAY_THORNBACK:LEATHER +CREATURE:FISH_SEAHORSE:LEATHER +*CREATURE:FISH_PUFFER_WHITE_SPOTTED:LEATHER +%CREATURE:JELLYFISH_SEA_NETTLE:LEATHER +CREATURE:SQUID:LEATHER +CREATURE:SQUID MAN:LEATHER +CREATURE:GIGANTIC SQUID:LEATHER +CREATURE:DWARF:LEATHER +CREATURE:HUMAN:LEATHER +CREATURE:ELF:LEATHER +CREATURE:GOBLIN:LEATHER +CREATURE:KOBOLD:LEATHER +CREATURE:GREMLIN:LEATHER +CREATURE:TROLL:LEATHER +CREATURE:OGRE:LEATHER +CREATURE:UNICORN:LEATHER +CREATURE:SATYR:LEATHER +CREATURE:GIANT:LEATHER +CREATURE:CYCLOPS:LEATHER +CREATURE:ETTIN:LEATHER +CREATURE:MINOTAUR:LEATHER +CREATURE:YETI:LEATHER +CREATURE:SASQUATCH:LEATHER +CREATURE:BLIZZARD_MAN:LEATHER +CREATURE:WOLF_ICE:LEATHER +CREATURE:FAIRY:LEATHER +CREATURE:PIXIE:LEATHER +CREATURE:BEAK_DOG:LEATHER +CREATURE:GRIMELING:LEATHER +CREATURE:BLENDEC_FOUL:LEATHER +CREATURE:STRANGLER:LEATHER +CREATURE:NIGHTWING:LEATHER +CREATURE:HARPY:LEATHER +CREATURE:MERPERSON:LEATHER +CREATURE:BIRD_ROC:LEATHER + CREATURE:TOAD_GIANT_CAVE:LEATHER +CREATURE:OLM_GIANT:LEATHER +CREATURE:BAT_GIANT:LEATHER +CREATURE:RAT_GIANT:LEATHER +CREATURE:RAT_LARGE:LEATHER +CREATURE:MOLE_DOG_NAKED:LEATHER +CREATURE:TROGLODYTE:LEATHER +CREATURE:MOLE_GIANT:LEATHER +CREATURE:IMP_FIRE:LEATHER +CREATURE:FISH_CAVE:LEATHER +CREATURE:CAVE_FISH_MAN:LEATHER +CREATURE:OLM:LEATHER +CREATURE:OLM_MAN:LEATHER +CREATURE:BAT:LEATHER +CREATURE:BAT_MAN:LEATHER +CREATURE:MAGGOT_PURRING:LEATHER +"CREATURE:BIRD_SWALLOW_CAVE:LEATHER +!CREATURE:CAVE_SWALLOW_MAN:LEATHER +(CREATURE:BIRD_SWALLOW_CAVE_GIANT:LEATHER +CREATURE:AMPHIBIAN_MAN:LEATHER +CREATURE:RODENT MAN:LEATHER +CREATURE:WILD_BOAR:LEATHER +CREATURE:WILD_BOAR_MAN:LEATHER + CREATURE:GIANT_WILD_BOAR:LEATHER +CREATURE:COYOTE:LEATHER +CREATURE:COYOTE_MAN:LEATHER +CREATURE:GIANT_COYOTE:LEATHER +CREATURE:KANGAROO:LEATHER +CREATURE:KANGAROO_MAN:LEATHER +CREATURE:GIANT_KANGAROO:LEATHER +CREATURE:KOALA:LEATHER +CREATURE:KOALA_MAN:LEATHER +CREATURE:GIANT_KOALA:LEATHER +CREATURE:ECHIDNA:LEATHER +CREATURE:ECHIDNA_MAN:LEATHER +CREATURE:GIANT_ECHIDNA:LEATHER +CREATURE:PORCUPINE:LEATHER +CREATURE:PORCUPINE_MAN:LEATHER + CREATURE:GIANT_PORCUPINE:LEATHER +CREATURE:GRAY_LANGUR:LEATHER + CREATURE:GRAY_LANGUR_MAN:LEATHER +"CREATURE:GIANT_GRAY_LANGUR:LEATHER +CREATURE:BOBCAT:LEATHER +CREATURE:BOBCAT_MAN:LEATHER +CREATURE:GIANT_BOBCAT:LEATHER +CREATURE:SKUNK:LEATHER +CREATURE:SKUNK_MAN:LEATHER +CREATURE:GIANT_SKUNK:LEATHER + CREATURE:GREEN_TREE_FROG:LEATHER +$CREATURE:GREEN_TREE_FROG_MAN:LEATHER +&CREATURE:GIANT_GREEN_TREE_FROG:LEATHER +CREATURE:HARE:LEATHER +CREATURE:HARE_MAN:LEATHER +CREATURE:GIANT_HARE:LEATHER +CREATURE:WEASEL:LEATHER +CREATURE:WEASEL_MAN:LEATHER +CREATURE:GIANT_WEASEL:LEATHER +CREATURE:IBEX:LEATHER +CREATURE:IBEX_MAN:LEATHER +CREATURE:GIANT_IBEX:LEATHER +CREATURE:WOMBAT:LEATHER +CREATURE:WOMBAT_MAN:LEATHER +CREATURE:GIANT_WOMBAT:LEATHER +CREATURE:DINGO:LEATHER +CREATURE:DINGO_MAN:LEATHER +CREATURE:GIANT_DINGO:LEATHER +CREATURE:COATI:LEATHER +CREATURE:COATI_MAN:LEATHER +CREATURE:GIANT_COATI:LEATHER +CREATURE:OPOSSUM:LEATHER +CREATURE:OPOSSUM_MAN:LEATHER +CREATURE:GIANT_OPOSSUM:LEATHER +CREATURE:MONGOOSE:LEATHER +CREATURE:MONGOOSE_MAN:LEATHER +CREATURE:GIANT_MONGOOSE:LEATHER +CREATURE:HYENA:LEATHER +CREATURE:HYENA_MAN:LEATHER +CREATURE:GIANT_HYENA:LEATHER +CREATURE:OCELOT:LEATHER +CREATURE:OCELOT_MAN:LEATHER +CREATURE:GIANT_OCELOT:LEATHER +CREATURE:JACKAL:LEATHER +CREATURE:JACKAL_MAN:LEATHER +CREATURE:GIANT_JACKAL:LEATHER +CREATURE:CAPUCHIN:LEATHER +CREATURE:CAPUCHIN_MAN:LEATHER +CREATURE:GIANT_CAPUCHIN:LEATHER +CREATURE:SLOTH:LEATHER +CREATURE:SLOTH_MAN:LEATHER +CREATURE:GIANT_SLOTH:LEATHER +CREATURE:SPIDER_MONKEY:LEATHER +"CREATURE:SPIDER_MONKEY_MAN:LEATHER +$CREATURE:GIANT_SPIDER_MONKEY:LEATHER +CREATURE:BEAR_SLOTH:LEATHER +CREATURE:SLOTH_BEAR_MAN:LEATHER +!CREATURE:GIANT_SLOTH_BEAR:LEATHER +CREATURE:AYE-AYE:LEATHER +CREATURE:AYE-AYE_MAN:LEATHER +CREATURE:GIANT_AYE-AYE:LEATHER +CREATURE:TAPIR:LEATHER +CREATURE:TAPIR_MAN:LEATHER +CREATURE:GIANT_TAPIR:LEATHER +CREATURE:IMPALA:LEATHER +CREATURE:IMPALA_MAN:LEATHER +CREATURE:GIANT_IMPALA:LEATHER +CREATURE:AARDVARK:LEATHER +CREATURE:AARDVARK_MAN:LEATHER +CREATURE:GIANT_AARDVARK:LEATHER +CREATURE:LION_TAMARIN:LEATHER +!CREATURE:LION_TAMARIN_MAN:LEATHER +#CREATURE:GIANT_LION_TAMARIN:LEATHER +CREATURE:STOAT:LEATHER +CREATURE:STOAT_MAN:LEATHER +CREATURE:GIANT_STOAT:LEATHER +CREATURE:LYNX:LEATHER +CREATURE:LYNX_MAN:LEATHER +CREATURE:GIANT_LYNX:LEATHER +CREATURE:GNOLL:LEATHER +"CREATURE:FORGOTTEN_BEAST_2:LEATHER +"CREATURE:FORGOTTEN_BEAST_4:LEATHER +"CREATURE:FORGOTTEN_BEAST_5:LEATHER +"CREATURE:FORGOTTEN_BEAST_6:LEATHER +"CREATURE:FORGOTTEN_BEAST_7:LEATHER +#CREATURE:FORGOTTEN_BEAST_10:LEATHER +#CREATURE:FORGOTTEN_BEAST_12:LEATHER +#CREATURE:FORGOTTEN_BEAST_13:LEATHER +#CREATURE:FORGOTTEN_BEAST_16:LEATHER +#CREATURE:FORGOTTEN_BEAST_17:LEATHER +#CREATURE:FORGOTTEN_BEAST_18:LEATHER +#CREATURE:FORGOTTEN_BEAST_19:LEATHER +#CREATURE:FORGOTTEN_BEAST_20:LEATHER +#CREATURE:FORGOTTEN_BEAST_22:LEATHER +#CREATURE:FORGOTTEN_BEAST_23:LEATHER +#CREATURE:FORGOTTEN_BEAST_24:LEATHER +#CREATURE:FORGOTTEN_BEAST_25:LEATHER +#CREATURE:FORGOTTEN_BEAST_26:LEATHER +#CREATURE:FORGOTTEN_BEAST_27:LEATHER +#CREATURE:FORGOTTEN_BEAST_28:LEATHER +#CREATURE:FORGOTTEN_BEAST_29:LEATHER +#CREATURE:FORGOTTEN_BEAST_32:LEATHER +#CREATURE:FORGOTTEN_BEAST_33:LEATHER +#CREATURE:FORGOTTEN_BEAST_34:LEATHER +#CREATURE:FORGOTTEN_BEAST_35:LEATHER +#CREATURE:FORGOTTEN_BEAST_36:LEATHER +#CREATURE:FORGOTTEN_BEAST_39:LEATHER +#CREATURE:FORGOTTEN_BEAST_41:LEATHER +#CREATURE:FORGOTTEN_BEAST_42:LEATHER +#CREATURE:FORGOTTEN_BEAST_43:LEATHER +#CREATURE:FORGOTTEN_BEAST_44:LEATHER +#CREATURE:FORGOTTEN_BEAST_45:LEATHER +#CREATURE:FORGOTTEN_BEAST_47:LEATHER +#CREATURE:FORGOTTEN_BEAST_50:LEATHER +#CREATURE:FORGOTTEN_BEAST_52:LEATHER +#CREATURE:FORGOTTEN_BEAST_53:LEATHER +#CREATURE:FORGOTTEN_BEAST_55:LEATHER +#CREATURE:FORGOTTEN_BEAST_56:LEATHER +#CREATURE:FORGOTTEN_BEAST_58:LEATHER +#CREATURE:FORGOTTEN_BEAST_59:LEATHER +#CREATURE:FORGOTTEN_BEAST_60:LEATHER +#CREATURE:FORGOTTEN_BEAST_61:LEATHER +#CREATURE:FORGOTTEN_BEAST_64:LEATHER +#CREATURE:FORGOTTEN_BEAST_66:LEATHER +#CREATURE:FORGOTTEN_BEAST_67:LEATHER +#CREATURE:FORGOTTEN_BEAST_69:LEATHER +#CREATURE:FORGOTTEN_BEAST_71:LEATHER +#CREATURE:FORGOTTEN_BEAST_72:LEATHER +#CREATURE:FORGOTTEN_BEAST_73:LEATHER +#CREATURE:FORGOTTEN_BEAST_74:LEATHER +#CREATURE:FORGOTTEN_BEAST_75:LEATHER +#CREATURE:FORGOTTEN_BEAST_78:LEATHER +#CREATURE:FORGOTTEN_BEAST_80:LEATHER +#CREATURE:FORGOTTEN_BEAST_81:LEATHER +#CREATURE:FORGOTTEN_BEAST_82:LEATHER +#CREATURE:FORGOTTEN_BEAST_83:LEATHER +#CREATURE:FORGOTTEN_BEAST_84:LEATHER +#CREATURE:FORGOTTEN_BEAST_86:LEATHER +#CREATURE:FORGOTTEN_BEAST_87:LEATHER +#CREATURE:FORGOTTEN_BEAST_89:LEATHER +#CREATURE:FORGOTTEN_BEAST_90:LEATHER +#CREATURE:FORGOTTEN_BEAST_92:LEATHER +#CREATURE:FORGOTTEN_BEAST_94:LEATHER +#CREATURE:FORGOTTEN_BEAST_95:LEATHER +#CREATURE:FORGOTTEN_BEAST_96:LEATHER +#CREATURE:FORGOTTEN_BEAST_97:LEATHER +#CREATURE:FORGOTTEN_BEAST_98:LEATHER +$CREATURE:FORGOTTEN_BEAST_100:LEATHER +$CREATURE:FORGOTTEN_BEAST_105:LEATHER +$CREATURE:FORGOTTEN_BEAST_106:LEATHER +$CREATURE:FORGOTTEN_BEAST_107:LEATHER +$CREATURE:FORGOTTEN_BEAST_108:LEATHER +$CREATURE:FORGOTTEN_BEAST_109:LEATHER +$CREATURE:FORGOTTEN_BEAST_111:LEATHER +$CREATURE:FORGOTTEN_BEAST_112:LEATHER +$CREATURE:FORGOTTEN_BEAST_113:LEATHER +$CREATURE:FORGOTTEN_BEAST_114:LEATHER +$CREATURE:FORGOTTEN_BEAST_115:LEATHER +$CREATURE:FORGOTTEN_BEAST_116:LEATHER +$CREATURE:FORGOTTEN_BEAST_117:LEATHER +$CREATURE:FORGOTTEN_BEAST_118:LEATHER +$CREATURE:FORGOTTEN_BEAST_119:LEATHER +$CREATURE:FORGOTTEN_BEAST_120:LEATHER +$CREATURE:FORGOTTEN_BEAST_122:LEATHER +$CREATURE:FORGOTTEN_BEAST_123:LEATHER +$CREATURE:FORGOTTEN_BEAST_124:LEATHER +$CREATURE:FORGOTTEN_BEAST_125:LEATHER +$CREATURE:FORGOTTEN_BEAST_127:LEATHER +$CREATURE:FORGOTTEN_BEAST_128:LEATHER +$CREATURE:FORGOTTEN_BEAST_130:LEATHER +$CREATURE:FORGOTTEN_BEAST_131:LEATHER +$CREATURE:FORGOTTEN_BEAST_132:LEATHER +$CREATURE:FORGOTTEN_BEAST_133:LEATHER +$CREATURE:FORGOTTEN_BEAST_134:LEATHER +$CREATURE:FORGOTTEN_BEAST_135:LEATHER +$CREATURE:FORGOTTEN_BEAST_137:LEATHER +$CREATURE:FORGOTTEN_BEAST_138:LEATHER +$CREATURE:FORGOTTEN_BEAST_139:LEATHER +$CREATURE:FORGOTTEN_BEAST_141:LEATHER +$CREATURE:FORGOTTEN_BEAST_142:LEATHER +$CREATURE:FORGOTTEN_BEAST_144:LEATHER +$CREATURE:FORGOTTEN_BEAST_146:LEATHER +$CREATURE:FORGOTTEN_BEAST_148:LEATHER +$CREATURE:FORGOTTEN_BEAST_149:LEATHER +$CREATURE:FORGOTTEN_BEAST_150:LEATHER +$CREATURE:FORGOTTEN_BEAST_152:LEATHER +$CREATURE:FORGOTTEN_BEAST_154:LEATHER +$CREATURE:FORGOTTEN_BEAST_156:LEATHER +$CREATURE:FORGOTTEN_BEAST_157:LEATHER +$CREATURE:FORGOTTEN_BEAST_158:LEATHER +$CREATURE:FORGOTTEN_BEAST_159:LEATHER +$CREATURE:FORGOTTEN_BEAST_161:LEATHER +$CREATURE:FORGOTTEN_BEAST_162:LEATHER +$CREATURE:FORGOTTEN_BEAST_163:LEATHER +$CREATURE:FORGOTTEN_BEAST_165:LEATHER +$CREATURE:FORGOTTEN_BEAST_167:LEATHER +$CREATURE:FORGOTTEN_BEAST_168:LEATHER +$CREATURE:FORGOTTEN_BEAST_169:LEATHER +$CREATURE:FORGOTTEN_BEAST_170:LEATHER +$CREATURE:FORGOTTEN_BEAST_171:LEATHER +$CREATURE:FORGOTTEN_BEAST_172:LEATHER +$CREATURE:FORGOTTEN_BEAST_173:LEATHER +$CREATURE:FORGOTTEN_BEAST_176:LEATHER +$CREATURE:FORGOTTEN_BEAST_177:LEATHER +$CREATURE:FORGOTTEN_BEAST_178:LEATHER +$CREATURE:FORGOTTEN_BEAST_179:LEATHER +$CREATURE:FORGOTTEN_BEAST_180:LEATHER +$CREATURE:FORGOTTEN_BEAST_181:LEATHER +$CREATURE:FORGOTTEN_BEAST_182:LEATHER +$CREATURE:FORGOTTEN_BEAST_183:LEATHER +$CREATURE:FORGOTTEN_BEAST_184:LEATHER +$CREATURE:FORGOTTEN_BEAST_185:LEATHER +$CREATURE:FORGOTTEN_BEAST_186:LEATHER +$CREATURE:FORGOTTEN_BEAST_188:LEATHER +$CREATURE:FORGOTTEN_BEAST_189:LEATHER +$CREATURE:FORGOTTEN_BEAST_190:LEATHER +$CREATURE:FORGOTTEN_BEAST_191:LEATHER +$CREATURE:FORGOTTEN_BEAST_193:LEATHER +$CREATURE:FORGOTTEN_BEAST_194:LEATHER +$CREATURE:FORGOTTEN_BEAST_195:LEATHER +$CREATURE:FORGOTTEN_BEAST_196:LEATHER +$CREATURE:FORGOTTEN_BEAST_197:LEATHER +$CREATURE:FORGOTTEN_BEAST_199:LEATHER +$CREATURE:FORGOTTEN_BEAST_200:LEATHER +$CREATURE:FORGOTTEN_BEAST_201:LEATHER +$CREATURE:FORGOTTEN_BEAST_204:LEATHER +$CREATURE:FORGOTTEN_BEAST_205:LEATHER +$CREATURE:FORGOTTEN_BEAST_206:LEATHER +$CREATURE:FORGOTTEN_BEAST_207:LEATHER +$CREATURE:FORGOTTEN_BEAST_208:LEATHER +$CREATURE:FORGOTTEN_BEAST_209:LEATHER +$CREATURE:FORGOTTEN_BEAST_210:LEATHER +$CREATURE:FORGOTTEN_BEAST_211:LEATHER +$CREATURE:FORGOTTEN_BEAST_212:LEATHER +$CREATURE:FORGOTTEN_BEAST_213:LEATHER +$CREATURE:FORGOTTEN_BEAST_214:LEATHER +$CREATURE:FORGOTTEN_BEAST_215:LEATHER +$CREATURE:FORGOTTEN_BEAST_216:LEATHER +$CREATURE:FORGOTTEN_BEAST_217:LEATHER +$CREATURE:FORGOTTEN_BEAST_218:LEATHER +$CREATURE:FORGOTTEN_BEAST_220:LEATHER +$CREATURE:FORGOTTEN_BEAST_221:LEATHER +$CREATURE:FORGOTTEN_BEAST_224:LEATHER +$CREATURE:FORGOTTEN_BEAST_225:LEATHER +$CREATURE:FORGOTTEN_BEAST_228:LEATHER +$CREATURE:FORGOTTEN_BEAST_231:LEATHER +$CREATURE:FORGOTTEN_BEAST_232:LEATHER +$CREATURE:FORGOTTEN_BEAST_235:LEATHER +$CREATURE:FORGOTTEN_BEAST_236:LEATHER +$CREATURE:FORGOTTEN_BEAST_237:LEATHER +$CREATURE:FORGOTTEN_BEAST_239:LEATHER +$CREATURE:FORGOTTEN_BEAST_240:LEATHER +$CREATURE:FORGOTTEN_BEAST_242:LEATHER +$CREATURE:FORGOTTEN_BEAST_243:LEATHER +$CREATURE:FORGOTTEN_BEAST_244:LEATHER +$CREATURE:FORGOTTEN_BEAST_245:LEATHER +$CREATURE:FORGOTTEN_BEAST_246:LEATHER +$CREATURE:FORGOTTEN_BEAST_247:LEATHER +$CREATURE:FORGOTTEN_BEAST_248:LEATHER +$CREATURE:FORGOTTEN_BEAST_249:LEATHER +$CREATURE:FORGOTTEN_BEAST_253:LEATHER +$CREATURE:FORGOTTEN_BEAST_255:LEATHER +$CREATURE:FORGOTTEN_BEAST_256:LEATHER +$CREATURE:FORGOTTEN_BEAST_259:LEATHER +$CREATURE:FORGOTTEN_BEAST_260:LEATHER +$CREATURE:FORGOTTEN_BEAST_263:LEATHER +$CREATURE:FORGOTTEN_BEAST_264:LEATHER +$CREATURE:FORGOTTEN_BEAST_265:LEATHER +$CREATURE:FORGOTTEN_BEAST_266:LEATHER +$CREATURE:FORGOTTEN_BEAST_268:LEATHER +$CREATURE:FORGOTTEN_BEAST_269:LEATHER +$CREATURE:FORGOTTEN_BEAST_270:LEATHER +$CREATURE:FORGOTTEN_BEAST_271:LEATHER +$CREATURE:FORGOTTEN_BEAST_272:LEATHER +$CREATURE:FORGOTTEN_BEAST_273:LEATHER +$CREATURE:FORGOTTEN_BEAST_274:LEATHER +$CREATURE:FORGOTTEN_BEAST_275:LEATHER +$CREATURE:FORGOTTEN_BEAST_276:LEATHER +$CREATURE:FORGOTTEN_BEAST_277:LEATHER +$CREATURE:FORGOTTEN_BEAST_279:LEATHER +$CREATURE:FORGOTTEN_BEAST_280:LEATHER +$CREATURE:FORGOTTEN_BEAST_281:LEATHER +$CREATURE:FORGOTTEN_BEAST_282:LEATHER +$CREATURE:FORGOTTEN_BEAST_283:LEATHER +$CREATURE:FORGOTTEN_BEAST_285:LEATHER +$CREATURE:FORGOTTEN_BEAST_286:LEATHER +$CREATURE:FORGOTTEN_BEAST_287:LEATHER +$CREATURE:FORGOTTEN_BEAST_288:LEATHER +$CREATURE:FORGOTTEN_BEAST_289:LEATHER +$CREATURE:FORGOTTEN_BEAST_290:LEATHER +$CREATURE:FORGOTTEN_BEAST_293:LEATHER +$CREATURE:FORGOTTEN_BEAST_295:LEATHER +$CREATURE:FORGOTTEN_BEAST_297:LEATHER +$CREATURE:FORGOTTEN_BEAST_300:LEATHER +$CREATURE:FORGOTTEN_BEAST_302:LEATHER +$CREATURE:FORGOTTEN_BEAST_306:LEATHER +$CREATURE:FORGOTTEN_BEAST_307:LEATHER +$CREATURE:FORGOTTEN_BEAST_310:LEATHER +$CREATURE:FORGOTTEN_BEAST_311:LEATHER +$CREATURE:FORGOTTEN_BEAST_312:LEATHER +$CREATURE:FORGOTTEN_BEAST_314:LEATHER +$CREATURE:FORGOTTEN_BEAST_316:LEATHER +$CREATURE:FORGOTTEN_BEAST_317:LEATHER +$CREATURE:FORGOTTEN_BEAST_318:LEATHER +$CREATURE:FORGOTTEN_BEAST_320:LEATHER +$CREATURE:FORGOTTEN_BEAST_321:LEATHER +$CREATURE:FORGOTTEN_BEAST_322:LEATHER +$CREATURE:FORGOTTEN_BEAST_323:LEATHER +$CREATURE:FORGOTTEN_BEAST_324:LEATHER +$CREATURE:FORGOTTEN_BEAST_325:LEATHER +$CREATURE:FORGOTTEN_BEAST_326:LEATHER +$CREATURE:FORGOTTEN_BEAST_327:LEATHER +$CREATURE:FORGOTTEN_BEAST_328:LEATHER +$CREATURE:FORGOTTEN_BEAST_329:LEATHER +$CREATURE:FORGOTTEN_BEAST_330:LEATHER +$CREATURE:FORGOTTEN_BEAST_332:LEATHER +$CREATURE:FORGOTTEN_BEAST_333:LEATHER +$CREATURE:FORGOTTEN_BEAST_335:LEATHER +$CREATURE:FORGOTTEN_BEAST_336:LEATHER +$CREATURE:FORGOTTEN_BEAST_337:LEATHER +$CREATURE:FORGOTTEN_BEAST_338:LEATHER +$CREATURE:FORGOTTEN_BEAST_339:LEATHER +$CREATURE:FORGOTTEN_BEAST_341:LEATHER +$CREATURE:FORGOTTEN_BEAST_342:LEATHER +$CREATURE:FORGOTTEN_BEAST_343:LEATHER +$CREATURE:FORGOTTEN_BEAST_344:LEATHER +$CREATURE:FORGOTTEN_BEAST_347:LEATHER +$CREATURE:FORGOTTEN_BEAST_348:LEATHER +$CREATURE:FORGOTTEN_BEAST_349:LEATHER +$CREATURE:FORGOTTEN_BEAST_351:LEATHER +$CREATURE:FORGOTTEN_BEAST_352:LEATHER +$CREATURE:FORGOTTEN_BEAST_353:LEATHER +$CREATURE:FORGOTTEN_BEAST_354:LEATHER +$CREATURE:FORGOTTEN_BEAST_355:LEATHER +$CREATURE:FORGOTTEN_BEAST_356:LEATHER +$CREATURE:FORGOTTEN_BEAST_357:LEATHER +$CREATURE:FORGOTTEN_BEAST_358:LEATHER +$CREATURE:FORGOTTEN_BEAST_359:LEATHER +$CREATURE:FORGOTTEN_BEAST_361:LEATHER +$CREATURE:FORGOTTEN_BEAST_363:LEATHER +$CREATURE:FORGOTTEN_BEAST_364:LEATHER +$CREATURE:FORGOTTEN_BEAST_365:LEATHER +$CREATURE:FORGOTTEN_BEAST_366:LEATHER +$CREATURE:FORGOTTEN_BEAST_367:LEATHER +$CREATURE:FORGOTTEN_BEAST_368:LEATHER +$CREATURE:FORGOTTEN_BEAST_370:LEATHER +$CREATURE:FORGOTTEN_BEAST_372:LEATHER +$CREATURE:FORGOTTEN_BEAST_374:LEATHER +$CREATURE:FORGOTTEN_BEAST_375:LEATHER +$CREATURE:FORGOTTEN_BEAST_377:LEATHER +$CREATURE:FORGOTTEN_BEAST_378:LEATHER +$CREATURE:FORGOTTEN_BEAST_379:LEATHER +$CREATURE:FORGOTTEN_BEAST_380:LEATHER +$CREATURE:FORGOTTEN_BEAST_381:LEATHER +$CREATURE:FORGOTTEN_BEAST_382:LEATHER +$CREATURE:FORGOTTEN_BEAST_383:LEATHER +$CREATURE:FORGOTTEN_BEAST_384:LEATHER +$CREATURE:FORGOTTEN_BEAST_385:LEATHER +$CREATURE:FORGOTTEN_BEAST_386:LEATHER +$CREATURE:FORGOTTEN_BEAST_387:LEATHER +$CREATURE:FORGOTTEN_BEAST_388:LEATHER +$CREATURE:FORGOTTEN_BEAST_389:LEATHER +$CREATURE:FORGOTTEN_BEAST_390:LEATHER +$CREATURE:FORGOTTEN_BEAST_391:LEATHER +$CREATURE:FORGOTTEN_BEAST_392:LEATHER +$CREATURE:FORGOTTEN_BEAST_393:LEATHER +$CREATURE:FORGOTTEN_BEAST_396:LEATHER +$CREATURE:FORGOTTEN_BEAST_397:LEATHER +$CREATURE:FORGOTTEN_BEAST_398:LEATHER +$CREATURE:FORGOTTEN_BEAST_400:LEATHER +$CREATURE:FORGOTTEN_BEAST_403:LEATHER +$CREATURE:FORGOTTEN_BEAST_404:LEATHER +$CREATURE:FORGOTTEN_BEAST_405:LEATHER +$CREATURE:FORGOTTEN_BEAST_406:LEATHER +$CREATURE:FORGOTTEN_BEAST_407:LEATHER +$CREATURE:FORGOTTEN_BEAST_408:LEATHER +$CREATURE:FORGOTTEN_BEAST_409:LEATHER +$CREATURE:FORGOTTEN_BEAST_410:LEATHER +$CREATURE:FORGOTTEN_BEAST_411:LEATHER +$CREATURE:FORGOTTEN_BEAST_412:LEATHER +$CREATURE:FORGOTTEN_BEAST_413:LEATHER +$CREATURE:FORGOTTEN_BEAST_414:LEATHER +$CREATURE:FORGOTTEN_BEAST_416:LEATHER +$CREATURE:FORGOTTEN_BEAST_417:LEATHER +$CREATURE:FORGOTTEN_BEAST_418:LEATHER +$CREATURE:FORGOTTEN_BEAST_420:LEATHER +$CREATURE:FORGOTTEN_BEAST_421:LEATHER +$CREATURE:FORGOTTEN_BEAST_422:LEATHER +$CREATURE:FORGOTTEN_BEAST_423:LEATHER +$CREATURE:FORGOTTEN_BEAST_424:LEATHER +$CREATURE:FORGOTTEN_BEAST_427:LEATHER +$CREATURE:FORGOTTEN_BEAST_429:LEATHER +$CREATURE:FORGOTTEN_BEAST_430:LEATHER +$CREATURE:FORGOTTEN_BEAST_432:LEATHER +$CREATURE:FORGOTTEN_BEAST_433:LEATHER +$CREATURE:FORGOTTEN_BEAST_434:LEATHER +$CREATURE:FORGOTTEN_BEAST_435:LEATHER +$CREATURE:FORGOTTEN_BEAST_436:LEATHER +$CREATURE:FORGOTTEN_BEAST_437:LEATHER +$CREATURE:FORGOTTEN_BEAST_438:LEATHER +$CREATURE:FORGOTTEN_BEAST_440:LEATHER +$CREATURE:FORGOTTEN_BEAST_441:LEATHER +$CREATURE:FORGOTTEN_BEAST_442:LEATHER +$CREATURE:FORGOTTEN_BEAST_444:LEATHER +$CREATURE:FORGOTTEN_BEAST_446:LEATHER +$CREATURE:FORGOTTEN_BEAST_447:LEATHER +$CREATURE:FORGOTTEN_BEAST_448:LEATHER +$CREATURE:FORGOTTEN_BEAST_449:LEATHER +$CREATURE:FORGOTTEN_BEAST_450:LEATHER +$CREATURE:FORGOTTEN_BEAST_451:LEATHER +$CREATURE:FORGOTTEN_BEAST_453:LEATHER +$CREATURE:FORGOTTEN_BEAST_454:LEATHER +$CREATURE:FORGOTTEN_BEAST_455:LEATHER +$CREATURE:FORGOTTEN_BEAST_457:LEATHER +$CREATURE:FORGOTTEN_BEAST_459:LEATHER +$CREATURE:FORGOTTEN_BEAST_461:LEATHER +$CREATURE:FORGOTTEN_BEAST_462:LEATHER +$CREATURE:FORGOTTEN_BEAST_463:LEATHER +$CREATURE:FORGOTTEN_BEAST_465:LEATHER +$CREATURE:FORGOTTEN_BEAST_466:LEATHER +$CREATURE:FORGOTTEN_BEAST_468:LEATHER +$CREATURE:FORGOTTEN_BEAST_469:LEATHER +$CREATURE:FORGOTTEN_BEAST_470:LEATHER +$CREATURE:FORGOTTEN_BEAST_471:LEATHER +$CREATURE:FORGOTTEN_BEAST_472:LEATHER +$CREATURE:FORGOTTEN_BEAST_474:LEATHER +$CREATURE:FORGOTTEN_BEAST_475:LEATHER +$CREATURE:FORGOTTEN_BEAST_476:LEATHER +$CREATURE:FORGOTTEN_BEAST_478:LEATHER +$CREATURE:FORGOTTEN_BEAST_479:LEATHER +$CREATURE:FORGOTTEN_BEAST_480:LEATHER +$CREATURE:FORGOTTEN_BEAST_481:LEATHER +$CREATURE:FORGOTTEN_BEAST_483:LEATHER +$CREATURE:FORGOTTEN_BEAST_486:LEATHER +$CREATURE:FORGOTTEN_BEAST_487:LEATHER +$CREATURE:FORGOTTEN_BEAST_489:LEATHER +$CREATURE:FORGOTTEN_BEAST_492:LEATHER +$CREATURE:FORGOTTEN_BEAST_494:LEATHER +$CREATURE:FORGOTTEN_BEAST_495:LEATHER +$CREATURE:FORGOTTEN_BEAST_496:LEATHER +$CREATURE:FORGOTTEN_BEAST_497:LEATHER +$CREATURE:FORGOTTEN_BEAST_498:LEATHER +$CREATURE:FORGOTTEN_BEAST_499:LEATHER +$CREATURE:FORGOTTEN_BEAST_501:LEATHER +$CREATURE:FORGOTTEN_BEAST_503:LEATHER +$CREATURE:FORGOTTEN_BEAST_504:LEATHER +$CREATURE:FORGOTTEN_BEAST_505:LEATHER +$CREATURE:FORGOTTEN_BEAST_507:LEATHER +$CREATURE:FORGOTTEN_BEAST_508:LEATHER +$CREATURE:FORGOTTEN_BEAST_510:LEATHER +$CREATURE:FORGOTTEN_BEAST_512:LEATHER +$CREATURE:FORGOTTEN_BEAST_513:LEATHER +$CREATURE:FORGOTTEN_BEAST_514:LEATHER +$CREATURE:FORGOTTEN_BEAST_515:LEATHER +$CREATURE:FORGOTTEN_BEAST_516:LEATHER +$CREATURE:FORGOTTEN_BEAST_517:LEATHER +$CREATURE:FORGOTTEN_BEAST_518:LEATHER +$CREATURE:FORGOTTEN_BEAST_519:LEATHER +$CREATURE:FORGOTTEN_BEAST_520:LEATHER +$CREATURE:FORGOTTEN_BEAST_521:LEATHER +$CREATURE:FORGOTTEN_BEAST_522:LEATHER +$CREATURE:FORGOTTEN_BEAST_523:LEATHER +$CREATURE:FORGOTTEN_BEAST_525:LEATHER +$CREATURE:FORGOTTEN_BEAST_526:LEATHER +$CREATURE:FORGOTTEN_BEAST_527:LEATHER +$CREATURE:FORGOTTEN_BEAST_528:LEATHER +$CREATURE:FORGOTTEN_BEAST_529:LEATHER +$CREATURE:FORGOTTEN_BEAST_530:LEATHER +$CREATURE:FORGOTTEN_BEAST_531:LEATHER +$CREATURE:FORGOTTEN_BEAST_532:LEATHER +$CREATURE:FORGOTTEN_BEAST_533:LEATHER +$CREATURE:FORGOTTEN_BEAST_534:LEATHER +$CREATURE:FORGOTTEN_BEAST_535:LEATHER +$CREATURE:FORGOTTEN_BEAST_536:LEATHER +$CREATURE:FORGOTTEN_BEAST_539:LEATHER +$CREATURE:FORGOTTEN_BEAST_540:LEATHER +$CREATURE:FORGOTTEN_BEAST_541:LEATHER +$CREATURE:FORGOTTEN_BEAST_543:LEATHER +$CREATURE:FORGOTTEN_BEAST_545:LEATHER +$CREATURE:FORGOTTEN_BEAST_546:LEATHER +$CREATURE:FORGOTTEN_BEAST_547:LEATHER +$CREATURE:FORGOTTEN_BEAST_548:LEATHER +$CREATURE:FORGOTTEN_BEAST_549:LEATHER +$CREATURE:FORGOTTEN_BEAST_550:LEATHER +$CREATURE:FORGOTTEN_BEAST_551:LEATHER +$CREATURE:FORGOTTEN_BEAST_554:LEATHER +$CREATURE:FORGOTTEN_BEAST_555:LEATHER +$CREATURE:FORGOTTEN_BEAST_556:LEATHER +$CREATURE:FORGOTTEN_BEAST_557:LEATHER +$CREATURE:FORGOTTEN_BEAST_561:LEATHER +$CREATURE:FORGOTTEN_BEAST_562:LEATHER +$CREATURE:FORGOTTEN_BEAST_564:LEATHER +$CREATURE:FORGOTTEN_BEAST_569:LEATHER +$CREATURE:FORGOTTEN_BEAST_570:LEATHER +$CREATURE:FORGOTTEN_BEAST_571:LEATHER +$CREATURE:FORGOTTEN_BEAST_572:LEATHER +$CREATURE:FORGOTTEN_BEAST_574:LEATHER +$CREATURE:FORGOTTEN_BEAST_576:LEATHER +$CREATURE:FORGOTTEN_BEAST_578:LEATHER +$CREATURE:FORGOTTEN_BEAST_579:LEATHER +$CREATURE:FORGOTTEN_BEAST_580:LEATHER +$CREATURE:FORGOTTEN_BEAST_581:LEATHER +$CREATURE:FORGOTTEN_BEAST_583:LEATHER +$CREATURE:FORGOTTEN_BEAST_584:LEATHER +$CREATURE:FORGOTTEN_BEAST_586:LEATHER +$CREATURE:FORGOTTEN_BEAST_588:LEATHER +$CREATURE:FORGOTTEN_BEAST_589:LEATHER +$CREATURE:FORGOTTEN_BEAST_590:LEATHER +$CREATURE:FORGOTTEN_BEAST_592:LEATHER +$CREATURE:FORGOTTEN_BEAST_593:LEATHER +$CREATURE:FORGOTTEN_BEAST_594:LEATHER +$CREATURE:FORGOTTEN_BEAST_595:LEATHER +$CREATURE:FORGOTTEN_BEAST_596:LEATHER +$CREATURE:FORGOTTEN_BEAST_597:LEATHER +$CREATURE:FORGOTTEN_BEAST_599:LEATHER +$CREATURE:FORGOTTEN_BEAST_600:LEATHER +$CREATURE:FORGOTTEN_BEAST_601:LEATHER +$CREATURE:FORGOTTEN_BEAST_603:LEATHER +$CREATURE:FORGOTTEN_BEAST_605:LEATHER +$CREATURE:FORGOTTEN_BEAST_607:LEATHER +$CREATURE:FORGOTTEN_BEAST_608:LEATHER +$CREATURE:FORGOTTEN_BEAST_609:LEATHER +$CREATURE:FORGOTTEN_BEAST_610:LEATHER +$CREATURE:FORGOTTEN_BEAST_611:LEATHER +$CREATURE:FORGOTTEN_BEAST_612:LEATHER +$CREATURE:FORGOTTEN_BEAST_613:LEATHER +$CREATURE:FORGOTTEN_BEAST_614:LEATHER +$CREATURE:FORGOTTEN_BEAST_616:LEATHER +$CREATURE:FORGOTTEN_BEAST_619:LEATHER +$CREATURE:FORGOTTEN_BEAST_620:LEATHER +$CREATURE:FORGOTTEN_BEAST_621:LEATHER +$CREATURE:FORGOTTEN_BEAST_623:LEATHER +$CREATURE:FORGOTTEN_BEAST_624:LEATHER +$CREATURE:FORGOTTEN_BEAST_625:LEATHER +$CREATURE:FORGOTTEN_BEAST_626:LEATHER +$CREATURE:FORGOTTEN_BEAST_627:LEATHER +$CREATURE:FORGOTTEN_BEAST_628:LEATHER +$CREATURE:FORGOTTEN_BEAST_629:LEATHER +$CREATURE:FORGOTTEN_BEAST_630:LEATHER +$CREATURE:FORGOTTEN_BEAST_631:LEATHER +$CREATURE:FORGOTTEN_BEAST_632:LEATHER +$CREATURE:FORGOTTEN_BEAST_633:LEATHER +$CREATURE:FORGOTTEN_BEAST_634:LEATHER +$CREATURE:FORGOTTEN_BEAST_635:LEATHER +$CREATURE:FORGOTTEN_BEAST_636:LEATHER +$CREATURE:FORGOTTEN_BEAST_637:LEATHER +$CREATURE:FORGOTTEN_BEAST_639:LEATHER +$CREATURE:FORGOTTEN_BEAST_640:LEATHER +$CREATURE:FORGOTTEN_BEAST_643:LEATHER +$CREATURE:FORGOTTEN_BEAST_644:LEATHER +$CREATURE:FORGOTTEN_BEAST_645:LEATHER +$CREATURE:FORGOTTEN_BEAST_646:LEATHER +$CREATURE:FORGOTTEN_BEAST_647:LEATHER +$CREATURE:FORGOTTEN_BEAST_649:LEATHER +$CREATURE:FORGOTTEN_BEAST_650:LEATHER +$CREATURE:FORGOTTEN_BEAST_651:LEATHER +$CREATURE:FORGOTTEN_BEAST_652:LEATHER +$CREATURE:FORGOTTEN_BEAST_656:LEATHER +$CREATURE:FORGOTTEN_BEAST_658:LEATHER +$CREATURE:FORGOTTEN_BEAST_659:LEATHER +$CREATURE:FORGOTTEN_BEAST_661:LEATHER +$CREATURE:FORGOTTEN_BEAST_663:LEATHER +$CREATURE:FORGOTTEN_BEAST_664:LEATHER +$CREATURE:FORGOTTEN_BEAST_666:LEATHER +$CREATURE:FORGOTTEN_BEAST_667:LEATHER +$CREATURE:FORGOTTEN_BEAST_669:LEATHER +$CREATURE:FORGOTTEN_BEAST_670:LEATHER +$CREATURE:FORGOTTEN_BEAST_671:LEATHER +$CREATURE:FORGOTTEN_BEAST_674:LEATHER +$CREATURE:FORGOTTEN_BEAST_675:LEATHER +$CREATURE:FORGOTTEN_BEAST_678:LEATHER +$CREATURE:FORGOTTEN_BEAST_680:LEATHER +$CREATURE:FORGOTTEN_BEAST_681:LEATHER +$CREATURE:FORGOTTEN_BEAST_682:LEATHER +$CREATURE:FORGOTTEN_BEAST_684:LEATHER +$CREATURE:FORGOTTEN_BEAST_685:LEATHER +$CREATURE:FORGOTTEN_BEAST_686:LEATHER +$CREATURE:FORGOTTEN_BEAST_687:LEATHER +$CREATURE:FORGOTTEN_BEAST_688:LEATHER +$CREATURE:FORGOTTEN_BEAST_689:LEATHER +$CREATURE:FORGOTTEN_BEAST_691:LEATHER +$CREATURE:FORGOTTEN_BEAST_692:LEATHER +$CREATURE:FORGOTTEN_BEAST_695:LEATHER +$CREATURE:FORGOTTEN_BEAST_696:LEATHER +$CREATURE:FORGOTTEN_BEAST_697:LEATHER +$CREATURE:FORGOTTEN_BEAST_698:LEATHER +$CREATURE:FORGOTTEN_BEAST_699:LEATHER +$CREATURE:FORGOTTEN_BEAST_700:LEATHER +$CREATURE:FORGOTTEN_BEAST_701:LEATHER +$CREATURE:FORGOTTEN_BEAST_702:LEATHER +$CREATURE:FORGOTTEN_BEAST_704:LEATHER +$CREATURE:FORGOTTEN_BEAST_706:LEATHER +$CREATURE:FORGOTTEN_BEAST_708:LEATHER +$CREATURE:FORGOTTEN_BEAST_709:LEATHER +$CREATURE:FORGOTTEN_BEAST_711:LEATHER +$CREATURE:FORGOTTEN_BEAST_712:LEATHER +$CREATURE:FORGOTTEN_BEAST_713:LEATHER +$CREATURE:FORGOTTEN_BEAST_714:LEATHER +$CREATURE:FORGOTTEN_BEAST_715:LEATHER +$CREATURE:FORGOTTEN_BEAST_717:LEATHER +$CREATURE:FORGOTTEN_BEAST_718:LEATHER +$CREATURE:FORGOTTEN_BEAST_719:LEATHER +$CREATURE:FORGOTTEN_BEAST_720:LEATHER +$CREATURE:FORGOTTEN_BEAST_721:LEATHER +$CREATURE:FORGOTTEN_BEAST_722:LEATHER +$CREATURE:FORGOTTEN_BEAST_723:LEATHER +$CREATURE:FORGOTTEN_BEAST_724:LEATHER +$CREATURE:FORGOTTEN_BEAST_726:LEATHER +$CREATURE:FORGOTTEN_BEAST_730:LEATHER +$CREATURE:FORGOTTEN_BEAST_731:LEATHER +$CREATURE:FORGOTTEN_BEAST_734:LEATHER +$CREATURE:FORGOTTEN_BEAST_735:LEATHER +$CREATURE:FORGOTTEN_BEAST_737:LEATHER +$CREATURE:FORGOTTEN_BEAST_738:LEATHER +$CREATURE:FORGOTTEN_BEAST_739:LEATHER +$CREATURE:FORGOTTEN_BEAST_740:LEATHER +$CREATURE:FORGOTTEN_BEAST_741:LEATHER +$CREATURE:FORGOTTEN_BEAST_742:LEATHER +$CREATURE:FORGOTTEN_BEAST_743:LEATHER +$CREATURE:FORGOTTEN_BEAST_744:LEATHER +$CREATURE:FORGOTTEN_BEAST_746:LEATHER +$CREATURE:FORGOTTEN_BEAST_747:LEATHER +$CREATURE:FORGOTTEN_BEAST_749:LEATHER +$CREATURE:FORGOTTEN_BEAST_750:LEATHER +$CREATURE:FORGOTTEN_BEAST_751:LEATHER +$CREATURE:FORGOTTEN_BEAST_752:LEATHER +$CREATURE:FORGOTTEN_BEAST_753:LEATHER +$CREATURE:FORGOTTEN_BEAST_754:LEATHER +$CREATURE:FORGOTTEN_BEAST_755:LEATHER +$CREATURE:FORGOTTEN_BEAST_756:LEATHER +$CREATURE:FORGOTTEN_BEAST_757:LEATHER +$CREATURE:FORGOTTEN_BEAST_758:LEATHER +$CREATURE:FORGOTTEN_BEAST_759:LEATHER +$CREATURE:FORGOTTEN_BEAST_760:LEATHER +$CREATURE:FORGOTTEN_BEAST_761:LEATHER +$CREATURE:FORGOTTEN_BEAST_762:LEATHER +$CREATURE:FORGOTTEN_BEAST_764:LEATHER +$CREATURE:FORGOTTEN_BEAST_767:LEATHER +$CREATURE:FORGOTTEN_BEAST_768:LEATHER +$CREATURE:FORGOTTEN_BEAST_769:LEATHER +$CREATURE:FORGOTTEN_BEAST_770:LEATHER +$CREATURE:FORGOTTEN_BEAST_773:LEATHER +$CREATURE:FORGOTTEN_BEAST_774:LEATHER +$CREATURE:FORGOTTEN_BEAST_776:LEATHER +$CREATURE:FORGOTTEN_BEAST_777:LEATHER +$CREATURE:FORGOTTEN_BEAST_778:LEATHER +$CREATURE:FORGOTTEN_BEAST_779:LEATHER +$CREATURE:FORGOTTEN_BEAST_780:LEATHER +$CREATURE:FORGOTTEN_BEAST_781:LEATHER +$CREATURE:FORGOTTEN_BEAST_782:LEATHER +$CREATURE:FORGOTTEN_BEAST_783:LEATHER +$CREATURE:FORGOTTEN_BEAST_784:LEATHER +$CREATURE:FORGOTTEN_BEAST_785:LEATHER +$CREATURE:FORGOTTEN_BEAST_786:LEATHER +$CREATURE:FORGOTTEN_BEAST_787:LEATHER +$CREATURE:FORGOTTEN_BEAST_789:LEATHER +$CREATURE:FORGOTTEN_BEAST_792:LEATHER +$CREATURE:FORGOTTEN_BEAST_793:LEATHER +$CREATURE:FORGOTTEN_BEAST_794:LEATHER +$CREATURE:FORGOTTEN_BEAST_795:LEATHER +$CREATURE:FORGOTTEN_BEAST_796:LEATHER +$CREATURE:FORGOTTEN_BEAST_799:LEATHER +$CREATURE:FORGOTTEN_BEAST_800:LEATHER +$CREATURE:FORGOTTEN_BEAST_801:LEATHER +$CREATURE:FORGOTTEN_BEAST_802:LEATHER +$CREATURE:FORGOTTEN_BEAST_803:LEATHER +$CREATURE:FORGOTTEN_BEAST_804:LEATHER +$CREATURE:FORGOTTEN_BEAST_806:LEATHER +$CREATURE:FORGOTTEN_BEAST_807:LEATHER +$CREATURE:FORGOTTEN_BEAST_809:LEATHER +$CREATURE:FORGOTTEN_BEAST_810:LEATHER +$CREATURE:FORGOTTEN_BEAST_811:LEATHER +$CREATURE:FORGOTTEN_BEAST_812:LEATHER +$CREATURE:FORGOTTEN_BEAST_815:LEATHER +$CREATURE:FORGOTTEN_BEAST_817:LEATHER +$CREATURE:FORGOTTEN_BEAST_818:LEATHER +$CREATURE:FORGOTTEN_BEAST_819:LEATHER +$CREATURE:FORGOTTEN_BEAST_820:LEATHER +$CREATURE:FORGOTTEN_BEAST_821:LEATHER +$CREATURE:FORGOTTEN_BEAST_822:LEATHER +$CREATURE:FORGOTTEN_BEAST_824:LEATHER +$CREATURE:FORGOTTEN_BEAST_825:LEATHER +$CREATURE:FORGOTTEN_BEAST_826:LEATHER +$CREATURE:FORGOTTEN_BEAST_827:LEATHER +$CREATURE:FORGOTTEN_BEAST_828:LEATHER +$CREATURE:FORGOTTEN_BEAST_831:LEATHER +$CREATURE:FORGOTTEN_BEAST_833:LEATHER +$CREATURE:FORGOTTEN_BEAST_835:LEATHER +$CREATURE:FORGOTTEN_BEAST_837:LEATHER +$CREATURE:FORGOTTEN_BEAST_838:LEATHER +$CREATURE:FORGOTTEN_BEAST_842:LEATHER +$CREATURE:FORGOTTEN_BEAST_843:LEATHER +$CREATURE:FORGOTTEN_BEAST_844:LEATHER +$CREATURE:FORGOTTEN_BEAST_845:LEATHER +$CREATURE:FORGOTTEN_BEAST_846:LEATHER +$CREATURE:FORGOTTEN_BEAST_847:LEATHER +$CREATURE:FORGOTTEN_BEAST_848:LEATHER +$CREATURE:FORGOTTEN_BEAST_849:LEATHER +$CREATURE:FORGOTTEN_BEAST_851:LEATHER +$CREATURE:FORGOTTEN_BEAST_853:LEATHER +$CREATURE:FORGOTTEN_BEAST_854:LEATHER +$CREATURE:FORGOTTEN_BEAST_855:LEATHER +$CREATURE:FORGOTTEN_BEAST_857:LEATHER +$CREATURE:FORGOTTEN_BEAST_858:LEATHER +$CREATURE:FORGOTTEN_BEAST_859:LEATHER +$CREATURE:FORGOTTEN_BEAST_860:LEATHER +$CREATURE:FORGOTTEN_BEAST_861:LEATHER +$CREATURE:FORGOTTEN_BEAST_862:LEATHER +$CREATURE:FORGOTTEN_BEAST_865:LEATHER +$CREATURE:FORGOTTEN_BEAST_866:LEATHER +$CREATURE:FORGOTTEN_BEAST_867:LEATHER +CREATURE:TITAN_1:LEATHER +CREATURE:TITAN_3:LEATHER +CREATURE:TITAN_4:LEATHER +CREATURE:TITAN_6:LEATHER +CREATURE:TITAN_7:LEATHER +CREATURE:TITAN_8:LEATHER +CREATURE:TITAN_9:LEATHER +CREATURE:TITAN_10:LEATHER +CREATURE:TITAN_11:LEATHER +CREATURE:TITAN_12:LEATHER +CREATURE:TITAN_13:LEATHER +CREATURE:TITAN_14:LEATHER +CREATURE:TITAN_15:LEATHER +CREATURE:TITAN_18:LEATHER +CREATURE:TITAN_19:LEATHER +CREATURE:TITAN_21:LEATHER +CREATURE:TITAN_23:LEATHER +CREATURE:TITAN_24:LEATHER +CREATURE:TITAN_25:LEATHER +CREATURE:TITAN_26:LEATHER +CREATURE:TITAN_27:LEATHER +CREATURE:TITAN_28:LEATHER +CREATURE:TITAN_29:LEATHER +CREATURE:TITAN_30:LEATHER +CREATURE:TITAN_32:LEATHER +CREATURE:TITAN_33:LEATHER +CREATURE:DEMON_7:LEATHER +CREATURE:DEMON_8:LEATHER +CREATURE:DEMON_9:LEATHER +CREATURE:DEMON_10:LEATHER +CREATURE:DEMON_11:LEATHER +CREATURE:DEMON_12:LEATHER +CREATURE:DEMON_13:LEATHER +CREATURE:DEMON_14:LEATHER +CREATURE:DEMON_15:LEATHER +CREATURE:DEMON_16:LEATHER +CREATURE:DEMON_17:LEATHER +CREATURE:DEMON_18:LEATHER +CREATURE:DEMON_19:LEATHER +CREATURE:DEMON_20:LEATHER +CREATURE:DEMON_21:LEATHER +CREATURE:DEMON_22:LEATHER +CREATURE:DEMON_23:LEATHER +CREATURE:DEMON_24:LEATHER +CREATURE:DEMON_25:LEATHER +CREATURE:DEMON_26:LEATHER +CREATURE:DEMON_27:LEATHER +CREATURE:DEMON_28:LEATHER +CREATURE:DEMON_29:LEATHER +CREATURE:DEMON_31:LEATHER +CREATURE:DEMON_32:LEATHER +CREATURE:DEMON_38:LEATHER +CREATURE:DEMON_39:LEATHER +CREATURE:DEMON_40:LEATHER +CREATURE:DEMON_41:LEATHER +CREATURE:DEMON_42:LEATHER +CREATURE:DEMON_43:LEATHER +CREATURE:DEMON_44:LEATHER +CREATURE:DEMON_45:LEATHER +CREATURE:DEMON_47:LEATHER +CREATURE:DEMON_48:LEATHER +CREATURE:DEMON_49:LEATHER +CREATURE:DEMON_52:LEATHER +!CREATURE:NIGHT_CREATURE_1:LEATHER +!CREATURE:NIGHT_CREATURE_2:LEATHER +!CREATURE:NIGHT_CREATURE_3:LEATHER +!CREATURE:NIGHT_CREATURE_4:LEATHER +!CREATURE:NIGHT_CREATURE_5:LEATHER +!CREATURE:NIGHT_CREATURE_6:LEATHER +!CREATURE:NIGHT_CREATURE_7:LEATHER +!CREATURE:NIGHT_CREATURE_8:LEATHER +!CREATURE:NIGHT_CREATURE_9:LEATHER +"CREATURE:NIGHT_CREATURE_10:LEATHER +"CREATURE:NIGHT_CREATURE_11:LEATHER +"CREATURE:NIGHT_CREATURE_12:LEATHER +"CREATURE:NIGHT_CREATURE_13:LEATHER +"CREATURE:NIGHT_CREATURE_14:LEATHER +"CREATURE:NIGHT_CREATURE_15:LEATHER +"CREATURE:NIGHT_CREATURE_16:LEATHER +"CREATURE:NIGHT_CREATURE_17:LEATHER +"CREATURE:NIGHT_CREATURE_18:LEATHER +"CREATURE:NIGHT_CREATURE_19:LEATHER +"CREATURE:NIGHT_CREATURE_20:LEATHER +"CREATURE:NIGHT_CREATURE_21:LEATHER +"CREATURE:NIGHT_CREATURE_22:LEATHER +"CREATURE:NIGHT_CREATURE_23:LEATHER +"CREATURE:NIGHT_CREATURE_24:LEATHER +"CREATURE:NIGHT_CREATURE_25:LEATHER +"CREATURE:NIGHT_CREATURE_26:LEATHER +"CREATURE:NIGHT_CREATURE_27:LEATHER +"CREATURE:NIGHT_CREATURE_28:LEATHER +"CREATURE:NIGHT_CREATURE_29:LEATHER +"CREATURE:NIGHT_CREATURE_30:LEATHER +"CREATURE:NIGHT_CREATURE_31:LEATHER +"CREATURE:NIGHT_CREATURE_32:LEATHER +"CREATURE:NIGHT_CREATURE_33:LEATHER +"CREATURE:NIGHT_CREATURE_34:LEATHER +"CREATURE:NIGHT_CREATURE_35:LEATHER +"CREATURE:NIGHT_CREATURE_36:LEATHER +"CREATURE:NIGHT_CREATURE_37:LEATHER +"CREATURE:NIGHT_CREATURE_38:LEATHER +"CREATURE:NIGHT_CREATURE_39:LEATHER +"CREATURE:NIGHT_CREATURE_40:LEATHER +"CREATURE:NIGHT_CREATURE_41:LEATHER +"CREATURE:NIGHT_CREATURE_42:LEATHER +"CREATURE:NIGHT_CREATURE_43:LEATHER +"CREATURE:NIGHT_CREATURE_44:LEATHER +"CREATURE:NIGHT_CREATURE_45:LEATHER +"CREATURE:NIGHT_CREATURE_46:LEATHER +"CREATURE:NIGHT_CREATURE_47:LEATHER +"CREATURE:NIGHT_CREATURE_48:LEATHER +"CREATURE:NIGHT_CREATURE_49:LEATHER +"CREATURE:NIGHT_CREATURE_50:LEATHER +"CREATURE:NIGHT_CREATURE_51:LEATHER +"CREATURE:NIGHT_CREATURE_52:LEATHER +"CREATURE:NIGHT_CREATURE_53:LEATHER +"CREATURE:NIGHT_CREATURE_54:LEATHER +"CREATURE:NIGHT_CREATURE_55:LEATHER +"CREATURE:NIGHT_CREATURE_56:LEATHER +"CREATURE:NIGHT_CREATURE_57:LEATHER +"CREATURE:NIGHT_CREATURE_58:LEATHER +"CREATURE:NIGHT_CREATURE_59:LEATHER +"CREATURE:NIGHT_CREATURE_60:LEATHER +"CREATURE:NIGHT_CREATURE_61:LEATHER +"CREATURE:NIGHT_CREATURE_62:LEATHER +"CREATURE:NIGHT_CREATURE_63:LEATHER +"CREATURE:NIGHT_CREATURE_64:LEATHER +"CREATURE:NIGHT_CREATURE_65:LEATHER +"CREATURE:NIGHT_CREATURE_66:LEATHER +"CREATURE:NIGHT_CREATURE_67:LEATHER +"CREATURE:NIGHT_CREATURE_68:LEATHER +"CREATURE:NIGHT_CREATURE_69:LEATHER +"CREATURE:NIGHT_CREATURE_70:LEATHER +"CREATURE:NIGHT_CREATURE_71:LEATHER +"CREATURE:NIGHT_CREATURE_72:LEATHER +"CREATURE:NIGHT_CREATURE_73:LEATHER +"CREATURE:NIGHT_CREATURE_74:LEATHER +"CREATURE:NIGHT_CREATURE_75:LEATHER +"CREATURE:NIGHT_CREATURE_76:LEATHER +"CREATURE:NIGHT_CREATURE_77:LEATHER +"CREATURE:NIGHT_CREATURE_78:LEATHER +"CREATURE:NIGHT_CREATURE_79:LEATHER +"CREATURE:NIGHT_CREATURE_80:LEATHER +"CREATURE:NIGHT_CREATURE_81:LEATHER +"CREATURE:NIGHT_CREATURE_82:LEATHER +"CREATURE:NIGHT_CREATURE_83:LEATHER +"CREATURE:NIGHT_CREATURE_84:LEATHER +"CREATURE:NIGHT_CREATURE_85:LEATHER +"CREATURE:NIGHT_CREATURE_86:LEATHER +"CREATURE:NIGHT_CREATURE_87:LEATHER +"CREATURE:NIGHT_CREATURE_88:LEATHER +"CREATURE:NIGHT_CREATURE_89:LEATHER +"CREATURE:NIGHT_CREATURE_90:LEATHER +"CREATURE:NIGHT_CREATURE_91:LEATHER +"CREATURE:NIGHT_CREATURE_92:LEATHER +"CREATURE:NIGHT_CREATURE_93:LEATHER +"CREATURE:NIGHT_CREATURE_94:LEATHER +"CREATURE:NIGHT_CREATURE_95:LEATHER +"CREATURE:NIGHT_CREATURE_96:LEATHER +"CREATURE:NIGHT_CREATURE_97:LEATHER +"CREATURE:NIGHT_CREATURE_98:LEATHER +"CREATURE:NIGHT_CREATURE_99:LEATHER +#CREATURE:NIGHT_CREATURE_100:LEATHER +#CREATURE:NIGHT_CREATURE_101:LEATHER +#CREATURE:NIGHT_CREATURE_102:LEATHER +#CREATURE:NIGHT_CREATURE_103:LEATHER +#CREATURE:NIGHT_CREATURE_104:LEATHER + CREATURE:HF1248 DIVINE_1:LEATHER + CREATURE:HF1248 DIVINE_2:LEATHER + CREATURE:HF1248 DIVINE_3:LEATHER + CREATURE:HF1108 DIVINE_2:LEATHER + CREATURE:HF1249 DIVINE_1:LEATHER + CREATURE:HF1249 DIVINE_3:LEATHER + CREATURE:HF1345 DIVINE_3:LEATHER˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/masterworkammo.dfstock b/data/stockpiles/masterworkammo.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..19d7aebeaa03d193991f789a5e90a78df28510e3 GIT binary patch literal 34 qcmZ?bR^s$cEG|hcN-NEoz{og*k#PYd!wN=;4U7ys7#R*QG5`Rj8VKb8 literal 0 HcmV?d00001 diff --git a/data/stockpiles/masterworkarmor.dfstock b/data/stockpiles/masterworkarmor.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..e3d457dc88d36da0dfd598376e1b424500ccfe9b GIT binary patch literal 39 vcmeBTK-%oY*GM33RN;CA!U&W4EJTSY4O<8TLwdu-r22Q0w2u2xdoq4j-n2og g;VEC%f@%2P{4DC$q_Y=*E5HqkI}{IqCloIzKHl(XWdHyG literal 0 HcmV?d00001 diff --git a/data/stockpiles/metalammo.dfstock b/data/stockpiles/metalammo.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..ed20da3f7cb8b9ed3abfdc3aa198acc683f8af41 GIT binary patch literal 768 zcmZvZJ8r`;5JbfyW&S^hw=fLDa5_?2%L}h4futP74X>0kWy+K(Q|351MhL|M*APp- z9nNxw`u9v;plNNb43^JmTf@(FOO?DzbBDAC%SqXG-6@GaJ0R|IKvVKNI&L|DyiC5@ zD(5(G9-_xhQgm2{;dPvm@@V>o>wuv2HnQ_{H;UwaI(G2l!G;YQkdG7WEp7W;h~f`%LCvQC literal 0 HcmV?d00001 diff --git a/data/stockpiles/metalarmor.dfstock b/data/stockpiles/metalarmor.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..7d781749003e14085659cbbdc1ff602173da1cf6 GIT binary patch literal 773 zcmZvZJyOFk5QU|JlK;Qt7@15a6FRNEadxtnJ(3+DjX4h$B_$;#B_#*q5NJ$1+Kg4| z+o!jBPp|s-1kT7-t}vFe2Xd8_=c3{qF5=u1@6bt-Rdsz#g3lINy6nkj@(zS8dxZ1o z3(j~ifp0K)Tt!7qMc2PhGByp_wv;+#%o-QiX}lXma2t;`J~rsOHCcrF5pEo<8R2F$ zVDl_PF`8U1Hr$r|V}#{@72UWsAm-5YG%g8&9g{5v@m(ANn{3-1O1qBSRUW(khb|)o z@@3m>U@}63gGgp_QyLrUIm+ud$UORhoOVIi&1B{Sn0kWy+K(Q|351MhL|M*APp- z9nNxw_V-L)pfW;h~f{SLCv=S literal 0 HcmV?d00001 diff --git a/data/stockpiles/metalweapons.dfstock b/data/stockpiles/metalweapons.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..d89f668e1e98e46e3a6a1aac1d04e10630588f8e GIT binary patch literal 773 zcmZvZJyOFk5QU|JlK;P?)eSP4Ob8XSy>WK3mOYXkhBUehC!nOHq@<+eKpX;%iAS5U zN`3qER`2Om{+_5aG_@_Y!Tb?zZTPvYsZbYj?vQq1Imzp$IVQnp3&dUaXmWlh3tRS} z&ZBQ;wR0S}7J|oBR5V!n{&k#@ZqalV*8xG^+Q3fZ-5^r8@z}s~3)ZjEfVv;y*5aB# z-HZmLUw9}2UGT-4x~hK+v;42Zk6X)-C^S8dOG02vXv#r+7e^WCeCrRTT}N(f2fqKI z%Lp@cRo8CRWP}C>mP{AA(k9e%l-F&5X!HRE?t;$Gc;*9}C)gsvmI<~}EYYxImV)yX eT%_PK1y>K^NxVt0RW__4l4iv literal 0 HcmV?d00001 diff --git a/data/stockpiles/otherarmor.dfstock b/data/stockpiles/otherarmor.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..b053744be14a1ccb09689d76a5ce5cc31d52d4ce GIT binary patch literal 122 zcmXZRAr1mD5CzcrNeQCCbCz*KnQRG@mUNoHswEs}6%vU=B9R;o#LAa9z?Du zr1U9S?U}=_7Uh*^HRH9Z^sJ48AMD6+XsTrzOx!u9f3^ji)JE@O3&SX_TkJooq&#wO6(`h&28sN=iyfBpOOS4J)v+qjfpQ zGk5M>+pi0LiQ3pkXjD&)p_*T(+94gl=0usUJ122&50tAMQLB7LTBDD^uad5`!a07M zKu5x(?%SLJf$}!8N$QJD{63W(JbSQViyHXj2z!fL0)97oAn}s>B@lJKSWw@d%w&>( zSB7yQ5{ZoF^R&c8ON6=^njg}WB%$`i&p3u z&)L0h2Sm|N{GTlB8V|8AEDCH{V5e8%IDEi97T{ut003N$6$2QaG_RY%&C^t?$Z-Wx;erut*oQ z2uYgsWdW{VJ5i`Fp|2w<%{P#ac}Bev|iumR)81gw9?ch^(C4{La1)5h>A(ac}Wvw7A2l9dFBt+pvQ$H{HSm z;*8OyDzQ>gZ)X)#BCvt&7@}WU!~N+RhHsY@wb?PY@Rfu47~0rgEP}#I#gTT zSz@=mGKFQ+@^);Tu^O*~YnhR8)UZ7EdXWQ743Co2qIi$(mx&pkINh2Fv^dVqs}q;F zdfN9B+=!>Zg5 N6ZFFN4f=q-pdT%C9f<${ literal 0 HcmV?d00001 diff --git a/data/stockpiles/pearlash.dfstock b/data/stockpiles/pearlash.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..1f7d6a945f5dc26a70077d5751533000882def9d GIT binary patch literal 33 pcmWII;^GK!bqw-x4EC77$T)+MaRDR43Py_v!xXzo+M4oS`{>40`U3`p|pQbG{6U_*3+$iOG|Be!D!17yHtSH&A1{ zxEBXFkZ6x;8dOJC^{Q@ib|n2j53Elkf)7J91Z_LJq3!g&d}UeALZg$3rYQ?v6f*QFumo z(8QBPx%W2B?VLnmP<|!=&V8;GiAXTbwYOaMEr_(#>af)H($$kPGC7#HhU%JRm`G1U zPWdvOaPgu|n;Y`piU1z^LZGu4ueCnhyk4-%w@Y4{K{q2eY-wxN#*mdlt2TSth^*RD zlcrjF4oLO=VzHoE3`Ea7spi~x6-4P^jbWpk(m}`#*3Ue#yX>MSMyausf;yw-s7(nV zUY^#NB+a4ergYF24=jv34^YM1Ac|IkC2rF&YcWUQ;rI{K3M@9DGCw* z;HlL?&?oBSIg{JwhP!@9JUjJ4%7VSVAag*Y@F09jBt1Ym!-a<^yPfANeUU#3DB5Wg zDGGB3n1c_6lHcSXLcIO=X#fFSh&R-()GMj$`L@4yFk}t4Hp5pE%N40-a_F}ZCRXHlXP2G#>%t;a3WK+H%7Ze~t!+$_iwWD3;|w9+7pBvFsR)gliQ^mldor#k&xo&E=?zlQ4o literal 0 HcmV?d00001 diff --git a/data/stockpiles/plaster.dfstock b/data/stockpiles/plaster.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..6ac4d4607b4b2df25fa02c132bc910b5046cee8b GIT binary patch literal 103 zcmXpC;1clk^AB=&^z(GKa*qrM4)x^{Mu<52I6657hqwlD2_Xc7U42~rJVRWO6$U$o gc=`ngI0j8%WSqgsxPXyi1tY@-M#deC3dOM2o(yj&B%JIrZZL4uvcEbB945{6$GworsCkh%q0!=YUuJxZ@C?)`YOyF_@uFw2A@gly)9S2+p7@L*a+`1p;cS!uUlP^e>S~ly*`K} zVU1xCGu#Y|JIIN3FfJDbi!iMmWm7{%Ruea~Uw9-NOZ$00>zUR@4P=#$eB)6ktV$@O ziaLO?b3d7>d=7Jon;;U5Glrmoye{5|Z$N2TjCb||gHn}j z_)J!Cbw<1u?>aX(!%B1k_cJb>`$?l-Ms39=MF+p^<2J4{y+GvvYH@tY*Pf-rgLG%(Ou-|9gx2;x zEiAf3p^(*YQeol%(#_;_3TLl$Qg=n~c102(u_rj%tsFE6U5^A$j=#TZA`z z76NXloCIVBz^O`*y*n5zFRfA1!{e?dUp?+j@5LVz3lKp}?)T6{uZIDs6ruD98$hF; z2QdOHn#3_i`BxzH!C;GQM0`kU{-bbUAqw$6MNOje5-I^smcoFs(?K$r1Dfm>J4tto zc^z&m*&=^Ht-ctC?{|tZ5L^Aa$O+6TorqGuT6+8olMY}kory~A?smnr8+uyNTJ)%y zY=?iHgzgpHG{|c)JdJG&mN>-WZwHYR5cLKp&%@@ngXq9Gjt$Sc{935Y4dmGByvrNH e=tHrg1pZl7e^u4r)ywDVg9h6;0#;< literal 0 HcmV?d00001 diff --git a/data/stockpiles/roughglass.dfstock b/data/stockpiles/roughglass.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..9571b3f80ba1a33f3bacad1036beb0e4788c6eba GIT binary patch literal 64 zcma#j|bSivZuCl!KIdN;ULdEwMVze(@E}e-jvo7y~n|2QBigWZ;R83 z`M{MOKSB1B{TNC0-q6O$8fCjqM>$O$FlqYO0WT?{^BB$|H&-mscVT0+ra%bfX;b|K zS7`{5P=O~G_bCsO zkRP}|c*~=>!zgW#5A7cce>SOWfnc_vVW65eiWcOgFKs~hi_&8jjn^K!tlvtS>#b^DNL0b*m1TM|2ew#$vhMEsRInTxOO*%lanRP&#EW8Y8Exhu9 zR-y!l?P9%QmLK|o&S@#vVu_EnG*Rg;bLMtTb+Iw(Ep_8*Xjl(1(BGZB7$bVYga}4~ zjnJ3Y2qeOPH&!&rwMkXTMv7PsK%PbwAPnfA=i2Y2K@xsR%)p^5HQ4JbyG|MqBYa3y zW1z+1!X(V@kPliM$@d9HyS1FrxEsVO@?e;J>k$*ZbiwG-)4LReAh3hx-*E}2YYncEIjDsw6+R+reF_@Fg(wt~j~#?Wf( zQ*(AFMqhx6zOE_?uso%zml!g{^>_l^#N~Dmg-P8sKHp)OkCIs!4>&e+O&jkQ_=BJ# z1zx1_`7lF_XJqncM;cs4-ufz*Itv(XJnNA!ICL80uv(qb7^Jl~hUse9Z`U0TVa-^e z${*Jlh1|*UBdA^*mD9wk(uiKkvb=(3W!4!JL4bumNvJUp*2Vfxfxs|=>#LcFN)VLJ zvKiFI>6h&5hq}JsU>3-X`R)#xUPw0<{#x##ErrEfyX8gdZI?av1UbiRh8q|{zCCE1 znoC%`;mXnN8OoPzZGO#^UvM`mEuUZ{1INqEiPl6|a}F_Y{HQI~;7Ux~?mTFI*GkL_ z&%k{QN`|}-X{}mNX^k^}dl2@zt7TV5e$vAsM$4iFl;PyYkp3#@>9X<@J4i!=W>f;)?L_GDyv?oajp%I&|pJp+i5-Af+lnnhmFgqtR?& zzC7KX-(rX~KtTO9L+Epf!R$bEWdYx8k$zkQUv5~o;C7kX!E{rOqQ1--T#-E-db31+ z*y`yR1{b{{DCR7B_mNR#O!U^)P}u|EF6Y-9v>j}YYO-$$VGqXvp`vOCP2?BtFtvbLDZj(sqgvqU_Q;zto2 ztnp9|yjcF&#Ca!`pn#_7^L|4E=U&Y`MAx4`-oP2%)zC8^bWDjq2&;K;!2FNuI}_k6 zSmabqb!4F-SFs!Xd1Ij?xLIKtJ!4~*PwjAM1B&Q%l*CeF7`@a;V+f#NM_5P2rmcj9 zMT;o}*7Qe$Hd2^ZHKeGrlY3zFp!?GHmwy?x~@g7Y-Kg8He z>TL7WWEEN~Lcf#{%3jbbL(NlSAcfhF#o}>Q$bcJI5MiW9iMKWsiRFT-rHbxsL4L0) zoLId)xod?)Jx%MPiCi`f@)gOuKy=);CJSY0EVw^D9)@6!M%R{>(;ivBoMAJj!&wBv<6~D%w}8tbN4b7vRt~qzKK15(|DP z5UJR>h$Lb?YQD5w!$`X^3X+dz`_*wo=X%-LUi)q3W#yY!LGfVOusk=}OfRSX>Oip5 zvLeC(tXE4Gt|oYxp$8Akj6z7hhx`s=Z|Yx*RFQYBO!E!OXL&`%gf(h*5xgAx9?7)) Xr>^_ib-%jP@9y-c>;879f8FUn@-gPF literal 0 HcmV?d00001 diff --git a/data/stockpiles/stonetools.dfstock b/data/stockpiles/stonetools.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..6f6040189dceed6aa8bc6db86cb406475fb3584e GIT binary patch literal 1886 zcmZ`)yN=XA5L`<{NE~lCjQA0C3yVb#~6}E z3*_6EYbInf^%fpbf`$AM%;3AZzKqOd%L2YwYr5eY_;kgx0lVp;EsTe9Dd_W*!4}!W zlEWqP&00?f-`n6=mV&M5-33O8G0|HaOl1pzJxj&=#KLouSVBi3Rp{B;vj?S8klm6Q zgWW|bmc0g-w0@phJxOL738k1?In3 z-=c?Bu*k8RYR^JLu42#dyOo6wU?)XoaEuLEuG&&R4=AFqqwpp2EeuX-q{(|wupz92 zV$)W_!lDIB0)yS2pb5!OS2d)&#+bR&%}Tj|)$Nn@_h&4!ejK`ve7~H=?HU%jFMT5H zrn?Y2Nu6yTXIX{TDv?`C2xZUY6sFlzVjxA?4aLy@R1$*iSrB2QkRo5LFA~dz)SN21 zvjuryRXA~ad9;@biF!I+4^8B&wRW+FmOkE5CUa6bsA9@*J|6 zUXI(-0dL0TM1%uauQ^$`I>Frp9XMEK6hiWQ*x|RP`Q9`?n$yqb_E&TI-JJe3r+?(r B`*8pO literal 0 HcmV?d00001 diff --git a/data/stockpiles/stoneweapons.dfstock b/data/stockpiles/stoneweapons.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..8a6ee77aa472f31e712f4dc22ec701667beb9a5b GIT binary patch literal 1885 zcmZ`)JCf8e5FHsX!b2Ovfv&h;|E*th9DQAf|NQ##t zI2d$LcDz{rFpKj-Dv>v9%osF)+&)(N(g1ov(CtuGSGh18rXy0Zm& zUsX79dU>>$3W<6;T@Ov(f*ySsAA6F6vv3$TLj@)-KU6BrT4&A=HfBj+$^F0d~G=7md~7lL=1d%e6|Bd&1J z3Ku}bd&D16=@q;IB8I6G3CxSYl@<&ZKwwc7SUd#BL1Sqa5|&XA>|Nn!^yPjLg!7_s z0dUs|JOgA5Qzr%NU5O)-c&bS(%~HbxNDbRtY8*6HZ;GKW6vJUdG3+|Rw~??kQv&sc zurw3Cu!QF{Vf7}7vnyexiQpt5JOc<{HNuTaSiKc)2IXHXm-R(4m=}dBt?>9%1Y1gB zIaF8~lz);0g2rzWjlY64z9bqyI5Zx7+CM2TN2Kv3(f-L8utKgGo(*rcCTmR5y3&nd zr}bAOw$IBM?gZ`(cd9nVee%w5H}B4H=lwmtv4^r~y~d1jKjz1{>~&!Aq{_R0Fzan@ zKChd7_g84+p^vA=j-b6gR32LP8`JLhL|J%n(Sx-)WW!#E-P*!zJ?~Y|+tucHY#Wp1 zZI$i(;*~RE?WV2E${TvQ97=H9TU)L7CaeDg^V}Rv4?Z23Ca+BD(EI&OUFP|C|E}=h Y*C_fHML(k1&*=HDX!bjr{fTCO0Y-01TmS$7 literal 0 HcmV?d00001 diff --git a/data/stockpiles/tools.dfstock b/data/stockpiles/tools.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..abe70454b74d2f1357008979c9a76dc3ec1b6232 GIT binary patch literal 29 lcmYdd<6;T%_xG8=$T)+MaRDR43Py3Z6h+_NLMmIq!X=26Z<5ClCO=*x+Ra{Efu*ITrKP2v+Y*Fngp~JiINS?9 zFq@`aY>s8`o5Xop^XNG>KFbi;iPnK%J hxruYW+U~h1iLFoLFS?@xU4a{L2R*QQf?l9E=nF$-KBNEu literal 0 HcmV?d00001 diff --git a/data/stockpiles/unpreparedfish.dfstock b/data/stockpiles/unpreparedfish.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..465a95dddaf4044c86f9ec7b958739c01d39f275 GIT binary patch literal 1720 zcmZ`)F>>255ER->EK71SacoZ}?{EiEpuh+O7!a_A6~C0yrAJlDlqvJHfLIbZGD@Y< z-rn8fa0~9EGsAa<*>i}pF;JwhB#rI;{Z`jr7~V0h_9eO!IWEvMG-bwXRq z$x|82MFXXwEE!PqNfZ|wdjTm53I-)!}Vt^NWq C!{^BW literal 0 HcmV?d00001 diff --git a/data/stockpiles/wax.dfstock b/data/stockpiles/wax.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..f7ec69912e41e23f568923909774ee2d863ee8f4 GIT binary patch literal 98 zcmWgg&JuGDa&-&|4RW>e@b`0#jCXQ%wF-BPKoWNf^>y-bg^E||kU#z{mgqNAVh5 literal 0 HcmV?d00001 diff --git a/data/stockpiles/weaponsprefix.dfstock b/data/stockpiles/weaponsprefix.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..6a84bf0c70272c8ceb65ef1e09343904535383e4 GIT binary patch literal 3838 zcmZ`*O>f*p7|u#Tl#RkifHvI{P*+Hx+`3g&+7sjP#2$7$V`j$LY%W&RCQ_s*t(H`x zSAGFUjvP61abvy8h#atGBhExg8AV$ z5pK$|3_VcHX7P9(H&x)pI&h?zRMFlQ#%ifE=h2~9BOI5749r+eA!2Wt3>JppMS>>C z=ma0f1Or4mkysPGm8sBv_%NcLA-`j>_bq}cxhcvP^{c-+lT3RAn<$owz3*4_H7TKu zElh1YRl5xPeH&W(0Bn0EQI%k3OpRmZ#P6>Ll=TD#o95b`y(GDZzOG z8+)BZDYLqXj?xtKQdb3)6H0JzLEG(gAvFH7`z^)HV`z?~7UKsSWFYEDiSZX348`U& zDO5G3j+v^8CKzI}Ek(UqwL~hcg7L%72@eJY8{`j$vwQB+Go0x*Zg-SffG&JA(~SX7jmG zYf=eo5+L z#WDa$GrAXC89=oj1;-|XYC|UT%?-A0B7ImAI488#N@h)hM0%MDCK0pHUvRhznkCHA zK5>Jy(-e+C)C(M{T%_v(;zg!cTZVKao0krr$T7g3;B<}tB>b4zFDsm|@JPVS({)qA zuRM|>t;5x#?FG!srmUpaiIqibg7kMP3%s%#Oc966)rN-!5JE-;uOkISP*28|m|E>A z&3TzLs>C}Wh<>fvb8~eZNCcQTo9&i3>|_x5~o`DSsrBYu5#{`Thb&Gp&U;YY>UFE{6li+5Lt_t@g*^5X2(&E(eN vgj$^RElzGNPN>C6XK`|C@rS{WgWm^(KL&$82U~v)_WvGi{WIA5cd+$8%10;W literal 0 HcmV?d00001 diff --git a/data/stockpiles/woodammo.dfstock b/data/stockpiles/woodammo.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..623ca25f239a3faf33bc1e79710a50a0356cb6c8 GIT binary patch literal 29 lcmZ=_6JiPX_jj4V$T)+MaRDR43Py(5VejUvNg_IN)|D|7;yv)L0}!fM*GMTQl(6pGG)q?Sy~1;hXR<-<=#7d z{iZ;nMuRYFOtN4ySTJf15;C~Xw8_r*I}wbw6^{v&Yxt0K#*9ydPgy#wUujRR!nJp| zDrM(N2p4>?LCf$Kd=!Yxkpc^(uZ0tgTrfF;ckOGXvj4x{?p~s0KYE~WOZIiXSz4*o z*X6Rb_@!ZmchlC2#eT+|1Hojm(w;Fy7{k-dLVb#&(PH!nii3X;+&U8{uS+eAQp?GT z7YD!vbMb~njK-&?Ql3J1e(lbu#WAQEKPZ68gl2{}*-F0{(LH4Rk zWZW;|PhWaDJT~>)_L?*ge`#8b6}h6U bYnK6hABG>p@N+o*8cx55)1Tq=cR2k6Qg5E1 literal 0 HcmV?d00001 From 1eaee610447244784c5bca8dc20dd700cde5ceb5 Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Mon, 6 Mar 2023 11:46:43 -0800 Subject: [PATCH 005/439] Fixes dig-now job list iteration/scanning --- plugins/dig-now.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/dig-now.cpp b/plugins/dig-now.cpp index 037e7ae84..be431722b 100644 --- a/plugins/dig-now.cpp +++ b/plugins/dig-now.cpp @@ -85,10 +85,11 @@ public: df::job_list_link* node = df::global::world->jobs.list.next; while (node) { df::job* job = node->item; + node = node->next; + if(!job || !Maps::isValidTilePos(job->pos)) continue; - node = node->next; df::tile_designation td = map.designationAt(job->pos); df::tile_occupancy to = map.occupancyAt(job->pos); const auto ctd = td.whole; From 0459831c6a9b86371813ef8072d01593fc826d69 Mon Sep 17 00:00:00 2001 From: Myk Date: Mon, 6 Mar 2023 12:33:02 -0800 Subject: [PATCH 006/439] Revert "revert recent changes to dig-now due to lockups" --- docs/changelog.txt | 2 + plugins/dig-now.cpp | 250 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 207 insertions(+), 45 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4a3428031..7cec154f3 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -66,6 +66,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `autodump`: changed behaviour to only change ``dump`` and ``forbid`` flags if an item is successfully dumped. -@ `autochop`: generate default names for burrows with no assigned names - ``Buildings::StockpileIterator``: fix check for stockpile items on block boundary. +- `dig-now`: fixed multi-layer channel designations only channeling every second layer - `tailor`: block making clothing sized for toads; make replacement clothing orders use the size of the wearer, not the size of the garment -@ `confirm`: fix fps drop when enabled - `channel-safely`: fix an out of bounds error regarding the REPORT event listener receiving (presumably) stale id's @@ -76,6 +77,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `showmood`: now shows the number of items needed for cloth and bars in addition to the technically correct but always confusing "total dimension" (150 per bar or 10,000 per cloth) -@ Stopped mouse clicks from affecting the map when a click on a DFHack screen dismisses the window - `confirm`: configuration data is now persisted globally. +- `dig-now`: added handling of dig designations that have been converted into active jobs - `tailor`: add support for adamantine cloth (off by default); improve logging ## API diff --git a/plugins/dig-now.cpp b/plugins/dig-now.cpp index 6227f44f5..e94cb41da 100644 --- a/plugins/dig-now.cpp +++ b/plugins/dig-now.cpp @@ -6,6 +6,7 @@ #include "PluginManager.h" #include "TileTypes.h" #include "LuaTools.h" +#include "Debug.h" #include "modules/Buildings.h" #include "modules/Gui.h" @@ -14,6 +15,8 @@ #include "modules/Random.h" #include "modules/Units.h" #include "modules/World.h" +#include "modules/EventManager.h" +#include "modules/Job.h" #include #include @@ -26,12 +29,129 @@ #include #include +#include +#include +#include + DFHACK_PLUGIN("dig-now"); REQUIRE_GLOBAL(plotinfo); REQUIRE_GLOBAL(world); +// Debugging +namespace DFHack { + DBG_DECLARE(dignow, general, DebugCategory::LINFO); + DBG_DECLARE(dignow, channels, DebugCategory::LINFO); +} + +#define COORD "%" PRIi16 " %" PRIi16 " %" PRIi16 +#define COORDARGS(id) id.x, id.y, id.z + using namespace DFHack; +struct designation{ + df::coord pos; + df::tile_designation type; + df::tile_occupancy occupancy; + designation() = default; + designation(const df::coord &c, const df::tile_designation &td, const df::tile_occupancy &to) : pos(c), type(td), occupancy(to) {} + + bool operator==(const designation &rhs) const { + return pos == rhs.pos; + } + + bool operator!=(const designation &rhs) const { + return !(rhs == *this); + } +}; + +namespace std { + template<> + struct hash { + std::size_t operator()(const designation &c) const { + std::hash hash_coord; + return hash_coord(c.pos); + } + }; +} + +class DesignationJobs { +private: + std::unordered_map designations; + std::unordered_map jobs; +public: + void load(MapExtras::MapCache &map) { + designations.clear(); + df::job_list_link* node = df::global::world->jobs.list.next; + while (node) { + df::job* job = node->item; + if(!job || !Maps::isValidTilePos(job->pos)) + continue; + + node = node->next; + df::tile_designation td = map.designationAt(job->pos); + df::tile_occupancy to = map.occupancyAt(job->pos); + const auto ctd = td.whole; + const auto cto = to.whole; + switch (job->job_type){ + case job_type::Dig: + td.bits.dig = tile_dig_designation::Default; + break; + case job_type::DigChannel: + td.bits.dig = tile_dig_designation::Channel; + break; + case job_type::CarveRamp: + td.bits.dig = tile_dig_designation::Ramp; + break; + case job_type::CarveUpwardStaircase: + td.bits.dig = tile_dig_designation::UpStair; + break; + case job_type::CarveDownwardStaircase: + td.bits.dig = tile_dig_designation::DownStair; + break; + case job_type::CarveUpDownStaircase: + td.bits.dig = tile_dig_designation::UpDownStair; + break; + case job_type::DetailWall: + case job_type::DetailFloor: { + df::tiletype tt = map.tiletypeAt(job->pos); + if (tileSpecial(tt) != df::tiletype_special::SMOOTH) { + td.bits.smooth = 1; + } + break; + } + case job_type::CarveTrack: + to.bits.carve_track_north = (job->item_category.whole >> 18) & 1; + to.bits.carve_track_south = (job->item_category.whole >> 19) & 1; + to.bits.carve_track_west = (job->item_category.whole >> 20) & 1; + to.bits.carve_track_east = (job->item_category.whole >> 21) & 1; + break; + default: + break; + } + if (ctd != td.whole || cto != to.whole) { + // we found a designation job + designations.emplace(job->pos, designation(job->pos, td, to)); + jobs.emplace(job->pos, job); + } + } + } + void remove(const df::coord &pos) { + if(jobs.count(pos)) { + Job::removeJob(jobs[pos]); + jobs.erase(pos); + } + } + designation get(const df::coord &pos) { + if (designations.count(pos)) { + return designations[pos]; + } + return {}; + } + bool count(const df::coord &pos) { + return jobs.count(pos); + } +}; + struct boulder_percent_options { // percent chance ([0..100]) for creating a boulder for the given rock type uint32_t layer; @@ -320,8 +440,19 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, std::vector &dug_tiles) { df::tiletype tt = map.tiletypeAt(pos); - if (!is_diggable(map, pos, tt)) + if (!is_diggable(map, pos, tt)) { + DEBUG(general).print("dig_tile: not diggable\n"); return false; + } + + /** The algorithm process seems to be: + * for each tile + * check for a designation + * if a designation exists send it to dig_tile + * + * dig_tile (below) then digs the layer below the channel designated tile + * thereby changing it and causing its designation to be lost + * */ df::tiletype target_type = df::tiletype::Void; switch(designation) { @@ -341,19 +472,22 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, DFCoord pos_below(pos.x, pos.y, pos.z-1); if (can_dig_channel(tt) && map.ensureBlockAt(pos_below) && is_diggable(map, pos_below, map.tiletypeAt(pos_below))) { + TRACE(channels).print("dig_tile: channeling at (" COORD ") [can_dig_channel: true]\n",COORDARGS(pos_below)); target_type = df::tiletype::OpenSpace; DFCoord pos_above(pos.x, pos.y, pos.z+1); - if (map.ensureBlockAt(pos_above)) + if (map.ensureBlockAt(pos_above)) { remove_ramp_top(map, pos_above); - df::tile_dig_designation td_below = - map.designationAt(pos_below).bits.dig; - if (dig_tile(out, map, pos_below, - df::tile_dig_designation::Ramp, dug_tiles)) { + } + df::tile_dig_designation td_below = map.designationAt(pos_below).bits.dig; + if (dig_tile(out, map, pos_below, df::tile_dig_designation::Ramp, dug_tiles)) { clean_ramps(map, pos_below); - if (td_below == df::tile_dig_designation::Default) + if (td_below == df::tile_dig_designation::Default) { dig_tile(out, map, pos_below, td_below, dug_tiles); + } return true; } + } else { + DEBUG(channels).print("dig_tile: failed to channel at (" COORD ") [can_dig_channel: false]\n", COORDARGS(pos_below)); } break; } @@ -407,7 +541,8 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, if (target_type == df::tiletype::Void || target_type == tt) return false; - dug_tiles.push_back(dug_tile_info(map, pos)); + dug_tiles.emplace_back(map, pos); + TRACE(general).print("dig_tile: digging the designation tile at (" COORD ")\n",COORDARGS(pos)); dig_type(map, pos, target_type); // let light filter down to newly exposed tiles @@ -594,9 +729,12 @@ static void do_dig(color_ostream &out, std::vector &dug_coords, item_coords_t &item_coords, const dig_now_options &options) { MapExtras::MapCache map; Random::MersenneRNG rng; + DesignationJobs jobs; + jobs.load(map); rng.init(); + std::unordered_set buffer; // go down levels instead of up so stacked ramps behave as expected for (int16_t z = options.end.z; z >= options.start.z; --z) { for (int16_t y = options.start.y; y <= options.end.y; ++y) { @@ -609,46 +747,68 @@ static void do_dig(color_ostream &out, std::vector &dug_coords, DFCoord pos(x, y, z); df::tile_designation td = map.designationAt(pos); df::tile_occupancy to = map.occupancyAt(pos); - if (td.bits.dig != df::tile_dig_designation::No && - !to.bits.dig_marked) { - std::vector dug_tiles; - if (dig_tile(out, map, pos, td.bits.dig, dug_tiles)) { - for (auto info : dug_tiles) { - td = map.designationAt(info.pos); - td.bits.dig = df::tile_dig_designation::No; - map.setDesignationAt(info.pos, td); - - dug_coords.push_back(info.pos); - refresh_adjacent_smooth_walls(map, info.pos); - if (info.imat < 0) - continue; - if (produces_item(options.boulder_percents, - map, rng, info)) { - auto k = std::make_pair(info.itype, info.imat); - item_coords[k].push_back(info.pos); - } - } - } - } else if (td.bits.smooth == 1) { - if (smooth_tile(out, map, pos)) { - td = map.designationAt(pos); - td.bits.smooth = 0; - map.setDesignationAt(pos, td); - } - } else if (to.bits.carve_track_north == 1 - || to.bits.carve_track_east == 1 - || to.bits.carve_track_south == 1 - || to.bits.carve_track_west == 1) { - if (carve_tile(map, pos, to)) { - to = map.occupancyAt(pos); - to.bits.carve_track_north = 0; - to.bits.carve_track_east = 0; - to.bits.carve_track_south = 0; - to.bits.carve_track_west = 0; - map.setOccupancyAt(pos, to); + if (jobs.count(pos)) { + buffer.emplace(jobs.get(pos)); + jobs.remove(pos); + // if it does get removed, then we're gonna buffer the jobs info then remove the job + } else if ((td.bits.dig != df::tile_dig_designation::No && !to.bits.dig_marked) + || td.bits.smooth == 1 + || to.bits.carve_track_north == 1 + || to.bits.carve_track_east == 1 + || to.bits.carve_track_south == 1 + || to.bits.carve_track_west == 1) { + + // we're only buffering designations, so that processing doesn't affect what we're buffering + buffer.emplace(pos, td, to); + } + } + } + } + + // process designations + for(auto &d : buffer) { + auto pos = d.pos; + auto td = d.type; + auto to = d.occupancy; + + if (td.bits.dig != df::tile_dig_designation::No && !to.bits.dig_marked) { + std::vector dug_tiles; + + if (dig_tile(out, map, pos, td.bits.dig, dug_tiles)) { + for (auto info: dug_tiles) { + td = map.designationAt(info.pos); + td.bits.dig = df::tile_dig_designation::No; + map.setDesignationAt(info.pos, td); + + dug_coords.push_back(info.pos); + refresh_adjacent_smooth_walls(map, info.pos); + if (info.imat < 0) + continue; + if (produces_item(options.boulder_percents, + map, rng, info)) { + auto k = std::make_pair(info.itype, info.imat); + item_coords[k].push_back(info.pos); } } } + } else if (td.bits.smooth == 1) { + if (smooth_tile(out, map, pos)) { + td = map.designationAt(pos); + td.bits.smooth = 0; + map.setDesignationAt(pos, td); + } + } else if (to.bits.carve_track_north == 1 + || to.bits.carve_track_east == 1 + || to.bits.carve_track_south == 1 + || to.bits.carve_track_west == 1) { + if (carve_tile(map, pos, to)) { + to = map.occupancyAt(pos); + to.bits.carve_track_north = 0; + to.bits.carve_track_east = 0; + to.bits.carve_track_south = 0; + to.bits.carve_track_west = 0; + map.setOccupancyAt(pos, to); + } } } From 8cb3c0cf66e06fa128c98832e370cf7b239490e4 Mon Sep 17 00:00:00 2001 From: Myk Date: Mon, 6 Mar 2023 12:38:14 -0800 Subject: [PATCH 007/439] Update changelog.txt --- docs/changelog.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 7cec154f3..f58dea0b3 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,8 +38,10 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes -@ ``widgets.HotkeyLabel``: don't trigger on click if the widget is disabled - ``dfhack.job.isSuitableMaterial``: now properly detects lack of fire and magma safety for vulnerable materials with high melting points +- `dig-now`: fixed multi-layer channel designations only channeling every second layer ## Misc Improvements +- `dig-now`: added handling of dig designations that have been converted into active jobs ## Documentation @@ -66,7 +68,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `autodump`: changed behaviour to only change ``dump`` and ``forbid`` flags if an item is successfully dumped. -@ `autochop`: generate default names for burrows with no assigned names - ``Buildings::StockpileIterator``: fix check for stockpile items on block boundary. -- `dig-now`: fixed multi-layer channel designations only channeling every second layer - `tailor`: block making clothing sized for toads; make replacement clothing orders use the size of the wearer, not the size of the garment -@ `confirm`: fix fps drop when enabled - `channel-safely`: fix an out of bounds error regarding the REPORT event listener receiving (presumably) stale id's @@ -77,7 +78,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `showmood`: now shows the number of items needed for cloth and bars in addition to the technically correct but always confusing "total dimension" (150 per bar or 10,000 per cloth) -@ Stopped mouse clicks from affecting the map when a click on a DFHack screen dismisses the window - `confirm`: configuration data is now persisted globally. -- `dig-now`: added handling of dig designations that have been converted into active jobs - `tailor`: add support for adamantine cloth (off by default); improve logging ## API From 1c36031073a7152e3879a956eff8bd33964087d2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 6 Mar 2023 15:18:06 -0800 Subject: [PATCH 008/439] update all build envs to ubuntu-22.04 --- .github/workflows/build.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 595bde8ed..024a8fe6b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,15 +10,14 @@ jobs: fail-fast: false matrix: os: - - ubuntu-18.04 + - ubuntu-22.04 gcc: - 4.8 - 7 plugins: - default include: - - os: ubuntu-22.04 - gcc: 12 + - gcc: 12 plugins: all steps: - name: Set up Python 3 @@ -159,7 +158,7 @@ jobs: path: build/win64-cross/output/* docs: - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 steps: - name: Set up Python 3 uses: actions/setup-python@v2 @@ -182,7 +181,7 @@ jobs: path: docs/html lint: - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 steps: - name: Set up Python 3 uses: actions/setup-python@v2 From 3569f7e6877b9f2990a23c3da68ce561d3c38795 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 6 Mar 2023 15:22:15 -0800 Subject: [PATCH 009/439] update ruby action --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 024a8fe6b..f3c133bab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -188,7 +188,7 @@ jobs: with: python-version: 3 - name: Set up Ruby 2.7 - uses: actions/setup-ruby@v1 + uses: ruby/setup-ruby@v1 with: ruby-version: 2.7 - name: Install Lua From 363a3d484eac74b34c87b9db45ab0cc901876994 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 6 Mar 2023 15:23:45 -0800 Subject: [PATCH 010/439] fix matrix build? --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f3c133bab..49333f110 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,8 @@ jobs: plugins: - default include: - - gcc: 12 + - os: ubuntu-22.04 + gcc: 12 plugins: all steps: - name: Set up Python 3 From 1bf79afd54fa815cd968231e477a2dc638b22cbe Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 6 Mar 2023 15:29:11 -0800 Subject: [PATCH 011/439] ditch gcc 4.8 and 7, replace with 10 --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49333f110..abee9a86a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,8 +12,7 @@ jobs: os: - ubuntu-22.04 gcc: - - 4.8 - - 7 + - 10 plugins: - default include: From bc77a91d46bddc335ea9a63b34bd44e4efed56b3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 6 Mar 2023 20:51:41 -0800 Subject: [PATCH 012/439] build zero-item buildings with buildingplan so they can be multi-built like all other buildings (the vanilla ui was handling the build and then exiting out of the build menu) --- plugins/lua/buildingplan.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index a666103e5..0fcfd4c72 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -1713,9 +1713,6 @@ function PlannerOverlay:onInput(keys) if is_choosing_area() or cur_building_has_no_area() then local filters = get_cur_filters() local num_filters = #filters - if num_filters == 0 then - return false -- we don't add value; let the game place it - end local choose = self.subviews.choose if choose.enabled() and choose:getOptionValue() then self:save_placement() From 26a257eb8c0cb4c684483e7a443fd6a9cdaa42d5 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 7 Mar 2023 07:14:18 +0000 Subject: [PATCH 013/439] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 8ae81f8d8..9ed162333 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 8ae81f8d8f1f96d82b9074b205073bb8e8d29f96 +Subproject commit 9ed16233380857a145b276bfa62a89ea515c0514 From fc4d2605f205d55dd1ccaa0e5257cc79adca0e44 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 7 Mar 2023 08:00:13 -0800 Subject: [PATCH 014/439] don't softlock the game on modal popups overlays can prevent clicks from being handled by DF. likewise, vanilla modal popups can prevent clicks from getting handled by DFHack. to prevent a softlock, overlay will skip sending input to the overlay widgets when a modal dialog is visible --- plugins/overlay.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/plugins/overlay.cpp b/plugins/overlay.cpp index 4c7384f3b..8e27c8308 100644 --- a/plugins/overlay.cpp +++ b/plugins/overlay.cpp @@ -13,6 +13,7 @@ #include "df/viewscreen_titlest.h" #include "df/viewscreen_update_regionst.h" #include "df/viewscreen_worldst.h" +#include "df/world.h" #include "Debug.h" #include "LuaTools.h" @@ -27,6 +28,8 @@ using namespace DFHack; DFHACK_PLUGIN("overlay"); DFHACK_PLUGIN_IS_ENABLED(is_enabled); +REQUIRE_GLOBAL(world); + namespace DFHack { DBG_DECLARE(overlay, control, DebugCategory::LINFO); DBG_DECLARE(overlay, event, DebugCategory::LINFO); @@ -67,13 +70,15 @@ struct viewscreen_overlay : T { } DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set *input)) { bool input_is_handled = false; - call_overlay_lua(NULL, "feed_viewscreen_widgets", 2, 1, - [&](lua_State *L) { - Lua::Push(L, T::_identity.getName()); - Lua::PushInterfaceKeys(L, *input); - }, [&](lua_State *L) { - input_is_handled = lua_toboolean(L, -1); - }); + // don't send input to the overlays if there is a modal dialog up + if (!world->status.popups.size()) + call_overlay_lua(NULL, "feed_viewscreen_widgets", 2, 1, + [&](lua_State *L) { + Lua::Push(L, T::_identity.getName()); + Lua::PushInterfaceKeys(L, *input); + }, [&](lua_State *L) { + input_is_handled = lua_toboolean(L, -1); + }); if (!input_is_handled) INTERPOSE_NEXT(feed)(input); } From fccd4cdec59232957ec222afaf672c8a68fe8d35 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 7 Mar 2023 17:13:41 -0800 Subject: [PATCH 015/439] add steam deploy workflow --- .github/workflows/steam.yml | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/steam.yml diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml new file mode 100644 index 000000000..683b97fe7 --- /dev/null +++ b/.github/workflows/steam.yml @@ -0,0 +1,57 @@ +name: Deploy to Steam + +on: + workflow_dispatch: + inputs: + commit_hash: + description: Commit hash + type: string + required: true + version: + description: Version + type: string + required: true + release_channel: + description: Release channel + type: string + required: true + default: beta + +jobs: + deploy-to-steam: + name: Deploy to Steam + runs-on: ubuntu-22.04 + steps: + - name: Clone DFHack + uses: actions/checkout@v3 + with: + submodules: true + fetch-depth: 0 + ref: ${{ github.event.inputs.commit_hash }} + - name: Fetch ccache + uses: actions/cache@v3 + with: + path: build/win64-cross/ccache + key: ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} + restore-keys: | + ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} + ccache-win64-cross-msvc + - name: Cross-compile win64 artifacts + env: + CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1' + run: | + cd build + bash -x build-win64-from-linux.sh + - name: Steam deploy + uses: game-ci/steam-deploy@v2 + with: + username: ${{ secrets.STEAM_USERNAME }} + password: ${{ secrets.STEAM_PASSWORD }} + configVdf: ${{ secrets.STEAM_CONFIG_VDF}} + ssfnFileName: ${{ secrets.STEAM_SSFN_FILE_NAME }} + ssfnFileContents: ${{ secrets.STEAM_SSFN_FILE_CONTENTS }} + appId: 2346660 + buildDescription: ${{ github.event.inputs.version }} + rootPath: build/win64-cross/output + depot1Path: dfhack-windows-x64 + releaseBranch: ${{ github.event.inputs.release_channel }} From 980f6734540b211c21086010d88af4d66efc85b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 7 Mar 2023 17:34:44 -0800 Subject: [PATCH 016/439] fix depot file path --- .github/workflows/steam.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 683b97fe7..035caf805 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -52,6 +52,6 @@ jobs: ssfnFileContents: ${{ secrets.STEAM_SSFN_FILE_CONTENTS }} appId: 2346660 buildDescription: ${{ github.event.inputs.version }} - rootPath: build/win64-cross/output - depot1Path: dfhack-windows-x64 + rootPath: build + depot1Path: win64-cross/output releaseBranch: ${{ github.event.inputs.release_channel }} From f974ac043f994e870741af49d07e0f18c7a3cfd6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 7 Mar 2023 22:13:08 -0800 Subject: [PATCH 017/439] add launchdf binary so steam has an exe to launch --- CMakeLists.txt | 2 ++ package/windows/CMakeLists.txt | 7 ++++++ package/windows/launchdf.c | 42 ++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 package/windows/CMakeLists.txt create mode 100644 package/windows/launchdf.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 56c81ba72..1fb43fa07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -615,3 +615,5 @@ if(BUILD_SIZECHECK) add_subdirectory(depends/sizecheck) add_dependencies(dfhack sizecheck) endif() + +add_subdirectory(package/windows) diff --git a/package/windows/CMakeLists.txt b/package/windows/CMakeLists.txt new file mode 100644 index 000000000..a5877f117 --- /dev/null +++ b/package/windows/CMakeLists.txt @@ -0,0 +1,7 @@ +project(package_windows) + +if(WIN32) + add_executable(launchdf WIN32 launchdf.c) + install(TARGETS launchdf + DESTINATION ${DFHACK_DATA_DESTINATION}) +endif() diff --git a/package/windows/launchdf.c b/package/windows/launchdf.c new file mode 100644 index 000000000..44a2d4d23 --- /dev/null +++ b/package/windows/launchdf.c @@ -0,0 +1,42 @@ +#include + +int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) +{ + STARTUPINFOA si; + PROCESS_INFORMATION pi; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + CHAR dfdir[1024]; + + if (GetFullPathNameA("..", 1024, dfdir, NULL) == 0) + { + MessageBoxA(NULL, "could not get current directory", NULL, 0); + exit(1); + } + + if (SetCurrentDirectoryA(dfdir) == 0) + { + MessageBoxA(NULL, "could not change to DF directory", NULL, 0); + exit(1); + } + + if (CreateProcessA("Dwarf Fortress.exe", + NULL, + NULL, + NULL, + FALSE, + 0, + NULL, + NULL, + &si, + &pi) == 0) + { + MessageBoxA(NULL, "could not launch 'Dwarf Fortress.exe'", NULL, 0); + exit(1); + } + + exit(0); +} From 787844e8e6de472b63947292d6cc250356e18572 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 7 Mar 2023 22:27:50 -0800 Subject: [PATCH 018/439] fix ccache restore key --- .github/workflows/steam.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 035caf805..aae1621af 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -34,7 +34,7 @@ jobs: path: build/win64-cross/ccache key: ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} restore-keys: | - ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} + ccache-win64-cross-msvc-develop-${{ github.event.inputs.commit_hash }} ccache-win64-cross-msvc - name: Cross-compile win64 artifacts env: From fcfe7e4ef86b3381856224e29872c239e532c2d3 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 8 Mar 2023 07:15:19 +0000 Subject: [PATCH 019/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 9ed162333..09ddae3c2 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 9ed16233380857a145b276bfa62a89ea515c0514 +Subproject commit 09ddae3c2851f207c7257b4767182f4c6c938f18 diff --git a/scripts b/scripts index 288b38c9e..c8ceb198b 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 288b38c9e9d8fabf1a0934ffbe23104274c39883 +Subproject commit c8ceb198b4fc62155b31a5554b9c96cc6bcb8d55 From eee911b807a6b1463e2e92412af1e3de3d2d8838 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 8 Mar 2023 00:00:22 -0800 Subject: [PATCH 020/439] remove changedir, cwd is already root --- package/windows/launchdf.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/package/windows/launchdf.c b/package/windows/launchdf.c index 44a2d4d23..9f4b01fcb 100644 --- a/package/windows/launchdf.c +++ b/package/windows/launchdf.c @@ -9,20 +9,6 @@ int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - CHAR dfdir[1024]; - - if (GetFullPathNameA("..", 1024, dfdir, NULL) == 0) - { - MessageBoxA(NULL, "could not get current directory", NULL, 0); - exit(1); - } - - if (SetCurrentDirectoryA(dfdir) == 0) - { - MessageBoxA(NULL, "could not change to DF directory", NULL, 0); - exit(1); - } - if (CreateProcessA("Dwarf Fortress.exe", NULL, NULL, From 6373832490843d7cf8bb2fa2a19690f182018d5e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 9 Mar 2023 21:18:45 -0800 Subject: [PATCH 021/439] refactor buildingplan into smaller files --- plugins/buildingplan/buildingplan.cpp | 10 +- plugins/lua/buildingplan.lua | 1986 +---------------- plugins/lua/buildingplan/filterselection.lua | 731 ++++++ plugins/lua/buildingplan/inspectoroverlay.lua | 148 ++ plugins/lua/buildingplan/itemselection.lua | 347 +++ plugins/lua/buildingplan/pens.lua | 31 + plugins/lua/buildingplan/planneroverlay.lua | 734 ++++++ 7 files changed, 2020 insertions(+), 1967 deletions(-) create mode 100644 plugins/lua/buildingplan/filterselection.lua create mode 100644 plugins/lua/buildingplan/inspectoroverlay.lua create mode 100644 plugins/lua/buildingplan/itemselection.lua create mode 100644 plugins/lua/buildingplan/pens.lua create mode 100644 plugins/lua/buildingplan/planneroverlay.lua diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index ec85d7952..310d03a5e 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -259,7 +259,7 @@ static void validate_config(color_ostream &out, bool verbose = false) { static void clear_state(color_ostream &out) { call_buildingplan_lua(&out, "signal_reset"); - call_buildingplan_lua(&out, "reload_cursors"); + call_buildingplan_lua(&out, "reload_pens"); planned_buildings.clear(); tasks.clear(); cur_heat_safety.clear(); @@ -318,14 +318,6 @@ DFhackCExport command_result plugin_load_data (color_ostream &out) { return CR_OK; } -DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) { - if (event == SC_WORLD_UNLOADED) { - DEBUG(status,out).print("world unloaded; clearing state for %s\n", plugin_name); - clear_state(out); - } - return CR_OK; -} - static bool cycle_requested = false; static void do_cycle(color_ostream &out) { diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index 0fcfd4c72..d606101be 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -2,7 +2,7 @@ local _ENV = mkmodule('plugins.buildingplan') --[[ - Native functions: + Public native functions: * bool isPlannableBuilding(df::building_type type, int16_t subtype, int32_t custom) * bool isPlannedBuilding(df::building *bld) @@ -13,15 +13,11 @@ local _ENV = mkmodule('plugins.buildingplan') --]] local argparse = require('argparse') -local gui = require('gui') -local guidm = require('gui.dwarfmode') -local overlay = require('plugins.overlay') -local utils = require('utils') -local widgets = require('gui.widgets') +local inspector = require('plugins.buildingplan.inspectoroverlay') +local pens = require('plugins.buildingplan.pens') +local planner = require('plugins.buildingplan.planneroverlay') require('dfhack.buildings') -local uibs = df.global.buildreq - local function process_args(opts, args) if args[1] == 'help' then opts.help = true @@ -44,7 +40,7 @@ function parse_commandline(...) local command = table.remove(positionals, 1) if not command or command == 'status' then printStatus() - elseif command == 'set' then + elseif command == 'set' and positionals then setSetting(positionals[1], positionals[2] == 'true') else return false @@ -66,36 +62,6 @@ function get_job_item(btype, subtype, custom, index) return obj end -local function get_cur_filters() - return dfhack.buildings.getFiltersByType({}, uibs.building_type, - uibs.building_subtype, uibs.custom_type) -end - -local function is_choosing_area() - return uibs.selection_pos.x >= 0 -end - -local function get_cur_area_dims(placement_data) - if not placement_data and not is_choosing_area() then return 1, 1, 1 end - local selection_pos = placement_data and placement_data.p1 or uibs.selection_pos - local pos = placement_data and placement_data.p2 or uibs.pos - return math.abs(selection_pos.x - pos.x) + 1, - math.abs(selection_pos.y - pos.y) + 1, - math.abs(selection_pos.z - pos.z) + 1 -end - -local function get_quantity(filter, hollow, placement_data) - local quantity = filter.quantity or 1 - local dimx, dimy, dimz = get_cur_area_dims(placement_data) - if quantity < 1 then - return (((dimx * dimy) // 4) + 1) * dimz - end - if hollow and dimx > 2 and dimy > 2 then - return quantity * (2*dimx + 2*dimy - 4) * dimz - end - return quantity * dimx * dimy * dimz -end - local function to_title_case(str) str = str:gsub('(%a)([%w_]*)', function (first, rest) return first:upper()..rest:lower() end) @@ -114,12 +80,12 @@ function get_desc(filter) elseif filter.vector_id and filter.vector_id > -1 then desc = to_title_case(df.job_item_vector_id[filter.vector_id]) elseif filter.flags2 and filter.flags2.building_material then - desc = 'Building material'; - if filter.flags2.fire_safe then - desc = 'Fire-safe material'; - end if filter.flags2.magma_safe then - desc = 'Magma-safe material'; + desc = 'Magma-safe material' + elseif filter.flags2.fire_safe then + desc = 'Fire-safe material' + else + desc = 'Building material' end end @@ -131,1930 +97,34 @@ function get_desc(filter) elseif desc == 'Wood' then desc = 'Log' end - return desc -end - -local BUTTON_START_PEN, BUTTON_END_PEN, SELECTED_ITEM_PEN = nil, nil, nil -local reset_counts_flag = false -local reset_inspector_flag = false -function signal_reset() - BUTTON_START_PEN = nil - BUTTON_END_PEN = nil - SELECTED_ITEM_PEN = nil - reset_counts_flag = true - reset_inspector_flag = true -end - -local to_pen = dfhack.pen.parse -local function get_button_start_pen() - if not BUTTON_START_PEN then - local texpos_base = dfhack.textures.getControlPanelTexposStart() - BUTTON_START_PEN = to_pen{ch='[', fg=COLOR_YELLOW, - tile=texpos_base > 0 and texpos_base + 13 or nil} - end - return BUTTON_START_PEN -end -local function get_button_end_pen() - if not BUTTON_END_PEN then - local texpos_base = dfhack.textures.getControlPanelTexposStart() - BUTTON_END_PEN = to_pen{ch=']', fg=COLOR_YELLOW, - tile=texpos_base > 0 and texpos_base + 15 or nil} - end - return BUTTON_END_PEN -end -local function get_selected_item_pen() - if not SELECTED_ITEM_PEN then - local texpos_base = dfhack.textures.getControlPanelTexposStart() - SELECTED_ITEM_PEN = to_pen{ch='x', fg=COLOR_GREEN, - tile=texpos_base > 0 and texpos_base + 9 or nil} - end - return SELECTED_ITEM_PEN -end - -BuildingplanScreen = defclass(BuildingplanScreen, gui.ZScreen) -BuildingplanScreen.ATTRS { - pass_movement_keys=true, - pass_mouse_clicks=false, - defocusable=false, -} - --------------------------------- --- ItemSelection --- - -local BUILD_TEXT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_GREEN, keep_lower=true} -local BUILD_TEXT_HPEN = to_pen{fg=COLOR_WHITE, bg=COLOR_GREEN, keep_lower=true} - --- map of building type -> {set=set of recently used, list=list of recently used} --- most recent entries are at the *end* of the list -local recently_used = {} - -local function sort_by_type(a, b) - local ad, bd = a.data, b.data - return ad.item_type < bd.item_type or - (ad.item_type == bd.item_type and ad.item_subtype < bd.item_subtype) or - (ad.item_type == bd.item_type and ad.item_subtype == bd.item_subtype and a.search_key < b.search_key) or - (ad.item_type == bd.item_type and ad.item_subtype == bd.item_subtype and a.search_key == b.search_key and ad.quality > bd.quality) -end - -local function sort_by_recency(a, b) - local tracker = recently_used[uibs.building_type] - if not tracker then return sort_by_type(a, b) end - local recent_a, recent_b = tracker.set[a.search_key], tracker.set[b.search_key] - -- if they're both in the set, return the one with the greater index, - -- indicating more recent - if recent_a and recent_b then return recent_a > recent_b end - if recent_a and not recent_b then return true end - if not recent_a and recent_b then return false end - return sort_by_type(a, b) -end - -local function sort_by_name(a, b) - return a.search_key < b.search_key or - (a.search_key == b.search_key and sort_by_type(a, b)) -end - -local function sort_by_quantity(a, b) - local ad, bd = a.data, b.data - return ad.quantity > bd.quantity or - (ad.quantity == bd.quantity and sort_by_type(a, b)) -end - -ItemSelection = defclass(ItemSelection, widgets.Window) -ItemSelection.ATTRS{ - frame_title='Choose items', - frame={w=56, h=20, l=4, t=8}, - resizable=true, - index=DEFAULT_NIL, - quantity=DEFAULT_NIL, - on_submit=DEFAULT_NIL, - on_cancel=DEFAULT_NIL, -} - -function ItemSelection:init() - local filter = get_cur_filters()[self.index] - self.num_selected = 0 - self.selected_set = {} - local plural = self.quantity == 1 and '' or 's' - - self:addviews{ - widgets.Label{ - frame={t=0, l=0, r=10}, - text={ - get_desc(filter), - plural, - NEWLINE, - ('Select up to %d item%s ('):format(self.quantity, plural), - {text=function() return self.num_selected end}, - ' selected)', - }, - }, - widgets.Label{ - frame={r=0, w=9, t=0, h=3}, - text_pen=BUILD_TEXT_PEN, - text_hpen=BUILD_TEXT_HPEN, - text={ - ' ', NEWLINE, - ' Build ', NEWLINE, - ' ', - }, - on_click=self:callback('submit'), - }, - widgets.FilteredList{ - view_id='flist', - frame={t=3, l=0, r=0, b=4}, - case_sensitive=false, - choices=self:get_choices(sort_by_recency), - icon_width=2, - on_submit=self:callback('toggle_group'), - edit_on_char=function(ch) return ch:match('[%l -]') end, - }, - widgets.CycleHotkeyLabel{ - frame={l=0, b=2}, - key='CUSTOM_SHIFT_R', - label='Sort by:', - options={ - {label='Recently used', value=sort_by_recency}, - {label='Name', value=sort_by_name}, - {label='Amount', value=sort_by_quantity}, - }, - on_change=self:callback('on_sort'), - }, - widgets.HotkeyLabel{ - frame={l=0, b=1}, - key='SELECT', - label='Use all/none', - auto_width=true, - on_activate=function() self:toggle_group(self.subviews.flist.list:getSelected()) end, - }, - widgets.HotkeyLabel{ - frame={l=22, b=1}, - key='CUSTOM_SHIFT_B', - label='Build', - auto_width=true, - on_activate=self:callback('submit'), - }, - widgets.HotkeyLabel{ - frame={l=38, b=1}, - key='LEAVESCREEN', - label='Go back', - auto_width=true, - on_activate=self:callback('on_cancel'), - }, - widgets.HotkeyLabel{ - frame={l=0, b=0}, - key='KEYBOARD_CURSOR_RIGHT_FAST', - key_sep=' : ', - label='Use one', - auto_width=true, - on_activate=function() self:increment_group(self.subviews.flist.list:getSelected()) end, - }, - widgets.Label{ - frame={l=6, b=0, w=5}, - text_pen=COLOR_LIGHTGREEN, - text='Right', - }, - widgets.HotkeyLabel{ - frame={l=23, b=0}, - key='KEYBOARD_CURSOR_LEFT_FAST', - key_sep=' : ', - label='Use one fewer', - auto_width=true, - on_activate=function() self:decrement_group(self.subviews.flist.list:getSelected()) end, - }, - widgets.Label{ - frame={l=29, b=0, w=4}, - text_pen=COLOR_LIGHTGREEN, - text='Left', - }, - } -end - --- resort and restore selection -function ItemSelection:on_sort(sort_fn) - local flist = self.subviews.flist - local saved_filter = flist:getFilter() - flist:setFilter('') - flist:setChoices(self:get_choices(sort_fn), flist:getSelected()) - flist:setFilter(saved_filter) -end - -local function make_search_key(str) - local out = '' - for c in str:gmatch("[%w%s]") do - out = out .. c - end - return out -end - -function ItemSelection:get_choices(sort_fn) - local item_ids = getAvailableItems(uibs.building_type, - uibs.building_subtype, uibs.custom_type, self.index-1) - local buckets = {} - for _,item_id in ipairs(item_ids) do - local item = df.item.find(item_id) - if not item then goto continue end - local desc = dfhack.items.getDescription(item, 0, true) - if buckets[desc] then - local bucket = buckets[desc] - table.insert(bucket.data.item_ids, item_id) - bucket.data.quantity = bucket.data.quantity + 1 - else - local entry = { - search_key=make_search_key(desc), - icon=self:callback('get_entry_icon', item_id), - data={ - item_ids={item_id}, - item_type=item:getType(), - item_subtype=item:getSubtype(), - quantity=1, - quality=item:getQuality(), - selected=0, - }, - } - buckets[desc] = entry - end - ::continue:: - end - local choices = {} - for desc,choice in pairs(buckets) do - local data = choice.data - choice.text = { - {width=10, text=function() return ('[%d/%d]'):format(data.selected, data.quantity) end}, - {gap=2, text=desc}, - } - table.insert(choices, choice) - end - table.sort(choices, sort_fn) - return choices -end - -function ItemSelection:increment_group(idx, choice) - local data = choice.data - if self.quantity <= self.num_selected then return false end - if data.selected >= data.quantity then return false end - data.selected = data.selected + 1 - self.num_selected = self.num_selected + 1 - local item_id = data.item_ids[data.selected] - self.selected_set[item_id] = true - return true -end - -function ItemSelection:decrement_group(idx, choice) - local data = choice.data - if data.selected <= 0 then return false end - local item_id = data.item_ids[data.selected] - self.selected_set[item_id] = nil - self.num_selected = self.num_selected - 1 - data.selected = data.selected - 1 - return true -end - -function ItemSelection:toggle_group(idx, choice) - local data = choice.data - if data.selected > 0 then - while self:decrement_group(idx, choice) do end - else - while self:increment_group(idx, choice) do end - end -end - -function ItemSelection:get_entry_icon(item_id) - return self.selected_set[item_id] and get_selected_item_pen() or nil -end - -local function track_recently_used(choices) - -- use same set for all subtypes - local tracker = ensure_key(recently_used, uibs.building_type) - for _,choice in ipairs(choices) do - local data = choice.data - if data.selected <= 0 then goto continue end - local key = choice.search_key - local recent_set = ensure_key(tracker, 'set') - local recent_list = ensure_key(tracker, 'list') - if recent_set[key] then - if recent_list[#recent_list] ~= key then - for i,v in ipairs(recent_list) do - if v == key then - table.remove(recent_list, i) - table.insert(recent_list, key) - break - end - end - tracker.set = utils.invert(recent_list) - end - else - -- only keep most recent 10 - if #recent_list >= 10 then - -- remove least recently used from list and set - recent_set[table.remove(recent_list, 1)] = nil - end - table.insert(recent_list, key) - recent_set[key] = #recent_list - end - ::continue:: - end -end - -function ItemSelection:submit() - local selected_items = {} - for item_id in pairs(self.selected_set) do - table.insert(selected_items, item_id) - end - if #selected_items > 0 then - track_recently_used(self.subviews.flist:getChoices()) - end - self.on_submit(selected_items) -end - -function ItemSelection:onInput(keys) - if keys.LEAVESCREEN or keys._MOUSE_R_DOWN then - self.on_cancel() - return true - elseif keys._MOUSE_L_DOWN then - local list = self.subviews.flist.list - local idx = list:getIdxUnderMouse() - if idx then - list:setSelected(idx) - local modstate = dfhack.internal.getModstate() - if modstate & 2 > 0 then -- ctrl - local choice = list:getChoices()[idx] - if modstate & 1 > 0 then -- shift - self:decrement_group(idx, choice) - else - self:increment_group(idx, choice) - end - return true - end - end - end - return ItemSelection.super.onInput(self, keys) -end - -ItemSelectionScreen = defclass(ItemSelectionScreen, BuildingplanScreen) -ItemSelectionScreen.ATTRS { - focus_path='dwarfmode/Building/Placement/dfhack/lua/buildingplan/itemselection', - force_pause=true, - pass_pause=false, - index=DEFAULT_NIL, - quantity=DEFAULT_NIL, - on_submit=DEFAULT_NIL, - on_cancel=DEFAULT_NIL, -} - -function ItemSelectionScreen:init() - self:addviews{ - ItemSelection{ - index=self.index, - quantity=self.quantity, - on_submit=self.on_submit, - on_cancel=self.on_cancel, - } - } -end - --------------------------------- --- Slider --- - -Slider = defclass(Slider, widgets.Widget) -Slider.ATTRS{ - num_stops=DEFAULT_NIL, - get_left_idx_fn=DEFAULT_NIL, - get_right_idx_fn=DEFAULT_NIL, - on_left_change=DEFAULT_NIL, - on_right_change=DEFAULT_NIL, -} - -function Slider:preinit(init_table) - init_table.frame = init_table.frame or {} - init_table.frame.h = init_table.frame.h or 1 -end - -function Slider:init() - if self.num_stops < 2 then error('too few Slider stops') end - self.is_dragging_target = nil -- 'left', 'right', or 'both' - self.is_dragging_idx = nil -- offset from leftmost dragged tile -end - -local function slider_get_width_per_idx(self) - return math.max(5, (self.frame_body.width-7) // (self.num_stops-1)) -end - -function Slider:onInput(keys) - if not keys._MOUSE_L_DOWN then return false end - local x = self:getMousePos() - if not x then return false end - local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() - local width_per_idx = slider_get_width_per_idx(self) - local left_pos = width_per_idx*(left_idx-1) - local right_pos = width_per_idx*(right_idx-1) + 4 - if x < left_pos then - self.on_left_change(self.get_left_idx_fn() - 1) - elseif x < left_pos+3 then - self.is_dragging_target = 'left' - self.is_dragging_idx = x - left_pos - elseif x < right_pos then - self.is_dragging_target = 'both' - self.is_dragging_idx = x - left_pos - elseif x < right_pos+3 then - self.is_dragging_target = 'right' - self.is_dragging_idx = x - right_pos - else - self.on_right_change(self.get_right_idx_fn() + 1) - end - return true -end - -local function slider_do_drag(self, width_per_idx) - local x = self.frame_body:localXY(dfhack.screen.getMousePos()) - local cur_pos = x - self.is_dragging_idx - cur_pos = math.max(0, cur_pos) - cur_pos = math.min(width_per_idx*(self.num_stops-1)+7, cur_pos) - local offset = self.is_dragging_target == 'right' and -2 or 1 - local new_idx = math.max(0, cur_pos+offset)//width_per_idx + 1 - local new_left_idx, new_right_idx - if self.is_dragging_target == 'right' then - new_right_idx = new_idx - else - new_left_idx = new_idx - if self.is_dragging_target == 'both' then - new_right_idx = new_left_idx + self.get_right_idx_fn() - self.get_left_idx_fn() - if new_right_idx > self.num_stops then - return - end - end - end - if new_left_idx and new_left_idx ~= self.get_left_idx_fn() then - self.on_left_change(new_left_idx) - end - if new_right_idx and new_right_idx ~= self.get_right_idx_fn() then - self.on_right_change(new_right_idx) - end -end - -local SLIDER_LEFT_END = to_pen{ch=198, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TRACK = to_pen{ch=205, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TRACK_SELECTED = to_pen{ch=205, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} -local SLIDER_TRACK_STOP = to_pen{ch=216, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TRACK_STOP_SELECTED = to_pen{ch=216, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} -local SLIDER_RIGHT_END = to_pen{ch=181, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TAB_LEFT = to_pen{ch=60, fg=COLOR_BLACK, bg=COLOR_YELLOW} -local SLIDER_TAB_CENTER = to_pen{ch=9, fg=COLOR_BLACK, bg=COLOR_YELLOW} -local SLIDER_TAB_RIGHT = to_pen{ch=62, fg=COLOR_BLACK, bg=COLOR_YELLOW} - -function Slider:onRenderBody(dc, rect) - local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() - local width_per_idx = slider_get_width_per_idx(self) - -- draw track - dc:seek(1,0) - dc:char(nil, SLIDER_LEFT_END) - dc:char(nil, SLIDER_TRACK) - for stop_idx=1,self.num_stops-1 do - local track_stop_pen = SLIDER_TRACK_STOP_SELECTED - local track_pen = SLIDER_TRACK_SELECTED - if left_idx > stop_idx or right_idx < stop_idx then - track_stop_pen = SLIDER_TRACK_STOP - track_pen = SLIDER_TRACK - elseif right_idx == stop_idx then - track_pen = SLIDER_TRACK - end - dc:char(nil, track_stop_pen) - for i=2,width_per_idx do - dc:char(nil, track_pen) - end - end - if right_idx >= self.num_stops then - dc:char(nil, SLIDER_TRACK_STOP_SELECTED) - else - dc:char(nil, SLIDER_TRACK_STOP) - end - dc:char(nil, SLIDER_TRACK) - dc:char(nil, SLIDER_RIGHT_END) - -- draw tabs - dc:seek(width_per_idx*(left_idx-1)) - dc:char(nil, SLIDER_TAB_LEFT) - dc:char(nil, SLIDER_TAB_CENTER) - dc:char(nil, SLIDER_TAB_RIGHT) - dc:seek(width_per_idx*(right_idx-1)+4) - dc:char(nil, SLIDER_TAB_LEFT) - dc:char(nil, SLIDER_TAB_CENTER) - dc:char(nil, SLIDER_TAB_RIGHT) - -- manage dragging - if self.is_dragging_target then - slider_do_drag(self, width_per_idx) - end - if df.global.enabler.mouse_lbut == 0 then - self.is_dragging_target = nil - self.is_dragging_idx = nil - end -end - --------------------------------- --- QualityAndMaterialsPage --- - -QualityAndMaterialsPage = defclass(QualityAndMaterialsPage, widgets.Panel) -QualityAndMaterialsPage.ATTRS{ - frame={t=0, l=0}, - index=DEFAULT_NIL, -} - -local TYPE_COL_WIDTH = 20 -local HEADER_HEIGHT = 7 -local QUALITY_HEIGHT = 9 -local FOOTER_HEIGHT = 4 - --- returns whether the items matched by the specified filter can have a quality --- rating. This also conveniently indicates whether an item can be decorated. -local function can_be_improved(idx) - local filter = get_cur_filters()[idx] - if filter.flags2 and filter.flags2.building_material then - return false; - end - return filter.item_type ~= df.item_type.WOOD and - filter.item_type ~= df.item_type.BLOCKS and - filter.item_type ~= df.item_type.BAR and - filter.item_type ~= df.item_type.BOULDER -end - -local function mat_sort_by_name(a, b) - return a.name < b.name -end - -local function mat_sort_by_quantity(a, b) - return a.quantity > b.quantity or - (a.quantity == b.quantity and mat_sort_by_name(a, b)) -end - -function QualityAndMaterialsPage:init() - self.dirty = true - self.summary = '' - - local enable_item_quality = can_be_improved(self.index) - - self:addviews{ - widgets.Panel{ - view_id='header', - frame={l=0, t=0, h=HEADER_HEIGHT, r=0}, - frame_inset={l=1}, - subviews={ - widgets.Label{ - frame={l=0, t=0}, - text='Current filter:', - }, - widgets.WrappedLabel{ - frame={l=16, t=0, h=2, r=0}, - text_pen=COLOR_LIGHTCYAN, - text_to_wrap=function() return self.summary end, - auto_height=false, - }, - widgets.CycleHotkeyLabel{ - view_id='mat_sort', - frame={l=0, t=3, w=21}, - label='Sort by:', - key='CUSTOM_SHIFT_R', - options={ - {label='name', value=mat_sort_by_name}, - {label='available', value=mat_sort_by_quantity} - }, - on_change=function() self.dirty = true end, - }, - widgets.ToggleHotkeyLabel{ - view_id='hide_zero', - frame={l=0, t=4, w=24}, - label='Hide unavailable:', - key='CUSTOM_SHIFT_H', - initial_option=false, - on_change=function() self.dirty = true end, - }, - widgets.EditField{ - view_id='search', - frame={l=26, t=3}, - label_text='Search: ', - on_char=function(ch) return ch:match('[%l -]') end, - }, - widgets.Label{ - frame={l=1, b=0}, - text='Type', - text_pen=COLOR_LIGHTRED, - }, - widgets.Label{ - frame={l=TYPE_COL_WIDTH, b=0}, - text='Material', - text_pen=COLOR_LIGHTRED, - }, - }, - }, - widgets.Panel{ - view_id='materials_lists', - frame={l=0, t=HEADER_HEIGHT, r=0, b=FOOTER_HEIGHT+QUALITY_HEIGHT}, - frame_style=gui.INTERIOR_FRAME, - subviews={ - widgets.List{ - view_id='materials_categories', - frame={l=1, t=0, b=0, w=TYPE_COL_WIDTH-3}, - scroll_keys={}, - icon_width=2, - cursor_pen=COLOR_CYAN, - on_submit=self:callback('toggle_category'), - }, - widgets.FilteredList{ - view_id='materials_mats', - frame={l=TYPE_COL_WIDTH, t=0, r=0, b=0}, - icon_width=2, - on_submit=self:callback('toggle_material'), - }, - }, - }, - widgets.Panel{ - view_id='divider', - frame={l=TYPE_COL_WIDTH-1, t=HEADER_HEIGHT, b=FOOTER_HEIGHT+QUALITY_HEIGHT, w=1}, - on_render=self:callback('draw_divider'), - }, - widgets.Panel{ - view_id='quality_panel', - frame={l=0, r=0, h=QUALITY_HEIGHT, b=FOOTER_HEIGHT}, - frame_style=gui.INTERIOR_FRAME, - frame_title='Item quality', - subviews={ - widgets.CycleHotkeyLabel{ - view_id='decorated', - frame={l=0, t=1, w=23}, - key='CUSTOM_SHIFT_D', - label='Decorated only:', - options={ - {label='No', value=false}, - {label='Yes', value=true}, - }, - enabled=enable_item_quality, - on_change=self:callback('set_decorated'), - }, - widgets.CycleHotkeyLabel{ - view_id='min_quality', - frame={l=0, t=3, w=18}, - label='Min quality:', - label_below=true, - key_back='CUSTOM_SHIFT_Z', - key='CUSTOM_SHIFT_X', - options={ - {label='Ordinary', value=0}, - {label='Well Crafted', value=1}, - {label='Finely Crafted', value=2}, - {label='Superior', value=3}, - {label='Exceptional', value=4}, - {label='Masterful', value=5}, - {label='Artifact', value=6}, - }, - enabled=enable_item_quality, - on_change=function(val) self:set_min_quality(val+1) end, - }, - widgets.CycleHotkeyLabel{ - view_id='max_quality', - frame={r=1, t=3, w=18}, - label='Max quality:', - label_below=true, - key_back='CUSTOM_SHIFT_Q', - key='CUSTOM_SHIFT_W', - options={ - {label='Ordinary', value=0}, - {label='Well Crafted', value=1}, - {label='Finely Crafted', value=2}, - {label='Superior', value=3}, - {label='Exceptional', value=4}, - {label='Masterful', value=5}, - {label='Artifact', value=6}, - }, - enabled=enable_item_quality, - on_change=function(val) self:set_max_quality(val+1) end, - }, - Slider{ - frame={l=0, t=6}, - num_stops=7, - get_left_idx_fn=function() - return self.subviews.min_quality:getOptionValue() + 1 - end, - get_right_idx_fn=function() - return self.subviews.max_quality:getOptionValue() + 1 - end, - on_left_change=self:callback('set_min_quality'), - on_right_change=self:callback('set_max_quality'), - active=enable_item_quality, - }, - }, - }, - widgets.Panel{ - view_id='footer', - frame={l=0, r=0, b=0, h=FOOTER_HEIGHT}, - frame_inset={t=1, l=1}, - subviews={ - widgets.HotkeyLabel{ - frame={l=0, t=0}, - label='Toggle', - auto_width=true, - key='SELECT', - }, - widgets.HotkeyLabel{ - frame={l=0, t=2}, - label='Done', - auto_width=true, - key='LEAVESCREEN', - }, - widgets.HotkeyLabel{ - frame={l=30, t=0}, - label='Invert selection', - auto_width=true, - key='CUSTOM_SHIFT_I', - on_activate=self:callback('invert_materials'), - }, - widgets.HotkeyLabel{ - frame={l=30, t=2}, - label='Reset filter', - auto_width=true, - key='CUSTOM_SHIFT_X', - on_activate=self:callback('clear_filter'), - }, - }, - } - } - - -- replace the FilteredList's built-in EditField with our own - self.subviews.materials_mats.list.frame.t = 0 - self.subviews.materials_mats.edit.visible = false - self.subviews.materials_mats.edit = self.subviews.search - self.subviews.search.on_change = self.subviews.materials_mats:callback('onFilterChange') -end - -local MAT_ENABLED_PEN = to_pen{ch=string.char(251), fg=COLOR_LIGHTGREEN} -local MAT_DISABLED_PEN = to_pen{ch='x', fg=COLOR_RED} - -local function make_cat_choice(label, cat, key, cats) - local enabled = cats[cat] - local icon = nil - if not cats.unset then - icon = enabled and MAT_ENABLED_PEN or MAT_DISABLED_PEN - end - return { - text=label, - key=key, - enabled=enabled, - cat=cat, - icon=icon, - } -end - -local function make_mat_choice(name, props, enabled, cats) - local quantity = tonumber(props.count) - local text = ('%5d - %s'):format(quantity, name) - local icon = nil - if not cats.unset then - icon = enabled and MAT_ENABLED_PEN or MAT_DISABLED_PEN - end - return { - text=text, - enabled=enabled, - icon=icon, - name=name, - cat=props.category, - quantity=quantity, - } -end - -function QualityAndMaterialsPage:refresh() - local summary = get_desc(get_cur_filters()[self.index]) - local subviews = self.subviews - - local heat = getHeatSafetyFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type) - if heat >= 2 then summary = 'Magma safe ' .. summary - elseif heat == 1 then summary = 'Fire safe ' .. summary - else summary = 'Any ' .. summary - end - - local quality = getQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) - subviews.decorated:setOption(quality.decorated ~= 0) - subviews.min_quality:setOption(quality.min_quality) - subviews.max_quality:setOption(quality.max_quality) - - local cats = getMaterialMaskFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) - local category_choices={ - make_cat_choice('Stone', 'stone', 'CUSTOM_SHIFT_S', cats), - make_cat_choice('Wood', 'wood', 'CUSTOM_SHIFT_O', cats), - make_cat_choice('Metal', 'metal', 'CUSTOM_SHIFT_M', cats), - make_cat_choice('Glass', 'glass', 'CUSTOM_SHIFT_G', cats), - } - self.subviews.materials_categories:setChoices(category_choices) - - local mats = getMaterialFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) - local mat_choices = {} - local hide_zero = self.subviews.hide_zero:getOptionValue() - local enabled_mat_names = {} - for name,props in pairs(mats) do - local enabled = props.enabled == 'true' and cats[props.category] - if not cats.unset and enabled then - table.insert(enabled_mat_names, name) - end - if not hide_zero or tonumber(props.count) > 0 then - table.insert(mat_choices, make_mat_choice(name, props, enabled, cats)) - end - end - table.sort(mat_choices, self.subviews.mat_sort:getOptionValue()) - - local prev_filter = self.subviews.search.text - self.subviews.materials_mats:setChoices(mat_choices) - self.subviews.materials_mats:setFilter(prev_filter) - - if #enabled_mat_names > 0 then - table.sort(enabled_mat_names) - summary = summary .. (' of %s'):format(table.concat(enabled_mat_names, ', ')) - end - - self.summary = summary - self.dirty = false - self:updateLayout() -end - -function QualityAndMaterialsPage:toggle_category(_, choice) - local cats = {} - if not choice.icon then - -- toggling from unset to something is set - table.insert(cats, choice.cat) - else - choice.enabled = not choice.enabled - for _,c in ipairs(self.subviews.materials_categories:getChoices()) do - if c.enabled then - table.insert(cats, c.cat) - end - end - end - setMaterialMaskFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, cats) - self.dirty = true -end - -function QualityAndMaterialsPage:toggle_material(_, choice) - local mats = {} - if not choice.icon then - -- toggling from unset to something is set - table.insert(mats, choice.name) - else - for _,c in ipairs(self.subviews.materials_mats:getChoices()) do - local enabled = c.enabled - if choice.name == c.name then - enabled = not c.enabled - end - if enabled then - table.insert(mats, c.name) - end - end - end - setMaterialFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, mats) - self.dirty = true -end - -function QualityAndMaterialsPage:invert_materials() - local mats = {} - for _,c in ipairs(self.subviews.materials_mats:getChoices()) do - if not c.icon then return end - if not c.enabled then - table.insert(mats, c.name) - end - end - setMaterialFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, mats) - self.dirty = true -end - -function QualityAndMaterialsPage:clear_filter() - clearFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) - self.dirty = true -end - -function QualityAndMaterialsPage:set_decorated(decorated) - local subviews = self.subviews - setQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, - decorated and 1 or 0, subviews.min_quality:getOptionValue(), subviews.max_quality:getOptionValue()) - self.dirty = true -end - -function QualityAndMaterialsPage:set_min_quality(idx) - idx = math.min(6, math.max(0, idx-1)) - local subviews = self.subviews - subviews.min_quality:setOption(idx) - if subviews.max_quality:getOptionValue() < idx then - subviews.max_quality:setOption(idx) - end - setQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, - subviews.decorated:getOptionValue() and 1 or 0, idx, subviews.max_quality:getOptionValue()) - self.dirty = true -end - -function QualityAndMaterialsPage:set_max_quality(idx) - idx = math.min(6, math.max(0, idx-1)) - local subviews = self.subviews - subviews.max_quality:setOption(idx) - if subviews.min_quality:getOptionValue() > idx then - subviews.min_quality:setOption(idx) - end - setQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, - subviews.decorated:getOptionValue() and 1 or 0, subviews.min_quality:getOptionValue(), idx) - self.dirty = true -end - -local texpos = dfhack.textures.getThinBordersTexposStart() -local tp = function(offset) - if texpos == -1 then return nil end - return texpos + offset -end - -local TOP_PEN = to_pen{tile=tp(10), ch=194, fg=COLOR_GREY, bg=COLOR_BLACK} -local MID_PEN = to_pen{tile=tp(4), ch=192, fg=COLOR_GREY, bg=COLOR_BLACK} -local BOT_PEN = to_pen{tile=tp(11), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} - -function QualityAndMaterialsPage:draw_divider(dc) - local y2 = dc.height - 1 - for y=0,y2 do - dc:seek(0, y) - if y == 0 then - dc:char(nil, TOP_PEN) - elseif y == y2 then - dc:char(nil, BOT_PEN) - else - dc:char(nil, MID_PEN) - end - end -end - -function QualityAndMaterialsPage:onRenderFrame(dc, rect) - QualityAndMaterialsPage.super.onRenderFrame(self, dc, rect) - if self.dirty then - self:refresh() - end -end - --------------------------------- --- GlobalSettingsPage --- - -GlobalSettingsPage = defclass(GlobalSettingsPage, widgets.ResizingPanel) -GlobalSettingsPage.ATTRS{ - autoarrange_subviews=true, - frame={t=0, l=0}, - frame_style=gui.INTERIOR_FRAME, -} - -function GlobalSettingsPage:init() - self:addviews{ - widgets.WrappedLabel{ - frame={l=0}, - text_to_wrap='These options will affect the selection of "Generic Materials" for all future buildings.', - }, - widgets.Panel{ - frame={h=1}, - }, - widgets.ToggleHotkeyLabel{ - view_id='blocks', - frame={l=0}, - key='CUSTOM_B', - label='Blocks', - label_width=8, - on_change=self:callback('update_setting', 'blocks'), - }, - widgets.ToggleHotkeyLabel{ - view_id='logs', - frame={l=0}, - key='CUSTOM_L', - label='Logs', - label_width=8, - on_change=self:callback('update_setting', 'logs'), - }, - widgets.ToggleHotkeyLabel{ - view_id='boulders', - frame={l=0}, - key='CUSTOM_O', - label='Boulders', - label_width=8, - on_change=self:callback('update_setting', 'boulders'), - }, - widgets.ToggleHotkeyLabel{ - view_id='bars', - frame={l=0}, - key='CUSTOM_R', - label='Bars', - label_width=8, - on_change=self:callback('update_setting', 'bars'), - }, - } - - self:init_settings() -end - -function GlobalSettingsPage:init_settings() - local settings = getGlobalSettings() - local subviews = self.subviews - subviews.blocks:setOption(settings.blocks) - subviews.logs:setOption(settings.logs) - subviews.boulders:setOption(settings.boulders) - subviews.bars:setOption(settings.bars) -end - -function GlobalSettingsPage:update_setting(setting, val) - dfhack.run_command('buildingplan', 'set', setting, tostring(val)) - self:init_settings() -end - --------------------------------- --- FilterSelection --- - -FilterSelection = defclass(FilterSelection, widgets.Window) -FilterSelection.ATTRS{ - frame_title='Choose filters', - frame={w=55, h=53, l=30, t=8}, - frame_inset={t=1}, - resizable=true, - index=DEFAULT_NIL, - autoarrange_subviews=true, -} - -function FilterSelection:init() - self:addviews{ - widgets.TabBar{ - frame={t=0}, - labels={ - 'Quality and materials', - 'Global settings', - }, - on_select=function(idx) - self.subviews.pages:setSelected(idx) - self:updateLayout() - end, - get_cur_page=function() return self.subviews.pages:getSelected() end, - key='CUSTOM_CTRL_T', - }, - widgets.Widget{ - frame={h=1}, - }, - widgets.Pages{ - view_id='pages', - frame={t=5, l=0, b=0, r=0}, - subviews={ - QualityAndMaterialsPage{index=self.index}, - GlobalSettingsPage{}, - }, - }, - } -end - -FilterSelectionScreen = defclass(FilterSelectionScreen, BuildingplanScreen) -FilterSelectionScreen.ATTRS { - focus_path='dwarfmode/Building/Placement/dfhack/lua/buildingplan/filterselection', - index=DEFAULT_NIL, -} - -function FilterSelectionScreen:init() - self:addviews{ - FilterSelection{index=self.index} - } -end - -function FilterSelectionScreen:onShow() - -- don't let the building "shadow" follow the mouse cursor while this screen is open - df.global.game.main_interface.bottom_mode_selected = -1 -end - -function FilterSelectionScreen:onDismiss() - -- re-enable building shadow - df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT -end - --------------------------------- --- ItemLine --- - -local function cur_building_has_no_area() - if uibs.building_type == df.building_type.Construction then return false end - local filters = dfhack.buildings.getFiltersByType({}, - uibs.building_type, uibs.building_subtype, uibs.custom_type) - -- this works because all variable-size buildings have either no item - -- filters or a quantity of -1 for their first (and only) item - return filters and filters[1] and (not filters[1].quantity or filters[1].quantity > 0) -end - -local function is_plannable() - return get_cur_filters() and - not (uibs.building_type == df.building_type.Construction - and uibs.building_subtype == df.construction_type.TrackNSEW) -end - -local function is_construction() - return uibs.building_type == df.building_type.Construction -end - -local function is_stairs() - return is_construction() - and uibs.building_subtype == df.construction_type.UpDownStair -end - -local direction_panel_frame = {t=4, h=13, w=46, r=28} - -local direction_panel_types = utils.invert{ - df.building_type.Bridge, - df.building_type.ScrewPump, - df.building_type.WaterWheel, - df.building_type.AxleHorizontal, - df.building_type.Rollers, -} - -local function has_direction_panel() - return direction_panel_types[uibs.building_type] - or (uibs.building_type == df.building_type.Trap - and uibs.building_subtype == df.trap_type.TrackStop) -end - -local pressure_plate_panel_frame = {t=4, h=37, w=46, r=28} - -local function has_pressure_plate_panel() - return uibs.building_type == df.building_type.Trap - and uibs.building_subtype == df.trap_type.PressurePlate -end - -local function is_over_options_panel() - local frame = nil - if has_direction_panel() then - frame = direction_panel_frame - elseif has_pressure_plate_panel() then - frame = pressure_plate_panel_frame - else - return false - end - local v = widgets.Widget{frame=frame} - local rect = gui.mkdims_wh(0, 0, dfhack.screen.getWindowSize()) - v:updateLayout(gui.ViewRect{rect=rect}) - return v:getMousePos() -end - -ItemLine = defclass(ItemLine, widgets.Panel) -ItemLine.ATTRS{ - idx=DEFAULT_NIL, - is_selected_fn=DEFAULT_NIL, - is_hollow_fn=DEFAULT_NIL, - on_select=DEFAULT_NIL, - on_filter=DEFAULT_NIL, - on_clear_filter=DEFAULT_NIL, -} - -function ItemLine:init() - self.frame.h = 1 - self.visible = function() return #get_cur_filters() >= self.idx end - self:addviews{ - widgets.Label{ - frame={t=0, l=0}, - text='*', - auto_width=true, - visible=self.is_selected_fn, - }, - widgets.Label{ - frame={t=0, l=25}, - text={ - {tile=get_button_start_pen}, - {gap=6, tile=get_button_end_pen}, - }, - auto_width=true, - on_click=function() self.on_filter(self.idx) end, - }, - widgets.Label{ - frame={t=0, l=33}, - text={ - {tile=get_button_start_pen}, - {gap=1, tile=get_button_end_pen}, - }, - auto_width=true, - on_click=function() self.on_clear_filter(self.idx) end, - }, - widgets.Label{ - frame={t=0, l=2}, - text={ - {width=21, text=self:callback('get_item_line_text')}, - {gap=3, text='filter', pen=COLOR_GREEN}, - {gap=2, text='x', pen=self:callback('get_x_pen')}, - {gap=3, text=function() return self.note end, - pen=function() return self.note_pen end}, - }, - }, - } -end - -function ItemLine:reset() - self.desc = nil - self.available = nil -end - -function ItemLine:onInput(keys) - if keys._MOUSE_L_DOWN and self:getMousePos() then - self.on_select(self.idx) - end - return ItemLine.super.onInput(self, keys) -end - -function ItemLine:get_x_pen() - return hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx - 1) and - COLOR_GREEN or COLOR_GREY -end - -function ItemLine:get_item_line_text() - local idx = self.idx - local filter = get_cur_filters()[idx] - local quantity = get_quantity(filter, self.is_hollow_fn()) - - self.desc = self.desc or get_desc(filter) - - self.available = self.available or countAvailableItems(uibs.building_type, - uibs.building_subtype, uibs.custom_type, idx - 1) - if self.available >= quantity then - self.note_pen = COLOR_GREEN - self.note = 'Available now' - else - self.note_pen = COLOR_YELLOW - self.note = 'Will link later' - end - - return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and '' or 's') -end - -function ItemLine:reduce_quantity(used_quantity) - if not self.available then return end - local filter = get_cur_filters()[self.idx] - used_quantity = used_quantity or get_quantity(filter, self.is_hollow_fn()) - self.available = math.max(0, self.available - used_quantity) -end - -local function get_placement_errors() - local out = '' - for _,str in ipairs(uibs.errors) do - if #out > 0 then out = out .. NEWLINE end - out = out .. str.value - end - return out -end - --------------------------------- --- PlannerOverlay --- - -PlannerOverlay = defclass(PlannerOverlay, overlay.OverlayWidget) -PlannerOverlay.ATTRS{ - default_pos={x=5,y=9}, - default_enabled=true, - viewscreens='dwarfmode/Building/Placement', - frame={w=56, h=20}, -} - -function PlannerOverlay:init() - self.selected = 1 - - local main_panel = widgets.Panel{ - view_id='main', - frame={t=0, l=0, r=0, h=14}, - frame_style=gui.MEDIUM_FRAME, - frame_background=gui.CLEAR_PEN, - } - - local function make_is_selected_fn(idx) - return function() return self.selected == idx end - end - - local function on_select_fn(idx) - self.selected = idx - end - - local function is_hollow_fn() - return self.subviews.hollow:getOptionValue() - end - - main_panel:addviews{ - widgets.Label{ - frame={}, - auto_width=true, - text='No items required.', - visible=function() return #get_cur_filters() == 0 end, - }, - ItemLine{view_id='item1', frame={t=0, l=0, r=0}, idx=1, - is_selected_fn=make_is_selected_fn(1), is_hollow_fn=is_hollow_fn, - on_select=on_select_fn, on_filter=self:callback('set_filter'), - on_clear_filter=self:callback('clear_filter')}, - ItemLine{view_id='item2', frame={t=2, l=0, r=0}, idx=2, - is_selected_fn=make_is_selected_fn(2), is_hollow_fn=is_hollow_fn, - on_select=on_select_fn, on_filter=self:callback('set_filter'), - on_clear_filter=self:callback('clear_filter')}, - ItemLine{view_id='item3', frame={t=4, l=0, r=0}, idx=3, - is_selected_fn=make_is_selected_fn(3), is_hollow_fn=is_hollow_fn, - on_select=on_select_fn, on_filter=self:callback('set_filter'), - on_clear_filter=self:callback('clear_filter')}, - ItemLine{view_id='item4', frame={t=6, l=0, r=0}, idx=4, - is_selected_fn=make_is_selected_fn(4), is_hollow_fn=is_hollow_fn, - on_select=on_select_fn, on_filter=self:callback('set_filter'), - on_clear_filter=self:callback('clear_filter')}, - widgets.CycleHotkeyLabel{ - view_id='hollow', - frame={t=3, l=4}, - key='CUSTOM_H', - label='Hollow area:', - visible=is_construction, - options={ - {label='No', value=false}, - {label='Yes', value=true}, - }, - }, - widgets.CycleHotkeyLabel{ - view_id='stairs_top_subtype', - frame={t=4, l=4}, - key='CUSTOM_R', - label='Top Stair Type: ', - visible=is_stairs, - options={ - {label='Auto', value='auto'}, - {label='UpDown', value=df.construction_type.UpDownStair}, - {label='Down', value=df.construction_type.DownStair}, - }, - }, - widgets.CycleHotkeyLabel { - view_id='stairs_bottom_subtype', - frame={t=5, l=4}, - key='CUSTOM_B', - label='Bottom Stair Type: ', - visible=is_stairs, - options={ - {label='Auto', value='auto'}, - {label='UpDown', value=df.construction_type.UpDownStair}, - {label='Up', value=df.construction_type.UpStair}, - }, - }, - widgets.Label{ - frame={b=3, l=17}, - text={ - 'Selected area: ', - {text=function() - return ('%dx%dx%d'):format(get_cur_area_dims(self.saved_placement)) - end - }, - }, - visible=function() - return not cur_building_has_no_area() and (self.saved_placement or is_choosing_area()) - end, - }, - widgets.Panel{ - visible=function() return #get_cur_filters() > 0 end, - subviews={ - widgets.HotkeyLabel{ - frame={b=1, l=0}, - key='STRING_A042', - auto_width=true, - enabled=function() return #get_cur_filters() > 1 end, - on_activate=function() self.selected = ((self.selected - 2) % #get_cur_filters()) + 1 end, - }, - widgets.HotkeyLabel{ - frame={b=1, l=1}, - key='STRING_A047', - label='Prev/next item', - auto_width=true, - enabled=function() return #get_cur_filters() > 1 end, - on_activate=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, - }, - widgets.HotkeyLabel{ - frame={b=1, l=21}, - key='CUSTOM_F', - label='Set filter', - auto_width=true, - on_activate=function() self:set_filter(self.selected) end, - }, - widgets.HotkeyLabel{ - frame={b=1, l=37}, - key='CUSTOM_X', - label='Clear filter', - auto_width=true, - on_activate=function() self:clear_filter(self.selected) end, - enabled=function() - return hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.selected - 1) - end - }, - widgets.CycleHotkeyLabel{ - view_id='choose', - frame={b=0, l=0, w=25}, - key='CUSTOM_I', - label='Choose from items:', - options={{label='Yes', value=true}, - {label='No', value=false}}, - initial_option=false, - enabled=function() - for idx = 1,4 do - if (self.subviews['item'..idx].available or 0) > 0 then - return true - end - end - end, - }, - widgets.CycleHotkeyLabel{ - view_id='safety', - frame={b=0, l=29, w=25}, - key='CUSTOM_G', - label='Building safety:', - options={ - {label='Any', value=0}, - {label='Magma', value=2, pen=COLOR_RED}, - {label='Fire', value=1, pen=COLOR_LIGHTRED}, - }, - initial_option=0, - on_change=function(heat) - setHeatSafetyFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, heat) - end, - }, - }, - }, - } - - local error_panel = widgets.ResizingPanel{ - view_id='errors', - frame={t=14, l=0, r=0}, - frame_style=gui.MEDIUM_FRAME, - frame_background=gui.CLEAR_PEN, - } - - error_panel:addviews{ - widgets.WrappedLabel{ - frame={t=0, l=0, r=0}, - text_pen=COLOR_LIGHTRED, - text_to_wrap=get_placement_errors, - visible=function() return #uibs.errors > 0 end, - }, - widgets.Label{ - frame={t=0, l=0, r=0}, - text_pen=COLOR_GREEN, - text='OK to build', - visible=function() return #uibs.errors == 0 end, - }, - } - - self:addviews{ - main_panel, - error_panel, - } -end - -function PlannerOverlay:reset() - self.subviews.item1:reset() - self.subviews.item2:reset() - self.subviews.item3:reset() - self.subviews.item4:reset() - reset_counts_flag = false -end - -function PlannerOverlay:set_filter(idx) - FilterSelectionScreen{index=idx}:show() -end - -function PlannerOverlay:clear_filter(idx) - clearFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, idx-1) -end - -local function get_placement_data() - local pos = uibs.pos - local direction = uibs.direction - local width, height, depth = get_cur_area_dims() - local _, adjusted_width, adjusted_height = dfhack.buildings.getCorrectSize( - width, height, uibs.building_type, uibs.building_subtype, - uibs.custom_type, direction) - -- get the upper-left corner of the building/area at min z-level - local has_selection = is_choosing_area() - local start_pos = xyz2pos( - has_selection and math.min(uibs.selection_pos.x, pos.x) or pos.x - adjusted_width//2, - has_selection and math.min(uibs.selection_pos.y, pos.y) or pos.y - adjusted_height//2, - has_selection and math.min(uibs.selection_pos.z, pos.z) or pos.z - ) - if uibs.building_type == df.building_type.ScrewPump then - if direction == df.screw_pump_direction.FromSouth then - start_pos.y = start_pos.y + 1 - elseif direction == df.screw_pump_direction.FromEast then - start_pos.x = start_pos.x + 1 - end - end - local min_x, max_x = start_pos.x, start_pos.x - local min_y, max_y = start_pos.y, start_pos.y - local min_z, max_z = start_pos.z, start_pos.z - if adjusted_width == 1 and adjusted_height == 1 - and (width > 1 or height > 1 or depth > 1) then - max_x = min_x + width - 1 - max_y = min_y + height - 1 - max_z = math.max(uibs.selection_pos.z, pos.z) - end - return { - p1=xyz2pos(min_x, min_y, min_z), - p2=xyz2pos(max_x, max_y, max_z), - width=adjusted_width, - height=adjusted_height - } -end - -function PlannerOverlay:save_placement() - self.saved_placement = get_placement_data() - if (uibs.selection_pos:isValid()) then - self.saved_selection_pos_valid = true - self.saved_selection_pos = copyall(uibs.selection_pos) - self.saved_pos = copyall(uibs.pos) - uibs.selection_pos:clear() - else - self.saved_selection_pos = copyall(self.saved_placement.p1) - self.saved_pos = copyall(self.saved_placement.p2) - self.saved_pos.x = self.saved_pos.x + self.saved_placement.width - 1 - self.saved_pos.y = self.saved_pos.y + self.saved_placement.height - 1 - end -end - -function PlannerOverlay:restore_placement() - if self.saved_selection_pos_valid then - uibs.selection_pos = self.saved_selection_pos - self.saved_selection_pos_valid = nil - else - uibs.selection_pos:clear() - end - self.saved_selection_pos = nil - self.saved_pos = nil - local placement_data = self.saved_placement - self.saved_placement = nil - return placement_data -end - -function PlannerOverlay:onInput(keys) - if not is_plannable() then return false end - if keys.LEAVESCREEN or keys._MOUSE_R_DOWN then - if uibs.selection_pos:isValid() then - uibs.selection_pos:clear() - return true - end - self.selected = 1 - self.subviews.hollow:setOption(false) - self.subviews.choose:setOption(false) - self:reset() - reset_counts_flag = true - return false - end - if PlannerOverlay.super.onInput(self, keys) then - return true - end - if keys._MOUSE_L_DOWN then - if is_over_options_panel() then return false end - local detect_rect = copyall(self.frame_rect) - detect_rect.height = self.subviews.main.frame_rect.height + - self.subviews.errors.frame_rect.height - detect_rect.y2 = detect_rect.y1 + detect_rect.height - 1 - if self.subviews.main:getMousePos(gui.ViewRect{rect=detect_rect}) - or self.subviews.errors:getMousePos() then - return true - end - if not is_construction() and #uibs.errors > 0 then return true end - if dfhack.gui.getMousePos() then - if is_choosing_area() or cur_building_has_no_area() then - local filters = get_cur_filters() - local num_filters = #filters - local choose = self.subviews.choose - if choose.enabled() and choose:getOptionValue() then - self:save_placement() - local is_hollow = self.subviews.hollow:getOptionValue() - local chosen_items, active_screens = {}, {} - local pending = num_filters - df.global.game.main_interface.bottom_mode_selected = -1 - for idx = num_filters,1,-1 do - chosen_items[idx] = {} - if (self.subviews['item'..idx].available or 0) > 0 then - active_screens[idx] = ItemSelectionScreen{ - index=idx, - quantity=get_quantity(filters[idx], is_hollow, - self.saved_placement), - on_submit=function(items) - chosen_items[idx] = items - active_screens[idx]:dismiss() - active_screens[idx] = nil - pending = pending - 1 - if pending == 0 then - df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT - self:place_building(self:restore_placement(), chosen_items) - end - end, - on_cancel=function() - for i,scr in pairs(active_screens) do - scr:dismiss() - end - df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT - self:restore_placement() - end, - }:show() - else - pending = pending - 1 - end - end - else - self:place_building(get_placement_data()) - end - return true - elseif not is_choosing_area() then - return false - end - end - end - return keys._MOUSE_L or keys.SELECT -end -function PlannerOverlay:render(dc) - if not is_plannable() then return end - self.subviews.errors:updateLayout() - PlannerOverlay.super.render(self, dc) -end - -local GOOD_PEN, BAD_PEN -function reload_cursors() - GOOD_PEN = to_pen{ch='o', fg=COLOR_GREEN, tile=dfhack.screen.findGraphicsTile('CURSORS', 1, 2)} - BAD_PEN = to_pen{ch='X', fg=COLOR_RED, tile=dfhack.screen.findGraphicsTile('CURSORS', 3, 0)} -end -reload_cursors() - -local ONE_BY_ONE = xy2pos(1, 1) - -function PlannerOverlay:onRenderFrame(dc, rect) - PlannerOverlay.super.onRenderFrame(self, dc, rect) - - if reset_counts_flag then - self:reset() - self.subviews.safety:setOption(getHeatSafetyFilter( - uibs.building_type, uibs.building_subtype, uibs.custom_type)) - end - - local selection_pos = self.saved_selection_pos or uibs.selection_pos - if not selection_pos or selection_pos.x < 0 then return end - - local pos = self.saved_pos or uibs.pos - local bounds = { - x1 = math.max(0, math.min(selection_pos.x, pos.x)), - x2 = math.min(df.global.world.map.x_count-1, math.max(selection_pos.x, pos.x)), - y1 = math.max(0, math.min(selection_pos.y, pos.y)), - y2 = math.min(df.global.world.map.y_count-1, math.max(selection_pos.y, pos.y)), - } - - local hollow = self.subviews.hollow:getOptionValue() - local default_pen = (self.saved_selection_pos or #uibs.errors == 0) and GOOD_PEN or BAD_PEN - - local get_pen_fn = is_construction() and function(pos) - return dfhack.buildings.checkFreeTiles(pos, ONE_BY_ONE) and GOOD_PEN or BAD_PEN - end or function() - return default_pen - end - - local function get_overlay_pen(pos) - if not hollow then return get_pen_fn(pos) end - if pos.x == bounds.x1 or pos.x == bounds.x2 or - pos.y == bounds.y1 or pos.y == bounds.y2 then - return get_pen_fn(pos) - end - return gui.TRANSPARENT_PEN - end - - guidm.renderMapOverlay(get_overlay_pen, bounds) -end - -function PlannerOverlay:get_stairs_subtype(pos, corner1, corner2) - local subtype = uibs.building_subtype - if pos.z == corner1.z then - local opt = self.subviews.stairs_bottom_subtype:getOptionValue() - if opt == 'auto' then - local tt = dfhack.maps.getTileType(pos) - local shape = df.tiletype.attrs[tt].shape - if shape ~= df.tiletype_shape.STAIR_DOWN then - subtype = df.construction_type.UpStair - end - else - subtype = opt - end - elseif pos.z == corner2.z then - local opt = self.subviews.stairs_top_subtype:getOptionValue() - if opt == 'auto' then - local tt = dfhack.maps.getTileType(pos) - local shape = df.tiletype.attrs[tt].shape - if shape ~= df.tiletype_shape.STAIR_UP then - subtype = df.construction_type.DownStair - end - else - subtype = opt - end - end - return subtype -end - -function PlannerOverlay:place_building(placement_data, chosen_items) - local p1, p2 = placement_data.p1, placement_data.p2 - local blds = {} - local hollow = self.subviews.hollow:getOptionValue() - local subtype = uibs.building_subtype - for z=p1.z,p2.z do for y=p1.y,p2.y do for x=p1.x,p2.x do - if hollow and x ~= p1.x and x ~= p2.x and y ~= p1.y and y ~= p2.y then - goto continue - end - local pos = xyz2pos(x, y, z) - if is_stairs() then - subtype = self:get_stairs_subtype(pos, p1, p2) - end - local bld, err = dfhack.buildings.constructBuilding{pos=pos, - type=uibs.building_type, subtype=subtype, custom=uibs.custom_type, - width=placement_data.width, height=placement_data.height, - direction=uibs.direction} - if err then - -- it's ok if some buildings fail to build - goto continue - end - -- assign fields for the types that need them. we can't pass them all in - -- to the call to constructBuilding since attempting to assign unrelated - -- fields to building types that don't support them causes errors. - for k,v in pairs(bld) do - if k == 'friction' then bld.friction = uibs.friction end - if k == 'use_dump' then bld.use_dump = uibs.use_dump end - if k == 'dump_x_shift' then bld.dump_x_shift = uibs.dump_x_shift end - if k == 'dump_y_shift' then bld.dump_y_shift = uibs.dump_y_shift end - if k == 'speed' then bld.speed = uibs.speed end - end - table.insert(blds, bld) - ::continue:: - end end end - local used_quantity = is_construction() and #blds or false - self.subviews.item1:reduce_quantity(used_quantity) - self.subviews.item2:reduce_quantity(used_quantity) - self.subviews.item3:reduce_quantity(used_quantity) - self.subviews.item4:reduce_quantity(used_quantity) - for _,bld in ipairs(blds) do - -- attach chosen items and reduce job_item quantity - if chosen_items then - local job = bld.jobs[0] - local jitems = job.job_items - for idx=1,#get_cur_filters() do - local item_ids = chosen_items[idx] - while jitems[idx-1].quantity > 0 and #item_ids > 0 do - local item_id = item_ids[#item_ids] - local item = df.item.find(item_id) - if not item then - dfhack.printerr(('item no longer available: %d'):format(item_id)) - break - end - if not dfhack.job.attachJobItem(job, item, df.job_item_ref.T_role.Hauled, idx-1, -1) then - dfhack.printerr(('cannot attach item: %d'):format(item_id)) - break - end - jitems[idx-1].quantity = jitems[idx-1].quantity - 1 - item_ids[#item_ids] = nil - end - end - end - addPlannedBuilding(bld) - end - scheduleCycle() - uibs.selection_pos:clear() -end - --------------------------------- --- InspectorLine --- - -local function get_building_filters() - local bld = dfhack.gui.getSelectedBuilding() - return dfhack.buildings.getFiltersByType({}, - bld:getType(), bld:getSubtype(), bld:getCustomType()) -end - -InspectorLine = defclass(InspectorLine, widgets.Panel) -InspectorLine.ATTRS{ - idx=DEFAULT_NIL, -} - -function InspectorLine:init() - self.frame.h = 2 - self.visible = function() return #get_building_filters() >= self.idx end - self:addviews{ - widgets.Label{ - frame={t=0, l=0}, - text={{text=self:callback('get_desc_string')}}, - }, - widgets.Label{ - frame={t=1, l=2}, - text={{text=self:callback('get_status_line')}}, - }, - } -end - -function InspectorLine:get_desc_string() - if self.desc then return self.desc end - self.desc = getDescString(dfhack.gui.getSelectedBuilding(), self.idx-1) - return self.desc -end - -function InspectorLine:get_status_line() - if self.status then return self.status end - local queue_pos = getQueuePosition(dfhack.gui.getSelectedBuilding(), self.idx-1) - if queue_pos <= 0 then - return 'Item attached' - end - self.status = ('Position in line: %d'):format(queue_pos) - return self.status -end - -function InspectorLine:reset() - self.desc = nil - self.status = nil -end - --------------------------------- --- InspectorOverlay --- - -InspectorOverlay = defclass(InspectorOverlay, overlay.OverlayWidget) -InspectorOverlay.ATTRS{ - default_pos={x=-41,y=14}, - default_enabled=true, - viewscreens='dwarfmode/ViewSheets/BUILDING', - frame={w=30, h=15}, - frame_style=gui.MEDIUM_FRAME, - frame_background=gui.CLEAR_PEN, -} - -function InspectorOverlay:init() - self:addviews{ - widgets.Label{ - frame={t=0, l=0}, - text='Waiting for items:', - }, - InspectorLine{view_id='item1', frame={t=2, l=0}, idx=1}, - InspectorLine{view_id='item2', frame={t=4, l=0}, idx=2}, - InspectorLine{view_id='item3', frame={t=6, l=0}, idx=3}, - InspectorLine{view_id='item4', frame={t=8, l=0}, idx=4}, - widgets.HotkeyLabel{ - frame={t=11, l=0}, - label='adjust filters', - key='CUSTOM_CTRL_F', - visible=false, -- until implemented - }, - widgets.HotkeyLabel{ - frame={t=12, l=0}, - label='make top priority', - key='CUSTOM_CTRL_T', - on_activate=self:callback('make_top_priority'), - }, - } -end - -function InspectorOverlay:reset() - self.subviews.item1:reset() - self.subviews.item2:reset() - self.subviews.item3:reset() - self.subviews.item4:reset() - reset_inspector_flag = false -end - -function InspectorOverlay:make_top_priority() - makeTopPriority(dfhack.gui.getSelectedBuilding()) - self:reset() + return desc end -local RESUME_BUTTON_FRAME = {t=15, h=3, r=73, w=25} - -local function mouse_is_over_resume_button(rect) - local x,y = dfhack.screen.getMousePos() - if not x then return false end - if y < RESUME_BUTTON_FRAME.t or y > RESUME_BUTTON_FRAME.t + RESUME_BUTTON_FRAME.h - 1 then - return false - end - if x > rect.x2 - RESUME_BUTTON_FRAME.r + 1 or x < rect.x2 - RESUME_BUTTON_FRAME.r - RESUME_BUTTON_FRAME.w + 2 then - return false - end - return true +function reload_pens() + pens.reload_pens() end -function InspectorOverlay:onInput(keys) - if not isPlannedBuilding(dfhack.gui.getSelectedBuilding()) then - return false - end - if keys._MOUSE_L_DOWN and mouse_is_over_resume_button(self.frame_parent_rect) then - return true - elseif keys._MOUSE_L_DOWN or keys._MOUSE_R_DOWN or keys.LEAVESCREEN then - self:reset() - end - return InspectorOverlay.super.onInput(self, keys) +function signal_reset() + planner.reset_counts_flag = true + inspector.reset_inspector_flag = true end -function InspectorOverlay:render(dc) - if not isPlannedBuilding(dfhack.gui.getSelectedBuilding()) then - return - end - if reset_inspector_flag then - self:reset() - end - InspectorOverlay.super.render(self, dc) +-- for use during development to reload all buildingplan modules +function reload_modules() + -- ensure circular deps are refreshed + reload('plugins.buildingplan.pens') + reload('plugins.buildingplan') + reload('plugins.buildingplan.filterselection') + reload('plugins.buildingplan.itemselection') + reload('plugins.buildingplan.planneroverlay') + reload('plugins.buildingplan.inspectoroverlay') + reload('plugins.buildingplan') end OVERLAY_WIDGETS = { - planner=PlannerOverlay, - inspector=InspectorOverlay, + planner=planner.PlannerOverlay, + inspector=inspector.InspectorOverlay, } return _ENV diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua new file mode 100644 index 000000000..d043406f3 --- /dev/null +++ b/plugins/lua/buildingplan/filterselection.lua @@ -0,0 +1,731 @@ +local _ENV = mkmodule('plugins.buildingplan.filterselection') + +local gui = require('gui') +local pens = require('plugins.buildingplan.pens') +local widgets = require('gui.widgets') + +local uibs = df.global.buildreq +local to_pen = dfhack.pen.parse + +local function get_cur_filters() + return dfhack.buildings.getFiltersByType({}, uibs.building_type, + uibs.building_subtype, uibs.custom_type) +end + +-------------------------------- +-- Slider +-- + +Slider = defclass(Slider, widgets.Widget) +Slider.ATTRS{ + num_stops=DEFAULT_NIL, + get_left_idx_fn=DEFAULT_NIL, + get_right_idx_fn=DEFAULT_NIL, + on_left_change=DEFAULT_NIL, + on_right_change=DEFAULT_NIL, +} + +function Slider:preinit(init_table) + init_table.frame = init_table.frame or {} + init_table.frame.h = init_table.frame.h or 1 +end + +function Slider:init() + if self.num_stops < 2 then error('too few Slider stops') end + self.is_dragging_target = nil -- 'left', 'right', or 'both' + self.is_dragging_idx = nil -- offset from leftmost dragged tile +end + +local function slider_get_width_per_idx(self) + return math.max(5, (self.frame_body.width-7) // (self.num_stops-1)) +end + +function Slider:onInput(keys) + if not keys._MOUSE_L_DOWN then return false end + local x = self:getMousePos() + if not x then return false end + local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() + local width_per_idx = slider_get_width_per_idx(self) + local left_pos = width_per_idx*(left_idx-1) + local right_pos = width_per_idx*(right_idx-1) + 4 + if x < left_pos then + self.on_left_change(self.get_left_idx_fn() - 1) + elseif x < left_pos+3 then + self.is_dragging_target = 'left' + self.is_dragging_idx = x - left_pos + elseif x < right_pos then + self.is_dragging_target = 'both' + self.is_dragging_idx = x - left_pos + elseif x < right_pos+3 then + self.is_dragging_target = 'right' + self.is_dragging_idx = x - right_pos + else + self.on_right_change(self.get_right_idx_fn() + 1) + end + return true +end + +local function slider_do_drag(self, width_per_idx) + local x = self.frame_body:localXY(dfhack.screen.getMousePos()) + local cur_pos = x - self.is_dragging_idx + cur_pos = math.max(0, cur_pos) + cur_pos = math.min(width_per_idx*(self.num_stops-1)+7, cur_pos) + local offset = self.is_dragging_target == 'right' and -2 or 1 + local new_idx = math.max(0, cur_pos+offset)//width_per_idx + 1 + local new_left_idx, new_right_idx + if self.is_dragging_target == 'right' then + new_right_idx = new_idx + else + new_left_idx = new_idx + if self.is_dragging_target == 'both' then + new_right_idx = new_left_idx + self.get_right_idx_fn() - self.get_left_idx_fn() + if new_right_idx > self.num_stops then + return + end + end + end + if new_left_idx and new_left_idx ~= self.get_left_idx_fn() then + self.on_left_change(new_left_idx) + end + if new_right_idx and new_right_idx ~= self.get_right_idx_fn() then + self.on_right_change(new_right_idx) + end +end + +local SLIDER_LEFT_END = to_pen{ch=198, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TRACK = to_pen{ch=205, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TRACK_SELECTED = to_pen{ch=205, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} +local SLIDER_TRACK_STOP = to_pen{ch=216, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TRACK_STOP_SELECTED = to_pen{ch=216, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} +local SLIDER_RIGHT_END = to_pen{ch=181, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TAB_LEFT = to_pen{ch=60, fg=COLOR_BLACK, bg=COLOR_YELLOW} +local SLIDER_TAB_CENTER = to_pen{ch=9, fg=COLOR_BLACK, bg=COLOR_YELLOW} +local SLIDER_TAB_RIGHT = to_pen{ch=62, fg=COLOR_BLACK, bg=COLOR_YELLOW} + +function Slider:onRenderBody(dc, rect) + local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() + local width_per_idx = slider_get_width_per_idx(self) + -- draw track + dc:seek(1,0) + dc:char(nil, SLIDER_LEFT_END) + dc:char(nil, SLIDER_TRACK) + for stop_idx=1,self.num_stops-1 do + local track_stop_pen = SLIDER_TRACK_STOP_SELECTED + local track_pen = SLIDER_TRACK_SELECTED + if left_idx > stop_idx or right_idx < stop_idx then + track_stop_pen = SLIDER_TRACK_STOP + track_pen = SLIDER_TRACK + elseif right_idx == stop_idx then + track_pen = SLIDER_TRACK + end + dc:char(nil, track_stop_pen) + for i=2,width_per_idx do + dc:char(nil, track_pen) + end + end + if right_idx >= self.num_stops then + dc:char(nil, SLIDER_TRACK_STOP_SELECTED) + else + dc:char(nil, SLIDER_TRACK_STOP) + end + dc:char(nil, SLIDER_TRACK) + dc:char(nil, SLIDER_RIGHT_END) + -- draw tabs + dc:seek(width_per_idx*(left_idx-1)) + dc:char(nil, SLIDER_TAB_LEFT) + dc:char(nil, SLIDER_TAB_CENTER) + dc:char(nil, SLIDER_TAB_RIGHT) + dc:seek(width_per_idx*(right_idx-1)+4) + dc:char(nil, SLIDER_TAB_LEFT) + dc:char(nil, SLIDER_TAB_CENTER) + dc:char(nil, SLIDER_TAB_RIGHT) + -- manage dragging + if self.is_dragging_target then + slider_do_drag(self, width_per_idx) + end + if df.global.enabler.mouse_lbut == 0 then + self.is_dragging_target = nil + self.is_dragging_idx = nil + end +end + +-------------------------------- +-- QualityAndMaterialsPage +-- + +QualityAndMaterialsPage = defclass(QualityAndMaterialsPage, widgets.Panel) +QualityAndMaterialsPage.ATTRS{ + frame={t=0, l=0}, + index=DEFAULT_NIL, + desc=DEFAULT_NIL, +} + +local TYPE_COL_WIDTH = 20 +local HEADER_HEIGHT = 7 +local QUALITY_HEIGHT = 9 +local FOOTER_HEIGHT = 4 + +-- returns whether the items matched by the specified filter can have a quality +-- rating. This also conveniently indicates whether an item can be decorated. +local function can_be_improved(idx) + local filter = get_cur_filters()[idx] + if filter.flags2 and filter.flags2.building_material then + return false; + end + return filter.item_type ~= df.item_type.WOOD and + filter.item_type ~= df.item_type.BLOCKS and + filter.item_type ~= df.item_type.BAR and + filter.item_type ~= df.item_type.BOULDER +end + +local function mat_sort_by_name(a, b) + return a.name < b.name +end + +local function mat_sort_by_quantity(a, b) + return a.quantity > b.quantity or + (a.quantity == b.quantity and mat_sort_by_name(a, b)) +end + +function QualityAndMaterialsPage:init() + self.dirty = true + self.summary = '' + + local enable_item_quality = can_be_improved(self.index) + + self:addviews{ + widgets.Panel{ + view_id='header', + frame={l=0, t=0, h=HEADER_HEIGHT, r=0}, + frame_inset={l=1}, + subviews={ + widgets.Label{ + frame={l=0, t=0}, + text='Current filter:', + }, + widgets.WrappedLabel{ + frame={l=16, t=0, h=2, r=0}, + text_pen=COLOR_LIGHTCYAN, + text_to_wrap=function() return self.summary end, + auto_height=false, + }, + widgets.CycleHotkeyLabel{ + view_id='mat_sort', + frame={l=0, t=3, w=21}, + label='Sort by:', + key='CUSTOM_SHIFT_R', + options={ + {label='name', value=mat_sort_by_name}, + {label='available', value=mat_sort_by_quantity} + }, + on_change=function() self.dirty = true end, + }, + widgets.ToggleHotkeyLabel{ + view_id='hide_zero', + frame={l=0, t=4, w=24}, + label='Hide unavailable:', + key='CUSTOM_SHIFT_H', + initial_option=false, + on_change=function() self.dirty = true end, + }, + widgets.EditField{ + view_id='search', + frame={l=26, t=3}, + label_text='Search: ', + on_char=function(ch) return ch:match('[%l -]') end, + }, + widgets.Label{ + frame={l=1, b=0}, + text='Type', + text_pen=COLOR_LIGHTRED, + }, + widgets.Label{ + frame={l=TYPE_COL_WIDTH, b=0}, + text='Material', + text_pen=COLOR_LIGHTRED, + }, + }, + }, + widgets.Panel{ + view_id='materials_lists', + frame={l=0, t=HEADER_HEIGHT, r=0, b=FOOTER_HEIGHT+QUALITY_HEIGHT}, + frame_style=gui.INTERIOR_FRAME, + subviews={ + widgets.List{ + view_id='materials_categories', + frame={l=1, t=0, b=0, w=TYPE_COL_WIDTH-3}, + scroll_keys={}, + icon_width=2, + cursor_pen=COLOR_CYAN, + on_submit=self:callback('toggle_category'), + }, + widgets.FilteredList{ + view_id='materials_mats', + frame={l=TYPE_COL_WIDTH, t=0, r=0, b=0}, + icon_width=2, + on_submit=self:callback('toggle_material'), + }, + }, + }, + widgets.Panel{ + view_id='divider', + frame={l=TYPE_COL_WIDTH-1, t=HEADER_HEIGHT, b=FOOTER_HEIGHT+QUALITY_HEIGHT, w=1}, + on_render=self:callback('draw_divider'), + }, + widgets.Panel{ + view_id='quality_panel', + frame={l=0, r=0, h=QUALITY_HEIGHT, b=FOOTER_HEIGHT}, + frame_style=gui.INTERIOR_FRAME, + frame_title='Item quality', + subviews={ + widgets.CycleHotkeyLabel{ + view_id='decorated', + frame={l=0, t=1, w=23}, + key='CUSTOM_SHIFT_D', + label='Decorated only:', + options={ + {label='No', value=false}, + {label='Yes', value=true}, + }, + enabled=enable_item_quality, + on_change=self:callback('set_decorated'), + }, + widgets.CycleHotkeyLabel{ + view_id='min_quality', + frame={l=0, t=3, w=18}, + label='Min quality:', + label_below=true, + key_back='CUSTOM_SHIFT_Z', + key='CUSTOM_SHIFT_X', + options={ + {label='Ordinary', value=0}, + {label='Well Crafted', value=1}, + {label='Finely Crafted', value=2}, + {label='Superior', value=3}, + {label='Exceptional', value=4}, + {label='Masterful', value=5}, + {label='Artifact', value=6}, + }, + enabled=enable_item_quality, + on_change=function(val) self:set_min_quality(val+1) end, + }, + widgets.CycleHotkeyLabel{ + view_id='max_quality', + frame={r=1, t=3, w=18}, + label='Max quality:', + label_below=true, + key_back='CUSTOM_SHIFT_Q', + key='CUSTOM_SHIFT_W', + options={ + {label='Ordinary', value=0}, + {label='Well Crafted', value=1}, + {label='Finely Crafted', value=2}, + {label='Superior', value=3}, + {label='Exceptional', value=4}, + {label='Masterful', value=5}, + {label='Artifact', value=6}, + }, + enabled=enable_item_quality, + on_change=function(val) self:set_max_quality(val+1) end, + }, + Slider{ + frame={l=0, t=6}, + num_stops=7, + get_left_idx_fn=function() + return self.subviews.min_quality:getOptionValue() + 1 + end, + get_right_idx_fn=function() + return self.subviews.max_quality:getOptionValue() + 1 + end, + on_left_change=self:callback('set_min_quality'), + on_right_change=self:callback('set_max_quality'), + active=enable_item_quality, + }, + }, + }, + widgets.Panel{ + view_id='footer', + frame={l=0, r=0, b=0, h=FOOTER_HEIGHT}, + frame_inset={t=1, l=1}, + subviews={ + widgets.HotkeyLabel{ + frame={l=0, t=0}, + label='Toggle', + auto_width=true, + key='SELECT', + }, + widgets.HotkeyLabel{ + frame={l=0, t=2}, + label='Done', + auto_width=true, + key='LEAVESCREEN', + }, + widgets.HotkeyLabel{ + frame={l=30, t=0}, + label='Invert selection', + auto_width=true, + key='CUSTOM_SHIFT_I', + on_activate=self:callback('invert_materials'), + }, + widgets.HotkeyLabel{ + frame={l=30, t=2}, + label='Reset filter', + auto_width=true, + key='CUSTOM_SHIFT_X', + on_activate=self:callback('clear_filter'), + }, + }, + } + } + + -- replace the FilteredList's built-in EditField with our own + self.subviews.materials_mats.list.frame.t = 0 + self.subviews.materials_mats.edit.visible = false + self.subviews.materials_mats.edit = self.subviews.search + self.subviews.search.on_change = self.subviews.materials_mats:callback('onFilterChange') +end + +local MAT_ENABLED_PEN = to_pen{ch=string.char(251), fg=COLOR_LIGHTGREEN} +local MAT_DISABLED_PEN = to_pen{ch='x', fg=COLOR_RED} + +local function make_cat_choice(label, cat, key, cats) + local enabled = cats[cat] + local icon = nil + if not cats.unset then + icon = enabled and MAT_ENABLED_PEN or MAT_DISABLED_PEN + end + return { + text=label, + key=key, + enabled=enabled, + cat=cat, + icon=icon, + } +end + +local function make_mat_choice(name, props, enabled, cats) + local quantity = tonumber(props.count) + local text = ('%5d - %s'):format(quantity, name) + local icon = nil + if not cats.unset then + icon = enabled and MAT_ENABLED_PEN or MAT_DISABLED_PEN + end + return { + text=text, + enabled=enabled, + icon=icon, + name=name, + cat=props.category, + quantity=quantity, + } +end + +function QualityAndMaterialsPage:refresh() + local summary = self.desc + local subviews = self.subviews + + local buildingplan = require('plugins.buildingplan') + + local heat = buildingplan.getHeatSafetyFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type) + if heat >= 2 then summary = 'Magma safe ' .. summary + elseif heat == 1 then summary = 'Fire safe ' .. summary + else summary = 'Any ' .. summary + end + + local quality = buildingplan.getQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) + subviews.decorated:setOption(quality.decorated ~= 0) + subviews.min_quality:setOption(quality.min_quality) + subviews.max_quality:setOption(quality.max_quality) + + local cats = buildingplan.getMaterialMaskFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) + local category_choices={ + make_cat_choice('Stone', 'stone', 'CUSTOM_SHIFT_S', cats), + make_cat_choice('Wood', 'wood', 'CUSTOM_SHIFT_O', cats), + make_cat_choice('Metal', 'metal', 'CUSTOM_SHIFT_M', cats), + make_cat_choice('Glass', 'glass', 'CUSTOM_SHIFT_G', cats), + } + self.subviews.materials_categories:setChoices(category_choices) + + local mats = buildingplan.getMaterialFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) + local mat_choices = {} + local hide_zero = self.subviews.hide_zero:getOptionValue() + local enabled_mat_names = {} + for name,props in pairs(mats) do + local enabled = props.enabled == 'true' and cats[props.category] + if not cats.unset and enabled then + table.insert(enabled_mat_names, name) + end + if not hide_zero or tonumber(props.count) > 0 then + table.insert(mat_choices, make_mat_choice(name, props, enabled, cats)) + end + end + table.sort(mat_choices, self.subviews.mat_sort:getOptionValue()) + + local prev_filter = self.subviews.search.text + self.subviews.materials_mats:setChoices(mat_choices) + self.subviews.materials_mats:setFilter(prev_filter) + + if #enabled_mat_names > 0 then + table.sort(enabled_mat_names) + summary = summary .. (' of %s'):format(table.concat(enabled_mat_names, ', ')) + end + + self.summary = summary + self.dirty = false + self:updateLayout() +end + +function QualityAndMaterialsPage:toggle_category(_, choice) + local cats = {} + if not choice.icon then + -- toggling from unset to something is set + table.insert(cats, choice.cat) + else + choice.enabled = not choice.enabled + for _,c in ipairs(self.subviews.materials_categories:getChoices()) do + if c.enabled then + table.insert(cats, c.cat) + end + end + end + require('plugins.buildingplan').setMaterialMaskFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, cats) + self.dirty = true +end + +function QualityAndMaterialsPage:toggle_material(_, choice) + local mats = {} + if not choice.icon then + -- toggling from unset to something is set + table.insert(mats, choice.name) + else + for _,c in ipairs(self.subviews.materials_mats:getChoices()) do + local enabled = c.enabled + if choice.name == c.name then + enabled = not c.enabled + end + if enabled then + table.insert(mats, c.name) + end + end + end + require('plugins.buildingplan').setMaterialFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, mats) + self.dirty = true +end + +function QualityAndMaterialsPage:invert_materials() + local mats = {} + for _,c in ipairs(self.subviews.materials_mats:getChoices()) do + if not c.icon then return end + if not c.enabled then + table.insert(mats, c.name) + end + end + require('plugins.buildingplan').setMaterialFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, mats) + self.dirty = true +end + +function QualityAndMaterialsPage:clear_filter() + require('plugins.buildingplan').clearFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) + self.dirty = true +end + +function QualityAndMaterialsPage:set_decorated(decorated) + local subviews = self.subviews + require('plugins.buildingplan').setQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, + decorated and 1 or 0, subviews.min_quality:getOptionValue(), subviews.max_quality:getOptionValue()) + self.dirty = true +end + +function QualityAndMaterialsPage:set_min_quality(idx) + idx = math.min(6, math.max(0, idx-1)) + local subviews = self.subviews + subviews.min_quality:setOption(idx) + if subviews.max_quality:getOptionValue() < idx then + subviews.max_quality:setOption(idx) + end + require('plugins.buildingplan').setQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, + subviews.decorated:getOptionValue() and 1 or 0, idx, subviews.max_quality:getOptionValue()) + self.dirty = true +end + +function QualityAndMaterialsPage:set_max_quality(idx) + idx = math.min(6, math.max(0, idx-1)) + local subviews = self.subviews + subviews.max_quality:setOption(idx) + if subviews.min_quality:getOptionValue() > idx then + subviews.min_quality:setOption(idx) + end + require('plugins.buildingplan').setQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1, + subviews.decorated:getOptionValue() and 1 or 0, subviews.min_quality:getOptionValue(), idx) + self.dirty = true +end + +function QualityAndMaterialsPage:draw_divider(dc) + local y2 = dc.height - 1 + for y=0,y2 do + dc:seek(0, y) + if y == 0 then + dc:char(nil, pens.VERT_TOP_PEN) + elseif y == y2 then + dc:char(nil, pens.VERT_BOT_PEN) + else + dc:char(nil, pens.VERT_MID_PEN) + end + end +end + +function QualityAndMaterialsPage:onRenderFrame(dc, rect) + QualityAndMaterialsPage.super.onRenderFrame(self, dc, rect) + if self.dirty then + self:refresh() + end +end + +-------------------------------- +-- GlobalSettingsPage +-- + +GlobalSettingsPage = defclass(GlobalSettingsPage, widgets.ResizingPanel) +GlobalSettingsPage.ATTRS{ + autoarrange_subviews=true, + frame={t=0, l=0}, + frame_style=gui.INTERIOR_FRAME, +} + +function GlobalSettingsPage:init() + self:addviews{ + widgets.WrappedLabel{ + frame={l=0}, + text_to_wrap='These options will affect the selection of "Generic Materials" for all future buildings.', + }, + widgets.Panel{ + frame={h=1}, + }, + widgets.ToggleHotkeyLabel{ + view_id='blocks', + frame={l=0}, + key='CUSTOM_B', + label='Blocks', + label_width=8, + on_change=self:callback('update_setting', 'blocks'), + }, + widgets.ToggleHotkeyLabel{ + view_id='logs', + frame={l=0}, + key='CUSTOM_L', + label='Logs', + label_width=8, + on_change=self:callback('update_setting', 'logs'), + }, + widgets.ToggleHotkeyLabel{ + view_id='boulders', + frame={l=0}, + key='CUSTOM_O', + label='Boulders', + label_width=8, + on_change=self:callback('update_setting', 'boulders'), + }, + widgets.ToggleHotkeyLabel{ + view_id='bars', + frame={l=0}, + key='CUSTOM_R', + label='Bars', + label_width=8, + on_change=self:callback('update_setting', 'bars'), + }, + } + + self:init_settings() +end + +function GlobalSettingsPage:init_settings() + local settings = require('plugins.buildingplan').getGlobalSettings() + local subviews = self.subviews + subviews.blocks:setOption(settings.blocks) + subviews.logs:setOption(settings.logs) + subviews.boulders:setOption(settings.boulders) + subviews.bars:setOption(settings.bars) +end + +function GlobalSettingsPage:update_setting(setting, val) + dfhack.run_command('buildingplan', 'set', setting, tostring(val)) + self:init_settings() +end + +-------------------------------- +-- FilterSelection +-- + +FilterSelection = defclass(FilterSelection, widgets.Window) +FilterSelection.ATTRS{ + frame_title='Choose filters', + frame={w=55, h=53, l=30, t=8}, + frame_inset={t=1}, + resizable=true, + index=DEFAULT_NIL, + desc=DEFAULT_NIL, + autoarrange_subviews=true, +} + +function FilterSelection:init() + self:addviews{ + widgets.TabBar{ + frame={t=0}, + labels={ + 'Quality and materials', + 'Global settings', + }, + on_select=function(idx) + self.subviews.pages:setSelected(idx) + self:updateLayout() + end, + get_cur_page=function() return self.subviews.pages:getSelected() end, + key='CUSTOM_CTRL_T', + }, + widgets.Widget{ + frame={h=1}, + }, + widgets.Pages{ + view_id='pages', + frame={t=5, l=0, b=0, r=0}, + subviews={ + QualityAndMaterialsPage{ + index=self.index, + desc=self.desc + }, + GlobalSettingsPage{}, + }, + }, + } +end + +FilterSelectionScreen = defclass(FilterSelectionScreen, gui.ZScreen) +FilterSelectionScreen.ATTRS { + focus_path='dwarfmode/Building/Placement/dfhack/lua/buildingplan/filterselection', + pass_movement_keys=true, + pass_mouse_clicks=false, + defocusable=false, + index=DEFAULT_NIL, + desc=DEFAULT_NIL, +} + +function FilterSelectionScreen:init() + self:addviews{ + FilterSelection{ + index=self.index, + desc=self.desc + } + } +end + +function FilterSelectionScreen:onShow() + -- don't let the building "shadow" follow the mouse cursor while this screen is open + df.global.game.main_interface.bottom_mode_selected = -1 +end + +function FilterSelectionScreen:onDismiss() + -- re-enable building shadow + df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT +end + +return _ENV diff --git a/plugins/lua/buildingplan/inspectoroverlay.lua b/plugins/lua/buildingplan/inspectoroverlay.lua new file mode 100644 index 000000000..5262eccc8 --- /dev/null +++ b/plugins/lua/buildingplan/inspectoroverlay.lua @@ -0,0 +1,148 @@ +local _ENV = mkmodule('plugins.buildingplan.inspectoroverlay') + +local gui = require('gui') +local overlay = require('plugins.overlay') +local widgets = require('gui.widgets') + +reset_inspector_flag = false + +local function get_building_filters() + local bld = dfhack.gui.getSelectedBuilding() + return dfhack.buildings.getFiltersByType({}, + bld:getType(), bld:getSubtype(), bld:getCustomType()) +end + +-------------------------------- +-- InspectorLine +-- + +InspectorLine = defclass(InspectorLine, widgets.Panel) +InspectorLine.ATTRS{ + idx=DEFAULT_NIL, +} + +function InspectorLine:init() + self.frame.h = 2 + self.visible = function() return #get_building_filters() >= self.idx end + self:addviews{ + widgets.Label{ + frame={t=0, l=0}, + text={{text=self:callback('get_desc_string')}}, + }, + widgets.Label{ + frame={t=1, l=2}, + text={{text=self:callback('get_status_line')}}, + }, + } +end + +function InspectorLine:get_desc_string() + if self.desc then return self.desc end + self.desc = require('plugins.buildingplan').getDescString(dfhack.gui.getSelectedBuilding(), self.idx-1) + return self.desc +end + +function InspectorLine:get_status_line() + if self.status then return self.status end + local queue_pos = require('plugins.buildingplan').getQueuePosition(dfhack.gui.getSelectedBuilding(), self.idx-1) + if queue_pos <= 0 then + return 'Item attached' + end + self.status = ('Position in line: %d'):format(queue_pos) + return self.status +end + +function InspectorLine:reset() + self.desc = nil + self.status = nil +end + +-------------------------------- +-- InspectorOverlay +-- + +InspectorOverlay = defclass(InspectorOverlay, overlay.OverlayWidget) +InspectorOverlay.ATTRS{ + default_pos={x=-41,y=14}, + default_enabled=true, + viewscreens='dwarfmode/ViewSheets/BUILDING', + frame={w=30, h=15}, + frame_style=gui.MEDIUM_FRAME, + frame_background=gui.CLEAR_PEN, +} + +function InspectorOverlay:init() + self:addviews{ + widgets.Label{ + frame={t=0, l=0}, + text='Waiting for items:', + }, + InspectorLine{view_id='item1', frame={t=2, l=0}, idx=1}, + InspectorLine{view_id='item2', frame={t=4, l=0}, idx=2}, + InspectorLine{view_id='item3', frame={t=6, l=0}, idx=3}, + InspectorLine{view_id='item4', frame={t=8, l=0}, idx=4}, + widgets.HotkeyLabel{ + frame={t=11, l=0}, + label='adjust filters', + key='CUSTOM_CTRL_F', + visible=false, -- until implemented + }, + widgets.HotkeyLabel{ + frame={t=12, l=0}, + label='make top priority', + key='CUSTOM_CTRL_T', + on_activate=self:callback('make_top_priority'), + }, + } +end + +function InspectorOverlay:reset() + self.subviews.item1:reset() + self.subviews.item2:reset() + self.subviews.item3:reset() + self.subviews.item4:reset() + reset_inspector_flag = false +end + +function InspectorOverlay:make_top_priority() + require('plugins.buildingplan').makeTopPriority(dfhack.gui.getSelectedBuilding()) + self:reset() +end + +local RESUME_BUTTON_FRAME = {t=15, h=3, r=73, w=25} + +local function mouse_is_over_resume_button(rect) + local x,y = dfhack.screen.getMousePos() + if not x then return false end + if y < RESUME_BUTTON_FRAME.t or y > RESUME_BUTTON_FRAME.t + RESUME_BUTTON_FRAME.h - 1 then + return false + end + if x > rect.x2 - RESUME_BUTTON_FRAME.r + 1 or x < rect.x2 - RESUME_BUTTON_FRAME.r - RESUME_BUTTON_FRAME.w + 2 then + return false + end + return true +end + +function InspectorOverlay:onInput(keys) + if not require('plugins.buildingplan').isPlannedBuilding(dfhack.gui.getSelectedBuilding()) then + return false + end + if keys._MOUSE_L_DOWN and mouse_is_over_resume_button(self.frame_parent_rect) then + return true + elseif keys._MOUSE_L_DOWN or keys._MOUSE_R_DOWN or keys.LEAVESCREEN then + self:reset() + end + return InspectorOverlay.super.onInput(self, keys) +end + +function InspectorOverlay:render(dc) + if not require('plugins.buildingplan').isPlannedBuilding(dfhack.gui.getSelectedBuilding()) then + return + end + if reset_inspector_flag then + self:reset() + end + InspectorOverlay.super.render(self, dc) +end + +return _ENV diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua new file mode 100644 index 000000000..7e6567d04 --- /dev/null +++ b/plugins/lua/buildingplan/itemselection.lua @@ -0,0 +1,347 @@ +local _ENV = mkmodule('plugins.buildingplan.itemselection') + +local gui = require('gui') +local pens = require('plugins.buildingplan.pens') +local utils = require('utils') +local widgets = require('gui.widgets') + +local uibs = df.global.buildreq +local to_pen = dfhack.pen.parse + +local BUILD_TEXT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_GREEN, keep_lower=true} +local BUILD_TEXT_HPEN = to_pen{fg=COLOR_WHITE, bg=COLOR_GREEN, keep_lower=true} + +-- map of building type -> {set=set of recently used, list=list of recently used} +-- most recent entries are at the *end* of the list +local recently_used = {} + +local function sort_by_type(a, b) + local ad, bd = a.data, b.data + return ad.item_type < bd.item_type or + (ad.item_type == bd.item_type and ad.item_subtype < bd.item_subtype) or + (ad.item_type == bd.item_type and ad.item_subtype == bd.item_subtype and a.search_key < b.search_key) or + (ad.item_type == bd.item_type and ad.item_subtype == bd.item_subtype and a.search_key == b.search_key and ad.quality > bd.quality) +end + +local function sort_by_recency(a, b) + local tracker = recently_used[uibs.building_type] + if not tracker then return sort_by_type(a, b) end + local recent_a, recent_b = tracker.set[a.search_key], tracker.set[b.search_key] + -- if they're both in the set, return the one with the greater index, + -- indicating more recent + if recent_a and recent_b then return recent_a > recent_b end + if recent_a and not recent_b then return true end + if not recent_a and recent_b then return false end + return sort_by_type(a, b) +end + +local function sort_by_name(a, b) + return a.search_key < b.search_key or + (a.search_key == b.search_key and sort_by_type(a, b)) +end + +local function sort_by_quantity(a, b) + local ad, bd = a.data, b.data + return ad.quantity > bd.quantity or + (ad.quantity == bd.quantity and sort_by_type(a, b)) +end + +ItemSelection = defclass(ItemSelection, widgets.Window) +ItemSelection.ATTRS{ + frame_title='Choose items', + frame={w=56, h=20, l=4, t=8}, + resizable=true, + index=DEFAULT_NIL, + desc=DEFAULT_NIL, + quantity=DEFAULT_NIL, + on_submit=DEFAULT_NIL, + on_cancel=DEFAULT_NIL, +} + +function ItemSelection:init() + self.num_selected = 0 + self.selected_set = {} + local plural = self.quantity == 1 and '' or 's' + + self:addviews{ + widgets.Label{ + frame={t=0, l=0, r=10}, + text={ + self.desc, + plural, + NEWLINE, + ('Select up to %d item%s ('):format(self.quantity, plural), + {text=function() return self.num_selected end}, + ' selected)', + }, + }, + widgets.Label{ + frame={r=0, w=9, t=0, h=3}, + text_pen=BUILD_TEXT_PEN, + text_hpen=BUILD_TEXT_HPEN, + text={ + ' ', NEWLINE, + ' Build ', NEWLINE, + ' ', + }, + on_click=self:callback('submit'), + }, + widgets.FilteredList{ + view_id='flist', + frame={t=3, l=0, r=0, b=4}, + case_sensitive=false, + choices=self:get_choices(sort_by_recency), + icon_width=2, + on_submit=self:callback('toggle_group'), + edit_on_char=function(ch) return ch:match('[%l -]') end, + }, + widgets.CycleHotkeyLabel{ + frame={l=0, b=2}, + key='CUSTOM_SHIFT_R', + label='Sort by:', + options={ + {label='Recently used', value=sort_by_recency}, + {label='Name', value=sort_by_name}, + {label='Amount', value=sort_by_quantity}, + }, + on_change=self:callback('on_sort'), + }, + widgets.HotkeyLabel{ + frame={l=0, b=1}, + key='SELECT', + label='Use all/none', + auto_width=true, + on_activate=function() self:toggle_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.HotkeyLabel{ + frame={l=22, b=1}, + key='CUSTOM_SHIFT_B', + label='Build', + auto_width=true, + on_activate=self:callback('submit'), + }, + widgets.HotkeyLabel{ + frame={l=38, b=1}, + key='LEAVESCREEN', + label='Go back', + auto_width=true, + on_activate=self:callback('on_cancel'), + }, + widgets.HotkeyLabel{ + frame={l=0, b=0}, + key='KEYBOARD_CURSOR_RIGHT_FAST', + key_sep=' : ', + label='Use one', + auto_width=true, + on_activate=function() self:increment_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.Label{ + frame={l=6, b=0, w=5}, + text_pen=COLOR_LIGHTGREEN, + text='Right', + }, + widgets.HotkeyLabel{ + frame={l=23, b=0}, + key='KEYBOARD_CURSOR_LEFT_FAST', + key_sep=' : ', + label='Use one fewer', + auto_width=true, + on_activate=function() self:decrement_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.Label{ + frame={l=29, b=0, w=4}, + text_pen=COLOR_LIGHTGREEN, + text='Left', + }, + } +end + +-- resort and restore selection +function ItemSelection:on_sort(sort_fn) + local flist = self.subviews.flist + local saved_filter = flist:getFilter() + flist:setFilter('') + flist:setChoices(self:get_choices(sort_fn), flist:getSelected()) + flist:setFilter(saved_filter) +end + +local function make_search_key(str) + local out = '' + for c in str:gmatch("[%w%s]") do + out = out .. c + end + return out +end + +function ItemSelection:get_choices(sort_fn) + local item_ids = require('plugins.buildingplan').getAvailableItems(uibs.building_type, + uibs.building_subtype, uibs.custom_type, self.index-1) + local buckets = {} + for _,item_id in ipairs(item_ids) do + local item = df.item.find(item_id) + if not item then goto continue end + local desc = dfhack.items.getDescription(item, 0, true) + if buckets[desc] then + local bucket = buckets[desc] + table.insert(bucket.data.item_ids, item_id) + bucket.data.quantity = bucket.data.quantity + 1 + else + local entry = { + search_key=make_search_key(desc), + icon=self:callback('get_entry_icon', item_id), + data={ + item_ids={item_id}, + item_type=item:getType(), + item_subtype=item:getSubtype(), + quantity=1, + quality=item:getQuality(), + selected=0, + }, + } + buckets[desc] = entry + end + ::continue:: + end + local choices = {} + for desc,choice in pairs(buckets) do + local data = choice.data + choice.text = { + {width=10, text=function() return ('[%d/%d]'):format(data.selected, data.quantity) end}, + {gap=2, text=desc}, + } + table.insert(choices, choice) + end + table.sort(choices, sort_fn) + return choices +end + +function ItemSelection:increment_group(idx, choice) + local data = choice.data + if self.quantity <= self.num_selected then return false end + if data.selected >= data.quantity then return false end + data.selected = data.selected + 1 + self.num_selected = self.num_selected + 1 + local item_id = data.item_ids[data.selected] + self.selected_set[item_id] = true + return true +end + +function ItemSelection:decrement_group(idx, choice) + local data = choice.data + if data.selected <= 0 then return false end + local item_id = data.item_ids[data.selected] + self.selected_set[item_id] = nil + self.num_selected = self.num_selected - 1 + data.selected = data.selected - 1 + return true +end + +function ItemSelection:toggle_group(idx, choice) + local data = choice.data + if data.selected > 0 then + while self:decrement_group(idx, choice) do end + else + while self:increment_group(idx, choice) do end + end +end + +function ItemSelection:get_entry_icon(item_id) + return self.selected_set[item_id] and pens.SELECTED_ITEM_PEN or nil +end + +local function track_recently_used(choices) + -- use same set for all subtypes + local tracker = ensure_key(recently_used, uibs.building_type) + for _,choice in ipairs(choices) do + local data = choice.data + if data.selected <= 0 then goto continue end + local key = choice.search_key + local recent_set = ensure_key(tracker, 'set') + local recent_list = ensure_key(tracker, 'list') + if recent_set[key] then + if recent_list[#recent_list] ~= key then + for i,v in ipairs(recent_list) do + if v == key then + table.remove(recent_list, i) + table.insert(recent_list, key) + break + end + end + tracker.set = utils.invert(recent_list) + end + else + -- only keep most recent 10 + if #recent_list >= 10 then + -- remove least recently used from list and set + recent_set[table.remove(recent_list, 1)] = nil + end + table.insert(recent_list, key) + recent_set[key] = #recent_list + end + ::continue:: + end +end + +function ItemSelection:submit() + local selected_items = {} + for item_id in pairs(self.selected_set) do + table.insert(selected_items, item_id) + end + if #selected_items > 0 then + track_recently_used(self.subviews.flist:getChoices()) + end + self.on_submit(selected_items) +end + +function ItemSelection:onInput(keys) + if keys.LEAVESCREEN or keys._MOUSE_R_DOWN then + self.on_cancel() + return true + elseif keys._MOUSE_L_DOWN then + local list = self.subviews.flist.list + local idx = list:getIdxUnderMouse() + if idx then + list:setSelected(idx) + local modstate = dfhack.internal.getModstate() + if modstate & 2 > 0 then -- ctrl + local choice = list:getChoices()[idx] + if modstate & 1 > 0 then -- shift + self:decrement_group(idx, choice) + else + self:increment_group(idx, choice) + end + return true + end + end + end + return ItemSelection.super.onInput(self, keys) +end + +ItemSelectionScreen = defclass(ItemSelectionScreen, gui.ZScreen) +ItemSelectionScreen.ATTRS { + focus_path='dwarfmode/Building/Placement/dfhack/lua/buildingplan/itemselection', + force_pause=true, + pass_movement_keys=true, + pass_pause=false, + pass_mouse_clicks=false, + defocusable=false, + index=DEFAULT_NIL, + desc=DEFAULT_NIL, + quantity=DEFAULT_NIL, + on_submit=DEFAULT_NIL, + on_cancel=DEFAULT_NIL, +} + +function ItemSelectionScreen:init() + self:addviews{ + ItemSelection{ + index=self.index, + desc=self.desc, + quantity=self.quantity, + on_submit=self.on_submit, + on_cancel=self.on_cancel, + } + } +end + +return _ENV diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua new file mode 100644 index 000000000..d2198706f --- /dev/null +++ b/plugins/lua/buildingplan/pens.lua @@ -0,0 +1,31 @@ +local _ENV = mkmodule('plugins.buildingplan.pens') + +GOOD_TILE_PEN, BAD_TILE_PEN = nil, nil +VERT_TOP_PEN, VERT_MID_PEN, VERT_BOT_PEN = nil, nil, nil +BUTTON_START_PEN, BUTTON_END_PEN = nil, nil +SELECTED_ITEM_PEN = nil + +local to_pen = dfhack.pen.parse + +local tp = function(base, offset) + if base == -1 then return nil end + return base + offset +end + +function reload_pens() + GOOD_TILE_PEN = to_pen{ch='o', fg=COLOR_GREEN, tile=dfhack.screen.findGraphicsTile('CURSORS', 1, 2)} + BAD_TILE_PEN = to_pen{ch='X', fg=COLOR_RED, tile=dfhack.screen.findGraphicsTile('CURSORS', 3, 0)} + + local tb_texpos = dfhack.textures.getThinBordersTexposStart() + VERT_TOP_PEN = to_pen{tile=tp(tb_texpos, 10), ch=194, fg=COLOR_GREY, bg=COLOR_BLACK} + VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=192, fg=COLOR_GREY, bg=COLOR_BLACK} + VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} + + local cp_texpos = dfhack.textures.getControlPanelTexposStart() + BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} + BUTTON_END_PEN = to_pen{tile=tp(cp_texpos, 15), ch=']', fg=COLOR_YELLOW} + SELECTED_ITEM_PEN = to_pen{tile=tp(cp_texpos, 9), ch=string.char(251), fg=COLOR_YELLOW} +end +reload_pens() + +return _ENV diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua new file mode 100644 index 000000000..864516436 --- /dev/null +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -0,0 +1,734 @@ +local _ENV = mkmodule('plugins.buildingplan.planneroverlay') + +local itemselection = require('plugins.buildingplan.itemselection') +local filterselection = require('plugins.buildingplan.filterselection') +local gui = require('gui') +local guidm = require('gui.dwarfmode') +local overlay = require('plugins.overlay') +local pens = require('plugins.buildingplan.pens') +local utils = require('utils') +local widgets = require('gui.widgets') +require('dfhack.buildings') + +local uibs = df.global.buildreq + +reset_counts_flag = false + +local function get_cur_filters() + return dfhack.buildings.getFiltersByType({}, uibs.building_type, + uibs.building_subtype, uibs.custom_type) +end + +local function is_choosing_area() + return uibs.selection_pos.x >= 0 +end + +local function get_cur_area_dims(placement_data) + if not placement_data and not is_choosing_area() then return 1, 1, 1 end + local selection_pos = placement_data and placement_data.p1 or uibs.selection_pos + local pos = placement_data and placement_data.p2 or uibs.pos + return math.abs(selection_pos.x - pos.x) + 1, + math.abs(selection_pos.y - pos.y) + 1, + math.abs(selection_pos.z - pos.z) + 1 +end + +local function get_quantity(filter, hollow, placement_data) + local quantity = filter.quantity or 1 + local dimx, dimy, dimz = get_cur_area_dims(placement_data) + if quantity < 1 then + return (((dimx * dimy) // 4) + 1) * dimz + end + if hollow and dimx > 2 and dimy > 2 then + return quantity * (2*dimx + 2*dimy - 4) * dimz + end + return quantity * dimx * dimy * dimz +end + +local function cur_building_has_no_area() + if uibs.building_type == df.building_type.Construction then return false end + local filters = dfhack.buildings.getFiltersByType({}, + uibs.building_type, uibs.building_subtype, uibs.custom_type) + -- this works because all variable-size buildings have either no item + -- filters or a quantity of -1 for their first (and only) item + return filters and filters[1] and (not filters[1].quantity or filters[1].quantity > 0) +end + +local function is_plannable() + return get_cur_filters() and + not (uibs.building_type == df.building_type.Construction + and uibs.building_subtype == df.construction_type.TrackNSEW) +end + +local function is_construction() + return uibs.building_type == df.building_type.Construction +end + +local function is_stairs() + return is_construction() + and uibs.building_subtype == df.construction_type.UpDownStair +end + +local direction_panel_frame = {t=4, h=13, w=46, r=28} + +local direction_panel_types = utils.invert{ + df.building_type.Bridge, + df.building_type.ScrewPump, + df.building_type.WaterWheel, + df.building_type.AxleHorizontal, + df.building_type.Rollers, +} + +local function has_direction_panel() + return direction_panel_types[uibs.building_type] + or (uibs.building_type == df.building_type.Trap + and uibs.building_subtype == df.trap_type.TrackStop) +end + +local pressure_plate_panel_frame = {t=4, h=37, w=46, r=28} + +local function has_pressure_plate_panel() + return uibs.building_type == df.building_type.Trap + and uibs.building_subtype == df.trap_type.PressurePlate +end + +local function is_over_options_panel() + local frame = nil + if has_direction_panel() then + frame = direction_panel_frame + elseif has_pressure_plate_panel() then + frame = pressure_plate_panel_frame + else + return false + end + local v = widgets.Widget{frame=frame} + local rect = gui.mkdims_wh(0, 0, dfhack.screen.getWindowSize()) + v:updateLayout(gui.ViewRect{rect=rect}) + return v:getMousePos() +end + +-------------------------------- +-- ItemLine +-- + +ItemLine = defclass(ItemLine, widgets.Panel) +ItemLine.ATTRS{ + idx=DEFAULT_NIL, + is_selected_fn=DEFAULT_NIL, + is_hollow_fn=DEFAULT_NIL, + on_select=DEFAULT_NIL, + on_filter=DEFAULT_NIL, + on_clear_filter=DEFAULT_NIL, +} + +function ItemLine:init() + self.frame.h = 1 + self.visible = function() return #get_cur_filters() >= self.idx end + self:addviews{ + widgets.Label{ + frame={t=0, l=0}, + text='*', + auto_width=true, + visible=self.is_selected_fn, + }, + widgets.Label{ + frame={t=0, l=25}, + text={ + {tile=pens.BUTTON_START_PEN}, + {gap=6, tile=pens.BUTTON_END_PEN}, + }, + auto_width=true, + on_click=function() self.on_filter(self.idx) end, + }, + widgets.Label{ + frame={t=0, l=33}, + text={ + {tile=pens.BUTTON_START_PEN}, + {gap=1, tile=pens.BUTTON_END_PEN}, + }, + auto_width=true, + on_click=function() self.on_clear_filter(self.idx) end, + }, + widgets.Label{ + frame={t=0, l=2}, + text={ + {width=21, text=self:callback('get_item_line_text')}, + {gap=3, text='filter', pen=COLOR_GREEN}, + {gap=2, text='x', pen=self:callback('get_x_pen')}, + {gap=3, text=function() return self.note end, + pen=function() return self.note_pen end}, + }, + }, + } +end + +function ItemLine:reset() + self.desc = nil + self.available = nil +end + +function ItemLine:onInput(keys) + if keys._MOUSE_L_DOWN and self:getMousePos() then + self.on_select(self.idx) + end + return ItemLine.super.onInput(self, keys) +end + +function ItemLine:get_x_pen() + return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) and + COLOR_GREEN or COLOR_GREY +end + +function ItemLine:get_item_line_text() + local idx = self.idx + local filter = get_cur_filters()[idx] + local quantity = get_quantity(filter, self.is_hollow_fn()) + + local buildingplan = require('plugins.buildingplan') + self.desc = self.desc or buildingplan.get_desc(filter) + + self.available = self.available or buildingplan.countAvailableItems( + uibs.building_type, uibs.building_subtype, uibs.custom_type, idx - 1) + if self.available >= quantity then + self.note_pen = COLOR_GREEN + self.note = 'Available now' + else + self.note_pen = COLOR_YELLOW + self.note = 'Will link later' + end + + return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and '' or 's') +end + +function ItemLine:reduce_quantity(used_quantity) + if not self.available then return end + local filter = get_cur_filters()[self.idx] + used_quantity = used_quantity or get_quantity(filter, self.is_hollow_fn()) + self.available = math.max(0, self.available - used_quantity) +end + +local function get_placement_errors() + local out = '' + for _,str in ipairs(uibs.errors) do + if #out > 0 then out = out .. NEWLINE end + out = out .. str.value + end + return out +end + +-------------------------------- +-- PlannerOverlay +-- + +PlannerOverlay = defclass(PlannerOverlay, overlay.OverlayWidget) +PlannerOverlay.ATTRS{ + default_pos={x=5,y=9}, + default_enabled=true, + viewscreens='dwarfmode/Building/Placement', + frame={w=56, h=20}, +} + +function PlannerOverlay:init() + self.selected = 1 + + local main_panel = widgets.Panel{ + view_id='main', + frame={t=0, l=0, r=0, h=14}, + frame_style=gui.MEDIUM_FRAME, + frame_background=gui.CLEAR_PEN, + } + + local function make_is_selected_fn(idx) + return function() return self.selected == idx end + end + + local function on_select_fn(idx) + self.selected = idx + end + + local function is_hollow_fn() + return self.subviews.hollow:getOptionValue() + end + + local buildingplan = require('plugins.buildingplan') + + main_panel:addviews{ + widgets.Label{ + frame={}, + auto_width=true, + text='No items required.', + visible=function() return #get_cur_filters() == 0 end, + }, + ItemLine{view_id='item1', frame={t=0, l=0, r=0}, idx=1, + is_selected_fn=make_is_selected_fn(1), is_hollow_fn=is_hollow_fn, + on_select=on_select_fn, on_filter=self:callback('set_filter'), + on_clear_filter=self:callback('clear_filter')}, + ItemLine{view_id='item2', frame={t=2, l=0, r=0}, idx=2, + is_selected_fn=make_is_selected_fn(2), is_hollow_fn=is_hollow_fn, + on_select=on_select_fn, on_filter=self:callback('set_filter'), + on_clear_filter=self:callback('clear_filter')}, + ItemLine{view_id='item3', frame={t=4, l=0, r=0}, idx=3, + is_selected_fn=make_is_selected_fn(3), is_hollow_fn=is_hollow_fn, + on_select=on_select_fn, on_filter=self:callback('set_filter'), + on_clear_filter=self:callback('clear_filter')}, + ItemLine{view_id='item4', frame={t=6, l=0, r=0}, idx=4, + is_selected_fn=make_is_selected_fn(4), is_hollow_fn=is_hollow_fn, + on_select=on_select_fn, on_filter=self:callback('set_filter'), + on_clear_filter=self:callback('clear_filter')}, + widgets.CycleHotkeyLabel{ + view_id='hollow', + frame={t=3, l=4}, + key='CUSTOM_H', + label='Hollow area:', + visible=is_construction, + options={ + {label='No', value=false}, + {label='Yes', value=true}, + }, + }, + widgets.CycleHotkeyLabel{ + view_id='stairs_top_subtype', + frame={t=4, l=4}, + key='CUSTOM_R', + label='Top Stair Type: ', + visible=is_stairs, + options={ + {label='Auto', value='auto'}, + {label='UpDown', value=df.construction_type.UpDownStair}, + {label='Down', value=df.construction_type.DownStair}, + }, + }, + widgets.CycleHotkeyLabel { + view_id='stairs_bottom_subtype', + frame={t=5, l=4}, + key='CUSTOM_B', + label='Bottom Stair Type: ', + visible=is_stairs, + options={ + {label='Auto', value='auto'}, + {label='UpDown', value=df.construction_type.UpDownStair}, + {label='Up', value=df.construction_type.UpStair}, + }, + }, + widgets.Label{ + frame={b=3, l=17}, + text={ + 'Selected area: ', + {text=function() + return ('%dx%dx%d'):format(get_cur_area_dims(self.saved_placement)) + end + }, + }, + visible=function() + return not cur_building_has_no_area() and (self.saved_placement or is_choosing_area()) + end, + }, + widgets.Panel{ + visible=function() return #get_cur_filters() > 0 end, + subviews={ + widgets.HotkeyLabel{ + frame={b=1, l=0}, + key='STRING_A042', + auto_width=true, + enabled=function() return #get_cur_filters() > 1 end, + on_activate=function() self.selected = ((self.selected - 2) % #get_cur_filters()) + 1 end, + }, + widgets.HotkeyLabel{ + frame={b=1, l=1}, + key='STRING_A047', + label='Prev/next item', + auto_width=true, + enabled=function() return #get_cur_filters() > 1 end, + on_activate=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, + }, + widgets.HotkeyLabel{ + frame={b=1, l=21}, + key='CUSTOM_F', + label='Set filter', + auto_width=true, + on_activate=function() self:set_filter(self.selected) end, + }, + widgets.HotkeyLabel{ + frame={b=1, l=37}, + key='CUSTOM_X', + label='Clear filter', + auto_width=true, + on_activate=function() self:clear_filter(self.selected) end, + enabled=function() + return buildingplan.hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.selected - 1) + end + }, + widgets.CycleHotkeyLabel{ + view_id='choose', + frame={b=0, l=0, w=25}, + key='CUSTOM_I', + label='Choose from items:', + options={{label='Yes', value=true}, + {label='No', value=false}}, + initial_option=false, + enabled=function() + for idx = 1,4 do + if (self.subviews['item'..idx].available or 0) > 0 then + return true + end + end + end, + }, + widgets.CycleHotkeyLabel{ + view_id='safety', + frame={b=0, l=29, w=25}, + key='CUSTOM_G', + label='Building safety:', + options={ + {label='Any', value=0}, + {label='Magma', value=2, pen=COLOR_RED}, + {label='Fire', value=1, pen=COLOR_LIGHTRED}, + }, + initial_option=0, + on_change=function(heat) + buildingplan.setHeatSafetyFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, heat) + end, + }, + }, + }, + } + + local error_panel = widgets.ResizingPanel{ + view_id='errors', + frame={t=14, l=0, r=0}, + frame_style=gui.MEDIUM_FRAME, + frame_background=gui.CLEAR_PEN, + } + + error_panel:addviews{ + widgets.WrappedLabel{ + frame={t=0, l=0, r=0}, + text_pen=COLOR_LIGHTRED, + text_to_wrap=get_placement_errors, + visible=function() return #uibs.errors > 0 end, + }, + widgets.Label{ + frame={t=0, l=0, r=0}, + text_pen=COLOR_GREEN, + text='OK to build', + visible=function() return #uibs.errors == 0 end, + }, + } + + self:addviews{ + main_panel, + error_panel, + } +end + +function PlannerOverlay:reset() + self.subviews.item1:reset() + self.subviews.item2:reset() + self.subviews.item3:reset() + self.subviews.item4:reset() + reset_counts_flag = false +end + +function PlannerOverlay:set_filter(idx) + filterselection.FilterSelectionScreen{index=idx, desc=require('plugins.buildingplan').get_desc(get_cur_filters()[idx])}:show() +end + +function PlannerOverlay:clear_filter(idx) + clearFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, idx-1) +end + +local function get_placement_data() + local pos = uibs.pos + local direction = uibs.direction + local width, height, depth = get_cur_area_dims() + local _, adjusted_width, adjusted_height = dfhack.buildings.getCorrectSize( + width, height, uibs.building_type, uibs.building_subtype, + uibs.custom_type, direction) + -- get the upper-left corner of the building/area at min z-level + local has_selection = is_choosing_area() + local start_pos = xyz2pos( + has_selection and math.min(uibs.selection_pos.x, pos.x) or pos.x - adjusted_width//2, + has_selection and math.min(uibs.selection_pos.y, pos.y) or pos.y - adjusted_height//2, + has_selection and math.min(uibs.selection_pos.z, pos.z) or pos.z + ) + if uibs.building_type == df.building_type.ScrewPump then + if direction == df.screw_pump_direction.FromSouth then + start_pos.y = start_pos.y + 1 + elseif direction == df.screw_pump_direction.FromEast then + start_pos.x = start_pos.x + 1 + end + end + local min_x, max_x = start_pos.x, start_pos.x + local min_y, max_y = start_pos.y, start_pos.y + local min_z, max_z = start_pos.z, start_pos.z + if adjusted_width == 1 and adjusted_height == 1 + and (width > 1 or height > 1 or depth > 1) then + max_x = min_x + width - 1 + max_y = min_y + height - 1 + max_z = math.max(uibs.selection_pos.z, pos.z) + end + return { + p1=xyz2pos(min_x, min_y, min_z), + p2=xyz2pos(max_x, max_y, max_z), + width=adjusted_width, + height=adjusted_height + } +end + +function PlannerOverlay:save_placement() + self.saved_placement = get_placement_data() + if (uibs.selection_pos:isValid()) then + self.saved_selection_pos_valid = true + self.saved_selection_pos = copyall(uibs.selection_pos) + self.saved_pos = copyall(uibs.pos) + uibs.selection_pos:clear() + else + self.saved_selection_pos = copyall(self.saved_placement.p1) + self.saved_pos = copyall(self.saved_placement.p2) + self.saved_pos.x = self.saved_pos.x + self.saved_placement.width - 1 + self.saved_pos.y = self.saved_pos.y + self.saved_placement.height - 1 + end +end + +function PlannerOverlay:restore_placement() + if self.saved_selection_pos_valid then + uibs.selection_pos = self.saved_selection_pos + self.saved_selection_pos_valid = nil + else + uibs.selection_pos:clear() + end + self.saved_selection_pos = nil + self.saved_pos = nil + local placement_data = self.saved_placement + self.saved_placement = nil + return placement_data +end + +function PlannerOverlay:onInput(keys) + if not is_plannable() then return false end + if keys.LEAVESCREEN or keys._MOUSE_R_DOWN then + if uibs.selection_pos:isValid() then + uibs.selection_pos:clear() + return true + end + self.selected = 1 + self.subviews.hollow:setOption(false) + self.subviews.choose:setOption(false) + self:reset() + reset_counts_flag = true + return false + end + if PlannerOverlay.super.onInput(self, keys) then + return true + end + if keys._MOUSE_L_DOWN then + if is_over_options_panel() then return false end + local detect_rect = copyall(self.frame_rect) + detect_rect.height = self.subviews.main.frame_rect.height + + self.subviews.errors.frame_rect.height + detect_rect.y2 = detect_rect.y1 + detect_rect.height - 1 + if self.subviews.main:getMousePos(gui.ViewRect{rect=detect_rect}) + or self.subviews.errors:getMousePos() then + return true + end + if not is_construction() and #uibs.errors > 0 then return true end + if dfhack.gui.getMousePos() then + if is_choosing_area() or cur_building_has_no_area() then + local filters = get_cur_filters() + local num_filters = #filters + local choose = self.subviews.choose + if choose.enabled() and choose:getOptionValue() then + self:save_placement() + local is_hollow = self.subviews.hollow:getOptionValue() + local chosen_items, active_screens = {}, {} + local pending = num_filters + df.global.game.main_interface.bottom_mode_selected = -1 + for idx = num_filters,1,-1 do + chosen_items[idx] = {} + if (self.subviews['item'..idx].available or 0) > 0 then + local filter = filters[idx] + active_screens[idx] = itemselection.ItemSelectionScreen{ + index=idx, + desc=require('plugins.buildingplan').get_desc(filter), + quantity=get_quantity(filter, is_hollow, + self.saved_placement), + on_submit=function(items) + chosen_items[idx] = items + active_screens[idx]:dismiss() + active_screens[idx] = nil + pending = pending - 1 + if pending == 0 then + df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT + self:place_building(self:restore_placement(), chosen_items) + end + end, + on_cancel=function() + for i,scr in pairs(active_screens) do + scr:dismiss() + end + df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT + self:restore_placement() + end, + }:show() + else + pending = pending - 1 + end + end + else + self:place_building(get_placement_data()) + end + return true + elseif not is_choosing_area() then + return false + end + end + end + return keys._MOUSE_L or keys.SELECT +end + +function PlannerOverlay:render(dc) + if not is_plannable() then return end + self.subviews.errors:updateLayout() + PlannerOverlay.super.render(self, dc) +end + +local ONE_BY_ONE = xy2pos(1, 1) + +function PlannerOverlay:onRenderFrame(dc, rect) + PlannerOverlay.super.onRenderFrame(self, dc, rect) + + if reset_counts_flag then + self:reset() + self.subviews.safety:setOption(require('plugins.buildingplan').getHeatSafetyFilter( + uibs.building_type, uibs.building_subtype, uibs.custom_type)) + end + + local selection_pos = self.saved_selection_pos or uibs.selection_pos + if not selection_pos or selection_pos.x < 0 then return end + + local pos = self.saved_pos or uibs.pos + local bounds = { + x1 = math.max(0, math.min(selection_pos.x, pos.x)), + x2 = math.min(df.global.world.map.x_count-1, math.max(selection_pos.x, pos.x)), + y1 = math.max(0, math.min(selection_pos.y, pos.y)), + y2 = math.min(df.global.world.map.y_count-1, math.max(selection_pos.y, pos.y)), + } + + local hollow = self.subviews.hollow:getOptionValue() + local default_pen = (self.saved_selection_pos or #uibs.errors == 0) and GOOD_PEN or BAD_PEN + + local get_pen_fn = is_construction() and function(pos) + return dfhack.buildings.checkFreeTiles(pos, ONE_BY_ONE) and GOOD_PEN or BAD_PEN + end or function() + return default_pen + end + + local function get_overlay_pen(pos) + if not hollow then return get_pen_fn(pos) end + if pos.x == bounds.x1 or pos.x == bounds.x2 or + pos.y == bounds.y1 or pos.y == bounds.y2 then + return get_pen_fn(pos) + end + return gui.TRANSPARENT_PEN + end + + guidm.renderMapOverlay(get_overlay_pen, bounds) +end + +function PlannerOverlay:get_stairs_subtype(pos, corner1, corner2) + local subtype = uibs.building_subtype + if pos.z == corner1.z then + local opt = self.subviews.stairs_bottom_subtype:getOptionValue() + if opt == 'auto' then + local tt = dfhack.maps.getTileType(pos) + local shape = df.tiletype.attrs[tt].shape + if shape ~= df.tiletype_shape.STAIR_DOWN then + subtype = df.construction_type.UpStair + end + else + subtype = opt + end + elseif pos.z == corner2.z then + local opt = self.subviews.stairs_top_subtype:getOptionValue() + if opt == 'auto' then + local tt = dfhack.maps.getTileType(pos) + local shape = df.tiletype.attrs[tt].shape + if shape ~= df.tiletype_shape.STAIR_UP then + subtype = df.construction_type.DownStair + end + else + subtype = opt + end + end + return subtype +end + +function PlannerOverlay:place_building(placement_data, chosen_items) + local p1, p2 = placement_data.p1, placement_data.p2 + local blds = {} + local hollow = self.subviews.hollow:getOptionValue() + local subtype = uibs.building_subtype + for z=p1.z,p2.z do for y=p1.y,p2.y do for x=p1.x,p2.x do + if hollow and x ~= p1.x and x ~= p2.x and y ~= p1.y and y ~= p2.y then + goto continue + end + local pos = xyz2pos(x, y, z) + if is_stairs() then + subtype = self:get_stairs_subtype(pos, p1, p2) + end + local bld, err = dfhack.buildings.constructBuilding{pos=pos, + type=uibs.building_type, subtype=subtype, custom=uibs.custom_type, + width=placement_data.width, height=placement_data.height, + direction=uibs.direction} + if err then + -- it's ok if some buildings fail to build + goto continue + end + -- assign fields for the types that need them. we can't pass them all in + -- to the call to constructBuilding since attempting to assign unrelated + -- fields to building types that don't support them causes errors. + for k,v in pairs(bld) do + if k == 'friction' then bld.friction = uibs.friction end + if k == 'use_dump' then bld.use_dump = uibs.use_dump end + if k == 'dump_x_shift' then bld.dump_x_shift = uibs.dump_x_shift end + if k == 'dump_y_shift' then bld.dump_y_shift = uibs.dump_y_shift end + if k == 'speed' then bld.speed = uibs.speed end + end + table.insert(blds, bld) + ::continue:: + end end end + local used_quantity = is_construction() and #blds or false + self.subviews.item1:reduce_quantity(used_quantity) + self.subviews.item2:reduce_quantity(used_quantity) + self.subviews.item3:reduce_quantity(used_quantity) + self.subviews.item4:reduce_quantity(used_quantity) + local buildingplan = require('plugins.buildingplan') + for _,bld in ipairs(blds) do + -- attach chosen items and reduce job_item quantity + if chosen_items then + local job = bld.jobs[0] + local jitems = job.job_items + for idx=1,#get_cur_filters() do + local item_ids = chosen_items[idx] + while jitems[idx-1].quantity > 0 and #item_ids > 0 do + local item_id = item_ids[#item_ids] + local item = df.item.find(item_id) + if not item then + dfhack.printerr(('item no longer available: %d'):format(item_id)) + break + end + if not dfhack.job.attachJobItem(job, item, df.job_item_ref.T_role.Hauled, idx-1, -1) then + dfhack.printerr(('cannot attach item: %d'):format(item_id)) + break + end + jitems[idx-1].quantity = jitems[idx-1].quantity - 1 + item_ids[#item_ids] = nil + end + end + end + buildingplan.addPlannedBuilding(bld) + end + buildingplan.scheduleCycle() + uibs.selection_pos:clear() +end + +return _ENV From 2818f2334972867c8a8ca9efa9a3291f116b4378 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 10 Mar 2023 07:15:52 +0000 Subject: [PATCH 022/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 09ddae3c2..267eb20f7 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 09ddae3c2851f207c7257b4767182f4c6c938f18 +Subproject commit 267eb20f75e891fc0ade166e2d316498f454d913 diff --git a/scripts b/scripts index c8ceb198b..89a345d66 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit c8ceb198b4fc62155b31a5554b9c96cc6bcb8d55 +Subproject commit 89a345d66d70eb02293bd2e46dcfad65f0229ee6 From 44fb91056bc59f89b7eb5a3cb0f5dc5a4f6b1f42 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 9 Mar 2023 23:41:13 -0800 Subject: [PATCH 023/439] ensure pressure plate config gets copied to the planned building --- plugins/lua/buildingplan/planneroverlay.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 864516436..d90285141 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -692,6 +692,7 @@ function PlannerOverlay:place_building(placement_data, chosen_items) if k == 'dump_x_shift' then bld.dump_x_shift = uibs.dump_x_shift end if k == 'dump_y_shift' then bld.dump_y_shift = uibs.dump_y_shift end if k == 'speed' then bld.speed = uibs.speed end + if k == 'plate_info' then utils.assign(bld.plate_info, uibs.plate_info) end end table.insert(blds, bld) ::continue:: From 2f0dc4bd256fc5d03ae40e3020917ea5f2d15c8b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 00:09:12 -0800 Subject: [PATCH 024/439] require correct number of mechanisms when building pressure plates --- plugins/lua/buildingplan/planneroverlay.lua | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index d90285141..41da7a429 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -32,7 +32,17 @@ local function get_cur_area_dims(placement_data) math.abs(selection_pos.z - pos.z) + 1 end +local function is_pressure_plate() + return uibs.building_type == df.building_type.Trap + and uibs.building_subtype == df.trap_type.PressurePlate +end + local function get_quantity(filter, hollow, placement_data) + if is_pressure_plate() then + local flags = uibs.plate_info.flags + return (flags.units and 1 or 0) + (flags.water and 1 or 0) + + (flags.magma and 1 or 0) + (flags.track and 1 or 0) + end local quantity = filter.quantity or 1 local dimx, dimy, dimz = get_cur_area_dims(placement_data) if quantity < 1 then @@ -87,8 +97,7 @@ end local pressure_plate_panel_frame = {t=4, h=37, w=46, r=28} local function has_pressure_plate_panel() - return uibs.building_type == df.building_type.Trap - and uibs.building_subtype == df.trap_type.PressurePlate + return is_pressure_plate() end local function is_over_options_panel() @@ -667,6 +676,10 @@ function PlannerOverlay:place_building(placement_data, chosen_items) local blds = {} local hollow = self.subviews.hollow:getOptionValue() local subtype = uibs.building_subtype + local filters = get_cur_filters() + if is_pressure_plate() then + filters[1].quantity = get_quantity() + end for z=p1.z,p2.z do for y=p1.y,p2.y do for x=p1.x,p2.x do if hollow and x ~= p1.x and x ~= p2.x and y ~= p1.y and y ~= p2.y then goto continue @@ -678,7 +691,7 @@ function PlannerOverlay:place_building(placement_data, chosen_items) local bld, err = dfhack.buildings.constructBuilding{pos=pos, type=uibs.building_type, subtype=subtype, custom=uibs.custom_type, width=placement_data.width, height=placement_data.height, - direction=uibs.direction} + direction=uibs.direction, filters=filters} if err then -- it's ok if some buildings fail to build goto continue From a3f8be3c012bd98a30d6878e6f273a8feeb07f2e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 00:12:56 -0800 Subject: [PATCH 025/439] fix pens reference --- plugins/lua/buildingplan/planneroverlay.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 864516436..de25af1f9 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -614,10 +614,10 @@ function PlannerOverlay:onRenderFrame(dc, rect) } local hollow = self.subviews.hollow:getOptionValue() - local default_pen = (self.saved_selection_pos or #uibs.errors == 0) and GOOD_PEN or BAD_PEN + local default_pen = (self.saved_selection_pos or #uibs.errors == 0) and pens.GOOD_TILE_PEN or pens.BAD_TILE_PEN local get_pen_fn = is_construction() and function(pos) - return dfhack.buildings.checkFreeTiles(pos, ONE_BY_ONE) and GOOD_PEN or BAD_PEN + return dfhack.buildings.checkFreeTiles(pos, ONE_BY_ONE) and pens.GOOD_TILE_PEN or pens.BAD_TILE_PEN end or function() return default_pen end From b884fab7b6f533c21fab125cb7f044ddeadad995 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 01:04:23 -0800 Subject: [PATCH 026/439] fix freeze when printing status and there are defunct planned buildings --- plugins/buildingplan/buildingplan.cpp | 12 ++++++++---- plugins/buildingplan/plannedbuilding.cpp | 5 +++-- plugins/buildingplan/plannedbuilding.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 310d03a5e..2b67c2353 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -516,16 +516,20 @@ static void printStatus(color_ostream &out) { out.print(" use bars: %s\n", get_config_bool(config, CONFIG_BARS) ? "yes" : "no"); out.print("\n"); + size_t bld_count = 0; map counts; int32_t total = 0; for (auto &entry : planned_buildings) { auto &pb = entry.second; - auto bld = pb.getBuildingIfValidOrRemoveIfNot(out); + // don't actually remove bad buildings from the list while we're + // actively iterating through that list + auto bld = pb.getBuildingIfValidOrRemoveIfNot(out, true); if (!bld || bld->jobs.size() != 1) continue; auto &job_items = bld->jobs[0]->job_items; if (job_items.size() != pb.vector_ids.size()) continue; + ++bld_count; int job_item_idx = 0; for (auto &vec_ids : pb.vector_ids) { auto &jitem = job_items[job_item_idx++]; @@ -537,9 +541,9 @@ static void printStatus(color_ostream &out) { } } - if (planned_buildings.size()) { + if (bld_count) { out.print("Waiting for %d item(s) to be produced for %zd building(s):\n", - total, planned_buildings.size()); + total, bld_count); for (auto &count : counts) out.print(" %3d %s%s\n", count.second, count.first.c_str(), count.second == 1 ? "" : "s"); } else { @@ -949,7 +953,7 @@ static string getDescString(color_ostream &out, df::building *bld, int index) { PlannedBuilding &pb = planned_buildings.at(bld->id); auto &jitem = bld->jobs[0]->job_items[index]; - return get_desc_string(out, jitem, pb.vector_ids[index]); + return int_to_string(jitem->quantity) + " " + get_desc_string(out, jitem, pb.vector_ids[index]); } static int getQueuePosition(color_ostream &out, df::building *bld, int index) { diff --git a/plugins/buildingplan/plannedbuilding.cpp b/plugins/buildingplan/plannedbuilding.cpp index a693f6fcf..e678c850f 100644 --- a/plugins/buildingplan/plannedbuilding.cpp +++ b/plugins/buildingplan/plannedbuilding.cpp @@ -99,11 +99,12 @@ PlannedBuilding::PlannedBuilding(color_ostream &out, PersistentDataItem &bld_con // Ensure the building still exists and is in a valid state. It can disappear // for lots of reasons, such as running the game with the buildingplan plugin // disabled, manually removing the building, modifying it via the API, etc. -df::building * PlannedBuilding::getBuildingIfValidOrRemoveIfNot(color_ostream &out) { +df::building * PlannedBuilding::getBuildingIfValidOrRemoveIfNot(color_ostream &out, bool skip_remove) { auto bld = df::building::find(id); bool valid = bld && bld->getBuildStage() == 0; if (!valid) { - remove(out); + if (!skip_remove) + remove(out); return NULL; } return bld; diff --git a/plugins/buildingplan/plannedbuilding.h b/plugins/buildingplan/plannedbuilding.h index 5bd09ba5a..59dc24a79 100644 --- a/plugins/buildingplan/plannedbuilding.h +++ b/plugins/buildingplan/plannedbuilding.h @@ -29,7 +29,7 @@ public: // Ensure the building still exists and is in a valid state. It can disappear // for lots of reasons, such as running the game with the buildingplan plugin // disabled, manually removing the building, modifying it via the API, etc. - df::building * getBuildingIfValidOrRemoveIfNot(DFHack::color_ostream &out); + df::building * getBuildingIfValidOrRemoveIfNot(DFHack::color_ostream &out, bool skip_remove = false); private: DFHack::PersistentDataItem bld_config; From 43b423cd313a5ebc1a28a6e562b3629a92e84f2a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 01:44:33 -0800 Subject: [PATCH 027/439] make number of weapons in trap configurable --- plugins/lua/buildingplan/planneroverlay.lua | 36 +++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index fe3cebd83..924080ec3 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -37,11 +37,21 @@ local function is_pressure_plate() and uibs.building_subtype == df.trap_type.PressurePlate end +local function is_weapon_trap() + return uibs.building_type == df.building_type.Trap + and uibs.building_subtype == df.trap_type.WeaponTrap +end + +-- adjusted from CycleHotkeyLabel on the planner panel +local weapon_quantity = 1 + local function get_quantity(filter, hollow, placement_data) if is_pressure_plate() then local flags = uibs.plate_info.flags return (flags.units and 1 or 0) + (flags.water and 1 or 0) + (flags.magma and 1 or 0) + (flags.track and 1 or 0) + elseif is_weapon_trap() and filter.vector_id == df.job_item_vector_id.ANY_WEAPON then + return weapon_quantity end local quantity = filter.quantity or 1 local dimx, dimy, dimz = get_cur_area_dims(placement_data) @@ -298,7 +308,7 @@ function PlannerOverlay:init() view_id='stairs_top_subtype', frame={t=4, l=4}, key='CUSTOM_R', - label='Top Stair Type: ', + label='Top Stair Type: ', visible=is_stairs, options={ {label='Auto', value='auto'}, @@ -310,7 +320,7 @@ function PlannerOverlay:init() view_id='stairs_bottom_subtype', frame={t=5, l=4}, key='CUSTOM_B', - label='Bottom Stair Type: ', + label='Bottom Stair Type:', visible=is_stairs, options={ {label='Auto', value='auto'}, @@ -318,6 +328,16 @@ function PlannerOverlay:init() {label='Up', value=df.construction_type.UpStair}, }, }, + widgets.CycleHotkeyLabel { + view_id='weapons', + frame={t=5, l=4}, + key='CUSTOM_T', + key_back='CUSTOM_SHIFT_T', + label='Num weapons:', + visible=is_weapon_trap, + options={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + on_change=function(val) weapon_quantity = val end, + }, widgets.Label{ frame={b=3, l=17}, text={ @@ -678,7 +698,9 @@ function PlannerOverlay:place_building(placement_data, chosen_items) local subtype = uibs.building_subtype local filters = get_cur_filters() if is_pressure_plate() then - filters[1].quantity = get_quantity() + filters[1].quantity = get_quantity(filters[1]) + elseif is_weapon_trap() then + filters[2].quantity = get_quantity(filters[2]) end for z=p1.z,p2.z do for y=p1.y,p2.y do for x=p1.x,p2.x do if hollow and x ~= p1.x and x ~= p2.x and y ~= p1.y and y ~= p2.y then @@ -721,9 +743,11 @@ function PlannerOverlay:place_building(placement_data, chosen_items) if chosen_items then local job = bld.jobs[0] local jitems = job.job_items - for idx=1,#get_cur_filters() do + local num_filters = #get_cur_filters() + for idx=1,num_filters do local item_ids = chosen_items[idx] - while jitems[idx-1].quantity > 0 and #item_ids > 0 do + local jitem = jitems[num_filters-idx] + while jitem.quantity > 0 and #item_ids > 0 do local item_id = item_ids[#item_ids] local item = df.item.find(item_id) if not item then @@ -734,7 +758,7 @@ function PlannerOverlay:place_building(placement_data, chosen_items) dfhack.printerr(('cannot attach item: %d'):format(item_id)) break end - jitems[idx-1].quantity = jitems[idx-1].quantity - 1 + jitem.quantity = jitem.quantity - 1 item_ids[#item_ids] = nil end end From 6ad2922aca5897991ac164ff37ce5669d963b8ab Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 02:34:05 -0800 Subject: [PATCH 028/439] filter displayed materials if building heat safety is set --- plugins/buildingplan/buildingplan.cpp | 18 ++++++++++++++++-- plugins/buildingplan/buildingplan.h | 1 + plugins/buildingplan/buildingplan_cycle.cpp | 17 +++++++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 2b67c2353..abc3c6ebd 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -847,11 +847,25 @@ static int getMaterialFilter(lua_State *L) { const auto &mat_filter = filters[index].getMaterials(); map counts; scanAvailableItems(*out, type, subtype, custom, index, NULL, &counts); - // name -> {count=int, enabled=bool, category=string} + HeatSafety heat = get_heat_safety_filter(key); + df::job_item jitem_cur_heat = getJobItemWithHeatSafety( + get_job_items(*out, key)[index], heat); + df::job_item jitem_fire = getJobItemWithHeatSafety( + get_job_items(*out, key)[index], HEAT_SAFETY_FIRE); + df::job_item jitem_magma = getJobItemWithHeatSafety( + get_job_items(*out, key)[index], HEAT_SAFETY_MAGMA); + // name -> {count=int, enabled=bool, category=string, heat=string} map> ret; for (auto & entry : mat_cache) { - auto &name = entry.first; auto &mat = entry.second.first; + if (!mat.matches(jitem_cur_heat)) + continue; + string heat_safety = ""; + if (mat.matches(jitem_magma)) + heat_safety = "magma-safe"; + else if (mat.matches(jitem_fire)) + heat_safety = "fire-safe"; + auto &name = entry.first; auto &cat = entry.second.second; map props; string count = "0"; diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index eef9808e6..0d0d5b45f 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -47,6 +47,7 @@ void set_config_bool(DFHack::PersistentDataItem &c, int index, bool value); std::vector getVectorIds(DFHack::color_ostream &out, const df::job_item *job_item); bool itemPassesScreen(df::item * item); +df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat); bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter); bool isJobReady(DFHack::color_ostream &out, const std::vector &jitems); void finalizeBuilding(DFHack::color_ostream &out, df::building *bld); diff --git a/plugins/buildingplan/buildingplan_cycle.cpp b/plugins/buildingplan/buildingplan_cycle.cpp index f401c90a8..c08324e8a 100644 --- a/plugins/buildingplan/buildingplan_cycle.cpp +++ b/plugins/buildingplan/buildingplan_cycle.cpp @@ -48,6 +48,16 @@ bool itemPassesScreen(df::item * item) { && !item->isAssignedToStockpile(); } +df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat) { + df::job_item jitem = *job_item; + if (heat >= HEAT_SAFETY_MAGMA) { + jitem.flags2.bits.magma_safe = true; + jitem.flags2.bits.fire_safe = false; + } else if (heat == HEAT_SAFETY_FIRE && !jitem.flags2.bits.magma_safe) + jitem.flags2.bits.fire_safe = true; + return jitem; +} + bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter) { // check the properties that are not checked by Job::isSuitableItem() if (job_item->item_type > -1 && job_item->item_type != item->getType()) @@ -67,12 +77,7 @@ bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety h && !item->hasToolUse(job_item->has_tool_use)) return false; - df::job_item jitem = *job_item; - if (heat == HEAT_SAFETY_MAGMA) { - jitem.flags2.bits.magma_safe = true; - jitem.flags2.bits.fire_safe = false; - } else if (heat == HEAT_SAFETY_FIRE && !jitem.flags2.bits.magma_safe) - jitem.flags2.bits.fire_safe = true; + df::job_item jitem = getJobItemWithHeatSafety(job_item, heat); return Job::isSuitableItem( &jitem, item->getType(), item->getSubtype()) From c56e24803453e267b2e6cda0f984f099de370a16 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 14:08:31 -0800 Subject: [PATCH 029/439] cleanup stockpiles plugin and don't bork on empty type vectors --- plugins/stockpiles/OrganicMatLookup.cpp | 164 +- plugins/stockpiles/OrganicMatLookup.h | 34 +- plugins/stockpiles/StockpileSerializer.cpp | 2322 ++++++++------------ plugins/stockpiles/StockpileSerializer.h | 528 ++--- plugins/stockpiles/StockpileUtils.h | 46 +- plugins/stockpiles/stockpiles.cpp | 121 +- 6 files changed, 1328 insertions(+), 1887 deletions(-) diff --git a/plugins/stockpiles/OrganicMatLookup.cpp b/plugins/stockpiles/OrganicMatLookup.cpp index 5167ece4a..2367eddb5 100644 --- a/plugins/stockpiles/OrganicMatLookup.cpp +++ b/plugins/stockpiles/OrganicMatLookup.cpp @@ -1,154 +1,126 @@ #include "OrganicMatLookup.h" - #include "StockpileUtils.h" -#include "modules/Materials.h" -#include "MiscUtils.h" - -#include "df/world.h" -#include "df/world_data.h" +#include "Debug.h" #include "df/creature_raw.h" #include "df/caste_raw.h" -#include "df/material.h" +#include "df/world.h" using namespace DFHack; using namespace df::enums; using df::global::world; -using std::endl; +namespace DFHack { + DBG_EXTERN(stockpiles, log); +} /** * Helper class for mapping the various organic mats between their material indices * and their index in the stockpile_settings structures. */ -void OrganicMatLookup::food_mat_by_idx ( std::ostream &out, organic_mat_category::organic_mat_category mat_category, std::vector::size_type food_idx, FoodMat & food_mat ) -{ - out << "food_lookup: food_idx(" << food_idx << ") "; - df::world_raws &raws = world->raws; +void OrganicMatLookup::food_mat_by_idx(organic_mat_category::organic_mat_category mat_category, std::vector::size_type food_idx, FoodMat& food_mat) { + DEBUG(log).print("food_lookup: food_idx(%zd) ", food_idx); + df::world_raws& raws = world->raws; df::special_mat_table table = raws.mat_table; int32_t main_idx = table.organic_indexes[mat_category][food_idx]; int16_t type = table.organic_types[mat_category][food_idx]; - if ( mat_category == organic_mat_category::Fish || - mat_category == organic_mat_category::UnpreparedFish || - mat_category == organic_mat_category::Eggs ) - { + if (mat_category == organic_mat_category::Fish || + mat_category == organic_mat_category::UnpreparedFish || + mat_category == organic_mat_category::Eggs) { food_mat.creature = raws.creatures.all[type]; food_mat.caste = food_mat.creature->caste[main_idx]; - out << " special creature type(" << type << ") caste("<< main_idx <<")" <::size_type idx ) -{ +std::string OrganicMatLookup::food_token_by_idx(organic_mat_category::organic_mat_category mat_category, std::vector::size_type idx) { FoodMat food_mat; - food_mat_by_idx ( out, mat_category, idx, food_mat ); - if ( food_mat.material.isValid() ) - { + food_mat_by_idx(mat_category, idx, food_mat); + if (food_mat.material.isValid()) { return food_mat.material.getToken(); } - else if ( food_mat.creature ) - { + else if (food_mat.creature) { return food_mat.creature->creature_id + ":" + food_mat.caste->caste_id; } return std::string(); } -size_t OrganicMatLookup::food_max_size ( organic_mat_category::organic_mat_category mat_category ) -{ +size_t OrganicMatLookup::food_max_size(organic_mat_category::organic_mat_category mat_category) { return world->raws.mat_table.organic_types[mat_category].size(); } -void OrganicMatLookup::food_build_map ( std::ostream &out ) -{ - if ( index_built ) +void OrganicMatLookup::food_build_map() { + if (index_built) return; - df::world_raws &raws = world->raws; + df::world_raws& raws = world->raws; df::special_mat_table table = raws.mat_table; using df::enums::organic_mat_category::organic_mat_category; using traits = df::enum_traits; - for ( int32_t mat_category = traits::first_item_value; mat_category <= traits::last_item_value; ++mat_category ) - { - for ( size_t i = 0; i < table.organic_indexes[mat_category].size(); ++i ) - { - int16_t type = table.organic_types[mat_category].at ( i ); - int32_t index = table.organic_indexes[mat_category].at ( i ); - food_index[mat_category].insert ( std::make_pair ( std::make_pair ( type,index ), i ) ); // wtf.. only in c++ + for (int32_t mat_category = traits::first_item_value; mat_category <= traits::last_item_value; ++mat_category) { + for (size_t i = 0; i < table.organic_indexes[mat_category].size(); ++i) { + int16_t type = table.organic_types[mat_category].at(i); + int32_t index = table.organic_indexes[mat_category].at(i); + food_index[mat_category].insert(std::make_pair(std::make_pair(type, index), i)); // wtf.. only in c++ } } index_built = true; } -int16_t OrganicMatLookup::food_idx_by_token ( std::ostream &out, organic_mat_category::organic_mat_category mat_category, const std::string & token ) -{ - int16_t food_idx = -1; - df::world_raws &raws = world->raws; +int16_t OrganicMatLookup::food_idx_by_token(organic_mat_category::organic_mat_category mat_category, const std::string& token) { + df::world_raws& raws = world->raws; df::special_mat_table table = raws.mat_table; - out << "food_idx_by_token: "; - if ( mat_category == organic_mat_category::Fish || - mat_category == organic_mat_category::UnpreparedFish || - mat_category == organic_mat_category::Eggs ) - { + DEBUG(log).print("food_idx_by_token: "); + if (mat_category == organic_mat_category::Fish || + mat_category == organic_mat_category::UnpreparedFish || + mat_category == organic_mat_category::Eggs) { std::vector tokens; - split_string ( &tokens, token, ":" ); - if ( tokens.size() != 2 ) - { - out << "creature " << "invalid CREATURE:CASTE token: " << token << endl; + split_string(&tokens, token, ":"); + if (tokens.size() != 2) { + WARN(log).print("creature invalid CREATURE:CASTE token: %s\n", token.c_str()); + return -1; } - else - { - int16_t creature_idx = find_creature ( tokens[0] ); - if ( creature_idx < 0 ) - { - out << " creature invalid token " << tokens[0]; - } - else - { - food_idx = linear_index ( table.organic_types[mat_category], creature_idx ); - if ( tokens[1] == "MALE" ) - food_idx += 1; - if ( table.organic_types[mat_category][food_idx] == creature_idx ) - out << "creature " << token << " caste " << tokens[1] << " creature_idx(" << creature_idx << ") food_idx("<< food_idx << ")" << endl; - else - { - out << "ERROR creature caste not found: " << token << " caste " << tokens[1] << " creature_idx(" << creature_idx << ") food_idx("<< food_idx << ")" << endl; - food_idx = -1; - } - } + int16_t creature_idx = find_creature(tokens[0]); + if (creature_idx < 0) { + WARN(log).print("creature invalid token %s\n", tokens[0].c_str()); + return -1; } - } - else - { - if ( !index_built ) - food_build_map ( out ); - MaterialInfo mat_info = food_mat_by_token ( out, token ); - int16_t type = mat_info.type; - int32_t index = mat_info.index; - auto it = food_index[mat_category].find ( std::make_pair ( type, index ) ); - if ( it != food_index[mat_category].end() ) - { - out << "matinfo: " << token << " type(" << mat_info.type << ") idx(" << mat_info.index << ") food_idx(" << it->second << ")" << endl; - food_idx = it->second; - } - else - { - out << "matinfo: " << token << " type(" << mat_info.type << ") idx(" << mat_info.index << ") food_idx not found :(" << endl; + int16_t food_idx = linear_index(table.organic_types[mat_category], creature_idx); + if (tokens[1] == "MALE") + food_idx += 1; + if (table.organic_types[mat_category][food_idx] == creature_idx) { + DEBUG(log).print("creature %s caste %s creature_idx(%d) food_idx(%d)\n", token.c_str(), tokens[1].c_str(), creature_idx, food_idx); + return food_idx; } + WARN(log).print("creature caste not found: %s caste %s creature_idx(%d) food_idx(%d)\n", token.c_str(), tokens[1].c_str(), creature_idx, food_idx); + return -1; } - return food_idx; + + if (!index_built) + food_build_map(); + MaterialInfo mat_info = food_mat_by_token(token); + int16_t type = mat_info.type; + int32_t index = mat_info.index; + auto it = food_index[mat_category].find(std::make_pair(type, index)); + if (it != food_index[mat_category].end()) { + DEBUG(log).print("matinfo: %s type(%d) idx(%d) food_idx(%zd)\n", token.c_str(), mat_info.type, mat_info.index, it->second); + return it->second; + + } + + WARN(log).print("matinfo: %s type(%d) idx(%d) food_idx not found :(\n", token.c_str(), mat_info.type, mat_info.index); + return -1; } -MaterialInfo OrganicMatLookup::food_mat_by_token ( std::ostream &out, const std::string & token ) -{ +MaterialInfo OrganicMatLookup::food_mat_by_token(const std::string& token) { MaterialInfo mat_info; - mat_info.find ( token ); + mat_info.find(token); return mat_info; } bool OrganicMatLookup::index_built = false; -std::vector OrganicMatLookup::food_index = std::vector ( df::enum_traits< df::organic_mat_category >::last_item_value + 1 ); +std::vector OrganicMatLookup::food_index = std::vector(df::enum_traits< df::organic_mat_category >::last_item_value + 1); diff --git a/plugins/stockpiles/OrganicMatLookup.h b/plugins/stockpiles/OrganicMatLookup.h index ef49f3f3c..7ae65b17e 100644 --- a/plugins/stockpiles/OrganicMatLookup.h +++ b/plugins/stockpiles/OrganicMatLookup.h @@ -5,42 +5,42 @@ #include "df/organic_mat_category.h" namespace df { -struct creature_raw; -struct caste_raw; + struct creature_raw; + struct caste_raw; } /** * Helper class for mapping the various organic mats between their material indices * and their index in the stockpile_settings structures. */ -class OrganicMatLookup -{ +class OrganicMatLookup { -// pair of material type and index + // pair of material type and index typedef std::pair FoodMatPair; -// map for using type,index pairs to find the food index + // map for using type,index pairs to find the food index typedef std::map FoodMatMap; public: - struct FoodMat - { + struct FoodMat { DFHack::MaterialInfo material; - df::creature_raw *creature; - df::caste_raw * caste; - FoodMat() : material ( -1 ), creature ( 0 ), caste ( 0 ) {} + df::creature_raw* creature; + df::caste_raw* caste; + FoodMat(): material(-1), creature(0), caste(0) { } }; - static void food_mat_by_idx ( std::ostream &out, df::enums::organic_mat_category::organic_mat_category mat_category, std::vector::size_type food_idx, FoodMat & food_mat ); - static std::string food_token_by_idx ( std::ostream &out, df::enums::organic_mat_category::organic_mat_category mat_category, std::vector::size_type idx ); - static size_t food_max_size ( df::enums::organic_mat_category::organic_mat_category mat_category ); - static void food_build_map ( std::ostream &out ); + static void food_mat_by_idx(df::enums::organic_mat_category::organic_mat_category mat_category, std::vector::size_type food_idx, FoodMat& food_mat); + static std::string food_token_by_idx(df::enums::organic_mat_category::organic_mat_category mat_category, std::vector::size_type idx); - static int16_t food_idx_by_token ( std::ostream &out, df::enums::organic_mat_category::organic_mat_category mat_category, const std::string & token ); + static size_t food_max_size(df::enums::organic_mat_category::organic_mat_category mat_category); + static void food_build_map(); - static DFHack::MaterialInfo food_mat_by_token ( std::ostream &out, const std::string & token ); + static int16_t food_idx_by_token(df::enums::organic_mat_category::organic_mat_category mat_category, const std::string& token); + + static DFHack::MaterialInfo food_mat_by_token(const std::string& token); static bool index_built; static std::vector food_index; + private: OrganicMatLookup(); }; diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index c413613f6..65feb2711 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1,38 +1,34 @@ -#include "StockpileSerializer.h" - // stockpiles plugin #include "OrganicMatLookup.h" +#include "StockpileSerializer.h" #include "StockpileUtils.h" // dfhack +#include "Debug.h" #include "MiscUtils.h" +#include "modules/Items.h" // df #include "df/building_stockpilest.h" #include "df/inorganic_raw.h" -#include "df/creature_raw.h" -#include "df/caste_raw.h" -#include "df/material.h" -#include "df/inorganic_raw.h" -#include "df/plant_raw.h" -#include "df/stockpile_group_set.h" +#include "df/item_quality.h" #include -#include -#include -#include #include -#include -#include #include +#include #include #include +#include +#include +#include +#include "df/furniture_type.h" +#include "df/material.h" +#include "df/plant_raw.h" +#include "df/stockpile_group_set.h" // protobuf #include -#include - -using std::endl; using std::string; using std::vector; @@ -44,21 +40,12 @@ using df::global::world; using std::placeholders::_1; - - -int NullBuffer::overflow ( int c ) -{ - return c; +namespace DFHack { + DBG_EXTERN(stockpiles, log); } -NullStream::NullStream() : std::ostream ( &m_sb ) {} - -StockpileSerializer::StockpileSerializer ( df::building_stockpilest * stockpile ) - : mDebug ( false ) - , mOut ( 0 ) - , mNull() - , mPile ( stockpile ) -{ +StockpileSerializer::StockpileSerializer(df::building_stockpilest* stockpile) + : mPile(stockpile) { // build other_mats indices furniture_setup_other_mats(); @@ -67,106 +54,87 @@ StockpileSerializer::StockpileSerializer ( df::building_stockpilest * stockpile weapons_armor_setup_other_mats(); } -StockpileSerializer::~StockpileSerializer() {} +StockpileSerializer::~StockpileSerializer() { } -void StockpileSerializer::enable_debug ( std::ostream&out ) -{ - mDebug = true; - mOut = &out; -} - -bool StockpileSerializer::serialize_to_ostream ( std::ostream* output ) -{ - if ( output->fail( ) ) return false; +bool StockpileSerializer::serialize_to_ostream(std::ostream* output) { + if (output->fail()) + return false; mBuffer.Clear(); write(); { - io::OstreamOutputStream zero_copy_output ( output ); - if ( !mBuffer.SerializeToZeroCopyStream ( &zero_copy_output ) ) return false; + io::OstreamOutputStream zero_copy_output(output); + if (!mBuffer.SerializeToZeroCopyStream(&zero_copy_output)) + return false; } return output->good(); } -bool StockpileSerializer::serialize_to_file ( const std::string & file ) -{ - std::fstream output ( file, std::ios::out | std::ios::binary | std::ios::trunc ); - if ( output.fail() ) - { - debug() << "ERROR: failed to open file for writing: " << file << endl; +bool StockpileSerializer::serialize_to_file(const std::string& file) { + std::fstream output(file, std::ios::out | std::ios::binary | std::ios::trunc); + if (output.fail()) { + WARN(log).print("ERROR: failed to open file for writing: '%s'\n", file.c_str()); return false; } - return serialize_to_ostream ( &output ); + return serialize_to_ostream(&output); } -bool StockpileSerializer::parse_from_istream ( std::istream* input ) -{ - if ( input->fail( ) ) return false; +bool StockpileSerializer::parse_from_istream(std::istream* input) { + if (input->fail()) + return false; mBuffer.Clear(); - io::IstreamInputStream zero_copy_input ( input ); - const bool res = mBuffer.ParseFromZeroCopyStream ( &zero_copy_input ) && input->eof(); - if ( res ) read(); + io::IstreamInputStream zero_copy_input(input); + const bool res = mBuffer.ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); + if (res) + read(); return res; } - -bool StockpileSerializer::unserialize_from_file ( const std::string & file ) -{ - std::fstream input ( file, std::ios::in | std::ios::binary ); - if ( input.fail() ) - { - debug() << "ERROR: failed to open file for reading: " << file << endl; +bool StockpileSerializer::unserialize_from_file(const std::string& file) { + std::fstream input(file, std::ios::in | std::ios::binary); + if (input.fail()) { + WARN(log).print("failed to open file for reading: '%s'\n", file.c_str()); return false; } - return parse_from_istream ( &input ); + return parse_from_istream(&input); } -std::ostream & StockpileSerializer::debug() -{ - if ( mDebug ) - return *mOut; - return mNull; -} - - -void StockpileSerializer::write() -{ - // debug() << "GROUP SET " << bitfield_to_string(mPile->settings.flags) << endl; +void StockpileSerializer::write() { + DEBUG(log).print("GROUP SET %s\n", bitfield_to_string(mPile->settings.flags).c_str()); write_general(); - if ( mPile->settings.flags.bits.animals ) + if (mPile->settings.flags.bits.animals) write_animals(); - if ( mPile->settings.flags.bits.food ) + if (mPile->settings.flags.bits.food) write_food(); - if ( mPile->settings.flags.bits.furniture ) + if (mPile->settings.flags.bits.furniture) write_furniture(); - if ( mPile->settings.flags.bits.refuse ) + if (mPile->settings.flags.bits.refuse) write_refuse(); - if ( mPile->settings.flags.bits.stone ) + if (mPile->settings.flags.bits.stone) write_stone(); - if ( mPile->settings.flags.bits.ammo ) + if (mPile->settings.flags.bits.ammo) write_ammo(); - if ( mPile->settings.flags.bits.coins ) + if (mPile->settings.flags.bits.coins) write_coins(); - if ( mPile->settings.flags.bits.bars_blocks ) + if (mPile->settings.flags.bits.bars_blocks) write_bars_blocks(); - if ( mPile->settings.flags.bits.gems ) + if (mPile->settings.flags.bits.gems) write_gems(); - if ( mPile->settings.flags.bits.finished_goods ) + if (mPile->settings.flags.bits.finished_goods) write_finished_goods(); - if ( mPile->settings.flags.bits.leather ) + if (mPile->settings.flags.bits.leather) write_leather(); - if ( mPile->settings.flags.bits.cloth ) + if (mPile->settings.flags.bits.cloth) write_cloth(); - if ( mPile->settings.flags.bits.wood ) + if (mPile->settings.flags.bits.wood) write_wood(); - if ( mPile->settings.flags.bits.weapons ) + if (mPile->settings.flags.bits.weapons) write_weapons(); - if ( mPile->settings.flags.bits.armor ) + if (mPile->settings.flags.bits.armor) write_armor(); } -void StockpileSerializer::read () -{ - debug() << endl << "==READ==" << endl; +void StockpileSerializer::read() { + DEBUG(log).print("==READ==\n"); read_general(); read_animals(); read_food(); @@ -185,361 +153,297 @@ void StockpileSerializer::read () read_armor(); } - -void StockpileSerializer::serialize_list_organic_mat ( FuncWriteExport add_value, const std::vector * list, organic_mat_category::organic_mat_category cat ) -{ - if ( !list ) - { - debug() << "serialize_list_organic_mat: list null" << endl; +void StockpileSerializer::serialize_list_organic_mat(FuncWriteExport add_value, const std::vector* list, organic_mat_category::organic_mat_category cat) { + if (!list) { + DEBUG(log).print("serialize_list_organic_mat: list null\n"); + return; } - for ( size_t i = 0; i < list->size(); ++i ) - { - if ( list->at ( i ) ) - { - std::string token = OrganicMatLookup::food_token_by_idx ( debug(), cat, i ); - if ( !token.empty() ) - { - add_value ( token ); - debug() << " organic_material " << i << " is " << token << endl; - } - else - { - debug() << "food mat invalid :(" << endl; + for (size_t i = 0; i < list->size(); ++i) { + if (list->at(i)) { + std::string token = OrganicMatLookup::food_token_by_idx(cat, i); + if (token.empty()) { + DEBUG(log).print("food mat invalid :(\n"); + continue; } + DEBUG(log).print("organic_material %zd is %s\n", i, token.c_str()); + add_value(token); } } } -void StockpileSerializer::unserialize_list_organic_mat ( FuncReadImport get_value, size_t list_size, std::vector *pile_list, organic_mat_category::organic_mat_category cat ) -{ +void StockpileSerializer::unserialize_list_organic_mat(FuncReadImport get_value, size_t list_size, std::vector* pile_list, organic_mat_category::organic_mat_category cat) { pile_list->clear(); - pile_list->resize ( OrganicMatLookup::food_max_size ( cat ), '\0' ); - for ( size_t i = 0; i < list_size; ++i ) - { - std::string token = get_value ( i ); - int16_t idx = OrganicMatLookup::food_idx_by_token ( debug(), cat, token ); - debug() << " organic_material " << idx << " is " << token << endl; - if ( size_t(idx) >= pile_list->size() ) - { - debug() << "error organic mat index too large! idx[" << idx << "] max_size[" << pile_list->size() << "]" << endl; + pile_list->resize(OrganicMatLookup::food_max_size(cat), '\0'); + for (size_t i = 0; i < list_size; ++i) { + std::string token = get_value(i); + int16_t idx = OrganicMatLookup::food_idx_by_token(cat, token); + DEBUG(log).print(" organic_material %d is %s\n", idx, token.c_str()); + if (size_t(idx) >= pile_list->size()) { + WARN(log).print("organic mat index too large! idx[%d] max_size[%zd]\n", idx, pile_list->size()); continue; } - pile_list->at ( idx ) = 1; + pile_list->at(idx) = 1; } } - -void StockpileSerializer::serialize_list_item_type ( FuncItemAllowed is_allowed, FuncWriteExport add_value, const std::vector &list ) -{ +void StockpileSerializer::serialize_list_item_type(FuncItemAllowed is_allowed, FuncWriteExport add_value, const std::vector& list) { using df::enums::item_type::item_type; using type_traits = df::enum_traits; - debug() << "item_type size = " << list.size() << " size limit = " << type_traits::last_item_value << " typecasted: " << ( size_t ) type_traits::last_item_value << endl; - for ( size_t i = 0; i <= ( size_t ) type_traits::last_item_value; ++i ) - { - if ( list.at ( i ) ) - { - const item_type type = ( item_type ) ( ( df::enum_traits::base_type ) i ); - std::string r_type ( type_traits::key_table[i+1] ); - if ( !is_allowed ( type ) ) continue; - add_value ( r_type ); - debug() << "item_type key_table[" << i+1 << "] type[" << ( int16_t ) type << "] is " << r_type <::base_type)i); + std::string r_type(type_traits::key_table[i + 1]); + if (!is_allowed(type)) + continue; + add_value(r_type); + DEBUG(log).print("item_type key_table[%zd] type[%d] is %s\n", i + 1, (int16_t)type, r_type.c_str()); } } - -void StockpileSerializer::unserialize_list_item_type ( FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector *pile_list ) -{ +void StockpileSerializer::unserialize_list_item_type(FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list) { pile_list->clear(); - pile_list->resize ( 112, '\0' ); // TODO remove hardcoded list size value - for ( size_t i = 0; i < pile_list->size(); ++i ) - { - pile_list->at ( i ) = is_allowed ( ( item_type::item_type ) i ) ? 0 : 1; + pile_list->resize(112, '\0'); // TODO remove hardcoded list size value + for (size_t i = 0; i < pile_list->size(); ++i) { + pile_list->at(i) = is_allowed((item_type::item_type)i) ? 0 : 1; } using df::enums::item_type::item_type; df::enum_traits type_traits; - for ( int32_t i = 0; i < list_size; ++i ) - { - const std::string token = read_value ( i ); + for (int32_t i = 0; i < list_size; ++i) { + const std::string token = read_value(i); // subtract one because item_type starts at -1 - const df::enum_traits::base_type idx = linear_index ( debug(), type_traits, token ) - 1; - const item_type type = ( item_type ) idx; - if ( !is_allowed ( type ) ) continue; - debug() << " item_type " << idx << " is " << token << endl; - if ( size_t(idx) >= pile_list->size() ) - { - debug() << "error item_type index too large! idx[" << idx << "] max_size[" << pile_list->size() << "]" << endl; + const df::enum_traits::base_type idx = linear_index(type_traits, token) - 1; + const item_type type = (item_type)idx; + if (!is_allowed(type)) + continue; + DEBUG(log).print("item_type %d is %s\n", idx, token.c_str()); + if (size_t(idx) >= pile_list->size()) { + WARN(log).print("error item_type index too large! idx[%d] max_size[%zd]\n", idx, pile_list->size()); continue; } - pile_list->at ( idx ) = 1; + pile_list->at(idx) = 1; } } - -void StockpileSerializer::serialize_list_material ( FuncMaterialAllowed is_allowed, FuncWriteExport add_value, const std::vector &list ) -{ +void StockpileSerializer::serialize_list_material(FuncMaterialAllowed is_allowed, FuncWriteExport add_value, const std::vector& list) { MaterialInfo mi; - for ( size_t i = 0; i < list.size(); ++i ) - { - if ( list.at ( i ) ) - { - mi.decode ( 0, i ); - if ( !is_allowed ( mi ) ) continue; - debug() << " material " << i << " is " << mi.getToken() << endl; - add_value ( mi.getToken() ); + for (size_t i = 0; i < list.size(); ++i) { + if (list.at(i)) { + mi.decode(0, i); + if (!is_allowed(mi)) + continue; + DEBUG(log).print("material %zd is %s\n", i, mi.getToken().c_str()); + add_value(mi.getToken()); } } } - -void StockpileSerializer::unserialize_list_material ( FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector *pile_list ) -{ +void StockpileSerializer::unserialize_list_material(FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list) { // we initialize all possible (allowed) values to 0, // then all other not-allowed values to 1 // why? because that's how the memory is in DF before // we muck with it. std::set idx_set; pile_list->clear(); - pile_list->resize ( world->raws.inorganics.size(), 0 ); - for ( size_t i = 0; i < pile_list->size(); ++i ) - { - MaterialInfo mi ( 0, i ); - pile_list->at ( i ) = is_allowed ( mi ) ? 0 : 1; + pile_list->resize(world->raws.inorganics.size(), 0); + for (size_t i = 0; i < pile_list->size(); ++i) { + MaterialInfo mi(0, i); + pile_list->at(i) = is_allowed(mi) ? 0 : 1; } - for ( int i = 0; i < list_size; ++i ) - { - const std::string token = read_value ( i ); + for (int i = 0; i < list_size; ++i) { + const std::string token = read_value(i); MaterialInfo mi; - mi.find ( token ); - if ( !is_allowed ( mi ) ) continue; - debug() << " material " << mi.index << " is " << token << endl; - if ( size_t(mi.index) >= pile_list->size() ) - { - debug() << "error material index too large! idx[" << mi.index << "] max_size[" << pile_list->size() << "]" << endl; + mi.find(token); + if (!is_allowed(mi)) + continue; + DEBUG(log).print("material %d is %s\n", mi.index, token.c_str()); + if (size_t(mi.index) >= pile_list->size()) { + WARN(log).print("material index too large! idx[%d] max_size[%zd]\n", mi.index, pile_list->size()); continue; } - pile_list->at ( mi.index ) = 1; + pile_list->at(mi.index) = 1; } } - -void StockpileSerializer::serialize_list_quality ( FuncWriteExport add_value, const bool ( &quality_list ) [7] ) -{ +void StockpileSerializer::serialize_list_quality(FuncWriteExport add_value, const bool(&quality_list)[7]) { using df::enums::item_quality::item_quality; using quality_traits = df::enum_traits; - for ( size_t i = 0; i < 7; ++i ) - { - if ( quality_list[i] ) - { - const std::string f_type ( quality_traits::key_table[i] ); - add_value ( f_type ); - debug() << " quality: " << i << " is " << f_type < 0 && list_size <= 7 ) - { +void StockpileSerializer::unserialize_list_quality(FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]) { + quality_clear(pile_list); + if (list_size > 0 && list_size <= 7) { using df::enums::item_quality::item_quality; df::enum_traits quality_traits; - for ( int i = 0; i < list_size; ++i ) - { - const std::string quality = read_value ( i ); - df::enum_traits::base_type idx = linear_index ( debug(), quality_traits, quality ); - if ( idx < 0 ) - { - debug() << " invalid quality token " << quality << endl; + for (int i = 0; i < list_size; ++i) { + const std::string quality = read_value(i); + df::enum_traits::base_type idx = linear_index(quality_traits, quality); + if (idx < 0) { + WARN(log).print("invalid quality token: %s\n", quality.c_str()); continue; } - debug() << " quality: " << idx << " is " << quality << endl; + DEBUG(log).print("quality: %d is %s\n", idx, quality.c_str()); pile_list[idx] = true; } } } - -void StockpileSerializer::serialize_list_other_mats ( const std::map other_mats, FuncWriteExport add_value, std::vector list ) -{ - for ( size_t i = 0; i < list.size(); ++i ) - { - if ( list.at ( i ) ) - { - const std::string token = other_mats_index ( other_mats, i ); - if ( token.empty() ) - { - debug() << " invalid other material with index " << i << endl; +void StockpileSerializer::serialize_list_other_mats(const std::map other_mats, FuncWriteExport add_value, std::vector list) { + for (size_t i = 0; i < list.size(); ++i) { + if (list.at(i)) { + const std::string token = other_mats_index(other_mats, i); + if (token.empty()) { + WARN(log).print("invalid other material with index %zd\n", i); continue; } - add_value ( token ); - debug() << " other mats " << i << " is " << token << endl; + add_value(token); + DEBUG(log).print("other mats %zd is %s\n", i, token.c_str()); } } } - -void StockpileSerializer::unserialize_list_other_mats ( const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector *pile_list ) -{ +void StockpileSerializer::unserialize_list_other_mats(const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector* pile_list) { pile_list->clear(); - pile_list->resize ( other_mats.size(), '\0' ); - for ( int i = 0; i < list_size; ++i ) - { - const std::string token = read_value ( i ); - size_t idx = other_mats_token ( other_mats, token ); - if ( idx < 0 ) - { - debug() << "invalid other mat with token " << token; + pile_list->resize(other_mats.size(), '\0'); + for (int i = 0; i < list_size; ++i) { + const std::string token = read_value(i); + size_t idx = other_mats_token(other_mats, token); + if (idx < 0) { + WARN(log).print("invalid other mat with token %s\n", token.c_str()); continue; } - debug() << " other_mats " << idx << " is " << token << endl; - if ( idx >= pile_list->size() ) - { - debug() << "error other_mats index too large! idx[" << idx << "] max_size[" << pile_list->size() << "]" << endl; + DEBUG(log).print("other_mats %zd is %s\n", idx, token.c_str()); + if (idx >= pile_list->size()) { + WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, pile_list->size()); continue; } - pile_list->at ( idx ) = 1; + pile_list->at(idx) = 1; } } - - -void StockpileSerializer::serialize_list_itemdef ( FuncWriteExport add_value, std::vector list, std::vector items, item_type::item_type type ) -{ - for ( size_t i = 0; i < list.size(); ++i ) - { - if ( list.at ( i ) ) - { - const df::itemdef *a = items.at ( i ); +void StockpileSerializer::serialize_list_itemdef(FuncWriteExport add_value, std::vector list, std::vector items, item_type::item_type type) { + for (size_t i = 0; i < list.size(); ++i) { + if (list.at(i)) { + const df::itemdef* a = items.at(i); // skip procedurally generated items - if ( a->base_flags.is_set ( df::itemdef_flags::GENERATED ) ) continue; + if (a->base_flags.is_set(df::itemdef_flags::GENERATED)) + continue; ItemTypeInfo ii; - if ( !ii.decode ( type, i ) ) continue; - add_value ( ii.getToken() ); - debug() << " itemdef type" << i << " is " << ii.getToken() << endl; + if (!ii.decode(type, i)) + continue; + add_value(ii.getToken()); + DEBUG(log).print("itemdef type %zd is %s\n", i, ii.getToken().c_str()); } } } - -void StockpileSerializer::unserialize_list_itemdef ( FuncReadImport read_value, int32_t list_size, std::vector *pile_list, item_type::item_type type ) -{ +void StockpileSerializer::unserialize_list_itemdef(FuncReadImport read_value, int32_t list_size, std::vector* pile_list, item_type::item_type type) { pile_list->clear(); - pile_list->resize ( Items::getSubtypeCount ( type ), '\0' ); - for ( int i = 0; i < list_size; ++i ) - { - std::string token = read_value ( i ); + pile_list->resize(Items::getSubtypeCount(type), '\0'); + for (int i = 0; i < list_size; ++i) { + std::string token = read_value(i); ItemTypeInfo ii; - if ( !ii.find ( token ) ) continue; - debug() << " itemdef " << ii.subtype << " is " << token << endl; - if ( size_t(ii.subtype) >= pile_list->size() ) - { - debug() << "error itemdef index too large! idx[" << ii.subtype << "] max_size[" << pile_list->size() << "]" << endl; + if (!ii.find(token)) + continue; + DEBUG(log).print("itemdef %d is %s\n", ii.subtype, token.c_str()); + if (size_t(ii.subtype) >= pile_list->size()) { + WARN(log).print("itemdef index too large! idx[%d] max_size[%zd]\n", ii.subtype, pile_list->size()); continue; } - pile_list->at ( ii.subtype ) = 1; + pile_list->at(ii.subtype) = 1; } } - -std::string StockpileSerializer::other_mats_index ( const std::map other_mats, int idx ) -{ - auto it = other_mats.find ( idx ); - if ( it == other_mats.end() ) +std::string StockpileSerializer::other_mats_index(const std::map other_mats, int idx) { + auto it = other_mats.find(idx); + if (it == other_mats.end()) return std::string(); return it->second; } -int StockpileSerializer::other_mats_token ( const std::map other_mats, const std::string & token ) -{ - for ( auto it = other_mats.begin(); it != other_mats.end(); ++it ) - { - if ( it->second == token ) +int StockpileSerializer::other_mats_token(const std::map other_mats, const std::string& token) { + for (auto it = other_mats.begin(); it != other_mats.end(); ++it) { + if (it->second == token) return it->first; } return -1; } -void StockpileSerializer::write_general() -{ - mBuffer.set_max_bins ( mPile->max_bins ); - mBuffer.set_max_wheelbarrows ( mPile->max_wheelbarrows ); - mBuffer.set_max_barrels ( mPile->max_barrels ); - mBuffer.set_use_links_only ( mPile->use_links_only ); - mBuffer.set_allow_inorganic ( mPile->settings.allow_inorganic ); - mBuffer.set_allow_organic ( mPile->settings.allow_organic ); - mBuffer.set_corpses ( mPile->settings.flags.bits.corpses ); +void StockpileSerializer::write_general() { + mBuffer.set_max_bins(mPile->max_bins); + mBuffer.set_max_wheelbarrows(mPile->max_wheelbarrows); + mBuffer.set_max_barrels(mPile->max_barrels); + mBuffer.set_use_links_only(mPile->use_links_only); + mBuffer.set_allow_inorganic(mPile->settings.allow_inorganic); + mBuffer.set_allow_organic(mPile->settings.allow_organic); + mBuffer.set_corpses(mPile->settings.flags.bits.corpses); } -void StockpileSerializer::read_general() -{ - if ( mBuffer.has_max_bins() ) +void StockpileSerializer::read_general() { + if (mBuffer.has_max_bins()) mPile->max_bins = mBuffer.max_bins(); - if ( mBuffer.has_max_wheelbarrows() ) + if (mBuffer.has_max_wheelbarrows()) mPile->max_wheelbarrows = mBuffer.max_wheelbarrows(); - if ( mBuffer.has_max_barrels() ) + if (mBuffer.has_max_barrels()) mPile->max_barrels = mBuffer.max_barrels(); - if ( mBuffer.has_use_links_only() ) + if (mBuffer.has_use_links_only()) mPile->use_links_only = mBuffer.use_links_only(); - if ( mBuffer.has_allow_inorganic() ) + if (mBuffer.has_allow_inorganic()) mPile->settings.allow_inorganic = mBuffer.allow_inorganic(); - if ( mBuffer.has_allow_organic() ) + if (mBuffer.has_allow_organic()) mPile->settings.allow_organic = mBuffer.allow_organic(); - if ( mBuffer.has_corpses() ) + if (mBuffer.has_corpses()) mPile->settings.flags.bits.corpses = mBuffer.corpses(); } -void StockpileSerializer::write_animals() -{ - StockpileSettings::AnimalsSet *animals= mBuffer.mutable_animals(); - animals->set_empty_cages ( mPile->settings.animals.empty_cages ); - animals->set_empty_traps ( mPile->settings.animals.empty_traps ); - for ( size_t i = 0; i < mPile->settings.animals.enabled.size(); ++i ) - { - if ( mPile->settings.animals.enabled.at ( i ) == 1 ) - { - df::creature_raw* r = find_creature ( i ); - debug() << "creature "<< r->creature_id << " " << i << endl; - animals->add_enabled ( r->creature_id ); +void StockpileSerializer::write_animals() { + StockpileSettings::AnimalsSet* animals = mBuffer.mutable_animals(); + animals->set_empty_cages(mPile->settings.animals.empty_cages); + animals->set_empty_traps(mPile->settings.animals.empty_traps); + for (size_t i = 0; i < mPile->settings.animals.enabled.size(); ++i) { + if (mPile->settings.animals.enabled.at(i) == 1) { + df::creature_raw* r = find_creature(i); + DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); + animals->add_enabled(r->creature_id); } } } -void StockpileSerializer::read_animals() -{ - if ( mBuffer.has_animals() ) - { +void StockpileSerializer::read_animals() { + if (mBuffer.has_animals()) { mPile->settings.flags.bits.animals = 1; - debug() << "animals:" << endl; + DEBUG(log).print("animals:\n"); mPile->settings.animals.empty_cages = mBuffer.animals().empty_cages(); mPile->settings.animals.empty_traps = mBuffer.animals().empty_traps(); mPile->settings.animals.enabled.clear(); - mPile->settings.animals.enabled.resize ( world->raws.creatures.all.size(), '\0' ); - debug() << " pile has " << mPile->settings.animals.enabled.size() << endl; - for ( auto i = 0; i < mBuffer.animals().enabled_size(); ++i ) - { - std::string id = mBuffer.animals().enabled ( i ); - int idx = find_creature ( id ); - debug() << id << " " << idx << endl; - if ( idx < 0 || size_t(idx) >= mPile->settings.animals.enabled.size() ) - { - debug() << "WARNING: animal index invalid: " << idx << endl; + mPile->settings.animals.enabled.resize(world->raws.creatures.all.size(), '\0'); + DEBUG(log).print("pile has %zd\n", mPile->settings.animals.enabled.size()); + for (auto i = 0; i < mBuffer.animals().enabled_size(); ++i) { + std::string id = mBuffer.animals().enabled(i); + int idx = find_creature(id); + DEBUG(log).print("%s %d\n", id.c_str(), idx); + if (idx < 0 || size_t(idx) >= mPile->settings.animals.enabled.size()) { + WARN(log).print("animal index invalid: %d\n", idx); continue; } - mPile->settings.animals.enabled.at ( idx ) = ( char ) 1; + mPile->settings.animals.enabled.at(idx) = (char)1; } } - else - { + else { mPile->settings.animals.enabled.clear(); mPile->settings.flags.bits.animals = 0; mPile->settings.animals.empty_cages = false; @@ -547,183 +451,162 @@ void StockpileSerializer::read_animals() } } -StockpileSerializer::food_pair StockpileSerializer::food_map ( organic_mat_category::organic_mat_category cat ) -{ +StockpileSerializer::food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { using df::enums::organic_mat_category::organic_mat_category; using namespace std::placeholders; - switch ( cat ) - { + switch (cat) { case organic_mat_category::Meat: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_meat ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_meat(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().meat ( idx ); }; - return food_pair ( setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; + return food_pair(setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); } case organic_mat_category::Fish: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_fish ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_fish(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().fish ( idx ); }; - return food_pair ( setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; + return food_pair(setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); } case organic_mat_category::UnpreparedFish: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_unprepared_fish ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_unprepared_fish(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().unprepared_fish ( idx ); }; - return food_pair ( setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; + return food_pair(setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); } case organic_mat_category::Eggs: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_egg ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_egg(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().egg ( idx ); }; - return food_pair ( setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; + return food_pair(setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); } case organic_mat_category::Plants: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_plants ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_plants(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().plants ( idx ); }; - return food_pair ( setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; + return food_pair(setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); } case organic_mat_category::PlantDrink: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_drink_plant ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_drink_plant(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().drink_plant ( idx ); }; - return food_pair ( setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; + return food_pair(setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); } case organic_mat_category::CreatureDrink: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_drink_animal ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_drink_animal(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().drink_animal ( idx ); }; - return food_pair ( setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; + return food_pair(setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); } case organic_mat_category::PlantCheese: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_cheese_plant ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_cheese_plant(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().cheese_plant ( idx ); }; - return food_pair ( setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; + return food_pair(setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); } case organic_mat_category::CreatureCheese: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_cheese_animal ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_cheese_animal(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().cheese_animal ( idx ); }; - return food_pair ( setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; + return food_pair(setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); } case organic_mat_category::Seed: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_seeds ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_seeds(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().seeds ( idx ); }; - return food_pair ( setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; + return food_pair(setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); } case organic_mat_category::Leaf: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_leaves ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_leaves(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().leaves ( idx ); }; - return food_pair ( setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; + return food_pair(setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); } case organic_mat_category::PlantPowder: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_powder_plant ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_powder_plant(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().powder_plant ( idx ); }; - return food_pair ( setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; + return food_pair(setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); } case organic_mat_category::CreaturePowder: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_powder_creature ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_powder_creature(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().powder_creature ( idx ); }; - return food_pair ( setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; + return food_pair(setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); } case organic_mat_category::Glob: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_glob ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_glob(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().glob ( idx ); }; - return food_pair ( setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; + return food_pair(setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); } case organic_mat_category::PlantLiquid: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_liquid_plant ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_liquid_plant(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().liquid_plant ( idx ); }; - return food_pair ( setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; + return food_pair(setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); } case organic_mat_category::CreatureLiquid: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_liquid_animal ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_liquid_animal(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().liquid_animal ( idx ); }; - return food_pair ( setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; + return food_pair(setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); } case organic_mat_category::MiscLiquid: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_liquid_misc ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_liquid_misc(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().liquid_misc ( idx ); }; - return food_pair ( setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; + return food_pair(setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); } case organic_mat_category::Paste: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_glob_paste ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_glob_paste(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().glob_paste ( idx ); }; - return food_pair ( setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; + return food_pair(setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); } case organic_mat_category::Pressed: { - FuncWriteExport setter = [=] ( const std::string &id ) - { - mBuffer.mutable_food()->add_glob_pressed ( id ); + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_glob_pressed(id); }; - FuncReadImport getter = [=] ( size_t idx ) -> std::string { return mBuffer.food().glob_pressed ( idx ); }; - return food_pair ( setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size() ); + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; + return food_pair(setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); } case organic_mat_category::Leather: case organic_mat_category::Silk: @@ -750,55 +633,49 @@ StockpileSerializer::food_pair StockpileSerializer::food_map ( organic_mat_categ return food_pair(); } - -void StockpileSerializer::write_food() -{ - StockpileSettings::FoodSet *food = mBuffer.mutable_food(); - debug() << " food: " << endl; - food->set_prepared_meals ( mPile->settings.food.prepared_meals ); +void StockpileSerializer::write_food() { + StockpileSettings::FoodSet* food = mBuffer.mutable_food(); + DEBUG(log).print("food:\n"); + food->set_prepared_meals(mPile->settings.food.prepared_meals); using df::enums::organic_mat_category::organic_mat_category; using traits = df::enum_traits; - for ( int32_t mat_category = traits::first_item_value; mat_category ; - if ( mBuffer.has_food() ) - { + if (mBuffer.has_food()) { mPile->settings.flags.bits.food = 1; const StockpileSettings::FoodSet food = mBuffer.food(); - debug() << "food:" <settings.food.prepared_meals = food.prepared_meals(); else mPile->settings.food.prepared_meals = true; - debug() << " prepared_meals: " << mPile->settings.food.prepared_meals << endl; + DEBUG(log).print("prepared_meals: %d\n", mPile->settings.food.prepared_meals); - for ( int32_t mat_category = traits::first_item_value; mat_category clear(); } mPile->settings.flags.bits.food = 0; @@ -806,327 +683,249 @@ void StockpileSerializer::read_food() } } -void StockpileSerializer::furniture_setup_other_mats() -{ - mOtherMatsFurniture.insert ( std::make_pair ( 0,"WOOD" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 1,"PLANT_CLOTH" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 2,"BONE" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 3,"TOOTH" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 4,"HORN" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 5,"PEARL" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 6,"SHELL" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 7,"LEATHER" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 8,"SILK" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 9,"AMBER" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 10,"CORAL" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 11,"GREEN_GLASS" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 12,"CLEAR_GLASS" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 13,"CRYSTAL_GLASS" ) ); - mOtherMatsFurniture.insert ( std::make_pair ( 14,"YARN" ) ); +void StockpileSerializer::furniture_setup_other_mats() { + mOtherMatsFurniture.insert(std::make_pair(0, "WOOD")); + mOtherMatsFurniture.insert(std::make_pair(1, "PLANT_CLOTH")); + mOtherMatsFurniture.insert(std::make_pair(2, "BONE")); + mOtherMatsFurniture.insert(std::make_pair(3, "TOOTH")); + mOtherMatsFurniture.insert(std::make_pair(4, "HORN")); + mOtherMatsFurniture.insert(std::make_pair(5, "PEARL")); + mOtherMatsFurniture.insert(std::make_pair(6, "SHELL")); + mOtherMatsFurniture.insert(std::make_pair(7, "LEATHER")); + mOtherMatsFurniture.insert(std::make_pair(8, "SILK")); + mOtherMatsFurniture.insert(std::make_pair(9, "AMBER")); + mOtherMatsFurniture.insert(std::make_pair(10, "CORAL")); + mOtherMatsFurniture.insert(std::make_pair(11, "GREEN_GLASS")); + mOtherMatsFurniture.insert(std::make_pair(12, "CLEAR_GLASS")); + mOtherMatsFurniture.insert(std::make_pair(13, "CRYSTAL_GLASS")); + mOtherMatsFurniture.insert(std::make_pair(14, "YARN")); } -void StockpileSerializer::write_furniture() -{ - StockpileSettings::FurnitureSet *furniture= mBuffer.mutable_furniture(); +void StockpileSerializer::write_furniture() { + StockpileSettings::FurnitureSet* furniture = mBuffer.mutable_furniture(); // FURNITURE type using df::enums::furniture_type::furniture_type; using type_traits = df::enum_traits; - for ( size_t i = 0; i < mPile->settings.furniture.type.size(); ++i ) - { - if ( mPile->settings.furniture.type.at ( i ) ) - { - std::string f_type ( type_traits::key_table[i] ); - furniture->add_type ( f_type ); - debug() << "furniture_type " << i << " is " << f_type <settings.furniture.type.size(); ++i) { + if (mPile->settings.furniture.type.at(i)) { + std::string f_type(type_traits::key_table[i]); + furniture->add_type(f_type); + DEBUG(log).print("furniture_type %zd is %s\n", i, f_type.c_str()); } } // metal, stone/clay materials - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::furniture_mat_is_allowed, this, _1 ); - serialize_list_material ( filter, [=] ( const std::string &token ) - { - furniture->add_mats ( token ); - }, mPile->settings.furniture.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::furniture_mat_is_allowed, this, _1); + serialize_list_material( + filter, [=](const std::string& token) { furniture->add_mats(token); }, + mPile->settings.furniture.mats); // other mats - serialize_list_other_mats ( mOtherMatsFurniture, [=] ( const std::string &token ) - { - furniture->add_other_mats ( token ); - }, mPile->settings.furniture.other_mats ); + serialize_list_other_mats( + mOtherMatsFurniture, [=](const std::string& token) { furniture->add_other_mats(token); }, + mPile->settings.furniture.other_mats); - serialize_list_quality ( [=] ( const std::string &token ) - { - furniture->add_quality_core ( token ); - }, mPile->settings.furniture.quality_core ); - serialize_list_quality ( [=] ( const std::string &token ) - { - furniture->add_quality_total ( token ); - }, mPile->settings.furniture.quality_total ); + serialize_list_quality([=](const std::string& token) { furniture->add_quality_core(token); }, + mPile->settings.furniture.quality_core); + serialize_list_quality([=](const std::string& token) { furniture->add_quality_total(token); }, + mPile->settings.furniture.quality_total); } -bool StockpileSerializer::furniture_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material - && ( mi.material->flags.is_set ( material_flags::IS_METAL ) - || mi.material->flags.is_set ( material_flags::IS_STONE ) ); +bool StockpileSerializer::furniture_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::read_furniture() -{ - if ( mBuffer.has_furniture() ) - { +void StockpileSerializer::read_furniture() { + if (mBuffer.has_furniture()) { mPile->settings.flags.bits.furniture = 1; const StockpileSettings::FurnitureSet furniture = mBuffer.furniture(); - debug() << "furniture:" < type_traits; mPile->settings.furniture.type.clear(); - mPile->settings.furniture.type.resize ( type_traits.last_item_value+1, '\0' ); - if ( furniture.type_size() > 0 ) - { - for ( int i = 0; i < furniture.type_size(); ++i ) - { - const std::string type = furniture.type ( i ); - df::enum_traits::base_type idx = linear_index ( debug(), type_traits, type ); - debug() << " type " << idx << " is " << type << endl; - if ( idx < 0 || size_t(idx) >= mPile->settings.furniture.type.size() ) - { - debug() << "WARNING: furniture type index invalid " << type << ", idx=" << idx << endl; + mPile->settings.furniture.type.resize(type_traits.last_item_value + 1, '\0'); + if (furniture.type_size() > 0) { + for (int i = 0; i < furniture.type_size(); ++i) { + const std::string type = furniture.type(i); + df::enum_traits::base_type idx = linear_index(type_traits, type); + DEBUG(log).print("type %d is %s\n", idx, type.c_str()); + if (idx < 0 || size_t(idx) >= mPile->settings.furniture.type.size()) { + WARN(log).print("furniture type index invalid %s, idx=%d\n", type.c_str(), idx); continue; } - mPile->settings.furniture.type.at ( idx ) = 1; + mPile->settings.furniture.type.at(idx) = 1; } } - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::furniture_mat_is_allowed, this, _1 ); - unserialize_list_material ( filter, [=] ( const size_t & idx ) -> const std::string& - { - return furniture.mats ( idx ); - }, furniture.mats_size(), &mPile->settings.furniture.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::furniture_mat_is_allowed, this, _1); + unserialize_list_material( + filter, [=](const size_t& idx) -> const std::string& { return furniture.mats(idx); }, + furniture.mats_size(), &mPile->settings.furniture.mats); // other materials - unserialize_list_other_mats ( mOtherMatsFurniture, [=] ( const size_t & idx ) -> const std::string& - { - return furniture.other_mats ( idx ); - }, furniture.other_mats_size(), &mPile->settings.furniture.other_mats ); + unserialize_list_other_mats( + mOtherMatsFurniture, [=](const size_t& idx) -> const std::string& { return furniture.other_mats(idx); }, + furniture.other_mats_size(), &mPile->settings.furniture.other_mats); // core quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return furniture.quality_core ( idx ); - }, furniture.quality_core_size(), mPile->settings.furniture.quality_core ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_core(idx); }, + furniture.quality_core_size(), mPile->settings.furniture.quality_core); // total quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return furniture.quality_total ( idx ); - }, furniture.quality_total_size(), mPile->settings.furniture.quality_total ); - + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_total(idx); }, + furniture.quality_total_size(), mPile->settings.furniture.quality_total); } - else - { + else { mPile->settings.flags.bits.furniture = 0; mPile->settings.furniture.type.clear(); mPile->settings.furniture.other_mats.clear(); mPile->settings.furniture.mats.clear(); - quality_clear ( mPile->settings.furniture.quality_core ); - quality_clear ( mPile->settings.furniture.quality_total ); + quality_clear(mPile->settings.furniture.quality_core); + quality_clear(mPile->settings.furniture.quality_total); } } -bool StockpileSerializer::refuse_creature_is_allowed ( const df::creature_raw *raw ) -{ - if ( !raw ) return false; +bool StockpileSerializer::refuse_creature_is_allowed(const df::creature_raw* raw) { + if (!raw) + return false; // wagon and generated creatures not allowed, except angels const bool is_wagon = raw->creature_id == "EQUIPMENT_WAGON"; - const bool is_generated = raw->flags.is_set ( creature_raw_flags::GENERATED ); - const bool is_angel = is_generated && raw->creature_id.find ( "DIVINE_" ) != std::string::npos; - return !is_wagon && ! ( is_generated && !is_angel ); + const bool is_generated = raw->flags.is_set(creature_raw_flags::GENERATED); + const bool is_angel = is_generated && raw->creature_id.find("DIVINE_") != std::string::npos; + return !is_wagon && !(is_generated && !is_angel); } -void StockpileSerializer::refuse_write_helper ( std::function add_value, const vector & list ) -{ - for ( size_t i = 0; i < list.size(); ++i ) - { - if ( list.at ( i ) == 1 ) - { - df::creature_raw* r = find_creature ( i ); +void StockpileSerializer::refuse_write_helper(std::function add_value, const vector& list) { + for (size_t i = 0; i < list.size(); ++i) { + if (list.at(i) == 1) { + df::creature_raw* r = find_creature(i); // skip forgotten beasts, titans, demons, and night creatures - if ( !refuse_creature_is_allowed ( r ) ) continue; - debug() << "creature "<< r->creature_id << " " << i << endl; - add_value ( r->creature_id ); + if (!refuse_creature_is_allowed(r)) + continue; + DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); + add_value(r->creature_id); } } } -bool StockpileSerializer::refuse_type_is_allowed ( item_type::item_type type ) -{ - if ( type == item_type::NONE - || type == item_type::BAR - || type == item_type::SMALLGEM - || type == item_type::BLOCKS - || type == item_type::ROUGH - || type == item_type::BOULDER - || type == item_type::CORPSE - || type == item_type::CORPSEPIECE - || type == item_type::ROCK - || type == item_type::ORTHOPEDIC_CAST - ) return false; +bool StockpileSerializer::refuse_type_is_allowed(item_type::item_type type) { + if (type == item_type::NONE || type == item_type::BAR || type == item_type::SMALLGEM || type == item_type::BLOCKS || type == item_type::ROUGH || type == item_type::BOULDER || type == item_type::CORPSE || type == item_type::CORPSEPIECE || type == item_type::ROCK || type == item_type::ORTHOPEDIC_CAST) + return false; return true; } - -void StockpileSerializer::write_refuse() -{ - StockpileSettings::RefuseSet *refuse = mBuffer.mutable_refuse(); - refuse->set_fresh_raw_hide ( mPile->settings.refuse.fresh_raw_hide ); - refuse->set_rotten_raw_hide ( mPile->settings.refuse.rotten_raw_hide ); +void StockpileSerializer::write_refuse() { + DEBUG(log).print("refuse:\n"); + StockpileSettings::RefuseSet* refuse = mBuffer.mutable_refuse(); + refuse->set_fresh_raw_hide(mPile->settings.refuse.fresh_raw_hide); + refuse->set_rotten_raw_hide(mPile->settings.refuse.rotten_raw_hide); // type - FuncItemAllowed filter = std::bind ( &StockpileSerializer::refuse_type_is_allowed, this, _1 ); - serialize_list_item_type ( filter, [=] ( const std::string &token ) - { - refuse->add_type ( token ); - }, mPile->settings.refuse.type ); + DEBUG(log).print("getting types\n"); + FuncItemAllowed filter = std::bind(&StockpileSerializer::refuse_type_is_allowed, this, _1); + serialize_list_item_type( + filter, [=](const std::string& token) { + DEBUG(log).print("adding type: %s\n", token.c_str()); + refuse->add_type(token); + }, + mPile->settings.refuse.type); // corpses - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_corpses ( id ); - }, mPile->settings.refuse.corpses ); + refuse_write_helper([=](const std::string& id) { refuse->add_corpses(id); }, + mPile->settings.refuse.corpses); // body_parts - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_body_parts ( id ); - }, mPile->settings.refuse.body_parts ); + refuse_write_helper([=](const std::string& id) { refuse->add_body_parts(id); }, + mPile->settings.refuse.body_parts); // skulls - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_skulls ( id ); - }, mPile->settings.refuse.skulls ); + refuse_write_helper([=](const std::string& id) { refuse->add_skulls(id); }, + mPile->settings.refuse.skulls); // bones - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_bones ( id ); - }, mPile->settings.refuse.bones ); + refuse_write_helper([=](const std::string& id) { refuse->add_bones(id); }, + mPile->settings.refuse.bones); // hair - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_hair ( id ); - }, mPile->settings.refuse.hair ); + refuse_write_helper([=](const std::string& id) { refuse->add_hair(id); }, + mPile->settings.refuse.hair); // shells - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_shells ( id ); - }, mPile->settings.refuse.shells ); + refuse_write_helper([=](const std::string& id) { refuse->add_shells(id); }, + mPile->settings.refuse.shells); // teeth - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_teeth ( id ); - }, mPile->settings.refuse.teeth ); + refuse_write_helper([=](const std::string& id) { refuse->add_teeth(id); }, + mPile->settings.refuse.teeth); // horns - refuse_write_helper ( [=] ( const std::string &id ) - { - refuse->add_horns ( id ); - }, mPile->settings.refuse.horns ); + refuse_write_helper([=](const std::string& id) { refuse->add_horns(id); }, + mPile->settings.refuse.horns); } -void StockpileSerializer::refuse_read_helper ( std::function get_value, size_t list_size, std::vector* pile_list ) -{ +void StockpileSerializer::refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list) { pile_list->clear(); - pile_list->resize ( world->raws.creatures.all.size(), '\0' ); - if ( list_size > 0 ) - { - for ( size_t i = 0; i < list_size; ++i ) - { - const std::string creature_id = get_value ( i ); - const int idx = find_creature ( creature_id ); - const df::creature_raw* creature = find_creature ( idx ); - if ( idx < 0 || !refuse_creature_is_allowed ( creature ) || size_t(idx) >= pile_list->size() ) - { - debug() << "WARNING invalid refuse creature " << creature_id << ", idx=" << idx << endl; + pile_list->resize(world->raws.creatures.all.size(), '\0'); + if (list_size > 0) { + for (size_t i = 0; i < list_size; ++i) { + const std::string creature_id = get_value(i); + const int idx = find_creature(creature_id); + const df::creature_raw* creature = find_creature(idx); + if (idx < 0 || !refuse_creature_is_allowed(creature) || size_t(idx) >= pile_list->size()) { + WARN(log).print("invalid refuse creature %s, idx=%d\n", creature_id.c_str(), idx); continue; } - debug() << " creature " << idx << " is " << creature_id << endl; - pile_list->at ( idx ) = 1; + DEBUG(log).print("creature %d is %s\n", idx, creature_id.c_str()); + pile_list->at(idx) = 1; } } } - - -void StockpileSerializer::read_refuse() -{ - if ( mBuffer.has_refuse() ) - { +void StockpileSerializer::read_refuse() { + if (mBuffer.has_refuse()) { mPile->settings.flags.bits.refuse = 1; const StockpileSettings::RefuseSet refuse = mBuffer.refuse(); - debug() << "refuse: " <settings.refuse.fresh_raw_hide = refuse.fresh_raw_hide(); - mPile->settings.refuse.rotten_raw_hide = refuse.rotten_raw_hide(); + DEBUG(log).print("refuse:\n"); + DEBUG(log).print(" fresh hide %d\n", refuse.fresh_raw_hide()); + DEBUG(log).print(" rotten hide %d\n", refuse.rotten_raw_hide()); + mPile->settings.refuse.fresh_raw_hide = refuse.fresh_raw_hide(); + mPile->settings.refuse.rotten_raw_hide = refuse.rotten_raw_hide(); // type - FuncItemAllowed filter = std::bind ( &StockpileSerializer::refuse_type_is_allowed, this, _1 ); - unserialize_list_item_type ( filter, [=] ( const size_t & idx ) -> const std::string& - { - return refuse.type ( idx ); - }, refuse.type_size(), &mPile->settings.refuse.type ); + FuncItemAllowed filter = std::bind(&StockpileSerializer::refuse_type_is_allowed, this, _1); + unserialize_list_item_type( + filter, [=](const size_t& idx) -> const std::string& { return refuse.type(idx); }, + refuse.type_size(), &mPile->settings.refuse.type); // corpses - debug() << " corpses" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.corpses ( idx ); - }, refuse.corpses_size(), &mPile->settings.refuse.corpses ); + DEBUG(log).print(" corpses\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.corpses(idx); }, + refuse.corpses_size(), &mPile->settings.refuse.corpses); // body_parts - debug() << " body_parts" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.body_parts ( idx ); - }, refuse.body_parts_size(), &mPile->settings.refuse.body_parts ); + DEBUG(log).print(" body_parts\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.body_parts(idx); }, + refuse.body_parts_size(), &mPile->settings.refuse.body_parts); // skulls - debug() << " skulls" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.skulls ( idx ); - }, refuse.skulls_size(), &mPile->settings.refuse.skulls ); + DEBUG(log).print(" skulls\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.skulls(idx); }, + refuse.skulls_size(), &mPile->settings.refuse.skulls); // bones - debug() << " bones" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.bones ( idx ); - }, refuse.bones_size(), &mPile->settings.refuse.bones ); + DEBUG(log).print(" bones\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.bones(idx); }, + refuse.bones_size(), &mPile->settings.refuse.bones); // hair - debug() << " hair" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.hair ( idx ); - }, refuse.hair_size(), &mPile->settings.refuse.hair ); + DEBUG(log).print(" hair\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.hair(idx); }, + refuse.hair_size(), &mPile->settings.refuse.hair); // shells - debug() << " shells" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.shells ( idx ); - }, refuse.shells_size(), &mPile->settings.refuse.shells ); + DEBUG(log).print(" shells\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.shells(idx); }, + refuse.shells_size(), &mPile->settings.refuse.shells); // teeth - debug() << " teeth" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.teeth ( idx ); - }, refuse.teeth_size(), &mPile->settings.refuse.teeth ); + DEBUG(log).print(" teeth\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.teeth(idx); }, + refuse.teeth_size(), &mPile->settings.refuse.teeth); // horns - debug() << " horns" << endl; - refuse_read_helper ( [=] ( const size_t & idx ) -> const std::string& - { - return refuse.horns ( idx ); - }, refuse.horns_size(), &mPile->settings.refuse.horns ); + DEBUG(log).print(" horns\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.horns(idx); }, + refuse.horns_size(), &mPile->settings.refuse.horns); } - else - { + else { mPile->settings.flags.bits.refuse = 0; mPile->settings.refuse.type.clear(); mPile->settings.refuse.corpses.clear(); @@ -1142,287 +941,232 @@ void StockpileSerializer::read_refuse() } } -bool StockpileSerializer::stone_is_allowed ( const MaterialInfo &mi ) -{ - if ( !mi.isValid() ) return false; - const bool is_allowed_soil = mi.inorganic->flags.is_set ( inorganic_flags::SOIL ) && !mi.inorganic->flags.is_set ( inorganic_flags::AQUIFER ); - const bool is_allowed_stone = mi.material->flags.is_set ( material_flags::IS_STONE ) && !mi.material->flags.is_set ( material_flags::NO_STONE_STOCKPILE ); - return is_allowed_soil || is_allowed_stone; +bool StockpileSerializer::stone_is_allowed(const MaterialInfo& mi) { + if (!mi.isValid()) + return false; + const bool is_allowed_soil = mi.inorganic->flags.is_set(inorganic_flags::SOIL) && !mi.inorganic->flags.is_set(inorganic_flags::AQUIFER); + const bool is_allowed_stone = mi.material->flags.is_set(material_flags::IS_STONE) && !mi.material->flags.is_set(material_flags::NO_STONE_STOCKPILE); + return is_allowed_soil || is_allowed_stone; } -void StockpileSerializer::write_stone() -{ - StockpileSettings::StoneSet *stone= mBuffer.mutable_stone(); +void StockpileSerializer::write_stone() { + StockpileSettings::StoneSet* stone = mBuffer.mutable_stone(); - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::stone_is_allowed, this, _1 ); - serialize_list_material ( filter, [=] ( const std::string &token ) - { - stone->add_mats ( token ); - }, mPile->settings.stone.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::stone_is_allowed, this, _1); + serialize_list_material( + filter, [=](const std::string& token) { stone->add_mats(token); }, + mPile->settings.stone.mats); } -void StockpileSerializer::read_stone() -{ - if ( mBuffer.has_stone() ) - { +void StockpileSerializer::read_stone() { + if (mBuffer.has_stone()) { mPile->settings.flags.bits.stone = 1; const StockpileSettings::StoneSet stone = mBuffer.stone(); - debug() << "stone: " < const std::string& - { - return stone.mats ( idx ); - }, stone.mats_size(), &mPile->settings.stone.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::stone_is_allowed, this, _1); + unserialize_list_material( + filter, [=](const size_t& idx) -> const std::string& { return stone.mats(idx); }, + stone.mats_size(), &mPile->settings.stone.mats); } - else - { + else { mPile->settings.flags.bits.stone = 0; mPile->settings.stone.mats.clear(); } } -bool StockpileSerializer::ammo_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material && mi.material->flags.is_set ( material_flags::IS_METAL ); +bool StockpileSerializer::ammo_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -void StockpileSerializer::write_ammo() -{ - StockpileSettings::AmmoSet *ammo = mBuffer.mutable_ammo(); +void StockpileSerializer::write_ammo() { + StockpileSettings::AmmoSet* ammo = mBuffer.mutable_ammo(); // ammo type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - ammo->add_type ( token ); - }, mPile->settings.ammo.type, - std::vector ( world->raws.itemdefs.ammo.begin(),world->raws.itemdefs.ammo.end() ), - item_type::AMMO ); + serialize_list_itemdef([=](const std::string& token) { ammo->add_type(token); }, + mPile->settings.ammo.type, + std::vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), + item_type::AMMO); // metal - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::ammo_mat_is_allowed, this, _1 ); - serialize_list_material ( filter, [=] ( const std::string &token ) - { - ammo->add_mats ( token ); - }, mPile->settings.ammo.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::ammo_mat_is_allowed, this, _1); + serialize_list_material( + filter, [=](const std::string& token) { ammo->add_mats(token); }, + mPile->settings.ammo.mats); // other mats - only wood and bone - if ( mPile->settings.ammo.other_mats.size() > 2 ) - { - debug() << "WARNING: ammo other materials > 2! " << mPile->settings.ammo.other_mats.size() << endl; + if (mPile->settings.ammo.other_mats.size() > 2) { + WARN(log).print("ammo other materials > 2: %zd\n", mPile->settings.ammo.other_mats.size()); } - for ( size_t i = 0; i < std::min ( size_t ( 2 ), mPile->settings.ammo.other_mats.size() ); ++i ) - { - if ( !mPile->settings.ammo.other_mats.at ( i ) ) + for (size_t i = 0; i < std::min(size_t(2), mPile->settings.ammo.other_mats.size()); ++i) { + if (!mPile->settings.ammo.other_mats.at(i)) continue; - const std::string token = i == 0 ? "WOOD" : "BONE"; - ammo->add_other_mats ( token ); - debug() << " other mats " << i << " is " << token << endl; + const std::string token = i == 0 ? "WOOD" : "BONE"; + ammo->add_other_mats(token); + DEBUG(log).print(" other mats %zd is %s\n", i, token.c_str()); } // quality core - serialize_list_quality ( [=] ( const std::string &token ) - { - ammo->add_quality_core ( token ); - }, mPile->settings.ammo.quality_core ); + serialize_list_quality([=](const std::string& token) { ammo->add_quality_core(token); }, + mPile->settings.ammo.quality_core); // quality total - serialize_list_quality ( [=] ( const std::string &token ) - { - ammo->add_quality_total ( token ); - }, mPile->settings.ammo.quality_total ); + serialize_list_quality([=](const std::string& token) { ammo->add_quality_total(token); }, + mPile->settings.ammo.quality_total); } -void StockpileSerializer::read_ammo() -{ - if ( mBuffer.has_ammo() ) - { +void StockpileSerializer::read_ammo() { + if (mBuffer.has_ammo()) { mPile->settings.flags.bits.ammo = 1; const StockpileSettings::AmmoSet ammo = mBuffer.ammo(); - debug() << "ammo: " < const std::string& - { - return ammo.type ( idx ); - }, ammo.type_size(), &mPile->settings.ammo.type, item_type::AMMO ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return ammo.type(idx); }, + ammo.type_size(), &mPile->settings.ammo.type, item_type::AMMO); // materials metals - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::ammo_mat_is_allowed, this, _1 ); - unserialize_list_material ( filter, [=] ( const size_t & idx ) -> const std::string& - { - return ammo.mats ( idx ); - }, ammo.mats_size(), &mPile->settings.ammo.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::ammo_mat_is_allowed, this, _1); + unserialize_list_material( + filter, [=](const size_t& idx) -> const std::string& { return ammo.mats(idx); }, + ammo.mats_size(), &mPile->settings.ammo.mats); // others mPile->settings.ammo.other_mats.clear(); - mPile->settings.ammo.other_mats.resize ( 2, '\0' ); - if ( ammo.other_mats_size() > 0 ) - { + mPile->settings.ammo.other_mats.resize(2, '\0'); + if (ammo.other_mats_size() > 0) { // TODO remove hardcoded value - for ( int i = 0; i < ammo.other_mats_size(); ++i ) - { - const std::string token = ammo.other_mats ( i ); - const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 : -1; - debug() << " other mats " << idx << " is " << token << endl; - if ( idx != -1 ) - mPile->settings.ammo.other_mats.at ( idx ) = 1; + for (int i = 0; i < ammo.other_mats_size(); ++i) { + const std::string token = ammo.other_mats(i); + const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 + : -1; + DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); + if (idx != -1) + mPile->settings.ammo.other_mats.at(idx) = 1; } } // core quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return ammo.quality_core ( idx ); - }, ammo.quality_core_size(), mPile->settings.ammo.quality_core ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return ammo.quality_core(idx); }, + ammo.quality_core_size(), mPile->settings.ammo.quality_core); // total quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return ammo.quality_total ( idx ); - }, ammo.quality_total_size(), mPile->settings.ammo.quality_total ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return ammo.quality_total(idx); }, + ammo.quality_total_size(), mPile->settings.ammo.quality_total); } - else - { + else { mPile->settings.flags.bits.ammo = 0; mPile->settings.ammo.type.clear(); mPile->settings.ammo.mats.clear(); mPile->settings.ammo.other_mats.clear(); - quality_clear ( mPile->settings.ammo.quality_core ); - quality_clear ( mPile->settings.ammo.quality_total ); + quality_clear(mPile->settings.ammo.quality_core); + quality_clear(mPile->settings.ammo.quality_total); } } -bool StockpileSerializer::coins_mat_is_allowed ( const MaterialInfo &mi ) -{ +bool StockpileSerializer::coins_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid(); } -void StockpileSerializer::write_coins() -{ - StockpileSettings::CoinSet *coins = mBuffer.mutable_coin(); - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::coins_mat_is_allowed, this, _1 ); - serialize_list_material ( filter, [=] ( const std::string &token ) - { - coins->add_mats ( token ); - }, mPile->settings.coins.mats ); +void StockpileSerializer::write_coins() { + StockpileSettings::CoinSet* coins = mBuffer.mutable_coin(); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::coins_mat_is_allowed, this, _1); + serialize_list_material( + filter, [=](const std::string& token) { coins->add_mats(token); }, + mPile->settings.coins.mats); } -void StockpileSerializer::read_coins() -{ - if ( mBuffer.has_coin() ) - { +void StockpileSerializer::read_coins() { + if (mBuffer.has_coin()) { mPile->settings.flags.bits.coins = 1; const StockpileSettings::CoinSet coins = mBuffer.coin(); - debug() << "coins: " < const std::string& - { - return coins.mats ( idx ); - }, coins.mats_size(), &mPile->settings.coins.mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::coins_mat_is_allowed, this, _1); + unserialize_list_material( + filter, [=](const size_t& idx) -> const std::string& { return coins.mats(idx); }, + coins.mats_size(), &mPile->settings.coins.mats); } - else - { + else { mPile->settings.flags.bits.coins = 0; mPile->settings.coins.mats.clear(); } } -void StockpileSerializer::bars_blocks_setup_other_mats() -{ - mOtherMatsBars.insert ( std::make_pair ( 0,"COAL" ) ); - mOtherMatsBars.insert ( std::make_pair ( 1,"POTASH" ) ); - mOtherMatsBars.insert ( std::make_pair ( 2,"ASH" ) ); - mOtherMatsBars.insert ( std::make_pair ( 3,"PEARLASH" ) ); - mOtherMatsBars.insert ( std::make_pair ( 4,"SOAP" ) ); +void StockpileSerializer::bars_blocks_setup_other_mats() { + mOtherMatsBars.insert(std::make_pair(0, "COAL")); + mOtherMatsBars.insert(std::make_pair(1, "POTASH")); + mOtherMatsBars.insert(std::make_pair(2, "ASH")); + mOtherMatsBars.insert(std::make_pair(3, "PEARLASH")); + mOtherMatsBars.insert(std::make_pair(4, "SOAP")); - mOtherMatsBlocks.insert ( std::make_pair ( 0,"GREEN_GLASS" ) ); - mOtherMatsBlocks.insert ( std::make_pair ( 1,"CLEAR_GLASS" ) ); - mOtherMatsBlocks.insert ( std::make_pair ( 2,"CRYSTAL_GLASS" ) ); - mOtherMatsBlocks.insert ( std::make_pair ( 3,"WOOD" ) ); + mOtherMatsBlocks.insert(std::make_pair(0, "GREEN_GLASS")); + mOtherMatsBlocks.insert(std::make_pair(1, "CLEAR_GLASS")); + mOtherMatsBlocks.insert(std::make_pair(2, "CRYSTAL_GLASS")); + mOtherMatsBlocks.insert(std::make_pair(3, "WOOD")); } -bool StockpileSerializer::bars_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material && mi.material->flags.is_set ( material_flags::IS_METAL ); +bool StockpileSerializer::bars_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -bool StockpileSerializer::blocks_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material - && ( mi.material->flags.is_set ( material_flags::IS_METAL ) - || mi.material->flags.is_set ( material_flags::IS_STONE ) ); +bool StockpileSerializer::blocks_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } - -void StockpileSerializer::write_bars_blocks() -{ - StockpileSettings::BarsBlocksSet *bars_blocks = mBuffer.mutable_barsblocks(); +void StockpileSerializer::write_bars_blocks() { + StockpileSettings::BarsBlocksSet* bars_blocks = mBuffer.mutable_barsblocks(); MaterialInfo mi; - FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::bars_mat_is_allowed, this, _1 ); - serialize_list_material ( filter, [=] ( const std::string &token ) - { - bars_blocks->add_bars_mats ( token ); - }, mPile->settings.bars_blocks.bars_mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::bars_mat_is_allowed, this, _1); + serialize_list_material( + filter, [=](const std::string& token) { bars_blocks->add_bars_mats(token); }, + mPile->settings.bars_blocks.bars_mats); // blocks mats - filter = std::bind ( &StockpileSerializer::blocks_mat_is_allowed, this, _1 ); - serialize_list_material ( filter, [=] ( const std::string &token ) - { - bars_blocks->add_blocks_mats ( token ); - }, mPile->settings.bars_blocks.blocks_mats ); + filter = std::bind(&StockpileSerializer::blocks_mat_is_allowed, this, _1); + serialize_list_material( + filter, [=](const std::string& token) { bars_blocks->add_blocks_mats(token); }, + mPile->settings.bars_blocks.blocks_mats); // bars other mats - serialize_list_other_mats ( mOtherMatsBars, [=] ( const std::string &token ) - { - bars_blocks->add_bars_other_mats ( token ); - }, mPile->settings.bars_blocks.bars_other_mats ); + serialize_list_other_mats( + mOtherMatsBars, [=](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, + mPile->settings.bars_blocks.bars_other_mats); // blocks other mats - serialize_list_other_mats ( mOtherMatsBlocks, [=] ( const std::string &token ) - { - bars_blocks->add_blocks_other_mats ( token ); - }, mPile->settings.bars_blocks.blocks_other_mats ); + serialize_list_other_mats( + mOtherMatsBlocks, [=](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, + mPile->settings.bars_blocks.blocks_other_mats); } -void StockpileSerializer::read_bars_blocks() -{ - if ( mBuffer.has_barsblocks() ) - { +void StockpileSerializer::read_bars_blocks() { + if (mBuffer.has_barsblocks()) { mPile->settings.flags.bits.bars_blocks = 1; const StockpileSettings::BarsBlocksSet bars_blocks = mBuffer.barsblocks(); - debug() << "bars_blocks: " < const std::string& - { - return bars_blocks.bars_mats ( idx ); - }, bars_blocks.bars_mats_size(), &mPile->settings.bars_blocks.bars_mats ); + FuncMaterialAllowed filter = std::bind(&StockpileSerializer::bars_mat_is_allowed, this, _1); + unserialize_list_material( + filter, [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_mats(idx); }, + bars_blocks.bars_mats_size(), &mPile->settings.bars_blocks.bars_mats); // blocks - filter = std::bind ( &StockpileSerializer::blocks_mat_is_allowed, this, _1 ); - unserialize_list_material ( filter, [=] ( const size_t & idx ) -> const std::string& - { - return bars_blocks.blocks_mats ( idx ); - }, bars_blocks.blocks_mats_size(), &mPile->settings.bars_blocks.blocks_mats ); + filter = std::bind(&StockpileSerializer::blocks_mat_is_allowed, this, _1); + unserialize_list_material( + filter, [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_mats(idx); }, + bars_blocks.blocks_mats_size(), &mPile->settings.bars_blocks.blocks_mats); // bars other mats - unserialize_list_other_mats ( mOtherMatsBars, [=] ( const size_t & idx ) -> const std::string& - { - return bars_blocks.bars_other_mats ( idx ); - }, bars_blocks.bars_other_mats_size(), &mPile->settings.bars_blocks.bars_other_mats ); - + unserialize_list_other_mats( + mOtherMatsBars, [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_other_mats(idx); }, + bars_blocks.bars_other_mats_size(), &mPile->settings.bars_blocks.bars_other_mats); // blocks other mats - unserialize_list_other_mats ( mOtherMatsBlocks, [=] ( const size_t & idx ) -> const std::string& - { - return bars_blocks.blocks_other_mats ( idx ); - }, bars_blocks.blocks_other_mats_size(), &mPile->settings.bars_blocks.blocks_other_mats ); - + unserialize_list_other_mats( + mOtherMatsBlocks, [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_other_mats(idx); }, + bars_blocks.blocks_other_mats_size(), &mPile->settings.bars_blocks.blocks_other_mats); } - else - { + else { mPile->settings.flags.bits.bars_blocks = 0; mPile->settings.bars_blocks.bars_other_mats.clear(); mPile->settings.bars_blocks.bars_mats.clear(); @@ -1431,118 +1175,102 @@ void StockpileSerializer::read_bars_blocks() } } -bool StockpileSerializer::gem_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material && mi.material->flags.is_set ( material_flags::IS_GEM ); +bool StockpileSerializer::gem_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_GEM); } -bool StockpileSerializer::gem_cut_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material && ( mi.material->flags.is_set ( material_flags::IS_GEM ) || mi.material->flags.is_set ( material_flags::IS_STONE ) ) ; +bool StockpileSerializer::gem_cut_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::gem_other_mat_is_allowed ( MaterialInfo &mi ) -{ - return mi.isValid() && ( mi.getToken() == "GLASS_GREEN" || mi.getToken() == "GLASS_CLEAR" || mi.getToken() == "GLASS_CRYSTAL" ); +bool StockpileSerializer::gem_other_mat_is_allowed(MaterialInfo& mi) { + return mi.isValid() && (mi.getToken() == "GLASS_GREEN" || mi.getToken() == "GLASS_CLEAR" || mi.getToken() == "GLASS_CRYSTAL"); } -void StockpileSerializer::write_gems() -{ - StockpileSettings::GemsSet *gems = mBuffer.mutable_gems(); +void StockpileSerializer::write_gems() { + StockpileSettings::GemsSet* gems = mBuffer.mutable_gems(); MaterialInfo mi; // rough mats - FuncMaterialAllowed filter_rough = std::bind ( &StockpileSerializer::gem_mat_is_allowed, this, _1 ); - serialize_list_material ( filter_rough, [=] ( const std::string &token ) - { - gems->add_rough_mats ( token ); - }, mPile->settings.gems.rough_mats ); + FuncMaterialAllowed filter_rough = std::bind(&StockpileSerializer::gem_mat_is_allowed, this, _1); + serialize_list_material( + filter_rough, [=](const std::string& token) { gems->add_rough_mats(token); }, + mPile->settings.gems.rough_mats); // cut mats - FuncMaterialAllowed filter_cut = std::bind ( &StockpileSerializer::gem_cut_mat_is_allowed, this, _1 ); - serialize_list_material ( filter_cut, [=] ( const std::string &token ) - { - gems->add_cut_mats ( token ); - }, mPile->settings.gems.cut_mats ); + FuncMaterialAllowed filter_cut = std::bind(&StockpileSerializer::gem_cut_mat_is_allowed, this, _1); + serialize_list_material( + filter_cut, [=](const std::string& token) { gems->add_cut_mats(token); }, + mPile->settings.gems.cut_mats); // rough other - for ( size_t i = 0; i < mPile->settings.gems.rough_other_mats.size(); ++i ) - { - if ( mPile->settings.gems.rough_other_mats.at ( i ) ) - { - mi.decode ( i, -1 ); - if ( !gem_other_mat_is_allowed ( mi ) ) continue; - debug() << " gem rough_other mat" << i << " is " << mi.getToken() << endl; - gems->add_rough_other_mats ( mi.getToken() ); + for (size_t i = 0; i < mPile->settings.gems.rough_other_mats.size(); ++i) { + if (mPile->settings.gems.rough_other_mats.at(i)) { + mi.decode(i, -1); + if (!gem_other_mat_is_allowed(mi)) + continue; + DEBUG(log).print("gem rough_other mat %zd is %s\n", i, mi.getToken().c_str()); + gems->add_rough_other_mats(mi.getToken()); } } // cut other - for ( size_t i = 0; i < mPile->settings.gems.cut_other_mats.size(); ++i ) - { - if ( mPile->settings.gems.cut_other_mats.at ( i ) ) - { - mi.decode ( i, -1 ); - if ( !mi.isValid() ) mi.decode ( 0, i ); - if ( !gem_other_mat_is_allowed ( mi ) ) continue; - debug() << " gem cut_other mat" << i << " is " << mi.getToken() << endl; - gems->add_cut_other_mats ( mi.getToken() ); + for (size_t i = 0; i < mPile->settings.gems.cut_other_mats.size(); ++i) { + if (mPile->settings.gems.cut_other_mats.at(i)) { + mi.decode(i, -1); + if (!mi.isValid()) + mi.decode(0, i); + if (!gem_other_mat_is_allowed(mi)) + continue; + DEBUG(log).print("gem cut_other mat %zd is %s\n", i, mi.getToken().c_str()); + gems->add_cut_other_mats(mi.getToken()); } } } -void StockpileSerializer::read_gems() -{ - if ( mBuffer.has_gems() ) - { +void StockpileSerializer::read_gems() { + if (mBuffer.has_gems()) { mPile->settings.flags.bits.gems = 1; const StockpileSettings::GemsSet gems = mBuffer.gems(); - debug() << "gems: " < const std::string& - { - return gems.rough_mats ( idx ); - }, gems.rough_mats_size(), &mPile->settings.gems.rough_mats ); + FuncMaterialAllowed filter_rough = std::bind(&StockpileSerializer::gem_mat_is_allowed, this, _1); + unserialize_list_material( + filter_rough, [=](const size_t& idx) -> const std::string& { return gems.rough_mats(idx); }, + gems.rough_mats_size(), &mPile->settings.gems.rough_mats); // cut - FuncMaterialAllowed filter_cut = std::bind ( &StockpileSerializer::gem_cut_mat_is_allowed, this, _1 ); - unserialize_list_material ( filter_cut, [=] ( const size_t & idx ) -> const std::string& - { - return gems.cut_mats ( idx ); - }, gems.cut_mats_size(), &mPile->settings.gems.cut_mats ); + FuncMaterialAllowed filter_cut = std::bind(&StockpileSerializer::gem_cut_mat_is_allowed, this, _1); + unserialize_list_material( + filter_cut, [=](const size_t& idx) -> const std::string& { return gems.cut_mats(idx); }, + gems.cut_mats_size(), &mPile->settings.gems.cut_mats); - const size_t builtin_size = std::extentraws.mat_table.builtin ) >::value; + const size_t builtin_size = std::extentraws.mat_table.builtin)>::value; // rough other mPile->settings.gems.rough_other_mats.clear(); - mPile->settings.gems.rough_other_mats.resize ( builtin_size, '\0' ); - for ( int i = 0; i < gems.rough_other_mats_size(); ++i ) - { - const std::string token = gems.rough_other_mats ( i ); + mPile->settings.gems.rough_other_mats.resize(builtin_size, '\0'); + for (int i = 0; i < gems.rough_other_mats_size(); ++i) { + const std::string token = gems.rough_other_mats(i); MaterialInfo mi; - mi.find ( token ); - if ( !mi.isValid() || size_t(mi.type) >= builtin_size ) - { - debug() << "WARNING: invalid gem mat " << token << ". idx=" << mi.type << endl; + mi.find(token); + if (!mi.isValid() || size_t(mi.type) >= builtin_size) { + WARN(log).print("invalid gem mat %s idx=%d\n", token.c_str(), mi.type); continue; } - debug() << " rough_other mats " << mi.type << " is " << token << endl; - mPile->settings.gems.rough_other_mats.at ( mi.type ) = 1; + DEBUG(log).print("rough_other mats %d is %s\n", mi.type, token.c_str()); + mPile->settings.gems.rough_other_mats.at(mi.type) = 1; } // cut other mPile->settings.gems.cut_other_mats.clear(); - mPile->settings.gems.cut_other_mats.resize ( builtin_size, '\0' ); - for ( int i = 0; i < gems.cut_other_mats_size(); ++i ) - { - const std::string token = gems.cut_other_mats ( i ); + mPile->settings.gems.cut_other_mats.resize(builtin_size, '\0'); + for (int i = 0; i < gems.cut_other_mats_size(); ++i) { + const std::string token = gems.cut_other_mats(i); MaterialInfo mi; - mi.find ( token ); - if ( !mi.isValid() || size_t(mi.type) >= builtin_size ) - { - debug() << "WARNING: invalid gem mat " << token << ". idx=" << mi.type << endl; + mi.find(token); + if (!mi.isValid() || size_t(mi.type) >= builtin_size) { + WARN(log).print("invalid gem mat %s idx=%d\n", token.c_str(), mi.type); continue; } - debug() << " cut_other mats " << mi.type << " is " << token << endl; - mPile->settings.gems.cut_other_mats.at ( mi.type ) = 1; + DEBUG(log).print("cut_other mats %d is %s\n", mi.type, token.c_str()); + mPile->settings.gems.cut_other_mats.at(mi.type) = 1; } } - else - { + else { mPile->settings.flags.bits.gems = 0; mPile->settings.gems.cut_other_mats.clear(); mPile->settings.gems.cut_mats.clear(); @@ -1551,10 +1279,8 @@ void StockpileSerializer::read_gems() } } -bool StockpileSerializer::finished_goods_type_is_allowed ( item_type::item_type type ) -{ - switch ( type ) - { +bool StockpileSerializer::finished_goods_type_is_allowed(item_type::item_type type) { + switch (type) { case item_type::CHAIN: case item_type::FLASK: case item_type::GOBLET: @@ -1584,252 +1310,182 @@ bool StockpileSerializer::finished_goods_type_is_allowed ( item_type::item_type default: return false; } - } -void StockpileSerializer::finished_goods_setup_other_mats() -{ - mOtherMatsFinishedGoods.insert ( std::make_pair ( 0,"WOOD" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 1,"PLANT_CLOTH" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 2,"BONE" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 3,"TOOTH" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 4,"HORN" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 5,"PEARL" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 6,"SHELL" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 7,"LEATHER" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 8,"SILK" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 9,"AMBER" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 10,"CORAL" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 11,"GREEN_GLASS" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 12,"CLEAR_GLASS" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 13,"CRYSTAL_GLASS" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 14,"YARN" ) ); - mOtherMatsFinishedGoods.insert ( std::make_pair ( 15,"WAX" ) ); +void StockpileSerializer::finished_goods_setup_other_mats() { + mOtherMatsFinishedGoods.insert(std::make_pair(0, "WOOD")); + mOtherMatsFinishedGoods.insert(std::make_pair(1, "PLANT_CLOTH")); + mOtherMatsFinishedGoods.insert(std::make_pair(2, "BONE")); + mOtherMatsFinishedGoods.insert(std::make_pair(3, "TOOTH")); + mOtherMatsFinishedGoods.insert(std::make_pair(4, "HORN")); + mOtherMatsFinishedGoods.insert(std::make_pair(5, "PEARL")); + mOtherMatsFinishedGoods.insert(std::make_pair(6, "SHELL")); + mOtherMatsFinishedGoods.insert(std::make_pair(7, "LEATHER")); + mOtherMatsFinishedGoods.insert(std::make_pair(8, "SILK")); + mOtherMatsFinishedGoods.insert(std::make_pair(9, "AMBER")); + mOtherMatsFinishedGoods.insert(std::make_pair(10, "CORAL")); + mOtherMatsFinishedGoods.insert(std::make_pair(11, "GREEN_GLASS")); + mOtherMatsFinishedGoods.insert(std::make_pair(12, "CLEAR_GLASS")); + mOtherMatsFinishedGoods.insert(std::make_pair(13, "CRYSTAL_GLASS")); + mOtherMatsFinishedGoods.insert(std::make_pair(14, "YARN")); + mOtherMatsFinishedGoods.insert(std::make_pair(15, "WAX")); } -bool StockpileSerializer::finished_goods_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() - && mi.material - && ( mi.material->flags.is_set ( material_flags::IS_GEM ) - || mi.material->flags.is_set ( material_flags::IS_METAL ) - || mi.material->flags.is_set ( material_flags::IS_STONE ) ) ; +bool StockpileSerializer::finished_goods_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_finished_goods() -{ - StockpileSettings::FinishedGoodsSet *finished_goods = mBuffer.mutable_finished_goods(); +void StockpileSerializer::write_finished_goods() { + StockpileSettings::FinishedGoodsSet* finished_goods = mBuffer.mutable_finished_goods(); // type - FuncItemAllowed filter = std::bind ( &StockpileSerializer::finished_goods_type_is_allowed, this, _1 ); - serialize_list_item_type ( filter, [=] ( const std::string &token ) - { - finished_goods->add_type ( token ); - }, mPile->settings.finished_goods.type ); + FuncItemAllowed filter = std::bind(&StockpileSerializer::finished_goods_type_is_allowed, this, _1); + serialize_list_item_type( + filter, [=](const std::string& token) { finished_goods->add_type(token); }, + mPile->settings.finished_goods.type); // materials - FuncMaterialAllowed mat_filter = std::bind ( &StockpileSerializer::finished_goods_mat_is_allowed, this, _1 ); - serialize_list_material ( mat_filter, [=] ( const std::string &token ) - { - finished_goods->add_mats ( token ); - }, mPile->settings.finished_goods.mats ); + FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::finished_goods_mat_is_allowed, this, _1); + serialize_list_material( + mat_filter, [=](const std::string& token) { finished_goods->add_mats(token); }, + mPile->settings.finished_goods.mats); // other mats - serialize_list_other_mats ( mOtherMatsFinishedGoods, [=] ( const std::string &token ) - { - finished_goods->add_other_mats ( token ); - }, mPile->settings.finished_goods.other_mats ); + serialize_list_other_mats( + mOtherMatsFinishedGoods, [=](const std::string& token) { finished_goods->add_other_mats(token); }, + mPile->settings.finished_goods.other_mats); // quality core - serialize_list_quality ( [=] ( const std::string &token ) - { - finished_goods->add_quality_core ( token ); - }, mPile->settings.finished_goods.quality_core ); + serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_core(token); }, + mPile->settings.finished_goods.quality_core); // quality total - serialize_list_quality ( [=] ( const std::string &token ) - { - finished_goods->add_quality_total ( token ); - }, mPile->settings.finished_goods.quality_total ); + serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_total(token); }, + mPile->settings.finished_goods.quality_total); } -void StockpileSerializer::read_finished_goods() -{ - if ( mBuffer.has_finished_goods() ) - { +void StockpileSerializer::read_finished_goods() { + if (mBuffer.has_finished_goods()) { mPile->settings.flags.bits.finished_goods = 1; const StockpileSettings::FinishedGoodsSet finished_goods = mBuffer.finished_goods(); - debug() << "finished_goods: " < const std::string& - { - return finished_goods.type ( idx ); - }, finished_goods.type_size(), &mPile->settings.finished_goods.type ); + FuncItemAllowed filter = std::bind(&StockpileSerializer::finished_goods_type_is_allowed, this, _1); + unserialize_list_item_type( + filter, [=](const size_t& idx) -> const std::string& { return finished_goods.type(idx); }, + finished_goods.type_size(), &mPile->settings.finished_goods.type); // materials - FuncMaterialAllowed mat_filter = std::bind ( &StockpileSerializer::finished_goods_mat_is_allowed, this, _1 ); - unserialize_list_material ( mat_filter, [=] ( const size_t & idx ) -> const std::string& - { - return finished_goods.mats ( idx ); - }, finished_goods.mats_size(), &mPile->settings.finished_goods.mats ); + FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::finished_goods_mat_is_allowed, this, _1); + unserialize_list_material( + mat_filter, [=](const size_t& idx) -> const std::string& { return finished_goods.mats(idx); }, + finished_goods.mats_size(), &mPile->settings.finished_goods.mats); // other mats - unserialize_list_other_mats ( mOtherMatsFinishedGoods, [=] ( const size_t & idx ) -> const std::string& - { - return finished_goods.other_mats ( idx ); - }, finished_goods.other_mats_size(), &mPile->settings.finished_goods.other_mats ); + unserialize_list_other_mats( + mOtherMatsFinishedGoods, [=](const size_t& idx) -> const std::string& { return finished_goods.other_mats(idx); }, + finished_goods.other_mats_size(), &mPile->settings.finished_goods.other_mats); // core quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return finished_goods.quality_core ( idx ); - }, finished_goods.quality_core_size(), mPile->settings.finished_goods.quality_core ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_core(idx); }, + finished_goods.quality_core_size(), mPile->settings.finished_goods.quality_core); // total quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return finished_goods.quality_total ( idx ); - }, finished_goods.quality_total_size(), mPile->settings.finished_goods.quality_total ); - + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_total(idx); }, + finished_goods.quality_total_size(), mPile->settings.finished_goods.quality_total); } - else - { + else { mPile->settings.flags.bits.finished_goods = 0; mPile->settings.finished_goods.type.clear(); mPile->settings.finished_goods.other_mats.clear(); mPile->settings.finished_goods.mats.clear(); - quality_clear ( mPile->settings.finished_goods.quality_core ); - quality_clear ( mPile->settings.finished_goods.quality_total ); + quality_clear(mPile->settings.finished_goods.quality_core); + quality_clear(mPile->settings.finished_goods.quality_total); } } -void StockpileSerializer::write_leather() -{ - StockpileSettings::LeatherSet *leather = mBuffer.mutable_leather(); +void StockpileSerializer::write_leather() { + StockpileSettings::LeatherSet* leather = mBuffer.mutable_leather(); - FuncWriteExport setter = [=] ( const std::string &id ) - { - leather->add_mats ( id ); + FuncWriteExport setter = [=](const std::string& id) { + leather->add_mats(id); }; - serialize_list_organic_mat ( setter, &mPile->settings.leather.mats, organic_mat_category::Leather ); + serialize_list_organic_mat(setter, &mPile->settings.leather.mats, organic_mat_category::Leather); } -void StockpileSerializer::read_leather() -{ - if ( mBuffer.has_leather() ) - { +void StockpileSerializer::read_leather() { + if (mBuffer.has_leather()) { mPile->settings.flags.bits.leather = 1; const StockpileSettings::LeatherSet leather = mBuffer.leather(); - debug() << "leather: " < std::string - { - return leather.mats ( idx ); - }, leather.mats_size(), &mPile->settings.leather.mats, organic_mat_category::Leather ); + unserialize_list_organic_mat([=](size_t idx) -> std::string { return leather.mats(idx); }, + leather.mats_size(), &mPile->settings.leather.mats, organic_mat_category::Leather); } - else - { + else { mPile->settings.flags.bits.leather = 0; mPile->settings.leather.mats.clear(); } } -void StockpileSerializer::write_cloth() -{ - StockpileSettings::ClothSet * cloth = mBuffer.mutable_cloth(); +void StockpileSerializer::write_cloth() { + StockpileSettings::ClothSet* cloth = mBuffer.mutable_cloth(); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_thread_silk ( token ); - }, &mPile->settings.cloth.thread_silk, organic_mat_category::Silk ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_silk(token); }, + &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_thread_plant ( token ); - }, &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_plant(token); }, + &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_thread_yarn ( token ); - }, &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_yarn(token); }, + &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_thread_metal ( token ); - }, &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread ); - - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_cloth_silk ( token ); - }, &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_metal(token); }, + &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_cloth_plant ( token ); - }, &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_silk(token); }, + &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_cloth_yarn ( token ); - }, &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_plant(token); }, + &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber); - serialize_list_organic_mat ( [=] ( const std::string &token ) - { - cloth->add_cloth_metal ( token ); - }, &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread ); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_yarn(token); }, + &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn); + serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_metal(token); }, + &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); } -void StockpileSerializer::read_cloth() -{ - if ( mBuffer.has_cloth() ) - { +void StockpileSerializer::read_cloth() { + if (mBuffer.has_cloth()) { mPile->settings.flags.bits.cloth = 1; const StockpileSettings::ClothSet cloth = mBuffer.cloth(); - debug() << "cloth: " < std::string - { - return cloth.thread_silk ( idx ); - }, cloth.thread_silk_size(), &mPile->settings.cloth.thread_silk, organic_mat_category::Silk ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.thread_plant ( idx ); - }, cloth.thread_plant_size(), &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.thread_yarn ( idx ); - }, cloth.thread_yarn_size(), &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.thread_metal ( idx ); - }, cloth.thread_metal_size(), &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.cloth_silk ( idx ); - }, cloth.cloth_silk_size(), &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.cloth_plant ( idx ); - }, cloth.cloth_plant_size(), &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.cloth_yarn ( idx ); - }, cloth.cloth_yarn_size(), &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn ); - - unserialize_list_organic_mat ( [=] ( size_t idx ) -> std::string - { - return cloth.cloth_metal ( idx ); - }, cloth.cloth_metal_size(), &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread ); - } - else - { + DEBUG(log).print("cloth:\n"); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_silk(idx); }, + cloth.thread_silk_size(), &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_plant(idx); }, + cloth.thread_plant_size(), &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_yarn(idx); }, + cloth.thread_yarn_size(), &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_metal(idx); }, + cloth.thread_metal_size(), &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_silk(idx); }, + cloth.cloth_silk_size(), &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_plant(idx); }, + cloth.cloth_plant_size(), &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_yarn(idx); }, + cloth.cloth_yarn_size(), &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_metal(idx); }, + cloth.cloth_metal_size(), &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); + } + else { mPile->settings.cloth.thread_metal.clear(); mPile->settings.cloth.thread_plant.clear(); mPile->settings.cloth.thread_silk.clear(); @@ -1842,354 +1498,274 @@ void StockpileSerializer::read_cloth() } } -bool StockpileSerializer::wood_mat_is_allowed ( const df::plant_raw * plant ) -{ - return plant && plant->flags.is_set ( plant_raw_flags::TREE ); +bool StockpileSerializer::wood_mat_is_allowed(const df::plant_raw* plant) { + return plant && plant->flags.is_set(plant_raw_flags::TREE); } -void StockpileSerializer::write_wood() -{ - StockpileSettings::WoodSet * wood = mBuffer.mutable_wood(); - for ( size_t i = 0; i < mPile->settings.wood.mats.size(); ++i ) - { - if ( mPile->settings.wood.mats.at ( i ) ) - { - const df::plant_raw * plant = find_plant ( i ); - if ( !wood_mat_is_allowed ( plant ) ) continue; - wood->add_mats ( plant->id ); - debug() << " plant " << i << " is " << plant->id << endl; +void StockpileSerializer::write_wood() { + StockpileSettings::WoodSet* wood = mBuffer.mutable_wood(); + for (size_t i = 0; i < mPile->settings.wood.mats.size(); ++i) { + if (mPile->settings.wood.mats.at(i)) { + const df::plant_raw* plant = find_plant(i); + if (!wood_mat_is_allowed(plant)) + continue; + wood->add_mats(plant->id); + DEBUG(log).print("plant %zd is %s\n", i, plant->id.c_str()); } } } -void StockpileSerializer::read_wood() -{ - if ( mBuffer.has_wood() ) - { +void StockpileSerializer::read_wood() { + if (mBuffer.has_wood()) { mPile->settings.flags.bits.wood = 1; const StockpileSettings::WoodSet wood = mBuffer.wood(); - debug() << "wood: " <settings.wood.mats.clear(); - mPile->settings.wood.mats.resize ( world->raws.plants.all.size(), '\0' ); - for ( int i = 0; i < wood.mats_size(); ++i ) - { - const std::string token = wood.mats ( i ); - const size_t idx = find_plant ( token ); - if ( idx < 0 || idx >= mPile->settings.wood.mats.size() ) - { - debug() << "WARNING wood mat index invalid " << token << ", idx=" << idx << endl; + mPile->settings.wood.mats.resize(world->raws.plants.all.size(), '\0'); + for (int i = 0; i < wood.mats_size(); ++i) { + const std::string token = wood.mats(i); + const size_t idx = find_plant(token); + if (idx < 0 || idx >= mPile->settings.wood.mats.size()) { + WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); continue; } - debug() << " plant " << idx << " is " << token << endl; - mPile->settings.wood.mats.at ( idx ) = 1; + DEBUG(log).print("plant %zd is %s\n", idx, token.c_str()); + mPile->settings.wood.mats.at(idx) = 1; } } - else - { + else { mPile->settings.flags.bits.wood = 0; mPile->settings.wood.mats.clear(); } } -bool StockpileSerializer::weapons_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material && ( - mi.material->flags.is_set ( material_flags::IS_METAL ) || - mi.material->flags.is_set ( material_flags::IS_STONE ) ); - +bool StockpileSerializer::weapons_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_weapons() -{ - StockpileSettings::WeaponsSet * weapons = mBuffer.mutable_weapons(); +void StockpileSerializer::write_weapons() { + StockpileSettings::WeaponsSet* weapons = mBuffer.mutable_weapons(); - weapons->set_unusable ( mPile->settings.weapons.unusable ); - weapons->set_usable ( mPile->settings.weapons.usable ); + weapons->set_unusable(mPile->settings.weapons.unusable); + weapons->set_usable(mPile->settings.weapons.usable); // weapon type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - weapons->add_weapon_type ( token ); - }, mPile->settings.weapons.weapon_type, - std::vector ( world->raws.itemdefs.weapons.begin(),world->raws.itemdefs.weapons.end() ), - item_type::WEAPON ); + serialize_list_itemdef([=](const std::string& token) { weapons->add_weapon_type(token); }, + mPile->settings.weapons.weapon_type, + std::vector(world->raws.itemdefs.weapons.begin(), world->raws.itemdefs.weapons.end()), + item_type::WEAPON); // trapcomp type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - weapons->add_trapcomp_type ( token ); - }, mPile->settings.weapons.trapcomp_type, - std::vector ( world->raws.itemdefs.trapcomps.begin(),world->raws.itemdefs.trapcomps.end() ), - item_type::TRAPCOMP ); + serialize_list_itemdef([=](const std::string& token) { weapons->add_trapcomp_type(token); }, + mPile->settings.weapons.trapcomp_type, + std::vector(world->raws.itemdefs.trapcomps.begin(), world->raws.itemdefs.trapcomps.end()), + item_type::TRAPCOMP); // materials - FuncMaterialAllowed mat_filter = std::bind ( &StockpileSerializer::weapons_mat_is_allowed, this, _1 ); - serialize_list_material ( mat_filter, [=] ( const std::string &token ) - { - weapons->add_mats ( token ); - }, mPile->settings.weapons.mats ); + FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::weapons_mat_is_allowed, this, _1); + serialize_list_material( + mat_filter, [=](const std::string& token) { weapons->add_mats(token); }, + mPile->settings.weapons.mats); // other mats - serialize_list_other_mats ( mOtherMatsWeaponsArmor, [=] ( const std::string &token ) - { - weapons->add_other_mats ( token ); - }, mPile->settings.weapons.other_mats ); + serialize_list_other_mats( + mOtherMatsWeaponsArmor, [=](const std::string& token) { weapons->add_other_mats(token); }, + mPile->settings.weapons.other_mats); // quality core - serialize_list_quality ( [=] ( const std::string &token ) - { - weapons->add_quality_core ( token ); - }, mPile->settings.weapons.quality_core ); + serialize_list_quality([=](const std::string& token) { weapons->add_quality_core(token); }, + mPile->settings.weapons.quality_core); // quality total - serialize_list_quality ( [=] ( const std::string &token ) - { - weapons->add_quality_total ( token ); - }, mPile->settings.weapons.quality_total ); + serialize_list_quality([=](const std::string& token) { weapons->add_quality_total(token); }, + mPile->settings.weapons.quality_total); } -void StockpileSerializer::read_weapons() -{ - if ( mBuffer.has_weapons() ) - { +void StockpileSerializer::read_weapons() { + if (mBuffer.has_weapons()) { mPile->settings.flags.bits.weapons = 1; const StockpileSettings::WeaponsSet weapons = mBuffer.weapons(); - debug() << "weapons: " <settings.weapons.unusable = unusable; mPile->settings.weapons.usable = usable; // weapon type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return weapons.weapon_type ( idx ); - }, weapons.weapon_type_size(), &mPile->settings.weapons.weapon_type, item_type::WEAPON ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return weapons.weapon_type(idx); }, + weapons.weapon_type_size(), &mPile->settings.weapons.weapon_type, item_type::WEAPON); // trapcomp type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return weapons.trapcomp_type ( idx ); - }, weapons.trapcomp_type_size(), &mPile->settings.weapons.trapcomp_type, item_type::TRAPCOMP ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return weapons.trapcomp_type(idx); }, + weapons.trapcomp_type_size(), &mPile->settings.weapons.trapcomp_type, item_type::TRAPCOMP); // materials - FuncMaterialAllowed mat_filter = std::bind ( &StockpileSerializer::weapons_mat_is_allowed, this, _1 ); - unserialize_list_material ( mat_filter, [=] ( const size_t & idx ) -> const std::string& - { - return weapons.mats ( idx ); - }, weapons.mats_size(), &mPile->settings.weapons.mats ); + FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::weapons_mat_is_allowed, this, _1); + unserialize_list_material( + mat_filter, [=](const size_t& idx) -> const std::string& { return weapons.mats(idx); }, + weapons.mats_size(), &mPile->settings.weapons.mats); // other mats - unserialize_list_other_mats ( mOtherMatsWeaponsArmor, [=] ( const size_t & idx ) -> const std::string& - { - return weapons.other_mats ( idx ); - }, weapons.other_mats_size(), &mPile->settings.weapons.other_mats ); - + unserialize_list_other_mats( + mOtherMatsWeaponsArmor, [=](const size_t& idx) -> const std::string& { return weapons.other_mats(idx); }, + weapons.other_mats_size(), &mPile->settings.weapons.other_mats); // core quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return weapons.quality_core ( idx ); - }, weapons.quality_core_size(), mPile->settings.weapons.quality_core ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return weapons.quality_core(idx); }, + weapons.quality_core_size(), mPile->settings.weapons.quality_core); // total quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return weapons.quality_total ( idx ); - }, weapons.quality_total_size(), mPile->settings.weapons.quality_total ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return weapons.quality_total(idx); }, + weapons.quality_total_size(), mPile->settings.weapons.quality_total); } - else - { + else { mPile->settings.flags.bits.weapons = 0; mPile->settings.weapons.weapon_type.clear(); mPile->settings.weapons.trapcomp_type.clear(); mPile->settings.weapons.other_mats.clear(); mPile->settings.weapons.mats.clear(); - quality_clear ( mPile->settings.weapons.quality_core ); - quality_clear ( mPile->settings.weapons.quality_total ); + quality_clear(mPile->settings.weapons.quality_core); + quality_clear(mPile->settings.weapons.quality_total); } - } -void StockpileSerializer::weapons_armor_setup_other_mats() -{ - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 0,"WOOD" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 1,"PLANT_CLOTH" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 2,"BONE" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 3,"SHELL" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 4,"LEATHER" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 5,"SILK" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 6,"GREEN_GLASS" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 7,"CLEAR_GLASS" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 8,"CRYSTAL_GLASS" ) ); - mOtherMatsWeaponsArmor.insert ( std::make_pair ( 9,"YARN" ) ); +void StockpileSerializer::weapons_armor_setup_other_mats() { + mOtherMatsWeaponsArmor.insert(std::make_pair(0, "WOOD")); + mOtherMatsWeaponsArmor.insert(std::make_pair(1, "PLANT_CLOTH")); + mOtherMatsWeaponsArmor.insert(std::make_pair(2, "BONE")); + mOtherMatsWeaponsArmor.insert(std::make_pair(3, "SHELL")); + mOtherMatsWeaponsArmor.insert(std::make_pair(4, "LEATHER")); + mOtherMatsWeaponsArmor.insert(std::make_pair(5, "SILK")); + mOtherMatsWeaponsArmor.insert(std::make_pair(6, "GREEN_GLASS")); + mOtherMatsWeaponsArmor.insert(std::make_pair(7, "CLEAR_GLASS")); + mOtherMatsWeaponsArmor.insert(std::make_pair(8, "CRYSTAL_GLASS")); + mOtherMatsWeaponsArmor.insert(std::make_pair(9, "YARN")); } -bool StockpileSerializer::armor_mat_is_allowed ( const MaterialInfo &mi ) -{ - return mi.isValid() && mi.material && mi.material->flags.is_set ( material_flags::IS_METAL ); +bool StockpileSerializer::armor_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -void StockpileSerializer::write_armor() -{ - StockpileSettings::ArmorSet * armor = mBuffer.mutable_armor(); +void StockpileSerializer::write_armor() { + StockpileSettings::ArmorSet* armor = mBuffer.mutable_armor(); - armor->set_unusable ( mPile->settings.armor.unusable ); - armor->set_usable ( mPile->settings.armor.usable ); + armor->set_unusable(mPile->settings.armor.unusable); + armor->set_usable(mPile->settings.armor.usable); // armor type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - armor->add_body ( token ); - }, mPile->settings.armor.body, - std::vector ( world->raws.itemdefs.armor.begin(),world->raws.itemdefs.armor.end() ), - item_type::ARMOR ); + serialize_list_itemdef([=](const std::string& token) { armor->add_body(token); }, + mPile->settings.armor.body, + std::vector(world->raws.itemdefs.armor.begin(), world->raws.itemdefs.armor.end()), + item_type::ARMOR); // helm type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - armor->add_head ( token ); - }, mPile->settings.armor.head, - std::vector ( world->raws.itemdefs.helms.begin(),world->raws.itemdefs.helms.end() ), - item_type::HELM ); + serialize_list_itemdef([=](const std::string& token) { armor->add_head(token); }, + mPile->settings.armor.head, + std::vector(world->raws.itemdefs.helms.begin(), world->raws.itemdefs.helms.end()), + item_type::HELM); // shoes type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - armor->add_feet ( token ); - }, mPile->settings.armor.feet, - std::vector ( world->raws.itemdefs.shoes.begin(),world->raws.itemdefs.shoes.end() ), - item_type::SHOES ); + serialize_list_itemdef([=](const std::string& token) { armor->add_feet(token); }, + mPile->settings.armor.feet, + std::vector(world->raws.itemdefs.shoes.begin(), world->raws.itemdefs.shoes.end()), + item_type::SHOES); // gloves type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - armor->add_hands ( token ); - }, mPile->settings.armor.hands, - std::vector ( world->raws.itemdefs.gloves.begin(),world->raws.itemdefs.gloves.end() ), - item_type::GLOVES ); + serialize_list_itemdef([=](const std::string& token) { armor->add_hands(token); }, + mPile->settings.armor.hands, + std::vector(world->raws.itemdefs.gloves.begin(), world->raws.itemdefs.gloves.end()), + item_type::GLOVES); // pant type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - armor->add_legs ( token ); - }, mPile->settings.armor.legs, - std::vector ( world->raws.itemdefs.pants.begin(),world->raws.itemdefs.pants.end() ), - item_type::PANTS ); + serialize_list_itemdef([=](const std::string& token) { armor->add_legs(token); }, + mPile->settings.armor.legs, + std::vector(world->raws.itemdefs.pants.begin(), world->raws.itemdefs.pants.end()), + item_type::PANTS); // shield type - serialize_list_itemdef ( [=] ( const std::string &token ) - { - armor->add_shield ( token ); - }, mPile->settings.armor.shield, - std::vector ( world->raws.itemdefs.shields.begin(),world->raws.itemdefs.shields.end() ), - item_type::SHIELD ); + serialize_list_itemdef([=](const std::string& token) { armor->add_shield(token); }, + mPile->settings.armor.shield, + std::vector(world->raws.itemdefs.shields.begin(), world->raws.itemdefs.shields.end()), + item_type::SHIELD); // materials - FuncMaterialAllowed mat_filter = std::bind ( &StockpileSerializer::armor_mat_is_allowed, this, _1 ); - serialize_list_material ( mat_filter, [=] ( const std::string &token ) - { - armor->add_mats ( token ); - }, mPile->settings.armor.mats ); + FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::armor_mat_is_allowed, this, _1); + serialize_list_material( + mat_filter, [=](const std::string& token) { armor->add_mats(token); }, + mPile->settings.armor.mats); // other mats - serialize_list_other_mats ( mOtherMatsWeaponsArmor, [=] ( const std::string &token ) - { - armor->add_other_mats ( token ); - }, mPile->settings.armor.other_mats ); + serialize_list_other_mats( + mOtherMatsWeaponsArmor, [=](const std::string& token) { armor->add_other_mats(token); }, + mPile->settings.armor.other_mats); // quality core - serialize_list_quality ( [=] ( const std::string &token ) - { - armor->add_quality_core ( token ); - }, mPile->settings.armor.quality_core ); + serialize_list_quality([=](const std::string& token) { armor->add_quality_core(token); }, + mPile->settings.armor.quality_core); // quality total - serialize_list_quality ( [=] ( const std::string &token ) - { - armor->add_quality_total ( token ); - }, mPile->settings.armor.quality_total ); + serialize_list_quality([=](const std::string& token) { armor->add_quality_total(token); }, + mPile->settings.armor.quality_total); } -void StockpileSerializer::read_armor() -{ - if ( mBuffer.has_armor() ) - { +void StockpileSerializer::read_armor() { + if (mBuffer.has_armor()) { mPile->settings.flags.bits.armor = 1; const StockpileSettings::ArmorSet armor = mBuffer.armor(); - debug() << "armor: " <settings.armor.unusable = unusable; mPile->settings.armor.usable = usable; // body type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.body ( idx ); - }, armor.body_size(), &mPile->settings.armor.body, item_type::ARMOR ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.body(idx); }, + armor.body_size(), &mPile->settings.armor.body, item_type::ARMOR); // head type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.head ( idx ); - }, armor.head_size(), &mPile->settings.armor.head, item_type::HELM ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.head(idx); }, + armor.head_size(), &mPile->settings.armor.head, item_type::HELM); // feet type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.feet ( idx ); - }, armor.feet_size(), &mPile->settings.armor.feet, item_type::SHOES ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.feet(idx); }, + armor.feet_size(), &mPile->settings.armor.feet, item_type::SHOES); // hands type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.hands ( idx ); - }, armor.hands_size(), &mPile->settings.armor.hands, item_type::GLOVES ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.hands(idx); }, + armor.hands_size(), &mPile->settings.armor.hands, item_type::GLOVES); // legs type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.legs ( idx ); - }, armor.legs_size(), &mPile->settings.armor.legs, item_type::PANTS ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.legs(idx); }, + armor.legs_size(), &mPile->settings.armor.legs, item_type::PANTS); // shield type - unserialize_list_itemdef ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.shield ( idx ); - }, armor.shield_size(), &mPile->settings.armor.shield, item_type::SHIELD ); + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.shield(idx); }, + armor.shield_size(), &mPile->settings.armor.shield, item_type::SHIELD); // materials - FuncMaterialAllowed mat_filter = std::bind ( &StockpileSerializer::armor_mat_is_allowed, this, _1 ); - unserialize_list_material ( mat_filter, [=] ( const size_t & idx ) -> const std::string& - { - return armor.mats ( idx ); - }, armor.mats_size(), &mPile->settings.armor.mats ); + FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::armor_mat_is_allowed, this, _1); + unserialize_list_material( + mat_filter, [=](const size_t& idx) -> const std::string& { return armor.mats(idx); }, + armor.mats_size(), &mPile->settings.armor.mats); // other mats - unserialize_list_other_mats ( mOtherMatsWeaponsArmor, [=] ( const size_t & idx ) -> const std::string& - { - return armor.other_mats ( idx ); - }, armor.other_mats_size(), &mPile->settings.armor.other_mats ); + unserialize_list_other_mats( + mOtherMatsWeaponsArmor, [=](const size_t& idx) -> const std::string& { return armor.other_mats(idx); }, + armor.other_mats_size(), &mPile->settings.armor.other_mats); // core quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.quality_core ( idx ); - }, armor.quality_core_size(), mPile->settings.armor.quality_core ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_core(idx); }, + armor.quality_core_size(), mPile->settings.armor.quality_core); // total quality - unserialize_list_quality ( [=] ( const size_t & idx ) -> const std::string& - { - return armor.quality_total ( idx ); - }, armor.quality_total_size(), mPile->settings.armor.quality_total ); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_total(idx); }, + armor.quality_total_size(), mPile->settings.armor.quality_total); } - else - { + else { mPile->settings.flags.bits.armor = 0; mPile->settings.armor.body.clear(); mPile->settings.armor.head.clear(); @@ -2199,7 +1775,7 @@ void StockpileSerializer::read_armor() mPile->settings.armor.shield.clear(); mPile->settings.armor.other_mats.clear(); mPile->settings.armor.mats.clear(); - quality_clear ( mPile->settings.armor.quality_core ); - quality_clear ( mPile->settings.armor.quality_total ); + quality_clear(mPile->settings.armor.quality_core); + quality_clear(mPile->settings.armor.quality_total); } } diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index ff0a38241..3fe2087de 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -1,349 +1,283 @@ #pragma once -// stockpiles plugin -#include "proto/stockpiles.pb.h" - -// dfhack #include "modules/Materials.h" -#include "modules/Items.h" -// df -#include "df/world.h" -#include "df/world_data.h" +#include "df/itemdef.h" #include "df/organic_mat_category.h" -#include "df/furniture_type.h" -#include "df/item_quality.h" -#include "df/item_type.h" - -// stl -#include -#include -#include -#include - -namespace df { -struct building_stockpilest; -} +#include "proto/stockpiles.pb.h" -/** - * Null buffer that acts like /dev/null for when debug is disabled - */ -class NullBuffer : public std::streambuf -{ -public: - int overflow ( int c ); -}; +#include -class NullStream : public std::ostream +namespace df { -public: - NullStream(); -private: - NullBuffer m_sb; -}; - + struct building_stockpilest; +} /** * Class for serializing the stockpile_settings structure into a Google protobuf */ -class StockpileSerializer -{ +class StockpileSerializer { public: - /** - * @param out for debugging - * @param stockpile stockpile to read or write settings to - */ - - StockpileSerializer ( df::building_stockpilest * stockpile ); - - ~StockpileSerializer(); + /** + * @param out for debugging + * @param stockpile stockpile to read or write settings to + */ - void enable_debug ( std::ostream &out ); + StockpileSerializer(df::building_stockpilest* stockpile); - /** - * Since we depend on protobuf-lite, not the full lib, we copy this function from - * protobuf message.cc - */ - bool serialize_to_ostream(std::ostream* output); + ~StockpileSerializer(); - /** - * Will serialize stockpile settings to a file (overwrites existing files) - * @return success/failure - */ - bool serialize_to_file ( const std::string & file ); + /** + * Since we depend on protobuf-lite, not the full lib, we copy this function from + * protobuf message.cc + */ + bool serialize_to_ostream(std::ostream* output); - /** - * Again, copied from message.cc - */ - bool parse_from_istream(std::istream* input); + /** + * Will serialize stockpile settings to a file (overwrites existing files) + * @return success/failure + */ + bool serialize_to_file(const std::string& file); + /** + * Again, copied from message.cc + */ + bool parse_from_istream(std::istream* input); - /** - * Read stockpile settings from file - */ - bool unserialize_from_file ( const std::string & file ); + /** + * Read stockpile settings from file + */ + bool unserialize_from_file(const std::string& file); private: + df::building_stockpilest* mPile; + dfstockpiles::StockpileSettings mBuffer; + std::map mOtherMatsFurniture; + std::map mOtherMatsFinishedGoods; + std::map mOtherMatsBars; + std::map mOtherMatsBlocks; + std::map mOtherMatsWeaponsArmor; + + /** + read memory structures and serialize to protobuf + */ + void write(); + + // parse serialized data into ui indices + void read(); + + /** + * Find an enum's value based off the string label. + * @param traits the enum's trait struct + * @param token the string value in key_table + * @return the enum's value, -1 if not found + */ + template + static typename df::enum_traits::base_type linear_index(df::enum_traits traits, const std::string& token) { + auto j = traits.first_item_value; + auto limit = traits.last_item_value; + // sometimes enums start at -1, which is bad news for array indexing + if (j < 0) { + j += abs(traits.first_item_value); + limit += abs(traits.first_item_value); + } + for (; j <= limit; ++j) { + if (token.compare(traits.key_table[j]) == 0) + return j; + } + return -1; + } + + // read the token from the serailized list during import + typedef std::function FuncReadImport; + // add the token to the serialized list during export + typedef std::function FuncWriteExport; + // are item's of item_type allowed? + typedef std::function FuncItemAllowed; + // is this material allowed? + typedef std::function FuncMaterialAllowed; + + // convenient struct for parsing food stockpile items + struct food_pair { + // exporting + FuncWriteExport set_value; + std::vector* stockpile_values; + // importing + FuncReadImport get_value; + size_t serialized_count; + bool valid; + + food_pair(FuncWriteExport s, std::vector* sp_v, FuncReadImport g, size_t count) + : set_value(s), stockpile_values(sp_v), get_value(g), serialized_count(count), valid(true) { } + food_pair(): valid(false) { } + }; + + /** + * There are many repeated (un)serialization cases throughout the stockpile_settings structure, + * so the most common cases have been generalized into generic functions using lambdas. + * + * The basic process to serialize a stockpile_settings structure is: + * 1. loop through the list + * 2. for every element that is TRUE: + * 3. map the specific stockpile_settings index into a general material, creature, etc index + * 4. verify that type is allowed in the list (e.g., no stone in gems stockpiles) + * 5. add it to the protobuf using FuncWriteExport + * + * The unserialization process is the same in reverse. + */ + void serialize_list_organic_mat(FuncWriteExport add_value, const std::vector* list, df::enums::organic_mat_category::organic_mat_category cat); + + /** + * @see serialize_list_organic_mat + */ + void unserialize_list_organic_mat(FuncReadImport get_value, size_t list_size, std::vector* pile_list, df::enums::organic_mat_category::organic_mat_category cat); + + /** + * @see serialize_list_organic_mat + */ + void serialize_list_item_type(FuncItemAllowed is_allowed, FuncWriteExport add_value, const std::vector& list); + + /** + * @see serialize_list_organic_mat + */ + void unserialize_list_item_type(FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list); + + /** + * @see serialize_list_organic_mat + */ + void serialize_list_material(FuncMaterialAllowed is_allowed, FuncWriteExport add_value, const std::vector& list); + + /** + * @see serialize_list_organic_mat + */ + void unserialize_list_material(FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list); + + /** + * @see serialize_list_organic_mat + */ + void serialize_list_quality(FuncWriteExport add_value, const bool(&quality_list)[7]); + + /** + * Set all values in a bool[7] to false + */ + void quality_clear(bool(&pile_list)[7]); + + /** + * @see serialize_list_organic_mat + */ + void unserialize_list_quality(FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]); + + /** + * @see serialize_list_organic_mat + */ + void serialize_list_other_mats(const std::map other_mats, FuncWriteExport add_value, std::vector list); + + /** + * @see serialize_list_organic_mat + */ + void unserialize_list_other_mats(const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector* pile_list); + + /** + * @see serialize_list_organic_mat + */ + void serialize_list_itemdef(FuncWriteExport add_value, std::vector list, std::vector items, df::enums::item_type::item_type type); + + /** + * @see serialize_list_organic_mat + */ + void unserialize_list_itemdef(FuncReadImport read_value, int32_t list_size, std::vector* pile_list, df::enums::item_type::item_type type); + + /** + * Given a list of other_materials and an index, return its corresponding token + * @return empty string if not found + * @see other_mats_token + */ + std::string other_mats_index(const std::map other_mats, int idx); + + /** + * Given a list of other_materials and a token, return its corresponding index + * @return -1 if not found + * @see other_mats_index + */ + int other_mats_token(const std::map other_mats, const std::string& token); + + void write_general(); + void read_general(); + + void write_animals(); + void read_animals(); - bool mDebug; - std::ostream * mOut; - NullStream mNull; - df::building_stockpilest * mPile; - dfstockpiles::StockpileSettings mBuffer; - std::map mOtherMatsFurniture; - std::map mOtherMatsFinishedGoods; - std::map mOtherMatsBars; - std::map mOtherMatsBlocks; - std::map mOtherMatsWeaponsArmor; - - - std::ostream & debug(); - - /** - read memory structures and serialize to protobuf - */ - void write(); - - // parse serialized data into ui indices - void read (); - - /** - * Find an enum's value based off the string label. - * @param traits the enum's trait struct - * @param token the string value in key_table - * @return the enum's value, -1 if not found - */ - template - static typename df::enum_traits::base_type linear_index ( std::ostream & out, df::enum_traits traits, const std::string &token ) - { - auto j = traits.first_item_value; - auto limit = traits.last_item_value; - // sometimes enums start at -1, which is bad news for array indexing - if ( j < 0 ) - { - j += abs ( traits.first_item_value ); - limit += abs ( traits.first_item_value ); - } - for ( ; j <= limit; ++j ) - { - // out << " linear_index("<< token <<") = table["< FuncReadImport; - // add the token to the serialized list during export - typedef std::function FuncWriteExport; - // are item's of item_type allowed? - typedef std::function FuncItemAllowed; - // is this material allowed? - typedef std::function FuncMaterialAllowed; - - // convenient struct for parsing food stockpile items - struct food_pair - { - // exporting - FuncWriteExport set_value; - std::vector * stockpile_values; - // importing - FuncReadImport get_value; - size_t serialized_count; - bool valid; - - food_pair ( FuncWriteExport s, std::vector* sp_v, FuncReadImport g, size_t count ) - : set_value ( s ) - , stockpile_values ( sp_v ) - , get_value ( g ) - , serialized_count ( count ) - , valid ( true ) - {} - food_pair(): valid( false ) {} - }; - - /** - * There are many repeated (un)serialization cases throughout the stockpile_settings structure, - * so the most common cases have been generalized into generic functions using lambdas. - * - * The basic process to serialize a stockpile_settings structure is: - * 1. loop through the list - * 2. for every element that is TRUE: - * 3. map the specific stockpile_settings index into a general material, creature, etc index - * 4. verify that type is allowed in the list (e.g., no stone in gems stockpiles) - * 5. add it to the protobuf using FuncWriteExport - * - * The unserialization process is the same in reverse. - */ - void serialize_list_organic_mat ( FuncWriteExport add_value, const std::vector * list, df::enums::organic_mat_category::organic_mat_category cat ); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_organic_mat ( FuncReadImport get_value, size_t list_size, std::vector *pile_list, df::enums::organic_mat_category::organic_mat_category cat ); - - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_item_type ( FuncItemAllowed is_allowed, FuncWriteExport add_value, const std::vector &list ); - - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_item_type ( FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector *pile_list ); - - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_material ( FuncMaterialAllowed is_allowed, FuncWriteExport add_value, const std::vector &list ); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_material ( FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector *pile_list ); - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_quality ( FuncWriteExport add_value, const bool ( &quality_list ) [7] ); - - /** - * Set all values in a bool[7] to false - */ - void quality_clear ( bool ( &pile_list ) [7] ); - + food_pair food_map(df::enums::organic_mat_category::organic_mat_category cat); + + void write_food(); + void read_food(); - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_quality ( FuncReadImport read_value, int32_t list_size, bool ( &pile_list ) [7] ); + void furniture_setup_other_mats(); + void write_furniture(); + bool furniture_mat_is_allowed(const DFHack::MaterialInfo& mi); + void read_furniture(); + bool refuse_creature_is_allowed(const df::creature_raw* raw); - /** - * @see serialize_list_organic_mat - */ - void serialize_list_other_mats ( const std::map other_mats, FuncWriteExport add_value, std::vector list ); + void refuse_write_helper(std::function add_value, const std::vector& list); - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_other_mats ( const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector *pile_list ); + bool refuse_type_is_allowed(df::enums::item_type::item_type type); + void write_refuse(); + void refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list); - /** - * @see serialize_list_organic_mat - */ - void serialize_list_itemdef ( FuncWriteExport add_value, std::vector list, std::vector items, df::enums::item_type::item_type type ); + void read_refuse(); + bool stone_is_allowed(const DFHack::MaterialInfo& mi); - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_itemdef ( FuncReadImport read_value, int32_t list_size, std::vector *pile_list, df::enums::item_type::item_type type ); + void write_stone(); + void read_stone(); - /** - * Given a list of other_materials and an index, return its corresponding token - * @return empty string if not found - * @see other_mats_token - */ - std::string other_mats_index ( const std::map other_mats, int idx ); + bool ammo_mat_is_allowed(const DFHack::MaterialInfo& mi); - /** - * Given a list of other_materials and a token, return its corresponding index - * @return -1 if not found - * @see other_mats_index - */ - int other_mats_token ( const std::map other_mats, const std::string & token ); + void write_ammo(); + void read_ammo(); + bool coins_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_general(); - void read_general(); + void write_coins(); + void read_coins(); - void write_animals(); - void read_animals(); + void bars_blocks_setup_other_mats(); + bool bars_mat_is_allowed(const DFHack::MaterialInfo& mi); - food_pair food_map ( df::enums::organic_mat_category::organic_mat_category cat ); + bool blocks_mat_is_allowed(const DFHack::MaterialInfo& mi); + void write_bars_blocks(); + void read_bars_blocks(); + bool gem_mat_is_allowed(const DFHack::MaterialInfo& mi); + bool gem_cut_mat_is_allowed(const DFHack::MaterialInfo& mi); + bool gem_other_mat_is_allowed(DFHack::MaterialInfo& mi); - void write_food(); - void read_food(); + void write_gems(); - void furniture_setup_other_mats(); - void write_furniture(); - bool furniture_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - void read_furniture(); + void read_gems(); - bool refuse_creature_is_allowed ( const df::creature_raw *raw ); - - - void refuse_write_helper ( std::function add_value, const std::vector & list ); - - - bool refuse_type_is_allowed ( df::enums::item_type::item_type type ); - - - void write_refuse(); - void refuse_read_helper ( std::function get_value, size_t list_size, std::vector* pile_list ); - - void read_refuse(); - - bool stone_is_allowed ( const DFHack::MaterialInfo &mi ); - - void write_stone(); - - void read_stone(); - - bool ammo_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - - void write_ammo(); - void read_ammo(); - bool coins_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - - void write_coins(); - - void read_coins(); - - void bars_blocks_setup_other_mats(); - - bool bars_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - - bool blocks_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - - void write_bars_blocks(); - void read_bars_blocks(); - bool gem_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - bool gem_cut_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - bool gem_other_mat_is_allowed(DFHack::MaterialInfo &mi ); - - void write_gems(); - - void read_gems(); - - bool finished_goods_type_is_allowed ( df::enums::item_type::item_type type ); - void finished_goods_setup_other_mats(); - bool finished_goods_mat_is_allowed ( const DFHack::MaterialInfo &mi ); - void write_finished_goods(); - void read_finished_goods(); - void write_leather(); - void read_leather(); - void write_cloth(); + bool finished_goods_type_is_allowed(df::enums::item_type::item_type type); + void finished_goods_setup_other_mats(); + bool finished_goods_mat_is_allowed(const DFHack::MaterialInfo& mi); + void write_finished_goods(); + void read_finished_goods(); + void write_leather(); + void read_leather(); + void write_cloth(); void read_cloth(); - bool wood_mat_is_allowed ( const df::plant_raw * plant ); + bool wood_mat_is_allowed(const df::plant_raw* plant); void write_wood(); void read_wood(); - bool weapons_mat_is_allowed ( const DFHack::MaterialInfo &mi ); + bool weapons_mat_is_allowed(const DFHack::MaterialInfo& mi); void write_weapons(); void read_weapons(); void weapons_armor_setup_other_mats(); - bool armor_mat_is_allowed ( const DFHack::MaterialInfo &mi ); + bool armor_mat_is_allowed(const DFHack::MaterialInfo& mi); void write_armor(); void read_armor(); - }; diff --git a/plugins/stockpiles/StockpileUtils.h b/plugins/stockpiles/StockpileUtils.h index f5570be92..7dcd8c3a2 100644 --- a/plugins/stockpiles/StockpileUtils.h +++ b/plugins/stockpiles/StockpileUtils.h @@ -3,26 +3,16 @@ #include "MiscUtils.h" #include "df/world.h" -#include "df/world_data.h" #include "df/creature_raw.h" #include "df/plant_raw.h" -#include -#include -#include - -// os -#include - // Utility Functions {{{ // A set of convenience functions for doing common lookups - /** * Retrieve creature raw from index */ -static inline df::creature_raw* find_creature ( int32_t idx ) -{ +static inline df::creature_raw* find_creature(int32_t idx) { return df::global::world->raws.creatures.all[idx]; } @@ -30,16 +20,14 @@ static inline df::creature_raw* find_creature ( int32_t idx ) * Retrieve creature index from id string * @return -1 if not found */ -static inline int16_t find_creature ( const std::string &creature_id ) -{ - return linear_index ( df::global::world->raws.creatures.all, &df::creature_raw::creature_id, creature_id ); +static inline int16_t find_creature(const std::string& creature_id) { + return linear_index(df::global::world->raws.creatures.all, &df::creature_raw::creature_id, creature_id); } /** * Retrieve plant raw from index */ -static inline df::plant_raw* find_plant ( size_t idx ) -{ +static inline df::plant_raw* find_plant(size_t idx) { return df::global::world->raws.plants.all[idx]; } @@ -47,32 +35,26 @@ static inline df::plant_raw* find_plant ( size_t idx ) * Retrieve plant index from id string * @return -1 if not found */ -static inline size_t find_plant ( const std::string &plant_id ) -{ - return linear_index ( df::global::world->raws.plants.all, &df::plant_raw::id, plant_id ); +static inline size_t find_plant(const std::string& plant_id) { + return linear_index(df::global::world->raws.plants.all, &df::plant_raw::id, plant_id); } -struct less_than_no_case -{ - bool operator () (char x, char y) const - { - return toupper( static_cast< unsigned char >(x)) < toupper( static_cast< unsigned char >(y)); - } +struct less_than_no_case { + bool operator () (char x, char y) const { + return toupper(static_cast(x)) < toupper(static_cast(y)); + } }; -static inline bool CompareNoCase(const std::string &a, const std::string &b) -{ - return std::lexicographical_compare( a.begin(),a.end(), b.begin(),b.end(), less_than_no_case() ); +static inline bool CompareNoCase(const std::string& a, const std::string& b) { + return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), less_than_no_case()); } - /** * Checks if the parameter has the dfstock extension. * Doesn't check if the file exists or not. */ -static inline bool is_dfstockfile ( const std::string& filename ) -{ - return filename.rfind ( ".dfstock" ) != std::string::npos; +static inline bool is_dfstockfile(const std::string& filename) { + return filename.rfind(".dfstock") != std::string::npos; } // }}} utility Functions diff --git a/plugins/stockpiles/stockpiles.cpp b/plugins/stockpiles/stockpiles.cpp index 4a2bdc33c..98c94ace0 100644 --- a/plugins/stockpiles/stockpiles.cpp +++ b/plugins/stockpiles/stockpiles.cpp @@ -1,3 +1,4 @@ +#include "Debug.h" #include "PluginManager.h" #include "StockpileUtils.h" #include "StockpileSerializer.h" @@ -12,11 +13,16 @@ using namespace DFHack; DFHACK_PLUGIN("stockpiles"); -static command_result savestock ( color_ostream &out, vector & parameters ); -static command_result loadstock ( color_ostream &out, vector & parameters ); +REQUIRE_GLOBAL(world); -DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands ) -{ +namespace DFHack { + DBG_DECLARE(stockpiles, log, DebugCategory::LINFO); +} + +static command_result savestock(color_ostream& out, vector & parameters); +static command_result loadstock(color_ostream& out, vector & parameters); + +DFhackCExport command_result plugin_init(color_ostream& out, std::vector & commands) { commands.push_back(PluginCommand( "savestock", "Save the active stockpile's settings to a file.", @@ -31,61 +37,46 @@ DFhackCExport command_result plugin_init ( color_ostream &out, std::vector & parameters ) -{ - df::building_stockpilest *sp = Gui::getSelectedStockpile(out, true); - if ( !sp ) - { - out.printerr ( "Selected building isn't a stockpile.\n" ); +static command_result savestock(color_ostream& out, vector & parameters) { + df::building_stockpilest* sp = Gui::getSelectedStockpile(out, true); + if (!sp) { + out.printerr("Selected building isn't a stockpile.\n"); return CR_WRONG_USAGE; } - if ( parameters.size() > 2 ) - { - out.printerr ( "Invalid parameters\n" ); + if (parameters.size() > 2) { + out.printerr("Invalid parameters\n"); return CR_WRONG_USAGE; } - bool debug = false; std::string file; - for ( size_t i = 0; i < parameters.size(); ++i ) - { - const std::string o = parameters.at ( i ); - if ( o == "--debug" || o == "-d" ) - debug = true; - else if ( !o.empty() && o[0] != '-' ) - { + for (size_t i = 0; i < parameters.size(); ++i) { + const std::string o = parameters.at(i); + if (!o.empty() && o[0] != '-') { file = o; } } - if ( file.empty() ) - { - out.printerr ( "You must supply a valid filename.\n" ); + if (file.empty()) { + out.printerr("You must supply a valid filename.\n"); return CR_WRONG_USAGE; } - StockpileSerializer cereal ( sp ); - if ( debug ) - cereal.enable_debug ( out ); + StockpileSerializer cereal(sp); - if ( !is_dfstockfile ( file ) ) file += ".dfstock"; - try - { - if ( !cereal.serialize_to_file ( file ) ) - { - out.printerr ( "could not save to %s\n", file.c_str() ); + if (!is_dfstockfile(file)) file += ".dfstock"; + try { + if (!cereal.serialize_to_file(file)) { + out.printerr("could not save to %s\n", file.c_str()); return CR_FAILURE; } } - catch ( std::exception &e ) - { - out.printerr ( "serialization failed: protobuf exception: %s\n", e.what() ); + catch (std::exception& e) { + out.printerr("serialization failed: protobuf exception: %s\n", e.what()); return CR_FAILURE; } @@ -94,59 +85,45 @@ static command_result savestock ( color_ostream &out, vector & paramete // importing -static command_result loadstock ( color_ostream &out, vector & parameters ) -{ - df::building_stockpilest *sp = Gui::getSelectedStockpile(out, true); - if ( !sp ) - { - out.printerr ( "Selected building isn't a stockpile.\n" ); +static command_result loadstock(color_ostream& out, vector & parameters) { + df::building_stockpilest* sp = Gui::getSelectedStockpile(out, true); + if (!sp) { + out.printerr("Selected building isn't a stockpile.\n"); return CR_WRONG_USAGE; } - if ( parameters.size() < 1 || parameters.size() > 2 ) - { - out.printerr ( "Invalid parameters\n" ); + if (parameters.size() < 1 || parameters.size() > 2) { + out.printerr("Invalid parameters\n"); return CR_WRONG_USAGE; } - bool debug = false; std::string file; - for ( size_t i = 0; i < parameters.size(); ++i ) - { - const std::string o = parameters.at ( i ); - if ( o == "--debug" || o == "-d" ) - debug = true; - else if ( !o.empty() && o[0] != '-' ) - { + for (size_t i = 0; i < parameters.size(); ++i) { + const std::string o = parameters.at(i); + if (!o.empty() && o[0] != '-') { file = o; } } - if ( file.empty() ) { - out.printerr ( "ERROR: missing .dfstock file parameter\n"); + if (file.empty()) { + out.printerr("ERROR: missing .dfstock file parameter\n"); return DFHack::CR_WRONG_USAGE; } - if ( !is_dfstockfile ( file ) ) + if (!is_dfstockfile(file)) file += ".dfstock"; - if ( !Filesystem::exists ( file ) ) - { - out.printerr ( "ERROR: the .dfstock file doesn't exist: %s\n", file.c_str()); + if (!Filesystem::exists(file)) { + out.printerr("ERROR: the .dfstock file doesn't exist: %s\n", file.c_str()); return CR_WRONG_USAGE; } - StockpileSerializer cereal ( sp ); - if ( debug ) - cereal.enable_debug ( out ); - try - { - if ( !cereal.unserialize_from_file ( file ) ) - { - out.printerr ( "unserialization failed: %s\n", file.c_str() ); + StockpileSerializer cereal(sp); + try { + if (!cereal.unserialize_from_file(file)) { + out.printerr("unserialization failed: %s\n", file.c_str()); return CR_FAILURE; } } - catch ( std::exception &e ) - { - out.printerr ( "unserialization failed: protobuf exception: %s\n", e.what() ); + catch (std::exception& e) { + out.printerr("unserialization failed: protobuf exception: %s\n", e.what()); return CR_FAILURE; } return CR_OK; From 0f31b9897dbee898253d4cc94fc4ec4156b0be4e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 16:22:02 -0800 Subject: [PATCH 030/439] slight editing for the quickstart guide --- docs/Quickstart.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/Quickstart.rst b/docs/Quickstart.rst index 55cfe6f36..065ba6ecc 100644 --- a/docs/Quickstart.rst +++ b/docs/Quickstart.rst @@ -5,19 +5,19 @@ Quickstart guide Welcome to DFHack! This guide will help get you oriented with the DFHack system and teach you how to find and use the tools productively. If you're reading this -in `quickstart-guide`, hit the right arrow key or click on the hotkey hint in -the lower right corner of the window to go to the next page. +in the in-game `quickstart-guide` reader, hit the right arrow key or click on +the hotkey hint in the lower right corner of the window to go to the next page. What is DFHack? --------------- -DFHack is a framework for Dwarf Fortress that provides a unified, cross-platform -environment that enables mods and tools to significantly extend the game. The -default DFHack distribution contains a wide variety of tools, including bugfixes, -interface improvements, automation agents, design blueprints, modding building -blocks, and more. Third-party tools (e.g. mods downloaded from Steam Workshop or -the forums) can also seamlessly integrate with the DFHack framework and extend -the game far beyond what can be done by just modding the raws. +DFHack is an add-on for Dwarf Fortress that enables mods and tools to +significantly extend the game. The default DFHack distribution contains a wide +variety of tools, including bugfixes, interface improvements, automation agents, +design blueprints, modding building blocks, and more. Third-party tools (e.g. +mods downloaded from Steam Workshop or the forums) can also seamlessly integrate +with the DFHack framework and extend the game far beyond what can be done by +just modding the raws. DFHack's mission is to provide tools and interfaces for players and modders to: From 79396c108503d595d9ff09c83a173d5b377001ea Mon Sep 17 00:00:00 2001 From: Will H Date: Sat, 11 Mar 2023 16:13:01 +1100 Subject: [PATCH 031/439] Refuse files Refuse aliases now complete and nonzero --- data/stockpiles/bones.dfstock | 157 ++++++++ data/stockpiles/corpses.dfstock | Bin 21 -> 11230 bytes data/stockpiles/craftrefuse.dfstock | 364 +++++++++++++++++ data/stockpiles/hair.dfstock | 157 ++++++++ data/stockpiles/horns.dfstock | Bin 0 -> 730 bytes data/stockpiles/rawhides.dfstock | Bin 0 -> 730 bytes data/stockpiles/refuse.dfstock | 583 ++++++++++++++++++++++++++++ data/stockpiles/shells.dfstock | 157 ++++++++ data/stockpiles/skulls.dfstock | 157 ++++++++ data/stockpiles/tannedhides.dfstock | Bin 0 -> 741 bytes data/stockpiles/teeth.dfstock | 157 ++++++++ data/stockpiles/usablehair.dfstock | Bin 0 -> 759 bytes 12 files changed, 1732 insertions(+) create mode 100644 data/stockpiles/craftrefuse.dfstock create mode 100644 data/stockpiles/usablehair.dfstock diff --git a/data/stockpiles/bones.dfstock b/data/stockpiles/bones.dfstock index e69de29bb..aeb2cdcf8 100644 --- a/data/stockpiles/bones.dfstock +++ b/data/stockpiles/bones.dfstock @@ -0,0 +1,157 @@ +*ÆW +WOOD +DOOR + FLOODGATE +BED +CHAIR +CHAIN +FLASK +GOBLET + +INSTRUMENT +TOY +WINDOW +CAGE +BARREL +BUCKET + +ANIMALTRAP +TABLE +COFFIN +STATUE +WEAPON +ARMOR +SHOES +SHIELD +HELM +GLOVES +BOX +BAG +BIN + +ARMORSTAND + +WEAPONRACK +CABINET +FIGURINE +AMULET +SCEPTER +AMMO +CROWN +RING +EARRING +BRACELET +GEM +ANVIL +REMAINS +MEAT +FISH +FISH_RAW +VERMIN +PET +SEEDS +PLANT + SKIN_TANNED + PLANT_GROWTH +THREAD +CLOTH +TOTEM +PANTS +BACKPACK +QUIVER + CATAPULTPARTS + BALLISTAPARTS + SIEGEAMMO +BALLISTAARROWHEAD + TRAPPARTS +TRAPCOMP +DRINK + POWDER_MISC +CHEESE +FOOD + LIQUID_MISC +COIN +GLOB + PIPE_SECTION + HATCH_COVER +GRATE +QUERN + MILLSTONE +SPLINT +CRUTCH +TRACTION_BENCH +TOOL +SLAB +EGG +BOOK +SHEET +BRANCH2TOAD2TOAD_MAN2 +GIANT_TOAD2WORM2WORM_MAN2 BIRD_BLUEJAY2 BLUEJAY_MAN2 GIANT_BLUEJAY2 BIRD_CARDINAL2 CARDINAL_MAN2GIANT_CARDINAL2 BIRD_GRACKLE2 GRACKLE_MAN2 GIANT_GRACKLE2 BIRD_ORIOLE2 +ORIOLE_MAN2 GIANT_ORIOLE2BIRD_RW_BLACKBIRD2RW_BLACKBIRD_MAN2GIANT_RW_BLACKBIRD2 BIRD_PENGUIN2BIRD_PENGUIN_LITTLE2BIRD_PENGUIN_EMPEROR2 PENGUIN MAN2BIRD_PENGUIN_GIANT2BIRD_FALCON_PEREGRINE2PEREGRINE FALCON MAN2GIANT PEREGRINE FALCON2 BIRD_KIWI2KIWI MAN2BIRD_KIWI_GIANT2 BIRD_OSTRICH2 OSTRICH MAN2BIRD_OSTRICH_GIANT2 BIRD_CROW2CROW_MAN2 +GIANT_CROW2 +BIRD_RAVEN2 RAVEN_MAN2 GIANT_RAVEN2BIRD_CASSOWARY2 CASSOWARY_MAN2GIANT_CASSOWARY2BIRD_KEA2KEA_MAN2 GIANT_KEA2BIRD_OWL_SNOWY2 SNOWY_OWL_MAN2GIANT_SNOWY_OWL2SPARROW2 SPARROW_MAN2 GIANT_SPARROW2BIRD_STORK_WHITE2WHITE_STORK_MAN2GIANT_WHITE_STORK2 BIRD_LOON2LOON_MAN2 +GIANT_LOON2 BIRD_OWL_BARN2 BARN_OWL_MAN2GIANT_BARN_OWL2 BIRD_PARAKEET2 PARAKEET_MAN2GIANT_PARAKEET2 BIRD_KAKAPO2 +KAKAPO_MAN2 GIANT_KAKAPO2BIRD_PARROT_GREY2GREY_PARROT_MAN2GIANT_GREY_PARROT2 BIRD_PUFFIN2 +PUFFIN_MAN2 GIANT_PUFFIN2 BIRD_SWAN2SWAN_MAN2 +GIANT_SWAN2 BIRD_LORIKEET2 LORIKEET_MAN2GIANT_LORIKEET2 BIRD_WREN2WREN_MAN2 +GIANT_WREN2 BIRD_OSPREY2 +OSPREY_MAN2 GIANT_OSPREY2BIRD_EMU2EMU_MAN2 GIANT_EMU2BIRD_COCKATIEL2 COCKATIEL_MAN2GIANT_COCKATIEL2BIRD_LOVEBIRD_PEACH-FACED2PEACH-FACED_LOVEBIRD_MAN2GIANT_PEACH-FACED_LOVEBIRD2 BIRD_MAGPIE2 +MAGPIE_MAN2 GIANT_MAGPIE2 BIRD_KESTREL2 KESTREL_MAN2 GIANT_KESTREL2BIRD_ALBATROSS2 ALBATROSS_MAN2GIANT_ALBATROSS2BIRD_OWL_GREAT_HORNED2GREAT_HORNED_OWL_MAN2GIANT_GREAT_HORNED_OWL2 +BIRD_EAGLE2 EAGLE_MAN2 GIANT_EAGLE2 BIRD_HORNBILL2 HORNBILL_MAN2GIANT_HORNBILL2BIRD_LOVEBIRD_MASKED2MASKED_LOVEBIRD_MAN2GIANT_MASKED_LOVEBIRD2 BIRD_BUSHTIT2 BUSHTIT_MAN2 GIANT_BUSHTIT2 DAMSELFLY2 DAMSELFLY_MAN2GIANT_DAMSELFLY2MOTH2MOTH_MAN2 +GIANT_MOTH2 GRASSHOPPER2GRASSHOPPER_MAN2GIANT_GRASSHOPPER2 BARK_SCORPION2BARK_SCORPION_MAN2GIANT_BARK_SCORPION2MANTIS2 +MANTIS_MAN2 GIANT_MANTIS2TICK2TICK_MAN2 +GIANT_TICK2LOUSE2 LOUSE_MAN2 GIANT_LOUSE2THRIPS2 +THRIPS_MAN2 GIANT_THRIPS2SLUG2SLUG_MAN2 +GIANT_SLUG2MOSQUITO2 MOSQUITO_MAN2GIANT_MOSQUITO2SPIDER_JUMPING2JUMPING_SPIDER_MAN2GIANT_JUMPING_SPIDER2TERMITE2 +MOON_SNAIL2MOON_SNAIL_MAN2GIANT_MOON_SNAIL2SPIDER_BROWN_RECLUSE2BROWN_RECLUSE_SPIDER_MAN2GIANT_BROWN_RECLUSE_SPIDER2SNAIL2 SNAIL_MAN2 GIANT_SNAIL2 GECKO_LEOPARD2LEOPARD_GECKO_MAN2GIANT_LEOPARD_GECKO2DESERT TORTOISE2DESERT_TORTOISE_MAN2GIANT_DESERT_TORTOISE2 GILA_MONSTER2GILA_MONSTER_MAN2GIANT_GILA_MONSTER2DOG2CAT2MULE2DONKEY2HORSE2COW2SHEEP2PIG2GOAT2 BIRD_CHICKEN2CAVY2 BIRD_DUCK2 WATER_BUFFALO2REINDEER2 +BIRD_GOOSE2YAK2LLAMA2ALPACA2BIRD_GUINEAFOWL2BIRD_PEAFOWL_BLUE2 BIRD_TURKEY2RABBIT2CHIMERA2CENTAUR2GRIFFON2FLY2FLY_MAN2 GIANT_FLY2 ROACH_LARGE2 ROACH_MAN2 GIANT_ROACH2BEETLE2 +BEETLE_MAN2 GIANT_BEETLE2ANT2BUTTERFLY_MONARCH2BUTTERFLY_MONARCH_MAN2GIANT_BUTTERFLY_MONARCH2FIREFLY2 FIREFLY_MAN2 GIANT_FIREFLY2 DRAGONFLY2 DRAGONFLY_MAN2GIANT_DRAGONFLY2 HONEY_BEE2 BUMBLEBEE2 GOAT_MOUNTAIN2GOAT_MOUNTAIN_MAN2GIANT_GOAT_MOUNTAIN2 MARMOT_HOARY2MARMOT_HOARY_MAN2GIANT_MARMOT_HOARY2GNOME_MOUNTAIN2 +GNOME_DARK2WALRUS2 +WALRUS_MAN2 GIANT_WALRUS2FISH_LAMPREY_SEA2SHARK_GREAT_WHITE2 SHARK_FRILL2SHARK_SPINY_DOGFISH2SHARK_WOBBEGONG_SPOTTED2 SHARK_WHALE2 SHARK_BASKING2 SHARK_NURSE2SHARK_MAKO_SHORTFIN2SHARK_MAKO_LONGFIN2 SHARK_TIGER2 +SHARK_BULL2SHARK_REEF_BLACKTIP2SHARK_REEF_WHITETIP2 +SHARK_BLUE2SHARK_HAMMERHEAD2 SHARK_ANGEL2FISH_SKATE_COMMON2FISH_RAY_MANTA2 FISH_STINGRAY2FISH_COELACANTH2 FISH_STURGEON2FISH_CONGER_EEL2 FISH_MILKFISH2FISH_COD2 FISH_OPAH2FISH_GROUPER_GIANT2 FISH_BLUEFISH2FISH_SUNFISH_OCEAN2FISH_SWORDFISH2 FISH_MARLIN2 FISH_HALIBUT2FISH_BARRACUDA_GREAT2FISH_TUNA_BLUEFIN2NARWHAL2 NARWHAL MAN2NARWHAL, GIANT2HIPPO2 HIPPO_MAN2 GIANT_HIPPO2FISH_GAR_LONGNOSE2 FISH_CARP2FISH_TIGERFISH2 FISH_PIKE2PLATYPUS2 PLATYPUS MAN2PLATYPUS, GIANT2 BEAR_GRIZZLY2BEAR_GRIZZLY_MAN2GIANT_BEAR_GRIZZLY2 +BEAR_BLACK2BEAR_BLACK_MAN2GIANT_BEAR_BLACK2DEER2DEER_MAN2 +GIANT_DEER2FOX2FOX_MAN2 GIANT_FOX2RACCOON2 RACCOON_MAN2 GIANT_RACCOON2MACAQUE_RHESUS2MACAQUE_RHESUS_MAN2GIANT_MACAQUE_RHESUS2COUGAR2 +COUGAR_MAN2 GIANT_COUGAR2WOLF2WOLF_MAN2 +GIANT_WOLF2 GROUNDHOG2 GROUNDHOG_MAN2GIANT_GROUNDHOG2 ALLIGATOR2 ALLIGATOR_MAN2GIANT_ALLIGATOR2 BIRD_BUZZARD2 BUZZARD_MAN2 GIANT_BUZZARD2PANDA2PANDA, GIGANTIC2 PANDA MAN2CAPYBARA2CAPYBARA, GIANT2 CAPYBARA MAN2BADGER2 +BADGER MAN2 BADGER, GIANT2MOOSE2 MOOSE MAN2 MOOSE, GIANT2 RED PANDA2 RED PANDA MAN2RED PANDA, GIANT2ELEPHANT2 ELEPHANT_MAN2GIANT_ELEPHANT2WARTHOG2 WARTHOG_MAN2 GIANT_WARTHOG2LION2LION_MAN2 +GIANT_LION2LEOPARD2 LEOPARD_MAN2 GIANT_LEOPARD2JAGUAR2 +JAGUAR_MAN2 GIANT_JAGUAR2TIGER2 TIGER_MAN2 GIANT_TIGER2CHEETAH2 CHEETAH_MAN2 GIANT_CHEETAH2GAZELLE2 GAZELLE_MAN2 GIANT_GAZELLE2MANDRILL2 MANDRILL_MAN2GIANT_MANDRILL2 +CHIMPANZEE2BONOBO2GORILLA2 ORANGUTAN2GIBBON_SIAMANG2GIBBON_WHITE_HANDED2GIBBON_BLACK_HANDED2 GIBBON_GRAY2GIBBON_SILVERY2GIBBON_PILEATED2 GIBBON_BILOU2GIBBON_WHITE_BROWED2GIBBON_BLACK_CRESTED2 CAMEL_1_HUMP2CAMEL_1_HUMP_MAN2GIANT_CAMEL_1_HUMP2 CAMEL_2_HUMP2CAMEL_2_HUMP_MAN2GIANT_CAMEL_2_HUMP2CROCODILE_SALTWATER2CROCODILE_SALTWATER_MAN2GIANT_CROCODILE_SALTWATER2 BIRD_VULTURE2 VULTURE_MAN2 GIANT_VULTURE2 +RHINOCEROS2RHINOCEROS_MAN2GIANT_RHINOCEROS2GIRAFFE2 GIRAFFE_MAN2 GIANT_GIRAFFE2 HONEY BADGER2HONEY BADGER MAN2HONEY BADGER, GIANT2GIANT TORTOISE2GIANT TORTOISE MAN2GIGANTIC TORTOISE2 ARMADILLO2 ARMADILLO MAN2ARMADILLO, GIANT2MUSKOX2 +MUSKOX_MAN2 GIANT_MUSKOX2ELK2ELK_MAN2 GIANT_ELK2 +BEAR_POLAR2BEAR_POLAR_MAN2GIANT_BEAR_POLAR2 WOLVERINE2 WOLVERINE_MAN2GIANT_WOLVERINE2 +CHINCHILLA2CHINCHILLA_MAN2GIANT_CHINCHILLA2 FLOATING_GUTS2DRUNIAN2 CREEPING_EYE2VORACIOUS_CAVE_CRAWLER2BLIND_CAVE_OGRE2 +CAP_HOPPER2 +MAGMA_CRAB2CRUNDLE2 HUNGRY_HEAD2 +FLESH_BALL2ELK_BIRD2 HELMET_SNAKE2GREEN_DEVOURER2RUTHERER2CREEPY_CRAWLER2DRALTHA2GIANT_EARTHWORM2 BLOOD_MAN2BUGBAT2MANERA2 +MOLEMARIAN2JABBERER2 POND_GRABBER2BLIND_CAVE_BEAR2 CAVE_DRAGON2REACHER2ELEMENTMAN_GABBRO2GORLAK2 CAVE_FLOATER2PLUMP_HELMET_MAN2 CAVE_BLOB2ELEMENTMAN_AMETHYST2OCTOPUS2 OCTOPUS_MAN2 GIANT_OCTOPUS2CRAB2CRAB_MAN2 +GIANT_CRAB2 LEOPARD_SEAL2LEOPARD_SEAL_MAN2GIANT_LEOPARD_SEAL2 +CUTTLEFISH2CUTTLEFISH_MAN2GIANT_CUTTLEFISH2ORCA2ORCA_MAN2 +GIANT_ORCA2SPONGE2 +SPONGE_MAN2 GIANT_SPONGE2HORSESHOE_CRAB2HORSESHOE_CRAB_MAN2GIANT_HORSESHOE_CRAB2 SPERM_WHALE2SPERM_WHALE_MAN2GIANT_SPERM_WHALE2 ELEPHANT_SEAL2ELEPHANT_SEAL_MAN2GIANT_ELEPHANT_SEAL2 HARP_SEAL2 HARP_SEAL_MAN2GIANT_HARP_SEAL2NAUTILUS2 NAUTILUS_MAN2GIANT_NAUTILUS2 FOXSQUIRREL2 MOGHOPPER2 RAT_DEMON2WAMBLER_FLUFFY2LIZARD_RHINO_TWO_LEGGED2 WORM_KNUCKLE2SPIDER_PHANTOM2 FLY_ACORN2 +GNAT_BLOOD2LIZARD2 +LIZARD_MAN2 GIANT_LIZARD2SKINK2 SKINK_MAN2 GIANT_SKINK2 CHAMELEON2 CHAMELEON_MAN2GIANT_CHAMELEON2ANOLE2 ANOLE_MAN2 GIANT_ANOLE2IGUANA2 +IGUANA_MAN2 GIANT_IGUANA2 RIVER OTTER2 SEA OTTER2 OTTER_MAN2 GIANT_OTTER2SNAPPING TURTLE2ALLIGATOR SNAPPING TURTLE2SNAPPING_TURTLE_MAN2GIANT_SNAPPING_TURTLE2BEAVER2 +BEAVER_MAN2 GIANT_BEAVER2LEECH2 LEECH_MAN2 GIANT_LEECH2AXOLOTL2 AXOLOTL_MAN2 GIANT_AXOLOTL2MINK2MINK_MAN2 +GIANT_MINK2 POND_TURTLE2POND_TURTLE_MAN2GIANT_POND_TURTLE2RAT2RAT_MAN2 SQUIRREL_GRAY2SQUIRREL_GRAY_MAN2GIANT_SQUIRREL_GRAY2 SQUIRREL_RED2SQUIRREL_RED_MAN2GIANT_SQUIRREL_RED2CHIPMUNK2 CHIPMUNK_MAN2GIANT_CHIPMUNK2HAMSTER2 HAMSTER_MAN2 GIANT_HAMSTER2HEDGEHOG2 HEDGEHOG_MAN2GIANT_HEDGEHOG2SQUIRREL_FLYING2FLYING_SQUIRREL_MAN2GIANT_FLYING_SQUIRREL2MUSSEL2OYSTER2 FISH_SALMON2FISH_CLOWNFISH2 FISH_HAGFISH2FISH_LAMPREY_BROOK2 FISH_RAY_BAT2FISH_RAY_THORNBACK2FISH_RATFISH_SPOTTED2 FISH_HERRING2 FISH_SHAD2 FISH_ANCHOVY2FISH_TROUT_STEELHEAD2 FISH_HAKE2 FISH_SEAHORSE2 FISH_GLASSEYE2FISH_PUFFER_WHITE_SPOTTED2 FISH_SOLE2 FISH_FLOUNDER2 FISH_MACKEREL2JELLYFISH_SEA_NETTLE2SQUID2 SQUID MAN2GIGANTIC SQUID2 FISH_LUNGFISH2FISH_LOACH_CLOWN2FISH_BULLHEAD_BROWN2FISH_BULLHEAD_YELLOW2FISH_BULLHEAD_BLACK2FISH_KNIFEFISH_BANDED2 FISH_CHAR2FISH_TROUT_RAINBOW2FISH_MOLLY_SAILFIN2 +FISH_GUPPY2 +FISH_PERCH2DWARF2HUMAN2ELF2GOBLIN2KOBOLD2GREMLIN2TROLL2OGRE2UNICORN2DRAGON2SATYR2COLOSSUS_BRONZE2GIANT2CYCLOPS2ETTIN2MINOTAUR2YETI2 SASQUATCH2 BLIZZARD_MAN2WOLF_ICE2FAIRY2PIXIE2BEAK_DOG2 GRIMELING2 BLENDEC_FOUL2 STRANGLER2 NIGHTWING2HARPY2HYDRA2 MERPERSON2 SEA_SERPENT2 SEA_MONSTER2BIRD_ROC2CROCODILE_CAVE2TOAD_GIANT_CAVE2 OLM_GIANT2 BAT_GIANT2 RAT_GIANT2 RAT_LARGE2MOLE_DOG_NAKED2 +TROGLODYTE2 +MOLE_GIANT2IMP_FIRE2SPIDER_CAVE_GIANT2 SPIDER_CAVE2 FISH_CAVE2 CAVE_FISH_MAN2 LOBSTER_CAVE2 +SNAKE_FIRE2OLM2OLM_MAN2BAT2BAT_MAN2MAGGOT_PURRING2ELEMENTMAN_FIRE2ELEMENTMAN_MAGMA2ELEMENTMAN_IRON2ELEMENTMAN_MUD2BIRD_SWALLOW_CAVE2CAVE_SWALLOW_MAN2BIRD_SWALLOW_CAVE_GIANT2 AMPHIBIAN_MAN2 REPTILE_MAN2 SERPENT_MAN2ANT_MAN2 +RODENT MAN2 WILD_BOAR2 WILD_BOAR_MAN2GIANT_WILD_BOAR2COYOTE2 +COYOTE_MAN2 GIANT_COYOTE2KANGAROO2 KANGAROO_MAN2GIANT_KANGAROO2KOALA2 KOALA_MAN2 GIANT_KOALA2ADDER2 ADDER_MAN2 GIANT_ADDER2ECHIDNA2 ECHIDNA_MAN2 GIANT_ECHIDNA2 PORCUPINE2 PORCUPINE_MAN2GIANT_PORCUPINE2 KINGSNAKE2 KINGSNAKE_MAN2GIANT_KINGSNAKE2 GRAY_LANGUR2GRAY_LANGUR_MAN2GIANT_GRAY_LANGUR2BOBCAT2 +BOBCAT_MAN2 GIANT_BOBCAT2SKUNK2 SKUNK_MAN2 GIANT_SKUNK2GREEN_TREE_FROG2GREEN_TREE_FROG_MAN2GIANT_GREEN_TREE_FROG2HARE2HARE_MAN2 +GIANT_HARE2 RATTLESNAKE2RATTLESNAKE_MAN2GIANT_RATTLESNAKE2WEASEL2 +WEASEL_MAN2 GIANT_WEASEL2COPPERHEAD_SNAKE2COPPERHEAD_SNAKE_MAN2GIANT_COPPERHEAD_SNAKE2IBEX2IBEX_MAN2 +GIANT_IBEX2WOMBAT2 +WOMBAT_MAN2 GIANT_WOMBAT2DINGO2 DINGO_MAN2 GIANT_DINGO2COATI2 COATI_MAN2 GIANT_COATI2OPOSSUM2 OPOSSUM_MAN2 GIANT_OPOSSUM2MONGOOSE2 MONGOOSE_MAN2GIANT_MONGOOSE2HYENA2 HYENA_MAN2 GIANT_HYENA2ANACONDA2 ANACONDA_MAN2GIANT_ANACONDA2MONITOR_LIZARD2MONITOR_LIZARD_MAN2GIANT_MONITOR_LIZARD2 +KING_COBRA2KING_COBRA_MAN2GIANT_KING_COBRA2OCELOT2 +OCELOT_MAN2 GIANT_OCELOT2JACKAL2 +JACKAL_MAN2 GIANT_JACKAL2CAPUCHIN2 CAPUCHIN_MAN2GIANT_CAPUCHIN2SLOTH2 SLOTH_MAN2 GIANT_SLOTH2 SPIDER_MONKEY2SPIDER_MONKEY_MAN2GIANT_SPIDER_MONKEY2PANGOLIN2 PANGOLIN_MAN2GIANT_PANGOLIN2 BLACK_MAMBA2BLACK_MAMBA_MAN2GIANT_BLACK_MAMBA2 +BEAR_SLOTH2SLOTH_BEAR_MAN2GIANT_SLOTH_BEAR2AYE-AYE2 AYE-AYE_MAN2 GIANT_AYE-AYE2 +BUSHMASTER2BUSHMASTER_MAN2GIANT_BUSHMASTER2PYTHON2 +PYTHON_MAN2 GIANT_PYTHON2TAPIR2 TAPIR_MAN2 GIANT_TAPIR2IMPALA2 +IMPALA_MAN2 GIANT_IMPALA2AARDVARK2 AARDVARK_MAN2GIANT_AARDVARK2 LION_TAMARIN2LION_TAMARIN_MAN2GIANT_LION_TAMARIN2STOAT2 STOAT_MAN2 GIANT_STOAT2LYNX2LYNX_MAN2 +GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/corpses.dfstock b/data/stockpiles/corpses.dfstock index e71f2102467c90086585cd1ff3162d2fcd1fbf84..dbaa101c1581aa08336589f4ba7a7826d01cc6df 100644 GIT binary patch literal 11230 zcmZu%xtilTcJBI0E45U0SKsNmh$^1X6WDJ6k`TofNpQHdTAlEf96EI9a6*TU{9N;& z1r${G1`>dC4)(KyfBXMyvbcJmCyU(sF4>+cGzvSo{ES@Tx6vH?o ze=b~&l{G)gDp_}~w%C5MsGS{>#i{JiG(&%$I(to4KU`O1QO_;-UEy9pWk6+f zv!VZ~wv9=O66ZBB6rA1FW<&ps+oxrhPiZx}@AhVPT4B^dx&_>UDKp#UWn(L|4>hJe z3T=QH85Y~jE|oJot;EC5I3Ct_r3YamrL0VbRLo~4>#kTT#-xUMja%I1i*$+Mx{}s4 z#aK4xjfc_JRF%VkS-(C2UER9QcV?$l?{tJ;9!Pi^^BcoXw#s}np^qy_l+4$;`Yt#g z;4j?g{Ugq7d5}waEzO4hnfPS}PBN7or-y1OalbpQL@QH>lFOhZyJkcGd^pMl3{7}~ z&i-(X*>b@oJ3T*!ADJezeebWfyBWxqR+;uiXlJ0=$fBJ!>x;8YvlSXNjg026)zmls ziqW{32tennqs>6G?jee_ft^;EOj$DEUU^E0PIsBE=W=l7g^Ni*H1KCxLIl<$hf;6M zhW>eEJspM$r_<7)t{ZR={^yk{rw5o3Vl38PAcJNfYCNhE2N>jwr0rraQ0XR-k_q>E zQi73v@c|6bgzkp(!T+R?XkQUn2X99*A10A99$YcP9Q_rCv!VZZ`wW#GRS-PcQK-c` z3NSs)YX?T!(0@D{LuJdpZ)qEel<}$*Bi!Ta(X8>u1j;=GQ(pAh#SXB0;Kfj7%D{^O zXnyB&CZoue*4ga*_Y;g(ZvGlIrkR3{)W{wD8D7t}wnbY)OGz2;LNOwz7Y9MbDtB68 zLS@~6lO5SAwL|Co-W=v?yrUVY%7%CnS8j*t>^oRX^EGbGJSxiOfs$}W#NOEgN^i>r zPo`ooaJhXNK80B_`%q&_<>vrX%^96yf5D>OYPdu$e>~ma>L&+BPaH3kMViK#l!IY{lA}|EpLcR2v z?^+mg1J5C9a;G=h+5^I@z*0lm6SGjsgev8VSqx=%ftkjCyh?^HD?j$QBrX`Mmn3j< zi^>**OBoNY82AWd0RhK-@|7ayxE5u)9CF6m^t=sNnX$Qv2Nk_nJ-$I6i!0( zRrdafF>APxHR1ildHu38Qv^q z(k&M}pPrz=4~5GveyW^@Qq9e0txN)@o$0MUAk0e+&#xQaVR8mvVsUQ*fO91Po=JKA z1Ipm~D;P$P5COc0?cZD6P2HCmZk}^rm}j`PU}|{iW|jNq0!_Mv3}X7{3?`D@zt%jr zWnmVD2d(I#>-c7qhG? zTU)cT75r>##4#aH%GncX6miR-GO5LGq^inc>}Z**&Za2@dyTc!u7huoAvCgMXV&nR zPA3S|GfDIse|!e2^a-}>Jk<77*{*;jNP{jWcqxQ6s}xq3JVz;c3>7oQJVXAl&T+t& zc^2Q;4n2SS1Bg3+Q(^uC{rXgPj@P9XCReo{aNE4Ig>Q)LFjtvSZPW}j+cP}=8ytIV zE*)#cepEfs{eeeDoD$6V=Z7W_qM`nRswb!`Cos_j=xH%S$uibsFMA|v@ zn^|3L)s0XvQt}vjtcrQ%$PU~=h8wCma8b`R1>VOK~IDXtkw1a#QiLY$%3yMf%FFVca56^134 z_8Q89I9*2^?+fdkJ4tvklx-N6fxH<4hF%Dl%&UxWMm*^{iXg)TwkcrzKlAzYa9A9o zJ_OT^IchM>oIY4{5Rw5~>JWUra5M7`5e|6vJmW_Q0J;Y}hVLdvUJ!Rc^mw6)kytzP zx!E!Tn(b`9a23(?2z#gDf%K!ej{6BoKQ_`UbC5AvYL756XPO=3z&;31&7K>$m=Ypn zzH$r355eA;Te*MT{xCL{wE~_08gfV1X?9xS_~odLe|u-agJLUNILBKqnD12H1un;0 z*bd%B1BL|y$ZipOwz_P-VP3YNS~#+1gS^6UYr)f$Vc?p?TA>vduuqZaz%I&PzaYi0 zaVr+37*5&;eK<6QuR7P6Ud`McY8I?(H}uaG>Ygz4`Q(2>8~UG&3EGfgINpq6mYr6Z zK-Evc9c!=-vI-Lzvd31xJhr)uTI@%RLE34=shUJerc{Af3^E7Ri82S(iLttBhHi<$ zn*0n~b(pJ6rD|^mnk}VdkWE8`4WC!5G3gAPeZybB$V9_8BaX}YZ zkkgf!Ed%(TH<@j3;8IY9+I-^yz=X)r<*Xs3WEgxvf`txCcrwIzTrdF~DL?{#+qwK* zmUNh_O!qoB1MLQhwDwFkY9DI6Lv_Xi%&ZZF4|Kpgt;FXLaEppu)D8VJIz+VuT?b!h z7hD=Lrh1S8xB702k=Q^=9z@wdF-y^(TP_%{@+oi_dKhFVo}E_WWd_{3u)kady}r{* zOcZb%EDzZ?ia|n+$%2;}unD;qIP71ro~zV1KJ{=e5WT{6F)M zj|N5rc9h$a8o&+Y6uKyoMR`&nHprB$rSHR3NaayvF37g55SL*H92Zj~eDdQwpv*#^ zDo7xLLPEK$DeDj~Qpe2JuA2URI>X;KuW^evt~NY|hd%%D&_`N-?4wj~NCCl0V7*h1 z+%x-v=G&hDd4%7^ANmut%I6QHTgMJ}sTJ;}Y!z@xcP<;BA+Oe()4K}mYusW+~$r50Y!VvVCbx_wm2~O%7?is z@;o=g6svmdFVNSCl)QA6AjLep>VhmsB~f3kbCD+;MoxCptxJbXb+Zd>@J9B)(Rq_#wxA`-y3IVpkj2nXmku@9A; zDu)*XO3xdp#>+$r9AqKz%;5$KBw@;r7#5kP-2L!iybkfpIGmAx#i{WUZ}VcXc5wI^ zI$yXLmU%dH27H^+s}7$49%BlmVK`!^5Ct)7g{O>;_PqIy_=Shw;}Ir@TfpsyUDBOE z-O(Y4cMn@l2`8-QGt@V|1wr9V1$uVg;H9Xm5LrRm(SeT|gs*J{p~n&MHbHK-jK?Zd z^A?Q)6)~J|Jt8Wf4W8VYomO}+Dt7_5;FCrU*rtqDd%)0rFaz-2EAtw+m{!$I498s} zEULt9Jl^X}uX22cnuYHWGj8ZVo}Hn1>45(R?vRr4Dkh3Ka)e9IUBWM49^2eQeVIoL z{BZcXH8R2!I=n;;?xQK52y70)%2FHy*ZrZ%oiylrK)^?Z&naCFbCt=J-DaTKGS%8@xJU`0K&?_PN7ljHAlJo-@o}-AXrC_lG?;w7^nQv7|{t;Y0sMu+^ zQc|NR$e!>c&!s`ck8=pg9QHMQ4X+syw?$Tq-iI2D&H`apGMY(rRANQF7sV_o2D_Lo z7rY5|02GerQJ66bSPpYFK9m_~@Nh_vK3gv0kp#ZNgqhMOT*fO^%(8M0 zIfpG5@xlbYwm&@{I1w6Yg-KMH18#xmQ{)TjpV2DJ48;Q_w3F`YC2BCGvU~(K&tNEu zDUfTx4Icu}k%GG+l2;bwCR3;YJRr<|Zo;iaKpc9Z#hp}z#Be-FA&{#_>|`HmOskR* zU}g-3ew=Q%c(?1qHaAxQ%D@3C!;mvPK6a)ZX_)Pi%5oI4ys zji_-qOc@d)8g)B8z2P;DVheT)BE$f|6k>cmveeXoiWCfPBEXHTs$$Mb3scHF4fIf1)ZV}^{rKCyL*$rocCx9hR7lV;n@SIp(+}u#&m@N*KzBz!K4$aLbg4QGfe3@aS z6TV|XCb=zt;!$e@O?9EPoIx;;TrE}zse+-w5oOcKkFZC0)?~s%XK)4o)Q&M$gqxRBDm#7NPWv=AEFR)*g`Bq{*HO!j}|oKAi&mF_57+0 zZ6&*Ba~M@6M~nvs#5CB#L~de^*OAWSQ;hs34-vpgmkr{@i88iObn?Q%zLp^2Jn*9j zFGo3p7J}z*^4Ev~=@|EL%t#xsqYE#FW|T3Xv0`{`5ZUO61=^Z732^}XT%_(%2Xi+2|!9P-SF`aC77sW zBDLm<*<8R}7CO@GLyf7_G6a}eUc9Byo(rZ>2SngYo0Cr3auK5izJ?txbGQ{dtuTq2 z+JM`(a8gHj3b^;V%7nVF8Hi;-2>ANVVXnrcGmt-nx#2wn2?=?63=Jl~KRpI8r881` z`bnf@GCecJz!@V`3TF%j<7a1#;Plx5A|<>=gE=7#NJl&ZxQp7o4=A&MU_&p^Ka;7y z!B8Y2NvX@eU!n$6>Q*8!9u%A6guQRC*d54-+dxKj^UjuQ;RC+gx!B?kk32n&*6 z{o7Nwt4`ESs)??%L$GiWI*l?>Z&tSHxdrNH$N5gfqN9^SWJ4}#^AZZ3ihiYGw_(zq zI>U?5Fmg)buy5vG(>Ykrt|X4s7e)&jjLx$SG~~i%L%a(|1rR3>Hho@IGG13J4ir~$ z9_UWraeEr|0}C%$(1IQ%=o2QQXPd<4PG`e-2K;5V%a(AYf&EtbpRbq^6%1@n9C-t)p`i&yY`@7cSJzHm?;SuSepYhIdIGq)riaeHNKA z_0cf~b<1}f4$ur3@2AJzu>iQNG?X<7*P%N_*cUAoF`_Jk2h_x>Xn5N!`qPWy!f|sY zazet($j(^|;2B=Cl|>%HzWjfIB;D5vajh;q6EF2>)Wehsitlubx=)f0Z?l0zt4J0o zte@oOEWoGdQ)d(sJJ>Noh>db&F~!2Z+sehPhk;KpaY^+%^>3S`Kv!>_%SEdVIXa7p z3?^+zr_Uhrs6R#th`XZdsLPH=I?1w7H>%$2rw~kafG^03%}4XCZNInekGA>QHow~D Jcia4Fn}2%@sj2_~ literal 0 HcmV?d00001 diff --git a/data/stockpiles/rawhides.dfstock b/data/stockpiles/rawhides.dfstock index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b58c77edecc3fd043a6cd9e855cbe5308d164ccd 100644 GIT binary patch literal 730 zcmXw1F_POb47A3QY{R+C6 z{o7HytB%x;s)=rsLojm@Iu9~ZXBM{UxdrMb$9biG*1<_3vLTnWc?pHiMZZ$N+c4@* zt>IayA2=m(*f+D*bPm?DD~Tg@h0%g~qtj#q^|^4_5bwfK0mR9JO_vvyjMv4A1I0z0 z2fEXD+@1&hz``>Yw4g@``h=0_*(R}B>0%hqfWJ<5-V%<~v)?NJOEwaVBx>1vg~+6P zpcXkZT?FLo;X0s=)b#T#9?ZhKb#zJM8S<(1!iCz&=A|O!K00L_5$etO&;Gl0uNeOZ!l9lBG5UC~kzBg!&(KuxTQ`nS!ZKfM?(95+`Y zCnUTK?3~2_p5ZN9ndKqu%l{Wh(tW8Ax9Y+(@mh~YJxm#)c%^&PeUx-~n++UVM6y6( z{Ump10X{yTTBDHI!j1t#Y?LF5DHitK7cOQw419u#bE@B|d)p)hx_RqdE?RBK(OFES zH)%sUeFl+7{V_;D+!j?wZFW4+S>~DAL3OR4LNL`Hz91_$AI-O>`Q9`?n$yqb^s71j JZccxi(?5GUsjL71 literal 0 HcmV?d00001 diff --git a/data/stockpiles/refuse.dfstock b/data/stockpiles/refuse.dfstock index e69de29bb..4de87f545 100644 --- a/data/stockpiles/refuse.dfstock +++ b/data/stockpiles/refuse.dfstock @@ -0,0 +1,583 @@ +*ÞÐ +WOOD +DOOR + FLOODGATE +BED +CHAIR +CHAIN +FLASK +GOBLET + +INSTRUMENT +TOY +WINDOW +CAGE +BARREL +BUCKET + +ANIMALTRAP +TABLE +COFFIN +STATUE +WEAPON +ARMOR +SHOES +SHIELD +HELM +GLOVES +BOX +BAG +BIN + +ARMORSTAND + +WEAPONRACK +CABINET +FIGURINE +AMULET +SCEPTER +AMMO +CROWN +RING +EARRING +BRACELET +GEM +ANVIL +REMAINS +MEAT +FISH +FISH_RAW +VERMIN +PET +SEEDS +PLANT + SKIN_TANNED + PLANT_GROWTH +THREAD +CLOTH +TOTEM +PANTS +BACKPACK +QUIVER + CATAPULTPARTS + BALLISTAPARTS + SIEGEAMMO +BALLISTAARROWHEAD + TRAPPARTS +TRAPCOMP +DRINK + POWDER_MISC +CHEESE +FOOD + LIQUID_MISC +COIN +GLOB + PIPE_SECTION + HATCH_COVER +GRATE +QUERN + MILLSTONE +SPLINT +CRUTCH +TRACTION_BENCH +TOOL +SLAB +EGG +BOOK +SHEET +BRANCHTOADTOAD_MAN +GIANT_TOADWORMWORM_MAN BIRD_BLUEJAY BLUEJAY_MAN GIANT_BLUEJAY BIRD_CARDINAL CARDINAL_MANGIANT_CARDINAL BIRD_GRACKLE GRACKLE_MAN GIANT_GRACKLE BIRD_ORIOLE +ORIOLE_MAN GIANT_ORIOLEBIRD_RW_BLACKBIRDRW_BLACKBIRD_MANGIANT_RW_BLACKBIRD BIRD_PENGUINBIRD_PENGUIN_LITTLEBIRD_PENGUIN_EMPEROR PENGUIN MANBIRD_PENGUIN_GIANTBIRD_FALCON_PEREGRINEPEREGRINE FALCON MANGIANT PEREGRINE FALCON BIRD_KIWIKIWI MANBIRD_KIWI_GIANT BIRD_OSTRICH OSTRICH MANBIRD_OSTRICH_GIANT BIRD_CROWCROW_MAN +GIANT_CROW +BIRD_RAVEN RAVEN_MAN GIANT_RAVENBIRD_CASSOWARY CASSOWARY_MANGIANT_CASSOWARYBIRD_KEAKEA_MAN GIANT_KEABIRD_OWL_SNOWY SNOWY_OWL_MANGIANT_SNOWY_OWLSPARROW SPARROW_MAN GIANT_SPARROWBIRD_STORK_WHITEWHITE_STORK_MANGIANT_WHITE_STORK BIRD_LOONLOON_MAN +GIANT_LOON BIRD_OWL_BARN BARN_OWL_MANGIANT_BARN_OWL BIRD_PARAKEET PARAKEET_MANGIANT_PARAKEET BIRD_KAKAPO +KAKAPO_MAN GIANT_KAKAPOBIRD_PARROT_GREYGREY_PARROT_MANGIANT_GREY_PARROT BIRD_PUFFIN +PUFFIN_MAN GIANT_PUFFIN BIRD_SWANSWAN_MAN +GIANT_SWAN BIRD_LORIKEET LORIKEET_MANGIANT_LORIKEET BIRD_WRENWREN_MAN +GIANT_WREN BIRD_OSPREY +OSPREY_MAN GIANT_OSPREYBIRD_EMUEMU_MAN GIANT_EMUBIRD_COCKATIEL COCKATIEL_MANGIANT_COCKATIELBIRD_LOVEBIRD_PEACH-FACEDPEACH-FACED_LOVEBIRD_MANGIANT_PEACH-FACED_LOVEBIRD BIRD_MAGPIE +MAGPIE_MAN GIANT_MAGPIE BIRD_KESTREL KESTREL_MAN GIANT_KESTRELBIRD_ALBATROSS ALBATROSS_MANGIANT_ALBATROSSBIRD_OWL_GREAT_HORNEDGREAT_HORNED_OWL_MANGIANT_GREAT_HORNED_OWL +BIRD_EAGLE EAGLE_MAN GIANT_EAGLE BIRD_HORNBILL HORNBILL_MANGIANT_HORNBILLBIRD_LOVEBIRD_MASKEDTOADTOAD_MAN +GIANT_TOADWORMWORM_MAN BIRD_BLUEJAY BLUEJAY_MAN GIANT_BLUEJAY BIRD_CARDINAL CARDINAL_MANGIANT_CARDINAL BIRD_GRACKLE GRACKLE_MAN GIANT_GRACKLE BIRD_ORIOLE +ORIOLE_MAN GIANT_ORIOLEBIRD_RW_BLACKBIRDRW_BLACKBIRD_MANGIANT_RW_BLACKBIRD BIRD_PENGUINBIRD_PENGUIN_LITTLEBIRD_PENGUIN_EMPEROR PENGUIN MANBIRD_PENGUIN_GIANTBIRD_FALCON_PEREGRINEPEREGRINE FALCON MANGIANT PEREGRINE FALCON BIRD_KIWIKIWI MANBIRD_KIWI_GIANT BIRD_OSTRICH OSTRICH MANBIRD_OSTRICH_GIANT BIRD_CROWCROW_MAN +GIANT_CROW +BIRD_RAVEN RAVEN_MAN GIANT_RAVENBIRD_CASSOWARY CASSOWARY_MANGIANT_CASSOWARYBIRD_KEAKEA_MAN GIANT_KEABIRD_OWL_SNOWY SNOWY_OWL_MANGIANT_SNOWY_OWLSPARROW SPARROW_MAN GIANT_SPARROWBIRD_STORK_WHITEWHITE_STORK_MANGIANT_WHITE_STORK BIRD_LOONLOON_MAN +GIANT_LOON BIRD_OWL_BARN BARN_OWL_MANGIANT_BARN_OWL BIRD_PARAKEET PARAKEET_MANGIANT_PARAKEET BIRD_KAKAPO +KAKAPO_MAN GIANT_KAKAPOBIRD_PARROT_GREYGREY_PARROT_MANGIANT_GREY_PARROT BIRD_PUFFIN +PUFFIN_MAN GIANT_PUFFIN BIRD_SWANSWAN_MAN +GIANT_SWAN BIRD_LORIKEET LORIKEET_MANGIANT_LORIKEET BIRD_WRENWREN_MAN +GIANT_WREN BIRD_OSPREY +OSPREY_MAN GIANT_OSPREYBIRD_EMUEMU_MAN GIANT_EMUBIRD_COCKATIEL COCKATIEL_MANGIANT_COCKATIELBIRD_LOVEBIRD_PEACH-FACEDPEACH-FACED_LOVEBIRD_MANGIANT_PEACH-FACED_LOVEBIRD BIRD_MAGPIE +MAGPIE_MAN GIANT_MAGPIE BIRD_KESTREL KESTREL_MAN GIANT_KESTRELBIRD_ALBATROSS ALBATROSS_MANGIANT_ALBATROSSBIRD_OWL_GREAT_HORNEDGREAT_HORNED_OWL_MANGIANT_GREAT_HORNED_OWL +BIRD_EAGLE EAGLE_MAN GIANT_EAGLE BIRD_HORNBILL HORNBILL_MANGIANT_HORNBILLBIRD_LOVEBIRD_MASKEDMASKED_LOVEBIRD_MANGIANT_MASKED_LOVEBIRD BIRD_BUSHTIT BUSHTIT_MAN GIANT_BUSHTIT DAMSELFLY DAMSELFLY_MANGIANT_DAMSELFLYMOTHMOTH_MAN +GIANT_MOTH GRASSHOPPERGRASSHOPPER_MANGIANT_GRASSHOPPER BARK_SCORPIONBARK_SCORPION_MANGIANT_BARK_SCORPIONMANTIS +MANTIS_MAN GIANT_MANTISTICKTICK_MAN +GIANT_TICKLOUSE LOUSE_MAN GIANT_LOUSETHRIPS +THRIPS_MAN GIANT_THRIPSSLUGSLUG_MAN +GIANT_SLUGMOSQUITO MOSQUITO_MANGIANT_MOSQUITOSPIDER_JUMPINGJUMPING_SPIDER_MANGIANT_JUMPING_SPIDERTERMITE +MOON_SNAILMOON_SNAIL_MANGIANT_MOON_SNAILSPIDER_BROWN_RECLUSEBROWN_RECLUSE_SPIDER_MANGIANT_BROWN_RECLUSE_SPIDERSNAIL SNAIL_MAN GIANT_SNAIL GECKO_LEOPARDLEOPARD_GECKO_MANGIANT_LEOPARD_GECKODESERT TORTOISEDESERT_TORTOISE_MANGIANT_DESERT_TORTOISE GILA_MONSTERGILA_MONSTER_MANGIANT_GILA_MONSTERDOGCATMULEDONKEYHORSECOWSHEEPPIGGOAT BIRD_CHICKENCAVY BIRD_DUCK WATER_BUFFALOREINDEER +BIRD_GOOSEYAKLLAMAALPACABIRD_GUINEAFOWLBIRD_PEAFOWL_BLUE BIRD_TURKEYRABBITCHIMERACENTAURGRIFFONFLYFLY_MAN GIANT_FLY ROACH_LARGE ROACH_MAN GIANT_ROACHBEETLE +BEETLE_MAN GIANT_BEETLEANTBUTTERFLY_MONARCHBUTTERFLY_MONARCH_MANGIANT_BUTTERFLY_MONARCHFIREFLY FIREFLY_MAN GIANT_FIREFLY DRAGONFLY DRAGONFLY_MANGIANT_DRAGONFLY HONEY_BEE BUMBLEBEE GOAT_MOUNTAINGOAT_MOUNTAIN_MANGIANT_GOAT_MOUNTAIN MARMOT_HOARYMARMOT_HOARY_MANGIANT_MARMOT_HOARYGNOME_MOUNTAIN +GNOME_DARKWALRUS +WALRUS_MAN GIANT_WALRUSFISH_LAMPREY_SEASHARK_GREAT_WHITE SHARK_FRILLSHARK_SPINY_DOGFISHSHARK_WOBBEGONG_SPOTTED SHARK_WHALE SHARK_BASKING SHARK_NURSESHARK_MAKO_SHORTFINSHARK_MAKO_LONGFIN SHARK_TIGER +SHARK_BULLSHARK_REEF_BLACKTIPSHARK_REEF_WHITETIP +SHARK_BLUESHARK_HAMMERHEAD SHARK_ANGELFISH_SKATE_COMMONFISH_RAY_MANTA FISH_STINGRAYFISH_COELACANTH FISH_STURGEONFISH_CONGER_EEL FISH_MILKFISHFISH_COD FISH_OPAHFISH_GROUPER_GIANT FISH_BLUEFISHFISH_SUNFISH_OCEANFISH_SWORDFISH FISH_MARLIN FISH_HALIBUTFISH_BARRACUDA_GREATFISH_TUNA_BLUEFINNARWHAL NARWHAL MANNARWHAL, GIANTHIPPO HIPPO_MAN GIANT_HIPPOFISH_GAR_LONGNOSE FISH_CARPFISH_TIGERFISH FISH_PIKEPLATYPUS PLATYPUS MANPLATYPUS, GIANT BEAR_GRIZZLYBEAR_GRIZZLY_MANGIANT_BEAR_GRIZZLY +BEAR_BLACKBEAR_BLACK_MANGIANT_BEAR_BLACKDEERDEER_MAN +GIANT_DEERFOXFOX_MAN GIANT_FOXRACCOON RACCOON_MAN GIANT_RACCOONMACAQUE_RHESUSMACAQUE_RHESUS_MANGIANT_MACAQUE_RHESUSCOUGAR +COUGAR_MAN GIANT_COUGARWOLFWOLF_MAN +GIANT_WOLF GROUNDHOG GROUNDHOG_MANGIANT_GROUNDHOG ALLIGATOR ALLIGATOR_MANGIANT_ALLIGATOR BIRD_BUZZARD BUZZARD_MAN GIANT_BUZZARDPANDAPANDA, GIGANTIC PANDA MANCAPYBARACAPYBARA, GIANT CAPYBARA MANBADGER +BADGER MAN BADGER, GIANTMOOSE MOOSE MAN MOOSE, GIANT RED PANDA RED PANDA MANRED PANDA, GIANTELEPHANT ELEPHANT_MANGIANT_ELEPHANTWARTHOG WARTHOG_MAN GIANT_WARTHOGLIONLION_MAN +GIANT_LIONLEOPARD LEOPARD_MAN GIANT_LEOPARDJAGUAR +JAGUAR_MAN GIANT_JAGUARTIGER TIGER_MAN GIANT_TIGERCHEETAH CHEETAH_MAN GIANT_CHEETAHGAZELLE GAZELLE_MAN GIANT_GAZELLEMANDRILL MANDRILL_MANGIANT_MANDRILL +CHIMPANZEEBONOBOGORILLA ORANGUTANGIBBON_SIAMANGGIBBON_WHITE_HANDEDGIBBON_BLACK_HANDED GIBBON_GRAYGIBBON_SILVERYGIBBON_PILEATED GIBBON_BILOUGIBBON_WHITE_BROWEDGIBBON_BLACK_CRESTED CAMEL_1_HUMPCAMEL_1_HUMP_MANGIANT_CAMEL_1_HUMP CAMEL_2_HUMPCAMEL_2_HUMP_MANGIANT_CAMEL_2_HUMPCROCODILE_SALTWATERCROCODILE_SALTWATER_MANGIANT_CROCODILE_SALTWATER BIRD_VULTURE VULTURE_MAN GIANT_VULTURE +RHINOCEROSRHINOCEROS_MANGIANT_RHINOCEROSGIRAFFE GIRAFFE_MAN GIANT_GIRAFFE HONEY BADGERHONEY BADGER MANHONEY BADGER, GIANTGIANT TORTOISEGIANT TORTOISE MANGIGANTIC TORTOISE ARMADILLO ARMADILLO MANARMADILLO, GIANTMUSKOX +MUSKOX_MAN GIANT_MUSKOXELKELK_MAN GIANT_ELK +BEAR_POLARBEAR_POLAR_MANGIANT_BEAR_POLAR WOLVERINE WOLVERINE_MANGIANT_WOLVERINE +CHINCHILLACHINCHILLA_MANGIANT_CHINCHILLA FLOATING_GUTSDRUNIAN CREEPING_EYEVORACIOUS_CAVE_CRAWLERBLIND_CAVE_OGRE +CAP_HOPPER +MAGMA_CRABCRUNDLE HUNGRY_HEAD +FLESH_BALLELK_BIRD HELMET_SNAKEGREEN_DEVOURERRUTHERERCREEPY_CRAWLERDRALTHAGIANT_EARTHWORM BLOOD_MANBUGBATMANERA +MOLEMARIANJABBERER POND_GRABBERBLIND_CAVE_BEAR CAVE_DRAGONREACHERELEMENTMAN_GABBROGORLAK CAVE_FLOATERPLUMP_HELMET_MAN CAVE_BLOBELEMENTMAN_AMETHYSTOCTOPUS OCTOPUS_MAN GIANT_OCTOPUSCRABCRAB_MAN +GIANT_CRAB LEOPARD_SEALLEOPARD_SEAL_MANGIANT_LEOPARD_SEAL +CUTTLEFISHCUTTLEFISH_MANGIANT_CUTTLEFISHORCAORCA_MAN +GIANT_ORCASPONGE +SPONGE_MAN GIANT_SPONGEHORSESHOE_CRABHORSESHOE_CRAB_MANGIANT_HORSESHOE_CRAB SPERM_WHALESPERM_WHALE_MANGIANT_SPERM_WHALE ELEPHANT_SEALELEPHANT_SEAL_MANGIANT_ELEPHANT_SEAL HARP_SEAL HARP_SEAL_MANGIANT_HARP_SEALNAUTILUS NAUTILUS_MANGIANT_NAUTILUS FOXSQUIRREL MOGHOPPER RAT_DEMONWAMBLER_FLUFFYLIZARD_RHINO_TWO_LEGGED WORM_KNUCKLESPIDER_PHANTOM FLY_ACORN +GNAT_BLOODLIZARD +LIZARD_MAN GIANT_LIZARDSKINK SKINK_MAN GIANT_SKINK CHAMELEON CHAMELEON_MANGIANT_CHAMELEONANOLE ANOLE_MAN GIANT_ANOLEIGUANA +IGUANA_MAN GIANT_IGUANA RIVER OTTER SEA OTTER OTTER_MAN GIANT_OTTERSNAPPING TURTLEALLIGATOR SNAPPING TURTLESNAPPING_TURTLE_MANGIANT_SNAPPING_TURTLEBEAVER +BEAVER_MAN GIANT_BEAVERLEECH LEECH_MAN GIANT_LEECHAXOLOTL AXOLOTL_MAN GIANT_AXOLOTLMINKMINK_MAN +GIANT_MINK POND_TURTLEPOND_TURTLE_MANGIANT_POND_TURTLERATRAT_MAN SQUIRREL_GRAYSQUIRREL_GRAY_MANGIANT_SQUIRREL_GRAY SQUIRREL_REDSQUIRREL_RED_MANGIANT_SQUIRREL_REDCHIPMUNK CHIPMUNK_MANGIANT_CHIPMUNKHAMSTER HAMSTER_MAN GIANT_HAMSTERHEDGEHOG HEDGEHOG_MANGIANT_HEDGEHOGSQUIRREL_FLYINGFLYING_SQUIRREL_MANGIANT_FLYING_SQUIRRELMUSSELOYSTER FISH_SALMONFISH_CLOWNFISH FISH_HAGFISHFISH_LAMPREY_BROOK FISH_RAY_BATFISH_RAY_THORNBACKFISH_RATFISH_SPOTTED FISH_HERRING FISH_SHAD FISH_ANCHOVYFISH_TROUT_STEELHEAD FISH_HAKE FISH_SEAHORSE FISH_GLASSEYEFISH_PUFFER_WHITE_SPOTTED FISH_SOLE FISH_FLOUNDER FISH_MACKERELJELLYFISH_SEA_NETTLESQUID SQUID MANGIGANTIC SQUID FISH_LUNGFISHFISH_LOACH_CLOWNFISH_BULLHEAD_BROWNFISH_BULLHEAD_YELLOWFISH_BULLHEAD_BLACKFISH_KNIFEFISH_BANDED FISH_CHARFISH_TROUT_RAINBOWFISH_MOLLY_SAILFIN +FISH_GUPPY +FISH_PERCHDWARFHUMANELFGOBLINKOBOLDGREMLINTROLLOGREUNICORNDRAGONSATYRCOLOSSUS_BRONZEGIANTCYCLOPSETTINMINOTAURYETI SASQUATCH BLIZZARD_MANWOLF_ICEFAIRYPIXIEBEAK_DOG GRIMELING BLENDEC_FOUL STRANGLER NIGHTWINGHARPYHYDRA MERPERSON SEA_SERPENT SEA_MONSTERBIRD_ROCCROCODILE_CAVETOAD_GIANT_CAVE OLM_GIANT BAT_GIANT RAT_GIANT RAT_LARGEMOLE_DOG_NAKED +TROGLODYTE +MOLE_GIANTIMP_FIRESPIDER_CAVE_GIANT SPIDER_CAVE FISH_CAVE CAVE_FISH_MAN LOBSTER_CAVE +SNAKE_FIREOLMOLM_MANBATBAT_MANMAGGOT_PURRINGELEMENTMAN_FIREELEMENTMAN_MAGMAELEMENTMAN_IRONELEMENTMAN_MUDBIRD_SWALLOW_CAVECAVE_SWALLOW_MANBIRD_SWALLOW_CAVE_GIANT AMPHIBIAN_MAN REPTILE_MAN SERPENT_MANANT_MAN +RODENT MAN WILD_BOAR WILD_BOAR_MANGIANT_WILD_BOARCOYOTE +COYOTE_MAN GIANT_COYOTEKANGAROO KANGAROO_MANGIANT_KANGAROOKOALA KOALA_MAN GIANT_KOALAADDER ADDER_MAN GIANT_ADDERECHIDNA ECHIDNA_MAN GIANT_ECHIDNA PORCUPINE PORCUPINE_MANGIANT_PORCUPINE KINGSNAKE KINGSNAKE_MANGIANT_KINGSNAKE GRAY_LANGURGRAY_LANGUR_MANGIANT_GRAY_LANGURBOBCAT +BOBCAT_MAN GIANT_BOBCATSKUNK SKUNK_MAN GIANT_SKUNKGREEN_TREE_FROGGREEN_TREE_FROG_MANGIANT_GREEN_TREE_FROGHAREHARE_MAN +GIANT_HARE RATTLESNAKERATTLESNAKE_MANGIANT_RATTLESNAKEWEASEL +WEASEL_MAN GIANT_WEASELCOPPERHEAD_SNAKECOPPERHEAD_SNAKE_MANGIANT_COPPERHEAD_SNAKEIBEXIBEX_MAN +GIANT_IBEXWOMBAT +WOMBAT_MAN GIANT_WOMBATDINGO DINGO_MAN GIANT_DINGOCOATI COATI_MAN GIANT_COATIOPOSSUM OPOSSUM_MAN GIANT_OPOSSUMMONGOOSE MONGOOSE_MANGIANT_MONGOOSEHYENA HYENA_MAN GIANT_HYENAANACONDA ANACONDA_MANGIANT_ANACONDAMONITOR_LIZARDMONITOR_LIZARD_MANGIANT_MONITOR_LIZARD +KING_COBRAKING_COBRA_MANGIANT_KING_COBRAOCELOT +OCELOT_MAN GIANT_OCELOTJACKAL +JACKAL_MAN GIANT_JACKALCAPUCHIN CAPUCHIN_MANGIANT_CAPUCHINSLOTH SLOTH_MAN GIANT_SLOTH SPIDER_MONKEYSPIDER_MONKEY_MANGIANT_SPIDER_MONKEYPANGOLIN PANGOLIN_MANGIANT_PANGOLIN BLACK_MAMBABLACK_MAMBA_MANGIANT_BLACK_MAMBA +BEAR_SLOTHSLOTH_BEAR_MANGIANT_SLOTH_BEARAYE-AYE AYE-AYE_MAN GIANT_AYE-AYE +BUSHMASTERBUSHMASTER_MANGIANT_BUSHMASTERPYTHON +PYTHON_MAN GIANT_PYTHONTAPIR TAPIR_MAN GIANT_TAPIRIMPALA +IMPALA_MAN GIANT_IMPALAAARDVARK AARDVARK_MANGIANT_AARDVARK LION_TAMARINLION_TAMARIN_MANGIANT_LION_TAMARINSTOAT STOAT_MAN GIANT_STOATLYNXLYNX_MAN +GIANT_LYNX"TOAD"TOAD_MAN" +GIANT_TOAD"WORM"WORM_MAN" BIRD_BLUEJAY" BLUEJAY_MAN" GIANT_BLUEJAY" BIRD_CARDINAL" CARDINAL_MAN"GIANT_CARDINAL" BIRD_GRACKLE" GRACKLE_MAN" GIANT_GRACKLE" BIRD_ORIOLE" +ORIOLE_MAN" GIANT_ORIOLE"BIRD_RW_BLACKBIRD"RW_BLACKBIRD_MAN"GIANT_RW_BLACKBIRD" BIRD_PENGUIN"BIRD_PENGUIN_LITTLE"BIRD_PENGUIN_EMPEROR" PENGUIN MAN"BIRD_PENGUIN_GIANT"BIRD_FALCON_PEREGRINE"PEREGRINE FALCON MAN"GIANT PEREGRINE FALCON" BIRD_KIWI"KIWI MAN"BIRD_KIWI_GIANT" BIRD_OSTRICH" OSTRICH MAN"BIRD_OSTRICH_GIANT" BIRD_CROW"CROW_MAN" +GIANT_CROW" +BIRD_RAVEN" RAVEN_MAN" GIANT_RAVEN"BIRD_CASSOWARY" CASSOWARY_MAN"GIANT_CASSOWARY"BIRD_KEA"KEA_MAN" GIANT_KEA"BIRD_OWL_SNOWY" SNOWY_OWL_MAN"GIANT_SNOWY_OWL"SPARROW" SPARROW_MAN" GIANT_SPARROW"BIRD_STORK_WHITE"WHITE_STORK_MAN"GIANT_WHITE_STORK" BIRD_LOON"LOON_MAN" +GIANT_LOON" BIRD_OWL_BARN" BARN_OWL_MAN"GIANT_BARN_OWL" BIRD_PARAKEET" PARAKEET_MAN"GIANT_PARAKEET" BIRD_KAKAPO" +KAKAPO_MAN" GIANT_KAKAPO"BIRD_PARROT_GREY"GREY_PARROT_MAN"GIANT_GREY_PARROT" BIRD_PUFFIN" +PUFFIN_MAN" GIANT_PUFFIN" BIRD_SWAN"SWAN_MAN" +GIANT_SWAN" BIRD_LORIKEET" LORIKEET_MAN"GIANT_LORIKEET" BIRD_WREN"WREN_MAN" +GIANT_WREN" BIRD_OSPREY" +OSPREY_MAN" GIANT_OSPREY"BIRD_EMU"EMU_MAN" GIANT_EMU"BIRD_COCKATIEL" COCKATIEL_MAN"GIANT_COCKATIEL"BIRD_LOVEBIRD_PEACH-FACED"PEACH-FACED_LOVEBIRD_MAN"GIANT_PEACH-FACED_LOVEBIRD" BIRD_MAGPIE" +MAGPIE_MAN" GIANT_MAGPIE" BIRD_KESTREL" KESTREL_MAN" GIANT_KESTREL"BIRD_ALBATROSS" ALBATROSS_MAN"GIANT_ALBATROSS"BIRD_OWL_GREAT_HORNED"GREAT_HORNED_OWL_MAN"GIANT_GREAT_HORNED_OWL" +BIRD_EAGLE" EAGLE_MAN" GIANT_EAGLE" BIRD_HORNBILL" HORNBILL_MAN"GIANT_HORNBILL"BIRD_LOVEBIRD_MASKED"MASKED_LOVEBIRD_MAN"GIANT_MASKED_LOVEBIRD" BIRD_BUSHTIT" BUSHTIT_MAN" GIANT_BUSHTIT" DAMSELFLY" DAMSELFLY_MAN"GIANT_DAMSELFLY"MOTH"MOTH_MAN" +GIANT_MOTH" GRASSHOPPER"GRASSHOPPER_MAN"GIANT_GRASSHOPPER" BARK_SCORPION"BARK_SCORPION_MAN"GIANT_BARK_SCORPION"MANTIS" +MANTIS_MAN" GIANT_MANTIS"TICK"TICK_MAN" +GIANT_TICK"LOUSE" LOUSE_MAN" GIANT_LOUSE"THRIPS" +THRIPS_MAN" GIANT_THRIPS"SLUG"SLUG_MAN" +GIANT_SLUG"MOSQUITO" MOSQUITO_MAN"GIANT_MOSQUITO"SPIDER_JUMPING"JUMPING_SPIDER_MAN"GIANT_JUMPING_SPIDER"TERMITE" +MOON_SNAIL"MOON_SNAIL_MAN"GIANT_MOON_SNAIL"SPIDER_BROWN_RECLUSE"BROWN_RECLUSE_SPIDER_MAN"GIANT_BROWN_RECLUSE_SPIDER"SNAIL" SNAIL_MAN" GIANT_SNAIL" GECKO_LEOPARD"LEOPARD_GECKO_MAN"GIANT_LEOPARD_GECKO"DESERT TORTOISE"DESERT_TORTOISE_MAN"GIANT_DESERT_TORTOISE" GILA_MONSTER"GILA_MONSTER_MAN"GIANT_GILA_MONSTER"DOG"CAT"MULE"DONKEY"HORSE"COW"SHEEP"PIG"GOAT" BIRD_CHICKEN"CAVY" BIRD_DUCK" WATER_BUFFALO"REINDEER" +BIRD_GOOSE"YAK"LLAMA"ALPACA"BIRD_GUINEAFOWL"BIRD_PEAFOWL_BLUE" BIRD_TURKEY"RABBIT"CHIMERA"CENTAUR"GRIFFON"FLY"FLY_MAN" GIANT_FLY" ROACH_LARGE" ROACH_MAN" GIANT_ROACH"BEETLE" +BEETLE_MAN" GIANT_BEETLE"ANT"BUTTERFLY_MONARCH"BUTTERFLY_MONARCH_MAN"GIANT_BUTTERFLY_MONARCH"FIREFLY" FIREFLY_MAN" GIANT_FIREFLY" DRAGONFLY" DRAGONFLY_MAN"GIANT_DRAGONFLY" HONEY_BEE" BUMBLEBEE" GOAT_MOUNTAIN"GOAT_MOUNTAIN_MAN"GIANT_GOAT_MOUNTAIN" MARMOT_HOARY"MARMOT_HOARY_MAN"GIANT_MARMOT_HOARY"GNOME_MOUNTAIN" +GNOME_DARK"WALRUS" +WALRUS_MAN" GIANT_WALRUS"FISH_LAMPREY_SEA"SHARK_GREAT_WHITE" SHARK_FRILL"SHARK_SPINY_DOGFISH"SHARK_WOBBEGONG_SPOTTED" SHARK_WHALE" SHARK_BASKING" SHARK_NURSE"SHARK_MAKO_SHORTFIN"SHARK_MAKO_LONGFIN" SHARK_TIGER" +SHARK_BULL"SHARK_REEF_BLACKTIP"SHARK_REEF_WHITETIP" +SHARK_BLUE"SHARK_HAMMERHEAD" SHARK_ANGEL"FISH_SKATE_COMMON"FISH_RAY_MANTA" FISH_STINGRAY"FISH_COELACANTH" FISH_STURGEON"FISH_CONGER_EEL" FISH_MILKFISH"FISH_COD" FISH_OPAH"FISH_GROUPER_GIANT" FISH_BLUEFISH"FISH_SUNFISH_OCEAN"FISH_SWORDFISH" FISH_MARLIN" FISH_HALIBUT"FISH_BARRACUDA_GREAT"FISH_TUNA_BLUEFIN"NARWHAL" NARWHAL MAN"NARWHAL, GIANT"HIPPO" HIPPO_MAN" GIANT_HIPPO"FISH_GAR_LONGNOSE" FISH_CARP"FISH_TIGERFISH" FISH_PIKE"PLATYPUS" PLATYPUS MAN"PLATYPUS, GIANT" BEAR_GRIZZLY"BEAR_GRIZZLY_MAN"GIANT_BEAR_GRIZZLY" +BEAR_BLACK"BEAR_BLACK_MAN"GIANT_BEAR_BLACK"DEER"DEER_MAN" +GIANT_DEER"FOX"FOX_MAN" GIANT_FOX"RACCOON" RACCOON_MAN" GIANT_RACCOON"MACAQUE_RHESUS"MACAQUE_RHESUS_MAN"GIANT_MACAQUE_RHESUS"COUGAR" +COUGAR_MAN" GIANT_COUGAR"WOLF"WOLF_MAN" +GIANT_WOLF" GROUNDHOG" GROUNDHOG_MAN"GIANT_GROUNDHOG" ALLIGATOR" ALLIGATOR_MAN"GIANT_ALLIGATOR" BIRD_BUZZARD" BUZZARD_MAN" GIANT_BUZZARD"PANDA"PANDA, GIGANTIC" PANDA MAN"CAPYBARA"CAPYBARA, GIANT" CAPYBARA MAN"BADGER" +BADGER MAN" BADGER, GIANT"MOOSE" MOOSE MAN" MOOSE, GIANT" RED PANDA" RED PANDA MAN"RED PANDA, GIANT"ELEPHANT" ELEPHANT_MAN"GIANT_ELEPHANT"WARTHOG" WARTHOG_MAN" GIANT_WARTHOG"LION"LION_MAN" +GIANT_LION"LEOPARD" LEOPARD_MAN" GIANT_LEOPARD"JAGUAR" +JAGUAR_MAN" GIANT_JAGUAR"TIGER" TIGER_MAN" GIANT_TIGER"CHEETAH" CHEETAH_MAN" GIANT_CHEETAH"GAZELLE" GAZELLE_MAN" GIANT_GAZELLE"MANDRILL" MANDRILL_MAN"GIANT_MANDRILL" +CHIMPANZEE"BONOBO"GORILLA" ORANGUTAN"GIBBON_SIAMANG"GIBBON_WHITE_HANDED"GIBBON_BLACK_HANDED" GIBBON_GRAY"GIBBON_SILVERY"GIBBON_PILEATED" GIBBON_BILOU"GIBBON_WHITE_BROWED"GIBBON_BLACK_CRESTED" CAMEL_1_HUMP"CAMEL_1_HUMP_MAN"GIANT_CAMEL_1_HUMP" CAMEL_2_HUMP"CAMEL_2_HUMP_MAN"GIANT_CAMEL_2_HUMP"CROCODILE_SALTWATER"CROCODILE_SALTWATER_MAN"GIANT_CROCODILE_SALTWATER" BIRD_VULTURE" VULTURE_MAN" GIANT_VULTURE" +RHINOCEROS"RHINOCEROS_MAN"GIANT_RHINOCEROS"GIRAFFE" GIRAFFE_MAN" GIANT_GIRAFFE" HONEY BADGER"HONEY BADGER MAN"HONEY BADGER, GIANT"GIANT TORTOISE"GIANT TORTOISE MAN"GIGANTIC TORTOISE" ARMADILLO" ARMADILLO MAN"ARMADILLO, GIANT"MUSKOX" +MUSKOX_MAN" GIANT_MUSKOX"ELK"ELK_MAN" GIANT_ELK" +BEAR_POLAR"BEAR_POLAR_MAN"GIANT_BEAR_POLAR" WOLVERINE" WOLVERINE_MAN"GIANT_WOLVERINE" +CHINCHILLA"CHINCHILLA_MAN"GIANT_CHINCHILLA" FLOATING_GUTS"DRUNIAN" CREEPING_EYE"VORACIOUS_CAVE_CRAWLER"BLIND_CAVE_OGRE" +CAP_HOPPER" +MAGMA_CRAB"CRUNDLE" HUNGRY_HEAD" +FLESH_BALL"ELK_BIRD" HELMET_SNAKE"GREEN_DEVOURER"RUTHERER"CREEPY_CRAWLER"DRALTHA"GIANT_EARTHWORM" BLOOD_MAN"BUGBAT"MANERA" +MOLEMARIAN"JABBERER" POND_GRABBER"BLIND_CAVE_BEAR" CAVE_DRAGON"REACHER"ELEMENTMAN_GABBRO"GORLAK" CAVE_FLOATER"PLUMP_HELMET_MAN" CAVE_BLOB"ELEMENTMAN_AMETHYST"OCTOPUS" OCTOPUS_MAN" GIANT_OCTOPUS"CRAB"CRAB_MAN" +GIANT_CRAB" LEOPARD_SEAL"LEOPARD_SEAL_MAN"GIANT_LEOPARD_SEAL" +CUTTLEFISH"CUTTLEFISH_MAN"GIANT_CUTTLEFISH"ORCA"ORCA_MAN" +GIANT_ORCA"SPONGE" +SPONGE_MAN" GIANT_SPONGE"HORSESHOE_CRAB"HORSESHOE_CRAB_MAN"GIANT_HORSESHOE_CRAB" SPERM_WHALE"SPERM_WHALE_MAN"GIANT_SPERM_WHALE" ELEPHANT_SEAL"ELEPHANT_SEAL_MAN"GIANT_ELEPHANT_SEAL" HARP_SEAL" HARP_SEAL_MAN"GIANT_HARP_SEAL"NAUTILUS" NAUTILUS_MAN"GIANT_NAUTILUS" FOXSQUIRREL" MOGHOPPER" RAT_DEMON"WAMBLER_FLUFFY"LIZARD_RHINO_TWO_LEGGED" WORM_KNUCKLE"SPIDER_PHANTOM" FLY_ACORN" +GNAT_BLOOD"LIZARD" +LIZARD_MAN" GIANT_LIZARD"SKINK" SKINK_MAN" GIANT_SKINK" CHAMELEON" CHAMELEON_MAN"GIANT_CHAMELEON"ANOLE" ANOLE_MAN" GIANT_ANOLE"IGUANA" +IGUANA_MAN" GIANT_IGUANA" RIVER OTTER" SEA OTTER" OTTER_MAN" GIANT_OTTER"SNAPPING TURTLE"ALLIGATOR SNAPPING TURTLE"SNAPPING_TURTLE_MAN"GIANT_SNAPPING_TURTLE"BEAVER" +BEAVER_MAN" GIANT_BEAVER"LEECH" LEECH_MAN" GIANT_LEECH"AXOLOTL" AXOLOTL_MAN" GIANT_AXOLOTL"MINK"MINK_MAN" +GIANT_MINK" POND_TURTLE"POND_TURTLE_MAN"GIANT_POND_TURTLE"RAT"RAT_MAN" SQUIRREL_GRAY"SQUIRREL_GRAY_MAN"GIANT_SQUIRREL_GRAY" SQUIRREL_RED"SQUIRREL_RED_MAN"GIANT_SQUIRREL_RED"CHIPMUNK" CHIPMUNK_MAN"GIANT_CHIPMUNK"HAMSTER" HAMSTER_MAN" GIANT_HAMSTER"HEDGEHOG" HEDGEHOG_MAN"GIANT_HEDGEHOG"SQUIRREL_FLYING"FLYING_SQUIRREL_MAN"GIANT_FLYING_SQUIRREL"MUSSEL"OYSTER" FISH_SALMON"FISH_CLOWNFISH" FISH_HAGFISH"FISH_LAMPREY_BROOK" FISH_RAY_BAT"FISH_RAY_THORNBACK"FISH_RATFISH_SPOTTED" FISH_HERRING" FISH_SHAD" FISH_ANCHOVY"FISH_TROUT_STEELHEAD" FISH_HAKE" FISH_SEAHORSE" FISH_GLASSEYE"FISH_PUFFER_WHITE_SPOTTED" FISH_SOLE" FISH_FLOUNDER" FISH_MACKEREL"JELLYFISH_SEA_NETTLE"SQUID" SQUID MAN"GIGANTIC SQUID" FISH_LUNGFISH"FISH_LOACH_CLOWN"FISH_BULLHEAD_BROWN"FISH_BULLHEAD_YELLOW"FISH_BULLHEAD_BLACK"FISH_KNIFEFISH_BANDED" FISH_CHAR"FISH_TROUT_RAINBOW"FISH_MOLLY_SAILFIN" +FISH_GUPPY" +FISH_PERCH"DWARF"HUMAN"ELF"GOBLIN"KOBOLD"GREMLIN"TROLL"OGRE"UNICORN"DRAGON"SATYR"COLOSSUS_BRONZE"GIANT"CYCLOPS"ETTIN"MINOTAUR"YETI" SASQUATCH" BLIZZARD_MAN"WOLF_ICE"FAIRY"PIXIE"BEAK_DOG" GRIMELING" BLENDEC_FOUL" STRANGLER" NIGHTWING"HARPY"HYDRA" MERPERSON" SEA_SERPENT" SEA_MONSTER"BIRD_ROC"CROCODILE_CAVE"TOAD_GIANT_CAVE" OLM_GIANT" BAT_GIANT" RAT_GIANT" RAT_LARGE"MOLE_DOG_NAKED" +TROGLODYTE" +MOLE_GIANT"IMP_FIRE"SPIDER_CAVE_GIANT" SPIDER_CAVE" FISH_CAVE" CAVE_FISH_MAN" LOBSTER_CAVE" +SNAKE_FIRE"OLM"OLM_MAN"BAT"BAT_MAN"MAGGOT_PURRING"ELEMENTMAN_FIRE"ELEMENTMAN_MAGMA"ELEMENTMAN_IRON"ELEMENTMAN_MUD"BIRD_SWALLOW_CAVE"CAVE_SWALLOW_MAN"BIRD_SWALLOW_CAVE_GIANT" AMPHIBIAN_MAN" REPTILE_MAN" SERPENT_MAN"ANT_MAN" +RODENT MAN" WILD_BOAR" WILD_BOAR_MAN"GIANT_WILD_BOAR"COYOTE" +COYOTE_MAN" GIANT_COYOTE"KANGAROO" KANGAROO_MAN"GIANT_KANGAROO"KOALA" KOALA_MAN" GIANT_KOALA"ADDER" ADDER_MAN" GIANT_ADDER"ECHIDNA" ECHIDNA_MAN" GIANT_ECHIDNA" PORCUPINE" PORCUPINE_MAN"GIANT_PORCUPINE" KINGSNAKE" KINGSNAKE_MAN"GIANT_KINGSNAKE" GRAY_LANGUR"GRAY_LANGUR_MAN"GIANT_GRAY_LANGUR"BOBCAT" +BOBCAT_MAN" GIANT_BOBCAT"SKUNK" SKUNK_MAN" GIANT_SKUNK"GREEN_TREE_FROG"GREEN_TREE_FROG_MAN"GIANT_GREEN_TREE_FROG"HARE"HARE_MAN" +GIANT_HARE" RATTLESNAKE"RATTLESNAKE_MAN"GIANT_RATTLESNAKE"WEASEL" +WEASEL_MAN" GIANT_WEASEL"COPPERHEAD_SNAKE"COPPERHEAD_SNAKE_MAN"GIANT_COPPERHEAD_SNAKE"IBEX"IBEX_MAN" +GIANT_IBEX"WOMBAT" +WOMBAT_MAN" GIANT_WOMBAT"DINGO" DINGO_MAN" GIANT_DINGO"COATI" COATI_MAN" GIANT_COATI"OPOSSUM" OPOSSUM_MAN" GIANT_OPOSSUM"MONGOOSE" MONGOOSE_MAN"GIANT_MONGOOSE"HYENA" HYENA_MAN" GIANT_HYENA"ANACONDA" ANACONDA_MAN"GIANT_ANACONDA"MONITOR_LIZARD"MONITOR_LIZARD_MAN"GIANT_MONITOR_LIZARD" +KING_COBRA"KING_COBRA_MAN"GIANT_KING_COBRA"OCELOT" +OCELOT_MAN" GIANT_OCELOT"JACKAL" +JACKAL_MAN" GIANT_JACKAL"CAPUCHIN" CAPUCHIN_MAN"GIANT_CAPUCHIN"SLOTH" SLOTH_MAN" GIANT_SLOTH" SPIDER_MONKEY"SPIDER_MONKEY_MAN"GIANT_SPIDER_MONKEY"PANGOLIN" PANGOLIN_MAN"GIANT_PANGOLIN" BLACK_MAMBA"BLACK_MAMBA_MAN"GIANT_BLACK_MAMBA" +BEAR_SLOTH"SLOTH_BEAR_MAN"GIANT_SLOTH_BEAR"AYE-AYE" AYE-AYE_MAN" GIANT_AYE-AYE" +BUSHMASTER"BUSHMASTER_MAN"GIANT_BUSHMASTER"PYTHON" +PYTHON_MAN" GIANT_PYTHON"TAPIR" TAPIR_MAN" GIANT_TAPIR"IMPALA" +IMPALA_MAN" GIANT_IMPALA"AARDVARK" AARDVARK_MAN"GIANT_AARDVARK" LION_TAMARIN"LION_TAMARIN_MAN"GIANT_LION_TAMARIN"STOAT" STOAT_MAN" GIANT_STOAT"LYNX"LYNX_MAN" +GIANT_LYNX*TOAD*TOAD_MAN* +GIANT_TOAD*WORM*WORM_MAN* BIRD_BLUEJAY* BLUEJAY_MAN* GIANT_BLUEJAY* BIRD_CARDINAL* CARDINAL_MAN*GIANT_CARDINAL* BIRD_GRACKLE* GRACKLE_MAN* GIANT_GRACKLE* BIRD_ORIOLE* +ORIOLE_MAN* GIANT_ORIOLE*BIRD_RW_BLACKBIRD*RW_BLACKBIRD_MAN*GIANT_RW_BLACKBIRD* BIRD_PENGUIN*BIRD_PENGUIN_LITTLE*BIRD_PENGUIN_EMPEROR* PENGUIN MAN*BIRD_PENGUIN_GIANT*BIRD_FALCON_PEREGRINE*PEREGRINE FALCON MAN*GIANT PEREGRINE FALCON* BIRD_KIWI*KIWI MAN*BIRD_KIWI_GIANT* BIRD_OSTRICH* OSTRICH MAN*BIRD_OSTRICH_GIANT* BIRD_CROW*CROW_MAN* +GIANT_CROW* +BIRD_RAVEN* RAVEN_MAN* GIANT_RAVEN*BIRD_CASSOWARY* CASSOWARY_MAN*GIANT_CASSOWARY*BIRD_KEA*KEA_MAN* GIANT_KEA*BIRD_OWL_SNOWY* SNOWY_OWL_MAN*GIANT_SNOWY_OWL*SPARROW* SPARROW_MAN* GIANT_SPARROW*BIRD_STORK_WHITE*WHITE_STORK_MAN*GIANT_WHITE_STORK* BIRD_LOON*LOON_MAN* +GIANT_LOON* BIRD_OWL_BARN* BARN_OWL_MAN*GIANT_BARN_OWL* BIRD_PARAKEET* PARAKEET_MAN*GIANT_PARAKEET* BIRD_KAKAPO* +KAKAPO_MAN* GIANT_KAKAPO*BIRD_PARROT_GREY*GREY_PARROT_MAN*GIANT_GREY_PARROT* BIRD_PUFFIN* +PUFFIN_MAN* GIANT_PUFFIN* BIRD_SWAN*SWAN_MAN* +GIANT_SWAN* BIRD_LORIKEET* LORIKEET_MAN*GIANT_LORIKEET* BIRD_WREN*WREN_MAN* +GIANT_WREN* BIRD_OSPREY* +OSPREY_MAN* GIANT_OSPREY*BIRD_EMU*EMU_MAN* GIANT_EMU*BIRD_COCKATIEL* COCKATIEL_MAN*GIANT_COCKATIEL*BIRD_LOVEBIRD_PEACH-FACED*PEACH-FACED_LOVEBIRD_MAN*GIANT_PEACH-FACED_LOVEBIRD* BIRD_MAGPIE* +MAGPIE_MAN* GIANT_MAGPIE* BIRD_KESTREL* KESTREL_MAN* GIANT_KESTREL*BIRD_ALBATROSS* ALBATROSS_MAN*GIANT_ALBATROSS*BIRD_OWL_GREAT_HORNED*GREAT_HORNED_OWL_MAN*GIANT_GREAT_HORNED_OWL* +BIRD_EAGLE* EAGLE_MAN* GIANT_EAGLE* BIRD_HORNBILL* HORNBILL_MAN*GIANT_HORNBILL*BIRD_LOVEBIRD_MASKED*MASKED_LOVEBIRD_MAN*GIANT_MASKED_LOVEBIRD* BIRD_BUSHTIT* BUSHTIT_MAN* GIANT_BUSHTIT* DAMSELFLY* DAMSELFLY_MAN*GIANT_DAMSELFLY*MOTH*MOTH_MAN* +GIANT_MOTH* GRASSHOPPER*GRASSHOPPER_MAN*GIANT_GRASSHOPPER* BARK_SCORPION*BARK_SCORPION_MAN*GIANT_BARK_SCORPION*MANTIS* +MANTIS_MAN* GIANT_MANTIS*TICK*TICK_MAN* +GIANT_TICK*LOUSE* LOUSE_MAN* GIANT_LOUSE*THRIPS* +THRIPS_MAN* GIANT_THRIPS*SLUG*SLUG_MAN* +GIANT_SLUG*MOSQUITO* MOSQUITO_MAN*GIANT_MOSQUITO*SPIDER_JUMPING*JUMPING_SPIDER_MAN*GIANT_JUMPING_SPIDER*TERMITE* +MOON_SNAIL*MOON_SNAIL_MAN*GIANT_MOON_SNAIL*SPIDER_BROWN_RECLUSE*BROWN_RECLUSE_SPIDER_MAN*GIANT_BROWN_RECLUSE_SPIDER*SNAIL* SNAIL_MAN* GIANT_SNAIL* GECKO_LEOPARD*LEOPARD_GECKO_MAN*GIANT_LEOPARD_GECKO*DESERT TORTOISE*DESERT_TORTOISE_MAN*GIANT_DESERT_TORTOISE* GILA_MONSTER*GILA_MONSTER_MAN*GIANT_GILA_MONSTER*DOG*CAT*MULE*DONKEY*HORSE*COW*SHEEP*PIG*GOAT* BIRD_CHICKEN*CAVY* BIRD_DUCK* WATER_BUFFALO*REINDEER* +BIRD_GOOSE*YAK*LLAMA*ALPACA*BIRD_GUINEAFOWL*BIRD_PEAFOWL_BLUE* BIRD_TURKEY*RABBIT*CHIMERA*CENTAUR*GRIFFON*FLY*FLY_MAN* GIANT_FLY* ROACH_LARGE* ROACH_MAN* GIANT_ROACH*BEETLE* +BEETLE_MAN* GIANT_BEETLE*ANT*BUTTERFLY_MONARCH*BUTTERFLY_MONARCH_MAN*GIANT_BUTTERFLY_MONARCH*FIREFLY* FIREFLY_MAN* GIANT_FIREFLY* DRAGONFLY* DRAGONFLY_MAN*GIANT_DRAGONFLY* HONEY_BEE* BUMBLEBEE* GOAT_MOUNTAIN*GOAT_MOUNTAIN_MAN*GIANT_GOAT_MOUNTAIN* MARMOT_HOARY*MARMOT_HOARY_MAN*GIANT_MARMOT_HOARY*GNOME_MOUNTAIN* +GNOME_DARK*WALRUS* +WALRUS_MAN* GIANT_WALRUS*FISH_LAMPREY_SEA*SHARK_GREAT_WHITE* SHARK_FRILL*SHARK_SPINY_DOGFISH*SHARK_WOBBEGONG_SPOTTED* SHARK_WHALE* SHARK_BASKING* SHARK_NURSE*SHARK_MAKO_SHORTFIN*SHARK_MAKO_LONGFIN* SHARK_TIGER* +SHARK_BULL*SHARK_REEF_BLACKTIP*SHARK_REEF_WHITETIP* +SHARK_BLUE*SHARK_HAMMERHEAD* SHARK_ANGEL*FISH_SKATE_COMMON*FISH_RAY_MANTA* FISH_STINGRAY*FISH_COELACANTH* FISH_STURGEON*FISH_CONGER_EEL* FISH_MILKFISH*FISH_COD* FISH_OPAH*FISH_GROUPER_GIANT* FISH_BLUEFISH*FISH_SUNFISH_OCEAN*FISH_SWORDFISH* FISH_MARLIN* FISH_HALIBUT*FISH_BARRACUDA_GREAT*FISH_TUNA_BLUEFIN*NARWHAL* NARWHAL MAN*NARWHAL, GIANT*HIPPO* HIPPO_MAN* GIANT_HIPPO*FISH_GAR_LONGNOSE* FISH_CARP*FISH_TIGERFISH* FISH_PIKE*PLATYPUS* PLATYPUS MAN*PLATYPUS, GIANT* BEAR_GRIZZLY*BEAR_GRIZZLY_MAN*GIANT_BEAR_GRIZZLY* +BEAR_BLACK*BEAR_BLACK_MAN*GIANT_BEAR_BLACK*DEER*DEER_MAN* +GIANT_DEER*FOX*FOX_MAN* GIANT_FOX*RACCOON* RACCOON_MAN* GIANT_RACCOON*MACAQUE_RHESUS*MACAQUE_RHESUS_MAN*GIANT_MACAQUE_RHESUS*COUGAR* +COUGAR_MAN* GIANT_COUGAR*WOLF*WOLF_MAN* +GIANT_WOLF* GROUNDHOG* GROUNDHOG_MAN*GIANT_GROUNDHOG* ALLIGATOR* ALLIGATOR_MAN*GIANT_ALLIGATOR* BIRD_BUZZARD* BUZZARD_MAN* GIANT_BUZZARD*PANDA*PANDA, GIGANTIC* PANDA MAN*CAPYBARA*CAPYBARA, GIANT* CAPYBARA MAN*BADGER* +BADGER MAN* BADGER, GIANT*MOOSE* MOOSE MAN* MOOSE, GIANT* RED PANDA* RED PANDA MAN*RED PANDA, GIANT*ELEPHANT* ELEPHANT_MAN*GIANT_ELEPHANT*WARTHOG* WARTHOG_MAN* GIANT_WARTHOG*LION*LION_MAN* +GIANT_LION*LEOPARD* LEOPARD_MAN* GIANT_LEOPARD*JAGUAR* +JAGUAR_MAN* GIANT_JAGUAR*TIGER* TIGER_MAN* GIANT_TIGER*CHEETAH* CHEETAH_MAN* GIANT_CHEETAH*GAZELLE* GAZELLE_MAN* GIANT_GAZELLE*MANDRILL* MANDRILL_MAN*GIANT_MANDRILL* +CHIMPANZEE*BONOBO*GORILLA* ORANGUTAN*GIBBON_SIAMANG*GIBBON_WHITE_HANDED*GIBBON_BLACK_HANDED* GIBBON_GRAY*GIBBON_SILVERY*GIBBON_PILEATED* GIBBON_BILOU*GIBBON_WHITE_BROWED*GIBBON_BLACK_CRESTED* CAMEL_1_HUMP*CAMEL_1_HUMP_MAN*GIANT_CAMEL_1_HUMP* CAMEL_2_HUMP*CAMEL_2_HUMP_MAN*GIANT_CAMEL_2_HUMP*CROCODILE_SALTWATER*CROCODILE_SALTWATER_MAN*GIANT_CROCODILE_SALTWATER* BIRD_VULTURE* VULTURE_MAN* GIANT_VULTURE* +RHINOCEROS*RHINOCEROS_MAN*GIANT_RHINOCEROS*GIRAFFE* GIRAFFE_MAN* GIANT_GIRAFFE* HONEY BADGER*HONEY BADGER MAN*HONEY BADGER, GIANT*GIANT TORTOISE*GIANT TORTOISE MAN*GIGANTIC TORTOISE* ARMADILLO* ARMADILLO MAN*ARMADILLO, GIANT*MUSKOX* +MUSKOX_MAN* GIANT_MUSKOX*ELK*ELK_MAN* GIANT_ELK* +BEAR_POLAR*BEAR_POLAR_MAN*GIANT_BEAR_POLAR* WOLVERINE* WOLVERINE_MAN*GIANT_WOLVERINE* +CHINCHILLA*CHINCHILLA_MAN*GIANT_CHINCHILLA* FLOATING_GUTS*DRUNIAN* CREEPING_EYE*VORACIOUS_CAVE_CRAWLER*BLIND_CAVE_OGRE* +CAP_HOPPER* +MAGMA_CRAB*CRUNDLE* HUNGRY_HEAD* +FLESH_BALL*ELK_BIRD* HELMET_SNAKE*GREEN_DEVOURER*RUTHERER*CREEPY_CRAWLER*DRALTHA*GIANT_EARTHWORM* BLOOD_MAN*BUGBAT*MANERA* +MOLEMARIAN*JABBERER* POND_GRABBER*BLIND_CAVE_BEAR* CAVE_DRAGON*REACHER*ELEMENTMAN_GABBRO*GORLAK* CAVE_FLOATER*PLUMP_HELMET_MAN* CAVE_BLOB*ELEMENTMAN_AMETHYST*OCTOPUS* OCTOPUS_MAN* GIANT_OCTOPUS*CRAB*CRAB_MAN* +GIANT_CRAB* LEOPARD_SEAL*LEOPARD_SEAL_MAN*GIANT_LEOPARD_SEAL* +CUTTLEFISH*CUTTLEFISH_MAN*GIANT_CUTTLEFISH*ORCA*ORCA_MAN* +GIANT_ORCA*SPONGE* +SPONGE_MAN* GIANT_SPONGE*HORSESHOE_CRAB*HORSESHOE_CRAB_MAN*GIANT_HORSESHOE_CRAB* SPERM_WHALE*SPERM_WHALE_MAN*GIANT_SPERM_WHALE* ELEPHANT_SEAL*ELEPHANT_SEAL_MAN*GIANT_ELEPHANT_SEAL* HARP_SEAL* HARP_SEAL_MAN*GIANT_HARP_SEAL*NAUTILUS* NAUTILUS_MAN*GIANT_NAUTILUS* FOXSQUIRREL* MOGHOPPER* RAT_DEMON*WAMBLER_FLUFFY*LIZARD_RHINO_TWO_LEGGED* WORM_KNUCKLE*SPIDER_PHANTOM* FLY_ACORN* +GNAT_BLOOD*LIZARD* +LIZARD_MAN* GIANT_LIZARD*SKINK* SKINK_MAN* GIANT_SKINK* CHAMELEON* CHAMELEON_MAN*GIANT_CHAMELEON*ANOLE* ANOLE_MAN* GIANT_ANOLE*IGUANA* +IGUANA_MAN* GIANT_IGUANA* RIVER OTTER* SEA OTTER* OTTER_MAN* GIANT_OTTER*SNAPPING TURTLE*ALLIGATOR SNAPPING TURTLE*SNAPPING_TURTLE_MAN*GIANT_SNAPPING_TURTLE*BEAVER* +BEAVER_MAN* GIANT_BEAVER*LEECH* LEECH_MAN* GIANT_LEECH*AXOLOTL* AXOLOTL_MAN* GIANT_AXOLOTL*MINK*MINK_MAN* +GIANT_MINK* POND_TURTLE*POND_TURTLE_MAN*GIANT_POND_TURTLE*RAT*RAT_MAN* SQUIRREL_GRAY*SQUIRREL_GRAY_MAN*GIANT_SQUIRREL_GRAY* SQUIRREL_RED*SQUIRREL_RED_MAN*GIANT_SQUIRREL_RED*CHIPMUNK* CHIPMUNK_MAN*GIANT_CHIPMUNK*HAMSTER* HAMSTER_MAN* GIANT_HAMSTER*HEDGEHOG* HEDGEHOG_MAN*GIANT_HEDGEHOG*SQUIRREL_FLYING*FLYING_SQUIRREL_MAN*GIANT_FLYING_SQUIRREL*MUSSEL*OYSTER* FISH_SALMON*FISH_CLOWNFISH* FISH_HAGFISH*FISH_LAMPREY_BROOK* FISH_RAY_BAT*FISH_RAY_THORNBACK*FISH_RATFISH_SPOTTED* FISH_HERRING* FISH_SHAD* FISH_ANCHOVY*FISH_TROUT_STEELHEAD* FISH_HAKE* FISH_SEAHORSE* FISH_GLASSEYE*FISH_PUFFER_WHITE_SPOTTED* FISH_SOLE* FISH_FLOUNDER* FISH_MACKEREL*JELLYFISH_SEA_NETTLE*SQUID* SQUID MAN*GIGANTIC SQUID* FISH_LUNGFISH*FISH_LOACH_CLOWN*FISH_BULLHEAD_BROWN*FISH_BULLHEAD_YELLOW*FISH_BULLHEAD_BLACK*FISH_KNIFEFISH_BANDED* FISH_CHAR*FISH_TROUT_RAINBOW*FISH_MOLLY_SAILFIN* +FISH_GUPPY* +FISH_PERCH*DWARF*HUMAN*ELF*GOBLIN*KOBOLD*GREMLIN*TROLL*OGRE*UNICORN*DRAGON*SATYR*COLOSSUS_BRONZE*GIANT*CYCLOPS*ETTIN*MINOTAUR*YETI* SASQUATCH* BLIZZARD_MAN*WOLF_ICE*FAIRY*PIXIE*BEAK_DOG* GRIMELING* BLENDEC_FOUL* STRANGLER* NIGHTWING*HARPY*HYDRA* MERPERSON* SEA_SERPENT* SEA_MONSTER*BIRD_ROC*CROCODILE_CAVE*TOAD_GIANT_CAVE* OLM_GIANT* BAT_GIANT* RAT_GIANT* RAT_LARGE*MOLE_DOG_NAKED* +TROGLODYTE* +MOLE_GIANT*IMP_FIRE*SPIDER_CAVE_GIANT* SPIDER_CAVE* FISH_CAVE* CAVE_FISH_MAN* LOBSTER_CAVE* +SNAKE_FIRE*OLM*OLM_MAN*BAT*BAT_MAN*MAGGOT_PURRING*ELEMENTMAN_FIRE*ELEMENTMAN_MAGMA*ELEMENTMAN_IRON*ELEMENTMAN_MUD*BIRD_SWALLOW_CAVE*CAVE_SWALLOW_MAN*BIRD_SWALLOW_CAVE_GIANT* AMPHIBIAN_MAN* REPTILE_MAN* SERPENT_MAN*ANT_MAN* +RODENT MAN* WILD_BOAR* WILD_BOAR_MAN*GIANT_WILD_BOAR*COYOTE* +COYOTE_MAN* GIANT_COYOTE*KANGAROO* KANGAROO_MAN*GIANT_KANGAROO*KOALA* KOALA_MAN* GIANT_KOALA*ADDER* ADDER_MAN* GIANT_ADDER*ECHIDNA* ECHIDNA_MAN* GIANT_ECHIDNA* PORCUPINE* PORCUPINE_MAN*GIANT_PORCUPINE* KINGSNAKE* KINGSNAKE_MAN*GIANT_KINGSNAKE* GRAY_LANGUR*GRAY_LANGUR_MAN*GIANT_GRAY_LANGUR*BOBCAT* +BOBCAT_MAN* GIANT_BOBCAT*SKUNK* SKUNK_MAN* GIANT_SKUNK*GREEN_TREE_FROG*GREEN_TREE_FROG_MAN*GIANT_GREEN_TREE_FROG*HARE*HARE_MAN* +GIANT_HARE* RATTLESNAKE*RATTLESNAKE_MAN*GIANT_RATTLESNAKE*WEASEL* +WEASEL_MAN* GIANT_WEASEL*COPPERHEAD_SNAKE*COPPERHEAD_SNAKE_MAN*GIANT_COPPERHEAD_SNAKE*IBEX*IBEX_MAN* +GIANT_IBEX*WOMBAT* +WOMBAT_MAN* GIANT_WOMBAT*DINGO* DINGO_MAN* GIANT_DINGO*COATI* COATI_MAN* GIANT_COATI*OPOSSUM* OPOSSUM_MAN* GIANT_OPOSSUM*MONGOOSE* MONGOOSE_MAN*GIANT_MONGOOSE*HYENA* HYENA_MAN* GIANT_HYENA*ANACONDA* ANACONDA_MAN*GIANT_ANACONDA*MONITOR_LIZARD*MONITOR_LIZARD_MAN*GIANT_MONITOR_LIZARD* +KING_COBRA*KING_COBRA_MAN*GIANT_KING_COBRA*OCELOT* +OCELOT_MAN* GIANT_OCELOT*JACKAL* +JACKAL_MAN* GIANT_JACKAL*CAPUCHIN* CAPUCHIN_MAN*GIANT_CAPUCHIN*SLOTH* SLOTH_MAN* GIANT_SLOTH* SPIDER_MONKEY*SPIDER_MONKEY_MAN*GIANT_SPIDER_MONKEY*PANGOLIN* PANGOLIN_MAN*GIANT_PANGOLIN* BLACK_MAMBA*BLACK_MAMBA_MAN*GIANT_BLACK_MAMBA* +BEAR_SLOTH*SLOTH_BEAR_MAN*GIANT_SLOTH_BEAR*AYE-AYE* AYE-AYE_MAN* GIANT_AYE-AYE* +BUSHMASTER*BUSHMASTER_MAN*GIANT_BUSHMASTER*PYTHON* +PYTHON_MAN* GIANT_PYTHON*TAPIR* TAPIR_MAN* GIANT_TAPIR*IMPALA* +IMPALA_MAN* GIANT_IMPALA*AARDVARK* AARDVARK_MAN*GIANT_AARDVARK* LION_TAMARIN*LION_TAMARIN_MAN*GIANT_LION_TAMARIN*STOAT* STOAT_MAN* GIANT_STOAT*LYNX*LYNX_MAN* +GIANT_LYNX2TOAD2TOAD_MAN2 +GIANT_TOAD2WORM2WORM_MAN2 BIRD_BLUEJAY2 BLUEJAY_MAN2 GIANT_BLUEJAY2 BIRD_CARDINAL2 CARDINAL_MAN2GIANT_CARDINAL2 BIRD_GRACKLE2 GRACKLE_MAN2 GIANT_GRACKLE2 BIRD_ORIOLE2 +ORIOLE_MAN2 GIANT_ORIOLE2BIRD_RW_BLACKBIRD2RW_BLACKBIRD_MAN2GIANT_RW_BLACKBIRD2 BIRD_PENGUIN2BIRD_PENGUIN_LITTLE2BIRD_PENGUIN_EMPEROR2 PENGUIN MAN2BIRD_PENGUIN_GIANT2BIRD_FALCON_PEREGRINE2PEREGRINE FALCON MAN2GIANT PEREGRINE FALCON2 BIRD_KIWI2KIWI MAN2BIRD_KIWI_GIANT2 BIRD_OSTRICH2 OSTRICH MAN2BIRD_OSTRICH_GIANT2 BIRD_CROW2CROW_MAN2 +GIANT_CROW2 +BIRD_RAVEN2 RAVEN_MAN2 GIANT_RAVEN2BIRD_CASSOWARY2 CASSOWARY_MAN2GIANT_CASSOWARY2BIRD_KEA2KEA_MAN2 GIANT_KEA2BIRD_OWL_SNOWY2 SNOWY_OWL_MAN2GIANT_SNOWY_OWL2SPARROW2 SPARROW_MAN2 GIANT_SPARROW2BIRD_STORK_WHITE2WHITE_STORK_MAN2GIANT_WHITE_STORK2 BIRD_LOON2LOON_MAN2 +GIANT_LOON2 BIRD_OWL_BARN2 BARN_OWL_MAN2GIANT_BARN_OWL2 BIRD_PARAKEET2 PARAKEET_MAN2GIANT_PARAKEET2 BIRD_KAKAPO2 +KAKAPO_MAN2 GIANT_KAKAPO2BIRD_PARROT_GREY2GREY_PARROT_MAN2GIANT_GREY_PARROT2 BIRD_PUFFIN2 +PUFFIN_MAN2 GIANT_PUFFIN2 BIRD_SWAN2SWAN_MAN2 +GIANT_SWAN2 BIRD_LORIKEET2 LORIKEET_MAN2GIANT_LORIKEET2 BIRD_WREN2WREN_MAN2 +GIANT_WREN2 BIRD_OSPREY2 +OSPREY_MAN2 GIANT_OSPREY2BIRD_EMU2EMU_MAN2 GIANT_EMU2BIRD_COCKATIEL2 COCKATIEL_MAN2GIANT_COCKATIEL2BIRD_LOVEBIRD_PEACH-FACED2PEACH-FACED_LOVEBIRD_MAN2GIANT_PEACH-FACED_LOVEBIRD2 BIRD_MAGPIE2 +MAGPIE_MAN2 GIANT_MAGPIE2 BIRD_KESTREL2 KESTREL_MAN2 GIANT_KESTREL2BIRD_ALBATROSS2 ALBATROSS_MAN2GIANT_ALBATROSS2BIRD_OWL_GREAT_HORNED2GREAT_HORNED_OWL_MAN2GIANT_GREAT_HORNED_OWL2 +BIRD_EAGLE2 EAGLE_MAN2 GIANT_EAGLE2 BIRD_HORNBILL2 HORNBILL_MAN2GIANT_HORNBILL2BIRD_LOVEBIRD_MASKED2MASKED_LOVEBIRD_MAN2GIANT_MASKED_LOVEBIRD2 BIRD_BUSHTIT2 BUSHTIT_MAN2 GIANT_BUSHTIT2 DAMSELFLY2 DAMSELFLY_MAN2GIANT_DAMSELFLY2MOTH2MOTH_MAN2 +GIANT_MOTH2 GRASSHOPPER2GRASSHOPPER_MAN2GIANT_GRASSHOPPER2 BARK_SCORPION2BARK_SCORPION_MAN2GIANT_BARK_SCORPION2MANTIS2 +MANTIS_MAN2 GIANT_MANTIS2TICK2TICK_MAN2 +GIANT_TICK2LOUSE2 LOUSE_MAN2 GIANT_LOUSE2THRIPS2 +THRIPS_MAN2 GIANT_THRIPS2SLUG2SLUG_MAN2 +GIANT_SLUG2MOSQUITO2 MOSQUITO_MAN2GIANT_MOSQUITO2SPIDER_JUMPING2JUMPING_SPIDER_MAN2GIANT_JUMPING_SPIDER2TERMITE2 +MOON_SNAIL2MOON_SNAIL_MAN2GIANT_MOON_SNAIL2SPIDER_BROWN_RECLUSE2BROWN_RECLUSE_SPIDER_MAN2GIANT_BROWN_RECLUSE_SPIDER2SNAIL2 SNAIL_MAN2 GIANT_SNAIL2 GECKO_LEOPARD2LEOPARD_GECKO_MAN2GIANT_LEOPARD_GECKO2DESERT TORTOISE2DESERT_TORTOISE_MAN2GIANT_DESERT_TORTOISE2 GILA_MONSTER2GILA_MONSTER_MAN2GIANT_GILA_MONSTER2DOG2CAT2MULE2DONKEY2HORSE2COW2SHEEP2PIG2GOAT2 BIRD_CHICKEN2CAVY2 BIRD_DUCK2 WATER_BUFFALO2REINDEER2 +BIRD_GOOSE2YAK2LLAMA2ALPACA2BIRD_GUINEAFOWL2BIRD_PEAFOWL_BLUE2 BIRD_TURKEY2RABBIT2CHIMERA2CENTAUR2GRIFFON2FLY2FLY_MAN2 GIANT_FLY2 ROACH_LARGE2 ROACH_MAN2 GIANT_ROACH2BEETLE2 +BEETLE_MAN2 GIANT_BEETLE2ANT2BUTTERFLY_MONARCH2BUTTERFLY_MONARCH_MAN2GIANT_BUTTERFLY_MONARCH2FIREFLY2 FIREFLY_MAN2 GIANT_FIREFLY2 DRAGONFLY2 DRAGONFLY_MAN2GIANT_DRAGONFLY2 HONEY_BEE2 BUMBLEBEE2 GOAT_MOUNTAIN2GOAT_MOUNTAIN_MAN2GIANT_GOAT_MOUNTAIN2 MARMOT_HOARY2MARMOT_HOARY_MAN2GIANT_MARMOT_HOARY2GNOME_MOUNTAIN2 +GNOME_DARK2WALRUS2 +WALRUS_MAN2 GIANT_WALRUS2FISH_LAMPREY_SEA2SHARK_GREAT_WHITE2 SHARK_FRILL2SHARK_SPINY_DOGFISH2SHARK_WOBBEGONG_SPOTTED2 SHARK_WHALE2 SHARK_BASKING2 SHARK_NURSE2SHARK_MAKO_SHORTFIN2SHARK_MAKO_LONGFIN2 SHARK_TIGER2 +SHARK_BULL2SHARK_REEF_BLACKTIP2SHARK_REEF_WHITETIP2 +SHARK_BLUE2SHARK_HAMMERHEAD2 SHARK_ANGEL2FISH_SKATE_COMMON2FISH_RAY_MANTA2 FISH_STINGRAY2FISH_COELACANTH2 FISH_STURGEON2FISH_CONGER_EEL2 FISH_MILKFISH2FISH_COD2 FISH_OPAH2FISH_GROUPER_GIANT2 FISH_BLUEFISH2FISH_SUNFISH_OCEAN2FISH_SWORDFISH2 FISH_MARLIN2 FISH_HALIBUT2FISH_BARRACUDA_GREAT2FISH_TUNA_BLUEFIN2NARWHAL2 NARWHAL MAN2NARWHAL, GIANT2HIPPO2 HIPPO_MAN2 GIANT_HIPPO2FISH_GAR_LONGNOSE2 FISH_CARP2FISH_TIGERFISH2 FISH_PIKE2PLATYPUS2 PLATYPUS MAN2PLATYPUS, GIANT2 BEAR_GRIZZLY2BEAR_GRIZZLY_MAN2GIANT_BEAR_GRIZZLY2 +BEAR_BLACK2BEAR_BLACK_MAN2GIANT_BEAR_BLACK2DEER2DEER_MAN2 +GIANT_DEER2FOX2FOX_MAN2 GIANT_FOX2RACCOON2 RACCOON_MAN2 GIANT_RACCOON2MACAQUE_RHESUS2MACAQUE_RHESUS_MAN2GIANT_MACAQUE_RHESUS2COUGAR2 +COUGAR_MAN2 GIANT_COUGAR2WOLF2WOLF_MAN2 +GIANT_WOLF2 GROUNDHOG2 GROUNDHOG_MAN2GIANT_GROUNDHOG2 ALLIGATOR2 ALLIGATOR_MAN2GIANT_ALLIGATOR2 BIRD_BUZZARD2 BUZZARD_MAN2 GIANT_BUZZARD2PANDA2PANDA, GIGANTIC2 PANDA MAN2CAPYBARA2CAPYBARA, GIANT2 CAPYBARA MAN2BADGER2 +BADGER MAN2 BADGER, GIANT2MOOSE2 MOOSE MAN2 MOOSE, GIANT2 RED PANDA2 RED PANDA MAN2RED PANDA, GIANT2ELEPHANT2 ELEPHANT_MAN2GIANT_ELEPHANT2WARTHOG2 WARTHOG_MAN2 GIANT_WARTHOG2LION2LION_MAN2 +GIANT_LION2LEOPARD2 LEOPARD_MAN2 GIANT_LEOPARD2JAGUAR2 +JAGUAR_MAN2 GIANT_JAGUAR2TIGER2 TIGER_MAN2 GIANT_TIGER2CHEETAH2 CHEETAH_MAN2 GIANT_CHEETAH2GAZELLE2 GAZELLE_MAN2 GIANT_GAZELLE2MANDRILL2 MANDRILL_MAN2GIANT_MANDRILL2 +CHIMPANZEE2BONOBO2GORILLA2 ORANGUTAN2GIBBON_SIAMANG2GIBBON_WHITE_HANDED2GIBBON_BLACK_HANDED2 GIBBON_GRAY2GIBBON_SILVERY2GIBBON_PILEATED2 GIBBON_BILOU2GIBBON_WHITE_BROWED2GIBBON_BLACK_CRESTED2 CAMEL_1_HUMP2CAMEL_1_HUMP_MAN2GIANT_CAMEL_1_HUMP2 CAMEL_2_HUMP2CAMEL_2_HUMP_MAN2GIANT_CAMEL_2_HUMP2CROCODILE_SALTWATER2CROCODILE_SALTWATER_MAN2GIANT_CROCODILE_SALTWATER2 BIRD_VULTURE2 VULTURE_MAN2 GIANT_VULTURE2 +RHINOCEROS2RHINOCEROS_MAN2GIANT_RHINOCEROS2GIRAFFE2 GIRAFFE_MAN2 GIANT_GIRAFFE2 HONEY BADGER2HONEY BADGER MAN2HONEY BADGER, GIANT2GIANT TORTOISE2GIANT TORTOISE MAN2GIGANTIC TORTOISE2 ARMADILLO2 ARMADILLO MAN2ARMADILLO, GIANT2MUSKOX2 +MUSKOX_MAN2 GIANT_MUSKOX2ELK2ELK_MAN2 GIANT_ELK2 +BEAR_POLAR2BEAR_POLAR_MAN2GIANT_BEAR_POLAR2 WOLVERINE2 WOLVERINE_MAN2GIANT_WOLVERINE2 +CHINCHILLA2CHINCHILLA_MAN2GIANT_CHINCHILLA2 FLOATING_GUTS2DRUNIAN2 CREEPING_EYE2VORACIOUS_CAVE_CRAWLER2BLIND_CAVE_OGRE2 +CAP_HOPPER2 +MAGMA_CRAB2CRUNDLE2 HUNGRY_HEAD2 +FLESH_BALL2ELK_BIRD2 HELMET_SNAKE2GREEN_DEVOURER2RUTHERER2CREEPY_CRAWLER2DRALTHA2GIANT_EARTHWORM2 BLOOD_MAN2BUGBAT2MANERA2 +MOLEMARIAN2JABBERER2 POND_GRABBER2BLIND_CAVE_BEAR2 CAVE_DRAGON2REACHER2ELEMENTMAN_GABBRO2GORLAK2 CAVE_FLOATER2PLUMP_HELMET_MAN2 CAVE_BLOB2ELEMENTMAN_AMETHYST2OCTOPUS2 OCTOPUS_MAN2 GIANT_OCTOPUS2CRAB2CRAB_MAN2 +GIANT_CRAB2 LEOPARD_SEAL2LEOPARD_SEAL_MAN2GIANT_LEOPARD_SEAL2 +CUTTLEFISH2CUTTLEFISH_MAN2GIANT_CUTTLEFISH2ORCA2ORCA_MAN2 +GIANT_ORCA2SPONGE2 +SPONGE_MAN2 GIANT_SPONGE2HORSESHOE_CRAB2HORSESHOE_CRAB_MAN2GIANT_HORSESHOE_CRAB2 SPERM_WHALE2SPERM_WHALE_MAN2GIANT_SPERM_WHALE2 ELEPHANT_SEAL2ELEPHANT_SEAL_MAN2GIANT_ELEPHANT_SEAL2 HARP_SEAL2 HARP_SEAL_MAN2GIANT_HARP_SEAL2NAUTILUS2 NAUTILUS_MAN2GIANT_NAUTILUS2 FOXSQUIRREL2 MOGHOPPER2 RAT_DEMON2WAMBLER_FLUFFY2LIZARD_RHINO_TWO_LEGGED2 WORM_KNUCKLE2SPIDER_PHANTOM2 FLY_ACORN2 +GNAT_BLOOD2LIZARD2 +LIZARD_MAN2 GIANT_LIZARD2SKINK2 SKINK_MAN2 GIANT_SKINK2 CHAMELEON2 CHAMELEON_MAN2GIANT_CHAMELEON2ANOLE2 ANOLE_MAN2 GIANT_ANOLE2IGUANA2 +IGUANA_MAN2 GIANT_IGUANA2 RIVER OTTER2 SEA OTTER2 OTTER_MAN2 GIANT_OTTER2SNAPPING TURTLE2ALLIGATOR SNAPPING TURTLE2SNAPPING_TURTLE_MAN2GIANT_SNAPPING_TURTLE2BEAVER2 +BEAVER_MAN2 GIANT_BEAVER2LEECH2 LEECH_MAN2 GIANT_LEECH2AXOLOTL2 AXOLOTL_MAN2 GIANT_AXOLOTL2MINK2MINK_MAN2 +GIANT_MINK2 POND_TURTLE2POND_TURTLE_MAN2GIANT_POND_TURTLE2RAT2RAT_MAN2 SQUIRREL_GRAY2SQUIRREL_GRAY_MAN2GIANT_SQUIRREL_GRAY2 SQUIRREL_RED2SQUIRREL_RED_MAN2GIANT_SQUIRREL_RED2CHIPMUNK2 CHIPMUNK_MAN2GIANT_CHIPMUNK2HAMSTER2 HAMSTER_MAN2 GIANT_HAMSTER2HEDGEHOG2 HEDGEHOG_MAN2GIANT_HEDGEHOG2SQUIRREL_FLYING2FLYING_SQUIRREL_MAN2GIANT_FLYING_SQUIRREL2MUSSEL2OYSTER2 FISH_SALMON2FISH_CLOWNFISH2 FISH_HAGFISH2FISH_LAMPREY_BROOK2 FISH_RAY_BAT2FISH_RAY_THORNBACK2FISH_RATFISH_SPOTTED2 FISH_HERRING2 FISH_SHAD2 FISH_ANCHOVY2FISH_TROUT_STEELHEAD2 FISH_HAKE2 FISH_SEAHORSE2 FISH_GLASSEYE2FISH_PUFFER_WHITE_SPOTTED2 FISH_SOLE2 FISH_FLOUNDER2 FISH_MACKEREL2JELLYFISH_SEA_NETTLE2SQUID2 SQUID MAN2GIGANTIC SQUID2 FISH_LUNGFISH2FISH_LOACH_CLOWN2FISH_BULLHEAD_BROWN2FISH_BULLHEAD_YELLOW2FISH_BULLHEAD_BLACK2FISH_KNIFEFISH_BANDED2 FISH_CHAR2FISH_TROUT_RAINBOW2FISH_MOLLY_SAILFIN2 +FISH_GUPPY2 +FISH_PERCH2DWARF2HUMAN2ELF2GOBLIN2KOBOLD2GREMLIN2TROLL2OGRE2UNICORN2DRAGON2SATYR2COLOSSUS_BRONZE2GIANT2CYCLOPS2ETTIN2MINOTAUR2YETI2 SASQUATCH2 BLIZZARD_MAN2WOLF_ICE2FAIRY2PIXIE2BEAK_DOG2 GRIMELING2 BLENDEC_FOUL2 STRANGLER2 NIGHTWING2HARPY2HYDRA2 MERPERSON2 SEA_SERPENT2 SEA_MONSTER2BIRD_ROC2CROCODILE_CAVE2TOAD_GIANT_CAVE2 OLM_GIANT2 BAT_GIANT2 RAT_GIANT2 RAT_LARGE2MOLE_DOG_NAKED2 +TROGLODYTE2 +MOLE_GIANT2IMP_FIRE2SPIDER_CAVE_GIANT2 SPIDER_CAVE2 FISH_CAVE2 CAVE_FISH_MAN2 LOBSTER_CAVE2 +SNAKE_FIRE2OLM2OLM_MAN2BAT2BAT_MAN2MAGGOT_PURRING2ELEMENTMAN_FIRE2ELEMENTMAN_MAGMA2ELEMENTMAN_IRON2ELEMENTMAN_MUD2BIRD_SWALLOW_CAVE2CAVE_SWALLOW_MAN2BIRD_SWALLOW_CAVE_GIANT2 AMPHIBIAN_MAN2 REPTILE_MAN2 SERPENT_MAN2ANT_MAN2 +RODENT MAN2 WILD_BOAR2 WILD_BOAR_MAN2GIANT_WILD_BOAR2COYOTE2 +COYOTE_MAN2 GIANT_COYOTE2KANGAROO2 KANGAROO_MAN2GIANT_KANGAROO2KOALA2 KOALA_MAN2 GIANT_KOALA2ADDER2 ADDER_MAN2 GIANT_ADDER2ECHIDNA2 ECHIDNA_MAN2 GIANT_ECHIDNA2 PORCUPINE2 PORCUPINE_MAN2GIANT_PORCUPINE2 KINGSNAKE2 KINGSNAKE_MAN2GIANT_KINGSNAKE2 GRAY_LANGUR2GRAY_LANGUR_MAN2GIANT_GRAY_LANGUR2BOBCAT2 +BOBCAT_MAN2 GIANT_BOBCAT2SKUNK2 SKUNK_MAN2 GIANT_SKUNK2GREEN_TREE_FROG2GREEN_TREE_FROG_MAN2GIANT_GREEN_TREE_FROG2HARE2HARE_MAN2 +GIANT_HARE2 RATTLESNAKE2RATTLESNAKE_MAN2GIANT_RATTLESNAKE2WEASEL2 +WEASEL_MAN2 GIANT_WEASEL2COPPERHEAD_SNAKE2COPPERHEAD_SNAKE_MAN2GIANT_COPPERHEAD_SNAKE2IBEX2IBEX_MAN2 +GIANT_IBEX2WOMBAT2 +WOMBAT_MAN2 GIANT_WOMBAT2DINGO2 DINGO_MAN2 GIANT_DINGO2COATI2 COATI_MAN2 GIANT_COATI2OPOSSUM2 OPOSSUM_MAN2 GIANT_OPOSSUM2MONGOOSE2 MONGOOSE_MAN2GIANT_MONGOOSE2HYENA2 HYENA_MAN2 GIANT_HYENA2ANACONDA2 ANACONDA_MAN2GIANT_ANACONDA2MONITOR_LIZARD2MONITOR_LIZARD_MAN2GIANT_MONITOR_LIZARD2 +KING_COBRA2KING_COBRA_MAN2GIANT_KING_COBRA2OCELOT2 +OCELOT_MAN2 GIANT_OCELOT2JACKAL2 +JACKAL_MAN2 GIANT_JACKAL2CAPUCHIN2 CAPUCHIN_MAN2GIANT_CAPUCHIN2SLOTH2 SLOTH_MAN2 GIANT_SLOTH2 SPIDER_MONKEY2SPIDER_MONKEY_MAN2GIANT_SPIDER_MONKEY2PANGOLIN2 PANGOLIN_MAN2GIANT_PANGOLIN2 BLACK_MAMBA2BLACK_MAMBA_MAN2GIANT_BLACK_MAMBA2 +BEAR_SLOTH2SLOTH_BEAR_MAN2GIANT_SLOTH_BEAR2AYE-AYE2 AYE-AYE_MAN2 GIANT_AYE-AYE2 +BUSHMASTER2BUSHMASTER_MAN2GIANT_BUSHMASTER2PYTHON2 +PYTHON_MAN2 GIANT_PYTHON2TAPIR2 TAPIR_MAN2 GIANT_TAPIR2IMPALA2 +IMPALA_MAN2 GIANT_IMPALA2AARDVARK2 AARDVARK_MAN2GIANT_AARDVARK2 LION_TAMARIN2LION_TAMARIN_MAN2GIANT_LION_TAMARIN2STOAT2 STOAT_MAN2 GIANT_STOAT2LYNX2LYNX_MAN2 +GIANT_LYNX:TOAD:TOAD_MAN: +GIANT_TOAD:WORM:WORM_MAN: BIRD_BLUEJAY: BLUEJAY_MAN: GIANT_BLUEJAY: BIRD_CARDINAL: CARDINAL_MAN:GIANT_CARDINAL: BIRD_GRACKLE: GRACKLE_MAN: GIANT_GRACKLE: BIRD_ORIOLE: +ORIOLE_MAN: GIANT_ORIOLE:BIRD_RW_BLACKBIRD:RW_BLACKBIRD_MAN:GIANT_RW_BLACKBIRD: BIRD_PENGUIN:BIRD_PENGUIN_LITTLE:BIRD_PENGUIN_EMPEROR: PENGUIN MAN:BIRD_PENGUIN_GIANT:BIRD_FALCON_PEREGRINE:PEREGRINE FALCON MAN:GIANT PEREGRINE FALCON: BIRD_KIWI:KIWI MAN:BIRD_KIWI_GIANT: BIRD_OSTRICH: OSTRICH MAN:BIRD_OSTRICH_GIANT: BIRD_CROW:CROW_MAN: +GIANT_CROW: +BIRD_RAVEN: RAVEN_MAN: GIANT_RAVEN:BIRD_CASSOWARY: CASSOWARY_MAN:GIANT_CASSOWARY:BIRD_KEA:KEA_MAN: GIANT_KEA:BIRD_OWL_SNOWY: SNOWY_OWL_MAN:GIANT_SNOWY_OWL:SPARROW: SPARROW_MAN: GIANT_SPARROW:BIRD_STORK_WHITE:WHITE_STORK_MAN:GIANT_WHITE_STORK: BIRD_LOON:LOON_MAN: +GIANT_LOON: BIRD_OWL_BARN: BARN_OWL_MAN:GIANT_BARN_OWL: BIRD_PARAKEET: PARAKEET_MAN:GIANT_PARAKEET: BIRD_KAKAPO: +KAKAPO_MAN: GIANT_KAKAPO:BIRD_PARROT_GREY:GREY_PARROT_MAN:GIANT_GREY_PARROT: BIRD_PUFFIN: +PUFFIN_MAN: GIANT_PUFFIN: BIRD_SWAN:SWAN_MAN: +GIANT_SWAN: BIRD_LORIKEET: LORIKEET_MAN:GIANT_LORIKEET: BIRD_WREN:WREN_MAN: +GIANT_WREN: BIRD_OSPREY: +OSPREY_MAN: GIANT_OSPREY:BIRD_EMU:EMU_MAN: GIANT_EMU:BIRD_COCKATIEL: COCKATIEL_MAN:GIANT_COCKATIEL:BIRD_LOVEBIRD_PEACH-FACED:PEACH-FACED_LOVEBIRD_MAN:GIANT_PEACH-FACED_LOVEBIRD: BIRD_MAGPIE: +MAGPIE_MAN: GIANT_MAGPIE: BIRD_KESTREL: KESTREL_MAN: GIANT_KESTREL:BIRD_ALBATROSS: ALBATROSS_MAN:GIANT_ALBATROSS:BIRD_OWL_GREAT_HORNED:GREAT_HORNED_OWL_MAN:GIANT_GREAT_HORNED_OWL: +BIRD_EAGLE: EAGLE_MAN: GIANT_EAGLE: BIRD_HORNBILL: HORNBILL_MAN:GIANT_HORNBILL:BIRD_LOVEBIRD_MASKED:MASKED_LOVEBIRD_MAN:GIANT_MASKED_LOVEBIRD: BIRD_BUSHTIT: BUSHTIT_MAN: GIANT_BUSHTIT: DAMSELFLY: DAMSELFLY_MAN:GIANT_DAMSELFLY:MOTH:MOTH_MAN: +GIANT_MOTH: GRASSHOPPER:GRASSHOPPER_MAN:GIANT_GRASSHOPPER: BARK_SCORPION:BARK_SCORPION_MAN:GIANT_BARK_SCORPION:MANTIS: +MANTIS_MAN: GIANT_MANTIS:TICK:TICK_MAN: +GIANT_TICK:LOUSE: LOUSE_MAN: GIANT_LOUSE:THRIPS: +THRIPS_MAN: GIANT_THRIPS:SLUG:SLUG_MAN: +GIANT_SLUG:MOSQUITO: MOSQUITO_MAN:GIANT_MOSQUITO:SPIDER_JUMPING:JUMPING_SPIDER_MAN:GIANT_JUMPING_SPIDER:TERMITE: +MOON_SNAIL:MOON_SNAIL_MAN:GIANT_MOON_SNAIL:SPIDER_BROWN_RECLUSE:BROWN_RECLUSE_SPIDER_MAN:GIANT_BROWN_RECLUSE_SPIDER:SNAIL: SNAIL_MAN: GIANT_SNAIL: GECKO_LEOPARD:LEOPARD_GECKO_MAN:GIANT_LEOPARD_GECKO:DESERT TORTOISE:DESERT_TORTOISE_MAN:GIANT_DESERT_TORTOISE: GILA_MONSTER:GILA_MONSTER_MAN:GIANT_GILA_MONSTER:DOG:CAT:MULE:DONKEY:HORSE:COW:SHEEP:PIG:GOAT: BIRD_CHICKEN:CAVY: BIRD_DUCK: WATER_BUFFALO:REINDEER: +BIRD_GOOSE:YAK:LLAMA:ALPACA:BIRD_GUINEAFOWL:BIRD_PEAFOWL_BLUE: BIRD_TURKEY:RABBIT:CHIMERA:CENTAUR:GRIFFON:FLY:FLY_MAN: GIANT_FLY: ROACH_LARGE: ROACH_MAN: GIANT_ROACH:BEETLE: +BEETLE_MAN: GIANT_BEETLE:ANT:BUTTERFLY_MONARCH:BUTTERFLY_MONARCH_MAN:GIANT_BUTTERFLY_MONARCH:FIREFLY: FIREFLY_MAN: GIANT_FIREFLY: DRAGONFLY: DRAGONFLY_MAN:GIANT_DRAGONFLY: HONEY_BEE: BUMBLEBEE: GOAT_MOUNTAIN:GOAT_MOUNTAIN_MAN:GIANT_GOAT_MOUNTAIN: MARMOT_HOARY:MARMOT_HOARY_MAN:GIANT_MARMOT_HOARY:GNOME_MOUNTAIN: +GNOME_DARK:WALRUS: +WALRUS_MAN: GIANT_WALRUS:FISH_LAMPREY_SEA:SHARK_GREAT_WHITE: SHARK_FRILL:SHARK_SPINY_DOGFISH:SHARK_WOBBEGONG_SPOTTED: SHARK_WHALE: SHARK_BASKING: SHARK_NURSE:SHARK_MAKO_SHORTFIN:SHARK_MAKO_LONGFIN: SHARK_TIGER: +SHARK_BULL:SHARK_REEF_BLACKTIP:SHARK_REEF_WHITETIP: +SHARK_BLUE:SHARK_HAMMERHEAD: SHARK_ANGEL:FISH_SKATE_COMMON:FISH_RAY_MANTA: FISH_STINGRAY:FISH_COELACANTH: FISH_STURGEON:FISH_CONGER_EEL: FISH_MILKFISH:FISH_COD: FISH_OPAH:FISH_GROUPER_GIANT: FISH_BLUEFISH:FISH_SUNFISH_OCEAN:FISH_SWORDFISH: FISH_MARLIN: FISH_HALIBUT:FISH_BARRACUDA_GREAT:FISH_TUNA_BLUEFIN:NARWHAL: NARWHAL MAN:NARWHAL, GIANT:HIPPO: HIPPO_MAN: GIANT_HIPPO:FISH_GAR_LONGNOSE: FISH_CARP:FISH_TIGERFISH: FISH_PIKE:PLATYPUS: PLATYPUS MAN:PLATYPUS, GIANT: BEAR_GRIZZLY:BEAR_GRIZZLY_MAN:GIANT_BEAR_GRIZZLY: +BEAR_BLACK:BEAR_BLACK_MAN:GIANT_BEAR_BLACK:DEER:DEER_MAN: +GIANT_DEER:FOX:FOX_MAN: GIANT_FOX:RACCOON: RACCOON_MAN: GIANT_RACCOON:MACAQUE_RHESUS:MACAQUE_RHESUS_MAN:GIANT_MACAQUE_RHESUS:COUGAR: +COUGAR_MAN: GIANT_COUGAR:WOLF:WOLF_MAN: +GIANT_WOLF: GROUNDHOG: GROUNDHOG_MAN:GIANT_GROUNDHOG: ALLIGATOR: ALLIGATOR_MAN:GIANT_ALLIGATOR: BIRD_BUZZARD: BUZZARD_MAN: GIANT_BUZZARD:PANDA:PANDA, GIGANTIC: PANDA MAN:CAPYBARA:CAPYBARA, GIANT: CAPYBARA MAN:BADGER: +BADGER MAN: BADGER, GIANT:MOOSE: MOOSE MAN: MOOSE, GIANT: RED PANDA: RED PANDA MAN:RED PANDA, GIANT:ELEPHANT: ELEPHANT_MAN:GIANT_ELEPHANT:WARTHOG: WARTHOG_MAN: GIANT_WARTHOG:LION:LION_MAN: +GIANT_LION:LEOPARD: LEOPARD_MAN: GIANT_LEOPARD:JAGUAR: +JAGUAR_MAN: GIANT_JAGUAR:TIGER: TIGER_MAN: GIANT_TIGER:CHEETAH: CHEETAH_MAN: GIANT_CHEETAH:GAZELLE: GAZELLE_MAN: GIANT_GAZELLE:MANDRILL: MANDRILL_MAN:GIANT_MANDRILL: +CHIMPANZEE:BONOBO:GORILLA: ORANGUTAN:GIBBON_SIAMANG:GIBBON_WHITE_HANDED:GIBBON_BLACK_HANDED: GIBBON_GRAY:GIBBON_SILVERY:GIBBON_PILEATED: GIBBON_BILOU:GIBBON_WHITE_BROWED:GIBBON_BLACK_CRESTED: CAMEL_1_HUMP:CAMEL_1_HUMP_MAN:GIANT_CAMEL_1_HUMP: CAMEL_2_HUMP:CAMEL_2_HUMP_MAN:GIANT_CAMEL_2_HUMP:CROCODILE_SALTWATER:CROCODILE_SALTWATER_MAN:GIANT_CROCODILE_SALTWATER: BIRD_VULTURE: VULTURE_MAN: GIANT_VULTURE: +RHINOCEROS:RHINOCEROS_MAN:GIANT_RHINOCEROS:GIRAFFE: GIRAFFE_MAN: GIANT_GIRAFFE: HONEY BADGER:HONEY BADGER MAN:HONEY BADGER, GIANT:GIANT TORTOISE:GIANT TORTOISE MAN:GIGANTIC TORTOISE: ARMADILLO: ARMADILLO MAN:ARMADILLO, GIANT:MUSKOX: +MUSKOX_MAN: GIANT_MUSKOX:ELK:ELK_MAN: GIANT_ELK: +BEAR_POLAR:BEAR_POLAR_MAN:GIANT_BEAR_POLAR: WOLVERINE: WOLVERINE_MAN:GIANT_WOLVERINE: +CHINCHILLA:CHINCHILLA_MAN:GIANT_CHINCHILLA: FLOATING_GUTS:DRUNIAN: CREEPING_EYE:VORACIOUS_CAVE_CRAWLER:BLIND_CAVE_OGRE: +CAP_HOPPER: +MAGMA_CRAB:CRUNDLE: HUNGRY_HEAD: +FLESH_BALL:ELK_BIRD: HELMET_SNAKE:GREEN_DEVOURER:RUTHERER:CREEPY_CRAWLER:DRALTHA:GIANT_EARTHWORM: BLOOD_MAN:BUGBAT:MANERA: +MOLEMARIAN:JABBERER: POND_GRABBER:BLIND_CAVE_BEAR: CAVE_DRAGON:REACHER:ELEMENTMAN_GABBRO:GORLAK: CAVE_FLOATER:PLUMP_HELMET_MAN: CAVE_BLOB:ELEMENTMAN_AMETHYST:OCTOPUS: OCTOPUS_MAN: GIANT_OCTOPUS:CRAB:CRAB_MAN: +GIANT_CRAB: LEOPARD_SEAL:LEOPARD_SEAL_MAN:GIANT_LEOPARD_SEAL: +CUTTLEFISH:CUTTLEFISH_MAN:GIANT_CUTTLEFISH:ORCA:ORCA_MAN: +GIANT_ORCA:SPONGE: +SPONGE_MAN: GIANT_SPONGE:HORSESHOE_CRAB:HORSESHOE_CRAB_MAN:GIANT_HORSESHOE_CRAB: SPERM_WHALE:SPERM_WHALE_MAN:GIANT_SPERM_WHALE: ELEPHANT_SEAL:ELEPHANT_SEAL_MAN:GIANT_ELEPHANT_SEAL: HARP_SEAL: HARP_SEAL_MAN:GIANT_HARP_SEAL:NAUTILUS: NAUTILUS_MAN:GIANT_NAUTILUS: FOXSQUIRREL: MOGHOPPER: RAT_DEMON:WAMBLER_FLUFFY:LIZARD_RHINO_TWO_LEGGED: WORM_KNUCKLE:SPIDER_PHANTOM: FLY_ACORN: +GNAT_BLOOD:LIZARD: +LIZARD_MAN: GIANT_LIZARD:SKINK: SKINK_MAN: GIANT_SKINK: CHAMELEON: CHAMELEON_MAN:GIANT_CHAMELEON:ANOLE: ANOLE_MAN: GIANT_ANOLE:IGUANA: +IGUANA_MAN: GIANT_IGUANA: RIVER OTTER: SEA OTTER: OTTER_MAN: GIANT_OTTER:SNAPPING TURTLE:ALLIGATOR SNAPPING TURTLE:SNAPPING_TURTLE_MAN:GIANT_SNAPPING_TURTLE:BEAVER: +BEAVER_MAN: GIANT_BEAVER:LEECH: LEECH_MAN: GIANT_LEECH:AXOLOTL: AXOLOTL_MAN: GIANT_AXOLOTL:MINK:MINK_MAN: +GIANT_MINK: POND_TURTLE:POND_TURTLE_MAN:GIANT_POND_TURTLE:RAT:RAT_MAN: SQUIRREL_GRAY:SQUIRREL_GRAY_MAN:GIANT_SQUIRREL_GRAY: SQUIRREL_RED:SQUIRREL_RED_MAN:GIANT_SQUIRREL_RED:CHIPMUNK: CHIPMUNK_MAN:GIANT_CHIPMUNK:HAMSTER: HAMSTER_MAN: GIANT_HAMSTER:HEDGEHOG: HEDGEHOG_MAN:GIANT_HEDGEHOG:SQUIRREL_FLYING:FLYING_SQUIRREL_MAN:GIANT_FLYING_SQUIRREL:MUSSEL:OYSTER: FISH_SALMON:FISH_CLOWNFISH: FISH_HAGFISH:FISH_LAMPREY_BROOK: FISH_RAY_BAT:FISH_RAY_THORNBACK:FISH_RATFISH_SPOTTED: FISH_HERRING: FISH_SHAD: FISH_ANCHOVY:FISH_TROUT_STEELHEAD: FISH_HAKE: FISH_SEAHORSE: FISH_GLASSEYE:FISH_PUFFER_WHITE_SPOTTED: FISH_SOLE: FISH_FLOUNDER: FISH_MACKEREL:JELLYFISH_SEA_NETTLE:SQUID: SQUID MAN:GIGANTIC SQUID: FISH_LUNGFISH:FISH_LOACH_CLOWN:FISH_BULLHEAD_BROWN:FISH_BULLHEAD_YELLOW:FISH_BULLHEAD_BLACK:FISH_KNIFEFISH_BANDED: FISH_CHAR:FISH_TROUT_RAINBOW:FISH_MOLLY_SAILFIN: +FISH_GUPPY: +FISH_PERCH:DWARF:HUMAN:ELF:GOBLIN:KOBOLD:GREMLIN:TROLL:OGRE:UNICORN:DRAGON:SATYR:COLOSSUS_BRONZE:GIANT:CYCLOPS:ETTIN:MINOTAUR:YETI: SASQUATCH: BLIZZARD_MAN:WOLF_ICE:FAIRY:PIXIE:BEAK_DOG: GRIMELING: BLENDEC_FOUL: STRANGLER: NIGHTWING:HARPY:HYDRA: MERPERSON: SEA_SERPENT: SEA_MONSTER:BIRD_ROC:CROCODILE_CAVE:TOAD_GIANT_CAVE: OLM_GIANT: BAT_GIANT: RAT_GIANT: RAT_LARGE:MOLE_DOG_NAKED: +TROGLODYTE: +MOLE_GIANT:IMP_FIRE:SPIDER_CAVE_GIANT: SPIDER_CAVE: FISH_CAVE: CAVE_FISH_MAN: LOBSTER_CAVE: +SNAKE_FIRE:OLM:OLM_MAN:BAT:BAT_MAN:MAGGOT_PURRING:ELEMENTMAN_FIRE:ELEMENTMAN_MAGMA:ELEMENTMAN_IRON:ELEMENTMAN_MUD:BIRD_SWALLOW_CAVE:CAVE_SWALLOW_MAN:BIRD_SWALLOW_CAVE_GIANT: AMPHIBIAN_MAN: REPTILE_MAN: SERPENT_MAN:ANT_MAN: +RODENT MAN: WILD_BOAR: WILD_BOAR_MAN:GIANT_WILD_BOAR:COYOTE: +COYOTE_MAN: GIANT_COYOTE:KANGAROO: KANGAROO_MAN:GIANT_KANGAROO:KOALA: KOALA_MAN: GIANT_KOALA:ADDER: ADDER_MAN: GIANT_ADDER:ECHIDNA: ECHIDNA_MAN: GIANT_ECHIDNA: PORCUPINE: PORCUPINE_MAN:GIANT_PORCUPINE: KINGSNAKE: KINGSNAKE_MAN:GIANT_KINGSNAKE: GRAY_LANGUR:GRAY_LANGUR_MAN:GIANT_GRAY_LANGUR:BOBCAT: +BOBCAT_MAN: GIANT_BOBCAT:SKUNK: SKUNK_MAN: GIANT_SKUNK:GREEN_TREE_FROG:GREEN_TREE_FROG_MAN:GIANT_GREEN_TREE_FROG:HARE:HARE_MAN: +GIANT_HARE: RATTLESNAKE:RATTLESNAKE_MAN:GIANT_RATTLESNAKE:WEASEL: +WEASEL_MAN: GIANT_WEASEL:COPPERHEAD_SNAKE:COPPERHEAD_SNAKE_MAN:GIANT_COPPERHEAD_SNAKE:IBEX:IBEX_MAN: +GIANT_IBEX:WOMBAT: +WOMBAT_MAN: GIANT_WOMBAT:DINGO: DINGO_MAN: GIANT_DINGO:COATI: COATI_MAN: GIANT_COATI:OPOSSUM: OPOSSUM_MAN: GIANT_OPOSSUM:MONGOOSE: MONGOOSE_MAN:GIANT_MONGOOSE:HYENA: HYENA_MAN: GIANT_HYENA:ANACONDA: ANACONDA_MAN:GIANT_ANACONDA:MONITOR_LIZARD:MONITOR_LIZARD_MAN:GIANT_MONITOR_LIZARD: +KING_COBRA:KING_COBRA_MAN:GIANT_KING_COBRA:OCELOT: +OCELOT_MAN: GIANT_OCELOT:JACKAL: +JACKAL_MAN: GIANT_JACKAL:CAPUCHIN: CAPUCHIN_MAN:GIANT_CAPUCHIN:SLOTH: SLOTH_MAN: GIANT_SLOTH: SPIDER_MONKEY:SPIDER_MONKEY_MAN:GIANT_SPIDER_MONKEY:PANGOLIN: PANGOLIN_MAN:GIANT_PANGOLIN: BLACK_MAMBA:BLACK_MAMBA_MAN:GIANT_BLACK_MAMBA: +BEAR_SLOTH:SLOTH_BEAR_MAN:GIANT_SLOTH_BEAR:AYE-AYE: AYE-AYE_MAN: GIANT_AYE-AYE: +BUSHMASTER:BUSHMASTER_MAN:GIANT_BUSHMASTER:PYTHON: +PYTHON_MAN: GIANT_PYTHON:TAPIR: TAPIR_MAN: GIANT_TAPIR:IMPALA: +IMPALA_MAN: GIANT_IMPALA:AARDVARK: AARDVARK_MAN:GIANT_AARDVARK: LION_TAMARIN:LION_TAMARIN_MAN:GIANT_LION_TAMARIN:STOAT: STOAT_MAN: GIANT_STOAT:LYNX:LYNX_MAN: +GIANT_LYNXBTOADBTOAD_MANB +GIANT_TOADBWORMBWORM_MANB BIRD_BLUEJAYB BLUEJAY_MANB GIANT_BLUEJAYB BIRD_CARDINALB CARDINAL_MANBGIANT_CARDINALB BIRD_GRACKLEB GRACKLE_MANB GIANT_GRACKLEB BIRD_ORIOLEB +ORIOLE_MANB GIANT_ORIOLEBBIRD_RW_BLACKBIRDBRW_BLACKBIRD_MANBGIANT_RW_BLACKBIRDB BIRD_PENGUINBBIRD_PENGUIN_LITTLEBBIRD_PENGUIN_EMPERORB PENGUIN MANBBIRD_PENGUIN_GIANTBBIRD_FALCON_PEREGRINEBPEREGRINE FALCON MANBGIANT PEREGRINE FALCONB BIRD_KIWIBKIWI MANBBIRD_KIWI_GIANTB BIRD_OSTRICHB OSTRICH MANBBIRD_OSTRICH_GIANTB BIRD_CROWBCROW_MANB +GIANT_CROWB +BIRD_RAVENB RAVEN_MANB GIANT_RAVENBBIRD_CASSOWARYB CASSOWARY_MANBGIANT_CASSOWARYBBIRD_KEABKEA_MANB GIANT_KEABBIRD_OWL_SNOWYB SNOWY_OWL_MANBGIANT_SNOWY_OWLBSPARROWB SPARROW_MANB GIANT_SPARROWBBIRD_STORK_WHITEBWHITE_STORK_MANBGIANT_WHITE_STORKB BIRD_LOONBLOON_MANB +GIANT_LOONB BIRD_OWL_BARNB BARN_OWL_MANBGIANT_BARN_OWLB BIRD_PARAKEETB PARAKEET_MANBGIANT_PARAKEETB BIRD_KAKAPOB +KAKAPO_MANB GIANT_KAKAPOBBIRD_PARROT_GREYBGREY_PARROT_MANBGIANT_GREY_PARROTB BIRD_PUFFINB +PUFFIN_MANB GIANT_PUFFINB BIRD_SWANBSWAN_MANB +GIANT_SWANB BIRD_LORIKEETB LORIKEET_MANBGIANT_LORIKEETB BIRD_WRENBWREN_MANB +GIANT_WRENB BIRD_OSPREYB +OSPREY_MANB GIANT_OSPREYBBIRD_EMUBEMU_MANB GIANT_EMUBBIRD_COCKATIELB COCKATIEL_MANBGIANT_COCKATIELBBIRD_LOVEBIRD_PEACH-FACEDBPEACH-FACED_LOVEBIRD_MANBGIANT_PEACH-FACED_LOVEBIRDB BIRD_MAGPIEB +MAGPIE_MANB GIANT_MAGPIEB BIRD_KESTRELB KESTREL_MANB GIANT_KESTRELBBIRD_ALBATROSSB ALBATROSS_MANBGIANT_ALBATROSSBBIRD_OWL_GREAT_HORNEDBGREAT_HORNED_OWL_MANBGIANT_GREAT_HORNED_OWLB +BIRD_EAGLEB EAGLE_MANB GIANT_EAGLEB BIRD_HORNBILLB HORNBILL_MANBGIANT_HORNBILLBBIRD_LOVEBIRD_MASKEDBMASKED_LOVEBIRD_MANBGIANT_MASKED_LOVEBIRDB BIRD_BUSHTITB BUSHTIT_MANB GIANT_BUSHTITB DAMSELFLYB DAMSELFLY_MANBGIANT_DAMSELFLYBMOTHBMOTH_MANB +GIANT_MOTHB GRASSHOPPERBGRASSHOPPER_MANBGIANT_GRASSHOPPERB BARK_SCORPIONBBARK_SCORPION_MANBGIANT_BARK_SCORPIONBMANTISB +MANTIS_MANB GIANT_MANTISBTICKBTICK_MANB +GIANT_TICKBLOUSEB LOUSE_MANB GIANT_LOUSEBTHRIPSB +THRIPS_MANB GIANT_THRIPSBSLUGBSLUG_MANB +GIANT_SLUGBMOSQUITOB MOSQUITO_MANBGIANT_MOSQUITOBSPIDER_JUMPINGBJUMPING_SPIDER_MANBGIANT_JUMPING_SPIDERBTERMITEB +MOON_SNAILBMOON_SNAIL_MANBGIANT_MOON_SNAILBSPIDER_BROWN_RECLUSEBBROWN_RECLUSE_SPIDER_MANBGIANT_BROWN_RECLUSE_SPIDERBSNAILB SNAIL_MANB GIANT_SNAILB GECKO_LEOPARDBLEOPARD_GECKO_MANBGIANT_LEOPARD_GECKOBDESERT TORTOISEBDESERT_TORTOISE_MANBGIANT_DESERT_TORTOISEB GILA_MONSTERBGILA_MONSTER_MANBGIANT_GILA_MONSTERBDOGBCATBMULEBDONKEYBHORSEBCOWBSHEEPBPIGBGOATB BIRD_CHICKENBCAVYB BIRD_DUCKB WATER_BUFFALOBREINDEERB +BIRD_GOOSEBYAKBLLAMABALPACABBIRD_GUINEAFOWLBBIRD_PEAFOWL_BLUEB BIRD_TURKEYBRABBITBCHIMERABCENTAURBGRIFFONBFLYBFLY_MANB GIANT_FLYB ROACH_LARGEB ROACH_MANB GIANT_ROACHBBEETLEB +BEETLE_MANB GIANT_BEETLEBANTBBUTTERFLY_MONARCHBBUTTERFLY_MONARCH_MANBGIANT_BUTTERFLY_MONARCHBFIREFLYB FIREFLY_MANB GIANT_FIREFLYB DRAGONFLYB DRAGONFLY_MANBGIANT_DRAGONFLYB HONEY_BEEB BUMBLEBEEB GOAT_MOUNTAINBGOAT_MOUNTAIN_MANBGIANT_GOAT_MOUNTAINB MARMOT_HOARYBMARMOT_HOARY_MANBGIANT_MARMOT_HOARYBGNOME_MOUNTAINB +GNOME_DARKBWALRUSB +WALRUS_MANB GIANT_WALRUSBFISH_LAMPREY_SEABSHARK_GREAT_WHITEB SHARK_FRILLBSHARK_SPINY_DOGFISHBSHARK_WOBBEGONG_SPOTTEDB SHARK_WHALEB SHARK_BASKINGB SHARK_NURSEBSHARK_MAKO_SHORTFINBSHARK_MAKO_LONGFINB SHARK_TIGERB +SHARK_BULLBSHARK_REEF_BLACKTIPBSHARK_REEF_WHITETIPB +SHARK_BLUEBSHARK_HAMMERHEADB SHARK_ANGELBFISH_SKATE_COMMONBFISH_RAY_MANTAB FISH_STINGRAYBFISH_COELACANTHB FISH_STURGEONBFISH_CONGER_EELB FISH_MILKFISHBFISH_CODB FISH_OPAHBFISH_GROUPER_GIANTB FISH_BLUEFISHBFISH_SUNFISH_OCEANBFISH_SWORDFISHB FISH_MARLINB FISH_HALIBUTBFISH_BARRACUDA_GREATBFISH_TUNA_BLUEFINBNARWHALB NARWHAL MANBNARWHAL, GIANTBHIPPOB HIPPO_MANB GIANT_HIPPOBFISH_GAR_LONGNOSEB FISH_CARPBFISH_TIGERFISHB FISH_PIKEBPLATYPUSB PLATYPUS MANBPLATYPUS, GIANTB BEAR_GRIZZLYBBEAR_GRIZZLY_MANBGIANT_BEAR_GRIZZLYB +BEAR_BLACKBBEAR_BLACK_MANBGIANT_BEAR_BLACKBDEERBDEER_MANB +GIANT_DEERBFOXBFOX_MANB GIANT_FOXBRACCOONB RACCOON_MANB GIANT_RACCOONBMACAQUE_RHESUSBMACAQUE_RHESUS_MANBGIANT_MACAQUE_RHESUSBCOUGARB +COUGAR_MANB GIANT_COUGARBWOLFBWOLF_MANB +GIANT_WOLFB GROUNDHOGB GROUNDHOG_MANBGIANT_GROUNDHOGB ALLIGATORB ALLIGATOR_MANBGIANT_ALLIGATORB BIRD_BUZZARDB BUZZARD_MANB GIANT_BUZZARDBPANDABPANDA, GIGANTICB PANDA MANBCAPYBARABCAPYBARA, GIANTB CAPYBARA MANBBADGERB +BADGER MANB BADGER, GIANTBMOOSEB MOOSE MANB MOOSE, GIANTB RED PANDAB RED PANDA MANBRED PANDA, GIANTBELEPHANTB ELEPHANT_MANBGIANT_ELEPHANTBWARTHOGB WARTHOG_MANB GIANT_WARTHOGBLIONBLION_MANB +GIANT_LIONBLEOPARDB LEOPARD_MANB GIANT_LEOPARDBJAGUARB +JAGUAR_MANB GIANT_JAGUARBTIGERB TIGER_MANB GIANT_TIGERBCHEETAHB CHEETAH_MANB GIANT_CHEETAHBGAZELLEB GAZELLE_MANB GIANT_GAZELLEBMANDRILLB MANDRILL_MANBGIANT_MANDRILLB +CHIMPANZEEBBONOBOBGORILLAB ORANGUTANBGIBBON_SIAMANGBGIBBON_WHITE_HANDEDBGIBBON_BLACK_HANDEDB GIBBON_GRAYBGIBBON_SILVERYBGIBBON_PILEATEDB GIBBON_BILOUBGIBBON_WHITE_BROWEDBGIBBON_BLACK_CRESTEDB CAMEL_1_HUMPBCAMEL_1_HUMP_MANBGIANT_CAMEL_1_HUMPB CAMEL_2_HUMPBCAMEL_2_HUMP_MANBGIANT_CAMEL_2_HUMPBCROCODILE_SALTWATERBCROCODILE_SALTWATER_MANBGIANT_CROCODILE_SALTWATERB BIRD_VULTUREB VULTURE_MANB GIANT_VULTUREB +RHINOCEROSBRHINOCEROS_MANBGIANT_RHINOCEROSBGIRAFFEB GIRAFFE_MANB GIANT_GIRAFFEB HONEY BADGERBHONEY BADGER MANBHONEY BADGER, GIANTBGIANT TORTOISEBGIANT TORTOISE MANBGIGANTIC TORTOISEB ARMADILLOB ARMADILLO MANBARMADILLO, GIANTBMUSKOXB +MUSKOX_MANB GIANT_MUSKOXBELKBELK_MANB GIANT_ELKB +BEAR_POLARBBEAR_POLAR_MANBGIANT_BEAR_POLARB WOLVERINEB WOLVERINE_MANBGIANT_WOLVERINEB +CHINCHILLABCHINCHILLA_MANBGIANT_CHINCHILLAB FLOATING_GUTSBDRUNIANB CREEPING_EYEBVORACIOUS_CAVE_CRAWLERBBLIND_CAVE_OGREB +CAP_HOPPERB +MAGMA_CRABBCRUNDLEB HUNGRY_HEADB +FLESH_BALLBELK_BIRDB HELMET_SNAKEBGREEN_DEVOURERBRUTHERERBCREEPY_CRAWLERBDRALTHABGIANT_EARTHWORMB BLOOD_MANBBUGBATBMANERAB +MOLEMARIANBJABBERERB POND_GRABBERBBLIND_CAVE_BEARB CAVE_DRAGONBREACHERBELEMENTMAN_GABBROBGORLAKB CAVE_FLOATERBPLUMP_HELMET_MANB CAVE_BLOBBELEMENTMAN_AMETHYSTBOCTOPUSB OCTOPUS_MANB GIANT_OCTOPUSBCRABBCRAB_MANB +GIANT_CRABB LEOPARD_SEALBLEOPARD_SEAL_MANBGIANT_LEOPARD_SEALB +CUTTLEFISHBCUTTLEFISH_MANBGIANT_CUTTLEFISHBORCABORCA_MANB +GIANT_ORCABSPONGEB +SPONGE_MANB GIANT_SPONGEBHORSESHOE_CRABBHORSESHOE_CRAB_MANBGIANT_HORSESHOE_CRABB SPERM_WHALEBSPERM_WHALE_MANBGIANT_SPERM_WHALEB ELEPHANT_SEALBELEPHANT_SEAL_MANBGIANT_ELEPHANT_SEALB HARP_SEALB HARP_SEAL_MANBGIANT_HARP_SEALBNAUTILUSB NAUTILUS_MANBGIANT_NAUTILUSB FOXSQUIRRELB MOGHOPPERB RAT_DEMONBWAMBLER_FLUFFYBLIZARD_RHINO_TWO_LEGGEDB WORM_KNUCKLEBSPIDER_PHANTOMB FLY_ACORNB +GNAT_BLOODBLIZARDB +LIZARD_MANB GIANT_LIZARDBSKINKB SKINK_MANB GIANT_SKINKB CHAMELEONB CHAMELEON_MANBGIANT_CHAMELEONBANOLEB ANOLE_MANB GIANT_ANOLEBIGUANAB +IGUANA_MANB GIANT_IGUANAB RIVER OTTERB SEA OTTERB OTTER_MANB GIANT_OTTERBSNAPPING TURTLEBALLIGATOR SNAPPING TURTLEBSNAPPING_TURTLE_MANBGIANT_SNAPPING_TURTLEBBEAVERB +BEAVER_MANB GIANT_BEAVERBLEECHB LEECH_MANB GIANT_LEECHBAXOLOTLB AXOLOTL_MANB GIANT_AXOLOTLBMINKBMINK_MANB +GIANT_MINKB POND_TURTLEBPOND_TURTLE_MANBGIANT_POND_TURTLEBRATBRAT_MANB SQUIRREL_GRAYBSQUIRREL_GRAY_MANBGIANT_SQUIRREL_GRAYB SQUIRREL_REDBSQUIRREL_RED_MANBGIANT_SQUIRREL_REDBCHIPMUNKB CHIPMUNK_MANBGIANT_CHIPMUNKBHAMSTERB HAMSTER_MANB GIANT_HAMSTERBHEDGEHOGB HEDGEHOG_MANBGIANT_HEDGEHOGBSQUIRREL_FLYINGBFLYING_SQUIRREL_MANBGIANT_FLYING_SQUIRRELBMUSSELBOYSTERB FISH_SALMONBFISH_CLOWNFISHB FISH_HAGFISHBFISH_LAMPREY_BROOKB FISH_RAY_BATBFISH_RAY_THORNBACKBFISH_RATFISH_SPOTTEDB FISH_HERRINGB FISH_SHADB FISH_ANCHOVYBFISH_TROUT_STEELHEADB FISH_HAKEB FISH_SEAHORSEB FISH_GLASSEYEBFISH_PUFFER_WHITE_SPOTTEDB FISH_SOLEB FISH_FLOUNDERB FISH_MACKERELBJELLYFISH_SEA_NETTLEBSQUIDB SQUID MANBGIGANTIC SQUIDB FISH_LUNGFISHBFISH_LOACH_CLOWNBFISH_BULLHEAD_BROWNBFISH_BULLHEAD_YELLOWBFISH_BULLHEAD_BLACKBFISH_KNIFEFISH_BANDEDB FISH_CHARBFISH_TROUT_RAINBOWBFISH_MOLLY_SAILFINB +FISH_GUPPYB +FISH_PERCHBDWARFBHUMANBELFBGOBLINBKOBOLDBGREMLINBTROLLBOGREBUNICORNBDRAGONBSATYRBCOLOSSUS_BRONZEBGIANTBCYCLOPSBETTINBMINOTAURBYETIB SASQUATCHB BLIZZARD_MANBWOLF_ICEBFAIRYBPIXIEBBEAK_DOGB GRIMELINGB BLENDEC_FOULB STRANGLERB NIGHTWINGBHARPYBHYDRAB MERPERSONB SEA_SERPENTB SEA_MONSTERBBIRD_ROCBCROCODILE_CAVEBTOAD_GIANT_CAVEB OLM_GIANTB BAT_GIANTB RAT_GIANTB RAT_LARGEBMOLE_DOG_NAKEDB +TROGLODYTEB +MOLE_GIANTBIMP_FIREBSPIDER_CAVE_GIANTB SPIDER_CAVEB FISH_CAVEB CAVE_FISH_MANB LOBSTER_CAVEB +SNAKE_FIREBOLMBOLM_MANBBATBBAT_MANBMAGGOT_PURRINGBELEMENTMAN_FIREBELEMENTMAN_MAGMABELEMENTMAN_IRONBELEMENTMAN_MUDBBIRD_SWALLOW_CAVEBCAVE_SWALLOW_MANBBIRD_SWALLOW_CAVE_GIANTB AMPHIBIAN_MANB REPTILE_MANB SERPENT_MANBANT_MANB +RODENT MANB WILD_BOARB WILD_BOAR_MANBGIANT_WILD_BOARBCOYOTEB +COYOTE_MANB GIANT_COYOTEBKANGAROOB KANGAROO_MANBGIANT_KANGAROOBKOALAB KOALA_MANB GIANT_KOALABADDERB ADDER_MANB GIANT_ADDERBECHIDNAB ECHIDNA_MANB GIANT_ECHIDNAB PORCUPINEB PORCUPINE_MANBGIANT_PORCUPINEB KINGSNAKEB KINGSNAKE_MANBGIANT_KINGSNAKEB GRAY_LANGURBGRAY_LANGUR_MANBGIANT_GRAY_LANGURBBOBCATB +BOBCAT_MANB GIANT_BOBCATBSKUNKB SKUNK_MANB GIANT_SKUNKBGREEN_TREE_FROGBGREEN_TREE_FROG_MANBGIANT_GREEN_TREE_FROGBHAREBHARE_MANB +GIANT_HAREB RATTLESNAKEBRATTLESNAKE_MANBGIANT_RATTLESNAKEBWEASELB +WEASEL_MANB GIANT_WEASELBCOPPERHEAD_SNAKEBCOPPERHEAD_SNAKE_MANBGIANT_COPPERHEAD_SNAKEBIBEXBIBEX_MANB +GIANT_IBEXBWOMBATB +WOMBAT_MANB GIANT_WOMBATBDINGOB DINGO_MANB GIANT_DINGOBCOATIB COATI_MANB GIANT_COATIBOPOSSUMB OPOSSUM_MANB GIANT_OPOSSUMBMONGOOSEB MONGOOSE_MANBGIANT_MONGOOSEBHYENAB HYENA_MANB GIANT_HYENABANACONDAB ANACONDA_MANBGIANT_ANACONDABMONITOR_LIZARDBMONITOR_LIZARD_MANBGIANT_MONITOR_LIZARDB +KING_COBRABKING_COBRA_MANBGIANT_KING_COBRABOCELOTB +OCELOT_MANB GIANT_OCELOTBJACKALB +JACKAL_MANB GIANT_JACKALBCAPUCHINB CAPUCHIN_MANBGIANT_CAPUCHINBSLOTHB SLOTH_MANB GIANT_SLOTHB SPIDER_MONKEYBSPIDER_MONKEY_MANBGIANT_SPIDER_MONKEYBPANGOLINB PANGOLIN_MANBGIANT_PANGOLINB BLACK_MAMBABBLACK_MAMBA_MANBGIANT_BLACK_MAMBAB +BEAR_SLOTHBSLOTH_BEAR_MANBGIANT_SLOTH_BEARBAYE-AYEB AYE-AYE_MANB GIANT_AYE-AYEB +BUSHMASTERBBUSHMASTER_MANBGIANT_BUSHMASTERBPYTHONB +PYTHON_MANB GIANT_PYTHONBTAPIRB TAPIR_MANB GIANT_TAPIRBIMPALAB +IMPALA_MANB GIANT_IMPALABAARDVARKB AARDVARK_MANBGIANT_AARDVARKB LION_TAMARINBLION_TAMARIN_MANBGIANT_LION_TAMARINBSTOATB STOAT_MANB GIANT_STOATBLYNXBLYNX_MANB +GIANT_LYNXJTOADJTOAD_MANJ +GIANT_TOADJWORMJWORM_MANJ BIRD_BLUEJAYJ BLUEJAY_MANJ GIANT_BLUEJAYJ BIRD_CARDINALJ CARDINAL_MANJGIANT_CARDINALJ BIRD_GRACKLEJ GRACKLE_MANJ GIANT_GRACKLEJ BIRD_ORIOLEJ +ORIOLE_MANJ GIANT_ORIOLEJBIRD_RW_BLACKBIRDJRW_BLACKBIRD_MANJGIANT_RW_BLACKBIRDJ BIRD_PENGUINJBIRD_PENGUIN_LITTLEJBIRD_PENGUIN_EMPERORJ PENGUIN MANJBIRD_PENGUIN_GIANTJBIRD_FALCON_PEREGRINEJPEREGRINE FALCON MANJGIANT PEREGRINE FALCONJ BIRD_KIWIJKIWI MANJBIRD_KIWI_GIANTJ BIRD_OSTRICHJ OSTRICH MANJBIRD_OSTRICH_GIANTJ BIRD_CROWJCROW_MANJ +GIANT_CROWJ +BIRD_RAVENJ RAVEN_MANJ GIANT_RAVENJBIRD_CASSOWARYJ CASSOWARY_MANJGIANT_CASSOWARYJBIRD_KEAJKEA_MANJ GIANT_KEAJBIRD_OWL_SNOWYJ SNOWY_OWL_MANJGIANT_SNOWY_OWLJSPARROWJ SPARROW_MANJ GIANT_SPARROWJBIRD_STORK_WHITEJWHITE_STORK_MANJGIANT_WHITE_STORKJ BIRD_LOONJLOON_MANJ +GIANT_LOONJ BIRD_OWL_BARNJ BARN_OWL_MANJGIANT_BARN_OWLJ BIRD_PARAKEETJ PARAKEET_MANJGIANT_PARAKEETJ BIRD_KAKAPOJ +KAKAPO_MANJ GIANT_KAKAPOJBIRD_PARROT_GREYJGREY_PARROT_MANJGIANT_GREY_PARROTJ BIRD_PUFFINJ +PUFFIN_MANJ GIANT_PUFFINJ BIRD_SWANJSWAN_MANJ +GIANT_SWANJ BIRD_LORIKEETJ LORIKEET_MANJGIANT_LORIKEETJ BIRD_WRENJWREN_MANJ +GIANT_WRENJ BIRD_OSPREYJ +OSPREY_MANJ GIANT_OSPREYJBIRD_EMUJEMU_MANJ GIANT_EMUJBIRD_COCKATIELJ COCKATIEL_MANJGIANT_COCKATIELJBIRD_LOVEBIRD_PEACH-FACEDJPEACH-FACED_LOVEBIRD_MANJGIANT_PEACH-FACED_LOVEBIRDJ BIRD_MAGPIEJ +MAGPIE_MANJ GIANT_MAGPIEJ BIRD_KESTRELJ KESTREL_MANJ GIANT_KESTRELJBIRD_ALBATROSSJ ALBATROSS_MANJGIANT_ALBATROSSJBIRD_OWL_GREAT_HORNEDJGREAT_HORNED_OWL_MANJGIANT_GREAT_HORNED_OWLJ +BIRD_EAGLEJ EAGLE_MANJ GIANT_EAGLEJ BIRD_HORNBILLJ HORNBILL_MANJGIANT_HORNBILLJBIRD_LOVEBIRD_MASKEDJMASKED_LOVEBIRD_MANJGIANT_MASKED_LOVEBIRDJ BIRD_BUSHTITJ BUSHTIT_MANJ GIANT_BUSHTITJ DAMSELFLYJ DAMSELFLY_MANJGIANT_DAMSELFLYJMOTHJMOTH_MANJ +GIANT_MOTHJ GRASSHOPPERJGRASSHOPPER_MANJGIANT_GRASSHOPPERJ BARK_SCORPIONJBARK_SCORPION_MANJGIANT_BARK_SCORPIONJMANTISJ +MANTIS_MANJ GIANT_MANTISJTICKJTICK_MANJ +GIANT_TICKJLOUSEJ LOUSE_MANJ GIANT_LOUSEJTHRIPSJ +THRIPS_MANJ GIANT_THRIPSJSLUGJSLUG_MANJ +GIANT_SLUGJMOSQUITOJ MOSQUITO_MANJGIANT_MOSQUITOJSPIDER_JUMPINGJJUMPING_SPIDER_MANJGIANT_JUMPING_SPIDERJTERMITEJ +MOON_SNAILJMOON_SNAIL_MANJGIANT_MOON_SNAILJSPIDER_BROWN_RECLUSEJBROWN_RECLUSE_SPIDER_MANJGIANT_BROWN_RECLUSE_SPIDERJSNAILJ SNAIL_MANJ GIANT_SNAILJ GECKO_LEOPARDJLEOPARD_GECKO_MANJGIANT_LEOPARD_GECKOJDESERT TORTOISEJDESERT_TORTOISE_MANJGIANT_DESERT_TORTOISEJ GILA_MONSTERJGILA_MONSTER_MANJGIANT_GILA_MONSTERJDOGJCATJMULEJDONKEYJHORSEJCOWJSHEEPJPIGJGOATJ BIRD_CHICKENJCAVYJ BIRD_DUCKJ WATER_BUFFALOJREINDEERJ +BIRD_GOOSEJYAKJLLAMAJALPACAJBIRD_GUINEAFOWLJBIRD_PEAFOWL_BLUEJ BIRD_TURKEYJRABBITJCHIMERAJCENTAURJGRIFFONJFLYJFLY_MANJ GIANT_FLYJ ROACH_LARGEJ ROACH_MANJ GIANT_ROACHJBEETLEJ +BEETLE_MANJ GIANT_BEETLEJANTJBUTTERFLY_MONARCHJBUTTERFLY_MONARCH_MANJGIANT_BUTTERFLY_MONARCHJFIREFLYJ FIREFLY_MANJ GIANT_FIREFLYJ DRAGONFLYJ DRAGONFLY_MANJGIANT_DRAGONFLYJ HONEY_BEEJ BUMBLEBEEJ GOAT_MOUNTAINJGOAT_MOUNTAIN_MANJGIANT_GOAT_MOUNTAINJ MARMOT_HOARYJMARMOT_HOARY_MANJGIANT_MARMOT_HOARYJGNOME_MOUNTAINJ +GNOME_DARKJWALRUSJ +WALRUS_MANJ GIANT_WALRUSJFISH_LAMPREY_SEAJSHARK_GREAT_WHITEJ SHARK_FRILLJSHARK_SPINY_DOGFISHJSHARK_WOBBEGONG_SPOTTEDJ SHARK_WHALEJ SHARK_BASKINGJ SHARK_NURSEJSHARK_MAKO_SHORTFINJSHARK_MAKO_LONGFINJ SHARK_TIGERJ +SHARK_BULLJSHARK_REEF_BLACKTIPJSHARK_REEF_WHITETIPJ +SHARK_BLUEJSHARK_HAMMERHEADJ SHARK_ANGELJFISH_SKATE_COMMONJFISH_RAY_MANTAJ FISH_STINGRAYJFISH_COELACANTHJ FISH_STURGEONJFISH_CONGER_EELJ FISH_MILKFISHJFISH_CODJ FISH_OPAHJFISH_GROUPER_GIANTJ FISH_BLUEFISHJFISH_SUNFISH_OCEANJFISH_SWORDFISHJ FISH_MARLINJ FISH_HALIBUTJFISH_BARRACUDA_GREATJFISH_TUNA_BLUEFINJNARWHALJ NARWHAL MANJNARWHAL, GIANTJHIPPOJ HIPPO_MANJ GIANT_HIPPOJFISH_GAR_LONGNOSEJ FISH_CARPJFISH_TIGERFISHJ FISH_PIKEJPLATYPUSJ PLATYPUS MANJPLATYPUS, GIANTJ BEAR_GRIZZLYJBEAR_GRIZZLY_MANJGIANT_BEAR_GRIZZLYJ +BEAR_BLACKJBEAR_BLACK_MANJGIANT_BEAR_BLACKJDEERJDEER_MANJ +GIANT_DEERJFOXJFOX_MANJ GIANT_FOXJRACCOONJ RACCOON_MANJ GIANT_RACCOONJMACAQUE_RHESUSJMACAQUE_RHESUS_MANJGIANT_MACAQUE_RHESUSJCOUGARJ +COUGAR_MANJ GIANT_COUGARJWOLFJWOLF_MANJ +GIANT_WOLFJ GROUNDHOGJ GROUNDHOG_MANJGIANT_GROUNDHOGJ ALLIGATORJ ALLIGATOR_MANJGIANT_ALLIGATORJ BIRD_BUZZARDJ BUZZARD_MANJ GIANT_BUZZARDJPANDAJPANDA, GIGANTICJ PANDA MANJCAPYBARAJCAPYBARA, GIANTJ CAPYBARA MANJBADGERJ +BADGER MANJ BADGER, GIANTJMOOSEJ MOOSE MANJ MOOSE, GIANTJ RED PANDAJ RED PANDA MANJRED PANDA, GIANTJELEPHANTJ ELEPHANT_MANJGIANT_ELEPHANTJWARTHOGJ WARTHOG_MANJ GIANT_WARTHOGJLIONJLION_MANJ +GIANT_LIONJLEOPARDJ LEOPARD_MANJ GIANT_LEOPARDJJAGUARJ +JAGUAR_MANJ GIANT_JAGUARJTIGERJ TIGER_MANJ GIANT_TIGERJCHEETAHJ CHEETAH_MANJ GIANT_CHEETAHJGAZELLEJ GAZELLE_MANJ GIANT_GAZELLEJMANDRILLJ MANDRILL_MANJGIANT_MANDRILLJ +CHIMPANZEEJBONOBOJGORILLAJ ORANGUTANJGIBBON_SIAMANGJGIBBON_WHITE_HANDEDJGIBBON_BLACK_HANDEDJ GIBBON_GRAYJGIBBON_SILVERYJGIBBON_PILEATEDJ GIBBON_BILOUJGIBBON_WHITE_BROWEDJGIBBON_BLACK_CRESTEDJ CAMEL_1_HUMPJCAMEL_1_HUMP_MANJGIANT_CAMEL_1_HUMPJ CAMEL_2_HUMPJCAMEL_2_HUMP_MANJGIANT_CAMEL_2_HUMPJCROCODILE_SALTWATERJCROCODILE_SALTWATER_MANJGIANT_CROCODILE_SALTWATERJ BIRD_VULTUREJ VULTURE_MANJ GIANT_VULTUREJ +RHINOCEROSJRHINOCEROS_MANJGIANT_RHINOCEROSJGIRAFFEJ GIRAFFE_MANJ GIANT_GIRAFFEJ HONEY BADGERJHONEY BADGER MANJHONEY BADGER, GIANTJGIANT TORTOISEJGIANT TORTOISE MANJGIGANTIC TORTOISEJ ARMADILLOJ ARMADILLO MANJARMADILLO, GIANTJMUSKOXJ +MUSKOX_MANJ GIANT_MUSKOXJELKJELK_MANJ GIANT_ELKJ +BEAR_POLARJBEAR_POLAR_MANJGIANT_BEAR_POLARJ WOLVERINEJ WOLVERINE_MANJGIANT_WOLVERINEJ +CHINCHILLAJCHINCHILLA_MANJGIANT_CHINCHILLAJ FLOATING_GUTSJDRUNIANJ CREEPING_EYEJVORACIOUS_CAVE_CRAWLERJBLIND_CAVE_OGREJ +CAP_HOPPERJ +MAGMA_CRABJCRUNDLEJ HUNGRY_HEADJ +FLESH_BALLJELK_BIRDJ HELMET_SNAKEJGREEN_DEVOURERJRUTHERERJCREEPY_CRAWLERJDRALTHAJGIANT_EARTHWORMJ BLOOD_MANJBUGBATJMANERAJ +MOLEMARIANJJABBERERJ POND_GRABBERJBLIND_CAVE_BEARJ CAVE_DRAGONJREACHERJELEMENTMAN_GABBROJGORLAKJ CAVE_FLOATERJPLUMP_HELMET_MANJ CAVE_BLOBJELEMENTMAN_AMETHYSTJOCTOPUSJ OCTOPUS_MANJ GIANT_OCTOPUSJCRABJCRAB_MANJ +GIANT_CRABJ LEOPARD_SEALJLEOPARD_SEAL_MANJGIANT_LEOPARD_SEALJ +CUTTLEFISHJCUTTLEFISH_MANJGIANT_CUTTLEFISHJORCAJORCA_MANJ +GIANT_ORCAJSPONGEJ +SPONGE_MANJ GIANT_SPONGEJHORSESHOE_CRABJHORSESHOE_CRAB_MANJGIANT_HORSESHOE_CRABJ SPERM_WHALEJSPERM_WHALE_MANJGIANT_SPERM_WHALEJ ELEPHANT_SEALJELEPHANT_SEAL_MANJGIANT_ELEPHANT_SEALJ HARP_SEALJ HARP_SEAL_MANJGIANT_HARP_SEALJNAUTILUSJ NAUTILUS_MANJGIANT_NAUTILUSJ FOXSQUIRRELJ MOGHOPPERJ RAT_DEMONJWAMBLER_FLUFFYJLIZARD_RHINO_TWO_LEGGEDJ WORM_KNUCKLEJSPIDER_PHANTOMJ FLY_ACORNJ +GNAT_BLOODJLIZARDJ +LIZARD_MANJ GIANT_LIZARDJSKINKJ SKINK_MANJ GIANT_SKINKJ CHAMELEONJ CHAMELEON_MANJGIANT_CHAMELEONJANOLEJ ANOLE_MANJ GIANT_ANOLEJIGUANAJ +IGUANA_MANJ GIANT_IGUANAJ RIVER OTTERJ SEA OTTERJ OTTER_MANJ GIANT_OTTERJSNAPPING TURTLEJALLIGATOR SNAPPING TURTLEJSNAPPING_TURTLE_MANJGIANT_SNAPPING_TURTLEJBEAVERJ +BEAVER_MANJ GIANT_BEAVERJLEECHJ LEECH_MANJ GIANT_LEECHJAXOLOTLJ AXOLOTL_MANJ GIANT_AXOLOTLJMINKJMINK_MANJ +GIANT_MINKJ POND_TURTLEJPOND_TURTLE_MANJGIANT_POND_TURTLEJRATJRAT_MANJ SQUIRREL_GRAYJSQUIRREL_GRAY_MANJGIANT_SQUIRREL_GRAYJ SQUIRREL_REDJSQUIRREL_RED_MANJGIANT_SQUIRREL_REDJCHIPMUNKJ CHIPMUNK_MANJGIANT_CHIPMUNKJHAMSTERJ HAMSTER_MANJ GIANT_HAMSTERJHEDGEHOGJ HEDGEHOG_MANJGIANT_HEDGEHOGJSQUIRREL_FLYINGJFLYING_SQUIRREL_MANJGIANT_FLYING_SQUIRRELJMUSSELJOYSTERJ FISH_SALMONJFISH_CLOWNFISHJ FISH_HAGFISHJFISH_LAMPREY_BROOKJ FISH_RAY_BATJFISH_RAY_THORNBACKJFISH_RATFISH_SPOTTEDJ FISH_HERRINGJ FISH_SHADJ FISH_ANCHOVYJFISH_TROUT_STEELHEADJ FISH_HAKEJ FISH_SEAHORSEJ FISH_GLASSEYEJFISH_PUFFER_WHITE_SPOTTEDJ FISH_SOLEJ FISH_FLOUNDERJ FISH_MACKERELJJELLYFISH_SEA_NETTLEJSQUIDJ SQUID MANJGIGANTIC SQUIDJ FISH_LUNGFISHJFISH_LOACH_CLOWNJFISH_BULLHEAD_BROWNJFISH_BULLHEAD_YELLOWJFISH_BULLHEAD_BLACKJFISH_KNIFEFISH_BANDEDJ FISH_CHARJFISH_TROUT_RAINBOWJFISH_MOLLY_SAILFINJ +FISH_GUPPYJ +FISH_PERCHJDWARFJHUMANJELFJGOBLINJKOBOLDJGREMLINJTROLLJOGREJUNICORNJDRAGONJSATYRJCOLOSSUS_BRONZEJGIANTJCYCLOPSJETTINJMINOTAURJYETIJ SASQUATCHJ BLIZZARD_MANJWOLF_ICEJFAIRYJPIXIEJBEAK_DOGJ GRIMELINGJ BLENDEC_FOULJ STRANGLERJ NIGHTWINGJHARPYJHYDRAJ MERPERSONJ SEA_SERPENTJ SEA_MONSTERJBIRD_ROCJCROCODILE_CAVEJTOAD_GIANT_CAVEJ OLM_GIANTJ BAT_GIANTJ RAT_GIANTJ RAT_LARGEJMOLE_DOG_NAKEDJ +TROGLODYTEJ +MOLE_GIANTJIMP_FIREJSPIDER_CAVE_GIANTJ SPIDER_CAVEJ FISH_CAVEJ CAVE_FISH_MANJ LOBSTER_CAVEJ +SNAKE_FIREJOLMJOLM_MANJBATJBAT_MANJMAGGOT_PURRINGJELEMENTMAN_FIREJELEMENTMAN_MAGMAJELEMENTMAN_IRONJELEMENTMAN_MUDJBIRD_SWALLOW_CAVEJCAVE_SWALLOW_MANJBIRD_SWALLOW_CAVE_GIANTJ AMPHIBIAN_MANJ REPTILE_MANJ SERPENT_MANJANT_MANJ +RODENT MANJ WILD_BOARJ WILD_BOAR_MANJGIANT_WILD_BOARJCOYOTEJ +COYOTE_MANJ GIANT_COYOTEJKANGAROOJ KANGAROO_MANJGIANT_KANGAROOJKOALAJ KOALA_MANJ GIANT_KOALAJADDERJ ADDER_MANJ GIANT_ADDERJECHIDNAJ ECHIDNA_MANJ GIANT_ECHIDNAJ PORCUPINEJ PORCUPINE_MANJGIANT_PORCUPINEJ KINGSNAKEJ KINGSNAKE_MANJGIANT_KINGSNAKEJ GRAY_LANGURJGRAY_LANGUR_MANJGIANT_GRAY_LANGURJBOBCATJ +BOBCAT_MANJ GIANT_BOBCATJSKUNKJ SKUNK_MANJ GIANT_SKUNKJGREEN_TREE_FROGJGREEN_TREE_FROG_MANJGIANT_GREEN_TREE_FROGJHAREJHARE_MANJ +GIANT_HAREJ RATTLESNAKEJRATTLESNAKE_MANJGIANT_RATTLESNAKEJWEASELJ +WEASEL_MANJ GIANT_WEASELJCOPPERHEAD_SNAKEJCOPPERHEAD_SNAKE_MANJGIANT_COPPERHEAD_SNAKEJIBEXJIBEX_MANJ +GIANT_IBEXJWOMBATJ +WOMBAT_MANJ GIANT_WOMBATJDINGOJ DINGO_MANJ GIANT_DINGOJCOATIJ COATI_MANJ GIANT_COATIJOPOSSUMJ OPOSSUM_MANJ GIANT_OPOSSUMJMONGOOSEJ MONGOOSE_MANJGIANT_MONGOOSEJHYENAJ HYENA_MANJ GIANT_HYENAJANACONDAJ ANACONDA_MANJGIANT_ANACONDAJMONITOR_LIZARDJMONITOR_LIZARD_MANJGIANT_MONITOR_LIZARDJ +KING_COBRAJKING_COBRA_MANJGIANT_KING_COBRAJOCELOTJ +OCELOT_MANJ GIANT_OCELOTJJACKALJ +JACKAL_MANJ GIANT_JACKALJCAPUCHINJ CAPUCHIN_MANJGIANT_CAPUCHINJSLOTHJ SLOTH_MANJ GIANT_SLOTHJ SPIDER_MONKEYJSPIDER_MONKEY_MANJGIANT_SPIDER_MONKEYJPANGOLINJ PANGOLIN_MANJGIANT_PANGOLINJ BLACK_MAMBAJBLACK_MAMBA_MANJGIANT_BLACK_MAMBAJ +BEAR_SLOTHJSLOTH_BEAR_MANJGIANT_SLOTH_BEARJAYE-AYEJ AYE-AYE_MANJ GIANT_AYE-AYEJ +BUSHMASTERJBUSHMASTER_MANJGIANT_BUSHMASTERJPYTHONJ +PYTHON_MANJ GIANT_PYTHONJTAPIRJ TAPIR_MANJ GIANT_TAPIRJIMPALAJ +IMPALA_MANJ GIANT_IMPALAJAARDVARKJ AARDVARK_MANJGIANT_AARDVARKJ LION_TAMARINJLION_TAMARIN_MANJGIANT_LION_TAMARINJSTOATJ STOAT_MANJ GIANT_STOATJLYNXJLYNX_MANJ +GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/shells.dfstock b/data/stockpiles/shells.dfstock index e69de29bb..548152764 100644 --- a/data/stockpiles/shells.dfstock +++ b/data/stockpiles/shells.dfstock @@ -0,0 +1,157 @@ +*ÆW +WOOD +DOOR + FLOODGATE +BED +CHAIR +CHAIN +FLASK +GOBLET + +INSTRUMENT +TOY +WINDOW +CAGE +BARREL +BUCKET + +ANIMALTRAP +TABLE +COFFIN +STATUE +WEAPON +ARMOR +SHOES +SHIELD +HELM +GLOVES +BOX +BAG +BIN + +ARMORSTAND + +WEAPONRACK +CABINET +FIGURINE +AMULET +SCEPTER +AMMO +CROWN +RING +EARRING +BRACELET +GEM +ANVIL +REMAINS +MEAT +FISH +FISH_RAW +VERMIN +PET +SEEDS +PLANT + SKIN_TANNED + PLANT_GROWTH +THREAD +CLOTH +TOTEM +PANTS +BACKPACK +QUIVER + CATAPULTPARTS + BALLISTAPARTS + SIEGEAMMO +BALLISTAARROWHEAD + TRAPPARTS +TRAPCOMP +DRINK + POWDER_MISC +CHEESE +FOOD + LIQUID_MISC +COIN +GLOB + PIPE_SECTION + HATCH_COVER +GRATE +QUERN + MILLSTONE +SPLINT +CRUTCH +TRACTION_BENCH +TOOL +SLAB +EGG +BOOK +SHEET +BRANCHBTOADBTOAD_MANB +GIANT_TOADBWORMBWORM_MANB BIRD_BLUEJAYB BLUEJAY_MANB GIANT_BLUEJAYB BIRD_CARDINALB CARDINAL_MANBGIANT_CARDINALB BIRD_GRACKLEB GRACKLE_MANB GIANT_GRACKLEB BIRD_ORIOLEB +ORIOLE_MANB GIANT_ORIOLEBBIRD_RW_BLACKBIRDBRW_BLACKBIRD_MANBGIANT_RW_BLACKBIRDB BIRD_PENGUINBBIRD_PENGUIN_LITTLEBBIRD_PENGUIN_EMPERORB PENGUIN MANBBIRD_PENGUIN_GIANTBBIRD_FALCON_PEREGRINEBPEREGRINE FALCON MANBGIANT PEREGRINE FALCONB BIRD_KIWIBKIWI MANBBIRD_KIWI_GIANTB BIRD_OSTRICHB OSTRICH MANBBIRD_OSTRICH_GIANTB BIRD_CROWBCROW_MANB +GIANT_CROWB +BIRD_RAVENB RAVEN_MANB GIANT_RAVENBBIRD_CASSOWARYB CASSOWARY_MANBGIANT_CASSOWARYBBIRD_KEABKEA_MANB GIANT_KEABBIRD_OWL_SNOWYB SNOWY_OWL_MANBGIANT_SNOWY_OWLBSPARROWB SPARROW_MANB GIANT_SPARROWBBIRD_STORK_WHITEBWHITE_STORK_MANBGIANT_WHITE_STORKB BIRD_LOONBLOON_MANB +GIANT_LOONB BIRD_OWL_BARNB BARN_OWL_MANBGIANT_BARN_OWLB BIRD_PARAKEETB PARAKEET_MANBGIANT_PARAKEETB BIRD_KAKAPOB +KAKAPO_MANB GIANT_KAKAPOBBIRD_PARROT_GREYBGREY_PARROT_MANBGIANT_GREY_PARROTB BIRD_PUFFINB +PUFFIN_MANB GIANT_PUFFINB BIRD_SWANBSWAN_MANB +GIANT_SWANB BIRD_LORIKEETB LORIKEET_MANBGIANT_LORIKEETB BIRD_WRENBWREN_MANB +GIANT_WRENB BIRD_OSPREYB +OSPREY_MANB GIANT_OSPREYBBIRD_EMUBEMU_MANB GIANT_EMUBBIRD_COCKATIELB COCKATIEL_MANBGIANT_COCKATIELBBIRD_LOVEBIRD_PEACH-FACEDBPEACH-FACED_LOVEBIRD_MANBGIANT_PEACH-FACED_LOVEBIRDB BIRD_MAGPIEB +MAGPIE_MANB GIANT_MAGPIEB BIRD_KESTRELB KESTREL_MANB GIANT_KESTRELBBIRD_ALBATROSSB ALBATROSS_MANBGIANT_ALBATROSSBBIRD_OWL_GREAT_HORNEDBGREAT_HORNED_OWL_MANBGIANT_GREAT_HORNED_OWLB +BIRD_EAGLEB EAGLE_MANB GIANT_EAGLEB BIRD_HORNBILLB HORNBILL_MANBGIANT_HORNBILLBBIRD_LOVEBIRD_MASKEDBMASKED_LOVEBIRD_MANBGIANT_MASKED_LOVEBIRDB BIRD_BUSHTITB BUSHTIT_MANB GIANT_BUSHTITB DAMSELFLYB DAMSELFLY_MANBGIANT_DAMSELFLYBMOTHBMOTH_MANB +GIANT_MOTHB GRASSHOPPERBGRASSHOPPER_MANBGIANT_GRASSHOPPERB BARK_SCORPIONBBARK_SCORPION_MANBGIANT_BARK_SCORPIONBMANTISB +MANTIS_MANB GIANT_MANTISBTICKBTICK_MANB +GIANT_TICKBLOUSEB LOUSE_MANB GIANT_LOUSEBTHRIPSB +THRIPS_MANB GIANT_THRIPSBSLUGBSLUG_MANB +GIANT_SLUGBMOSQUITOB MOSQUITO_MANBGIANT_MOSQUITOBSPIDER_JUMPINGBJUMPING_SPIDER_MANBGIANT_JUMPING_SPIDERBTERMITEB +MOON_SNAILBMOON_SNAIL_MANBGIANT_MOON_SNAILBSPIDER_BROWN_RECLUSEBBROWN_RECLUSE_SPIDER_MANBGIANT_BROWN_RECLUSE_SPIDERBSNAILB SNAIL_MANB GIANT_SNAILB GECKO_LEOPARDBLEOPARD_GECKO_MANBGIANT_LEOPARD_GECKOBDESERT TORTOISEBDESERT_TORTOISE_MANBGIANT_DESERT_TORTOISEB GILA_MONSTERBGILA_MONSTER_MANBGIANT_GILA_MONSTERBDOGBCATBMULEBDONKEYBHORSEBCOWBSHEEPBPIGBGOATB BIRD_CHICKENBCAVYB BIRD_DUCKB WATER_BUFFALOBREINDEERB +BIRD_GOOSEBYAKBLLAMABALPACABBIRD_GUINEAFOWLBBIRD_PEAFOWL_BLUEB BIRD_TURKEYBRABBITBCHIMERABCENTAURBGRIFFONBFLYBFLY_MANB GIANT_FLYB ROACH_LARGEB ROACH_MANB GIANT_ROACHBBEETLEB +BEETLE_MANB GIANT_BEETLEBANTBBUTTERFLY_MONARCHBBUTTERFLY_MONARCH_MANBGIANT_BUTTERFLY_MONARCHBFIREFLYB FIREFLY_MANB GIANT_FIREFLYB DRAGONFLYB DRAGONFLY_MANBGIANT_DRAGONFLYB HONEY_BEEB BUMBLEBEEB GOAT_MOUNTAINBGOAT_MOUNTAIN_MANBGIANT_GOAT_MOUNTAINB MARMOT_HOARYBMARMOT_HOARY_MANBGIANT_MARMOT_HOARYBGNOME_MOUNTAINB +GNOME_DARKBWALRUSB +WALRUS_MANB GIANT_WALRUSBFISH_LAMPREY_SEABSHARK_GREAT_WHITEB SHARK_FRILLBSHARK_SPINY_DOGFISHBSHARK_WOBBEGONG_SPOTTEDB SHARK_WHALEB SHARK_BASKINGB SHARK_NURSEBSHARK_MAKO_SHORTFINBSHARK_MAKO_LONGFINB SHARK_TIGERB +SHARK_BULLBSHARK_REEF_BLACKTIPBSHARK_REEF_WHITETIPB +SHARK_BLUEBSHARK_HAMMERHEADB SHARK_ANGELBFISH_SKATE_COMMONBFISH_RAY_MANTAB FISH_STINGRAYBFISH_COELACANTHB FISH_STURGEONBFISH_CONGER_EELB FISH_MILKFISHBFISH_CODB FISH_OPAHBFISH_GROUPER_GIANTB FISH_BLUEFISHBFISH_SUNFISH_OCEANBFISH_SWORDFISHB FISH_MARLINB FISH_HALIBUTBFISH_BARRACUDA_GREATBFISH_TUNA_BLUEFINBNARWHALB NARWHAL MANBNARWHAL, GIANTBHIPPOB HIPPO_MANB GIANT_HIPPOBFISH_GAR_LONGNOSEB FISH_CARPBFISH_TIGERFISHB FISH_PIKEBPLATYPUSB PLATYPUS MANBPLATYPUS, GIANTB BEAR_GRIZZLYBBEAR_GRIZZLY_MANBGIANT_BEAR_GRIZZLYB +BEAR_BLACKBBEAR_BLACK_MANBGIANT_BEAR_BLACKBDEERBDEER_MANB +GIANT_DEERBFOXBFOX_MANB GIANT_FOXBRACCOONB RACCOON_MANB GIANT_RACCOONBMACAQUE_RHESUSBMACAQUE_RHESUS_MANBGIANT_MACAQUE_RHESUSBCOUGARB +COUGAR_MANB GIANT_COUGARBWOLFBWOLF_MANB +GIANT_WOLFB GROUNDHOGB GROUNDHOG_MANBGIANT_GROUNDHOGB ALLIGATORB ALLIGATOR_MANBGIANT_ALLIGATORB BIRD_BUZZARDB BUZZARD_MANB GIANT_BUZZARDBPANDABPANDA, GIGANTICB PANDA MANBCAPYBARABCAPYBARA, GIANTB CAPYBARA MANBBADGERB +BADGER MANB BADGER, GIANTBMOOSEB MOOSE MANB MOOSE, GIANTB RED PANDAB RED PANDA MANBRED PANDA, GIANTBELEPHANTB ELEPHANT_MANBGIANT_ELEPHANTBWARTHOGB WARTHOG_MANB GIANT_WARTHOGBLIONBLION_MANB +GIANT_LIONBLEOPARDB LEOPARD_MANB GIANT_LEOPARDBJAGUARB +JAGUAR_MANB GIANT_JAGUARBTIGERB TIGER_MANB GIANT_TIGERBCHEETAHB CHEETAH_MANB GIANT_CHEETAHBGAZELLEB GAZELLE_MANB GIANT_GAZELLEBMANDRILLB MANDRILL_MANBGIANT_MANDRILLB +CHIMPANZEEBBONOBOBGORILLAB ORANGUTANBGIBBON_SIAMANGBGIBBON_WHITE_HANDEDBGIBBON_BLACK_HANDEDB GIBBON_GRAYBGIBBON_SILVERYBGIBBON_PILEATEDB GIBBON_BILOUBGIBBON_WHITE_BROWEDBGIBBON_BLACK_CRESTEDB CAMEL_1_HUMPBCAMEL_1_HUMP_MANBGIANT_CAMEL_1_HUMPB CAMEL_2_HUMPBCAMEL_2_HUMP_MANBGIANT_CAMEL_2_HUMPBCROCODILE_SALTWATERBCROCODILE_SALTWATER_MANBGIANT_CROCODILE_SALTWATERB BIRD_VULTUREB VULTURE_MANB GIANT_VULTUREB +RHINOCEROSBRHINOCEROS_MANBGIANT_RHINOCEROSBGIRAFFEB GIRAFFE_MANB GIANT_GIRAFFEB HONEY BADGERBHONEY BADGER MANBHONEY BADGER, GIANTBGIANT TORTOISEBGIANT TORTOISE MANBGIGANTIC TORTOISEB ARMADILLOB ARMADILLO MANBARMADILLO, GIANTBMUSKOXB +MUSKOX_MANB GIANT_MUSKOXBELKBELK_MANB GIANT_ELKB +BEAR_POLARBBEAR_POLAR_MANBGIANT_BEAR_POLARB WOLVERINEB WOLVERINE_MANBGIANT_WOLVERINEB +CHINCHILLABCHINCHILLA_MANBGIANT_CHINCHILLAB FLOATING_GUTSBDRUNIANB CREEPING_EYEBVORACIOUS_CAVE_CRAWLERBBLIND_CAVE_OGREB +CAP_HOPPERB +MAGMA_CRABBCRUNDLEB HUNGRY_HEADB +FLESH_BALLBELK_BIRDB HELMET_SNAKEBGREEN_DEVOURERBRUTHERERBCREEPY_CRAWLERBDRALTHABGIANT_EARTHWORMB BLOOD_MANBBUGBATBMANERAB +MOLEMARIANBJABBERERB POND_GRABBERBBLIND_CAVE_BEARB CAVE_DRAGONBREACHERBELEMENTMAN_GABBROBGORLAKB CAVE_FLOATERBPLUMP_HELMET_MANB CAVE_BLOBBELEMENTMAN_AMETHYSTBOCTOPUSB OCTOPUS_MANB GIANT_OCTOPUSBCRABBCRAB_MANB +GIANT_CRABB LEOPARD_SEALBLEOPARD_SEAL_MANBGIANT_LEOPARD_SEALB +CUTTLEFISHBCUTTLEFISH_MANBGIANT_CUTTLEFISHBORCABORCA_MANB +GIANT_ORCABSPONGEB +SPONGE_MANB GIANT_SPONGEBHORSESHOE_CRABBHORSESHOE_CRAB_MANBGIANT_HORSESHOE_CRABB SPERM_WHALEBSPERM_WHALE_MANBGIANT_SPERM_WHALEB ELEPHANT_SEALBELEPHANT_SEAL_MANBGIANT_ELEPHANT_SEALB HARP_SEALB HARP_SEAL_MANBGIANT_HARP_SEALBNAUTILUSB NAUTILUS_MANBGIANT_NAUTILUSB FOXSQUIRRELB MOGHOPPERB RAT_DEMONBWAMBLER_FLUFFYBLIZARD_RHINO_TWO_LEGGEDB WORM_KNUCKLEBSPIDER_PHANTOMB FLY_ACORNB +GNAT_BLOODBLIZARDB +LIZARD_MANB GIANT_LIZARDBSKINKB SKINK_MANB GIANT_SKINKB CHAMELEONB CHAMELEON_MANBGIANT_CHAMELEONBANOLEB ANOLE_MANB GIANT_ANOLEBIGUANAB +IGUANA_MANB GIANT_IGUANAB RIVER OTTERB SEA OTTERB OTTER_MANB GIANT_OTTERBSNAPPING TURTLEBALLIGATOR SNAPPING TURTLEBSNAPPING_TURTLE_MANBGIANT_SNAPPING_TURTLEBBEAVERB +BEAVER_MANB GIANT_BEAVERBLEECHB LEECH_MANB GIANT_LEECHBAXOLOTLB AXOLOTL_MANB GIANT_AXOLOTLBMINKBMINK_MANB +GIANT_MINKB POND_TURTLEBPOND_TURTLE_MANBGIANT_POND_TURTLEBRATBRAT_MANB SQUIRREL_GRAYBSQUIRREL_GRAY_MANBGIANT_SQUIRREL_GRAYB SQUIRREL_REDBSQUIRREL_RED_MANBGIANT_SQUIRREL_REDBCHIPMUNKB CHIPMUNK_MANBGIANT_CHIPMUNKBHAMSTERB HAMSTER_MANB GIANT_HAMSTERBHEDGEHOGB HEDGEHOG_MANBGIANT_HEDGEHOGBSQUIRREL_FLYINGBFLYING_SQUIRREL_MANBGIANT_FLYING_SQUIRRELBMUSSELBOYSTERB FISH_SALMONBFISH_CLOWNFISHB FISH_HAGFISHBFISH_LAMPREY_BROOKB FISH_RAY_BATBFISH_RAY_THORNBACKBFISH_RATFISH_SPOTTEDB FISH_HERRINGB FISH_SHADB FISH_ANCHOVYBFISH_TROUT_STEELHEADB FISH_HAKEB FISH_SEAHORSEB FISH_GLASSEYEBFISH_PUFFER_WHITE_SPOTTEDB FISH_SOLEB FISH_FLOUNDERB FISH_MACKERELBJELLYFISH_SEA_NETTLEBSQUIDB SQUID MANBGIGANTIC SQUIDB FISH_LUNGFISHBFISH_LOACH_CLOWNBFISH_BULLHEAD_BROWNBFISH_BULLHEAD_YELLOWBFISH_BULLHEAD_BLACKBFISH_KNIFEFISH_BANDEDB FISH_CHARBFISH_TROUT_RAINBOWBFISH_MOLLY_SAILFINB +FISH_GUPPYB +FISH_PERCHBDWARFBHUMANBELFBGOBLINBKOBOLDBGREMLINBTROLLBOGREBUNICORNBDRAGONBSATYRBCOLOSSUS_BRONZEBGIANTBCYCLOPSBETTINBMINOTAURBYETIB SASQUATCHB BLIZZARD_MANBWOLF_ICEBFAIRYBPIXIEBBEAK_DOGB GRIMELINGB BLENDEC_FOULB STRANGLERB NIGHTWINGBHARPYBHYDRAB MERPERSONB SEA_SERPENTB SEA_MONSTERBBIRD_ROCBCROCODILE_CAVEBTOAD_GIANT_CAVEB OLM_GIANTB BAT_GIANTB RAT_GIANTB RAT_LARGEBMOLE_DOG_NAKEDB +TROGLODYTEB +MOLE_GIANTBIMP_FIREBSPIDER_CAVE_GIANTB SPIDER_CAVEB FISH_CAVEB CAVE_FISH_MANB LOBSTER_CAVEB +SNAKE_FIREBOLMBOLM_MANBBATBBAT_MANBMAGGOT_PURRINGBELEMENTMAN_FIREBELEMENTMAN_MAGMABELEMENTMAN_IRONBELEMENTMAN_MUDBBIRD_SWALLOW_CAVEBCAVE_SWALLOW_MANBBIRD_SWALLOW_CAVE_GIANTB AMPHIBIAN_MANB REPTILE_MANB SERPENT_MANBANT_MANB +RODENT MANB WILD_BOARB WILD_BOAR_MANBGIANT_WILD_BOARBCOYOTEB +COYOTE_MANB GIANT_COYOTEBKANGAROOB KANGAROO_MANBGIANT_KANGAROOBKOALAB KOALA_MANB GIANT_KOALABADDERB ADDER_MANB GIANT_ADDERBECHIDNAB ECHIDNA_MANB GIANT_ECHIDNAB PORCUPINEB PORCUPINE_MANBGIANT_PORCUPINEB KINGSNAKEB KINGSNAKE_MANBGIANT_KINGSNAKEB GRAY_LANGURBGRAY_LANGUR_MANBGIANT_GRAY_LANGURBBOBCATB +BOBCAT_MANB GIANT_BOBCATBSKUNKB SKUNK_MANB GIANT_SKUNKBGREEN_TREE_FROGBGREEN_TREE_FROG_MANBGIANT_GREEN_TREE_FROGBHAREBHARE_MANB +GIANT_HAREB RATTLESNAKEBRATTLESNAKE_MANBGIANT_RATTLESNAKEBWEASELB +WEASEL_MANB GIANT_WEASELBCOPPERHEAD_SNAKEBCOPPERHEAD_SNAKE_MANBGIANT_COPPERHEAD_SNAKEBIBEXBIBEX_MANB +GIANT_IBEXBWOMBATB +WOMBAT_MANB GIANT_WOMBATBDINGOB DINGO_MANB GIANT_DINGOBCOATIB COATI_MANB GIANT_COATIBOPOSSUMB OPOSSUM_MANB GIANT_OPOSSUMBMONGOOSEB MONGOOSE_MANBGIANT_MONGOOSEBHYENAB HYENA_MANB GIANT_HYENABANACONDAB ANACONDA_MANBGIANT_ANACONDABMONITOR_LIZARDBMONITOR_LIZARD_MANBGIANT_MONITOR_LIZARDB +KING_COBRABKING_COBRA_MANBGIANT_KING_COBRABOCELOTB +OCELOT_MANB GIANT_OCELOTBJACKALB +JACKAL_MANB GIANT_JACKALBCAPUCHINB CAPUCHIN_MANBGIANT_CAPUCHINBSLOTHB SLOTH_MANB GIANT_SLOTHB SPIDER_MONKEYBSPIDER_MONKEY_MANBGIANT_SPIDER_MONKEYBPANGOLINB PANGOLIN_MANBGIANT_PANGOLINB BLACK_MAMBABBLACK_MAMBA_MANBGIANT_BLACK_MAMBAB +BEAR_SLOTHBSLOTH_BEAR_MANBGIANT_SLOTH_BEARBAYE-AYEB AYE-AYE_MANB GIANT_AYE-AYEB +BUSHMASTERBBUSHMASTER_MANBGIANT_BUSHMASTERBPYTHONB +PYTHON_MANB GIANT_PYTHONBTAPIRB TAPIR_MANB GIANT_TAPIRBIMPALAB +IMPALA_MANB GIANT_IMPALABAARDVARKB AARDVARK_MANBGIANT_AARDVARKB LION_TAMARINBLION_TAMARIN_MANBGIANT_LION_TAMARINBSTOATB STOAT_MANB GIANT_STOATBLYNXBLYNX_MANB +GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/skulls.dfstock b/data/stockpiles/skulls.dfstock index e69de29bb..ae52e4537 100644 --- a/data/stockpiles/skulls.dfstock +++ b/data/stockpiles/skulls.dfstock @@ -0,0 +1,157 @@ +*ÆW +WOOD +DOOR + FLOODGATE +BED +CHAIR +CHAIN +FLASK +GOBLET + +INSTRUMENT +TOY +WINDOW +CAGE +BARREL +BUCKET + +ANIMALTRAP +TABLE +COFFIN +STATUE +WEAPON +ARMOR +SHOES +SHIELD +HELM +GLOVES +BOX +BAG +BIN + +ARMORSTAND + +WEAPONRACK +CABINET +FIGURINE +AMULET +SCEPTER +AMMO +CROWN +RING +EARRING +BRACELET +GEM +ANVIL +REMAINS +MEAT +FISH +FISH_RAW +VERMIN +PET +SEEDS +PLANT + SKIN_TANNED + PLANT_GROWTH +THREAD +CLOTH +TOTEM +PANTS +BACKPACK +QUIVER + CATAPULTPARTS + BALLISTAPARTS + SIEGEAMMO +BALLISTAARROWHEAD + TRAPPARTS +TRAPCOMP +DRINK + POWDER_MISC +CHEESE +FOOD + LIQUID_MISC +COIN +GLOB + PIPE_SECTION + HATCH_COVER +GRATE +QUERN + MILLSTONE +SPLINT +CRUTCH +TRACTION_BENCH +TOOL +SLAB +EGG +BOOK +SHEET +BRANCH*TOAD*TOAD_MAN* +GIANT_TOAD*WORM*WORM_MAN* BIRD_BLUEJAY* BLUEJAY_MAN* GIANT_BLUEJAY* BIRD_CARDINAL* CARDINAL_MAN*GIANT_CARDINAL* BIRD_GRACKLE* GRACKLE_MAN* GIANT_GRACKLE* BIRD_ORIOLE* +ORIOLE_MAN* GIANT_ORIOLE*BIRD_RW_BLACKBIRD*RW_BLACKBIRD_MAN*GIANT_RW_BLACKBIRD* BIRD_PENGUIN*BIRD_PENGUIN_LITTLE*BIRD_PENGUIN_EMPEROR* PENGUIN MAN*BIRD_PENGUIN_GIANT*BIRD_FALCON_PEREGRINE*PEREGRINE FALCON MAN*GIANT PEREGRINE FALCON* BIRD_KIWI*KIWI MAN*BIRD_KIWI_GIANT* BIRD_OSTRICH* OSTRICH MAN*BIRD_OSTRICH_GIANT* BIRD_CROW*CROW_MAN* +GIANT_CROW* +BIRD_RAVEN* RAVEN_MAN* GIANT_RAVEN*BIRD_CASSOWARY* CASSOWARY_MAN*GIANT_CASSOWARY*BIRD_KEA*KEA_MAN* GIANT_KEA*BIRD_OWL_SNOWY* SNOWY_OWL_MAN*GIANT_SNOWY_OWL*SPARROW* SPARROW_MAN* GIANT_SPARROW*BIRD_STORK_WHITE*WHITE_STORK_MAN*GIANT_WHITE_STORK* BIRD_LOON*LOON_MAN* +GIANT_LOON* BIRD_OWL_BARN* BARN_OWL_MAN*GIANT_BARN_OWL* BIRD_PARAKEET* PARAKEET_MAN*GIANT_PARAKEET* BIRD_KAKAPO* +KAKAPO_MAN* GIANT_KAKAPO*BIRD_PARROT_GREY*GREY_PARROT_MAN*GIANT_GREY_PARROT* BIRD_PUFFIN* +PUFFIN_MAN* GIANT_PUFFIN* BIRD_SWAN*SWAN_MAN* +GIANT_SWAN* BIRD_LORIKEET* LORIKEET_MAN*GIANT_LORIKEET* BIRD_WREN*WREN_MAN* +GIANT_WREN* BIRD_OSPREY* +OSPREY_MAN* GIANT_OSPREY*BIRD_EMU*EMU_MAN* GIANT_EMU*BIRD_COCKATIEL* COCKATIEL_MAN*GIANT_COCKATIEL*BIRD_LOVEBIRD_PEACH-FACED*PEACH-FACED_LOVEBIRD_MAN*GIANT_PEACH-FACED_LOVEBIRD* BIRD_MAGPIE* +MAGPIE_MAN* GIANT_MAGPIE* BIRD_KESTREL* KESTREL_MAN* GIANT_KESTREL*BIRD_ALBATROSS* ALBATROSS_MAN*GIANT_ALBATROSS*BIRD_OWL_GREAT_HORNED*GREAT_HORNED_OWL_MAN*GIANT_GREAT_HORNED_OWL* +BIRD_EAGLE* EAGLE_MAN* GIANT_EAGLE* BIRD_HORNBILL* HORNBILL_MAN*GIANT_HORNBILL*BIRD_LOVEBIRD_MASKED*MASKED_LOVEBIRD_MAN*GIANT_MASKED_LOVEBIRD* BIRD_BUSHTIT* BUSHTIT_MAN* GIANT_BUSHTIT* DAMSELFLY* DAMSELFLY_MAN*GIANT_DAMSELFLY*MOTH*MOTH_MAN* +GIANT_MOTH* GRASSHOPPER*GRASSHOPPER_MAN*GIANT_GRASSHOPPER* BARK_SCORPION*BARK_SCORPION_MAN*GIANT_BARK_SCORPION*MANTIS* +MANTIS_MAN* GIANT_MANTIS*TICK*TICK_MAN* +GIANT_TICK*LOUSE* LOUSE_MAN* GIANT_LOUSE*THRIPS* +THRIPS_MAN* GIANT_THRIPS*SLUG*SLUG_MAN* +GIANT_SLUG*MOSQUITO* MOSQUITO_MAN*GIANT_MOSQUITO*SPIDER_JUMPING*JUMPING_SPIDER_MAN*GIANT_JUMPING_SPIDER*TERMITE* +MOON_SNAIL*MOON_SNAIL_MAN*GIANT_MOON_SNAIL*SPIDER_BROWN_RECLUSE*BROWN_RECLUSE_SPIDER_MAN*GIANT_BROWN_RECLUSE_SPIDER*SNAIL* SNAIL_MAN* GIANT_SNAIL* GECKO_LEOPARD*LEOPARD_GECKO_MAN*GIANT_LEOPARD_GECKO*DESERT TORTOISE*DESERT_TORTOISE_MAN*GIANT_DESERT_TORTOISE* GILA_MONSTER*GILA_MONSTER_MAN*GIANT_GILA_MONSTER*DOG*CAT*MULE*DONKEY*HORSE*COW*SHEEP*PIG*GOAT* BIRD_CHICKEN*CAVY* BIRD_DUCK* WATER_BUFFALO*REINDEER* +BIRD_GOOSE*YAK*LLAMA*ALPACA*BIRD_GUINEAFOWL*BIRD_PEAFOWL_BLUE* BIRD_TURKEY*RABBIT*CHIMERA*CENTAUR*GRIFFON*FLY*FLY_MAN* GIANT_FLY* ROACH_LARGE* ROACH_MAN* GIANT_ROACH*BEETLE* +BEETLE_MAN* GIANT_BEETLE*ANT*BUTTERFLY_MONARCH*BUTTERFLY_MONARCH_MAN*GIANT_BUTTERFLY_MONARCH*FIREFLY* FIREFLY_MAN* GIANT_FIREFLY* DRAGONFLY* DRAGONFLY_MAN*GIANT_DRAGONFLY* HONEY_BEE* BUMBLEBEE* GOAT_MOUNTAIN*GOAT_MOUNTAIN_MAN*GIANT_GOAT_MOUNTAIN* MARMOT_HOARY*MARMOT_HOARY_MAN*GIANT_MARMOT_HOARY*GNOME_MOUNTAIN* +GNOME_DARK*WALRUS* +WALRUS_MAN* GIANT_WALRUS*FISH_LAMPREY_SEA*SHARK_GREAT_WHITE* SHARK_FRILL*SHARK_SPINY_DOGFISH*SHARK_WOBBEGONG_SPOTTED* SHARK_WHALE* SHARK_BASKING* SHARK_NURSE*SHARK_MAKO_SHORTFIN*SHARK_MAKO_LONGFIN* SHARK_TIGER* +SHARK_BULL*SHARK_REEF_BLACKTIP*SHARK_REEF_WHITETIP* +SHARK_BLUE*SHARK_HAMMERHEAD* SHARK_ANGEL*FISH_SKATE_COMMON*FISH_RAY_MANTA* FISH_STINGRAY*FISH_COELACANTH* FISH_STURGEON*FISH_CONGER_EEL* FISH_MILKFISH*FISH_COD* FISH_OPAH*FISH_GROUPER_GIANT* FISH_BLUEFISH*FISH_SUNFISH_OCEAN*FISH_SWORDFISH* FISH_MARLIN* FISH_HALIBUT*FISH_BARRACUDA_GREAT*FISH_TUNA_BLUEFIN*NARWHAL* NARWHAL MAN*NARWHAL, GIANT*HIPPO* HIPPO_MAN* GIANT_HIPPO*FISH_GAR_LONGNOSE* FISH_CARP*FISH_TIGERFISH* FISH_PIKE*PLATYPUS* PLATYPUS MAN*PLATYPUS, GIANT* BEAR_GRIZZLY*BEAR_GRIZZLY_MAN*GIANT_BEAR_GRIZZLY* +BEAR_BLACK*BEAR_BLACK_MAN*GIANT_BEAR_BLACK*DEER*DEER_MAN* +GIANT_DEER*FOX*FOX_MAN* GIANT_FOX*RACCOON* RACCOON_MAN* GIANT_RACCOON*MACAQUE_RHESUS*MACAQUE_RHESUS_MAN*GIANT_MACAQUE_RHESUS*COUGAR* +COUGAR_MAN* GIANT_COUGAR*WOLF*WOLF_MAN* +GIANT_WOLF* GROUNDHOG* GROUNDHOG_MAN*GIANT_GROUNDHOG* ALLIGATOR* ALLIGATOR_MAN*GIANT_ALLIGATOR* BIRD_BUZZARD* BUZZARD_MAN* GIANT_BUZZARD*PANDA*PANDA, GIGANTIC* PANDA MAN*CAPYBARA*CAPYBARA, GIANT* CAPYBARA MAN*BADGER* +BADGER MAN* BADGER, GIANT*MOOSE* MOOSE MAN* MOOSE, GIANT* RED PANDA* RED PANDA MAN*RED PANDA, GIANT*ELEPHANT* ELEPHANT_MAN*GIANT_ELEPHANT*WARTHOG* WARTHOG_MAN* GIANT_WARTHOG*LION*LION_MAN* +GIANT_LION*LEOPARD* LEOPARD_MAN* GIANT_LEOPARD*JAGUAR* +JAGUAR_MAN* GIANT_JAGUAR*TIGER* TIGER_MAN* GIANT_TIGER*CHEETAH* CHEETAH_MAN* GIANT_CHEETAH*GAZELLE* GAZELLE_MAN* GIANT_GAZELLE*MANDRILL* MANDRILL_MAN*GIANT_MANDRILL* +CHIMPANZEE*BONOBO*GORILLA* ORANGUTAN*GIBBON_SIAMANG*GIBBON_WHITE_HANDED*GIBBON_BLACK_HANDED* GIBBON_GRAY*GIBBON_SILVERY*GIBBON_PILEATED* GIBBON_BILOU*GIBBON_WHITE_BROWED*GIBBON_BLACK_CRESTED* CAMEL_1_HUMP*CAMEL_1_HUMP_MAN*GIANT_CAMEL_1_HUMP* CAMEL_2_HUMP*CAMEL_2_HUMP_MAN*GIANT_CAMEL_2_HUMP*CROCODILE_SALTWATER*CROCODILE_SALTWATER_MAN*GIANT_CROCODILE_SALTWATER* BIRD_VULTURE* VULTURE_MAN* GIANT_VULTURE* +RHINOCEROS*RHINOCEROS_MAN*GIANT_RHINOCEROS*GIRAFFE* GIRAFFE_MAN* GIANT_GIRAFFE* HONEY BADGER*HONEY BADGER MAN*HONEY BADGER, GIANT*GIANT TORTOISE*GIANT TORTOISE MAN*GIGANTIC TORTOISE* ARMADILLO* ARMADILLO MAN*ARMADILLO, GIANT*MUSKOX* +MUSKOX_MAN* GIANT_MUSKOX*ELK*ELK_MAN* GIANT_ELK* +BEAR_POLAR*BEAR_POLAR_MAN*GIANT_BEAR_POLAR* WOLVERINE* WOLVERINE_MAN*GIANT_WOLVERINE* +CHINCHILLA*CHINCHILLA_MAN*GIANT_CHINCHILLA* FLOATING_GUTS*DRUNIAN* CREEPING_EYE*VORACIOUS_CAVE_CRAWLER*BLIND_CAVE_OGRE* +CAP_HOPPER* +MAGMA_CRAB*CRUNDLE* HUNGRY_HEAD* +FLESH_BALL*ELK_BIRD* HELMET_SNAKE*GREEN_DEVOURER*RUTHERER*CREEPY_CRAWLER*DRALTHA*GIANT_EARTHWORM* BLOOD_MAN*BUGBAT*MANERA* +MOLEMARIAN*JABBERER* POND_GRABBER*BLIND_CAVE_BEAR* CAVE_DRAGON*REACHER*ELEMENTMAN_GABBRO*GORLAK* CAVE_FLOATER*PLUMP_HELMET_MAN* CAVE_BLOB*ELEMENTMAN_AMETHYST*OCTOPUS* OCTOPUS_MAN* GIANT_OCTOPUS*CRAB*CRAB_MAN* +GIANT_CRAB* LEOPARD_SEAL*LEOPARD_SEAL_MAN*GIANT_LEOPARD_SEAL* +CUTTLEFISH*CUTTLEFISH_MAN*GIANT_CUTTLEFISH*ORCA*ORCA_MAN* +GIANT_ORCA*SPONGE* +SPONGE_MAN* GIANT_SPONGE*HORSESHOE_CRAB*HORSESHOE_CRAB_MAN*GIANT_HORSESHOE_CRAB* SPERM_WHALE*SPERM_WHALE_MAN*GIANT_SPERM_WHALE* ELEPHANT_SEAL*ELEPHANT_SEAL_MAN*GIANT_ELEPHANT_SEAL* HARP_SEAL* HARP_SEAL_MAN*GIANT_HARP_SEAL*NAUTILUS* NAUTILUS_MAN*GIANT_NAUTILUS* FOXSQUIRREL* MOGHOPPER* RAT_DEMON*WAMBLER_FLUFFY*LIZARD_RHINO_TWO_LEGGED* WORM_KNUCKLE*SPIDER_PHANTOM* FLY_ACORN* +GNAT_BLOOD*LIZARD* +LIZARD_MAN* GIANT_LIZARD*SKINK* SKINK_MAN* GIANT_SKINK* CHAMELEON* CHAMELEON_MAN*GIANT_CHAMELEON*ANOLE* ANOLE_MAN* GIANT_ANOLE*IGUANA* +IGUANA_MAN* GIANT_IGUANA* RIVER OTTER* SEA OTTER* OTTER_MAN* GIANT_OTTER*SNAPPING TURTLE*ALLIGATOR SNAPPING TURTLE*SNAPPING_TURTLE_MAN*GIANT_SNAPPING_TURTLE*BEAVER* +BEAVER_MAN* GIANT_BEAVER*LEECH* LEECH_MAN* GIANT_LEECH*AXOLOTL* AXOLOTL_MAN* GIANT_AXOLOTL*MINK*MINK_MAN* +GIANT_MINK* POND_TURTLE*POND_TURTLE_MAN*GIANT_POND_TURTLE*RAT*RAT_MAN* SQUIRREL_GRAY*SQUIRREL_GRAY_MAN*GIANT_SQUIRREL_GRAY* SQUIRREL_RED*SQUIRREL_RED_MAN*GIANT_SQUIRREL_RED*CHIPMUNK* CHIPMUNK_MAN*GIANT_CHIPMUNK*HAMSTER* HAMSTER_MAN* GIANT_HAMSTER*HEDGEHOG* HEDGEHOG_MAN*GIANT_HEDGEHOG*SQUIRREL_FLYING*FLYING_SQUIRREL_MAN*GIANT_FLYING_SQUIRREL*MUSSEL*OYSTER* FISH_SALMON*FISH_CLOWNFISH* FISH_HAGFISH*FISH_LAMPREY_BROOK* FISH_RAY_BAT*FISH_RAY_THORNBACK*FISH_RATFISH_SPOTTED* FISH_HERRING* FISH_SHAD* FISH_ANCHOVY*FISH_TROUT_STEELHEAD* FISH_HAKE* FISH_SEAHORSE* FISH_GLASSEYE*FISH_PUFFER_WHITE_SPOTTED* FISH_SOLE* FISH_FLOUNDER* FISH_MACKEREL*JELLYFISH_SEA_NETTLE*SQUID* SQUID MAN*GIGANTIC SQUID* FISH_LUNGFISH*FISH_LOACH_CLOWN*FISH_BULLHEAD_BROWN*FISH_BULLHEAD_YELLOW*FISH_BULLHEAD_BLACK*FISH_KNIFEFISH_BANDED* FISH_CHAR*FISH_TROUT_RAINBOW*FISH_MOLLY_SAILFIN* +FISH_GUPPY* +FISH_PERCH*DWARF*HUMAN*ELF*GOBLIN*KOBOLD*GREMLIN*TROLL*OGRE*UNICORN*DRAGON*SATYR*COLOSSUS_BRONZE*GIANT*CYCLOPS*ETTIN*MINOTAUR*YETI* SASQUATCH* BLIZZARD_MAN*WOLF_ICE*FAIRY*PIXIE*BEAK_DOG* GRIMELING* BLENDEC_FOUL* STRANGLER* NIGHTWING*HARPY*HYDRA* MERPERSON* SEA_SERPENT* SEA_MONSTER*BIRD_ROC*CROCODILE_CAVE*TOAD_GIANT_CAVE* OLM_GIANT* BAT_GIANT* RAT_GIANT* RAT_LARGE*MOLE_DOG_NAKED* +TROGLODYTE* +MOLE_GIANT*IMP_FIRE*SPIDER_CAVE_GIANT* SPIDER_CAVE* FISH_CAVE* CAVE_FISH_MAN* LOBSTER_CAVE* +SNAKE_FIRE*OLM*OLM_MAN*BAT*BAT_MAN*MAGGOT_PURRING*ELEMENTMAN_FIRE*ELEMENTMAN_MAGMA*ELEMENTMAN_IRON*ELEMENTMAN_MUD*BIRD_SWALLOW_CAVE*CAVE_SWALLOW_MAN*BIRD_SWALLOW_CAVE_GIANT* AMPHIBIAN_MAN* REPTILE_MAN* SERPENT_MAN*ANT_MAN* +RODENT MAN* WILD_BOAR* WILD_BOAR_MAN*GIANT_WILD_BOAR*COYOTE* +COYOTE_MAN* GIANT_COYOTE*KANGAROO* KANGAROO_MAN*GIANT_KANGAROO*KOALA* KOALA_MAN* GIANT_KOALA*ADDER* ADDER_MAN* GIANT_ADDER*ECHIDNA* ECHIDNA_MAN* GIANT_ECHIDNA* PORCUPINE* PORCUPINE_MAN*GIANT_PORCUPINE* KINGSNAKE* KINGSNAKE_MAN*GIANT_KINGSNAKE* GRAY_LANGUR*GRAY_LANGUR_MAN*GIANT_GRAY_LANGUR*BOBCAT* +BOBCAT_MAN* GIANT_BOBCAT*SKUNK* SKUNK_MAN* GIANT_SKUNK*GREEN_TREE_FROG*GREEN_TREE_FROG_MAN*GIANT_GREEN_TREE_FROG*HARE*HARE_MAN* +GIANT_HARE* RATTLESNAKE*RATTLESNAKE_MAN*GIANT_RATTLESNAKE*WEASEL* +WEASEL_MAN* GIANT_WEASEL*COPPERHEAD_SNAKE*COPPERHEAD_SNAKE_MAN*GIANT_COPPERHEAD_SNAKE*IBEX*IBEX_MAN* +GIANT_IBEX*WOMBAT* +WOMBAT_MAN* GIANT_WOMBAT*DINGO* DINGO_MAN* GIANT_DINGO*COATI* COATI_MAN* GIANT_COATI*OPOSSUM* OPOSSUM_MAN* GIANT_OPOSSUM*MONGOOSE* MONGOOSE_MAN*GIANT_MONGOOSE*HYENA* HYENA_MAN* GIANT_HYENA*ANACONDA* ANACONDA_MAN*GIANT_ANACONDA*MONITOR_LIZARD*MONITOR_LIZARD_MAN*GIANT_MONITOR_LIZARD* +KING_COBRA*KING_COBRA_MAN*GIANT_KING_COBRA*OCELOT* +OCELOT_MAN* GIANT_OCELOT*JACKAL* +JACKAL_MAN* GIANT_JACKAL*CAPUCHIN* CAPUCHIN_MAN*GIANT_CAPUCHIN*SLOTH* SLOTH_MAN* GIANT_SLOTH* SPIDER_MONKEY*SPIDER_MONKEY_MAN*GIANT_SPIDER_MONKEY*PANGOLIN* PANGOLIN_MAN*GIANT_PANGOLIN* BLACK_MAMBA*BLACK_MAMBA_MAN*GIANT_BLACK_MAMBA* +BEAR_SLOTH*SLOTH_BEAR_MAN*GIANT_SLOTH_BEAR*AYE-AYE* AYE-AYE_MAN* GIANT_AYE-AYE* +BUSHMASTER*BUSHMASTER_MAN*GIANT_BUSHMASTER*PYTHON* +PYTHON_MAN* GIANT_PYTHON*TAPIR* TAPIR_MAN* GIANT_TAPIR*IMPALA* +IMPALA_MAN* GIANT_IMPALA*AARDVARK* AARDVARK_MAN*GIANT_AARDVARK* LION_TAMARIN*LION_TAMARIN_MAN*GIANT_LION_TAMARIN*STOAT* STOAT_MAN* GIANT_STOAT*LYNX*LYNX_MAN* +GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/tannedhides.dfstock b/data/stockpiles/tannedhides.dfstock index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..226bd0ec29b204e8be8e885e87ec364115542e1b 100644 GIT binary patch literal 741 zcmXw1JF?p_43x%_Y{Pk(Nsf_QKolf#OcHz~_4HEdN-0yOOqnueE|5EAX-^uGAbz`8 zeEHi`x2sOnO{$5mvxBj45ju@BQEyhZ>3Id}XUF+Y!=j^;LS#cOY4Z{aor->?VYgw@ zojSvd&@ggJ;&5-~Uc)(9&#okn)E7nx8jQ}f4K(D!WrMv7M@1t}9%%Z!s$_UqD-IA> zaUR{BzTx*Y>N^fzaG(S|Qcx#MM9(sb&7IDM;YRz*Y?m$JNdx<>;y-62u}Gqhy;qP- zx(DhIv(Q-pzCJD^%18}AE#iSJyje%*B%VQ^Ixk$Pn{8fehrAw%cN*R#d4M`au( z%G5{47}PD_Z8!ikV7wn5f5(ExWu>94Nw^N(Da^iTsU0KIGH`%Rtc-@&&7wZN7%m() zS0X0_yo~Ie#Q>h>HCtKaLG06i4=Cxr))v>Q!ZYwvpGG}InZWo?x2XFh>F_oiD71=X z0mHf^H)qj&db&EJpx8l<5kzd1Ba0~(^4(T0W<3maf{071>(sw)k^)`5buJgJGUVti zCNh|`A)Gz}$Rqz4CBW{As-rGD9_b{@Lfxo(uS+4A>Hu93_4zv5G#%L55S#brTibqb T+aGQ7vu%F0&F{AP(>DJA0E(=L literal 0 HcmV?d00001 diff --git a/data/stockpiles/teeth.dfstock b/data/stockpiles/teeth.dfstock index e69de29bb..06875f8b5 100644 --- a/data/stockpiles/teeth.dfstock +++ b/data/stockpiles/teeth.dfstock @@ -0,0 +1,157 @@ +*ÆW +WOOD +DOOR + FLOODGATE +BED +CHAIR +CHAIN +FLASK +GOBLET + +INSTRUMENT +TOY +WINDOW +CAGE +BARREL +BUCKET + +ANIMALTRAP +TABLE +COFFIN +STATUE +WEAPON +ARMOR +SHOES +SHIELD +HELM +GLOVES +BOX +BAG +BIN + +ARMORSTAND + +WEAPONRACK +CABINET +FIGURINE +AMULET +SCEPTER +AMMO +CROWN +RING +EARRING +BRACELET +GEM +ANVIL +REMAINS +MEAT +FISH +FISH_RAW +VERMIN +PET +SEEDS +PLANT + SKIN_TANNED + PLANT_GROWTH +THREAD +CLOTH +TOTEM +PANTS +BACKPACK +QUIVER + CATAPULTPARTS + BALLISTAPARTS + SIEGEAMMO +BALLISTAARROWHEAD + TRAPPARTS +TRAPCOMP +DRINK + POWDER_MISC +CHEESE +FOOD + LIQUID_MISC +COIN +GLOB + PIPE_SECTION + HATCH_COVER +GRATE +QUERN + MILLSTONE +SPLINT +CRUTCH +TRACTION_BENCH +TOOL +SLAB +EGG +BOOK +SHEET +BRANCHJTOADJTOAD_MANJ +GIANT_TOADJWORMJWORM_MANJ BIRD_BLUEJAYJ BLUEJAY_MANJ GIANT_BLUEJAYJ BIRD_CARDINALJ CARDINAL_MANJGIANT_CARDINALJ BIRD_GRACKLEJ GRACKLE_MANJ GIANT_GRACKLEJ BIRD_ORIOLEJ +ORIOLE_MANJ GIANT_ORIOLEJBIRD_RW_BLACKBIRDJRW_BLACKBIRD_MANJGIANT_RW_BLACKBIRDJ BIRD_PENGUINJBIRD_PENGUIN_LITTLEJBIRD_PENGUIN_EMPERORJ PENGUIN MANJBIRD_PENGUIN_GIANTJBIRD_FALCON_PEREGRINEJPEREGRINE FALCON MANJGIANT PEREGRINE FALCONJ BIRD_KIWIJKIWI MANJBIRD_KIWI_GIANTJ BIRD_OSTRICHJ OSTRICH MANJBIRD_OSTRICH_GIANTJ BIRD_CROWJCROW_MANJ +GIANT_CROWJ +BIRD_RAVENJ RAVEN_MANJ GIANT_RAVENJBIRD_CASSOWARYJ CASSOWARY_MANJGIANT_CASSOWARYJBIRD_KEAJKEA_MANJ GIANT_KEAJBIRD_OWL_SNOWYJ SNOWY_OWL_MANJGIANT_SNOWY_OWLJSPARROWJ SPARROW_MANJ GIANT_SPARROWJBIRD_STORK_WHITEJWHITE_STORK_MANJGIANT_WHITE_STORKJ BIRD_LOONJLOON_MANJ +GIANT_LOONJ BIRD_OWL_BARNJ BARN_OWL_MANJGIANT_BARN_OWLJ BIRD_PARAKEETJ PARAKEET_MANJGIANT_PARAKEETJ BIRD_KAKAPOJ +KAKAPO_MANJ GIANT_KAKAPOJBIRD_PARROT_GREYJGREY_PARROT_MANJGIANT_GREY_PARROTJ BIRD_PUFFINJ +PUFFIN_MANJ GIANT_PUFFINJ BIRD_SWANJSWAN_MANJ +GIANT_SWANJ BIRD_LORIKEETJ LORIKEET_MANJGIANT_LORIKEETJ BIRD_WRENJWREN_MANJ +GIANT_WRENJ BIRD_OSPREYJ +OSPREY_MANJ GIANT_OSPREYJBIRD_EMUJEMU_MANJ GIANT_EMUJBIRD_COCKATIELJ COCKATIEL_MANJGIANT_COCKATIELJBIRD_LOVEBIRD_PEACH-FACEDJPEACH-FACED_LOVEBIRD_MANJGIANT_PEACH-FACED_LOVEBIRDJ BIRD_MAGPIEJ +MAGPIE_MANJ GIANT_MAGPIEJ BIRD_KESTRELJ KESTREL_MANJ GIANT_KESTRELJBIRD_ALBATROSSJ ALBATROSS_MANJGIANT_ALBATROSSJBIRD_OWL_GREAT_HORNEDJGREAT_HORNED_OWL_MANJGIANT_GREAT_HORNED_OWLJ +BIRD_EAGLEJ EAGLE_MANJ GIANT_EAGLEJ BIRD_HORNBILLJ HORNBILL_MANJGIANT_HORNBILLJBIRD_LOVEBIRD_MASKEDJMASKED_LOVEBIRD_MANJGIANT_MASKED_LOVEBIRDJ BIRD_BUSHTITJ BUSHTIT_MANJ GIANT_BUSHTITJ DAMSELFLYJ DAMSELFLY_MANJGIANT_DAMSELFLYJMOTHJMOTH_MANJ +GIANT_MOTHJ GRASSHOPPERJGRASSHOPPER_MANJGIANT_GRASSHOPPERJ BARK_SCORPIONJBARK_SCORPION_MANJGIANT_BARK_SCORPIONJMANTISJ +MANTIS_MANJ GIANT_MANTISJTICKJTICK_MANJ +GIANT_TICKJLOUSEJ LOUSE_MANJ GIANT_LOUSEJTHRIPSJ +THRIPS_MANJ GIANT_THRIPSJSLUGJSLUG_MANJ +GIANT_SLUGJMOSQUITOJ MOSQUITO_MANJGIANT_MOSQUITOJSPIDER_JUMPINGJJUMPING_SPIDER_MANJGIANT_JUMPING_SPIDERJTERMITEJ +MOON_SNAILJMOON_SNAIL_MANJGIANT_MOON_SNAILJSPIDER_BROWN_RECLUSEJBROWN_RECLUSE_SPIDER_MANJGIANT_BROWN_RECLUSE_SPIDERJSNAILJ SNAIL_MANJ GIANT_SNAILJ GECKO_LEOPARDJLEOPARD_GECKO_MANJGIANT_LEOPARD_GECKOJDESERT TORTOISEJDESERT_TORTOISE_MANJGIANT_DESERT_TORTOISEJ GILA_MONSTERJGILA_MONSTER_MANJGIANT_GILA_MONSTERJDOGJCATJMULEJDONKEYJHORSEJCOWJSHEEPJPIGJGOATJ BIRD_CHICKENJCAVYJ BIRD_DUCKJ WATER_BUFFALOJREINDEERJ +BIRD_GOOSEJYAKJLLAMAJALPACAJBIRD_GUINEAFOWLJBIRD_PEAFOWL_BLUEJ BIRD_TURKEYJRABBITJCHIMERAJCENTAURJGRIFFONJFLYJFLY_MANJ GIANT_FLYJ ROACH_LARGEJ ROACH_MANJ GIANT_ROACHJBEETLEJ +BEETLE_MANJ GIANT_BEETLEJANTJBUTTERFLY_MONARCHJBUTTERFLY_MONARCH_MANJGIANT_BUTTERFLY_MONARCHJFIREFLYJ FIREFLY_MANJ GIANT_FIREFLYJ DRAGONFLYJ DRAGONFLY_MANJGIANT_DRAGONFLYJ HONEY_BEEJ BUMBLEBEEJ GOAT_MOUNTAINJGOAT_MOUNTAIN_MANJGIANT_GOAT_MOUNTAINJ MARMOT_HOARYJMARMOT_HOARY_MANJGIANT_MARMOT_HOARYJGNOME_MOUNTAINJ +GNOME_DARKJWALRUSJ +WALRUS_MANJ GIANT_WALRUSJFISH_LAMPREY_SEAJSHARK_GREAT_WHITEJ SHARK_FRILLJSHARK_SPINY_DOGFISHJSHARK_WOBBEGONG_SPOTTEDJ SHARK_WHALEJ SHARK_BASKINGJ SHARK_NURSEJSHARK_MAKO_SHORTFINJSHARK_MAKO_LONGFINJ SHARK_TIGERJ +SHARK_BULLJSHARK_REEF_BLACKTIPJSHARK_REEF_WHITETIPJ +SHARK_BLUEJSHARK_HAMMERHEADJ SHARK_ANGELJFISH_SKATE_COMMONJFISH_RAY_MANTAJ FISH_STINGRAYJFISH_COELACANTHJ FISH_STURGEONJFISH_CONGER_EELJ FISH_MILKFISHJFISH_CODJ FISH_OPAHJFISH_GROUPER_GIANTJ FISH_BLUEFISHJFISH_SUNFISH_OCEANJFISH_SWORDFISHJ FISH_MARLINJ FISH_HALIBUTJFISH_BARRACUDA_GREATJFISH_TUNA_BLUEFINJNARWHALJ NARWHAL MANJNARWHAL, GIANTJHIPPOJ HIPPO_MANJ GIANT_HIPPOJFISH_GAR_LONGNOSEJ FISH_CARPJFISH_TIGERFISHJ FISH_PIKEJPLATYPUSJ PLATYPUS MANJPLATYPUS, GIANTJ BEAR_GRIZZLYJBEAR_GRIZZLY_MANJGIANT_BEAR_GRIZZLYJ +BEAR_BLACKJBEAR_BLACK_MANJGIANT_BEAR_BLACKJDEERJDEER_MANJ +GIANT_DEERJFOXJFOX_MANJ GIANT_FOXJRACCOONJ RACCOON_MANJ GIANT_RACCOONJMACAQUE_RHESUSJMACAQUE_RHESUS_MANJGIANT_MACAQUE_RHESUSJCOUGARJ +COUGAR_MANJ GIANT_COUGARJWOLFJWOLF_MANJ +GIANT_WOLFJ GROUNDHOGJ GROUNDHOG_MANJGIANT_GROUNDHOGJ ALLIGATORJ ALLIGATOR_MANJGIANT_ALLIGATORJ BIRD_BUZZARDJ BUZZARD_MANJ GIANT_BUZZARDJPANDAJPANDA, GIGANTICJ PANDA MANJCAPYBARAJCAPYBARA, GIANTJ CAPYBARA MANJBADGERJ +BADGER MANJ BADGER, GIANTJMOOSEJ MOOSE MANJ MOOSE, GIANTJ RED PANDAJ RED PANDA MANJRED PANDA, GIANTJELEPHANTJ ELEPHANT_MANJGIANT_ELEPHANTJWARTHOGJ WARTHOG_MANJ GIANT_WARTHOGJLIONJLION_MANJ +GIANT_LIONJLEOPARDJ LEOPARD_MANJ GIANT_LEOPARDJJAGUARJ +JAGUAR_MANJ GIANT_JAGUARJTIGERJ TIGER_MANJ GIANT_TIGERJCHEETAHJ CHEETAH_MANJ GIANT_CHEETAHJGAZELLEJ GAZELLE_MANJ GIANT_GAZELLEJMANDRILLJ MANDRILL_MANJGIANT_MANDRILLJ +CHIMPANZEEJBONOBOJGORILLAJ ORANGUTANJGIBBON_SIAMANGJGIBBON_WHITE_HANDEDJGIBBON_BLACK_HANDEDJ GIBBON_GRAYJGIBBON_SILVERYJGIBBON_PILEATEDJ GIBBON_BILOUJGIBBON_WHITE_BROWEDJGIBBON_BLACK_CRESTEDJ CAMEL_1_HUMPJCAMEL_1_HUMP_MANJGIANT_CAMEL_1_HUMPJ CAMEL_2_HUMPJCAMEL_2_HUMP_MANJGIANT_CAMEL_2_HUMPJCROCODILE_SALTWATERJCROCODILE_SALTWATER_MANJGIANT_CROCODILE_SALTWATERJ BIRD_VULTUREJ VULTURE_MANJ GIANT_VULTUREJ +RHINOCEROSJRHINOCEROS_MANJGIANT_RHINOCEROSJGIRAFFEJ GIRAFFE_MANJ GIANT_GIRAFFEJ HONEY BADGERJHONEY BADGER MANJHONEY BADGER, GIANTJGIANT TORTOISEJGIANT TORTOISE MANJGIGANTIC TORTOISEJ ARMADILLOJ ARMADILLO MANJARMADILLO, GIANTJMUSKOXJ +MUSKOX_MANJ GIANT_MUSKOXJELKJELK_MANJ GIANT_ELKJ +BEAR_POLARJBEAR_POLAR_MANJGIANT_BEAR_POLARJ WOLVERINEJ WOLVERINE_MANJGIANT_WOLVERINEJ +CHINCHILLAJCHINCHILLA_MANJGIANT_CHINCHILLAJ FLOATING_GUTSJDRUNIANJ CREEPING_EYEJVORACIOUS_CAVE_CRAWLERJBLIND_CAVE_OGREJ +CAP_HOPPERJ +MAGMA_CRABJCRUNDLEJ HUNGRY_HEADJ +FLESH_BALLJELK_BIRDJ HELMET_SNAKEJGREEN_DEVOURERJRUTHERERJCREEPY_CRAWLERJDRALTHAJGIANT_EARTHWORMJ BLOOD_MANJBUGBATJMANERAJ +MOLEMARIANJJABBERERJ POND_GRABBERJBLIND_CAVE_BEARJ CAVE_DRAGONJREACHERJELEMENTMAN_GABBROJGORLAKJ CAVE_FLOATERJPLUMP_HELMET_MANJ CAVE_BLOBJELEMENTMAN_AMETHYSTJOCTOPUSJ OCTOPUS_MANJ GIANT_OCTOPUSJCRABJCRAB_MANJ +GIANT_CRABJ LEOPARD_SEALJLEOPARD_SEAL_MANJGIANT_LEOPARD_SEALJ +CUTTLEFISHJCUTTLEFISH_MANJGIANT_CUTTLEFISHJORCAJORCA_MANJ +GIANT_ORCAJSPONGEJ +SPONGE_MANJ GIANT_SPONGEJHORSESHOE_CRABJHORSESHOE_CRAB_MANJGIANT_HORSESHOE_CRABJ SPERM_WHALEJSPERM_WHALE_MANJGIANT_SPERM_WHALEJ ELEPHANT_SEALJELEPHANT_SEAL_MANJGIANT_ELEPHANT_SEALJ HARP_SEALJ HARP_SEAL_MANJGIANT_HARP_SEALJNAUTILUSJ NAUTILUS_MANJGIANT_NAUTILUSJ FOXSQUIRRELJ MOGHOPPERJ RAT_DEMONJWAMBLER_FLUFFYJLIZARD_RHINO_TWO_LEGGEDJ WORM_KNUCKLEJSPIDER_PHANTOMJ FLY_ACORNJ +GNAT_BLOODJLIZARDJ +LIZARD_MANJ GIANT_LIZARDJSKINKJ SKINK_MANJ GIANT_SKINKJ CHAMELEONJ CHAMELEON_MANJGIANT_CHAMELEONJANOLEJ ANOLE_MANJ GIANT_ANOLEJIGUANAJ +IGUANA_MANJ GIANT_IGUANAJ RIVER OTTERJ SEA OTTERJ OTTER_MANJ GIANT_OTTERJSNAPPING TURTLEJALLIGATOR SNAPPING TURTLEJSNAPPING_TURTLE_MANJGIANT_SNAPPING_TURTLEJBEAVERJ +BEAVER_MANJ GIANT_BEAVERJLEECHJ LEECH_MANJ GIANT_LEECHJAXOLOTLJ AXOLOTL_MANJ GIANT_AXOLOTLJMINKJMINK_MANJ +GIANT_MINKJ POND_TURTLEJPOND_TURTLE_MANJGIANT_POND_TURTLEJRATJRAT_MANJ SQUIRREL_GRAYJSQUIRREL_GRAY_MANJGIANT_SQUIRREL_GRAYJ SQUIRREL_REDJSQUIRREL_RED_MANJGIANT_SQUIRREL_REDJCHIPMUNKJ CHIPMUNK_MANJGIANT_CHIPMUNKJHAMSTERJ HAMSTER_MANJ GIANT_HAMSTERJHEDGEHOGJ HEDGEHOG_MANJGIANT_HEDGEHOGJSQUIRREL_FLYINGJFLYING_SQUIRREL_MANJGIANT_FLYING_SQUIRRELJMUSSELJOYSTERJ FISH_SALMONJFISH_CLOWNFISHJ FISH_HAGFISHJFISH_LAMPREY_BROOKJ FISH_RAY_BATJFISH_RAY_THORNBACKJFISH_RATFISH_SPOTTEDJ FISH_HERRINGJ FISH_SHADJ FISH_ANCHOVYJFISH_TROUT_STEELHEADJ FISH_HAKEJ FISH_SEAHORSEJ FISH_GLASSEYEJFISH_PUFFER_WHITE_SPOTTEDJ FISH_SOLEJ FISH_FLOUNDERJ FISH_MACKERELJJELLYFISH_SEA_NETTLEJSQUIDJ SQUID MANJGIGANTIC SQUIDJ FISH_LUNGFISHJFISH_LOACH_CLOWNJFISH_BULLHEAD_BROWNJFISH_BULLHEAD_YELLOWJFISH_BULLHEAD_BLACKJFISH_KNIFEFISH_BANDEDJ FISH_CHARJFISH_TROUT_RAINBOWJFISH_MOLLY_SAILFINJ +FISH_GUPPYJ +FISH_PERCHJDWARFJHUMANJELFJGOBLINJKOBOLDJGREMLINJTROLLJOGREJUNICORNJDRAGONJSATYRJCOLOSSUS_BRONZEJGIANTJCYCLOPSJETTINJMINOTAURJYETIJ SASQUATCHJ BLIZZARD_MANJWOLF_ICEJFAIRYJPIXIEJBEAK_DOGJ GRIMELINGJ BLENDEC_FOULJ STRANGLERJ NIGHTWINGJHARPYJHYDRAJ MERPERSONJ SEA_SERPENTJ SEA_MONSTERJBIRD_ROCJCROCODILE_CAVEJTOAD_GIANT_CAVEJ OLM_GIANTJ BAT_GIANTJ RAT_GIANTJ RAT_LARGEJMOLE_DOG_NAKEDJ +TROGLODYTEJ +MOLE_GIANTJIMP_FIREJSPIDER_CAVE_GIANTJ SPIDER_CAVEJ FISH_CAVEJ CAVE_FISH_MANJ LOBSTER_CAVEJ +SNAKE_FIREJOLMJOLM_MANJBATJBAT_MANJMAGGOT_PURRINGJELEMENTMAN_FIREJELEMENTMAN_MAGMAJELEMENTMAN_IRONJELEMENTMAN_MUDJBIRD_SWALLOW_CAVEJCAVE_SWALLOW_MANJBIRD_SWALLOW_CAVE_GIANTJ AMPHIBIAN_MANJ REPTILE_MANJ SERPENT_MANJANT_MANJ +RODENT MANJ WILD_BOARJ WILD_BOAR_MANJGIANT_WILD_BOARJCOYOTEJ +COYOTE_MANJ GIANT_COYOTEJKANGAROOJ KANGAROO_MANJGIANT_KANGAROOJKOALAJ KOALA_MANJ GIANT_KOALAJADDERJ ADDER_MANJ GIANT_ADDERJECHIDNAJ ECHIDNA_MANJ GIANT_ECHIDNAJ PORCUPINEJ PORCUPINE_MANJGIANT_PORCUPINEJ KINGSNAKEJ KINGSNAKE_MANJGIANT_KINGSNAKEJ GRAY_LANGURJGRAY_LANGUR_MANJGIANT_GRAY_LANGURJBOBCATJ +BOBCAT_MANJ GIANT_BOBCATJSKUNKJ SKUNK_MANJ GIANT_SKUNKJGREEN_TREE_FROGJGREEN_TREE_FROG_MANJGIANT_GREEN_TREE_FROGJHAREJHARE_MANJ +GIANT_HAREJ RATTLESNAKEJRATTLESNAKE_MANJGIANT_RATTLESNAKEJWEASELJ +WEASEL_MANJ GIANT_WEASELJCOPPERHEAD_SNAKEJCOPPERHEAD_SNAKE_MANJGIANT_COPPERHEAD_SNAKEJIBEXJIBEX_MANJ +GIANT_IBEXJWOMBATJ +WOMBAT_MANJ GIANT_WOMBATJDINGOJ DINGO_MANJ GIANT_DINGOJCOATIJ COATI_MANJ GIANT_COATIJOPOSSUMJ OPOSSUM_MANJ GIANT_OPOSSUMJMONGOOSEJ MONGOOSE_MANJGIANT_MONGOOSEJHYENAJ HYENA_MANJ GIANT_HYENAJANACONDAJ ANACONDA_MANJGIANT_ANACONDAJMONITOR_LIZARDJMONITOR_LIZARD_MANJGIANT_MONITOR_LIZARDJ +KING_COBRAJKING_COBRA_MANJGIANT_KING_COBRAJOCELOTJ +OCELOT_MANJ GIANT_OCELOTJJACKALJ +JACKAL_MANJ GIANT_JACKALJCAPUCHINJ CAPUCHIN_MANJGIANT_CAPUCHINJSLOTHJ SLOTH_MANJ GIANT_SLOTHJ SPIDER_MONKEYJSPIDER_MONKEY_MANJGIANT_SPIDER_MONKEYJPANGOLINJ PANGOLIN_MANJGIANT_PANGOLINJ BLACK_MAMBAJBLACK_MAMBA_MANJGIANT_BLACK_MAMBAJ +BEAR_SLOTHJSLOTH_BEAR_MANJGIANT_SLOTH_BEARJAYE-AYEJ AYE-AYE_MANJ GIANT_AYE-AYEJ +BUSHMASTERJBUSHMASTER_MANJGIANT_BUSHMASTERJPYTHONJ +PYTHON_MANJ GIANT_PYTHONJTAPIRJ TAPIR_MANJ GIANT_TAPIRJIMPALAJ +IMPALA_MANJ GIANT_IMPALAJAARDVARKJ AARDVARK_MANJGIANT_AARDVARKJ LION_TAMARINJLION_TAMARIN_MANJGIANT_LION_TAMARINJSTOATJ STOAT_MANJ GIANT_STOATJLYNXJLYNX_MANJ +GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/usablehair.dfstock b/data/stockpiles/usablehair.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..97528d893bbc238bd0a2fbfd51ed4c0d3eb941da GIT binary patch literal 759 zcmXw1F_POb43x%_Y{R+C|1&Nqi(<|1?$Wuo3JY}0cK)ZZNEI}NjrP709?xun%gD0C?Lm4?lR zNjK^Y&qBkU_HB%I8t92Eod-$yV*cPE?ic`n{ZSBaq?i(=S3ysb+O_= zaS`W%?(`kEhfzPU@Qej5=uv_`VIq3ANo?+PG>m7!pKf+u6OJ^nUn~D(HWG^@>ezdQ z$fR4K4mmR&1?21DG@^~v^usJ3%)+~MbWGwI@~QK}g}R%~OGU`bo_M3-U6Kc>LquJl zMW#%Bbc{h=^4*3VGy}%_>2bHu04@s+Wl6$y=uQ##MN37DD9hjhHL)rh-d2nL^kTSh zTwRHrknl3Ha~1=5hUaW$mWQw}|6d?Ux1~ays|(M>Q#~5>FlB<`J6)n~lce3-Y~au$ zk_8IuC%HHa@ag%~8HL0Sc8m~WqwHBsv9Ry5a52kn;1f)oQ~gf;+bSv0*<0sw(P~4E z&SD~iNh{LnGl)Fu_fZ1kuBbZdvg45sGSAeFs`vUS1XCU03$m_{FkXA-*zQHow~Dcia4Fn}3Fku+IPh literal 0 HcmV?d00001 From 9b7860125d2328176e40e63670efe1a1338ad905 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 02:01:50 -0800 Subject: [PATCH 032/439] ensure elements in deepest dir are added to output list --- library/modules/Filesystem.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/library/modules/Filesystem.cpp b/library/modules/Filesystem.cpp index a182ac062..2c275ceba 100644 --- a/library/modules/Filesystem.cpp +++ b/library/modules/Filesystem.cpp @@ -255,13 +255,14 @@ static int listdir_recursive_impl (std::string prefix, std::string path, std::string path_file = path + *file; if (Filesystem::isdir(prefixed_file)) { + files.insert(std::pair(include_prefix ? prefixed_file : path_file, true)); + if (depth == 0) { out_of_depth = true; continue; } - files.insert(std::pair(include_prefix ? prefixed_file : path_file, true)); err = listdir_recursive_impl(prefix, path_file + "/", files, depth - 1, include_prefix); if (err) return err; @@ -277,5 +278,7 @@ static int listdir_recursive_impl (std::string prefix, std::string path, int Filesystem::listdir_recursive (std::string dir, std::map &files, int depth /* = 10 */, bool include_prefix /* = true */) { + if (dir.size() && dir[dir.size()-1] == '/') + dir.resize(dir.size()-1); return listdir_recursive_impl(dir, "", files, depth, include_prefix); } From 887cc57eb9dfa2401631d51b06c3f97ddcad2e6d Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 11 Mar 2023 21:40:38 +0000 Subject: [PATCH 033/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 89a345d66..4d5bb5551 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 89a345d66d70eb02293bd2e46dcfad65f0229ee6 +Subproject commit 4d5bb5551d7e8142b65a064ca9adcccbbb8d4534 From a5de0fef3ea25f784983f31ca94559c1e02f4b3e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 13:56:55 -0800 Subject: [PATCH 034/439] bump to 50.07-alpha3 --- CMakeLists.txt | 2 +- docs/changelog.txt | 17 +++++++++++++++-- docs/plugins/buildingplan.rst | 2 +- library/xml | 2 +- scripts | 2 +- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fb43fa07..674d9b60d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "alpha2") +set(DFHACK_RELEASE "alpha3") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/docs/changelog.txt b/docs/changelog.txt index f3592fc4a..89cd14064 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -35,6 +35,20 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins +## Fixes + +## Misc Improvements + +## Documentation + +## API + +## Lua + +## Removed + +# 50.07-alpha3 + ## Fixes -@ ``widgets.HotkeyLabel``: don't trigger on click if the widget is disabled - ``dfhack.job.isSuitableMaterial``: now properly detects lack of fire and magma safety for vulnerable materials with high melting points @@ -42,8 +56,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `dig-now`: added handling of dig designations that have been converted into active jobs - -## Documentation +- `buildingplan`: entirely new UI for building placement, item selection, and materials filtering! ## API - Gui focus strings will no longer get the "dfhack/" prefix if the string "dfhack/" already exists in the focus string diff --git a/docs/plugins/buildingplan.rst b/docs/plugins/buildingplan.rst index fe3683f77..8b1256b53 100644 --- a/docs/plugins/buildingplan.rst +++ b/docs/plugins/buildingplan.rst @@ -3,7 +3,7 @@ buildingplan .. dfhack-tool:: :summary: Plan building layouts with or without materials. - :tags: fort design buildings + :tags: fort design productivity buildings Buildingplan allows you to place furniture, constructions, and other buildings, regardless of whether the required materials are available. This allows you to diff --git a/library/xml b/library/xml index 267eb20f7..751065f42 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 267eb20f75e891fc0ade166e2d316498f454d913 +Subproject commit 751065f42a55504197990f9458826c5f5604bcff diff --git a/scripts b/scripts index 4d5bb5551..5896b316f 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 4d5bb5551d7e8142b65a064ca9adcccbbb8d4534 +Subproject commit 5896b316f6ebb3d0abf3316a2ba895c173051b36 From 097c333f91770656e096636a0e532add3568f907 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 14:18:30 -0800 Subject: [PATCH 035/439] move misplaced changelog entries from alpha2 to alpha3 --- docs/changelog.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 89cd14064..b0ed8b981 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -60,6 +60,12 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API - Gui focus strings will no longer get the "dfhack/" prefix if the string "dfhack/" already exists in the focus string +- ``Military``: New module for military functionality +- ``Military``: new ``makeSquad`` to create a squad +- ``Military``: changed ``getSquadName`` to take a squad identifier +- ``Military``: new ``updateRoomAssignments`` for assigning a squad to a barracks and archery range +- ``Maps::GetBiomeType`` renamed to ``Maps::getBiomeType`` for consistency +- ``Maps::GetBiomeTypeRef`` renamed to ``Maps::getBiomeTypeRef`` for consistency ## Lua - ``dfhack.job.attachJobItem()``: allows you to attach specific items to a job @@ -68,6 +74,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - ``widgets.CycleHotkeyLabel``: add ``label_below`` attribute for compact 2-line output -@ ``widgets.FilteredList``: search key matching is now case insensitive by default -@ ``gui.INTERIOR_FRAME``: a panel frame style for use in highlighting off interior areas of a UI +- ``maps.getBiomeType``: exposed preexisting function to Lua ## Removed -@ ``gui.THIN_FRAME``: replaced by ``gui.INTERIOR_FRAME`` @@ -97,18 +104,11 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API - ``Gui::any_civzone_hotkey``, ``Gui::getAnyCivZone``, ``Gui::getSelectedCivZone``: new functions to operate on the new zone system - Units module: added new predicates for ``isGeldable()``, ``isMarkedForGelding()``, and ``isPet()`` -- ``Military``: New module for military functionality -- ``Military``: new ``makeSquad`` to create a squad -- ``Military``: changed ``getSquadName`` to take a squad identifier -- ``Military``: new ``updateRoomAssignments`` for assigning a squad to a barracks and archery range -- ``Maps::GetBiomeType`` renamed to ``Maps::getBiomeType`` for consistency -- ``Maps::GetBiomeTypeRef`` renamed to ``Maps::getBiomeTypeRef`` for consistency ## Lua - ``dfhack.gui.getSelectedCivZone``: returns the Zone that the user has selected currently - ``widgets.FilteredList``: Added ``edit_on_change`` optional parameter to allow a custom callback on filter edit change. - ``widgets.TabBar``: new library widget (migrated from control-panel.lua) -- ``maps.getBiomeType``: exposed preexisting function to Lua # 50.07-alpha1 From 468b3b54d4f9be44d31ed1dfc19d4686ba4931c7 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 15:36:47 -0800 Subject: [PATCH 036/439] fix buildingplan typo --- plugins/buildingplan/buildingplan.cpp | 2 +- plugins/lua/buildingplan/planneroverlay.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index abc3c6ebd..2010b5f12 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -971,7 +971,7 @@ static string getDescString(color_ostream &out, df::building *bld, int index) { } static int getQueuePosition(color_ostream &out, df::building *bld, int index) { - DEBUG(status,out).print("entering getQueuePosition\n"); + TRACE(status,out).print("entering getQueuePosition\n"); if (!validate_pb(out, bld, index)) return 0; diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 924080ec3..a45ab8ca0 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -462,7 +462,7 @@ function PlannerOverlay:set_filter(idx) end function PlannerOverlay:clear_filter(idx) - clearFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, idx-1) + desc=require('plugins.buildingplan').clearFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, idx-1) end local function get_placement_data() From 3798a7cb5e0868fb6dc7ec82b94f1ec9ef8a6e54 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 12 Mar 2023 15:13:57 -0700 Subject: [PATCH 037/439] allow clay to be chosen as a filter material --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 17 +++++++++++++---- plugins/lua/buildingplan/filterselection.lua | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b0ed8b981..5799dc70b 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements +-@ `buildingplan`: can now filter by clay materials ## Documentation diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 2010b5f12..b4f3839f4 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -148,22 +148,26 @@ static const df::dfhack_material_category stone_cat(df::dfhack_material_category static const df::dfhack_material_category wood_cat(df::dfhack_material_category::mask_wood); static const df::dfhack_material_category metal_cat(df::dfhack_material_category::mask_metal); static const df::dfhack_material_category glass_cat(df::dfhack_material_category::mask_glass); +static const df::dfhack_material_category clay_cat(df::dfhack_material_category::mask_clay); static void cache_matched(int16_t type, int32_t index) { MaterialInfo mi; mi.decode(type, index); if (mi.matches(stone_cat)) { - DEBUG(status).print("cached stone material: %s\n", mi.toString().c_str()); + DEBUG(status).print("cached stone material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "stone")); } else if (mi.matches(wood_cat)) { - DEBUG(status).print("cached wood material: %s\n", mi.toString().c_str()); + DEBUG(status).print("cached wood material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "wood")); } else if (mi.matches(metal_cat)) { - DEBUG(status).print("cached metal material: %s\n", mi.toString().c_str()); + DEBUG(status).print("cached metal material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "metal")); } else if (mi.matches(glass_cat)) { - DEBUG(status).print("cached glass material: %s\n", mi.toString().c_str()); + DEBUG(status).print("cached glass material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "glass")); + } else if (mi.matches(clay_cat)) { + DEBUG(status).print("cached clay material: %s (%d, %d)\n", mi.toString().c_str(), type, index); + mat_cache.emplace(mi.toString(), std::make_pair(mi, "clay")); } else TRACE(status).print("not matched: %s\n", mi.toString().c_str()); @@ -734,6 +738,8 @@ static int setMaterialMaskFilter(lua_State *L) { mask |= metal_cat.whole; else if (cat == "glass") mask |= glass_cat.whole; + else if (cat == "clay") + mask |= clay_cat.whole; } DEBUG(status,*out).print( "setting material mask filter for building_type=%d subtype=%d custom=%d index=%d to %x\n", @@ -778,6 +784,7 @@ static int getMaterialMaskFilter(lua_State *L) { ret.emplace("wood", !bits || bits & wood_cat.whole); ret.emplace("metal", !bits || bits & metal_cat.whole); ret.emplace("glass", !bits || bits & glass_cat.whole); + ret.emplace("clay", !bits || bits & clay_cat.whole); Lua::Push(L, ret); return 1; } @@ -822,6 +829,8 @@ static int setMaterialFilter(lua_State *L) { mask.whole |= metal_cat.whole; else if (mat.matches(glass_cat)) mask.whole |= glass_cat.whole; + else if (mat.matches(clay_cat)) + mask.whole |= clay_cat.whole; } filter.setMaterialMask(mask.whole); get_item_filters(*out, key).setItemFilter(*out, filter, index); diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index d043406f3..e923c4b5b 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -443,6 +443,7 @@ function QualityAndMaterialsPage:refresh() make_cat_choice('Wood', 'wood', 'CUSTOM_SHIFT_O', cats), make_cat_choice('Metal', 'metal', 'CUSTOM_SHIFT_M', cats), make_cat_choice('Glass', 'glass', 'CUSTOM_SHIFT_G', cats), + make_cat_choice('Clay', 'clay', 'CUSTOM_SHIFT_C', cats), } self.subviews.materials_categories:setChoices(category_choices) From c48c9c77c0bee1aa123c463b60c5926760b1b5d6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 17:54:58 -0800 Subject: [PATCH 038/439] use new data directories for blueprints --- data/CMakeLists.txt | 12 +- data/blueprints/{library => }/aquifer_tap.csv | 0 .../28-3-Modified_Windmill_Villas.csv | 0 .../48-4-Raynard_Whirlpool_Housing.csv | 0 .../bedrooms/95-9-Hactar1_3_Branch_Tree.csv | 0 data/blueprints/{library => }/dreamfort.csv | 0 data/blueprints/{library => }/embark.csv | 0 .../connected-mineshafts.csv | 0 .../exploratory-mining/tunnels.csv | 0 .../vertical-mineshafts.csv | 0 .../layout-helpers/mark_down_left.csv | 0 .../layout-helpers/mark_down_right.csv | 0 .../layout-helpers/mark_up_left.csv | 0 .../layout-helpers/mark_up_right.csv | 0 data/blueprints/{library => }/pump_stack.csv | 0 .../{library => }/quickfortress.csv | 0 .../ecosystem/golden/gui_quantum-2-build.csv | 0 .../ecosystem/golden/gui_quantum-3-place.csv | 0 .../ecosystem/golden/gui_quantum-4-query.csv | 0 .../test/ecosystem/golden/meta-1-dig.csv | 0 .../test/ecosystem/golden/tracks-2-carve.csv | 0 .../test/ecosystem/golden/transform-1-dig.csv | 0 .../golden/transform-2-construct.csv | 0 .../ecosystem/golden/transform-3-build.csv | 0 .../test/ecosystem/in/basic-1-dig.csv | 0 .../test/ecosystem/in/basic-2-carve.csv | 0 .../test/ecosystem/in/basic-3-build.csv | 0 .../test/ecosystem/in/basic-4-place.csv | 0 .../test/ecosystem/in/basic-5-zone.csv | 0 .../test/ecosystem/in/basic-spec.csv | 0 .../test/ecosystem/in/buildings-1-dig.csv | 0 .../ecosystem/in/buildings-2-construct.csv | 0 .../test/ecosystem/in/buildings-3-build.csv | 0 .../test/ecosystem/in/buildings-spec.csv | 0 .../ecosystem/in/fortifications-1-dig.csv | 0 .../ecosystem/in/fortifications-2-smooth.csv | 0 .../ecosystem/in/fortifications-3-carve.csv | 0 .../test/ecosystem/in/fortifications-spec.csv | 0 .../test/ecosystem/in/gui_quantum-2-build.csv | 0 .../test/ecosystem/in/gui_quantum-3-place.csv | 0 .../test/ecosystem/in/gui_quantum-4-query.csv | 0 .../test/ecosystem/in/gui_quantum-spec.csv | 0 .../test/ecosystem/in/meta-1-dig.csv | 0 .../test/ecosystem/in/meta-spec.csv | 0 .../test/ecosystem/in/stockpiles-2-place.csv | 0 .../test/ecosystem/in/stockpiles-spec.csv | 0 .../test/ecosystem/in/tracks-1-dig.csv | 0 .../test/ecosystem/in/tracks-2-carve.csv | 0 .../test/ecosystem/in/tracks-3-build.csv | 0 .../test/ecosystem/in/tracks-spec.csv | 0 .../test/ecosystem/in/transform-1-dig.csv | 0 .../ecosystem/in/transform-2-construct.csv | 0 .../test/ecosystem/in/transform-3-build.csv | 0 .../test/ecosystem/in/transform-spec.csv | 0 .../test/ecosystem/in/zones-2-zone.csv | 0 .../test/ecosystem/in/zones-spec.csv | 0 .../test/quickfort/list/all_modes.csv | 0 .../list/all_modes_separate_sheets.xlsx | Bin .../list/all_modes_single_sheet.xlsx | Bin .../{library => }/tombs/Mini_Saracen.csv | 0 .../tombs/The_Saracen_Crypts.csv | 0 data/{ => dfhack-config}/blueprints/README.md | 0 data/dfhack-config/quickfort/aliases.txt | 17 - data/dfhack-config/quickfort/quickfort.txt | 37 -- data/quickfort/aliases-common.txt | 509 ------------------ docs/plugins/blueprint.rst | 2 +- plugins/blueprint.cpp | 4 +- plugins/lua/blueprint.lua | 2 +- 68 files changed, 9 insertions(+), 574 deletions(-) rename data/blueprints/{library => }/aquifer_tap.csv (100%) rename data/blueprints/{library => }/bedrooms/28-3-Modified_Windmill_Villas.csv (100%) rename data/blueprints/{library => }/bedrooms/48-4-Raynard_Whirlpool_Housing.csv (100%) rename data/blueprints/{library => }/bedrooms/95-9-Hactar1_3_Branch_Tree.csv (100%) rename data/blueprints/{library => }/dreamfort.csv (100%) rename data/blueprints/{library => }/embark.csv (100%) rename data/blueprints/{library => }/exploratory-mining/connected-mineshafts.csv (100%) rename data/blueprints/{library => }/exploratory-mining/tunnels.csv (100%) rename data/blueprints/{library => }/exploratory-mining/vertical-mineshafts.csv (100%) rename data/blueprints/{library => }/layout-helpers/mark_down_left.csv (100%) rename data/blueprints/{library => }/layout-helpers/mark_down_right.csv (100%) rename data/blueprints/{library => }/layout-helpers/mark_up_left.csv (100%) rename data/blueprints/{library => }/layout-helpers/mark_up_right.csv (100%) rename data/blueprints/{library => }/pump_stack.csv (100%) rename data/blueprints/{library => }/quickfortress.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/gui_quantum-2-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/gui_quantum-3-place.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/gui_quantum-4-query.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/meta-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/tracks-2-carve.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/transform-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/transform-2-construct.csv (100%) rename data/blueprints/{library => }/test/ecosystem/golden/transform-3-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/basic-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/basic-2-carve.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/basic-3-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/basic-4-place.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/basic-5-zone.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/basic-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/buildings-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/buildings-2-construct.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/buildings-3-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/buildings-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/fortifications-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/fortifications-2-smooth.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/fortifications-3-carve.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/fortifications-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/gui_quantum-2-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/gui_quantum-3-place.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/gui_quantum-4-query.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/gui_quantum-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/meta-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/meta-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/stockpiles-2-place.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/stockpiles-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/tracks-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/tracks-2-carve.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/tracks-3-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/tracks-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/transform-1-dig.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/transform-2-construct.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/transform-3-build.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/transform-spec.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/zones-2-zone.csv (100%) rename data/blueprints/{library => }/test/ecosystem/in/zones-spec.csv (100%) rename data/blueprints/{library => }/test/quickfort/list/all_modes.csv (100%) rename data/blueprints/{library => }/test/quickfort/list/all_modes_separate_sheets.xlsx (100%) rename data/blueprints/{library => }/test/quickfort/list/all_modes_single_sheet.xlsx (100%) rename data/blueprints/{library => }/tombs/Mini_Saracen.csv (100%) rename data/blueprints/{library => }/tombs/The_Saracen_Crypts.csv (100%) rename data/{ => dfhack-config}/blueprints/README.md (100%) delete mode 100644 data/dfhack-config/quickfort/aliases.txt delete mode 100644 data/dfhack-config/quickfort/quickfort.txt delete mode 100644 data/quickfort/aliases-common.txt diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 8cbd910cb..89abe3aaf 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -7,9 +7,6 @@ install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/init/ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/base_command_counts.json DESTINATION "${DFHACK_DATA_DESTINATION}/data") -install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/quickfort/ - DESTINATION "${DFHACK_DATA_DESTINATION}/data/quickfort") - install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/orders/ DESTINATION "${DFHACK_DATA_DESTINATION}/data/orders") @@ -20,12 +17,11 @@ install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/professions/ DESTINATION "${DFHACK_DATA_DESTINATION}/data/professions") install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/blueprints/ - DESTINATION blueprints + DESTINATION "${DFHACK_DATA_DESTINATION}/data/blueprints" FILES_MATCHING PATTERN "*" - PATTERN blueprints/library/test EXCLUDE) + PATTERN blueprints/test EXCLUDE) if(BUILD_TESTS) - install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/blueprints/library/test/ - DESTINATION blueprints/library/test - ) + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/blueprints/test/ + DESTINATION "${DFHACK_DATA_DESTINATION}/data/blueprints/test") endif() diff --git a/data/blueprints/library/aquifer_tap.csv b/data/blueprints/aquifer_tap.csv similarity index 100% rename from data/blueprints/library/aquifer_tap.csv rename to data/blueprints/aquifer_tap.csv diff --git a/data/blueprints/library/bedrooms/28-3-Modified_Windmill_Villas.csv b/data/blueprints/bedrooms/28-3-Modified_Windmill_Villas.csv similarity index 100% rename from data/blueprints/library/bedrooms/28-3-Modified_Windmill_Villas.csv rename to data/blueprints/bedrooms/28-3-Modified_Windmill_Villas.csv diff --git a/data/blueprints/library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv b/data/blueprints/bedrooms/48-4-Raynard_Whirlpool_Housing.csv similarity index 100% rename from data/blueprints/library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv rename to data/blueprints/bedrooms/48-4-Raynard_Whirlpool_Housing.csv diff --git a/data/blueprints/library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv b/data/blueprints/bedrooms/95-9-Hactar1_3_Branch_Tree.csv similarity index 100% rename from data/blueprints/library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv rename to data/blueprints/bedrooms/95-9-Hactar1_3_Branch_Tree.csv diff --git a/data/blueprints/library/dreamfort.csv b/data/blueprints/dreamfort.csv similarity index 100% rename from data/blueprints/library/dreamfort.csv rename to data/blueprints/dreamfort.csv diff --git a/data/blueprints/library/embark.csv b/data/blueprints/embark.csv similarity index 100% rename from data/blueprints/library/embark.csv rename to data/blueprints/embark.csv diff --git a/data/blueprints/library/exploratory-mining/connected-mineshafts.csv b/data/blueprints/exploratory-mining/connected-mineshafts.csv similarity index 100% rename from data/blueprints/library/exploratory-mining/connected-mineshafts.csv rename to data/blueprints/exploratory-mining/connected-mineshafts.csv diff --git a/data/blueprints/library/exploratory-mining/tunnels.csv b/data/blueprints/exploratory-mining/tunnels.csv similarity index 100% rename from data/blueprints/library/exploratory-mining/tunnels.csv rename to data/blueprints/exploratory-mining/tunnels.csv diff --git a/data/blueprints/library/exploratory-mining/vertical-mineshafts.csv b/data/blueprints/exploratory-mining/vertical-mineshafts.csv similarity index 100% rename from data/blueprints/library/exploratory-mining/vertical-mineshafts.csv rename to data/blueprints/exploratory-mining/vertical-mineshafts.csv diff --git a/data/blueprints/library/layout-helpers/mark_down_left.csv b/data/blueprints/layout-helpers/mark_down_left.csv similarity index 100% rename from data/blueprints/library/layout-helpers/mark_down_left.csv rename to data/blueprints/layout-helpers/mark_down_left.csv diff --git a/data/blueprints/library/layout-helpers/mark_down_right.csv b/data/blueprints/layout-helpers/mark_down_right.csv similarity index 100% rename from data/blueprints/library/layout-helpers/mark_down_right.csv rename to data/blueprints/layout-helpers/mark_down_right.csv diff --git a/data/blueprints/library/layout-helpers/mark_up_left.csv b/data/blueprints/layout-helpers/mark_up_left.csv similarity index 100% rename from data/blueprints/library/layout-helpers/mark_up_left.csv rename to data/blueprints/layout-helpers/mark_up_left.csv diff --git a/data/blueprints/library/layout-helpers/mark_up_right.csv b/data/blueprints/layout-helpers/mark_up_right.csv similarity index 100% rename from data/blueprints/library/layout-helpers/mark_up_right.csv rename to data/blueprints/layout-helpers/mark_up_right.csv diff --git a/data/blueprints/library/pump_stack.csv b/data/blueprints/pump_stack.csv similarity index 100% rename from data/blueprints/library/pump_stack.csv rename to data/blueprints/pump_stack.csv diff --git a/data/blueprints/library/quickfortress.csv b/data/blueprints/quickfortress.csv similarity index 100% rename from data/blueprints/library/quickfortress.csv rename to data/blueprints/quickfortress.csv diff --git a/data/blueprints/library/test/ecosystem/golden/gui_quantum-2-build.csv b/data/blueprints/test/ecosystem/golden/gui_quantum-2-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/gui_quantum-2-build.csv rename to data/blueprints/test/ecosystem/golden/gui_quantum-2-build.csv diff --git a/data/blueprints/library/test/ecosystem/golden/gui_quantum-3-place.csv b/data/blueprints/test/ecosystem/golden/gui_quantum-3-place.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/gui_quantum-3-place.csv rename to data/blueprints/test/ecosystem/golden/gui_quantum-3-place.csv diff --git a/data/blueprints/library/test/ecosystem/golden/gui_quantum-4-query.csv b/data/blueprints/test/ecosystem/golden/gui_quantum-4-query.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/gui_quantum-4-query.csv rename to data/blueprints/test/ecosystem/golden/gui_quantum-4-query.csv diff --git a/data/blueprints/library/test/ecosystem/golden/meta-1-dig.csv b/data/blueprints/test/ecosystem/golden/meta-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/meta-1-dig.csv rename to data/blueprints/test/ecosystem/golden/meta-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/golden/tracks-2-carve.csv b/data/blueprints/test/ecosystem/golden/tracks-2-carve.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/tracks-2-carve.csv rename to data/blueprints/test/ecosystem/golden/tracks-2-carve.csv diff --git a/data/blueprints/library/test/ecosystem/golden/transform-1-dig.csv b/data/blueprints/test/ecosystem/golden/transform-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/transform-1-dig.csv rename to data/blueprints/test/ecosystem/golden/transform-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/golden/transform-2-construct.csv b/data/blueprints/test/ecosystem/golden/transform-2-construct.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/transform-2-construct.csv rename to data/blueprints/test/ecosystem/golden/transform-2-construct.csv diff --git a/data/blueprints/library/test/ecosystem/golden/transform-3-build.csv b/data/blueprints/test/ecosystem/golden/transform-3-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/golden/transform-3-build.csv rename to data/blueprints/test/ecosystem/golden/transform-3-build.csv diff --git a/data/blueprints/library/test/ecosystem/in/basic-1-dig.csv b/data/blueprints/test/ecosystem/in/basic-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/basic-1-dig.csv rename to data/blueprints/test/ecosystem/in/basic-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/in/basic-2-carve.csv b/data/blueprints/test/ecosystem/in/basic-2-carve.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/basic-2-carve.csv rename to data/blueprints/test/ecosystem/in/basic-2-carve.csv diff --git a/data/blueprints/library/test/ecosystem/in/basic-3-build.csv b/data/blueprints/test/ecosystem/in/basic-3-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/basic-3-build.csv rename to data/blueprints/test/ecosystem/in/basic-3-build.csv diff --git a/data/blueprints/library/test/ecosystem/in/basic-4-place.csv b/data/blueprints/test/ecosystem/in/basic-4-place.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/basic-4-place.csv rename to data/blueprints/test/ecosystem/in/basic-4-place.csv diff --git a/data/blueprints/library/test/ecosystem/in/basic-5-zone.csv b/data/blueprints/test/ecosystem/in/basic-5-zone.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/basic-5-zone.csv rename to data/blueprints/test/ecosystem/in/basic-5-zone.csv diff --git a/data/blueprints/library/test/ecosystem/in/basic-spec.csv b/data/blueprints/test/ecosystem/in/basic-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/basic-spec.csv rename to data/blueprints/test/ecosystem/in/basic-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/buildings-1-dig.csv b/data/blueprints/test/ecosystem/in/buildings-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/buildings-1-dig.csv rename to data/blueprints/test/ecosystem/in/buildings-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/in/buildings-2-construct.csv b/data/blueprints/test/ecosystem/in/buildings-2-construct.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/buildings-2-construct.csv rename to data/blueprints/test/ecosystem/in/buildings-2-construct.csv diff --git a/data/blueprints/library/test/ecosystem/in/buildings-3-build.csv b/data/blueprints/test/ecosystem/in/buildings-3-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/buildings-3-build.csv rename to data/blueprints/test/ecosystem/in/buildings-3-build.csv diff --git a/data/blueprints/library/test/ecosystem/in/buildings-spec.csv b/data/blueprints/test/ecosystem/in/buildings-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/buildings-spec.csv rename to data/blueprints/test/ecosystem/in/buildings-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/fortifications-1-dig.csv b/data/blueprints/test/ecosystem/in/fortifications-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/fortifications-1-dig.csv rename to data/blueprints/test/ecosystem/in/fortifications-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/in/fortifications-2-smooth.csv b/data/blueprints/test/ecosystem/in/fortifications-2-smooth.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/fortifications-2-smooth.csv rename to data/blueprints/test/ecosystem/in/fortifications-2-smooth.csv diff --git a/data/blueprints/library/test/ecosystem/in/fortifications-3-carve.csv b/data/blueprints/test/ecosystem/in/fortifications-3-carve.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/fortifications-3-carve.csv rename to data/blueprints/test/ecosystem/in/fortifications-3-carve.csv diff --git a/data/blueprints/library/test/ecosystem/in/fortifications-spec.csv b/data/blueprints/test/ecosystem/in/fortifications-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/fortifications-spec.csv rename to data/blueprints/test/ecosystem/in/fortifications-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/gui_quantum-2-build.csv b/data/blueprints/test/ecosystem/in/gui_quantum-2-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/gui_quantum-2-build.csv rename to data/blueprints/test/ecosystem/in/gui_quantum-2-build.csv diff --git a/data/blueprints/library/test/ecosystem/in/gui_quantum-3-place.csv b/data/blueprints/test/ecosystem/in/gui_quantum-3-place.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/gui_quantum-3-place.csv rename to data/blueprints/test/ecosystem/in/gui_quantum-3-place.csv diff --git a/data/blueprints/library/test/ecosystem/in/gui_quantum-4-query.csv b/data/blueprints/test/ecosystem/in/gui_quantum-4-query.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/gui_quantum-4-query.csv rename to data/blueprints/test/ecosystem/in/gui_quantum-4-query.csv diff --git a/data/blueprints/library/test/ecosystem/in/gui_quantum-spec.csv b/data/blueprints/test/ecosystem/in/gui_quantum-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/gui_quantum-spec.csv rename to data/blueprints/test/ecosystem/in/gui_quantum-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/meta-1-dig.csv b/data/blueprints/test/ecosystem/in/meta-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/meta-1-dig.csv rename to data/blueprints/test/ecosystem/in/meta-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/in/meta-spec.csv b/data/blueprints/test/ecosystem/in/meta-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/meta-spec.csv rename to data/blueprints/test/ecosystem/in/meta-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/stockpiles-2-place.csv b/data/blueprints/test/ecosystem/in/stockpiles-2-place.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/stockpiles-2-place.csv rename to data/blueprints/test/ecosystem/in/stockpiles-2-place.csv diff --git a/data/blueprints/library/test/ecosystem/in/stockpiles-spec.csv b/data/blueprints/test/ecosystem/in/stockpiles-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/stockpiles-spec.csv rename to data/blueprints/test/ecosystem/in/stockpiles-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/tracks-1-dig.csv b/data/blueprints/test/ecosystem/in/tracks-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/tracks-1-dig.csv rename to data/blueprints/test/ecosystem/in/tracks-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/in/tracks-2-carve.csv b/data/blueprints/test/ecosystem/in/tracks-2-carve.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/tracks-2-carve.csv rename to data/blueprints/test/ecosystem/in/tracks-2-carve.csv diff --git a/data/blueprints/library/test/ecosystem/in/tracks-3-build.csv b/data/blueprints/test/ecosystem/in/tracks-3-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/tracks-3-build.csv rename to data/blueprints/test/ecosystem/in/tracks-3-build.csv diff --git a/data/blueprints/library/test/ecosystem/in/tracks-spec.csv b/data/blueprints/test/ecosystem/in/tracks-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/tracks-spec.csv rename to data/blueprints/test/ecosystem/in/tracks-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/transform-1-dig.csv b/data/blueprints/test/ecosystem/in/transform-1-dig.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/transform-1-dig.csv rename to data/blueprints/test/ecosystem/in/transform-1-dig.csv diff --git a/data/blueprints/library/test/ecosystem/in/transform-2-construct.csv b/data/blueprints/test/ecosystem/in/transform-2-construct.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/transform-2-construct.csv rename to data/blueprints/test/ecosystem/in/transform-2-construct.csv diff --git a/data/blueprints/library/test/ecosystem/in/transform-3-build.csv b/data/blueprints/test/ecosystem/in/transform-3-build.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/transform-3-build.csv rename to data/blueprints/test/ecosystem/in/transform-3-build.csv diff --git a/data/blueprints/library/test/ecosystem/in/transform-spec.csv b/data/blueprints/test/ecosystem/in/transform-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/transform-spec.csv rename to data/blueprints/test/ecosystem/in/transform-spec.csv diff --git a/data/blueprints/library/test/ecosystem/in/zones-2-zone.csv b/data/blueprints/test/ecosystem/in/zones-2-zone.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/zones-2-zone.csv rename to data/blueprints/test/ecosystem/in/zones-2-zone.csv diff --git a/data/blueprints/library/test/ecosystem/in/zones-spec.csv b/data/blueprints/test/ecosystem/in/zones-spec.csv similarity index 100% rename from data/blueprints/library/test/ecosystem/in/zones-spec.csv rename to data/blueprints/test/ecosystem/in/zones-spec.csv diff --git a/data/blueprints/library/test/quickfort/list/all_modes.csv b/data/blueprints/test/quickfort/list/all_modes.csv similarity index 100% rename from data/blueprints/library/test/quickfort/list/all_modes.csv rename to data/blueprints/test/quickfort/list/all_modes.csv diff --git a/data/blueprints/library/test/quickfort/list/all_modes_separate_sheets.xlsx b/data/blueprints/test/quickfort/list/all_modes_separate_sheets.xlsx similarity index 100% rename from data/blueprints/library/test/quickfort/list/all_modes_separate_sheets.xlsx rename to data/blueprints/test/quickfort/list/all_modes_separate_sheets.xlsx diff --git a/data/blueprints/library/test/quickfort/list/all_modes_single_sheet.xlsx b/data/blueprints/test/quickfort/list/all_modes_single_sheet.xlsx similarity index 100% rename from data/blueprints/library/test/quickfort/list/all_modes_single_sheet.xlsx rename to data/blueprints/test/quickfort/list/all_modes_single_sheet.xlsx diff --git a/data/blueprints/library/tombs/Mini_Saracen.csv b/data/blueprints/tombs/Mini_Saracen.csv similarity index 100% rename from data/blueprints/library/tombs/Mini_Saracen.csv rename to data/blueprints/tombs/Mini_Saracen.csv diff --git a/data/blueprints/library/tombs/The_Saracen_Crypts.csv b/data/blueprints/tombs/The_Saracen_Crypts.csv similarity index 100% rename from data/blueprints/library/tombs/The_Saracen_Crypts.csv rename to data/blueprints/tombs/The_Saracen_Crypts.csv diff --git a/data/blueprints/README.md b/data/dfhack-config/blueprints/README.md similarity index 100% rename from data/blueprints/README.md rename to data/dfhack-config/blueprints/README.md diff --git a/data/dfhack-config/quickfort/aliases.txt b/data/dfhack-config/quickfort/aliases.txt deleted file mode 100644 index a3e52052d..000000000 --- a/data/dfhack-config/quickfort/aliases.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Custom aliases for quickfort query mode blueprints -# -# This file defines custom key sequence shortcuts for query mode blueprints. -# Definitions in this file take precedence over any definitions in the -# baseline aliases configuration file in -# hack/data/quickfort/aliases-common.txt -# -# Please see -# https://docs.dfhack.org/en/latest/docs/guides/quickfort-alias-guide.html -# or -# hack/docs/docs/guides/quickfort-alias-guide.html -# in your DF installation directory for alias syntax documentation and an -# overview of the DFHack alias standard library. -# -# -# Add your custom aliases here. Example: -# food_stash: {foodprefix}b{Right}{Down 11}p^{permitplants} diff --git a/data/dfhack-config/quickfort/quickfort.txt b/data/dfhack-config/quickfort/quickfort.txt deleted file mode 100644 index 92af2909e..000000000 --- a/data/dfhack-config/quickfort/quickfort.txt +++ /dev/null @@ -1,37 +0,0 @@ -# quickfort main configuration file -# -# Set startup defaults for the quickfort script in this file. Settings can be -# temporarily overridden in the active session with the `quickfort set` command. -# -# If you have edited this file but want to revert to "factory defaults", delete -# this file and a default one will be regenerated for you the next time you -# start DFHack. - -# Directory tree to search for blueprints. Can be set to an absolute or relative -# path. If set to a relative path, resolves to a directory under the DF folder. -# Note that if you change this directory, you will not automatically pick up -# blueprints written by the DFHack "blueprint" plugin (which always writes to -# the "blueprints" dir). -blueprints_dir=blueprints - -# Set to "true" or "false". If true, will designate all dig blueprints in marker -# mode. If false, only cells with dig codes explicitly prefixed with an "m" will -# be designated in marker mode. -force_marker_mode=false - -# Skip query blueprint sanity checks that detect common blueprint errors and -# halt or skip keycode playback. Checks include ensuring a configurable building -# exists at the designated cursor position and verifying the active UI screen is -# the same before and after sending keys for the cursor position. If you find -# you need to enable this for one of your own blueprints, you should probably be -# using a config blueprint, not a query blueprint. -query_unsafe=false - -# Set to the maximum number of resources you want assigned to stockpiles of the -# relevant types. Set to -1 for DF defaults (number of stockpile tiles for -# stockpiles that take barrels and bins, 1 wheelbarrow for stone stockpiles). -# The default here for wheelbarrows is 0 since restricting stockpiles to a -# single wheelbarrow can drastically *decrease* the efficiency of your fort. -stockpiles_max_barrels=-1 -stockpiles_max_bins=-1 -stockpiles_max_wheelbarrows=0 diff --git a/data/quickfort/aliases-common.txt b/data/quickfort/aliases-common.txt deleted file mode 100644 index f000b5bd1..000000000 --- a/data/quickfort/aliases-common.txt +++ /dev/null @@ -1,509 +0,0 @@ -# Standard library of aliases for quickfort query mode blueprints. -# -# Please DO NOT EDIT this file directly. It will get overwritten when DFHack -# is updated. Instead, custom aliases should be added to -# dfhack-config/quickfort/aliases.txt -# Custom alias definitions will take precedence over aliases in this file. -# -# Please see -# https://docs.dfhack.org/en/latest/docs/guides/quickfort-alias-guide.html -# or -# hack/docs/docs/guides/quickfort-alias-guide.html -# in your DF installation directory for alias syntax documentation and -# documentation for the aliases in this file. - -################################## -# naming aliases -################################## - -name: {Empty} -givename: !n{name}& -namezone: ^i{givename}^q - - -################################## -# quantum stockpile aliases -################################## - -# Allows the standard stockpile config aliases to also be used to configure -# hauling routes. -enter_sp_config: {enter_sp_config_default} -enter_sp_config_default: s -enter_sp_config_hauling: & - -quantum_enable: {enableanimals}{enablefood}{enablefurniture}{enablestone}{enableammo}{enablecoins}{enablebars}{enablegems}{enablefinishedgoods}{enableleather}{enablecloth}{enablewood}{enableweapons}{enablearmor}{enablesheet} -quantum: {linksonly}{nocontainers}{quantum_enable}{givename} - -stop_name: {Empty} -route_enable: {quantum_enable}{enablecorpses}{enablerefuse} -sp_link: s{move}p{move_back} -sp_links: {sp_link} -quantumstop: ^hrn{name}&sn{stop_name}&&xxx{route_enable enter_sp_config={enter_sp_config_hauling}}{sp_links}^^q -quantumstopfromeast: {quantumstop move={Right} move_back={Left}} -quantumstopfromsouth: {quantumstop move={Down} move_back={Up}} -quantumstopfromwest: {quantumstop move={Left} move_back={Right}} -quantumstopfromnorth: {quantumstop move={Up} move_back={Down}} - - -################################## -# farm plots -################################## - -growlastcropall: a/&b/&c/&d/& -growfirstcropall: a&b&c&d& - - -######################################## -# stockpile utility aliases -######################################## - -linksonly: a -maxbins: V -maxbarrels: R -nobins: C -nobarrels: E -nocontainers: {nobins}{nobarrels} - -give: g{move}& -give2up: {give move={Up 2}} -give2down: {give move={Down 2}} -give2left: {give move={Left 2}} -give2right: {give move={Right 2}} -give10up: {give move={Up 10}} -give10down: {give move={Down 10}} -give10left: {give move={Left 10}} -give10right: {give move={Right 10}} - -togglesequence: &{Down} -togglesequence2: &{Down 2} - -# these aliases use the DFHack "search" plugin to filter the right column -forbidsearch: s{search}&f{Left}{Right} -permitsearch: s{search}&p{Left}{Right} -togglesearch: s{search}&&{Left}{Right} - -masterworkonly: {prefix}{Right}{Up 2}f{Right}{Up 2}&^ -artifactonly: {prefix}{Right}{Up 2}f{Right}{Up}&^ - -togglemasterwork: {prefix}{Right}{Up 2}{Right}{Up 2}&^ -toggleartifact: {prefix}{Right}{Up 2}{Right}{Up}&^ - - -################################## -# animal stockpile adjustments -################################## - -animalsprefix: {enter_sp_config} -enableanimals: {animalsprefix}e^ -disableanimals: {animalsprefix}d^ - -cages: {animalsprefix}bu^ -traps: {animalsprefix}bj^ - -forbidcages: {animalsprefix}u^ -forbidtraps: {animalsprefix}j^ - -permitcages: {forbidcages} -permittraps: {forbidtraps} - - -################################## -# food stockpile adjustments -################################## - -foodprefix: {enter_sp_config}{Down} -enablefood: {foodprefix}e^ -disablefood: {foodprefix}d^ - -preparedfood: {foodprefix}bu^ -unpreparedfish: {foodprefix}b{Right}{Down 2}p^ -plants: {foodprefix}b{Right}{Down 4}p^ -booze: {foodprefix}b{Right}{Down 5}p{Down}p^ -seeds: {foodprefix}b{Right}{Down 9}p^ -dye: {foodprefix}b{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^ -tallow: {foodprefix}b{Right}{Down 13}{Right}{permitsearch search=tallow}^ -miscliquid: {foodprefix}b{Right}{Down 18}p^ -wax: {foodprefix}b{Right}{Down 15}{Right}{Down 6}&^ - -forbidpreparedfood: {foodprefix}u^ -forbidunpreparedfish: {foodprefix}{Right}{Down 2}f^ -forbidplants: {foodprefix}{Right}{Down 4}f^ -forbidbooze: {foodprefix}{Right}{Down 5}f{Down}f^ -forbidseeds: {foodprefix}{Right}{Down 9}f^ -forbiddye: {foodprefix}{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^ -forbidtallow: {foodprefix}{Right}{Down 13}{Right}{forbidsearch search=tallow}^ -forbidmiscliquid: {foodprefix}{Right}{Down 18}f^ -forbidwax: {foodprefix}{Right}{Down 15}{Right}{Down 6}&^ - -permitpreparedfood: {forbidpreparedfood} -permitunpreparedfish: {foodprefix}{Right}{Down 2}p^ -permitplants: {foodprefix}{Right}{Down 4}p^ -permitbooze: {foodprefix}{Right}{Down 5}p{Down}p^ -permitseeds: {foodprefix}{Right}{Down 9}p^ -permitdye: {forbiddye} -permittallow: {foodprefix}{Right}{Down 13}{Right}{permitsearch search=tallow}^ -permitmiscliquid: {foodprefix}{Right}{Down 18}p^ -permitwax: {forbidwax} - -# the next two aliases are for compatibility with previous implementations of -# Quickfort and are not documented. -# enables everything but seeds -noseeds: {disablefood}{enablefood}{forbidseeds} -# enables all food except for the types listed above -food: {noseeds}{forbidpreparedfood}{forbidunpreparedfish}{forbidplants}{forbidbooze}{forbiddye}{forbidtallow}{forbidmiscliquid} - - -################################## -# furniture stockpile adjustments -################################## - -furnitureprefix: {enter_sp_config}{Down 2} -enablefurniture: {furnitureprefix}e^ -disablefurniture: {furnitureprefix}d^ - -pots: {furnitureprefix}de{Right}f{Right}{Up 5}&^ -bags: {furnitureprefix}de{Right}f{Right}{Up 10}&{Left}{Down}f{Down}f{Down}f{Right}{Down}&{Down 6}&{Down}&{Down 6}&^ -buckets: {furnitureprefix}de{Right}f{Right}{Up 12}&^ -sand: {furnitureprefix}de{Right}f{Right}{Up}&^ - -forbidpots: {furnitureprefix}{Right 2}{Up 5}&^ -forbidbuckets: {furnitureprefix}{Right 2}{Up 12}&^ -forbidsand: {furnitureprefix}{Right 2}{Up}&^ - -permitpots: {forbidpots} -permitbuckets: {forbidbuckets} -permitsand: {forbidsand} - -masterworkfurniture: {masterworkonly prefix={furnitureprefix}} -artifactfurniture: {artifactonly prefix={furnitureprefix}} - -forbidmasterworkfurniture: {togglemasterwork prefix={furnitureprefix}} -forbidartifactfurniture: {toggleartifact prefix={furnitureprefix}} - -permitmasterworkfurniture: {togglemasterwork prefix={furnitureprefix}} -permitartifactfurniture: {toggleartifact prefix={furnitureprefix}} - - -########################################### -# corpses and refuse stockpile adjustments -########################################### - -corpsesprefix: {enter_sp_config}{Down 3} -enablecorpses: {corpsesprefix}e^ -disablecorpses: {corpsesprefix}d{Up}d^ - -refuseprefix: {enter_sp_config}{Down 4} -enablerefuse: {refuseprefix}e^ -disablerefuse: {refuseprefix}d^ - -corpses: {refuseprefix}b{Right}{Down}p^ -rawhides: {refuseprefix}b{Right 2}{Down}&^ -tannedhides: {refuseprefix}b{Right 2}{Down 53}&^ -skulls: {refuseprefix}b{Right}{Down 3}p^ -bones: {refuseprefix}b{Right}{Down 4}p^ -shells: {refuseprefix}b{Right}{Down 5}p^ -teeth: {refuseprefix}b{Right}{Down 6}p^ -horns: {refuseprefix}b{Right}{Down 7}p^ -hair: {refuseprefix}b{Right}{Down 8}p^ -usablehair: {refuseprefix}b{Right}{Down 8}{Right}{togglesearch search=sheep}{togglesearch search=llama}{togglesearch search=alpaca}{togglesearch search=troll}^ -craftrefuse: {skulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permitusablehair} - -forbidcorpses: {refuseprefix}{Right}{Down}f^ -forbidrawhides: {refuseprefix}{Right 2}{Down}&^ -forbidtannedhides: {refuseprefix}{Right 2}{Down 53}&^ -forbidskulls: {refuseprefix}{Right}{Down 3}f^ -forbidbones: {refuseprefix}{Right}{Down 4}f^ -forbidshells: {refuseprefix}{Right}{Down 5}f^ -forbidteeth: {refuseprefix}{Right}{Down 6}f^ -forbidhorns: {refuseprefix}{Right}{Down 7}f^ -forbidhair: {refuseprefix}{Right}{Down 8}f^ -forbidusablehair: {refuseprefix}{Right}{Down 8}{Right}{forbidsearch search=sheep}{forbidsearch search=llama}{forbidsearch search=alpaca}{forbidsearch search=troll}^ -forbidcraftrefuse: {forbidskulls}{forbidbones}{forbidshells}{forbidteeth}{forbidhorns}{forbidusablehair} - -permitcorpses: {refuseprefix}{Right}{Down}p^ -permitrawhides: {forbidrawhides} -permittannedhides: {forbidtannedhides} -permitskulls: {refuseprefix}{Right}{Down 3}p^ -permitbones: {refuseprefix}{Right}{Down 4}p^ -permitshells: {refuseprefix}{Right}{Down 5}p^ -permitteeth: {refuseprefix}{Right}{Down 6}p^ -permithorns: {refuseprefix}{Right}{Down 7}p^ -permithair: {refuseprefix}{Right}{Down 8}p^ -permitusablehair: {refuseprefix}{Right}{Down 8}{Right}{permitsearch search=sheep}{permitsearch search=llama}{permitsearch search=alpaca}{permitsearch search=troll}^ -permitcraftrefuse: {permitskulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permitusablehair} - - -################################## -# stone stockpile adjustments -################################## - -stoneprefix: {enter_sp_config}{Down 5} -enablestone: {stoneprefix}e^ -disablestone: {stoneprefix}d^ - -metal: {stoneprefix}b{Right}p^ -iron: {stoneprefix}b{Right}{Right}&{Down}&{Down 13}&^ -economic: {stoneprefix}b{Right}{Down}p^ -flux: {stoneprefix}b{Right}{Down}{Right}{togglesequence 4}{Down 4}&^ -plaster: {stoneprefix}b{Right}{Down}{Right}{Down 6}&{Down 3}{togglesequence 3}^ -coalproducing: {stoneprefix}b{Right}{Down}{Right}{Down 4}{togglesequence 2}^ -otherstone: {stoneprefix}b{Right}{Down 2}p^ -bauxite: {stoneprefix}b{Right}{Down 2}{Right}{Down 42}&^ -clay: {stoneprefix}b{Right}{Down 3}p^ - -forbidmetal: {stoneprefix}{Right}f^ -forbidiron: {stoneprefix}{Right}{Right}&{Down}&{Down 13}&^ -forbideconomic: {stoneprefix}{Right}{Down}f^ -forbidflux: {stoneprefix}{Right}{Down}{Right}{togglesequence 4}{Down 4}&^ -forbidplaster: {stoneprefix}{Right}{Down}{Right}{Down 6}&{Down 3}{togglesequence 3}^ -forbidcoalproducing: {stoneprefix}{Right}{Down}{Right}{Down 4}{togglesequence 2}^ -forbidotherstone: {stoneprefix}{Right}{Down 2}f^ -forbidbauxite: {stoneprefix}{Right}{Down 2}{Right}{Down 42}&^ -forbidclay: {stoneprefix}{Right}{Down 3}f^ - -permitmetal: {stoneprefix}{Right}p^ -permitiron: {forbidiron} -permiteconomic: {stoneprefix}{Right}{Down}p^ -permitflux: {forbidflux} -permitplaster: {forbidplaster} -permitcoalproducing: {forbidcoalproducing} -permitotherstone: {stoneprefix}{Right}{Down 2}p^ -permitbauxite: {forbidbauxite} -permitclay: {stoneprefix}{Right}{Down 3}p^ - - -################################## -# ammo stockpile adjustments -################################## - -ammoprefix: {enter_sp_config}{Down 6} -enableammo: {ammoprefix}e^ -disableammo: {ammoprefix}d^ - -bolts: {ammoprefix}a{Right 2}f&^ - -forbidmetalbolts: {ammoprefix}{Right}{Down}f^ -forbidwoodenbolts: {ammoprefix}{Right}{Down 2}{Right}&^ -forbidbonebolts: {ammoprefix}{Right}{Down 2}{Right}{Down}&^ - -masterworkammo: {masterworkonly prefix={ammoprefix}} -artifactammo: {artifactonly prefix={ammoprefix}} - -forbidmasterworkammo: {togglemasterwork prefix={ammoprefix}} -forbidartifactammo: {toggleartifact prefix={ammoprefix}} - -permitmasterworkammo: {togglemasterwork prefix={ammoprefix}} -permitartifactammo: {toggleartifact prefix={ammoprefix}} - - -################################## -# bar stockpile adjustments -################################## - -barsprefix: {enter_sp_config}{Down 8} -enablebars: {barsprefix}e^ -disablebars: {barsprefix}d^ - -bars: {barsprefix}b{Right}p{Down}p^ -metalbars: {barsprefix}b{Right}p^ -ironbars: {barsprefix}b{Right 2}&^ -steelbars: {barsprefix}b{Right 2}{Down 8}&^ -pigironbars: {barsprefix}b{Right 2}{Down 9}&^ -otherbars: {barsprefix}b{Right}{Down}p^ -coal: {barsprefix}b{Right}{Down}{Right}&^ -potash: {barsprefix}b{Right}{Down}{Right}{Down}&^ -ash: {barsprefix}b{Right}{Down}{Right}{Down 2}&^ -pearlash: {barsprefix}b{Right}{Down}{Right}{Down 3}&^ -soap: {barsprefix}b{Right}{Down}{Right}{Down 4}&^ -blocks: {barsprefix}b{Down 2}p{Down}p{Down}p^ - -forbidbars: {barsprefix}{Right}f{Down}f^ -forbidmetalbars: {barsprefix}{Right}f^ -forbidironbars: {barsprefix}{Right 2}&^ -forbidsteelbars: {barsprefix}{Right 2}{Down 8}&^ -forbidpigironbars: {barsprefix}{Right 2}{Down 9}&^ -forbidotherbars: {barsprefix}{Right}{Down}f^ -forbidcoal: {barsprefix}{Right}{Down}{Right}&^ -forbidpotash: {barsprefix}{Right}{Down}{Right}{Down}&^ -forbidash: {barsprefix}{Right}{Down}{Right}{Down 2}&^ -forbidpearlash: {barsprefix}{Right}{Down}{Right}{Down 3}&^ -forbidsoap: {barsprefix}{Right}{Down}{Right}{Down 4}&^ -forbidblocks: {barsprefix}{Down 2}f{Down}f{Down}f^ - - -################################## -# gem stockpile adjustments -################################## - -gemsprefix: {enter_sp_config}{Down 9} -enablegems: {gemsprefix}e^ -disablegems: {gemsprefix}d^ - -roughgems: {gemsprefix}b{Right}p^ -roughglass: {gemsprefix}b{Right}{Down}p^ -cutgems: {gemsprefix}b{Right}{Down 2}p^ -cutglass: {gemsprefix}b{Right}{Down 3}p^ -cutstone: {gemsprefix}b{Right}{Down 4}p^ - -forbidroughgems: {gemsprefix}{Right}f^ -forbidroughglass: {gemsprefix}{Right}{Down}f^ -forbidcutgems: {gemsprefix}{Right}{Down 2}f^ -forbidcutglass: {gemsprefix}{Right}{Down 3}f^ -forbidcutstone: {gemsprefix}{Right}{Down 4}f^ - - -####################################### -# finished goods stockpile adjustments -####################################### - -finishedgoodsprefix: {enter_sp_config}{Down 10} -enablefinishedgoods: {finishedgoodsprefix}e^ -disablefinishedgoods: {finishedgoodsprefix}d^ - -crafts: {finishedgoodsprefix}{Right}f{Right}{Down 9}{togglesequence 9}^ -goblets: {finishedgoodsprefix}{Right}f{Right}{Down 2}&^ -jugs: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down 2}f{Down}f{Down}f^ -stonetools: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down 2}f{Down}f{Down}f^ -woodentools: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down}f{Down}f{Down}f{Down}f{Right}&^ - -forbidcrafts: {finishedgoodsprefix}{Right 2}{Down 9}{togglesequence 9}^ -forbidgoblets: {finishedgoodsprefix}{Right 2}{Down 2}&^ - -permitcrafts: {forbidcrafts} -permitgoblets: {forbidgoblets} - -masterworkfinishedgoods: {masterworkonly prefix={finishedgoodsprefix}} -artifactfinishedgoods: {artifactonly prefix={finishedgoodsprefix}} - -forbidmasterworkfinishedgoods: {togglemasterwork prefix={finishedgoodsprefix}} -forbidartifactfinishedgoods: {toggleartifact prefix={finishedgoodsprefix}} - -permitmasterworkfinishedgoods: {togglemasterwork prefix={finishedgoodsprefix}} -permitartifactfinishedgoods: {toggleartifact prefix={finishedgoodsprefix}} - - -################################## -# cloth -################################## - -clothprefix: {enter_sp_config}{Down 12} -enablecloth: {clothprefix}e^ -disablecloth: {clothprefix}d^ - -thread: {clothprefix}b{Right}p{Down}p{Down}p^ -adamantinethread: {clothprefix}b{Right}{Down 3}p^ -cloth: {clothprefix}b{Right}{Down 4}p{Down}p{Down}p^ -adamantinecloth: {clothprefix}b{Right}{Up}p^ - -forbidthread: {clothprefix}{Right}f{Down}f{Down}f^ -forbidadamantinethread: {clothprefix}{Right}{Down 3}f^ -forbidcloth: {clothprefix}{Right}{Down 4}f{Down}f{Down}f^ -forbidadamantinecloth: {clothprefix}{Right}{Up}f^ - -permitthread: {clothprefix}{Right}p{Down}p{Down}p^ -permitadamantinethread: {clothprefix}{Right}{Down 3}p^ -permitcloth: {clothprefix}{Right}{Down 4}p{Down}p{Down}p^ -permitadamantinecloth: {clothprefix}{Right}{Up}p^ - -################################## -# weapon stockpile adjustments -################################## - -weaponsprefix: {enter_sp_config}{Down 14} -enableweapons: {weaponsprefix}e^ -disableweapons: {weaponsprefix}d^ - -metalweapons: {forbidtrapcomponents}{forbidstoneweapons}{forbidotherweapons} -ironweapons: {metalweapons}{forbidmetalweapons}{permitironweapons} -bronzeweapons: {metalweapons}{forbidmetalweapons}{permitbronzeweapons} -copperweapons: {metalweapons}{forbidmetalweapons}{permitcopperweapons} -steelweapons: {metalweapons}{forbidmetalweapons}{permitsteelweapons} - -forbidweapons: {weaponsprefix}{Right}f^ -forbidtrapcomponents: {weaponsprefix}{Right}{Down}f^ -forbidmetalweapons: {weaponsprefix}{Right}{Down 2}f^ -forbidstoneweapons: {weaponsprefix}{Right}{Down 3}f^ -forbidotherweapons: {weaponsprefix}{Right}{Down 4}f^ -forbidironweapons: {weaponsprefix}{Right}{Down 2}{Right}&^ -forbidbronzeweapons: {weaponsprefix}{Right}{Down 2}{Right}{Down 6}&^ -forbidcopperweapons: {weaponsprefix}{Right}{Down 2}{Right}{Down 3}&^ -forbidsteelweapons: {weaponsprefix}{Right}{Down 2}{Right}{Down 8}&^ - -permitweapons: {weaponsprefix}{Right}p^ -permittrapcomponents: {weaponsprefix}{Right}{Down}p^ -permitmetalweapons: {weaponsprefix}{Right}{Down 2}p^ -permitstoneweapons: {weaponsprefix}{Right}{Down 3}p^ -permitotherweapons: {weaponsprefix}{Right}{Down 4}p^ -permitironweapons: {forbidironweapons} -permitbronzeweapons: {forbidbronzeweapons} -permitcopperweapons: {forbidcopperweapons} -permitsteelweapons: {forbidsteelweapons} - -masterworkweapons: {masterworkonly prefix={weaponsprefix}} -artifactweapons: {artifactonly prefix={weaponsprefix}} - -forbidmasterworkweapons: {togglemasterwork prefix={weaponsprefix}} -forbidartifactweapons: {toggleartifact prefix={weaponsprefix}} - -permitmasterworkweapons: {togglemasterwork prefix={weaponsprefix}} -permitartifactweapons: {toggleartifact prefix={weaponsprefix}} - - -################################## -# armor stockpile adjustments -################################## - -armorprefix: {enter_sp_config}{Down 15} -enablearmor: {armorprefix}e^ -disablearmor: {armorprefix}d^ - -metalarmor: {forbidotherarmor} -otherarmor: {forbidmetalarmor} -ironarmor: {metalarmor}{forbidmetalarmor}{permitironarmor} -bronzearmor: {metalarmor}{forbidmetalarmor}{permitbronzearmor} -copperarmor: {metalarmor}{forbidmetalarmor}{permitcopperarmor} -steelarmor: {metalarmor}{forbidmetalarmor}{permitsteelarmor} - -forbidmetalarmor: {armorprefix}{Right}{Down 6}f^ -forbidotherarmor: {armorprefix}{Right}{Down 7}f^ -forbidironarmor: {armorprefix}{Right}{Down 6}{Right}&^ -forbidbronzearmor: {armorprefix}{Right}{Down 6}{Right}{Down 6}&^ -forbidcopperarmor: {armorprefix}{Right}{Down 6}{Right}{Down 3}&^ -forbidsteelarmor: {armorprefix}{Right}{Down 6}{Right}{Down 8}&^ - -permitmetalarmor: {armorprefix}{Right}{Down 6}p^ -permitotherarmor: {armorprefix}{Right}{Down 7}p^ -permitironarmor: {forbidironarmor} -permitbronzearmor: {forbidbronzearmor} -permitcopperarmor: {forbidcopperarmor} -permitsteelarmor: {forbidsteelarmor} - -masterworkarmor: {masterworkonly prefix={armorprefix}} -artifactarmor: {artifactonly prefix={armorprefix}} - -forbidmasterworkarmor: {togglemasterwork prefix={armorprefix}} -forbidartifactarmor: {toggleartifact prefix={armorprefix}} - -permitmasterworkarmor: {togglemasterwork prefix={armorprefix}} -permitartifactarmor: {toggleartifact prefix={armorprefix}} - - -################################## -# others -################################## - -coinsprefix: {enter_sp_config}{Down 7} -enablecoins: {coinsprefix}e^ -disablecoins: {coinsprefix}d^ - -leatherprefix: {enter_sp_config}{Down 11} -enableleather: {leatherprefix}e^ -disableleather: {leatherprefix}d^ - -woodprefix: {enter_sp_config}{Down 13} -enablewood: {woodprefix}e^ -disablewood: {woodprefix}d^ - -sheetprefix: {enter_sp_config}{Down 16} -enablesheet: {sheetprefix}e^ -disablesheet: {sheetprefix}d^ diff --git a/docs/plugins/blueprint.rst b/docs/plugins/blueprint.rst index b10921d30..6d2e9154f 100644 --- a/docs/plugins/blueprint.rst +++ b/docs/plugins/blueprint.rst @@ -9,7 +9,7 @@ With ``blueprint``, you can export the structure of a portion of your fortress in a blueprint file that you (or anyone else) can later play back with `gui/quickfort`. -Blueprints are ``.csv`` or ``.xlsx`` files created in the ``blueprints`` +Blueprints are ``.csv`` or ``.xlsx`` files created in the ``dfhack-config/blueprints`` subdirectory of your DF folder. The map area to turn into a blueprint is either selected interactively with the ``gui/blueprint`` command or, if the GUI is not used, starts at the active cursor location and extends right and down for the diff --git a/plugins/blueprint.cpp b/plugins/blueprint.cpp index 3d34f592e..b09c4d497 100644 --- a/plugins/blueprint.cpp +++ b/plugins/blueprint.cpp @@ -46,6 +46,8 @@ using namespace DFHack; DFHACK_PLUGIN("blueprint"); REQUIRE_GLOBAL(world); +static const string BLUEPRINT_USER_DIR = "dfhack-config/blueprints/"; + namespace DFHack { DBG_DECLARE(blueprint,log); } @@ -1091,7 +1093,7 @@ static const char * get_tile_rooms(const df::coord &, const tile_context &ctx) { static bool create_output_dir(color_ostream &out, const blueprint_options &opts) { - string basename = "blueprints/" + opts.name; + string basename = BLUEPRINT_USER_DIR + opts.name; size_t last_slash = basename.find_last_of("/"); string parent_path = basename.substr(0, last_slash); diff --git a/plugins/lua/blueprint.lua b/plugins/lua/blueprint.lua index 718b211e8..375cfc1b4 100644 --- a/plugins/lua/blueprint.lua +++ b/plugins/lua/blueprint.lua @@ -206,7 +206,7 @@ end -- returns the name of the output file for the given context function get_filename(opts, phase, ordinal) - local fullname = 'blueprints/' .. opts.name + local fullname = 'dfhack-config/blueprints/' .. opts.name local _,_,basename = fullname:find('/([^/]+)/?$') if not basename then -- should not happen since opts.name should already be validated From c7a058c308732ea6f0ba01f4343c4c8199f7ebb9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 10 Mar 2023 18:00:10 -0800 Subject: [PATCH 039/439] fix library paths in docs --- docs/guides/quickfort-library-guide.rst | 36 ++++++++++++------------- docs/guides/quickfort-user-guide.rst | 10 +++---- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/guides/quickfort-library-guide.rst b/docs/guides/quickfort-library-guide.rst index 74b384cc0..47d86cd4f 100644 --- a/docs/guides/quickfort-library-guide.rst +++ b/docs/guides/quickfort-library-guide.rst @@ -5,7 +5,7 @@ Quickfort blueprint library =========================== This guide contains a high-level overview of the blueprints available in the -:source:`quickfort blueprint library `. +:source:`quickfort blueprint library `. Each file is hyperlinked to its online version so you can see exactly what the blueprints do before you run them. Also, if you use `gui/quickfort`, you will @@ -18,8 +18,8 @@ Whole fort blueprint sets These files contain the plans for entire fortresses. Each file has one or more help sections that walk you through how to build the fort, step by step. -- :source:`library/dreamfort.csv ` -- :source:`library/quickfortress.csv ` +- :source:`library/dreamfort.csv ` +- :source:`library/quickfortress.csv ` .. _dreamfort: @@ -149,10 +149,10 @@ these ``#dig`` blueprints can only mark undug wall tiles for mining, they are best used underground. They won't do much on the surface, where there aren't many walls. -- :source:`library/layout-helpers/mark_up_left.csv ` -- :source:`library/layout-helpers/mark_up_right.csv ` -- :source:`library/layout-helpers/mark_down_right.csv ` -- :source:`library/layout-helpers/mark_down_left.csv ` +- :source:`library/layout-helpers/mark_up_left.csv ` +- :source:`library/layout-helpers/mark_up_right.csv ` +- :source:`library/layout-helpers/mark_down_right.csv ` +- :source:`library/layout-helpers/mark_down_left.csv ` Bedrooms -------- @@ -161,9 +161,9 @@ These are popular bedroom layouts from the :wiki:`Bedroom design` page on the wiki. Each file has ``#dig``, ``#build``, and ``#query`` blueprints to dig the rooms, build the furniture, and configure the beds as bedrooms, respectively. -- :source:`library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv ` -- :source:`library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv ` -- :source:`library/bedrooms/28-3-Modified_Windmill_Villas.csv ` +- :source:`library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv ` +- :source:`library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv ` +- :source:`library/bedrooms/28-3-Modified_Windmill_Villas.csv ` Tombs ----- @@ -171,8 +171,8 @@ Tombs These blueprints have burial plot layouts for fortress that expect a lot of casualties. -- :source:`library/tombs/Mini_Saracen.csv ` -- :source:`library/tombs/The_Saracen_Crypts.csv ` +- :source:`library/tombs/Mini_Saracen.csv ` +- :source:`library/tombs/The_Saracen_Crypts.csv ` Exploratory mining ------------------ @@ -181,18 +181,18 @@ Several mining patterns to choose from when searching for gems or ores. The patterns can be repeated up or down z-levels (via quickfort's ``--repeat`` commandline option) for exploring through the depths. -- :source:`library/exploratory-mining/tunnels.csv ` -- :source:`library/exploratory-mining/vertical-mineshafts.csv ` -- :source:`library/exploratory-mining/connected-mineshafts.csv ` +- :source:`library/exploratory-mining/tunnels.csv ` +- :source:`library/exploratory-mining/vertical-mineshafts.csv ` +- :source:`library/exploratory-mining/connected-mineshafts.csv ` Miscellaneous ------------- Extra blueprints that are useful in specific situations. -- :source:`library/aquifer_tap.csv ` -- :source:`library/embark.csv ` -- :source:`library/pump_stack.csv ` +- :source:`library/aquifer_tap.csv ` +- :source:`library/embark.csv ` +- :source:`library/pump_stack.csv ` Light aquifer tap ~~~~~~~~~~~~~~~~~ diff --git a/docs/guides/quickfort-user-guide.rst b/docs/guides/quickfort-user-guide.rst index ecee46918..ec416f18f 100644 --- a/docs/guides/quickfort-user-guide.rst +++ b/docs/guides/quickfort-user-guide.rst @@ -27,9 +27,9 @@ written by Joel Thornton, reused here with his permission. For those just looking to apply existing blueprints, check out the `quickfort command's documentation ` for syntax. There are also many -ready-to-use blueprints available in the ``blueprints/library`` subfolder in +ready-to-use blueprints available in the ``hack/data/blueprints`` subfolder in your DFHack installation. Browse them on your computer or -:source:`online `, or run `gui/quickfort` to browse +:source:`online `, or run `gui/quickfort` to browse and apply them to your fort! Before you become an expert at writing blueprints, though, you should know that @@ -248,7 +248,7 @@ You can save a lot of time and effort by using aliases instead of adding all key sequences directly to your blueprints. For more details, check out the `quickfort-alias-guide`. You can also see examples of aliases being used in the query blueprints in the -:source:`DFHack blueprint library `. You can create +:source:`DFHack blueprint library `. You can create your own aliases by adding them to :source:`dfhack-config/quickfort/aliases.txt` in your DFHack folder or you can package them `together with your blueprint files `. @@ -1467,7 +1467,7 @@ Dreamfort organization and packaging ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Dreamfort blueprints are distributed with DFHack as -:source:`one large .csv file `, but +:source:`one large .csv file `, but editing in that format would be frustrating. Instead, the blueprints are edited `online as Google drive spreadsheets `__. @@ -1825,7 +1825,7 @@ Links - `blueprint-library-guide` - :forums:`Quickfort forum thread <176889>` - :issue:`DFHack issue tracker <>` -- :source:`Blueprint library source ` +- :source:`Blueprint library source ` - :source-scripts:`Quickfort source code ` **Related tools:** From f549b7178d015334231b9377e7fb533c53560482 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 12 Mar 2023 15:43:23 -0700 Subject: [PATCH 040/439] update changelog --- docs/changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index b0ed8b981..f0e606856 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,9 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements +- `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory +- `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` +- player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. ## Documentation From 78e0e02f31329c8e48bc41376effc642225e5147 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 12 Mar 2023 15:57:36 -0700 Subject: [PATCH 041/439] update scripts ref --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 5896b316f..b17ca9443 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 5896b316f6ebb3d0abf3316a2ba895c173051b36 +Subproject commit b17ca9443e797431c2f3594556658beea4d7c378 From a8a447c0e1d9e962dec3e4facf4be90cc006281b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 12 Mar 2023 20:02:03 -0700 Subject: [PATCH 042/439] ignore new package directory build output --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9b78fa31f..e24f11252 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ build*/ nix buntu -build/VC2010 #except for the real one !build/ @@ -37,6 +36,7 @@ build/lua build/bin build/depends build/library +build/package build/plugins build/scripts build/install_manifest.txt From 543f9ade0def3b14a4867a6c66ca15036c1277dd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 13 Mar 2023 13:35:12 -0700 Subject: [PATCH 043/439] account for reverse ordering in job_items vector --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 49 ++++++++++++--------- plugins/buildingplan/buildingplan_cycle.cpp | 13 ++++-- plugins/buildingplan/itemfilter.cpp | 13 +++++- plugins/buildingplan/plannedbuilding.cpp | 7 +-- 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 50f586687..91c1168dd 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +-@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings ## Misc Improvements -@ `buildingplan`: can now filter by clay materials diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index b4f3839f4..ba9cbf5fb 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -372,7 +372,7 @@ static command_result do_command(color_ostream &out, vector ¶meters) // static string getBucket(const df::job_item & ji, const PlannedBuilding & pb, int idx) { - if (idx < 0 || (size_t)idx < pb.item_filters.size()) + if (idx < 0 || (size_t)idx >= pb.item_filters.size()) return "INVALID"; std::ostringstream ser; @@ -428,7 +428,7 @@ vector getVectorIds(color_ostream &out, const df::job_it return ret; } - // if the filer is for building material, refer to our global settings for + // if the filter is for building material, refer to our global settings for // which vectors to search if (job_item->flags2.bits.building_material) { @@ -465,10 +465,11 @@ static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb) { return true; } - int num_job_items = job_items.size(); + int num_job_items = (int)job_items.size(); int32_t id = bld->id; for (int job_item_idx = 0; job_item_idx < num_job_items; ++job_item_idx) { - auto job_item = job_items[job_item_idx]; + int rev_jitem_index = num_job_items - (job_item_idx+1); + auto job_item = job_items[rev_jitem_index]; auto bucket = getBucket(*job_item, pb, job_item_idx); // if there are multiple vector_ids, schedule duplicate tasks. after @@ -476,11 +477,11 @@ static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb) { // as invalid for (auto vector_id : pb.vector_ids[job_item_idx]) { for (int item_num = 0; item_num < job_item->quantity; ++item_num) { - tasks[vector_id][bucket].emplace_back(id, job_item_idx); + tasks[vector_id][bucket].emplace_back(id, rev_jitem_index); DEBUG(status,out).print("added task: %s/%s/%d,%d; " "%zu vector(s), %zu filter bucket(s), %zu task(s) in bucket", ENUM_KEY_STR(job_item_vector_id, vector_id).c_str(), - bucket.c_str(), id, job_item_idx, tasks.size(), + bucket.c_str(), id, rev_jitem_index, tasks.size(), tasks[vector_id].size(), tasks[vector_id][bucket].size()); } } @@ -531,17 +532,19 @@ static void printStatus(color_ostream &out) { if (!bld || bld->jobs.size() != 1) continue; auto &job_items = bld->jobs[0]->job_items; - if (job_items.size() != pb.vector_ids.size()) + const size_t num_job_items = job_items.size(); + if (num_job_items != pb.vector_ids.size()) continue; ++bld_count; int job_item_idx = 0; for (auto &vec_ids : pb.vector_ids) { - auto &jitem = job_items[job_item_idx++]; + auto &jitem = job_items[num_job_items - (job_item_idx+1)]; int32_t quantity = jitem->quantity; if (quantity) { counts[get_desc_string(out, jitem, vec_ids)] += quantity; total += quantity; } + ++job_item_idx; } } @@ -692,11 +695,9 @@ static bool hasFilter(color_ostream &out, df::building_type type, int16_t subtyp TRACE(status,out).print("entering hasFilter\n"); BuildingTypeKey key(type, subtype, custom); auto &filters = get_item_filters(out, key); - for (auto &filter : filters.getItemFilters()) { - if (!filter.isEmpty()) - return true; - } - return false; + if (index < 0 || filters.getItemFilters().size() <= (size_t)index) + return false; + return !filters.getItemFilters()[index].isEmpty(); } static void clearFilter(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, int index) { @@ -972,10 +973,13 @@ static bool validate_pb(color_ostream &out, df::building *bld, int index) { static string getDescString(color_ostream &out, df::building *bld, int index) { DEBUG(status,out).print("entering getDescString\n"); if (!validate_pb(out, bld, index)) - return 0; + return "INVALID"; PlannedBuilding &pb = planned_buildings.at(bld->id); - auto &jitem = bld->jobs[0]->job_items[index]; + auto & jitems = bld->jobs[0]->job_items; + const size_t num_job_items = jitems.size(); + int rev_index = num_job_items - (index + 1); + auto &jitem = jitems[rev_index]; return int_to_string(jitem->quantity) + " " + get_desc_string(out, jitem, pb.vector_ids[index]); } @@ -985,7 +989,10 @@ static int getQueuePosition(color_ostream &out, df::building *bld, int index) { return 0; PlannedBuilding &pb = planned_buildings.at(bld->id); - auto &job_item = bld->jobs[0]->job_items[index]; + auto & jitems = bld->jobs[0]->job_items; + const size_t num_job_items = jitems.size(); + int rev_index = num_job_items - (index + 1); + auto &job_item = jitems[rev_index]; if (job_item->quantity <= 0) return 0; @@ -1001,7 +1008,7 @@ static int getQueuePosition(color_ostream &out, df::building *bld, int index) { int bucket_pos = -1; for (auto &task : buckets.at(bucket_id)) { ++bucket_pos; - if (bld->id == task.first && index == task.second) + if (bld->id == task.first && rev_index == task.second) break; } if (bucket_pos++ >= 0) @@ -1018,18 +1025,20 @@ static void makeTopPriority(color_ostream &out, df::building *bld) { PlannedBuilding &pb = planned_buildings.at(bld->id); auto &job_items = bld->jobs[0]->job_items; + const int num_job_items = (int)job_items.size(); - for (int index = 0; index < (int)job_items.size(); ++index) { + for (int index = 0; index < num_job_items; ++index) { + int rev_index = num_job_items - (index + 1); for (auto &vec_id : pb.vector_ids[index]) { if (!tasks.count(vec_id)) continue; auto &buckets = tasks.at(vec_id); - string bucket_id = getBucket(*job_items[index], pb, index); + string bucket_id = getBucket(*job_items[rev_index], pb, index); if (!buckets.count(bucket_id)) continue; auto &bucket = buckets.at(bucket_id); for (auto taskit = bucket.begin(); taskit != bucket.end(); ++taskit) { - if (bld->id == taskit->first && index == taskit->second) { + if (bld->id == taskit->first && rev_index == taskit->second) { auto task_bld_id = taskit->first; auto task_job_item_idx = taskit->second; bucket.erase(taskit); diff --git a/plugins/buildingplan/buildingplan_cycle.cpp b/plugins/buildingplan/buildingplan_cycle.cpp index c08324e8a..41825c7da 100644 --- a/plugins/buildingplan/buildingplan_cycle.cpp +++ b/plugins/buildingplan/buildingplan_cycle.cpp @@ -190,6 +190,8 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, if (!itemPassesScreen(item)) continue; for (auto bucket_it = buckets.begin(); bucket_it != buckets.end(); ) { + TRACE(cycle,out).print("scanning bucket: %s/%s\n", + ENUM_KEY_STR(job_item_vector_id, vector_id).c_str(), bucket_it->first.c_str()); auto & task_queue = bucket_it->second; auto bld = popInvalidTasks(out, task_queue, planned_buildings); if (!bld) { @@ -203,11 +205,14 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, auto & task = task_queue.front(); auto id = task.first; auto job = bld->jobs[0]; + auto & jitems = job->job_items; + const size_t num_filters = jitems.size(); auto filter_idx = task.second; + const int rev_filter_idx = num_filters - (filter_idx+1); auto &pb = planned_buildings.at(id); if (isAccessibleFrom(out, item, job) - && matchesFilters(item, job->job_items[filter_idx], pb.heat_safety, - pb.item_filters[filter_idx]) + && matchesFilters(item, jitems[filter_idx], pb.heat_safety, + pb.item_filters[rev_filter_idx]) && Job::attachJobItem(job, item, df::job_item_ref::Hauled, filter_idx)) { @@ -226,9 +231,9 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, // keep quantity aligned with the actual number of remaining // items so if buildingplan is turned off, the building will // be completed with the correct number of items. - --job->job_items[filter_idx]->quantity; + --jitems[filter_idx]->quantity; task_queue.pop_front(); - if (isJobReady(out, job->job_items)) { + if (isJobReady(out, jitems)) { finalizeBuilding(out, bld); planned_buildings.at(id).remove(out); } diff --git a/plugins/buildingplan/itemfilter.cpp b/plugins/buildingplan/itemfilter.cpp index e9639f281..8e66c3ed7 100644 --- a/plugins/buildingplan/itemfilter.cpp +++ b/plugins/buildingplan/itemfilter.cpp @@ -6,6 +6,7 @@ namespace DFHack { DBG_EXTERN(buildingplan, status); + DBG_EXTERN(buildingplan, cycle); } using std::set; @@ -153,11 +154,19 @@ bool ItemFilter::matches(DFHack::MaterialInfo &material) const { } bool ItemFilter::matches(df::item *item) const { - if (item->getQuality() < min_quality || item->getQuality() > max_quality) + if (item->getQuality() < min_quality || item->getQuality() > max_quality) { + TRACE(cycle).print("item outside of quality range (%d not between %d and %d)\n", + item->getQuality(), min_quality, max_quality); return false; + } - if (decorated_only && !item->hasImprovements()) + if (decorated_only && !item->hasImprovements()) { + TRACE(cycle).print("item needs improvements and doesn't have any\n"); return false; + } + + if (!mat_mask.whole) + return true; auto imattype = item->getActualMaterial(); auto imatindex = item->getActualMaterialIndex(); diff --git a/plugins/buildingplan/plannedbuilding.cpp b/plugins/buildingplan/plannedbuilding.cpp index e678c850f..aef55edc3 100644 --- a/plugins/buildingplan/plannedbuilding.cpp +++ b/plugins/buildingplan/plannedbuilding.cpp @@ -26,9 +26,10 @@ static vector> get_vector_ids(color_ostream &out, if (!bld || bld->jobs.size() != 1) return ret; - auto &job = bld->jobs[0]; - for (auto &jitem : job->job_items) { - ret.emplace_back(getVectorIds(out, jitem)); + auto &jitems = bld->jobs[0]->job_items; + int num_job_items = (int)jitems.size(); + for (int jitem_idx = num_job_items - 1; jitem_idx >= 0; --jitem_idx) { + ret.emplace_back(getVectorIds(out, jitems[jitem_idx])); } return ret; } From 96c7c952cf84ff55cf1dc539f2990f2dcfad04f2 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 14 Mar 2023 07:16:34 +0000 Subject: [PATCH 044/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 751065f42..13514f507 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 751065f42a55504197990f9458826c5f5604bcff +Subproject commit 13514f507b39dc256490d7b387331016e4e2b89f diff --git a/scripts b/scripts index b17ca9443..940e08208 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit b17ca9443e797431c2f3594556658beea4d7c378 +Subproject commit 940e0820877018ddf0e770f8378097fa34f98348 From 039171e01de81a6ebd47b676d61c8964ddeb91e2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 14 Mar 2023 21:36:41 -0700 Subject: [PATCH 045/439] support multiple upright spikes in a spike trap --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 91c1168dd..09ad4dd83 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,6 +37,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes -@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings +-@ `buildingplan`: you can now attach multiple weapons to spike traps ## Misc Improvements -@ `buildingplan`: can now filter by clay materials diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index a45ab8ca0..0554752ca 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -42,6 +42,14 @@ local function is_weapon_trap() and uibs.building_subtype == df.trap_type.WeaponTrap end +local function is_spike_trap() + return uibs.building_type == df.building_type.Weapon +end + +local function is_weapon_or_spike_trap() + return is_weapon_trap() or is_spike_trap() +end + -- adjusted from CycleHotkeyLabel on the planner panel local weapon_quantity = 1 @@ -50,7 +58,7 @@ local function get_quantity(filter, hollow, placement_data) local flags = uibs.plate_info.flags return (flags.units and 1 or 0) + (flags.water and 1 or 0) + (flags.magma and 1 or 0) + (flags.track and 1 or 0) - elseif is_weapon_trap() and filter.vector_id == df.job_item_vector_id.ANY_WEAPON then + elseif (is_weapon_trap() and filter.vector_id == df.job_item_vector_id.ANY_WEAPON) or is_spike_trap() then return weapon_quantity end local quantity = filter.quantity or 1 @@ -334,7 +342,7 @@ function PlannerOverlay:init() key='CUSTOM_T', key_back='CUSTOM_SHIFT_T', label='Num weapons:', - visible=is_weapon_trap, + visible=is_weapon_or_spike_trap, options={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, on_change=function(val) weapon_quantity = val end, }, @@ -697,7 +705,7 @@ function PlannerOverlay:place_building(placement_data, chosen_items) local hollow = self.subviews.hollow:getOptionValue() local subtype = uibs.building_subtype local filters = get_cur_filters() - if is_pressure_plate() then + if is_pressure_plate() or is_spike_trap() then filters[1].quantity = get_quantity(filters[1]) elseif is_weapon_trap() then filters[2].quantity = get_quantity(filters[2]) From 4d8580d9e7284a670756933076cc8822d3e20ae3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 14 Mar 2023 21:55:43 -0700 Subject: [PATCH 046/439] remember "choose items" choice per building type --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 26 +++++++++++++++++++++ plugins/lua/buildingplan/planneroverlay.lua | 6 ++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 91c1168dd..af9dba787 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +-@ `buildingplan`: remember choice per building type for whether the player wants to choose specific items -@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings ## Misc Improvements diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index ba9cbf5fb..ef808c09b 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -55,6 +55,7 @@ static PersistentDataItem config; // for use in counting available materials for the UI static map> mat_cache; static unordered_map, BuildingTypeKeyHash> job_item_cache; +static unordered_map cur_choose_items; static unordered_map cur_heat_safety; static unordered_map cur_item_filters; // building id -> PlannedBuilding @@ -266,6 +267,7 @@ static void clear_state(color_ostream &out) { call_buildingplan_lua(&out, "reload_pens"); planned_buildings.clear(); tasks.clear(); + cur_choose_items.clear(); cur_heat_safety.clear(); cur_item_filters.clear(); for (auto &entry : job_item_cache ) { @@ -890,6 +892,28 @@ static int getMaterialFilter(lua_State *L) { return 1; } +static void setChooseItems(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, bool choose) { + DEBUG(status,out).print("entering setChooseItems\n"); + BuildingTypeKey key(type, subtype, custom); + cur_choose_items[key] = choose; + // no need to reset signal; no change to the state of any other UI element +} + +static int getChooseItems(lua_State *L) { + color_ostream *out = Lua::GetOutput(L); + if (!out) + out = &Core::getInstance().getConsole(); + df::building_type type = (df::building_type)luaL_checkint(L, 1); + int16_t subtype = luaL_checkint(L, 2); + int32_t custom = luaL_checkint(L, 3); + DEBUG(status,*out).print( + "entering getChooseItems building_type=%d subtype=%d custom=%d\n", + type, subtype, custom); + BuildingTypeKey key(type, subtype, custom); + Lua::Push(L, cur_choose_items[key]); + return 1; +} + static void setHeatSafetyFilter(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, int heat) { DEBUG(status,out).print("entering setHeatSafetyFilter\n"); BuildingTypeKey key(type, subtype, custom); @@ -1061,6 +1085,7 @@ DFHACK_PLUGIN_LUA_FUNCTIONS { DFHACK_LUA_FUNCTION(countAvailableItems), DFHACK_LUA_FUNCTION(hasFilter), DFHACK_LUA_FUNCTION(clearFilter), + DFHACK_LUA_FUNCTION(setChooseItems), DFHACK_LUA_FUNCTION(setHeatSafetyFilter), DFHACK_LUA_FUNCTION(setQualityFilter), DFHACK_LUA_FUNCTION(getDescString), @@ -1076,6 +1101,7 @@ DFHACK_PLUGIN_LUA_COMMANDS { DFHACK_LUA_COMMAND(getMaterialMaskFilter), DFHACK_LUA_COMMAND(setMaterialFilter), DFHACK_LUA_COMMAND(getMaterialFilter), + DFHACK_LUA_COMMAND(getChooseItems), DFHACK_LUA_COMMAND(getHeatSafetyFilter), DFHACK_LUA_COMMAND(getQualityFilter), DFHACK_LUA_END diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index a45ab8ca0..0276f3a0d 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -401,6 +401,9 @@ function PlannerOverlay:init() end end end, + on_change=function(choose) + buildingplan.setChooseItems(uibs.building_type, uibs.building_subtype, uibs.custom_type, choose) + end, }, widgets.CycleHotkeyLabel{ view_id='safety', @@ -541,7 +544,6 @@ function PlannerOverlay:onInput(keys) end self.selected = 1 self.subviews.hollow:setOption(false) - self.subviews.choose:setOption(false) self:reset() reset_counts_flag = true return false @@ -627,6 +629,8 @@ function PlannerOverlay:onRenderFrame(dc, rect) if reset_counts_flag then self:reset() + self.subviews.choose:setOption(require('plugins.buildingplan').getChooseItems( + uibs.building_type, uibs.building_subtype, uibs.custom_type)) self.subviews.safety:setOption(require('plugins.buildingplan').getHeatSafetyFilter( uibs.building_type, uibs.building_subtype, uibs.custom_type)) end From 306d300edfbb5595d0a14330fce29096d39566ea Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 14 Mar 2023 22:26:56 -0700 Subject: [PATCH 047/439] persist choose items choice per building type --- plugins/buildingplan/buildingplan.cpp | 7 +++---- plugins/buildingplan/buildingplan.h | 1 + plugins/buildingplan/defaultitemfilters.cpp | 9 ++++++++- plugins/buildingplan/defaultitemfilters.h | 3 +++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index ef808c09b..304b7001e 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -55,7 +55,6 @@ static PersistentDataItem config; // for use in counting available materials for the UI static map> mat_cache; static unordered_map, BuildingTypeKeyHash> job_item_cache; -static unordered_map cur_choose_items; static unordered_map cur_heat_safety; static unordered_map cur_item_filters; // building id -> PlannedBuilding @@ -267,7 +266,6 @@ static void clear_state(color_ostream &out) { call_buildingplan_lua(&out, "reload_pens"); planned_buildings.clear(); tasks.clear(); - cur_choose_items.clear(); cur_heat_safety.clear(); cur_item_filters.clear(); for (auto &entry : job_item_cache ) { @@ -895,7 +893,8 @@ static int getMaterialFilter(lua_State *L) { static void setChooseItems(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, bool choose) { DEBUG(status,out).print("entering setChooseItems\n"); BuildingTypeKey key(type, subtype, custom); - cur_choose_items[key] = choose; + auto &filters = get_item_filters(out, key); + filters.setChooseItems(choose); // no need to reset signal; no change to the state of any other UI element } @@ -910,7 +909,7 @@ static int getChooseItems(lua_State *L) { "entering getChooseItems building_type=%d subtype=%d custom=%d\n", type, subtype, custom); BuildingTypeKey key(type, subtype, custom); - Lua::Push(L, cur_choose_items[key]); + Lua::Push(L, get_item_filters(*out, key).getChooseItems()); return 1; } diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 0d0d5b45f..6aa5e544f 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -27,6 +27,7 @@ enum FilterConfigValues { FILTER_CONFIG_TYPE = 0, FILTER_CONFIG_SUBTYPE = 1, FILTER_CONFIG_CUSTOM = 2, + FILTER_CONFIG_CHOOSE_ITEMS = 3, }; enum BuildingConfigValues { diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index 3c3b2f3a9..e866808f8 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -32,13 +32,14 @@ static int get_max_quality(const df::job_item *jitem) { } DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, const std::vector &jitems) - : key(key) { + : key(key), choose_items(false) { DEBUG(status,out).print("creating persistent data for filter key %d,%d,%d\n", std::get<0>(key), std::get<1>(key), std::get<2>(key)); filter_config = World::AddPersistentData(FILTER_CONFIG_KEY); set_config_val(filter_config, FILTER_CONFIG_TYPE, std::get<0>(key)); set_config_val(filter_config, FILTER_CONFIG_SUBTYPE, std::get<1>(key)); set_config_val(filter_config, FILTER_CONFIG_CUSTOM, std::get<2>(key)); + set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose_items); item_filters.resize(jitems.size()); for (size_t idx = 0; idx < jitems.size(); ++idx) { item_filters[idx].setMaxQuality(get_max_quality(jitems[idx]), true); @@ -48,6 +49,7 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &filter_config, const std::vector &jitems) : key(getKey(filter_config)), filter_config(filter_config) { + choose_items = get_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS); auto &serialized = filter_config.val(); DEBUG(status,out).print("deserializing item filters for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); @@ -60,6 +62,11 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &f item_filters = filters; } +void DefaultItemFilters::setChooseItems(bool choose) { + choose_items = choose; + set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose); +} + void DefaultItemFilters::setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index) { if (index < 0 || item_filters.size() <= (size_t)index) { WARN(status,out).print("invalid index for filter key %d,%d,%d: %d\n", diff --git a/plugins/buildingplan/defaultitemfilters.h b/plugins/buildingplan/defaultitemfilters.h index 4d1d5cbd2..37ebdcaae 100644 --- a/plugins/buildingplan/defaultitemfilters.h +++ b/plugins/buildingplan/defaultitemfilters.h @@ -14,11 +14,14 @@ public: DefaultItemFilters(DFHack::color_ostream &out, BuildingTypeKey key, const std::vector &jitems); DefaultItemFilters(DFHack::color_ostream &out, DFHack::PersistentDataItem &filter_config, const std::vector &jitems); + void setChooseItems(bool choose); void setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index); + bool getChooseItems() const { return choose_items; } const std::vector & getItemFilters() const { return item_filters; } private: DFHack::PersistentDataItem filter_config; + bool choose_items; std::vector item_filters; }; From a578614cdd3c91d2a4f917d1e6f770ddcd886d1e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 14 Mar 2023 22:28:27 -0700 Subject: [PATCH 048/439] update docs --- docs/plugins/buildingplan.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/plugins/buildingplan.rst b/docs/plugins/buildingplan.rst index 8b1256b53..68eb18f69 100644 --- a/docs/plugins/buildingplan.rst +++ b/docs/plugins/buildingplan.rst @@ -151,7 +151,9 @@ or hit :kbd:`i` before placing the building. When you click to place the building, a dialog will come up that allows you choose which items to use. The list is sorted by most recently used materials for that building type by default, but you can change to sort by name or by available quantity by -clicking on the "Sort by" selector or hitting :kbd:`R`. +clicking on the "Sort by" selector or hitting :kbd:`R`. The configuration for +whether you would like to choose specific items is saved per building type and +will be restored when you plan more of that building type. You can select the maximum quantity of a specified item by clicking on the item name or selecting it with the arrow keys and hitting :kbd:`Enter`. You can From ba3911718bcdd85cb44a40457577b00375e38486 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 15 Mar 2023 07:14:31 +0000 Subject: [PATCH 049/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 940e08208..8bf468565 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 940e0820877018ddf0e770f8378097fa34f98348 +Subproject commit 8bf4685655e9be3646796cf203f40045f3e263c3 From c47f0687696778cb63d4289d0f0e2f5112e3fc22 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 00:28:18 -0700 Subject: [PATCH 050/439] add Lua::Push for sets --- library/include/LuaTools.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/library/include/LuaTools.h b/library/include/LuaTools.h index 689d82260..b19fc31de 100644 --- a/library/include/LuaTools.h +++ b/library/include/LuaTools.h @@ -31,6 +31,7 @@ distribution. #include #include #include +#include #include "df/interfacest.h" @@ -364,6 +365,26 @@ namespace DFHack {namespace Lua { DFHACK_EXPORT int PushPosXYZ(lua_State *state, const df::coord &pos); DFHACK_EXPORT int PushPosXY(lua_State *state, const df::coord2d &pos); + template + void Push(lua_State *L, const std::set &pset) { + lua_createtable(L, 0, pset.size()); + for (auto &entry : pset) { + Lua::Push(L, entry); + Lua::Push(L, true); + lua_settable(L, -3); + } + } + + template + void Push(lua_State *L, const std::unordered_set &pset) { + lua_createtable(L, 0, pset.size()); + for (auto &entry : pset) { + Lua::Push(L, entry); + Lua::Push(L, true); + lua_settable(L, -3); + } + } + template void Push(lua_State *L, const std::map &pmap) { lua_createtable(L, 0, pmap.size()); From 4be5ca4e816fa41694b3085f725e87fb1aa6d41e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 00:29:27 -0700 Subject: [PATCH 051/439] filter by whether a slab is engraved this actually adds an entirely new "specials" filter system that can be extended later for other types --- docs/changelog.txt | 5 ++- plugins/buildingplan/buildingplan.cpp | 40 +++++++++++++++++--- plugins/buildingplan/buildingplan.h | 3 +- plugins/buildingplan/buildingplan_cycle.cpp | 9 ++++- plugins/buildingplan/defaultitemfilters.cpp | 31 +++++++++++++-- plugins/buildingplan/defaultitemfilters.h | 3 ++ plugins/buildingplan/plannedbuilding.cpp | 25 ++++++++++-- plugins/buildingplan/plannedbuilding.h | 5 ++- plugins/lua/buildingplan/filterselection.lua | 9 +++++ plugins/lua/buildingplan/planneroverlay.lua | 31 +++++++++++---- 10 files changed, 135 insertions(+), 26 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4a32c9b57..e4588e328 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,12 +36,13 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes --@ `buildingplan`: remember choice per building type for whether the player wants to choose specific items -@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings --@ `buildingplan`: you can now attach multiple weapons to spike traps ## Misc Improvements -@ `buildingplan`: can now filter by clay materials +-@ `buildingplan`: remember choice per building type for whether the player wants to choose specific items +-@ `buildingplan`: you can now attach multiple weapons to spike traps +-@ `buildingplan`: can now filter by whether a slab is engraved - `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory - `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` - player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 304b7001e..c2b4431d9 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -394,7 +394,7 @@ static string getBucket(const df::job_item & ji, const PlannedBuilding & pb, int ser << "Hc"; size_t num_materials = item_filter.getMaterials().size(); - if (num_materials == 0 || num_materials >= 9 || item_filter.getMaterialMask().whole) + if (num_materials == 0 || num_materials >= 9 || !item_filter.getMaterialMask().whole) ser << "M9"; else ser << "M" << num_materials; @@ -412,6 +412,9 @@ static string getBucket(const df::job_item & ji, const PlannedBuilding & pb, int ser << ':' << item_filter.serialize(); + for (auto &special : pb.specials) + ser << ':' << special; + return ser.str(); } @@ -596,7 +599,7 @@ static bool addPlannedBuilding(color_ostream &out, df::building *bld) { bld->getCustomType())) return false; BuildingTypeKey key(bld->getType(), bld->getSubtype(), bld->getCustomType()); - PlannedBuilding pb(out, bld, get_heat_safety_filter(key), get_item_filters(out, key).getItemFilters()); + PlannedBuilding pb(out, bld, get_heat_safety_filter(key), get_item_filters(out, key)); return registerPlannedBuilding(out, pb); } @@ -621,7 +624,9 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ auto &job_items = get_job_items(out, key); if (index < 0 || job_items.size() <= (size_t)index) return 0; - auto &item_filters = get_item_filters(out, key).getItemFilters(); + auto &item_filters = get_item_filters(out, key); + auto &filters = item_filters.getItemFilters(); + auto &specials = item_filters.getSpecials(); auto &jitem = job_items[index]; auto vector_ids = getVectorIds(out, jitem); @@ -630,13 +635,13 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ for (auto vector_id : vector_ids) { auto other_id = ENUM_ATTR(job_item_vector_id, other, vector_id); for (auto &item : df::global::world->items.other[other_id]) { - ItemFilter filter = item_filters[index]; + ItemFilter filter = filters[index]; if (counts) { // don't filter by material; we want counts for all materials filter.setMaterialMask(0); filter.setMaterials(set()); } - if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter)) { + if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter, specials)) { if (item_ids) item_ids->emplace_back(item->id); if (counts) { @@ -939,6 +944,29 @@ static int getHeatSafetyFilter(lua_State *L) { return 1; } +static void setSpecial(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, string special, bool val) { + DEBUG(status,out).print("entering setSpecial\n"); + BuildingTypeKey key(type, subtype, custom); + auto &filters = get_item_filters(out, key); + filters.setSpecial(special, val); + call_buildingplan_lua(&out, "signal_reset"); +} + +static int getSpecials(lua_State *L) { + color_ostream *out = Lua::GetOutput(L); + if (!out) + out = &Core::getInstance().getConsole(); + df::building_type type = (df::building_type)luaL_checkint(L, 1); + int16_t subtype = luaL_checkint(L, 2); + int32_t custom = luaL_checkint(L, 3); + DEBUG(status,*out).print( + "entering getSpecials building_type=%d subtype=%d custom=%d\n", + type, subtype, custom); + BuildingTypeKey key(type, subtype, custom); + Lua::Push(L, get_item_filters(*out, key).getSpecials()); + return 1; +} + static void setQualityFilter(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, int index, int decorated, int min_quality, int max_quality) { DEBUG(status,out).print("entering setQualityFilter\n"); @@ -1086,6 +1114,7 @@ DFHACK_PLUGIN_LUA_FUNCTIONS { DFHACK_LUA_FUNCTION(clearFilter), DFHACK_LUA_FUNCTION(setChooseItems), DFHACK_LUA_FUNCTION(setHeatSafetyFilter), + DFHACK_LUA_FUNCTION(setSpecial), DFHACK_LUA_FUNCTION(setQualityFilter), DFHACK_LUA_FUNCTION(getDescString), DFHACK_LUA_FUNCTION(getQueuePosition), @@ -1102,6 +1131,7 @@ DFHACK_PLUGIN_LUA_COMMANDS { DFHACK_LUA_COMMAND(getMaterialFilter), DFHACK_LUA_COMMAND(getChooseItems), DFHACK_LUA_COMMAND(getHeatSafetyFilter), + DFHACK_LUA_COMMAND(getSpecials), DFHACK_LUA_COMMAND(getQualityFilter), DFHACK_LUA_END }; diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 6aa5e544f..495602b0b 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -9,6 +9,7 @@ #include "df/job_item_vector_id.h" #include +#include typedef std::deque> Bucket; typedef std::map> Tasks; @@ -49,6 +50,6 @@ void set_config_bool(DFHack::PersistentDataItem &c, int index, bool value); std::vector getVectorIds(DFHack::color_ostream &out, const df::job_item *job_item); bool itemPassesScreen(df::item * item); df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat); -bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter); +bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter, const std::set &special); bool isJobReady(DFHack::color_ostream &out, const std::vector &jitems); void finalizeBuilding(DFHack::color_ostream &out, df::building *bld); diff --git a/plugins/buildingplan/buildingplan_cycle.cpp b/plugins/buildingplan/buildingplan_cycle.cpp index 41825c7da..803f1f130 100644 --- a/plugins/buildingplan/buildingplan_cycle.cpp +++ b/plugins/buildingplan/buildingplan_cycle.cpp @@ -10,6 +10,7 @@ #include "df/building_design.h" #include "df/item.h" +#include "df/item_slabst.h" #include "df/job.h" #include "df/map_block.h" #include "df/world.h" @@ -58,7 +59,7 @@ df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety h return jitem; } -bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter) { +bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter, const std::set &specials) { // check the properties that are not checked by Job::isSuitableItem() if (job_item->item_type > -1 && job_item->item_type != item->getType()) return false; @@ -77,6 +78,10 @@ bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety h && !item->hasToolUse(job_item->has_tool_use)) return false; + if (item->getType() == df::item_type::SLAB && specials.count("engraved") + && static_cast(item)->engraving_type != df::slab_engraving_type::Memorial) + return false; + df::job_item jitem = getJobItemWithHeatSafety(job_item, heat); return Job::isSuitableItem( @@ -212,7 +217,7 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, auto &pb = planned_buildings.at(id); if (isAccessibleFrom(out, item, job) && matchesFilters(item, jitems[filter_idx], pb.heat_safety, - pb.item_filters[rev_filter_idx]) + pb.item_filters[rev_filter_idx], pb.specials) && Job::attachJobItem(job, item, df::job_item_ref::Hauled, filter_idx)) { diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index e866808f8..8af74eff2 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -31,6 +31,13 @@ static int get_max_quality(const df::job_item *jitem) { return df::item_quality::Masterful; } +static string serialize(const std::vector &item_filters, const std::set &specials) { + std::ostringstream out; + out << serialize_item_filters(item_filters); + out << "|" << join_strings(",", specials); + return out.str(); +} + DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, const std::vector &jitems) : key(key), choose_items(false) { DEBUG(status,out).print("creating persistent data for filter key %d,%d,%d\n", @@ -44,22 +51,30 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, for (size_t idx = 0; idx < jitems.size(); ++idx) { item_filters[idx].setMaxQuality(get_max_quality(jitems[idx]), true); } - filter_config.val() = serialize_item_filters(item_filters); + filter_config.val() = serialize(item_filters, specials); } DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &filter_config, const std::vector &jitems) : key(getKey(filter_config)), filter_config(filter_config) { choose_items = get_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS); auto &serialized = filter_config.val(); - DEBUG(status,out).print("deserializing item filters for key %d,%d,%d: %s\n", + DEBUG(status,out).print("deserializing default item filters for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); - std::vector filters = deserialize_item_filters(out, serialized); + std::vector elems; + split_string(&elems, serialized, "|"); + std::vector filters = deserialize_item_filters(out, elems[0]); if (filters.size() != jitems.size()) { WARN(status,out).print("ignoring invalid filters_str for key %d,%d,%d: '%s'\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); item_filters.resize(jitems.size()); } else item_filters = filters; + if (elems.size() > 1) { + vector specs; + split_string(&specs, elems[1], ","); + for (auto & special : specs) + specials.emplace(special); + } } void DefaultItemFilters::setChooseItems(bool choose) { @@ -67,6 +82,14 @@ void DefaultItemFilters::setChooseItems(bool choose) { set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose); } +void DefaultItemFilters::setSpecial(const std::string &special, bool val) { + if (val) + specials.emplace(special); + else + specials.erase(special); + filter_config.val() = serialize(item_filters, specials); +} + void DefaultItemFilters::setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index) { if (index < 0 || item_filters.size() <= (size_t)index) { WARN(status,out).print("invalid index for filter key %d,%d,%d: %d\n", @@ -75,7 +98,7 @@ void DefaultItemFilters::setItemFilter(DFHack::color_ostream &out, const ItemFil } item_filters[index] = filter; - filter_config.val() = serialize_item_filters(item_filters); + filter_config.val() = serialize(item_filters, specials); DEBUG(status,out).print("updated item filter and persisted for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), filter_config.val().c_str()); } diff --git a/plugins/buildingplan/defaultitemfilters.h b/plugins/buildingplan/defaultitemfilters.h index 37ebdcaae..d7ed12a7b 100644 --- a/plugins/buildingplan/defaultitemfilters.h +++ b/plugins/buildingplan/defaultitemfilters.h @@ -16,12 +16,15 @@ public: void setChooseItems(bool choose); void setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index); + void setSpecial(const std::string &special, bool val); bool getChooseItems() const { return choose_items; } const std::vector & getItemFilters() const { return item_filters; } + const std::set & getSpecials() const { return specials; } private: DFHack::PersistentDataItem filter_config; bool choose_items; std::vector item_filters; + std::set specials; }; diff --git a/plugins/buildingplan/plannedbuilding.cpp b/plugins/buildingplan/plannedbuilding.cpp index aef55edc3..60e99e073 100644 --- a/plugins/buildingplan/plannedbuilding.cpp +++ b/plugins/buildingplan/plannedbuilding.cpp @@ -69,19 +69,35 @@ static vector get_item_filters(color_ostream &out, PersistentDataIte return deserialize_item_filters(out, rawstrs[1]); } -static string serialize(const vector> &vector_ids, const vector &item_filters) { +static set get_specials(color_ostream &out, PersistentDataItem &bld_config) { + vector rawstrs; + split_string(&rawstrs, bld_config.val(), "|"); + set ret; + if (rawstrs.size() < 3) + return ret; + vector specials; + split_string(&specials, rawstrs[2], ","); + for (auto & special : specials) + ret.emplace(special); + return ret; +} + +static string serialize(const vector> &vector_ids, const DefaultItemFilters &item_filters) { vector joined; for (auto &vec_list : vector_ids) { joined.emplace_back(join_strings(",", vec_list)); } std::ostringstream out; - out << join_strings(";", joined) << "|" << serialize_item_filters(item_filters); + out << join_strings(";", joined); + out << "|" << serialize_item_filters(item_filters.getItemFilters()); + out << "|" << join_strings(",", item_filters.getSpecials()); return out.str(); } -PlannedBuilding::PlannedBuilding(color_ostream &out, df::building *bld, HeatSafety heat, const vector &item_filters) +PlannedBuilding::PlannedBuilding(color_ostream &out, df::building *bld, HeatSafety heat, const DefaultItemFilters &item_filters) : id(bld->id), vector_ids(get_vector_ids(out, id)), heat_safety(heat), - item_filters(item_filters) { + item_filters(item_filters.getItemFilters()), + specials(item_filters.getSpecials()) { DEBUG(status,out).print("creating persistent data for building %d\n", id); bld_config = World::AddPersistentData(BLD_CONFIG_KEY); set_config_val(bld_config, BLD_CONFIG_ID, id); @@ -95,6 +111,7 @@ PlannedBuilding::PlannedBuilding(color_ostream &out, PersistentDataItem &bld_con vector_ids(deserialize_vector_ids(out, bld_config)), heat_safety((HeatSafety)get_config_val(bld_config, BLD_CONFIG_HEAT)), item_filters(get_item_filters(out, bld_config)), + specials(get_specials(out, bld_config)), bld_config(bld_config) { } // Ensure the building still exists and is in a valid state. It can disappear diff --git a/plugins/buildingplan/plannedbuilding.h b/plugins/buildingplan/plannedbuilding.h index 59dc24a79..703d4246d 100644 --- a/plugins/buildingplan/plannedbuilding.h +++ b/plugins/buildingplan/plannedbuilding.h @@ -1,6 +1,7 @@ #pragma once #include "buildingplan.h" +#include "defaultitemfilters.h" #include "itemfilter.h" #include "Core.h" @@ -21,7 +22,9 @@ public: const std::vector item_filters; - PlannedBuilding(DFHack::color_ostream &out, df::building *bld, HeatSafety heat, const std::vector &item_filters); + const std::set specials; + + PlannedBuilding(DFHack::color_ostream &out, df::building *bld, HeatSafety heat, const DefaultItemFilters &item_filters); PlannedBuilding(DFHack::color_ostream &out, DFHack::PersistentDataItem &bld_config); void remove(DFHack::color_ostream &out); diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index e923c4b5b..84b5c46ea 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -432,6 +432,15 @@ function QualityAndMaterialsPage:refresh() else summary = 'Any ' .. summary end + local specials = buildingplan.getSpecials(uibs.building_type, uibs.building_subtype, uibs.custom_type) + if next(specials) then + local specials_list = {} + for special in pairs(specials) do + table.insert(specials_list, special) + end + summary = summary .. ' [' .. table.concat(specials_list, ', ') .. ']' + end + local quality = buildingplan.getQualityFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.index-1) subviews.decorated:setOption(quality.decorated ~= 0) subviews.min_quality:setOption(quality.min_quality) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index d4a94a01d..df49fe287 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -81,14 +81,18 @@ local function cur_building_has_no_area() return filters and filters[1] and (not filters[1].quantity or filters[1].quantity > 0) end +local function is_construction() + return uibs.building_type == df.building_type.Construction +end + local function is_plannable() return get_cur_filters() and - not (uibs.building_type == df.building_type.Construction - and uibs.building_subtype == df.construction_type.TrackNSEW) + not (is_construction() and + uibs.building_subtype == df.construction_type.TrackNSEW) end -local function is_construction() - return uibs.building_type == df.building_type.Construction +local function is_slab() + return uibs.building_type == df.building_type.Slab end local function is_stairs() @@ -346,6 +350,16 @@ function PlannerOverlay:init() options={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, on_change=function(val) weapon_quantity = val end, }, + widgets.ToggleHotkeyLabel { + view_id='engraved', + frame={t=5, l=4}, + key='CUSTOM_T', + label='Engraved only:', + visible=is_slab, + on_change=function(val) + buildingplan.setSpecial(uibs.building_type, uibs.building_subtype, uibs.custom_type, 'engraved', val) + end, + }, widgets.Label{ frame={b=3, l=17}, text={ @@ -637,10 +651,13 @@ function PlannerOverlay:onRenderFrame(dc, rect) if reset_counts_flag then self:reset() - self.subviews.choose:setOption(require('plugins.buildingplan').getChooseItems( + local buildingplan = require('plugins.buildingplan') + self.subviews.engraved:setOption(buildingplan.getSpecials( + uibs.building_type, uibs.building_subtype, uibs.custom_type).engraved or false) + self.subviews.choose:setOption(buildingplan.getChooseItems( + uibs.building_type, uibs.building_subtype, uibs.custom_type)) + self.subviews.safety:setOption(buildingplan.getHeatSafetyFilter( uibs.building_type, uibs.building_subtype, uibs.custom_type)) - self.subviews.safety:setOption(require('plugins.buildingplan').getHeatSafetyFilter( - uibs.building_type, uibs.building_subtype, uibs.custom_type)) end local selection_pos = self.saved_selection_pos or uibs.selection_pos From 208a3e4ae8b94730c2f4e506aae85fad84b76e21 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 01:19:34 -0700 Subject: [PATCH 052/439] add minimize/restore button --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 25 ++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index e4588e328..0b313c951 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -43,6 +43,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: -@ `buildingplan`: remember choice per building type for whether the player wants to choose specific items -@ `buildingplan`: you can now attach multiple weapons to spike traps -@ `buildingplan`: can now filter by whether a slab is engraved +-@ `buildingplan`: add "minimize" button to temporarily get the planner overlay out of the way if you would rather use the vanilla UI for placing the current building - `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory - `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` - player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index df49fe287..255611178 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -260,12 +260,17 @@ PlannerOverlay.ATTRS{ function PlannerOverlay:init() self.selected = 1 + self.minimized = false + + local function is_minimized() return self.minimized end + local function not_is_minimized() return not self.minimized end local main_panel = widgets.Panel{ view_id='main', frame={t=0, l=0, r=0, h=14}, frame_style=gui.MEDIUM_FRAME, frame_background=gui.CLEAR_PEN, + visible=function() return not self.minimized end, } local function make_is_selected_fn(idx) @@ -451,6 +456,7 @@ function PlannerOverlay:init() frame={t=14, l=0, r=0}, frame_style=gui.MEDIUM_FRAME, frame_background=gui.CLEAR_PEN, + visible=function() return not self.minimized end, } error_panel:addviews{ @@ -565,11 +571,16 @@ function PlannerOverlay:onInput(keys) return true end self.selected = 1 + self.minimized = false self.subviews.hollow:setOption(false) self:reset() reset_counts_flag = true return false end + if keys.CUSTOM_ALT_M then + self.minimized = not self.minimized + return true + end if PlannerOverlay.super.onInput(self, keys) then return true end @@ -579,10 +590,15 @@ function PlannerOverlay:onInput(keys) detect_rect.height = self.subviews.main.frame_rect.height + self.subviews.errors.frame_rect.height detect_rect.y2 = detect_rect.y1 + detect_rect.height - 1 - if self.subviews.main:getMousePos(gui.ViewRect{rect=detect_rect}) - or self.subviews.errors:getMousePos() then - return true + local x, y = self.subviews.main:getMousePos(gui.ViewRect{rect=detect_rect}) + if x or self.subviews.errors:getMousePos() then + if x and x == detect_rect.width-2 and y == 0 then + self.minimized = not self.minimized + return true + end + return not self.minimized end + if self.minimized then return false end if not is_construction() and #uibs.errors > 0 then return true end if dfhack.gui.getMousePos() then if is_choosing_area() or cur_building_has_no_area() then @@ -642,6 +658,9 @@ function PlannerOverlay:render(dc) if not is_plannable() then return end self.subviews.errors:updateLayout() PlannerOverlay.super.render(self, dc) + -- render "minimize" button + dc:seek(self.frame_rect.x2-1, self.frame_rect.y1) + dc:char(string.char(self.minimized and 31 or 30), COLOR_RED) end local ONE_BY_ONE = xy2pos(1, 1) From 0e1909bad1db3a7f6ad9c7c36242c5f2dc0abee4 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 01:42:06 -0700 Subject: [PATCH 053/439] update changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 0b313c951..e32538566 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,6 +37,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes -@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings +-@ `buildingplan`: buildings with different material filters will no longer get "stuck" if one of the filters currently matches no items ## Misc Improvements -@ `buildingplan`: can now filter by clay materials From a4365f47f5ec6ca266ce51e3cc0b33826762befe Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 13:40:08 -0700 Subject: [PATCH 054/439] don't pick up empty specials --- plugins/buildingplan/defaultitemfilters.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index 8af74eff2..fc7dd9f56 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -72,8 +72,10 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &f if (elems.size() > 1) { vector specs; split_string(&specs, elems[1], ","); - for (auto & special : specs) - specials.emplace(special); + for (auto & special : specs) { + if (special.size()) + specials.emplace(special); + } } } From 73e65f2d940f8e3933b93ff17c4761bd295974ee Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 13:40:34 -0700 Subject: [PATCH 055/439] use proper widgets for the minimize button --- plugins/lua/buildingplan/planneroverlay.lua | 30 +++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 255611178..9b3383443 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -262,9 +262,6 @@ function PlannerOverlay:init() self.selected = 1 self.minimized = false - local function is_minimized() return self.minimized end - local function not_is_minimized() return not self.minimized end - local main_panel = widgets.Panel{ view_id='main', frame={t=0, l=0, r=0, h=14}, @@ -273,6 +270,17 @@ function PlannerOverlay:init() visible=function() return not self.minimized end, } + local minimized_panel = widgets.Label{ + frame={t=0, r=1, w=1, h=1}, + text={ + { + text=function() return string.char(self.minimized and 31 or 30) end, + pen=COLOR_RED, + }, + }, + on_click=function() self.minimized = not self.minimized end, + } + local function make_is_selected_fn(idx) return function() return self.selected == idx end end @@ -476,6 +484,7 @@ function PlannerOverlay:init() self:addviews{ main_panel, + minimized_panel, error_panel, } end @@ -582,7 +591,7 @@ function PlannerOverlay:onInput(keys) return true end if PlannerOverlay.super.onInput(self, keys) then - return true + return not self.minimized end if keys._MOUSE_L_DOWN then if is_over_options_panel() then return false end @@ -590,13 +599,9 @@ function PlannerOverlay:onInput(keys) detect_rect.height = self.subviews.main.frame_rect.height + self.subviews.errors.frame_rect.height detect_rect.y2 = detect_rect.y1 + detect_rect.height - 1 - local x, y = self.subviews.main:getMousePos(gui.ViewRect{rect=detect_rect}) - if x or self.subviews.errors:getMousePos() then - if x and x == detect_rect.width-2 and y == 0 then - self.minimized = not self.minimized - return true - end - return not self.minimized + if self.subviews.main:getMousePos(gui.ViewRect{rect=detect_rect}) + or self.subviews.errors:getMousePos() then + return true end if self.minimized then return false end if not is_construction() and #uibs.errors > 0 then return true end @@ -658,9 +663,6 @@ function PlannerOverlay:render(dc) if not is_plannable() then return end self.subviews.errors:updateLayout() PlannerOverlay.super.render(self, dc) - -- render "minimize" button - dc:seek(self.frame_rect.x2-1, self.frame_rect.y1) - dc:char(string.char(self.minimized and 31 or 30), COLOR_RED) end local ONE_BY_ONE = xy2pos(1, 1) From b0f9ad644958485b16ccf2add6151e17ef13dbca Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 14:02:59 -0700 Subject: [PATCH 056/439] add buildingplan reset for resetting all filters --- docs/changelog.txt | 1 + docs/plugins/buildingplan.rst | 5 +++++ plugins/buildingplan/buildingplan.cpp | 18 ++++++++++++++---- plugins/lua/buildingplan.lua | 2 ++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index e32538566..c98d727f6 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -45,6 +45,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: -@ `buildingplan`: you can now attach multiple weapons to spike traps -@ `buildingplan`: can now filter by whether a slab is engraved -@ `buildingplan`: add "minimize" button to temporarily get the planner overlay out of the way if you would rather use the vanilla UI for placing the current building +-@ `buildingplan`: add ``buildingplan reset`` command for resetting all filters to defaults - `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory - `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` - player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. diff --git a/docs/plugins/buildingplan.rst b/docs/plugins/buildingplan.rst index 68eb18f69..378d3b140 100644 --- a/docs/plugins/buildingplan.rst +++ b/docs/plugins/buildingplan.rst @@ -60,6 +60,7 @@ Usage buildingplan [status] buildingplan set (true|false) + buildingplan reset Examples -------- @@ -72,6 +73,10 @@ Examples When finding items to satisfy "building materials" requirements, don't select boulders. Use blocks or logs (if enabled) instead. +``buildingplan reset`` + Reset all settings and filters to their defaults. This command does not affect + existing planned buildings. + .. _buildingplan-settings: Global settings diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index c2b4431d9..d28a0aa31 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -261,13 +261,15 @@ static void validate_config(color_ostream &out, bool verbose = false) { set_config_bool(config, CONFIG_BARS, false); } -static void clear_state(color_ostream &out) { +static void reset_filters(color_ostream &out) { + cur_heat_safety.clear(); + cur_item_filters.clear(); call_buildingplan_lua(&out, "signal_reset"); - call_buildingplan_lua(&out, "reload_pens"); +} + +static void clear_state(color_ostream &out) { planned_buildings.clear(); tasks.clear(); - cur_heat_safety.clear(); - cur_item_filters.clear(); for (auto &entry : job_item_cache ) { for (auto &jitem : entry.second) { delete jitem; @@ -275,6 +277,8 @@ static void clear_state(color_ostream &out) { } job_item_cache.clear(); mat_cache.clear(); + reset_filters(out); + call_buildingplan_lua(&out, "reload_pens"); } DFhackCExport command_result plugin_load_data (color_ostream &out) { @@ -582,6 +586,11 @@ static bool setSetting(color_ostream &out, string name, bool value) { return true; } +static void resetFilters(color_ostream &out) { + DEBUG(status,out).print("entering resetFilters\n"); + reset_filters(out); +} + static bool isPlannableBuilding(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom) { DEBUG(status,out).print("entering isPlannableBuilding\n"); return get_num_filters(out, BuildingTypeKey(type, subtype, custom)) >= 1; @@ -1104,6 +1113,7 @@ static void makeTopPriority(color_ostream &out, df::building *bld) { DFHACK_PLUGIN_LUA_FUNCTIONS { DFHACK_LUA_FUNCTION(printStatus), DFHACK_LUA_FUNCTION(setSetting), + DFHACK_LUA_FUNCTION(resetFilters), DFHACK_LUA_FUNCTION(isPlannableBuilding), DFHACK_LUA_FUNCTION(isPlannedBuilding), DFHACK_LUA_FUNCTION(addPlannedBuilding), diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index d606101be..3492e2ccd 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -42,6 +42,8 @@ function parse_commandline(...) printStatus() elseif command == 'set' and positionals then setSetting(positionals[1], positionals[2] == 'true') + elseif command == 'reset' then + resetFilters() else return false end From d0752764be3783442b297626ed215d0df89e4a64 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 16 Mar 2023 07:15:12 +0000 Subject: [PATCH 057/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 8bf468565..a6f4b8713 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 8bf4685655e9be3646796cf203f40045f3e263c3 +Subproject commit a6f4b87133e4a9f7eefdbd7f6f52d082d1ddbe61 From e95b6805d0f2c07416ab7277c9a05a2e9388ce0e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 16 Mar 2023 19:55:12 -0700 Subject: [PATCH 058/439] comment out heat safety feature --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 7 ++++--- plugins/buildingplan/plannedbuilding.cpp | 3 ++- plugins/lua/buildingplan/planneroverlay.lua | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index c98d727f6..5a668f344 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -57,6 +57,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua ## Removed +-@ `buildingplan`: "heat safety" setting is temporarily removed while we investigate incorrect item matching # 50.07-alpha3 diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index d28a0aa31..b472c7390 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -196,8 +196,9 @@ static void load_material_cache() { } static HeatSafety get_heat_safety_filter(const BuildingTypeKey &key) { - if (cur_heat_safety.count(key)) - return cur_heat_safety.at(key); + // comment out until we can get heat safety working as intended + // if (cur_heat_safety.count(key)) + // return cur_heat_safety.at(key); return HEAT_SAFETY_ANY; } @@ -486,7 +487,7 @@ static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb) { for (int item_num = 0; item_num < job_item->quantity; ++item_num) { tasks[vector_id][bucket].emplace_back(id, rev_jitem_index); DEBUG(status,out).print("added task: %s/%s/%d,%d; " - "%zu vector(s), %zu filter bucket(s), %zu task(s) in bucket", + "%zu vector(s), %zu filter bucket(s), %zu task(s) in bucket\n", ENUM_KEY_STR(job_item_vector_id, vector_id).c_str(), bucket.c_str(), id, rev_jitem_index, tasks.size(), tasks[vector_id].size(), tasks[vector_id][bucket].size()); diff --git a/plugins/buildingplan/plannedbuilding.cpp b/plugins/buildingplan/plannedbuilding.cpp index 60e99e073..2be2cf26f 100644 --- a/plugins/buildingplan/plannedbuilding.cpp +++ b/plugins/buildingplan/plannedbuilding.cpp @@ -109,7 +109,8 @@ PlannedBuilding::PlannedBuilding(color_ostream &out, df::building *bld, HeatSafe PlannedBuilding::PlannedBuilding(color_ostream &out, PersistentDataItem &bld_config) : id(get_config_val(bld_config, BLD_CONFIG_ID)), vector_ids(deserialize_vector_ids(out, bld_config)), - heat_safety((HeatSafety)get_config_val(bld_config, BLD_CONFIG_HEAT)), + //heat_safety((HeatSafety)get_config_val(bld_config, BLD_CONFIG_HEAT)), // until this works + heat_safety(HEAT_SAFETY_ANY), item_filters(get_item_filters(out, bld_config)), specials(get_specials(out, bld_config)), bld_config(bld_config) { } diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 9b3383443..2f0bb7825 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -454,6 +454,7 @@ function PlannerOverlay:init() on_change=function(heat) buildingplan.setHeatSafetyFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, heat) end, + visible=false, -- until we can make this work the way it's intended }, }, }, From 52dec0114f890d03e6ba7e92822208bdebac75ce Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 16 Mar 2023 23:45:22 -0700 Subject: [PATCH 059/439] properly count required bars/cloth and don't output confusing total quantities --- docs/changelog.txt | 2 ++ plugins/showmood.cpp | 24 ++++++------------------ 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 5a668f344..b0ebc87f1 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes -@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings -@ `buildingplan`: buildings with different material filters will no longer get "stuck" if one of the filters currently matches no items +- `showmood` properly count required number of bars and cloth when they aren't the main item for the strange mood ## Misc Improvements -@ `buildingplan`: can now filter by clay materials @@ -49,6 +50,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory - `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` - player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. +-@ `showmood`: clarify how many bars and/or cloth items are actually needed for the mood ## Documentation diff --git a/plugins/showmood.cpp b/plugins/showmood.cpp index 79a733b7b..3ef6a6fb2 100644 --- a/plugins/showmood.cpp +++ b/plugins/showmood.cpp @@ -275,29 +275,17 @@ command_result df_showmood (color_ostream &out, vector & parameters) // count how many items of this type the crafter already collected { int count_got = 0; - int dimension_got = 0; int divisor = 1; - bool has_dims = false; - if (item->item_type == item_type::BAR) { + if (item->item_type == item_type::BAR) divisor = 150; - has_dims = true; - } else if (item->item_type == item_type::CLOTH) { + else if (item->item_type == item_type::CLOTH) divisor = 10000; - has_dims = true; - } - for (size_t j = 0; j < job->items.size(); j++) - { - if(job->items[j]->job_item_idx == int32_t(i)) - { - if (has_dims) - dimension_got += job->items[j]->item->getTotalDimension(); + for (size_t j = 0; j < job->items.size(); j++) { + if (job->items[j]->job_item_idx == int32_t(i)) count_got += 1; - } } - out.print(", got %i of %i", count_got, item->quantity/divisor); - if (has_dims) - out.print(" (%i of %i sub-units)", dimension_got, item->quantity); - out.print("\n"); + out.print(", got %i of %i\n", count_got, + item->quantity < divisor ? item->quantity : item->quantity/divisor); } } } From 41617556b57da89c10368a1ab0657df1fd2a8586 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 17 Mar 2023 07:14:45 +0000 Subject: [PATCH 060/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index a6f4b8713..21aceeb24 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit a6f4b87133e4a9f7eefdbd7f6f52d082d1ddbe61 +Subproject commit 21aceeb241df6ddfb6b276bb64ff6512842c2115 From a9e853188cc986a854ecc325d05b010127511398 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 08:33:55 -0700 Subject: [PATCH 061/439] better minimize widget for the planner panel --- plugins/lua/buildingplan/pens.lua | 5 ++++ plugins/lua/buildingplan/planneroverlay.lua | 26 +++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index d2198706f..973bb7bc6 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -4,6 +4,7 @@ GOOD_TILE_PEN, BAD_TILE_PEN = nil, nil VERT_TOP_PEN, VERT_MID_PEN, VERT_BOT_PEN = nil, nil, nil BUTTON_START_PEN, BUTTON_END_PEN = nil, nil SELECTED_ITEM_PEN = nil +MINIMIZED_LEFT_PEN, MINIMIZED_RIGHT_PEN = nil, nil local to_pen = dfhack.pen.parse @@ -25,6 +26,10 @@ function reload_pens() BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} BUTTON_END_PEN = to_pen{tile=tp(cp_texpos, 15), ch=']', fg=COLOR_YELLOW} SELECTED_ITEM_PEN = to_pen{tile=tp(cp_texpos, 9), ch=string.char(251), fg=COLOR_YELLOW} + + local wb_texpos = dfhack.textures.getWindowBordersTexposStart() + MINIMIZED_LEFT_PEN = to_pen{tile=tp(wb_texpos, 0), ch=199, fg=COLOR_WHITE} + MINIMIZED_RIGHT_PEN = to_pen{tile=tp(wb_texpos, 2), ch=182, fg=COLOR_WHITE} end reload_pens() diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 2f0bb7825..edc258f00 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -270,15 +270,27 @@ function PlannerOverlay:init() visible=function() return not self.minimized end, } - local minimized_panel = widgets.Label{ - frame={t=0, r=1, w=1, h=1}, - text={ - { - text=function() return string.char(self.minimized and 31 or 30) end, - pen=COLOR_RED, + local minimized_panel = widgets.Panel{ + frame={t=0, r=0, w=4, h=1}, + subviews={ + widgets.Label{ + frame={t=0, l=0, w=1, h=1}, + text={{tile=pens.MINIMIZED_LEFT_PEN}}, + visible=function() return self.minimized end, + }, + widgets.Label{ + frame={t=0, l=1, w=2, h=1}, + text=string.char(31)..string.char(30), + text_pen=dfhack.pen.parse{fg=COLOR_BLACK, bg=COLOR_GREY}, + text_hpen=dfhack.pen.parse{fg=COLOR_BLACK, bg=COLOR_WHITE}, + on_click=function() self.minimized = not self.minimized end, + }, + widgets.Label{ + frame={t=0, r=0, w=1, h=1}, + text={{tile=pens.MINIMIZED_RIGHT_PEN}}, + visible=function() return self.minimized end, }, }, - on_click=function() self.minimized = not self.minimized end, } local function make_is_selected_fn(idx) From 79dd5a313f4f23418a835ab7a43ab6cbb49d5553 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 09:55:04 -0700 Subject: [PATCH 062/439] rename Build button to Confirm and update docs --- docs/changelog.txt | 1 + docs/plugins/buildingplan.rst | 23 +++++++++++----------- plugins/lua/buildingplan/itemselection.lua | 12 +++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b0ebc87f1..28f3ab904 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -47,6 +47,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: -@ `buildingplan`: can now filter by whether a slab is engraved -@ `buildingplan`: add "minimize" button to temporarily get the planner overlay out of the way if you would rather use the vanilla UI for placing the current building -@ `buildingplan`: add ``buildingplan reset`` command for resetting all filters to defaults +-@ `buildingplan`: rename "Build" button to "Confirm" on the item selection dialog and change the hotkey from "B" to "C" - `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory - `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` - player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. diff --git a/docs/plugins/buildingplan.rst b/docs/plugins/buildingplan.rst index 378d3b140..ca33106f2 100644 --- a/docs/plugins/buildingplan.rst +++ b/docs/plugins/buildingplan.rst @@ -47,11 +47,14 @@ to build the planned buildings as they are produced, with minimal space dedicated to stockpiles. The DFHack `orders` library can help with setting these manager workorders up for you. -If you do not wish to use the ``buildingplan`` interface, you can turn off the +IF you don't want to use the ``buildingplan`` interface for the building you're +currently trying to place, you can hit :kbd:`Alt`:kbd:`M` or click on the +minimize toggle in the upper left corner of the panel. If you do not wish to +ever use the ``buildingplan`` interface, you can turn off the ``buildingplan.planner`` overlay in `gui/control-panel` (on the "Overlays" -tab). You should not disable the ``buildingplan`` "System service" in -`gui/control-panel` since existing planned buildings in loaded forts will stop -functioning. +tab). Be sure to keep the ``buildingplan`` "System service" itself enabled in +`gui/control-panel` since if you turn it off, existing planned buildings in +saved forts will stop functioning. Usage ----- @@ -119,12 +122,8 @@ tiles selected in the construction area are not appropriate for building. For example, if you want to fill an area with flooring, you can select the entire area, and any tiles with existing buildings or walls will simply be skipped. -Setting heat safety filters -+++++++++++++++++++++++++++ - -If you specifically need the building to be magma- or fire-safe, click on the -"Building safety" button or hit :kbd:`g` until the desired heat safety is -displayed. This filter applies to all items used to construct the building. +For weapon and spike traps, you can choose how many weapons will be included +on this panel. Setting quality and material filters ++++++++++++++++++++++++++++++++++++ @@ -165,8 +164,8 @@ name or selecting it with the arrow keys and hitting :kbd:`Enter`. You can instead select items one at a time by Ctrl-clicking (:kbd:`Shift`:kbd:`Right`) to increment or Ctrl-Shift-clicking (:kbd:`Shift`:kbd:`Left`) to decrement. -Once you are satisfied with your choices, click on the "Build" button or hit -:kbd:`B` to continue building. Note that you don't have to select all the items +Once you are satisfied with your choices, click on the "Confirm" button or hit +:kbd:`C` to continue building. Note that you don't have to select all the items that the building needs. Any remaining items will be automatically chosen from other available items (or future items if not all items are available yet). If there are multiple item types to choose for the current building, one dialog diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index 7e6567d04..8134b9455 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -76,13 +76,13 @@ function ItemSelection:init() }, }, widgets.Label{ - frame={r=0, w=9, t=0, h=3}, + frame={r=0, w=11, t=0, h=3}, text_pen=BUILD_TEXT_PEN, text_hpen=BUILD_TEXT_HPEN, text={ - ' ', NEWLINE, - ' Build ', NEWLINE, - ' ', + ' ', NEWLINE, + ' Confirm ', NEWLINE, + ' ', }, on_click=self:callback('submit'), }, @@ -115,8 +115,8 @@ function ItemSelection:init() }, widgets.HotkeyLabel{ frame={l=22, b=1}, - key='CUSTOM_SHIFT_B', - label='Build', + key='CUSTOM_SHIFT_C', + label='Confirm', auto_width=true, on_activate=self:callback('submit'), }, From 779b9bfb6aca0042439c99e7015b1b2e99128728 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 10:08:16 -0700 Subject: [PATCH 063/439] bump to 50.07-beta1 --- CMakeLists.txt | 2 +- docs/changelog.txt | 20 ++++++++++++++------ library/xml | 2 +- scripts | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 674d9b60d..790e8f59b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "alpha3") +set(DFHACK_RELEASE "beta1") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/docs/changelog.txt b/docs/changelog.txt index 28f3ab904..0a5bfd1a1 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -35,6 +35,20 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins +## Fixes + +## Misc Improvements + +## Documentation + +## API + +## Lua + +## Removed + +# 50.07-beta1 + ## Fixes -@ `buildingplan`: items are now attached correctly to screw pumps and other multi-item buildings -@ `buildingplan`: buildings with different material filters will no longer get "stuck" if one of the filters currently matches no items @@ -53,12 +67,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. -@ `showmood`: clarify how many bars and/or cloth items are actually needed for the mood -## Documentation - -## API - -## Lua - ## Removed -@ `buildingplan`: "heat safety" setting is temporarily removed while we investigate incorrect item matching diff --git a/library/xml b/library/xml index 13514f507..dbba09514 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 13514f507b39dc256490d7b387331016e4e2b89f +Subproject commit dbba095144e631b111d793aae0af2601fffe8e96 diff --git a/scripts b/scripts index 21aceeb24..cffac20a4 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 21aceeb241df6ddfb6b276bb64ff6512842c2115 +Subproject commit cffac20a47c80c73d9084cb1eac0a0063a042f6f From 2bceff76e08a7dab18465747f81ec6fa74c49951 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 10:14:11 -0700 Subject: [PATCH 064/439] changelog fix --- docs/changelog.txt | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 0a5bfd1a1..b565f533f 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -64,7 +64,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: -@ `buildingplan`: rename "Build" button to "Confirm" on the item selection dialog and change the hotkey from "B" to "C" - `blueprint`: now writes blueprints to the ``dfhack-config/blueprints`` directory - `blueprint-library-guide`: library blueprints have moved from ``blueprints`` to ``hack/data/blueprints`` -- player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. +- `blueprint-library-guide`: player-created blueprints should now go in the ``dfhack-config/blueprints`` folder. please move your existing blueprints from ``blueprints`` to ``dfhack-config/blueprints``. you don't need to move the library blueprints -- those can be safely deleted from the old ``blueprints`` directory. -@ `showmood`: clarify how many bars and/or cloth items are actually needed for the mood ## Removed diff --git a/scripts b/scripts index cffac20a4..2baf2a293 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit cffac20a47c80c73d9084cb1eac0a0063a042f6f +Subproject commit 2baf2a293b022e74bda169904182386ed414c84f From 181b930070f02113a4f191bd69bb587ea343a166 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 14:59:39 -0700 Subject: [PATCH 065/439] allow inputs to pass through when minimized --- plugins/lua/buildingplan/planneroverlay.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index edc258f00..19f17ea62 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -603,8 +603,9 @@ function PlannerOverlay:onInput(keys) self.minimized = not self.minimized return true end + if self.minimized then return false end if PlannerOverlay.super.onInput(self, keys) then - return not self.minimized + return true end if keys._MOUSE_L_DOWN then if is_over_options_panel() then return false end @@ -616,7 +617,6 @@ function PlannerOverlay:onInput(keys) or self.subviews.errors:getMousePos() then return true end - if self.minimized then return false end if not is_construction() and #uibs.errors > 0 then return true end if dfhack.gui.getMousePos() then if is_choosing_area() or cur_building_has_no_area() then From 4a3363da9c6f4cf064d9c0aad39962ee61e44f74 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 17:43:58 -0700 Subject: [PATCH 066/439] anchor revflood at a unit's position makes it more user friendly and reduces chance of mishap by placing the cursor in an unforgiving location (like in a closed cavity) --- docs/plugins/reveal.rst | 9 +++++---- plugins/reveal.cpp | 30 +++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/docs/plugins/reveal.rst b/docs/plugins/reveal.rst index bbcc07b6b..2f4ebb5d8 100644 --- a/docs/plugins/reveal.rst +++ b/docs/plugins/reveal.rst @@ -17,7 +17,7 @@ reveal :summary: Switch between reveal and unreveal. .. dfhack-command:: revflood - :summary: Hide everything, then reveal tiles with a path to the cursor. + :summary: Hide everything, then reveal tiles with a path to a unit. .. dfhack-command:: nopause :summary: Disable pausing. @@ -44,9 +44,10 @@ Usage where (for example) you abandoned with the fort revealed and no longer need the saved map data when you load a new fort. ``revflood`` - Hide everything, then reveal tiles with a path to the cursor. This allows - reparing maps that you accidentally saved while they were revealed. Note - that tiles behind constructed walls are also revealed as a workaround for + Hide everything, then reveal tiles with a path to the keyboard cursor (if + enabled) or the selected unit (if a unit is selected) or else a random citizen. + This allows reparing maps that you accidentally saved while they were revealed. + Note that tiles behind constructed walls are also revealed as a workaround for :bug:`1871`. ``nopause 1|0`` Disables pausing (both manual and automatic) with the exception of the pause diff --git a/plugins/reveal.cpp b/plugins/reveal.cpp index 2820c9f54..b8a4ae902 100644 --- a/plugins/reveal.cpp +++ b/plugins/reveal.cpp @@ -12,6 +12,7 @@ #include "modules/World.h" #include "modules/MapCache.h" #include "modules/Gui.h" +#include "modules/Units.h" #include "modules/Screen.h" #include "df/block_square_event_frozen_liquidst.h" @@ -502,21 +503,32 @@ command_result revflood(color_ostream &out, vector & params) out.printerr("Only in proper dwarf mode.\n"); return CR_FAILURE; } - int32_t cx, cy, cz; + df::coord pos; Maps::getSize(x_max,y_max,z_max); - Gui::getCursorCoords(cx,cy,cz); - if(cx == -30000) - { - out.printerr("Cursor is not active. Point the cursor at some empty space you want to be unhidden.\n"); + Gui::getCursorCoords(pos); + if (!pos.isValid()) { + df::unit *unit = Gui::getSelectedUnit(out, true); + if (unit) + pos = Units::getPosition(unit); + } + + if (!pos.isValid()) { + vector citizens; + Units::getCitizens(citizens); + if (citizens.size()) + pos = Units::getPosition(citizens[0]); + } + + if(!pos.isValid()) { + out.printerr("Please select a unit or place the keyboard cursor at some empty space you want to be unhidden.\n"); return CR_FAILURE; } - DFCoord xy ((uint32_t)cx,(uint32_t)cy,cz); MapCache * MCache = new MapCache; - df::tiletype tt = MCache->tiletypeAt(xy); + df::tiletype tt = MCache->tiletypeAt(pos); if(isWallTerrain(tt)) { - out.printerr("Point the cursor at some empty space you want to be unhidden.\n"); + out.printerr("Please select a unit or place the keyboard cursor at some empty space you want to be unhidden.\n"); delete MCache; return CR_FAILURE; } @@ -534,7 +546,7 @@ command_result revflood(color_ostream &out, vector & params) } MCache->trash(); - unhideFlood_internal(MCache, xy); + unhideFlood_internal(MCache, pos); MCache->WriteAll(); delete MCache; From b55a19f85945241934acc961afed8dfdcba836f1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 21:07:25 -0700 Subject: [PATCH 067/439] make the planner panel un-minimizable again --- plugins/lua/buildingplan/planneroverlay.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 19f17ea62..a60b2ebcd 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -603,10 +603,10 @@ function PlannerOverlay:onInput(keys) self.minimized = not self.minimized return true end - if self.minimized then return false end if PlannerOverlay.super.onInput(self, keys) then return true end + if self.minimized then return false end if keys._MOUSE_L_DOWN then if is_over_options_panel() then return false end local detect_rect = copyall(self.frame_rect) From 1984cf44694d2d277dab1439eb1a7f08c191fd14 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 21:07:38 -0700 Subject: [PATCH 068/439] remove unnecessary reload --- plugins/lua/buildingplan.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index 3492e2ccd..077470409 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -114,9 +114,7 @@ end -- for use during development to reload all buildingplan modules function reload_modules() - -- ensure circular deps are refreshed reload('plugins.buildingplan.pens') - reload('plugins.buildingplan') reload('plugins.buildingplan.filterselection') reload('plugins.buildingplan.itemselection') reload('plugins.buildingplan.planneroverlay') From 3e0b37e922beb5ff6cfa691fdefffc7438e05b85 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 23:41:02 -0700 Subject: [PATCH 069/439] fix typo in strangemod docs --- docs/plugins/strangemood.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/strangemood.rst b/docs/plugins/strangemood.rst index a863943e9..12e814c55 100644 --- a/docs/plugins/strangemood.rst +++ b/docs/plugins/strangemood.rst @@ -10,7 +10,7 @@ Usage :: - stangemood [] + strangemood [] Examples -------- From dbe2b6753813d765b3533b267e90bab2de975b23 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 18 Mar 2023 07:13:45 +0000 Subject: [PATCH 070/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 2baf2a293..142477779 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 2baf2a293b022e74bda169904182386ed414c84f +Subproject commit 1424777793b672b105a1785434518233eb0692da From 490ffe19bae7fdfc84e6931f9a717308dd0f549a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 18 Mar 2023 00:48:39 -0700 Subject: [PATCH 071/439] fix typos in buildingplan docs --- docs/plugins/buildingplan.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins/buildingplan.rst b/docs/plugins/buildingplan.rst index ca33106f2..71951f386 100644 --- a/docs/plugins/buildingplan.rst +++ b/docs/plugins/buildingplan.rst @@ -47,9 +47,9 @@ to build the planned buildings as they are produced, with minimal space dedicated to stockpiles. The DFHack `orders` library can help with setting these manager workorders up for you. -IF you don't want to use the ``buildingplan`` interface for the building you're +If you don't want to use the ``buildingplan`` interface for the building you're currently trying to place, you can hit :kbd:`Alt`:kbd:`M` or click on the -minimize toggle in the upper left corner of the panel. If you do not wish to +minimize toggle in the upper right corner of the panel. If you do not wish to ever use the ``buildingplan`` interface, you can turn off the ``buildingplan.planner`` overlay in `gui/control-panel` (on the "Overlays" tab). Be sure to keep the ``buildingplan`` "System service" itself enabled in From 4d1e0da1b87e7871ad0fa9e62bc924bbf52e0b5f Mon Sep 17 00:00:00 2001 From: John Cosker Date: Sun, 19 Mar 2023 18:38:11 -0400 Subject: [PATCH 072/439] add alias for gui/dig -> gui/design and add default hotkey --- data/init/dfhack.keybindings.init | 4 ++++ data/init/dfhack.tools.init | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/data/init/dfhack.keybindings.init b/data/init/dfhack.keybindings.init index 3a94aea2a..8ce0c3696 100644 --- a/data/init/dfhack.keybindings.init +++ b/data/init/dfhack.keybindings.init @@ -153,6 +153,10 @@ keybinding add Ctrl-Shift-Q@dwarfmode gui/quickfort #keybinding add Ctrl-Shift-N@dwarfmode|unit|unitlist|joblist|dungeon_monsterstatus|layer_unit_relationship|item|workshop_profile|layer_noblelist|locations|pets|layer_overall_health|textviewer|reportlist|announcelist|layer_military|layer_unit_health|customize_unit|buildinglist gui/rename #keybinding add Ctrl-Shift-T@dwarfmode|unit|unitlist|joblist|dungeon_monsterstatus|layer_unit_relationship|item|workshop_profile|layer_noblelist|locations|pets|layer_overall_health|textviewer|reportlist|announcelist|layer_military|layer_unit_health|customize_unit "gui/rename unit-profession" +# gui/design +keybinding add Ctrl-D@dwarfmode gui/design + + ##################### # adv mode bindings # diff --git a/data/init/dfhack.tools.init b/data/init/dfhack.tools.init index 50272cfa2..3b7fe7285 100644 --- a/data/init/dfhack.tools.init +++ b/data/init/dfhack.tools.init @@ -137,3 +137,9 @@ enable \ # a replacement for the "load game" screen #gui/load-screen enable + +################### +# Default Aliases # +################### + +alias gui/dig gui/design From e8b9a3acfb68fc1bdefb7dfc299e8bfd781633fe Mon Sep 17 00:00:00 2001 From: John Cosker Date: Sun, 19 Mar 2023 19:43:23 -0400 Subject: [PATCH 073/439] Add default alias for gui/dig -> gui/design --- data/init/dfhack.tools.init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/init/dfhack.tools.init b/data/init/dfhack.tools.init index 3b7fe7285..0ca764e8e 100644 --- a/data/init/dfhack.tools.init +++ b/data/init/dfhack.tools.init @@ -142,4 +142,4 @@ enable \ # Default Aliases # ################### -alias gui/dig gui/design +alias add gui/dig gui/design From c9493dba7eb81c7134de9052ccd3bbf75dc1954a Mon Sep 17 00:00:00 2001 From: John Cosker Date: Sun, 19 Mar 2023 21:50:28 -0400 Subject: [PATCH 074/439] Added entry to Removed.rst --- docs/about/Removed.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index eea11b088..47a7c8e76 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -192,3 +192,9 @@ Replaced with a GUI version: `gui/unit-syndromes`. warn-stuck-trees ================ The corresponding DF :bug:`9252` was fixed in DF 0.44.01. + +.. gui/dig: + +gui/dig +======= +Renamed to gui/design From fadf4cf2cd4acbd49cf74bc3e48b3c67644b3459 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 20 Mar 2023 02:56:57 +0000 Subject: [PATCH 075/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 142477779..3e425ad66 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 1424777793b672b105a1785434518233eb0692da +Subproject commit 3e425ad66a2749c5a3c684cd2cbfaea97921bada From fa67b7c38fe5d957db3130bc129ddbb7bc7b297b Mon Sep 17 00:00:00 2001 From: John Cosker Date: Sun, 19 Mar 2023 22:58:38 -0400 Subject: [PATCH 076/439] fix underscore --- docs/about/Removed.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index 47a7c8e76..c427b3f8d 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -193,7 +193,7 @@ warn-stuck-trees ================ The corresponding DF :bug:`9252` was fixed in DF 0.44.01. -.. gui/dig: +.. _gui/dig: gui/dig ======= From 1ed8c81ac2205c6841c1882a4290007cee14bb00 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 20 Mar 2023 03:19:40 +0000 Subject: [PATCH 077/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 3e425ad66..f3a8d2df7 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 3e425ad66a2749c5a3c684cd2cbfaea97921bada +Subproject commit f3a8d2df72fa10311c4c52471b01216e6da90d9b From bdd4163d982fe007281b736d48db80ea3f2251c2 Mon Sep 17 00:00:00 2001 From: Myk Date: Sun, 19 Mar 2023 20:21:06 -0700 Subject: [PATCH 078/439] Update Removed.rst --- docs/about/Removed.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index c427b3f8d..b7bb1fa3f 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -146,6 +146,12 @@ This script is no longer useful in current DF versions. The script required a binpatch `, which has not been available since DF 0.34.11. +.. _gui/dig: + +gui/dig +======= +Renamed to gui/design + .. _gui/hack-wish: gui/hack-wish @@ -193,8 +199,3 @@ warn-stuck-trees ================ The corresponding DF :bug:`9252` was fixed in DF 0.44.01. -.. _gui/dig: - -gui/dig -======= -Renamed to gui/design From d2f97747ded879559c93cefd7609edf48db92f92 Mon Sep 17 00:00:00 2001 From: Myk Date: Sun, 19 Mar 2023 20:22:05 -0700 Subject: [PATCH 079/439] Update Removed.rst --- docs/about/Removed.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index b7bb1fa3f..01669fac4 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -198,4 +198,3 @@ Replaced with a GUI version: `gui/unit-syndromes`. warn-stuck-trees ================ The corresponding DF :bug:`9252` was fixed in DF 0.44.01. - From 42e21bf946772f986de978b944c09e8858221057 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Mon, 20 Mar 2023 11:00:25 -0500 Subject: [PATCH 080/439] reenable prospector in fort mode fort mode prospect works. embark mode prospect doesn't crash but generates nonsense data, so that code has been disabled for now --- docs/changelog.txt | 1 + plugins/CMakeLists.txt | 2 +- plugins/prospector.cpp | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b565f533f..73e2709b1 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins +- `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. ## Fixes diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 477e83436..8fac3d467 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -140,7 +140,7 @@ dfhack_plugin(pathable pathable.cpp LINK_LIBRARIES lua) #dfhack_plugin(petcapRemover petcapRemover.cpp) #dfhack_plugin(plants plants.cpp) dfhack_plugin(probe probe.cpp) -#dfhack_plugin(prospector prospector.cpp LINK_LIBRARIES lua) +dfhack_plugin(prospector prospector.cpp LINK_LIBRARIES lua) #dfhack_plugin(power-meter power-meter.cpp LINK_LIBRARIES lua) dfhack_plugin(regrass regrass.cpp) add_subdirectory(remotefortressreader) diff --git a/plugins/prospector.cpp b/plugins/prospector.cpp index e75c967dc..86d77e643 100644 --- a/plugins/prospector.cpp +++ b/plugins/prospector.cpp @@ -565,6 +565,10 @@ static command_result embark_prospector(color_ostream &out, df::viewscreen_choose_start_sitest *screen, const prospect_options &options) { + out.printerr("prospector at embark is not currently available.\n"); + return CR_FAILURE; + +/* if (!world || !world->world_data) { out.printerr("World data is not available.\n"); @@ -621,6 +625,7 @@ static command_result embark_prospector(color_ostream &out, out << std::endl << "Warning: the above data is only a very rough estimate." << std::endl; return CR_OK; +*/ } static command_result map_prospector(color_ostream &con, From df93aceb9de1739d2fb0b7fc5c7e7a96c453439a Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 21 Mar 2023 00:54:38 +0000 Subject: [PATCH 081/439] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index dbba09514..a86161521 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit dbba095144e631b111d793aae0af2601fffe8e96 +Subproject commit a86161521427e98d4e814bf4e080e74121edb966 From 5ed1e4ece7036a131f20f4b495e3344eeed6be7d Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 22 Mar 2023 07:13:59 +0000 Subject: [PATCH 082/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index a86161521..0dc8ae877 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit a86161521427e98d4e814bf4e080e74121edb966 +Subproject commit 0dc8ae87746e287538be01f01dc628662e756794 diff --git a/scripts b/scripts index f3a8d2df7..7f388c0c1 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit f3a8d2df72fa10311c4c52471b01216e6da90d9b +Subproject commit 7f388c0c1bf9ed5fa3f7abf1153da54921a93e15 From 959b4b317103dad07d78dcf765f7e7b0ee98e3b7 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Wed, 22 Mar 2023 18:29:47 -0500 Subject: [PATCH 083/439] update tailor `tailor` now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine --- docs/changelog.txt | 1 + plugins/tailor.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 73e2709b1..0abd926d2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,6 +37,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. ## Fixes +- `tailor` now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine ## Misc Improvements diff --git a/plugins/tailor.cpp b/plugins/tailor.cpp index 19237429e..66e54dd60 100644 --- a/plugins/tailor.cpp +++ b/plugins/tailor.cpp @@ -124,7 +124,8 @@ static const MatType M_ADAMANTINE = MatType("adamantine", df::job_material_category::mask_strand, df::armor_general_flags::SOFT); static const std::list all_materials = { M_SILK, M_CLOTH, M_YARN, M_LEATHER, M_ADAMANTINE }; -static std::list material_order = { M_SILK, M_CLOTH, M_YARN, M_LEATHER }; // M_ADAMANTINE is not included by default +static const std::list default_materials = { M_SILK, M_CLOTH, M_YARN, M_LEATHER }; // adamantine not included by default +static std::list material_order = default_materials; static struct BadFlags { uint32_t whole; @@ -191,7 +192,7 @@ public: if (i->flags.whole & badFlags.whole) continue; - if (require_dyed && !i->hasImprovements()) + if (require_dyed && (!i->isDyed())) { // only count dyed std::string d; @@ -589,7 +590,7 @@ static void set_material_order() { material_order.push_back(M_ADAMANTINE); } if (!material_order.size()) - std::copy(all_materials.begin(), all_materials.end(), std::back_inserter(material_order)); + std::copy(default_materials.begin(), default_materials.end(), std::back_inserter(material_order)); } DFhackCExport command_result plugin_load_data (color_ostream &out) { From 29c17b407c7a9f59a7a8d8a74ee7c79fd3d98beb Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 23 Mar 2023 07:13:59 +0000 Subject: [PATCH 084/439] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 0dc8ae877..8b8ac2de0 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 0dc8ae87746e287538be01f01dc628662e756794 +Subproject commit 8b8ac2de03ab5f8e5506864a751933059abfd03e From 03e44f1e7ff9d285e1df5af53f1618b3b6d378af Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 23 Mar 2023 00:25:29 -0700 Subject: [PATCH 085/439] fix initial extended/retracted position for upright spike traps --- docs/changelog.txt | 3 ++- library/modules/Buildings.cpp | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 0abd926d2..d68900d12 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,7 +37,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. ## Fixes -- `tailor` now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine +- `tailor`: now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine +- `buildingplan`: upright spike traps are now placed extended rather than retracted ## Misc Improvements diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 2b6fc8ec8..1d1ba9318 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -68,6 +68,7 @@ using namespace DFHack; #include "df/building_stockpilest.h" #include "df/building_trapst.h" #include "df/building_water_wheelst.h" +#include "df/building_weaponst.h" #include "df/building_wellst.h" #include "df/building_workshopst.h" #include "df/buildings_other_id.h" @@ -591,6 +592,12 @@ df::building *Buildings::allocInstance(df::coord pos, df::building_type type, in obj->gate_flags.bits.closed = false; break; } + case building_type::Weapon: + { + if (VIRTUAL_CAST_VAR(obj, df::building_weaponst, bld)) + obj->gate_flags.bits.closed = false; + break; + } default: break; } From 0b72b42b7e6e202675e2a8d8f98ecf76d50ced39 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 23 Mar 2023 00:59:05 -0700 Subject: [PATCH 086/439] allow metal chests to be melted --- docs/changelog.txt | 1 + plugins/automelt.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 0abd926d2..df909c0b1 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,6 +40,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `tailor` now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine ## Misc Improvements +- `automelt`: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed) ## Documentation diff --git a/plugins/automelt.cpp b/plugins/automelt.cpp index 0cd9e8131..beb4cba35 100644 --- a/plugins/automelt.cpp +++ b/plugins/automelt.cpp @@ -293,7 +293,7 @@ static inline bool can_melt(df::item *item) df::item_type t = item->getType(); - if (t == df::enums::item_type::BOX || t == df::enums::item_type::BAR) + if (t == df::enums::item_type::BAR) return false; for (auto &g : item->general_refs) From 90aed848bb5390278663ffad7b0cdd9fb7d17d85 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 23 Mar 2023 02:17:36 -0700 Subject: [PATCH 087/439] add minimize button to orders overlay panel --- docs/changelog.txt | 1 + docs/plugins/orders.rst | 7 ++- plugins/lua/orders.lua | 100 ++++++++++++++++++++++++++++++---------- 3 files changed, 81 insertions(+), 27 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 2b88261f8..cbc38fab7 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `automelt`: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed) +- `orders`: add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen ## Documentation diff --git a/docs/plugins/orders.rst b/docs/plugins/orders.rst index 6fe159899..08e05c6ca 100644 --- a/docs/plugins/orders.rst +++ b/docs/plugins/orders.rst @@ -48,8 +48,11 @@ is open via an `overlay` widget. There are hotkeys assigned to export, import, sort, and clear. You can also click on the hotkey hints as if they were buttons. Clearing will ask for confirmation before acting. -If you want to change where the hotkey hints appear, you can move them via -`gui/overlay`. +If you want to change where the overlay panel appears, you can move it via +`gui/overlay`. If you just need to get the overlay out of the way temporarily, +for example to read a long description of a historical figure when choosing a +subject for a statue, click on the small arrow in the upper right corner of the +overlay panel. Click on the arrow again to restore the panel. The orders library ------------------ diff --git a/plugins/lua/orders.lua b/plugins/lua/orders.lua index 72bb6185e..6f5bc677a 100644 --- a/plugins/lua/orders.lua +++ b/plugins/lua/orders.lua @@ -46,37 +46,87 @@ OrdersOverlay.ATTRS{ default_enabled=true, viewscreens='dwarfmode/Info/WORK_ORDERS', frame={w=30, h=4}, - frame_style=gui.MEDIUM_FRAME, - frame_background=gui.CLEAR_PEN, } function OrdersOverlay:init() - self:addviews{ - widgets.HotkeyLabel{ - frame={t=0, l=0}, - label='import', - key='CUSTOM_CTRL_I', - on_activate=do_import, - }, - widgets.HotkeyLabel{ - frame={t=1, l=0}, - label='export', - key='CUSTOM_CTRL_E', - on_activate=do_export, - }, - widgets.HotkeyLabel{ - frame={t=0, l=15}, - label='sort', - key='CUSTOM_CTRL_O', - on_activate=do_sort, + self.minimized = false + + local main_panel = widgets.Panel{ + frame={t=0, l=0, r=0, h=4}, + frame_style=gui.MEDIUM_FRAME, + frame_background=gui.CLEAR_PEN, + visible=function() return not self.minimized end, + subviews={ + widgets.HotkeyLabel{ + frame={t=0, l=0}, + label='import', + key='CUSTOM_CTRL_I', + auto_width=true, + on_activate=do_import, + }, + widgets.HotkeyLabel{ + frame={t=1, l=0}, + label='export', + key='CUSTOM_CTRL_E', + auto_width=true, + on_activate=do_export, + }, + widgets.HotkeyLabel{ + frame={t=0, l=15}, + label='sort', + key='CUSTOM_CTRL_O', + auto_width=true, + on_activate=do_sort, + }, + widgets.HotkeyLabel{ + frame={t=1, l=15}, + label='clear', + key='CUSTOM_CTRL_C', + auto_width=true, + on_activate=do_clear, + }, }, - widgets.HotkeyLabel{ - frame={t=1, l=15}, - label='clear', - key='CUSTOM_CTRL_C', - on_activate=do_clear, + } + + local minimized_panel = widgets.Panel{ + frame={t=0, r=0, w=3, h=1}, + subviews={ + widgets.Label{ + frame={t=0, l=0, w=1, h=1}, + text='[', + text_pen=COLOR_RED, + visible=function() return self.minimized end, + }, + widgets.Label{ + frame={t=0, l=1, w=1, h=1}, + text={{text=function() return self.minimized and string.char(31) or string.char(30) end}}, + text_pen=dfhack.pen.parse{fg=COLOR_BLACK, bg=COLOR_GREY}, + text_hpen=dfhack.pen.parse{fg=COLOR_BLACK, bg=COLOR_WHITE}, + on_click=function() self.minimized = not self.minimized end, + }, + widgets.Label{ + frame={t=0, r=0, w=1, h=1}, + text=']', + text_pen=COLOR_RED, + visible=function() return self.minimized end, + }, }, } + + self:addviews{ + main_panel, + minimized_panel, + } +end + +function OrdersOverlay:onInput(keys) + if keys.CUSTOM_ALT_M then + self.minimized = not self.minimized + return true + end + if OrdersOverlay.super.onInput(self, keys) then + return true + end end OVERLAY_WIDGETS = { From a4c9a5116fef314b58101e48a690f847c7a9acff Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 17:15:48 -0700 Subject: [PATCH 088/439] install the stockpiles settings library --- data/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 89abe3aaf..355182bfb 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -10,6 +10,9 @@ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/base_command_counts.json install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/orders/ DESTINATION "${DFHACK_DATA_DESTINATION}/data/orders") +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/stockpiles/ + DESTINATION "${DFHACK_DATA_DESTINATION}/data/stockpiles") + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/art/ DESTINATION "${DFHACK_DATA_DESTINATION}/data/art") From 8c0b59c5486b67b8f9f97c7d194914e710d3070a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 17:16:18 -0700 Subject: [PATCH 089/439] add the stockpiles user data directory --- data/dfhack-config/stockpiles/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 data/dfhack-config/stockpiles/README.md diff --git a/data/dfhack-config/stockpiles/README.md b/data/dfhack-config/stockpiles/README.md new file mode 100644 index 000000000..593d45fb6 --- /dev/null +++ b/data/dfhack-config/stockpiles/README.md @@ -0,0 +1,5 @@ +This folder contains stockpile settings that can be applied by `stockpiles` and +`quickfort` tools. For more information, see: + +* [stockpiles documentation](https://docs.dfhack.org/en/latest/docs/tools/stockpiles.html) +* [quickfort documentation](https://docs.dfhack.org/en/latest/docs/guides/quickfort-user-guide.html) From e21c55d6ffc1d5ac3a0fb608f3eadeb7ab1dd944 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 17:16:42 -0700 Subject: [PATCH 090/439] update stockpiles command and use new data paths --- docs/plugins/stockpiles.rst | 79 +++++--- plugins/lua/stockpiles.lua | 299 ++++++++++-------------------- plugins/stockpiles/stockpiles.cpp | 167 +++++++++-------- 3 files changed, 239 insertions(+), 306 deletions(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 01cd3159b..7ca0c5039 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -1,41 +1,68 @@ -.. _stocksettings: - stockpiles ========== .. dfhack-tool:: - :summary: Import and export stockpile settings. + :summary: Import, export, or modify stockpile settings and features. :tags: fort design productivity stockpiles - :no-command: - -.. dfhack-command:: savestock - :summary: Exports the configuration of the selected stockpile. - -.. dfhack-command:: loadstock - :summary: Imports configuration for the selected stockpile. -Select a stockpile in the UI first to use these commands. +If you are importing or exporting setting and don't want to specify a building +ID, select a stockpile in the UI before running the command. Usage ----- -``savestock `` - Saves the currently highlighted stockpile's settings to a file in your - Dwarf Fortress folder. This file can be used to copy settings between game - saves or players. -``loadstock `` - Loads a saved stockpile settings file and applies it to the currently - selected stockpile. +:: -Filenames with spaces are not supported. Generated materials, divine metals, -etc. are not saved as they are different in every world. + stockpiles [status] + stockpiles list [] + stockpiles export [] + stockpiles import [] + +Exported stockpile settings are saved in the ``dfhack-config/stockpiles`` +folder, where you can view and delete them, if desired. Names can only +contain numbers, letters, periods, underscores, dashes, and spaces. If +the name has spaces, be sure to surround it with double quotes (:kbd:`"`). + +The names of library settings files are all prefixed by the string ``library/``. +You can specify library files explicitly by including the prefix, or you can +just write the short name to use a player-exported file by that name if it +exists, and the library file if it doesn't. Examples -------- -``savestock food`` - Export the stockpile settings for the currently selected stockpile to a - file named ``food.dfstock``. -``loadstock food`` - Set the selected stockpile settings to those saved in the ``food.dfstock`` - file. +``stockpiles`` + Shows the list of all your stockpiles and some relevant statistics. +``stockpiles list`` + Shows the list of previously exported stockpile settings files, including + the stockpile configuration library. +``stockpiles list plants`` + Shows the list of exported stockpile settings files that include the + substring ``plants``. +``stockpiles import library/plants`` + Imports the library ``plants`` settings file into the currently selected + stockpile. +``stockpiles import plants`` + Imports a player-exported settings file named ``plants``, or the library + ``plants`` settings file if a player-exported file by that name doesn't + exist. +``stockpiles export mysettings`` + Export the settings for the currently selected stockpile to a file named + ``dfhack-config/stockpiles/mysettings.dfstock``. + +Options +------- + +``-s``, ``--stockpile `` + Specify a specific stockpile ID instead of using the one currently selected + in the UI. + +.. _stockpiles-library: + +The stockpiles settings library +------------------------------- + +DFHack comes with a library of useful stockpile settings files that are ready +for import: + +TODO: port alias library here diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index ca8c28cd4..723ff97f6 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -1,244 +1,135 @@ local _ENV = mkmodule('plugins.stockpiles') ---[[ +local argparse = require('argparse') - Native functions: +local STOCKPILES_DIR = "dfhack-config/stockpiles"; +local STOCKPILES_LIBRARY_DIR = "hack/data/stockpiles"; - * stockpiles_list_settings(dir_path), list files in directory - * stockpiles_load(file), with full path - * stockpiles_save(file), with full path - * isEnabled() - ---]] --- -function safe_require(module) - local status, module = pcall(require, module) - return status and module or nil +local function get_sp_name(name, num) + if #name > 0 then return name end + return ('Stockpile %d'):format(num) end - -local gui = require 'gui' -local widgets = require('gui.widgets') -local dlg = require('gui.dialogs') -local script = require 'gui.script' -local persist = safe_require('persist-table') - - -function ListFilterDialog(args) - args.text = args.prompt or 'Type or select an option' - args.text_pen = COLOR_WHITE - args.with_filter = true - args.icon_width = 2 - - local choices = {} - - if not args.hide_none then - table.insert(choices, { - icon = '?', text = args.none_caption or 'none', - index = -1, name = -1 - }) +local STATUS_FMT = '%6s %s' +local function print_status() + local sps = df.global.world.buildings.other.STOCKPILE + print(('Current stockpiles: %d'):format(#sps)) + if #sps > 0 then + print() + print(STATUS_FMT:format('ID', 'Name')) + print(STATUS_FMT:format('------', '----------')) end - - local filter = args.item_filter - - for i,v in ipairs(args.items) do - if not filter or filter(v,-1) then - local name = v - local icon - table.insert(choices, { - icon = icon, search_key = string.lower(name), text = name, index = i - }) - end + for _,sp in ipairs(sps) do + print(STATUS_FMT:format(sp.id, get_sp_name(sp.name, sp.stockpile_number))) end +end - args.choices = choices - - if args.on_select then - local cb = args.on_select - args.on_select = function(idx, obj) - return cb(obj.index, args.items[obj.index]) +local function list_dir(path, prefix, filters) + local paths = dfhack.filesystem.listdir_recursive(path, 0, false) + if not paths then + dfhack.printerr(('Cannot find stockpile settings directory: "%s"'):format(path)) + return + end + local normalized_filters = {} + for _,filter in ipairs(filters or {}) do + table.insert(normalized_filters, filter:lower()) + end + for _,v in ipairs(paths) do + local normalized_path = prefix .. v.path:lower() + if v.isdir or not normalized_path:endswith('.dfstock') then goto continue end + normalized_path = normalized_path:sub(1, -9) + if #normalized_filters > 0 then + local matched = false + for _,filter in ipairs(normalized_filters) do + if normalized_path:find(filter, 1, true) then + matched = true + break + end + end + if not matched then goto continue end end + print(('%s%s'):format(prefix, v.path:sub(1, -9))) + ::continue:: end - - return dlg.ListBox(args) end -function showFilterPrompt(title, list, text,item_filter,hide_none) - ListFilterDialog{ - frame_title=title, - items=list, - prompt=text, - item_filter=item_filter, - hide_none=hide_none, - on_select=script.mkresume(true), - on_cancel=script.mkresume(false), - on_close=script.qresume(nil) - }:show() - - return script.wait() +local function list_settings_files(filters) + list_dir(STOCKPILES_DIR, '', filters) + list_dir(STOCKPILES_LIBRARY_DIR, 'library/', filters) end -function init() - if persist == nil then return end - if dfhack.isMapLoaded() then - if persist.GlobalTable.stockpiles == nil then - persist.GlobalTable.stockpiles = {} - persist.GlobalTable.stockpiles['settings_path'] = './stocksettings' - end +local function assert_safe_name(name) + if not name or #name == 0 then + qerror('name missing or empty') end -end - -function tablify(iterableObject) - t={} - for k,v in ipairs(iterableObject) do - t[k] = v~=nil and v or 'nil' + if name:find('[^%a ._-]') then + qerror('name can only contain numbers, letters, periods, underscores, dashes, and spaces') end - return t end -local filename_invalid_regex = '[^A-Za-z0-9 ._-]' - -function valid_filename(filename) - return not filename:match(filename_invalid_regex) +local function get_sp_id(opts) + if opts.id then return opts.id end + local sp = dfhack.gui.getSelectedStockpile() + if sp then return sp.id end + return nil end -function sanitize_filename(filename) - local ret = '' - for i = 1, #filename do - local ch = filename:sub(i, i) - if valid_filename(ch) then - ret = ret .. ch - else - ret = ret .. '-' - end - end - return ret +local function export_stockpile(name, opts) + assert_safe_name(name) + name = STOCKPILES_DIR .. '/' .. name + stockpiles_export(name, get_sp_id(opts)) end -FilenameInputBox = defclass(FilenameInputBox, dlg.InputBox) -function FilenameInputBox:onInput(keys) - if not valid_filename(string.char(keys._STRING or 0)) and not keys.STRING_A000 then - keys._STRING = nil +local function import_stockpile(name, opts) + local is_library = false + if name:startswith('library/') then + name = name:sub(9) + is_library = true end - FilenameInputBox.super.onInput(self, keys) -end - -function showFilenameInputPrompt(title, text, tcolor, input, min_width) - FilenameInputBox{ - frame_title = title, - text = text, - text_pen = tcolor, - input = input, - frame_width = min_width, - on_input = script.mkresume(true), - on_cancel = script.mkresume(false), - on_close = script.qresume(nil) - }:show() - - return script.wait() + assert_safe_name(name) + if not is_library and dfhack.filesystem.exists(STOCKPILES_DIR .. '/' .. name .. '.dfstock') then + name = STOCKPILES_DIR .. '/' .. name + else + name = STOCKPILES_LIBRARY_DIR .. '/' .. name + end + stockpiles_import(name, get_sp_id(opts)) end -function load_settings() - init() - local path = get_path() - local ok, list = pcall(stockpiles_list_settings, path) - if not ok then - show_message_box("Stockpile Settings", "The stockpile settings folder doesn't exist.", true) - return - end - if #list == 0 then - show_message_box("Stockpile Settings", "There are no saved stockpile settings.", true) +local function process_args(opts, args) + if args[1] == 'help' then + opts.help = true return end - local choice_list = {} - for i,v in ipairs(list) do - choice_list[i] = string.gsub(v, "/", "/ ") - choice_list[i] = string.gsub(choice_list[i], "-", " - ") - choice_list[i] = string.gsub(choice_list[i], "_", " ") - end - - script.start(function() - local ok2,index,name=showFilterPrompt('Stockpile Settings', choice_list, 'Choose a stockpile', function(item) return true end, true) - if ok2 then - local filename = list[index]; - stockpiles_load(path..'/'..filename) - end - end) -end - -function save_settings(stockpile) - init() - script.start(function() - local suggested = stockpile.name - if #suggested == 0 then - suggested = 'Stock1' - end - suggested = sanitize_filename(suggested) - local path = get_path() - local sok,filename = showFilenameInputPrompt('Stockpile Settings', 'Enter filename', COLOR_WHITE, suggested) - if sok then - if filename == nil or filename == '' or not valid_filename(filename) then - script.showMessage('Stockpile Settings', 'Invalid File Name', COLOR_RED) - else - if not dfhack.filesystem.exists(path) then - dfhack.filesystem.mkdir(path) - end - stockpiles_save(path..'/'..filename) - end - end - end) -end - -function manage_settings(sp) - init() - if not guard() then return false end - script.start(function() - local list = {'Load', 'Save'} - local tok,i = script.showListPrompt('Stockpile Settings','Load or Save Settings?',COLOR_WHITE,tablify(list)) - if tok then - if i == 1 then - load_settings() - else - save_settings(sp) - end - end - end) + return argparse.processArgsGetopt(args, { + {'h', 'help', handler=function() opts.help = true end}, + {'s', 'stockpile', has_arg=true, + handler=function(arg) opts.id = argparse.nonnegativeInt(art, 'stockpile') end}, + }) end -function show_message_box(title, msg, iserror) - local color = COLOR_WHITE - if iserror then - color = COLOR_RED - end - script.start(function() - script.showMessage(title, msg, color) - end) -end +function parse_commandline(args) + local opts = {} + local positionals = process_args(opts, args) -function guard() - if not string.match(dfhack.gui.getCurFocus(), '^dwarfmode/QueryBuilding/Some/Stockpile') then - qerror("This script requires a stockpile selected in the 'q' mode") + if opts.help or not positionals then return false end - return true -end -function set_path(path) - init() - if persist == nil then - qerror("This version of DFHack doesn't support setting the stockpile settings path. Sorry.") - return + local command = table.remove(positionals, 1) + if not command or command == 'status' then + print_status() + elseif command == 'list' then + list_settings_files(positionals) + elseif command == 'export' then + export_stockpile(positionals[1], opts) + elseif command == 'import' then + import_stockpile(positionals[1], opts) + else + return false end - persist.GlobalTable.stockpiles['settings_path'] = path -end -function get_path() - init() - if persist == nil then - return "stocksettings" - end - return persist.GlobalTable.stockpiles['settings_path'] + return true end return _ENV diff --git a/plugins/stockpiles/stockpiles.cpp b/plugins/stockpiles/stockpiles.cpp index 98c94ace0..e7b3525ef 100644 --- a/plugins/stockpiles/stockpiles.cpp +++ b/plugins/stockpiles/stockpiles.cpp @@ -1,13 +1,19 @@ #include "Debug.h" +#include "LuaTools.h" #include "PluginManager.h" #include "StockpileUtils.h" #include "StockpileSerializer.h" #include "modules/Filesystem.h" -#include "modules/Gui.h" -using std::vector; +#include "df/building.h" +#include "df/building_stockpilest.h" + +#include +#include + using std::string; +using std::vector; using namespace DFHack; @@ -19,112 +25,121 @@ namespace DFHack { DBG_DECLARE(stockpiles, log, DebugCategory::LINFO); } -static command_result savestock(color_ostream& out, vector & parameters); -static command_result loadstock(color_ostream& out, vector & parameters); +static command_result do_command(color_ostream &out, vector ¶meters); + +DFhackCExport command_result plugin_init(color_ostream &out, std::vector &commands) { + DEBUG(log,out).print("initializing %s\n", plugin_name); -DFhackCExport command_result plugin_init(color_ostream& out, std::vector & commands) { - commands.push_back(PluginCommand( - "savestock", - "Save the active stockpile's settings to a file.", - savestock, - Gui::any_stockpile_hotkey)); commands.push_back(PluginCommand( - "loadstock", - "Load and apply stockpile settings from a file.", - loadstock, - Gui::any_stockpile_hotkey)); + plugin_name, + "Import, export, or modify stockpile settings and features.", + do_command)); return CR_OK; } -DFhackCExport command_result plugin_shutdown(color_ostream& out) { - return CR_OK; +static bool call_stockpiles_lua(color_ostream *out, const char *fn_name, + int nargs = 0, int nres = 0, + Lua::LuaLambda && args_lambda = Lua::DEFAULT_LUA_LAMBDA, + Lua::LuaLambda && res_lambda = Lua::DEFAULT_LUA_LAMBDA) { + DEBUG(log).print("calling stockpiles lua function: '%s'\n", fn_name); + + CoreSuspender guard; + + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); + + if (!out) + out = &Core::getInstance().getConsole(); + + return Lua::CallLuaModuleFunction(*out, L, "plugins.stockpiles", fn_name, + nargs, nres, + std::forward(args_lambda), + std::forward(res_lambda)); } -// exporting -static command_result savestock(color_ostream& out, vector & parameters) { - df::building_stockpilest* sp = Gui::getSelectedStockpile(out, true); - if (!sp) { - out.printerr("Selected building isn't a stockpile.\n"); - return CR_WRONG_USAGE; +static command_result do_command(color_ostream &out, vector ¶meters) { + CoreSuspender suspend; + + bool show_help = false; + if (!call_stockpiles_lua(&out, "parse_commandline", 1, 1, + [&](lua_State *L) { + Lua::PushVector(L, parameters); + }, + [&](lua_State *L) { + show_help = !lua_toboolean(L, -1); + })) { + return CR_FAILURE; } - if (parameters.size() > 2) { - out.printerr("Invalid parameters\n"); - return CR_WRONG_USAGE; - } + return show_help ? CR_WRONG_USAGE : CR_OK; +} - std::string file; - for (size_t i = 0; i < parameters.size(); ++i) { - const std::string o = parameters.at(i); - if (!o.empty() && o[0] != '-') { - file = o; - } - } - if (file.empty()) { - out.printerr("You must supply a valid filename.\n"); - return CR_WRONG_USAGE; +///////////////////////////////////////////////////// +// Lua API +// + +static df::building_stockpilest* get_stockpile(int id) { + return virtual_cast(df::building::find(id)); +} + +static bool stockpiles_export(color_ostream& out, string fname, int id) { + df::building_stockpilest* sp = get_stockpile(id); + if (!sp) { + out.printerr("Specified building isn't a stockpile: %d.\n", id); + return false; } - StockpileSerializer cereal(sp); + if (!is_dfstockfile(fname)) + fname += ".dfstock"; - if (!is_dfstockfile(file)) file += ".dfstock"; try { - if (!cereal.serialize_to_file(file)) { - out.printerr("could not save to %s\n", file.c_str()); - return CR_FAILURE; + StockpileSerializer cereal(sp); + if (!cereal.serialize_to_file(fname)) { + out.printerr("could not save to '%s'\n", fname.c_str()); + return false; } } catch (std::exception& e) { out.printerr("serialization failed: protobuf exception: %s\n", e.what()); - return CR_FAILURE; + return false; } - return CR_OK; + return true; } - -// importing -static command_result loadstock(color_ostream& out, vector & parameters) { - df::building_stockpilest* sp = Gui::getSelectedStockpile(out, true); +static bool stockpiles_import(color_ostream& out, string fname, int id) { + df::building_stockpilest* sp = get_stockpile(id); if (!sp) { - out.printerr("Selected building isn't a stockpile.\n"); - return CR_WRONG_USAGE; + out.printerr("Specified building isn't a stockpile: %d.\n", id); + return false; } - if (parameters.size() < 1 || parameters.size() > 2) { - out.printerr("Invalid parameters\n"); - return CR_WRONG_USAGE; - } + if (!is_dfstockfile(fname)) + fname += ".dfstock"; - std::string file; - for (size_t i = 0; i < parameters.size(); ++i) { - const std::string o = parameters.at(i); - if (!o.empty() && o[0] != '-') { - file = o; - } - } - if (file.empty()) { - out.printerr("ERROR: missing .dfstock file parameter\n"); - return DFHack::CR_WRONG_USAGE; - } - if (!is_dfstockfile(file)) - file += ".dfstock"; - if (!Filesystem::exists(file)) { - out.printerr("ERROR: the .dfstock file doesn't exist: %s\n", file.c_str()); - return CR_WRONG_USAGE; + if (!Filesystem::exists(fname)) { + out.printerr("ERROR: file doesn't exist: '%s'\n", fname.c_str()); + return false; } - StockpileSerializer cereal(sp); try { - if (!cereal.unserialize_from_file(file)) { - out.printerr("unserialization failed: %s\n", file.c_str()); - return CR_FAILURE; + StockpileSerializer cereal(sp); + if (!cereal.unserialize_from_file(fname)) { + out.printerr("deserialization failed: '%s'\n", fname.c_str()); + return false; } } catch (std::exception& e) { - out.printerr("unserialization failed: protobuf exception: %s\n", e.what()); - return CR_FAILURE; + out.printerr("deserialization failed: protobuf exception: %s\n", e.what()); + return false; } - return CR_OK; + + return true; } + +DFHACK_PLUGIN_LUA_FUNCTIONS { + DFHACK_LUA_FUNCTION(stockpiles_export), + DFHACK_LUA_FUNCTION(stockpiles_import), + DFHACK_LUA_END +}; From 13cd825fedcda1421641a6430f0c98e7edfe76e9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 18:04:17 -0700 Subject: [PATCH 091/439] rename category files to identify them more clearly --- .../{ammo.dfstock => category_ammo.dfstock} | Bin ...imalsprefix.dfstock => category_animals.dfstock} | 0 .../{armorprefix.dfstock => category_armor.dfstock} | Bin ...sprefix.dfstock => category_bars_blocks.dfstock} | Bin .../{clothprefix.dfstock => category_cloth.dfstock} | 0 .../{coinsprefix.dfstock => category_coins.dfstock} | Bin ...rpsesprefix.dfstock => category_corpses.dfstock} | Bin ...efix.dfstock => category_finished_goods.dfstock} | Bin .../{foodprefix.dfstock => category_food.dfstock} | 0 ...fstock => category_furniture_siege_ammo.dfstock} | Bin .../{gemsprefix.dfstock => category_gems.dfstock} | Bin ...atherprefix.dfstock => category_leather.dfstock} | 0 .../{refuse.dfstock => category_refuse.dfstock} | 0 .../{sheetprefix.dfstock => category_sheet.dfstock} | Bin .../{stone.dfstock => category_stone.dfstock} | Bin ...ock => category_weapons_trap_components.dfstock} | Bin 16 files changed, 0 insertions(+), 0 deletions(-) rename data/stockpiles/{ammo.dfstock => category_ammo.dfstock} (100%) rename data/stockpiles/{animalsprefix.dfstock => category_animals.dfstock} (100%) rename data/stockpiles/{armorprefix.dfstock => category_armor.dfstock} (100%) rename data/stockpiles/{barsprefix.dfstock => category_bars_blocks.dfstock} (100%) rename data/stockpiles/{clothprefix.dfstock => category_cloth.dfstock} (100%) rename data/stockpiles/{coinsprefix.dfstock => category_coins.dfstock} (100%) rename data/stockpiles/{corpsesprefix.dfstock => category_corpses.dfstock} (100%) rename data/stockpiles/{finishedgoodsprefix.dfstock => category_finished_goods.dfstock} (100%) rename data/stockpiles/{foodprefix.dfstock => category_food.dfstock} (100%) rename data/stockpiles/{furnitureprefix.dfstock => category_furniture_siege_ammo.dfstock} (100%) rename data/stockpiles/{gemsprefix.dfstock => category_gems.dfstock} (100%) rename data/stockpiles/{leatherprefix.dfstock => category_leather.dfstock} (100%) rename data/stockpiles/{refuse.dfstock => category_refuse.dfstock} (100%) rename data/stockpiles/{sheetprefix.dfstock => category_sheet.dfstock} (100%) rename data/stockpiles/{stone.dfstock => category_stone.dfstock} (100%) rename data/stockpiles/{weaponsprefix.dfstock => category_weapons_trap_components.dfstock} (100%) diff --git a/data/stockpiles/ammo.dfstock b/data/stockpiles/category_ammo.dfstock similarity index 100% rename from data/stockpiles/ammo.dfstock rename to data/stockpiles/category_ammo.dfstock diff --git a/data/stockpiles/animalsprefix.dfstock b/data/stockpiles/category_animals.dfstock similarity index 100% rename from data/stockpiles/animalsprefix.dfstock rename to data/stockpiles/category_animals.dfstock diff --git a/data/stockpiles/armorprefix.dfstock b/data/stockpiles/category_armor.dfstock similarity index 100% rename from data/stockpiles/armorprefix.dfstock rename to data/stockpiles/category_armor.dfstock diff --git a/data/stockpiles/barsprefix.dfstock b/data/stockpiles/category_bars_blocks.dfstock similarity index 100% rename from data/stockpiles/barsprefix.dfstock rename to data/stockpiles/category_bars_blocks.dfstock diff --git a/data/stockpiles/clothprefix.dfstock b/data/stockpiles/category_cloth.dfstock similarity index 100% rename from data/stockpiles/clothprefix.dfstock rename to data/stockpiles/category_cloth.dfstock diff --git a/data/stockpiles/coinsprefix.dfstock b/data/stockpiles/category_coins.dfstock similarity index 100% rename from data/stockpiles/coinsprefix.dfstock rename to data/stockpiles/category_coins.dfstock diff --git a/data/stockpiles/corpsesprefix.dfstock b/data/stockpiles/category_corpses.dfstock similarity index 100% rename from data/stockpiles/corpsesprefix.dfstock rename to data/stockpiles/category_corpses.dfstock diff --git a/data/stockpiles/finishedgoodsprefix.dfstock b/data/stockpiles/category_finished_goods.dfstock similarity index 100% rename from data/stockpiles/finishedgoodsprefix.dfstock rename to data/stockpiles/category_finished_goods.dfstock diff --git a/data/stockpiles/foodprefix.dfstock b/data/stockpiles/category_food.dfstock similarity index 100% rename from data/stockpiles/foodprefix.dfstock rename to data/stockpiles/category_food.dfstock diff --git a/data/stockpiles/furnitureprefix.dfstock b/data/stockpiles/category_furniture_siege_ammo.dfstock similarity index 100% rename from data/stockpiles/furnitureprefix.dfstock rename to data/stockpiles/category_furniture_siege_ammo.dfstock diff --git a/data/stockpiles/gemsprefix.dfstock b/data/stockpiles/category_gems.dfstock similarity index 100% rename from data/stockpiles/gemsprefix.dfstock rename to data/stockpiles/category_gems.dfstock diff --git a/data/stockpiles/leatherprefix.dfstock b/data/stockpiles/category_leather.dfstock similarity index 100% rename from data/stockpiles/leatherprefix.dfstock rename to data/stockpiles/category_leather.dfstock diff --git a/data/stockpiles/refuse.dfstock b/data/stockpiles/category_refuse.dfstock similarity index 100% rename from data/stockpiles/refuse.dfstock rename to data/stockpiles/category_refuse.dfstock diff --git a/data/stockpiles/sheetprefix.dfstock b/data/stockpiles/category_sheet.dfstock similarity index 100% rename from data/stockpiles/sheetprefix.dfstock rename to data/stockpiles/category_sheet.dfstock diff --git a/data/stockpiles/stone.dfstock b/data/stockpiles/category_stone.dfstock similarity index 100% rename from data/stockpiles/stone.dfstock rename to data/stockpiles/category_stone.dfstock diff --git a/data/stockpiles/weaponsprefix.dfstock b/data/stockpiles/category_weapons_trap_components.dfstock similarity index 100% rename from data/stockpiles/weaponsprefix.dfstock rename to data/stockpiles/category_weapons_trap_components.dfstock From 3f0a93a9b117c8e9f76f79cecd470795f1d1be61 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 18:04:46 -0700 Subject: [PATCH 092/439] document my aspirations --- docs/plugins/stockpiles.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 7ca0c5039..c0b697c4b 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -53,10 +53,39 @@ Examples Options ------- +``-i``, ``--include `` + When exporting, you can include this option to select only specific elements + of the stockpile to record. If not specified, everything is included. When + the file is later imported, only the included settings will be modified. The + options are explained below in the next section. +``-d``, ``--disable`` + When importing, treat the settings in the file as elements to *remove** from + the current stockpile configuration. Elements that are enabled in the file + will be *disabled* on the stockpile. No other stockpile configuration will + be changed. +``-e``, ``--enable`` + When importing, treat the settings in the file as elements to *add* to the + current stockpile configuration. Elements that are enabled in the file will + be enabled on the stockpile, but nothing currently enabled on the stockpile + will be disabled. ``-s``, ``--stockpile `` Specify a specific stockpile ID instead of using the one currently selected in the UI. +Configuration elements +---------------------- + +The different configuration elements you can include in an exported settings file +are: + +:general: Max bins, barrels, and wheelbarrows; whether the stockpile takes from + links only; whether organic and/or inorganic materials are allowed. +:categories: The top-level categories of items that are enabled for the stockpile, + like Ammo, Finished goods, or Stone. +:types: The elements below the categories, which include the sub-categories, the + specific item types, and any toggles the category might have (like Prepared + meals for the Food category). + .. _stockpiles-library: The stockpiles settings library From 5a317820f96e19d32f84869b6c96f16b314c1e3c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 15 Mar 2023 21:54:48 -0700 Subject: [PATCH 093/439] new logic for deserialization --- docs/about/Removed.rst | 7 + docs/plugins/stockpiles.rst | 34 +- plugins/lua/stockpiles.lua | 52 +- plugins/stockpiles/StockpileSerializer.cpp | 1213 ++++++++++++-------- plugins/stockpiles/StockpileSerializer.h | 264 ++--- plugins/stockpiles/proto/stockpiles.proto | 72 +- plugins/stockpiles/stockpiles.cpp | 14 +- 7 files changed, 972 insertions(+), 684 deletions(-) diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index 01669fac4..4a8cdbccf 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -193,6 +193,13 @@ show-unit-syndromes =================== Replaced with a GUI version: `gui/unit-syndromes`. +.. _stocksettings: + +stocksettings +============= +Along with ``copystock``, ``loadstock`` and ``savestock``, replaced with the new +`stockpiles` API. + .. _warn-stuck-trees: warn-stuck-trees diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index c0b697c4b..83cfada02 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -53,24 +53,23 @@ Examples Options ------- +``-s``, ``--stockpile `` + Specify a specific stockpile ID instead of using the one currently selected + in the UI. ``-i``, ``--include `` When exporting, you can include this option to select only specific elements of the stockpile to record. If not specified, everything is included. When the file is later imported, only the included settings will be modified. The options are explained below in the next section. -``-d``, ``--disable`` - When importing, treat the settings in the file as elements to *remove** from - the current stockpile configuration. Elements that are enabled in the file - will be *disabled* on the stockpile. No other stockpile configuration will - be changed. -``-e``, ``--enable`` - When importing, treat the settings in the file as elements to *add* to the - current stockpile configuration. Elements that are enabled in the file will - be enabled on the stockpile, but nothing currently enabled on the stockpile - will be disabled. -``-s``, ``--stockpile `` - Specify a specific stockpile ID instead of using the one currently selected - in the UI. +``-m``, ``--mode (set|enable|disable)`` + When importing, choose the algorithm used to apply the settings. In ``set`` + mode (the default), the stockpile is cleared and the settings in the file + are enabled. In ``enable`` mode, enabled settings in the file are *added* + to the stockpile, but no other settings are changed. In ``disable`` mode, + enabled settings in the file are *removed* from the current stockpile + configuration, and nothing else is changed. +``-f``, ``--filter `` + When importing, only modify the settings that contain the given substring. Configuration elements ---------------------- @@ -78,10 +77,11 @@ Configuration elements The different configuration elements you can include in an exported settings file are: -:general: Max bins, barrels, and wheelbarrows; whether the stockpile takes from - links only; whether organic and/or inorganic materials are allowed. -:categories: The top-level categories of items that are enabled for the stockpile, - like Ammo, Finished goods, or Stone. +:containers: Max bins, max barrels, and num wheelbarrows. +:general: Whether the stockpile takes from links only and whether organic + and/or inorganic materials are allowed. +:categories: The top-level categories of items that are enabled for the + stockpile, like Ammo, Finished goods, or Stone. :types: The elements below the categories, which include the sub-categories, the specific item types, and any toggles the category might have (like Prepared meals for the Food category). diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index 723ff97f6..6770c044e 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -74,10 +74,25 @@ local function get_sp_id(opts) return nil end +local included_elements = { + containers=1, + general=2, + categories=4, + types=8, +} + local function export_stockpile(name, opts) assert_safe_name(name) name = STOCKPILES_DIR .. '/' .. name - stockpiles_export(name, get_sp_id(opts)) + + local includedElements = 0 + for _,inc in ipairs(opts.includes) do + if included_elements[inc] then + includedElements = includedElements | included_elements[inc] + end + end + + stockpiles_export(name, get_sp_id(opts), includedElements) end local function import_stockpile(name, opts) @@ -92,7 +107,28 @@ local function import_stockpile(name, opts) else name = STOCKPILES_LIBRARY_DIR .. '/' .. name end - stockpiles_import(name, get_sp_id(opts)) + stockpiles_import(name, get_sp_id(opts), opts.mode, opts.filter) +end + +local valid_includes = {general=true, categories=true, types=true} + +local function parse_include(arg) + local includes = argparse.stringList(arg, 'include') + for _,v in ipairs(includes) do + if not valid_includes[v] then + qerror(('invalid included element: "%s"'):format(v)) + end + end + return includes +end + +local valid_modes = {set=true, enable=true, disable=true} + +local function parse_mode(arg) + if not valid_modes[arg] then + qerror(('invalid mode: "%s"'):format(arg)) + end + return arg end local function process_args(opts, args) @@ -101,10 +137,20 @@ local function process_args(opts, args) return end + opts.includes = {} + opts.mode = 'set' + opts.filter = '' + return argparse.processArgsGetopt(args, { + {'f', 'filter', has_arg=true, + handler=function(arg) opts.filter = arg end}, {'h', 'help', handler=function() opts.help = true end}, + {'i', 'include', has_arg=true, + handler=function(arg) opts.includes = parse_include(arg) end}, + {'m', 'mode', has_arg=true, + handler=function(arg) opts.mode = parse_mode(arg) end}, {'s', 'stockpile', has_arg=true, - handler=function(arg) opts.id = argparse.nonnegativeInt(art, 'stockpile') end}, + handler=function(arg) opts.id = argparse.nonnegativeInt(arg, 'stockpile') end}, }) end diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 65feb2711..04e7cb9fa 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -44,23 +44,121 @@ namespace DFHack { DBG_EXTERN(stockpiles, log); } -StockpileSerializer::StockpileSerializer(df::building_stockpilest* stockpile) - : mPile(stockpile) { +static struct OtherMatsFurniture { + const std::map mats; + + OtherMatsFurniture() : mats(getMats()) {} + + std::map getMats() { + std::map ret; + ret.emplace(0, "WOOD"); + ret.emplace(1, "PLANT_CLOTH"); + ret.emplace(2, "BONE"); + ret.emplace(3, "TOOTH"); + ret.emplace(4, "HORN"); + ret.emplace(5, "PEARL"); + ret.emplace(6, "SHELL"); + ret.emplace(7, "LEATHER"); + ret.emplace(8, "SILK"); + ret.emplace(9, "AMBER"); + ret.emplace(10, "CORAL"); + ret.emplace(11, "GREEN_GLASS"); + ret.emplace(12, "CLEAR_GLASS"); + ret.emplace(13, "CRYSTAL_GLASS"); + ret.emplace(14, "YARN"); + return ret; + } +} mOtherMatsFurniture; + +static struct OtherMatsBars { + const std::map mats; + + OtherMatsBars() : mats(getMats()) {} + + std::map getMats() { + std::map ret; + ret.emplace(0, "COAL"); + ret.emplace(1, "POTASH"); + ret.emplace(2, "ASH"); + ret.emplace(3, "PEARLASH"); + ret.emplace(4, "SOAP"); + return ret; + } +} mOtherMatsBars; + +static struct OtherMatsBlocks { + const std::map mats; + + OtherMatsBlocks() : mats(getMats()) {} + + std::map getMats() { + std::map ret; + ret.emplace(0, "GREEN_GLASS"); + ret.emplace(1, "CLEAR_GLASS"); + ret.emplace(2, "CRYSTAL_GLASS"); + ret.emplace(3, "WOOD"); + return ret; + } +} mOtherMatsBlocks; + +static struct OtherMatsFinishedGoods { + const std::map mats; + + OtherMatsFinishedGoods() : mats(getMats()) {} + + std::map getMats() { + std::map ret; + ret.emplace(0, "WOOD"); + ret.emplace(1, "PLANT_CLOTH"); + ret.emplace(2, "BONE"); + ret.emplace(3, "TOOTH"); + ret.emplace(4, "HORN"); + ret.emplace(5, "PEARL"); + ret.emplace(6, "SHELL"); + ret.emplace(7, "LEATHER"); + ret.emplace(8, "SILK"); + ret.emplace(9, "AMBER"); + ret.emplace(10, "CORAL"); + ret.emplace(11, "GREEN_GLASS"); + ret.emplace(12, "CLEAR_GLASS"); + ret.emplace(13, "CRYSTAL_GLASS"); + ret.emplace(14, "YARN"); + ret.emplace(15, "WAX"); + return ret; + } +} mOtherMatsFinishedGoods; + +static struct OtherMatsWeaponsArmor { + const std::map mats; + + OtherMatsWeaponsArmor() : mats(getMats()) {} + + std::map getMats() { + std::map ret; + ret.emplace(0, "WOOD"); + ret.emplace(1, "PLANT_CLOTH"); + ret.emplace(2, "BONE"); + ret.emplace(3, "SHELL"); + ret.emplace(4, "LEATHER"); + ret.emplace(5, "SILK"); + ret.emplace(6, "GREEN_GLASS"); + ret.emplace(7, "CLEAR_GLASS"); + ret.emplace(8, "CRYSTAL_GLASS"); + ret.emplace(9, "YARN"); + return ret; + } +} mOtherMatsWeaponsArmor; - // build other_mats indices - furniture_setup_other_mats(); - bars_blocks_setup_other_mats(); - finished_goods_setup_other_mats(); - weapons_armor_setup_other_mats(); -} +StockpileSerializer::StockpileSerializer(df::building_stockpilest* stockpile) + : mPile(stockpile) { } StockpileSerializer::~StockpileSerializer() { } -bool StockpileSerializer::serialize_to_ostream(std::ostream* output) { +bool StockpileSerializer::serialize_to_ostream(std::ostream* output, uint32_t includedElements) { if (output->fail()) return false; mBuffer.Clear(); - write(); + write(includedElements); { io::OstreamOutputStream zero_copy_output(output); if (!mBuffer.SerializeToZeroCopyStream(&zero_copy_output)) @@ -69,109 +167,246 @@ bool StockpileSerializer::serialize_to_ostream(std::ostream* output) { return output->good(); } -bool StockpileSerializer::serialize_to_file(const std::string& file) { +bool StockpileSerializer::serialize_to_file(const std::string& file, uint32_t includedElements) { std::fstream output(file, std::ios::out | std::ios::binary | std::ios::trunc); if (output.fail()) { - WARN(log).print("ERROR: failed to open file for writing: '%s'\n", file.c_str()); + WARN(log).print("ERROR: failed to open file for writing: '%s'\n", + file.c_str()); return false; } - return serialize_to_ostream(&output); + return serialize_to_ostream(&output, includedElements); } -bool StockpileSerializer::parse_from_istream(std::istream* input) { +bool StockpileSerializer::parse_from_istream(std::istream* input, DeserializeMode mode, const std::string& filter) { if (input->fail()) return false; mBuffer.Clear(); io::IstreamInputStream zero_copy_input(input); - const bool res = mBuffer.ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); + const bool res = mBuffer.ParseFromZeroCopyStream(&zero_copy_input) + && input->eof(); if (res) - read(); + read(mode, filter); return res; } -bool StockpileSerializer::unserialize_from_file(const std::string& file) { +bool StockpileSerializer::unserialize_from_file(const std::string& file, DeserializeMode mode, const string& filter) { std::fstream input(file, std::ios::in | std::ios::binary); if (input.fail()) { - WARN(log).print("failed to open file for reading: '%s'\n", file.c_str()); + WARN(log).print("failed to open file for reading: '%s'\n", + file.c_str()); return false; } - return parse_from_istream(&input); -} - -void StockpileSerializer::write() { - DEBUG(log).print("GROUP SET %s\n", bitfield_to_string(mPile->settings.flags).c_str()); - write_general(); - if (mPile->settings.flags.bits.animals) - write_animals(); - if (mPile->settings.flags.bits.food) - write_food(); - if (mPile->settings.flags.bits.furniture) - write_furniture(); - if (mPile->settings.flags.bits.refuse) - write_refuse(); - if (mPile->settings.flags.bits.stone) - write_stone(); - if (mPile->settings.flags.bits.ammo) - write_ammo(); - if (mPile->settings.flags.bits.coins) - write_coins(); - if (mPile->settings.flags.bits.bars_blocks) - write_bars_blocks(); - if (mPile->settings.flags.bits.gems) - write_gems(); - if (mPile->settings.flags.bits.finished_goods) - write_finished_goods(); - if (mPile->settings.flags.bits.leather) - write_leather(); - if (mPile->settings.flags.bits.cloth) - write_cloth(); - if (mPile->settings.flags.bits.wood) - write_wood(); - if (mPile->settings.flags.bits.weapons) - write_weapons(); - if (mPile->settings.flags.bits.armor) - write_armor(); -} - -void StockpileSerializer::read() { - DEBUG(log).print("==READ==\n"); - read_general(); - read_animals(); - read_food(); - read_furniture(); - read_refuse(); - read_stone(); - read_ammo(); - read_coins(); - read_bars_blocks(); - read_gems(); - read_finished_goods(); - read_leather(); - read_cloth(); - read_wood(); - read_weapons(); - read_armor(); -} - -void StockpileSerializer::serialize_list_organic_mat(FuncWriteExport add_value, const std::vector* list, organic_mat_category::organic_mat_category cat) { + return parse_from_istream(&input, mode, filter); +} + +/** + * Find an enum's value based off the string label. + * @param traits the enum's trait struct + * @param token the string value in key_table + * @return the enum's value, -1 if not found + */ +template +static typename df::enum_traits::base_type linear_index(df::enum_traits traits, const std::string& token) { + auto j = traits.first_item_value; + auto limit = traits.last_item_value; + // sometimes enums start at -1, which is bad news for array indexing + if (j < 0) { + j += abs(traits.first_item_value); + limit += abs(traits.first_item_value); + } + for (; j <= limit; ++j) { + if (token.compare(traits.key_table[j]) == 0) + return j; + } + return -1; +} + +/** + * There are many repeated (un)serialization cases throughout the stockpile_settings structure, + * so the most common cases have been generalized into generic functions using lambdas. + * + * The basic process to serialize a stockpile_settings structure is: + * 1. loop through the list + * 2. for every element that is TRUE: + * 3. map the specific stockpile_settings index into a general material, creature, etc index + * 4. verify that type is allowed in the list (e.g., no stone in gems stockpiles) + * 5. add it to the protobuf using FuncWriteExport + * + * The unserialization process is the same in reverse. + */ +static bool serialize_list_itemdef(FuncWriteExport add_value, + std::vector list, + std::vector items, + item_type::item_type type) { + bool all = true; + for (size_t i = 0; i < list.size(); ++i) { + if (!list.at(i)) { + all = false; + continue; + } + const df::itemdef* a = items.at(i); + // skip procedurally generated items + if (a->base_flags.is_set(df::itemdef_flags::GENERATED)) + continue; + ItemTypeInfo ii; + if (!ii.decode(type, i)) + continue; + add_value(ii.getToken()); + DEBUG(log).print("itemdef type %zd is %s\n", i, ii.getToken().c_str()); + } + return all; +} + +static void unserialize_list_itemdef(FuncReadImport read_value, + int32_t list_size, + std::vector* pile_list, + item_type::item_type type) { + pile_list->clear(); + pile_list->resize(Items::getSubtypeCount(type), '\0'); + for (int i = 0; i < list_size; ++i) { + std::string token = read_value(i); + ItemTypeInfo ii; + if (!ii.find(token)) + continue; + DEBUG(log).print("itemdef %d is %s\n", ii.subtype, token.c_str()); + if (size_t(ii.subtype) >= pile_list->size()) { + WARN(log).print("itemdef index too large! idx[%d] max_size[%zd]\n", ii.subtype, pile_list->size()); + continue; + } + pile_list->at(ii.subtype) = 1; + } +} + +static bool serialize_list_quality(FuncWriteExport add_value, + const bool(&quality_list)[7]) { + using df::enums::item_quality::item_quality; + using quality_traits = df::enum_traits; + + bool all = true; + for (size_t i = 0; i < 7; ++i) { + if (!quality_list[i]) { + all = false; + continue; + } + const std::string f_type(quality_traits::key_table[i]); + add_value(f_type); + DEBUG(log).print("quality: %zd is %s\n", i, f_type.c_str()); + } + return all; +} + +static void quality_clear(bool(&pile_list)[7]) { + std::fill(pile_list, pile_list + 7, false); +} + +static void unserialize_list_quality(FuncReadImport read_value, + int32_t list_size, + bool(&pile_list)[7]) { + quality_clear(pile_list); + if (list_size > 0 && list_size <= 7) { + using df::enums::item_quality::item_quality; + df::enum_traits quality_traits; + for (int i = 0; i < list_size; ++i) { + const std::string quality = read_value(i); + df::enum_traits::base_type idx = linear_index(quality_traits, quality); + if (idx < 0) { + WARN(log).print("invalid quality token: %s\n", quality.c_str()); + continue; + } + DEBUG(log).print("quality: %d is %s\n", idx, quality.c_str()); + pile_list[idx] = true; + } + } +} + +static string other_mats_index(const std::map other_mats, + int idx) { + auto it = other_mats.find(idx); + if (it == other_mats.end()) + return std::string(); + return it->second; +} + +static int other_mats_token(const std::map other_mats, + const std::string& token) { + for (auto it = other_mats.begin(); it != other_mats.end(); ++it) { + if (it->second == token) + return it->first; + } + return -1; +} + +static bool serialize_list_other_mats( + const std::map other_mats, + FuncWriteExport add_value, + std::vector list) { + bool all = true; + for (size_t i = 0; i < list.size(); ++i) { + if (!list.at(i)) { + all = false; + continue; + } + const std::string token = other_mats_index(other_mats, i); + if (token.empty()) { + WARN(log).print("invalid other material with index %zd\n", i); + continue; + } + add_value(token); + DEBUG(log).print("other mats %zd is %s\n", i, token.c_str()); + } + return all; +} + +static void unserialize_list_other_mats( + const std::map other_mats, + FuncReadImport read_value, + int32_t list_size, + std::vector* pile_list) { + pile_list->clear(); + pile_list->resize(other_mats.size(), '\0'); + for (int i = 0; i < list_size; ++i) { + const std::string token = read_value(i); + size_t idx = other_mats_token(other_mats, token); + if (idx < 0) { + WARN(log).print("invalid other mat with token %s\n", token.c_str()); + continue; + } + DEBUG(log).print("other_mats %zd is %s\n", idx, token.c_str()); + if (idx >= pile_list->size()) { + WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, pile_list->size()); + continue; + } + pile_list->at(idx) = 1; + } +} + +static bool serialize_list_organic_mat(FuncWriteExport add_value, + const std::vector* list, + organic_mat_category::organic_mat_category cat) { + bool all = true; if (!list) { DEBUG(log).print("serialize_list_organic_mat: list null\n"); - return; + return all; } for (size_t i = 0; i < list->size(); ++i) { - if (list->at(i)) { - std::string token = OrganicMatLookup::food_token_by_idx(cat, i); - if (token.empty()) { - DEBUG(log).print("food mat invalid :(\n"); - continue; - } - DEBUG(log).print("organic_material %zd is %s\n", i, token.c_str()); - add_value(token); + if (!list->at(i)) { + all = false; + continue; + } + std::string token = OrganicMatLookup::food_token_by_idx(cat, i); + if (token.empty()) { + DEBUG(log).print("food mat invalid :(\n"); + continue; } + DEBUG(log).print("organic_material %zd is %s\n", i, token.c_str()); + add_value(token); } + return all; } -void StockpileSerializer::unserialize_list_organic_mat(FuncReadImport get_value, size_t list_size, std::vector* pile_list, organic_mat_category::organic_mat_category cat) { +static void unserialize_list_organic_mat(FuncReadImport get_value, + size_t list_size, std::vector* pile_list, + organic_mat_category::organic_mat_category cat) { pile_list->clear(); pile_list->resize(OrganicMatLookup::food_max_size(cat), '\0'); for (size_t i = 0; i < list_size; ++i) { @@ -186,14 +421,21 @@ void StockpileSerializer::unserialize_list_organic_mat(FuncReadImport get_value, } } -void StockpileSerializer::serialize_list_item_type(FuncItemAllowed is_allowed, FuncWriteExport add_value, const std::vector& list) { +static bool serialize_list_item_type(FuncItemAllowed is_allowed, + FuncWriteExport add_value, const std::vector& list) { using df::enums::item_type::item_type; using type_traits = df::enum_traits; + + bool all = true; size_t num_item_types = list.size(); - DEBUG(log).print("item_type size = %zd size limit = %d typecasted: %zd\n", num_item_types, type_traits::last_item_value, (size_t)type_traits::last_item_value); + DEBUG(log).print("item_type size = %zd size limit = %d typecasted: %zd\n", + num_item_types, type_traits::last_item_value, + (size_t)type_traits::last_item_value); for (size_t i = 0; i <= (size_t)type_traits::last_item_value; ++i) { - if (i < num_item_types && !list.at(i)) + if (i < num_item_types && !list.at(i)) { + all = false; continue; + } const item_type type = (item_type)((df::enum_traits::base_type)i); std::string r_type(type_traits::key_table[i + 1]); if (!is_allowed(type)) @@ -201,9 +443,12 @@ void StockpileSerializer::serialize_list_item_type(FuncItemAllowed is_allowed, F add_value(r_type); DEBUG(log).print("item_type key_table[%zd] type[%d] is %s\n", i + 1, (int16_t)type, r_type.c_str()); } + return all; } -void StockpileSerializer::unserialize_list_item_type(FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list) { +static void unserialize_list_item_type(FuncItemAllowed is_allowed, + FuncReadImport read_value, int32_t list_size, + std::vector* pile_list) { pile_list->clear(); pile_list->resize(112, '\0'); // TODO remove hardcoded list size value for (size_t i = 0; i < pile_list->size(); ++i) { @@ -227,20 +472,27 @@ void StockpileSerializer::unserialize_list_item_type(FuncItemAllowed is_allowed, } } -void StockpileSerializer::serialize_list_material(FuncMaterialAllowed is_allowed, FuncWriteExport add_value, const std::vector& list) { +static bool serialize_list_material(FuncMaterialAllowed is_allowed, + FuncWriteExport add_value, const std::vector& list) { + bool all = true; MaterialInfo mi; for (size_t i = 0; i < list.size(); ++i) { - if (list.at(i)) { - mi.decode(0, i); - if (!is_allowed(mi)) - continue; - DEBUG(log).print("material %zd is %s\n", i, mi.getToken().c_str()); - add_value(mi.getToken()); + if (!list.at(i)) { + all = false; + continue; } + mi.decode(0, i); + if (!is_allowed(mi)) + continue; + DEBUG(log).print("material %zd is %s\n", i, mi.getToken().c_str()); + add_value(mi.getToken()); } + return all; } -void StockpileSerializer::unserialize_list_material(FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list) { +static void unserialize_list_material(FuncMaterialAllowed is_allowed, + FuncReadImport read_value, int32_t list_size, + std::vector* pile_list) { // we initialize all possible (allowed) values to 0, // then all other not-allowed values to 1 // why? because that's how the memory is in DF before @@ -267,150 +519,346 @@ void StockpileSerializer::unserialize_list_material(FuncMaterialAllowed is_allow } } -void StockpileSerializer::serialize_list_quality(FuncWriteExport add_value, const bool(&quality_list)[7]) { - using df::enums::item_quality::item_quality; - using quality_traits = df::enum_traits; - for (size_t i = 0; i < 7; ++i) { - if (quality_list[i]) { - const std::string f_type(quality_traits::key_table[i]); - add_value(f_type); - DEBUG(log).print("quality: %zd is %s\n", i, f_type.c_str()); - } +template +static void write_cat(bool include_types, uint32_t cat_flags, + enum df::stockpile_group_set::Mask cat_mask, + std::function mutable_cat_fn, + std::function write_cat_fn) { + if (!(cat_flags & cat_mask)) + return; + + T_cat_set* cat_set = mutable_cat_fn(); + if (!include_types) { + cat_set->set_all(true); + return; } -} -void StockpileSerializer::quality_clear(bool(&pile_list)[7]) { - std::fill(pile_list, pile_list + 7, false); + if (write_cat_fn(cat_set)) { + // all fields were set. might as well clear them and use the "all" flag + cat_set->Clear(); + cat_set->set_all(true); + } } -void StockpileSerializer::unserialize_list_quality(FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]) { - quality_clear(pile_list); - if (list_size > 0 && list_size <= 7) { - using df::enums::item_quality::item_quality; - df::enum_traits quality_traits; - for (int i = 0; i < list_size; ++i) { - const std::string quality = read_value(i); - df::enum_traits::base_type idx = linear_index(quality_traits, quality); - if (idx < 0) { - WARN(log).print("invalid quality token: %s\n", quality.c_str()); - continue; - } - DEBUG(log).print("quality: %d is %s\n", idx, quality.c_str()); - pile_list[idx] = true; - } +void StockpileSerializer::write(uint32_t includedElements) { + if (includedElements & INCLUDED_ELEMENTS_CONTAINERS) + write_containers(); + if (includedElements & INCLUDED_ELEMENTS_GENERAL) + write_general(); + + if (!(includedElements & INCLUDED_ELEMENTS_CATEGORIES)) + return; + + DEBUG(log).print("GROUP SET %s\n", + bitfield_to_string(mPile->settings.flags).c_str()); + + bool include_types = 0 != (includedElements & INCLUDED_ELEMENTS_TYPES); + + write_cat(include_types, mPile->settings.flags.whole, + mPile->settings.flags.mask_ammo, + std::bind(&StockpileSettings::mutable_ammo, mBuffer), + std::bind(&StockpileSerializer::write_ammo, this, _1)); + + if (mPile->settings.flags.bits.animals) { + StockpileSettings::AnimalsSet* animals = mBuffer.mutable_animals(); + if (include_types) write_animals(animals); else animals->set_all(true); + } + if (mPile->settings.flags.bits.armor) { + StockpileSettings::ArmorSet* armor = mBuffer.mutable_armor(); + if (include_types) write_armor(armor); else armor->set_all(true); + } + if (mPile->settings.flags.bits.bars_blocks) { + StockpileSettings::BarsBlocksSet* bars_blocks = mBuffer.mutable_barsblocks(); + if (include_types) write_bars_blocks(bars_blocks); else bars_blocks->set_all(true); + } + if (mPile->settings.flags.bits.cloth) { + StockpileSettings::ClothSet* cloth = mBuffer.mutable_cloth(); + if (include_types) write_cloth(cloth); else cloth->set_all(true); + } + if (mPile->settings.flags.bits.coins) { + StockpileSettings::CoinSet* coins = mBuffer.mutable_coin(); + if (include_types) write_coins(coins); else coins->set_all(true); + } + if (mPile->settings.flags.bits.finished_goods) { + StockpileSettings::FinishedGoodsSet* finished_goods = mBuffer.mutable_finished_goods(); + if (include_types) write_finished_goods(finished_goods); else finished_goods->set_all(true); + } + if (mPile->settings.flags.bits.food) { + StockpileSettings::FoodSet* food = mBuffer.mutable_food(); + if (include_types) write_food(food); else food->set_all(true); + } + if (mPile->settings.flags.bits.furniture) { + StockpileSettings::FurnitureSet* furniture = mBuffer.mutable_furniture(); + if (include_types) write_furniture(furniture); else furniture->set_all(true); + } + if (mPile->settings.flags.bits.gems) { + StockpileSettings::GemsSet* gems = mBuffer.mutable_gems(); + if (include_types) write_gems(gems); else gems->set_all(true); + } + if (mPile->settings.flags.bits.leather) { + StockpileSettings::LeatherSet* leather = mBuffer.mutable_leather(); + if (include_types) write_leather(leather); else leather->set_all(true); + } + if (mPile->settings.flags.bits.corpses) { + StockpileSettings::CorpsesSet* corpses = mBuffer.mutable_corpses_v50(); + if (include_types) write_corpses(corpses); else corpses->set_all(true); + } + if (mPile->settings.flags.bits.refuse) { + StockpileSettings::RefuseSet* refuse = mBuffer.mutable_refuse(); + if (include_types) write_refuse(refuse); else refuse->set_all(true); + } + if (mPile->settings.flags.bits.sheet) { + StockpileSettings::SheetSet* sheet = mBuffer.mutable_sheet(); + if (include_types) write_sheet(sheet); else sheet->set_all(true); + } + if (mPile->settings.flags.bits.stone) { + StockpileSettings::StoneSet* stone = mBuffer.mutable_stone(); + if (include_types) write_stone(stone); else stone->set_all(true); + } + if (mPile->settings.flags.bits.weapons) { + StockpileSettings::WeaponsSet* weapons = mBuffer.mutable_weapons(); + if (include_types) write_weapons(weapons); else weapons->set_all(true); + } + if (mPile->settings.flags.bits.wood) { + StockpileSettings::WoodSet* wood = mBuffer.mutable_wood(); + if (include_types) write_wood(wood); else wood->set_all(true); } } -void StockpileSerializer::serialize_list_other_mats(const std::map other_mats, FuncWriteExport add_value, std::vector list) { - for (size_t i = 0; i < list.size(); ++i) { - if (list.at(i)) { - const std::string token = other_mats_index(other_mats, i); - if (token.empty()) { - WARN(log).print("invalid other material with index %zd\n", i); - continue; - } - add_value(token); - DEBUG(log).print("other mats %zd is %s\n", i, token.c_str()); - } - } +void StockpileSerializer::read(DeserializeMode mode, const std::string& filter) { + DEBUG(log).print("==READ==\n"); + read_containers(mode); + read_general(mode); + read_ammo(mode, filter); + read_animals(mode, filter); + read_armor(mode, filter); + read_bars_blocks(mode, filter); + read_cloth(mode, filter); + read_coins(mode, filter); + read_finished_goods(mode, filter); + read_food(mode, filter); + read_furniture(mode, filter); + read_gems(mode, filter); + read_leather(mode, filter); + + // support for old versions before corpses had a set + if (mBuffer.has_corpses()) { + StockpileSettings::CorpsesSet* corpses = mBuffer.mutable_corpses_v50(); + corpses->set_all(true); + } + read_corpses(mode, filter); + + read_refuse(mode, filter); + read_sheet(mode, filter); + read_stone(mode, filter); + read_weapons(mode, filter); + read_wood(mode, filter); +} + +void StockpileSerializer::write_containers() { + mBuffer.set_max_bins(mPile->max_bins); + mBuffer.set_max_barrels(mPile->max_barrels); + mBuffer.set_max_wheelbarrows(mPile->max_wheelbarrows); } -void StockpileSerializer::unserialize_list_other_mats(const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector* pile_list) { - pile_list->clear(); - pile_list->resize(other_mats.size(), '\0'); - for (int i = 0; i < list_size; ++i) { - const std::string token = read_value(i); - size_t idx = other_mats_token(other_mats, token); - if (idx < 0) { - WARN(log).print("invalid other mat with token %s\n", token.c_str()); - continue; - } - DEBUG(log).print("other_mats %zd is %s\n", idx, token.c_str()); - if (idx >= pile_list->size()) { - WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, pile_list->size()); - continue; - } - pile_list->at(idx) = 1; +template +static void read_elem(const char *name, DeserializeMode mode, + std::function has_elem_fn, + std::function elem_fn, + T_elem &setting) { + bool has_elem = has_elem_fn(); + bool is_set = has_elem && elem_fn() != 0; + bool just_disable = is_set && mode == DESERIALIZE_MODE_DISABLE; + + if (mode == DESERIALIZE_MODE_SET || just_disable) { + DEBUG(log).print("clearing %s\n", name); + setting = 0; } -} -void StockpileSerializer::serialize_list_itemdef(FuncWriteExport add_value, std::vector list, std::vector items, item_type::item_type type) { - for (size_t i = 0; i < list.size(); ++i) { - if (list.at(i)) { - const df::itemdef* a = items.at(i); - // skip procedurally generated items - if (a->base_flags.is_set(df::itemdef_flags::GENERATED)) - continue; - ItemTypeInfo ii; - if (!ii.decode(type, i)) - continue; - add_value(ii.getToken()); - DEBUG(log).print("itemdef type %zd is %s\n", i, ii.getToken().c_str()); - } + if (!has_elem || just_disable) + return; + + if (mode == DESERIALIZE_MODE_SET || is_set) { + T_elem val = (mode == DESERIALIZE_MODE_DISABLE) ? 0 : elem_fn(); + DEBUG(log).print("setting %s=%d\n", name, val); + setting = val; } } -void StockpileSerializer::unserialize_list_itemdef(FuncReadImport read_value, int32_t list_size, std::vector* pile_list, item_type::item_type type) { - pile_list->clear(); - pile_list->resize(Items::getSubtypeCount(type), '\0'); - for (int i = 0; i < list_size; ++i) { - std::string token = read_value(i); - ItemTypeInfo ii; - if (!ii.find(token)) - continue; - DEBUG(log).print("itemdef %d is %s\n", ii.subtype, token.c_str()); - if (size_t(ii.subtype) >= pile_list->size()) { - WARN(log).print("itemdef index too large! idx[%d] max_size[%zd]\n", ii.subtype, pile_list->size()); - continue; - } - pile_list->at(ii.subtype) = 1; +template +static void read_category(const char *name, DeserializeMode mode, + std::function has_cat_fn, + std::function cat_fn, + uint32_t & cat_flags, + enum df::stockpile_group_set::Mask cat_mask, + std::function clear_fn, + std::function set_fn) { + bool has_cat = has_cat_fn(); + bool all = has_cat && cat_fn().has_all() && cat_fn().all(); + bool just_disable = all && mode == DESERIALIZE_MODE_DISABLE; + + if (mode == DESERIALIZE_MODE_SET || just_disable) { + DEBUG(log).print("clearing %s\n", name); + cat_flags &= ~cat_mask; + clear_fn(); } -} -std::string StockpileSerializer::other_mats_index(const std::map other_mats, int idx) { - auto it = other_mats.find(idx); - if (it == other_mats.end()) - return std::string(); - return it->second; + if (!has_cat || just_disable) + return; + + if (mode == DESERIALIZE_MODE_DISABLE && !(cat_flags & cat_mask)) + return; + + if (mode == DESERIALIZE_MODE_SET || mode == DESERIALIZE_MODE_ENABLE) + cat_flags |= cat_mask; + + bool force = mode == DESERIALIZE_MODE_SET || all; + char val = (mode == DESERIALIZE_MODE_DISABLE) ? (char)0 : (char)1; + DEBUG(log).print("setting %s %s elements to %d\n", + all ? "all" : "marked", name, val); + set_fn(force, val); } -int StockpileSerializer::other_mats_token(const std::map other_mats, const std::string& token) { - for (auto it = other_mats.begin(); it != other_mats.end(); ++it) { - if (it->second == token) - return it->first; - } - return -1; +void StockpileSerializer::read_containers(DeserializeMode mode) { + read_elem("max_bins", mode, + std::bind(&StockpileSettings::has_max_bins, mBuffer), + std::bind(&StockpileSettings::max_bins, mBuffer), + mPile->max_bins); + read_elem("max_barrels", mode, + std::bind(&StockpileSettings::has_max_barrels, mBuffer), + std::bind(&StockpileSettings::max_barrels, mBuffer), + mPile->max_barrels); + read_elem("max_wheelbarrows", mode, + std::bind(&StockpileSettings::has_max_wheelbarrows, mBuffer), + std::bind(&StockpileSettings::max_wheelbarrows, mBuffer), + mPile->max_wheelbarrows); } void StockpileSerializer::write_general() { - mBuffer.set_max_bins(mPile->max_bins); - mBuffer.set_max_wheelbarrows(mPile->max_wheelbarrows); - mBuffer.set_max_barrels(mPile->max_barrels); mBuffer.set_use_links_only(mPile->use_links_only); mBuffer.set_allow_inorganic(mPile->settings.allow_inorganic); mBuffer.set_allow_organic(mPile->settings.allow_organic); - mBuffer.set_corpses(mPile->settings.flags.bits.corpses); -} - -void StockpileSerializer::read_general() { - if (mBuffer.has_max_bins()) - mPile->max_bins = mBuffer.max_bins(); - if (mBuffer.has_max_wheelbarrows()) - mPile->max_wheelbarrows = mBuffer.max_wheelbarrows(); - if (mBuffer.has_max_barrels()) - mPile->max_barrels = mBuffer.max_barrels(); - if (mBuffer.has_use_links_only()) - mPile->use_links_only = mBuffer.use_links_only(); - if (mBuffer.has_allow_inorganic()) - mPile->settings.allow_inorganic = mBuffer.allow_inorganic(); - if (mBuffer.has_allow_organic()) - mPile->settings.allow_organic = mBuffer.allow_organic(); - if (mBuffer.has_corpses()) - mPile->settings.flags.bits.corpses = mBuffer.corpses(); -} - -void StockpileSerializer::write_animals() { - StockpileSettings::AnimalsSet* animals = mBuffer.mutable_animals(); +} + +void StockpileSerializer::read_general(DeserializeMode mode) { + read_elem("use_links_only", mode, + std::bind(&StockpileSettings::has_use_links_only, mBuffer), + std::bind(&StockpileSettings::use_links_only, mBuffer), + mPile->use_links_only); + read_elem("allow_inorganic", mode, + std::bind(&StockpileSettings::has_allow_inorganic, mBuffer), + std::bind(&StockpileSettings::allow_inorganic, mBuffer), + mPile->settings.allow_inorganic); + read_elem("allow_organic", mode, + std::bind(&StockpileSettings::has_allow_organic, mBuffer), + std::bind(&StockpileSettings::allow_organic, mBuffer), + mPile->settings.allow_organic); +} + +static bool ammo_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); +} + +bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { + bool all = true; + + // ammo type + all = serialize_list_itemdef( + [=](const std::string& token) { ammo->add_type(token); }, + mPile->settings.ammo.type, + std::vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), + item_type::AMMO) && all; + + // metal + all = serialize_list_material( + ammo_mat_is_allowed, + [=](const std::string& token) { ammo->add_mats(token); }, + mPile->settings.ammo.mats) && all; + + // other mats - only wood and bone are expected + if (mPile->settings.ammo.other_mats.size() > 2) { + WARN(log).print("ammo other materials > 2: %zd\n", + mPile->settings.ammo.other_mats.size()); + } + + size_t num_other_mats = std::min(size_t(2), + mPile->settings.ammo.other_mats.size()); + for (size_t i = 0; i < num_other_mats; ++i) { + if (!mPile->settings.ammo.other_mats.at(i)) { + all = false; + continue; + } + const std::string token = i == 0 ? "WOOD" : "BONE"; + ammo->add_other_mats(token); + DEBUG(log).print("other mats %zd is %s\n", i, token.c_str()); + } + + // quality core + all = serialize_list_quality( + [=](const std::string& token) { ammo->add_quality_core(token); }, + mPile->settings.ammo.quality_core) && all; + + // quality total + all = serialize_list_quality( + [=](const std::string& token) { ammo->add_quality_total(token); }, + mPile->settings.ammo.quality_total) && all; + + return all; +} + +void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& filter) { + read_category("ammo", mode, + std::bind(&StockpileSettings::has_ammo, mBuffer), + std::bind(&StockpileSettings::ammo, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_ammo, + [&]() { + auto & pammo = mPile->settings.ammo; + pammo.type.clear(); + pammo.mats.clear(); + pammo.other_mats.clear(); + quality_clear(pammo.quality_core); + quality_clear(pammo.quality_total); + }, + [&](bool force, char val) { + auto & bammo = mBuffer.ammo(); + auto & pammo = mPile->settings.ammo; + // ammo type + unserialize_list_itemdef( + [=](const size_t& idx) -> const std::string& { return bammo.type(idx); }, + bammo.type_size(), &pammo.type, item_type::AMMO); + + // materials metals + unserialize_list_material(ammo_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, + bammo.mats_size(), &pammo.mats); + + // others + pammo.other_mats.clear(); + pammo.other_mats.resize(2, '\0'); + if (bammo.other_mats_size() > 0) { + // TODO remove hardcoded value + for (int i = 0; i < bammo.other_mats_size(); ++i) { + const std::string token = bammo.other_mats(i); + const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 + : -1; + DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); + if (idx != -1) + pammo.other_mats.at(idx) = 1; + } + } + + // core quality + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return bammo.quality_core(idx); }, + bammo.quality_core_size(), pammo.quality_core); + + // total quality + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return bammo.quality_total(idx); }, + bammo.quality_total_size(), pammo.quality_total); + }); +} + +void StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) { animals->set_empty_cages(mPile->settings.animals.empty_cages); animals->set_empty_traps(mPile->settings.animals.empty_traps); for (size_t i = 0; i < mPile->settings.animals.enabled.size(); ++i) { @@ -422,36 +870,42 @@ void StockpileSerializer::write_animals() { } } -void StockpileSerializer::read_animals() { - if (mBuffer.has_animals()) { - mPile->settings.flags.bits.animals = 1; - DEBUG(log).print("animals:\n"); - mPile->settings.animals.empty_cages = mBuffer.animals().empty_cages(); - mPile->settings.animals.empty_traps = mBuffer.animals().empty_traps(); - - mPile->settings.animals.enabled.clear(); - mPile->settings.animals.enabled.resize(world->raws.creatures.all.size(), '\0'); - DEBUG(log).print("pile has %zd\n", mPile->settings.animals.enabled.size()); - for (auto i = 0; i < mBuffer.animals().enabled_size(); ++i) { - std::string id = mBuffer.animals().enabled(i); - int idx = find_creature(id); - DEBUG(log).print("%s %d\n", id.c_str(), idx); - if (idx < 0 || size_t(idx) >= mPile->settings.animals.enabled.size()) { - WARN(log).print("animal index invalid: %d\n", idx); - continue; - } - mPile->settings.animals.enabled.at(idx) = (char)1; - } - } - else { - mPile->settings.animals.enabled.clear(); - mPile->settings.flags.bits.animals = 0; - mPile->settings.animals.empty_cages = false; - mPile->settings.animals.empty_traps = false; - } +void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& filter) { + read_category("animals", mode, + std::bind(&StockpileSettings::has_animals, mBuffer), + std::bind(&StockpileSettings::animals, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_animals, + [&]() { + auto & panimals = mPile->settings.animals; + panimals.empty_cages = false; + panimals.empty_traps = false; + panimals.enabled.clear(); + }, + [&](bool force, char val) { + auto & banimals = mBuffer.animals(); + auto & panimals = mPile->settings.animals; + if (force || banimals.empty_cages()) + panimals.empty_cages = banimals.empty_cages() && val; + if (force || banimals.empty_traps()) + panimals.empty_traps = banimals.empty_traps() && val; + + panimals.enabled.resize(world->raws.creatures.all.size(), '\0'); + for (auto i = 0; i < banimals.enabled_size(); ++i) { + const std::string& id = banimals.enabled(i); + int idx = find_creature(id); + DEBUG(log).print("%s %d\n", id.c_str(), idx); + if (idx < 0 || size_t(idx) >= panimals.enabled.size()) { + WARN(log).print("animal index invalid: %d\n", idx); + continue; + } + if (!filter.size() || id.find(filter) != id.npos) + panimals.enabled.at(idx) = val; + } + }); } -StockpileSerializer::food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { +food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { using df::enums::organic_mat_category::organic_mat_category; using namespace std::placeholders; switch (cat) { @@ -633,8 +1087,7 @@ StockpileSerializer::food_pair StockpileSerializer::food_map(organic_mat_categor return food_pair(); } -void StockpileSerializer::write_food() { - StockpileSettings::FoodSet* food = mBuffer.mutable_food(); +void StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { DEBUG(log).print("food:\n"); food->set_prepared_meals(mPile->settings.food.prepared_meals); @@ -649,7 +1102,7 @@ void StockpileSerializer::write_food() { } } -void StockpileSerializer::read_food() { +void StockpileSerializer::read_food(DeserializeMode mode, const std::string& filter) { using df::enums::organic_mat_category::organic_mat_category; using traits = df::enum_traits; if (mBuffer.has_food()) { @@ -683,27 +1136,7 @@ void StockpileSerializer::read_food() { } } -void StockpileSerializer::furniture_setup_other_mats() { - mOtherMatsFurniture.insert(std::make_pair(0, "WOOD")); - mOtherMatsFurniture.insert(std::make_pair(1, "PLANT_CLOTH")); - mOtherMatsFurniture.insert(std::make_pair(2, "BONE")); - mOtherMatsFurniture.insert(std::make_pair(3, "TOOTH")); - mOtherMatsFurniture.insert(std::make_pair(4, "HORN")); - mOtherMatsFurniture.insert(std::make_pair(5, "PEARL")); - mOtherMatsFurniture.insert(std::make_pair(6, "SHELL")); - mOtherMatsFurniture.insert(std::make_pair(7, "LEATHER")); - mOtherMatsFurniture.insert(std::make_pair(8, "SILK")); - mOtherMatsFurniture.insert(std::make_pair(9, "AMBER")); - mOtherMatsFurniture.insert(std::make_pair(10, "CORAL")); - mOtherMatsFurniture.insert(std::make_pair(11, "GREEN_GLASS")); - mOtherMatsFurniture.insert(std::make_pair(12, "CLEAR_GLASS")); - mOtherMatsFurniture.insert(std::make_pair(13, "CRYSTAL_GLASS")); - mOtherMatsFurniture.insert(std::make_pair(14, "YARN")); -} - -void StockpileSerializer::write_furniture() { - StockpileSettings::FurnitureSet* furniture = mBuffer.mutable_furniture(); - +void StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furniture) { // FURNITURE type using df::enums::furniture_type::furniture_type; using type_traits = df::enum_traits; @@ -722,7 +1155,7 @@ void StockpileSerializer::write_furniture() { // other mats serialize_list_other_mats( - mOtherMatsFurniture, [=](const std::string& token) { furniture->add_other_mats(token); }, + mOtherMatsFurniture.mats, [=](const std::string& token) { furniture->add_other_mats(token); }, mPile->settings.furniture.other_mats); serialize_list_quality([=](const std::string& token) { furniture->add_quality_core(token); }, @@ -735,7 +1168,7 @@ bool StockpileSerializer::furniture_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::read_furniture() { +void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_furniture()) { mPile->settings.flags.bits.furniture = 1; const StockpileSettings::FurnitureSet furniture = mBuffer.furniture(); @@ -766,7 +1199,7 @@ void StockpileSerializer::read_furniture() { // other materials unserialize_list_other_mats( - mOtherMatsFurniture, [=](const size_t& idx) -> const std::string& { return furniture.other_mats(idx); }, + mOtherMatsFurniture.mats, [=](const size_t& idx) -> const std::string& { return furniture.other_mats(idx); }, furniture.other_mats_size(), &mPile->settings.furniture.other_mats); // core quality @@ -816,9 +1249,8 @@ bool StockpileSerializer::refuse_type_is_allowed(item_type::item_type type) { return true; } -void StockpileSerializer::write_refuse() { +void StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { DEBUG(log).print("refuse:\n"); - StockpileSettings::RefuseSet* refuse = mBuffer.mutable_refuse(); refuse->set_fresh_raw_hide(mPile->settings.refuse.fresh_raw_hide); refuse->set_rotten_raw_hide(mPile->settings.refuse.rotten_raw_hide); @@ -876,7 +1308,7 @@ void StockpileSerializer::refuse_read_helper(std::functionsettings.flags.bits.refuse = 1; const StockpileSettings::RefuseSet refuse = mBuffer.refuse(); @@ -949,16 +1381,14 @@ bool StockpileSerializer::stone_is_allowed(const MaterialInfo& mi) { return is_allowed_soil || is_allowed_stone; } -void StockpileSerializer::write_stone() { - StockpileSettings::StoneSet* stone = mBuffer.mutable_stone(); - +void StockpileSerializer::write_stone(StockpileSettings::StoneSet* stone) { FuncMaterialAllowed filter = std::bind(&StockpileSerializer::stone_is_allowed, this, _1); serialize_list_material( filter, [=](const std::string& token) { stone->add_mats(token); }, mPile->settings.stone.mats); } -void StockpileSerializer::read_stone() { +void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_stone()) { mPile->settings.flags.bits.stone = 1; const StockpileSettings::StoneSet stone = mBuffer.stone(); @@ -975,109 +1405,18 @@ void StockpileSerializer::read_stone() { } } -bool StockpileSerializer::ammo_mat_is_allowed(const MaterialInfo& mi) { - return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); -} - -void StockpileSerializer::write_ammo() { - StockpileSettings::AmmoSet* ammo = mBuffer.mutable_ammo(); - - // ammo type - serialize_list_itemdef([=](const std::string& token) { ammo->add_type(token); }, - mPile->settings.ammo.type, - std::vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), - item_type::AMMO); - - // metal - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::ammo_mat_is_allowed, this, _1); - serialize_list_material( - filter, [=](const std::string& token) { ammo->add_mats(token); }, - mPile->settings.ammo.mats); - - // other mats - only wood and bone - if (mPile->settings.ammo.other_mats.size() > 2) { - WARN(log).print("ammo other materials > 2: %zd\n", mPile->settings.ammo.other_mats.size()); - } - - for (size_t i = 0; i < std::min(size_t(2), mPile->settings.ammo.other_mats.size()); ++i) { - if (!mPile->settings.ammo.other_mats.at(i)) - continue; - const std::string token = i == 0 ? "WOOD" : "BONE"; - ammo->add_other_mats(token); - DEBUG(log).print(" other mats %zd is %s\n", i, token.c_str()); - } - - // quality core - serialize_list_quality([=](const std::string& token) { ammo->add_quality_core(token); }, - mPile->settings.ammo.quality_core); - - // quality total - serialize_list_quality([=](const std::string& token) { ammo->add_quality_total(token); }, - mPile->settings.ammo.quality_total); -} - -void StockpileSerializer::read_ammo() { - if (mBuffer.has_ammo()) { - mPile->settings.flags.bits.ammo = 1; - const StockpileSettings::AmmoSet ammo = mBuffer.ammo(); - DEBUG(log).print("ammo:\n"); - - // ammo type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return ammo.type(idx); }, - ammo.type_size(), &mPile->settings.ammo.type, item_type::AMMO); - - // materials metals - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::ammo_mat_is_allowed, this, _1); - unserialize_list_material( - filter, [=](const size_t& idx) -> const std::string& { return ammo.mats(idx); }, - ammo.mats_size(), &mPile->settings.ammo.mats); - - // others - mPile->settings.ammo.other_mats.clear(); - mPile->settings.ammo.other_mats.resize(2, '\0'); - if (ammo.other_mats_size() > 0) { - // TODO remove hardcoded value - for (int i = 0; i < ammo.other_mats_size(); ++i) { - const std::string token = ammo.other_mats(i); - const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 - : -1; - DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); - if (idx != -1) - mPile->settings.ammo.other_mats.at(idx) = 1; - } - } - - // core quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return ammo.quality_core(idx); }, - ammo.quality_core_size(), mPile->settings.ammo.quality_core); - - // total quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return ammo.quality_total(idx); }, - ammo.quality_total_size(), mPile->settings.ammo.quality_total); - } - else { - mPile->settings.flags.bits.ammo = 0; - mPile->settings.ammo.type.clear(); - mPile->settings.ammo.mats.clear(); - mPile->settings.ammo.other_mats.clear(); - quality_clear(mPile->settings.ammo.quality_core); - quality_clear(mPile->settings.ammo.quality_total); - } -} - bool StockpileSerializer::coins_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid(); } -void StockpileSerializer::write_coins() { - StockpileSettings::CoinSet* coins = mBuffer.mutable_coin(); +void StockpileSerializer::write_coins(StockpileSettings::CoinSet* coins) { FuncMaterialAllowed filter = std::bind(&StockpileSerializer::coins_mat_is_allowed, this, _1); serialize_list_material( filter, [=](const std::string& token) { coins->add_mats(token); }, mPile->settings.coins.mats); } -void StockpileSerializer::read_coins() { +void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_coin()) { mPile->settings.flags.bits.coins = 1; const StockpileSettings::CoinSet coins = mBuffer.coin(); @@ -1094,19 +1433,6 @@ void StockpileSerializer::read_coins() { } } -void StockpileSerializer::bars_blocks_setup_other_mats() { - mOtherMatsBars.insert(std::make_pair(0, "COAL")); - mOtherMatsBars.insert(std::make_pair(1, "POTASH")); - mOtherMatsBars.insert(std::make_pair(2, "ASH")); - mOtherMatsBars.insert(std::make_pair(3, "PEARLASH")); - mOtherMatsBars.insert(std::make_pair(4, "SOAP")); - - mOtherMatsBlocks.insert(std::make_pair(0, "GREEN_GLASS")); - mOtherMatsBlocks.insert(std::make_pair(1, "CLEAR_GLASS")); - mOtherMatsBlocks.insert(std::make_pair(2, "CRYSTAL_GLASS")); - mOtherMatsBlocks.insert(std::make_pair(3, "WOOD")); -} - bool StockpileSerializer::bars_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } @@ -1115,8 +1441,7 @@ bool StockpileSerializer::blocks_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_bars_blocks() { - StockpileSettings::BarsBlocksSet* bars_blocks = mBuffer.mutable_barsblocks(); +void StockpileSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { MaterialInfo mi; FuncMaterialAllowed filter = std::bind(&StockpileSerializer::bars_mat_is_allowed, this, _1); serialize_list_material( @@ -1131,16 +1456,16 @@ void StockpileSerializer::write_bars_blocks() { // bars other mats serialize_list_other_mats( - mOtherMatsBars, [=](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, + mOtherMatsBars.mats, [=](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, mPile->settings.bars_blocks.bars_other_mats); // blocks other mats serialize_list_other_mats( - mOtherMatsBlocks, [=](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, + mOtherMatsBlocks.mats, [=](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, mPile->settings.bars_blocks.blocks_other_mats); } -void StockpileSerializer::read_bars_blocks() { +void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_barsblocks()) { mPile->settings.flags.bits.bars_blocks = 1; const StockpileSettings::BarsBlocksSet bars_blocks = mBuffer.barsblocks(); @@ -1158,12 +1483,12 @@ void StockpileSerializer::read_bars_blocks() { bars_blocks.blocks_mats_size(), &mPile->settings.bars_blocks.blocks_mats); // bars other mats unserialize_list_other_mats( - mOtherMatsBars, [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_other_mats(idx); }, + mOtherMatsBars.mats, [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_other_mats(idx); }, bars_blocks.bars_other_mats_size(), &mPile->settings.bars_blocks.bars_other_mats); // blocks other mats unserialize_list_other_mats( - mOtherMatsBlocks, [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_other_mats(idx); }, + mOtherMatsBlocks.mats, [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_other_mats(idx); }, bars_blocks.blocks_other_mats_size(), &mPile->settings.bars_blocks.blocks_other_mats); } else { @@ -1185,8 +1510,7 @@ bool StockpileSerializer::gem_other_mat_is_allowed(MaterialInfo& mi) { return mi.isValid() && (mi.getToken() == "GLASS_GREEN" || mi.getToken() == "GLASS_CLEAR" || mi.getToken() == "GLASS_CRYSTAL"); } -void StockpileSerializer::write_gems() { - StockpileSettings::GemsSet* gems = mBuffer.mutable_gems(); +void StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { MaterialInfo mi; // rough mats FuncMaterialAllowed filter_rough = std::bind(&StockpileSerializer::gem_mat_is_allowed, this, _1); @@ -1222,7 +1546,7 @@ void StockpileSerializer::write_gems() { } } -void StockpileSerializer::read_gems() { +void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_gems()) { mPile->settings.flags.bits.gems = 1; const StockpileSettings::GemsSet gems = mBuffer.gems(); @@ -1312,32 +1636,11 @@ bool StockpileSerializer::finished_goods_type_is_allowed(item_type::item_type ty } } -void StockpileSerializer::finished_goods_setup_other_mats() { - mOtherMatsFinishedGoods.insert(std::make_pair(0, "WOOD")); - mOtherMatsFinishedGoods.insert(std::make_pair(1, "PLANT_CLOTH")); - mOtherMatsFinishedGoods.insert(std::make_pair(2, "BONE")); - mOtherMatsFinishedGoods.insert(std::make_pair(3, "TOOTH")); - mOtherMatsFinishedGoods.insert(std::make_pair(4, "HORN")); - mOtherMatsFinishedGoods.insert(std::make_pair(5, "PEARL")); - mOtherMatsFinishedGoods.insert(std::make_pair(6, "SHELL")); - mOtherMatsFinishedGoods.insert(std::make_pair(7, "LEATHER")); - mOtherMatsFinishedGoods.insert(std::make_pair(8, "SILK")); - mOtherMatsFinishedGoods.insert(std::make_pair(9, "AMBER")); - mOtherMatsFinishedGoods.insert(std::make_pair(10, "CORAL")); - mOtherMatsFinishedGoods.insert(std::make_pair(11, "GREEN_GLASS")); - mOtherMatsFinishedGoods.insert(std::make_pair(12, "CLEAR_GLASS")); - mOtherMatsFinishedGoods.insert(std::make_pair(13, "CRYSTAL_GLASS")); - mOtherMatsFinishedGoods.insert(std::make_pair(14, "YARN")); - mOtherMatsFinishedGoods.insert(std::make_pair(15, "WAX")); -} - bool StockpileSerializer::finished_goods_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_finished_goods() { - StockpileSettings::FinishedGoodsSet* finished_goods = mBuffer.mutable_finished_goods(); - +void StockpileSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { // type FuncItemAllowed filter = std::bind(&StockpileSerializer::finished_goods_type_is_allowed, this, _1); serialize_list_item_type( @@ -1352,7 +1655,7 @@ void StockpileSerializer::write_finished_goods() { // other mats serialize_list_other_mats( - mOtherMatsFinishedGoods, [=](const std::string& token) { finished_goods->add_other_mats(token); }, + mOtherMatsFinishedGoods.mats, [=](const std::string& token) { finished_goods->add_other_mats(token); }, mPile->settings.finished_goods.other_mats); // quality core @@ -1364,7 +1667,7 @@ void StockpileSerializer::write_finished_goods() { mPile->settings.finished_goods.quality_total); } -void StockpileSerializer::read_finished_goods() { +void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_finished_goods()) { mPile->settings.flags.bits.finished_goods = 1; const StockpileSettings::FinishedGoodsSet finished_goods = mBuffer.finished_goods(); @@ -1384,7 +1687,7 @@ void StockpileSerializer::read_finished_goods() { // other mats unserialize_list_other_mats( - mOtherMatsFinishedGoods, [=](const size_t& idx) -> const std::string& { return finished_goods.other_mats(idx); }, + mOtherMatsFinishedGoods.mats, [=](const size_t& idx) -> const std::string& { return finished_goods.other_mats(idx); }, finished_goods.other_mats_size(), &mPile->settings.finished_goods.other_mats); // core quality @@ -1405,15 +1708,13 @@ void StockpileSerializer::read_finished_goods() { } } -void StockpileSerializer::write_leather() { - StockpileSettings::LeatherSet* leather = mBuffer.mutable_leather(); - +void StockpileSerializer::write_leather(StockpileSettings::LeatherSet* leather) { FuncWriteExport setter = [=](const std::string& id) { leather->add_mats(id); }; serialize_list_organic_mat(setter, &mPile->settings.leather.mats, organic_mat_category::Leather); } -void StockpileSerializer::read_leather() { +void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_leather()) { mPile->settings.flags.bits.leather = 1; const StockpileSettings::LeatherSet leather = mBuffer.leather(); @@ -1428,9 +1729,7 @@ void StockpileSerializer::read_leather() { } } -void StockpileSerializer::write_cloth() { - StockpileSettings::ClothSet* cloth = mBuffer.mutable_cloth(); - +void StockpileSerializer::write_cloth(StockpileSettings::ClothSet* cloth) { serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_silk(token); }, &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); @@ -1455,7 +1754,7 @@ void StockpileSerializer::write_cloth() { serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_metal(token); }, &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); } -void StockpileSerializer::read_cloth() { +void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_cloth()) { mPile->settings.flags.bits.cloth = 1; const StockpileSettings::ClothSet cloth = mBuffer.cloth(); @@ -1502,8 +1801,7 @@ bool StockpileSerializer::wood_mat_is_allowed(const df::plant_raw* plant) { return plant && plant->flags.is_set(plant_raw_flags::TREE); } -void StockpileSerializer::write_wood() { - StockpileSettings::WoodSet* wood = mBuffer.mutable_wood(); +void StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { for (size_t i = 0; i < mPile->settings.wood.mats.size(); ++i) { if (mPile->settings.wood.mats.at(i)) { const df::plant_raw* plant = find_plant(i); @@ -1514,7 +1812,7 @@ void StockpileSerializer::write_wood() { } } } -void StockpileSerializer::read_wood() { +void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_wood()) { mPile->settings.flags.bits.wood = 1; const StockpileSettings::WoodSet wood = mBuffer.wood(); @@ -1543,9 +1841,7 @@ bool StockpileSerializer::weapons_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_weapons() { - StockpileSettings::WeaponsSet* weapons = mBuffer.mutable_weapons(); - +void StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) { weapons->set_unusable(mPile->settings.weapons.unusable); weapons->set_usable(mPile->settings.weapons.usable); @@ -1569,7 +1865,7 @@ void StockpileSerializer::write_weapons() { // other mats serialize_list_other_mats( - mOtherMatsWeaponsArmor, [=](const std::string& token) { weapons->add_other_mats(token); }, + mOtherMatsWeaponsArmor.mats, [=](const std::string& token) { weapons->add_other_mats(token); }, mPile->settings.weapons.other_mats); // quality core @@ -1581,7 +1877,7 @@ void StockpileSerializer::write_weapons() { mPile->settings.weapons.quality_total); } -void StockpileSerializer::read_weapons() { +void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_weapons()) { mPile->settings.flags.bits.weapons = 1; const StockpileSettings::WeaponsSet weapons = mBuffer.weapons(); @@ -1610,7 +1906,7 @@ void StockpileSerializer::read_weapons() { // other mats unserialize_list_other_mats( - mOtherMatsWeaponsArmor, [=](const size_t& idx) -> const std::string& { return weapons.other_mats(idx); }, + mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return weapons.other_mats(idx); }, weapons.other_mats_size(), &mPile->settings.weapons.other_mats); // core quality @@ -1631,26 +1927,11 @@ void StockpileSerializer::read_weapons() { } } -void StockpileSerializer::weapons_armor_setup_other_mats() { - mOtherMatsWeaponsArmor.insert(std::make_pair(0, "WOOD")); - mOtherMatsWeaponsArmor.insert(std::make_pair(1, "PLANT_CLOTH")); - mOtherMatsWeaponsArmor.insert(std::make_pair(2, "BONE")); - mOtherMatsWeaponsArmor.insert(std::make_pair(3, "SHELL")); - mOtherMatsWeaponsArmor.insert(std::make_pair(4, "LEATHER")); - mOtherMatsWeaponsArmor.insert(std::make_pair(5, "SILK")); - mOtherMatsWeaponsArmor.insert(std::make_pair(6, "GREEN_GLASS")); - mOtherMatsWeaponsArmor.insert(std::make_pair(7, "CLEAR_GLASS")); - mOtherMatsWeaponsArmor.insert(std::make_pair(8, "CRYSTAL_GLASS")); - mOtherMatsWeaponsArmor.insert(std::make_pair(9, "YARN")); -} - bool StockpileSerializer::armor_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -void StockpileSerializer::write_armor() { - StockpileSettings::ArmorSet* armor = mBuffer.mutable_armor(); - +void StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { armor->set_unusable(mPile->settings.armor.unusable); armor->set_usable(mPile->settings.armor.usable); @@ -1698,7 +1979,7 @@ void StockpileSerializer::write_armor() { // other mats serialize_list_other_mats( - mOtherMatsWeaponsArmor, [=](const std::string& token) { armor->add_other_mats(token); }, + mOtherMatsWeaponsArmor.mats, [=](const std::string& token) { armor->add_other_mats(token); }, mPile->settings.armor.other_mats); // quality core @@ -1710,7 +1991,7 @@ void StockpileSerializer::write_armor() { mPile->settings.armor.quality_total); } -void StockpileSerializer::read_armor() { +void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& filter) { if (mBuffer.has_armor()) { mPile->settings.flags.bits.armor = 1; const StockpileSettings::ArmorSet armor = mBuffer.armor(); @@ -1755,7 +2036,7 @@ void StockpileSerializer::read_armor() { // other mats unserialize_list_other_mats( - mOtherMatsWeaponsArmor, [=](const size_t& idx) -> const std::string& { return armor.other_mats(idx); }, + mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return armor.other_mats(idx); }, armor.other_mats_size(), &mPile->settings.armor.other_mats); // core quality @@ -1779,3 +2060,19 @@ void StockpileSerializer::read_armor() { quality_clear(mPile->settings.armor.quality_total); } } + +void StockpileSerializer::write_corpses(StockpileSettings::CorpsesSet* corpses) { + +} + +void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& filter) { + +} + +void StockpileSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { + +} + +void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& filter) { + +} diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index 3fe2087de..24c6d5d98 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -14,16 +14,52 @@ namespace df struct building_stockpilest; } +enum IncludedElements { + INCLUDED_ELEMENTS_NONE = 0x00, + INCLUDED_ELEMENTS_CONTAINERS = 0x01, + INCLUDED_ELEMENTS_GENERAL = 0x02, + INCLUDED_ELEMENTS_CATEGORIES = 0x04, + INCLUDED_ELEMENTS_TYPES = 0x08, +}; + +enum DeserializeMode { + DESERIALIZE_MODE_SET = 0, + DESERIALIZE_MODE_ENABLE = 1, + DESERIALIZE_MODE_DISABLE = 2, +}; + +// read the token from the serialized list during import +typedef std::function FuncReadImport; +// add the token to the serialized list during export +typedef std::function FuncWriteExport; +// are item's of item_type allowed? +typedef std::function FuncItemAllowed; +// is this material allowed? +typedef std::function FuncMaterialAllowed; + +// convenient struct for parsing food stockpile items +struct food_pair { + // exporting + FuncWriteExport set_value; + std::vector* stockpile_values; + // importing + FuncReadImport get_value; + size_t serialized_count; + bool valid; + + food_pair(FuncWriteExport s, std::vector* sp_v, FuncReadImport g, size_t count) + : set_value(s), stockpile_values(sp_v), get_value(g), serialized_count(count), valid(true) { } + food_pair(): valid(false) { } +}; + /** * Class for serializing the stockpile_settings structure into a Google protobuf */ class StockpileSerializer { public: /** - * @param out for debugging * @param stockpile stockpile to read or write settings to */ - StockpileSerializer(df::building_stockpilest* stockpile); ~StockpileSerializer(); @@ -32,191 +68,64 @@ public: * Since we depend on protobuf-lite, not the full lib, we copy this function from * protobuf message.cc */ - bool serialize_to_ostream(std::ostream* output); + bool serialize_to_ostream(std::ostream* output, uint32_t includedElements); /** * Will serialize stockpile settings to a file (overwrites existing files) * @return success/failure */ - bool serialize_to_file(const std::string& file); + bool serialize_to_file(const std::string& file, uint32_t includedElements); /** * Again, copied from message.cc */ - bool parse_from_istream(std::istream* input); + bool parse_from_istream(std::istream* input, DeserializeMode mode, const std::string& filter); /** * Read stockpile settings from file */ - bool unserialize_from_file(const std::string& file); + bool unserialize_from_file(const std::string& file, DeserializeMode mode, const std::string& filter); private: df::building_stockpilest* mPile; dfstockpiles::StockpileSettings mBuffer; - std::map mOtherMatsFurniture; - std::map mOtherMatsFinishedGoods; - std::map mOtherMatsBars; - std::map mOtherMatsBlocks; - std::map mOtherMatsWeaponsArmor; - - /** - read memory structures and serialize to protobuf - */ - void write(); - - // parse serialized data into ui indices - void read(); - - /** - * Find an enum's value based off the string label. - * @param traits the enum's trait struct - * @param token the string value in key_table - * @return the enum's value, -1 if not found - */ - template - static typename df::enum_traits::base_type linear_index(df::enum_traits traits, const std::string& token) { - auto j = traits.first_item_value; - auto limit = traits.last_item_value; - // sometimes enums start at -1, which is bad news for array indexing - if (j < 0) { - j += abs(traits.first_item_value); - limit += abs(traits.first_item_value); - } - for (; j <= limit; ++j) { - if (token.compare(traits.key_table[j]) == 0) - return j; - } - return -1; - } - - // read the token from the serailized list during import - typedef std::function FuncReadImport; - // add the token to the serialized list during export - typedef std::function FuncWriteExport; - // are item's of item_type allowed? - typedef std::function FuncItemAllowed; - // is this material allowed? - typedef std::function FuncMaterialAllowed; - - // convenient struct for parsing food stockpile items - struct food_pair { - // exporting - FuncWriteExport set_value; - std::vector* stockpile_values; - // importing - FuncReadImport get_value; - size_t serialized_count; - bool valid; - - food_pair(FuncWriteExport s, std::vector* sp_v, FuncReadImport g, size_t count) - : set_value(s), stockpile_values(sp_v), get_value(g), serialized_count(count), valid(true) { } - food_pair(): valid(false) { } - }; - - /** - * There are many repeated (un)serialization cases throughout the stockpile_settings structure, - * so the most common cases have been generalized into generic functions using lambdas. - * - * The basic process to serialize a stockpile_settings structure is: - * 1. loop through the list - * 2. for every element that is TRUE: - * 3. map the specific stockpile_settings index into a general material, creature, etc index - * 4. verify that type is allowed in the list (e.g., no stone in gems stockpiles) - * 5. add it to the protobuf using FuncWriteExport - * - * The unserialization process is the same in reverse. - */ - void serialize_list_organic_mat(FuncWriteExport add_value, const std::vector* list, df::enums::organic_mat_category::organic_mat_category cat); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_organic_mat(FuncReadImport get_value, size_t list_size, std::vector* pile_list, df::enums::organic_mat_category::organic_mat_category cat); - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_item_type(FuncItemAllowed is_allowed, FuncWriteExport add_value, const std::vector& list); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_item_type(FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list); - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_material(FuncMaterialAllowed is_allowed, FuncWriteExport add_value, const std::vector& list); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_material(FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector* pile_list); - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_quality(FuncWriteExport add_value, const bool(&quality_list)[7]); - /** - * Set all values in a bool[7] to false - */ - void quality_clear(bool(&pile_list)[7]); + // read memory structures and serialize to protobuf + void write(uint32_t includedElements); - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_quality(FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]); + // parse serialized data into ui indices + void read(DeserializeMode mode, const std::string& filter); /** - * @see serialize_list_organic_mat - */ - void serialize_list_other_mats(const std::map other_mats, FuncWriteExport add_value, std::vector list); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_other_mats(const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector* pile_list); - - /** - * @see serialize_list_organic_mat - */ - void serialize_list_itemdef(FuncWriteExport add_value, std::vector list, std::vector items, df::enums::item_type::item_type type); - - /** - * @see serialize_list_organic_mat - */ - void unserialize_list_itemdef(FuncReadImport read_value, int32_t list_size, std::vector* pile_list, df::enums::item_type::item_type type); - - /** - * Given a list of other_materials and an index, return its corresponding token + * Given a list of other_materials and an index, return its corresponding token * @return empty string if not found * @see other_mats_token */ std::string other_mats_index(const std::map other_mats, int idx); /** - * Given a list of other_materials and a token, return its corresponding index + * Given a list of other_materials and a token, return its corresponding index * @return -1 if not found * @see other_mats_index */ int other_mats_token(const std::map other_mats, const std::string& token); + void write_containers(); + void read_containers(DeserializeMode mode); void write_general(); - void read_general(); + void read_general(DeserializeMode mode); - void write_animals(); - void read_animals(); + void write_animals(dfstockpiles::StockpileSettings::AnimalsSet* animals); + void read_animals(DeserializeMode mode, const std::string& filter); food_pair food_map(df::enums::organic_mat_category::organic_mat_category cat); - void write_food(); - void read_food(); + void write_food(dfstockpiles::StockpileSettings::FoodSet* food); + void read_food(DeserializeMode mode, const std::string& filter); - void furniture_setup_other_mats(); - void write_furniture(); + void write_furniture(dfstockpiles::StockpileSettings::FurnitureSet* furniture); bool furniture_mat_is_allowed(const DFHack::MaterialInfo& mi); - void read_furniture(); + void read_furniture(DeserializeMode mode, const std::string& filter); bool refuse_creature_is_allowed(const df::creature_raw* raw); @@ -224,60 +133,57 @@ private: bool refuse_type_is_allowed(df::enums::item_type::item_type type); - void write_refuse(); + void write_refuse(dfstockpiles::StockpileSettings::RefuseSet* refuse); void refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list); - void read_refuse(); + void read_refuse(DeserializeMode mode, const std::string& filter); bool stone_is_allowed(const DFHack::MaterialInfo& mi); - void write_stone(); + void write_stone(dfstockpiles::StockpileSettings::StoneSet* stone); - void read_stone(); + void read_stone(DeserializeMode mode, const std::string& filter); - bool ammo_mat_is_allowed(const DFHack::MaterialInfo& mi); - - void write_ammo(); - void read_ammo(); + bool write_ammo(dfstockpiles::StockpileSettings::AmmoSet* ammo); + void read_ammo(DeserializeMode mode, const std::string& filter); bool coins_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_coins(); - - void read_coins(); - - void bars_blocks_setup_other_mats(); + void write_coins(dfstockpiles::StockpileSettings::CoinSet* coins); + void read_coins(DeserializeMode mode, const std::string& filter); bool bars_mat_is_allowed(const DFHack::MaterialInfo& mi); bool blocks_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_bars_blocks(); - void read_bars_blocks(); + void write_bars_blocks(dfstockpiles::StockpileSettings::BarsBlocksSet* bars_blocks); + void read_bars_blocks(DeserializeMode mode, const std::string& filter); bool gem_mat_is_allowed(const DFHack::MaterialInfo& mi); bool gem_cut_mat_is_allowed(const DFHack::MaterialInfo& mi); bool gem_other_mat_is_allowed(DFHack::MaterialInfo& mi); - void write_gems(); + void write_gems(dfstockpiles::StockpileSettings::GemsSet* gems); - void read_gems(); + void read_gems(DeserializeMode mode, const std::string& filter); bool finished_goods_type_is_allowed(df::enums::item_type::item_type type); - void finished_goods_setup_other_mats(); bool finished_goods_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_finished_goods(); - void read_finished_goods(); - void write_leather(); - void read_leather(); - void write_cloth(); - void read_cloth(); + void write_finished_goods(dfstockpiles::StockpileSettings::FinishedGoodsSet* finished_goods); + void read_finished_goods(DeserializeMode mode, const std::string& filter); + void write_leather(dfstockpiles::StockpileSettings::LeatherSet* leather); + void read_leather(DeserializeMode mode, const std::string& filter); + void write_cloth(dfstockpiles::StockpileSettings::ClothSet* cloth); + void read_cloth(DeserializeMode mode, const std::string& filter); bool wood_mat_is_allowed(const df::plant_raw* plant); - void write_wood(); - void read_wood(); + void write_wood(dfstockpiles::StockpileSettings::WoodSet* wood); + void read_wood(DeserializeMode mode, const std::string& filter); bool weapons_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_weapons(); - void read_weapons(); - void weapons_armor_setup_other_mats(); + void write_weapons(dfstockpiles::StockpileSettings::WeaponsSet* weapons); + void read_weapons(DeserializeMode mode, const std::string& filter); bool armor_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_armor(); - void read_armor(); + void write_armor(dfstockpiles::StockpileSettings::ArmorSet* armor); + void read_armor(DeserializeMode mode, const std::string& filter); + void write_corpses(dfstockpiles::StockpileSettings::CorpsesSet* corpses); + void read_corpses(DeserializeMode mode, const std::string& filter); + void write_sheet(dfstockpiles::StockpileSettings::SheetSet* sheet); + void read_sheet(DeserializeMode mode, const std::string& filter); }; diff --git a/plugins/stockpiles/proto/stockpiles.proto b/plugins/stockpiles/proto/stockpiles.proto index 90c95b93f..66815335b 100644 --- a/plugins/stockpiles/proto/stockpiles.proto +++ b/plugins/stockpiles/proto/stockpiles.proto @@ -7,12 +7,14 @@ option optimize_for = LITE_RUNTIME; message StockpileSettings { message AnimalsSet { + optional bool all = 4; optional bool empty_cages = 1; optional bool empty_traps = 2; repeated string enabled = 3; } message FoodSet { + optional bool all = 21; repeated string meat = 1; repeated string fish = 2; repeated string unprepared_fish = 20; @@ -36,6 +38,7 @@ message StockpileSettings { } message FurnitureSet { + optional bool all = 7; repeated string type = 1; repeated string other_mats = 2; repeated string mats = 3; @@ -44,6 +47,7 @@ message StockpileSettings { // UNUSED: optional bool sand_bags = 6; } message RefuseSet { + optional bool all = 12; repeated string type = 1; repeated string corpses = 2; repeated string body_parts = 3; @@ -57,12 +61,14 @@ message StockpileSettings { optional bool rotten_raw_hide = 11; } message StoneSet { - repeated string mats = 1; + optional bool all = 2; + repeated string mats = 1; } message OreSet { - repeated string mats = 1; + repeated string mats = 1; } message AmmoSet { + optional bool all = 6; repeated string type = 1; repeated string other_mats = 2; repeated string mats = 3; @@ -70,21 +76,25 @@ message StockpileSettings { repeated string quality_total = 5; } message CoinSet { + optional bool all = 2; repeated string mats = 1; } message BarsBlocksSet { + optional bool all = 5; repeated string bars_other_mats = 1; repeated string blocks_other_mats = 2; repeated string bars_mats = 3; repeated string blocks_mats = 4; } message GemsSet { + optional bool all = 5; repeated string rough_other_mats = 1; repeated string cut_other_mats = 2; repeated string rough_mats = 3; repeated string cut_mats = 4; } message FinishedGoodsSet { + optional bool all = 6; repeated string type = 1; repeated string other_mats = 2; repeated string mats = 3; @@ -92,9 +102,11 @@ message StockpileSettings { repeated string quality_total = 5; } message LeatherSet { + optional bool all = 2; repeated string mats = 1; } message ClothSet { + optional bool all = 9; repeated string thread_silk = 1; repeated string thread_plant = 2; repeated string thread_yarn = 3; @@ -105,9 +117,11 @@ message StockpileSettings { repeated string cloth_metal = 8; } message WoodSet { + optional bool all = 2; repeated string mats = 1; } message WeaponsSet { + optional bool all = 9; repeated string weapon_type = 1; repeated string trapcomp_type = 2; repeated string other_mats = 3; @@ -117,8 +131,8 @@ message StockpileSettings { optional bool usable = 7; optional bool unusable = 8; } - message ArmorSet { + optional bool all = 13; repeated string body = 1; repeated string head = 2; repeated string feet = 3; @@ -129,33 +143,45 @@ message StockpileSettings { repeated string mats = 8; repeated string quality_core = 9; repeated string quality_total = 10; - optional bool usable =11; + optional bool usable = 11; optional bool unusable = 12; } + message CorpsesSet { + optional bool all = 1; + } + message SheetSet { + optional bool all = 1; + } + + // general settings + optional int32 max_barrels = 20; + optional int32 max_bins = 21; + optional int32 max_wheelbarrows = 22; + optional bool use_links_only = 23; + optional bool allow_organic = 18; + optional bool allow_inorganic = 19; + // categories + optional AmmoSet ammo = 8; optional AnimalsSet animals = 1; + optional ArmorSet armor = 17; + optional BarsBlocksSet barsblocks = 10; + optional ClothSet cloth = 14; + optional CoinSet coin = 9; + optional FinishedGoodsSet finished_goods = 12; optional FoodSet food = 2; optional FurnitureSet furniture = 3; - optional int32 unknown1 = 4 [deprecated=true]; - optional RefuseSet refuse = 5; - optional StoneSet stone = 6; - optional OreSet ore = 7; - optional AmmoSet ammo = 8; - optional CoinSet coin = 9; - optional BarsBlocksSet barsblocks = 10; optional GemsSet gems = 11; - optional FinishedGoodsSet finished_goods = 12; optional LeatherSet leather = 13; - optional ClothSet cloth = 14; - optional WoodSet wood = 15; + optional CorpsesSet corpses_v50 = 25; + optional RefuseSet refuse = 5; + optional SheetSet sheet = 26; + optional StoneSet stone = 6; optional WeaponsSet weapons = 16; - optional ArmorSet armor = 17; - optional bool allow_organic = 18; - optional bool allow_inorganic = 19; - optional bool corpses = 24; - // extras - optional int32 max_barrels = 20; - optional int32 max_bins = 21; - optional int32 max_wheelbarrows = 22; - optional bool use_links_only = 23; + optional WoodSet wood = 15; + + // deprecated + optional bool corpses = 24; // not marked as deprecated since we still read it + optional OreSet ore = 7 [deprecated=true]; + optional int32 unknown1 = 4 [deprecated=true]; } diff --git a/plugins/stockpiles/stockpiles.cpp b/plugins/stockpiles/stockpiles.cpp index e7b3525ef..99cc16607 100644 --- a/plugins/stockpiles/stockpiles.cpp +++ b/plugins/stockpiles/stockpiles.cpp @@ -83,7 +83,7 @@ static df::building_stockpilest* get_stockpile(int id) { return virtual_cast(df::building::find(id)); } -static bool stockpiles_export(color_ostream& out, string fname, int id) { +static bool stockpiles_export(color_ostream& out, string fname, int id, uint32_t includedElements) { df::building_stockpilest* sp = get_stockpile(id); if (!sp) { out.printerr("Specified building isn't a stockpile: %d.\n", id); @@ -95,7 +95,7 @@ static bool stockpiles_export(color_ostream& out, string fname, int id) { try { StockpileSerializer cereal(sp); - if (!cereal.serialize_to_file(fname)) { + if (!cereal.serialize_to_file(fname, includedElements)) { out.printerr("could not save to '%s'\n", fname.c_str()); return false; } @@ -108,7 +108,7 @@ static bool stockpiles_export(color_ostream& out, string fname, int id) { return true; } -static bool stockpiles_import(color_ostream& out, string fname, int id) { +static bool stockpiles_import(color_ostream& out, string fname, int id, string mode_str, string filter) { df::building_stockpilest* sp = get_stockpile(id); if (!sp) { out.printerr("Specified building isn't a stockpile: %d.\n", id); @@ -123,9 +123,15 @@ static bool stockpiles_import(color_ostream& out, string fname, int id) { return false; } + DeserializeMode mode = DESERIALIZE_MODE_SET; + if (mode_str == "enable") + mode = DESERIALIZE_MODE_ENABLE; + else if (mode_str == "disable") + mode = DESERIALIZE_MODE_DISABLE; + try { StockpileSerializer cereal(sp); - if (!cereal.unserialize_from_file(fname)) { + if (!cereal.unserialize_from_file(fname, mode, filter)) { out.printerr("deserialization failed: '%s'\n", fname.c_str()); return false; } From 1c527ab3d855211738de748f78f0312122413bbc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 19 Mar 2023 17:31:35 -0700 Subject: [PATCH 094/439] rejiggered --- plugins/stockpiles/StockpileSerializer.cpp | 2056 ++++++++++---------- plugins/stockpiles/StockpileSerializer.h | 104 +- 2 files changed, 1081 insertions(+), 1079 deletions(-) diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 04e7cb9fa..3b2849333 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -554,75 +554,91 @@ void StockpileSerializer::write(uint32_t includedElements) { bool include_types = 0 != (includedElements & INCLUDED_ELEMENTS_TYPES); - write_cat(include_types, mPile->settings.flags.whole, + write_cat(include_types, + mPile->settings.flags.whole, mPile->settings.flags.mask_ammo, std::bind(&StockpileSettings::mutable_ammo, mBuffer), std::bind(&StockpileSerializer::write_ammo, this, _1)); - - if (mPile->settings.flags.bits.animals) { - StockpileSettings::AnimalsSet* animals = mBuffer.mutable_animals(); - if (include_types) write_animals(animals); else animals->set_all(true); - } - if (mPile->settings.flags.bits.armor) { - StockpileSettings::ArmorSet* armor = mBuffer.mutable_armor(); - if (include_types) write_armor(armor); else armor->set_all(true); - } - if (mPile->settings.flags.bits.bars_blocks) { - StockpileSettings::BarsBlocksSet* bars_blocks = mBuffer.mutable_barsblocks(); - if (include_types) write_bars_blocks(bars_blocks); else bars_blocks->set_all(true); - } - if (mPile->settings.flags.bits.cloth) { - StockpileSettings::ClothSet* cloth = mBuffer.mutable_cloth(); - if (include_types) write_cloth(cloth); else cloth->set_all(true); - } - if (mPile->settings.flags.bits.coins) { - StockpileSettings::CoinSet* coins = mBuffer.mutable_coin(); - if (include_types) write_coins(coins); else coins->set_all(true); - } - if (mPile->settings.flags.bits.finished_goods) { - StockpileSettings::FinishedGoodsSet* finished_goods = mBuffer.mutable_finished_goods(); - if (include_types) write_finished_goods(finished_goods); else finished_goods->set_all(true); - } - if (mPile->settings.flags.bits.food) { - StockpileSettings::FoodSet* food = mBuffer.mutable_food(); - if (include_types) write_food(food); else food->set_all(true); - } - if (mPile->settings.flags.bits.furniture) { - StockpileSettings::FurnitureSet* furniture = mBuffer.mutable_furniture(); - if (include_types) write_furniture(furniture); else furniture->set_all(true); - } - if (mPile->settings.flags.bits.gems) { - StockpileSettings::GemsSet* gems = mBuffer.mutable_gems(); - if (include_types) write_gems(gems); else gems->set_all(true); - } - if (mPile->settings.flags.bits.leather) { - StockpileSettings::LeatherSet* leather = mBuffer.mutable_leather(); - if (include_types) write_leather(leather); else leather->set_all(true); - } - if (mPile->settings.flags.bits.corpses) { - StockpileSettings::CorpsesSet* corpses = mBuffer.mutable_corpses_v50(); - if (include_types) write_corpses(corpses); else corpses->set_all(true); - } - if (mPile->settings.flags.bits.refuse) { - StockpileSettings::RefuseSet* refuse = mBuffer.mutable_refuse(); - if (include_types) write_refuse(refuse); else refuse->set_all(true); - } - if (mPile->settings.flags.bits.sheet) { - StockpileSettings::SheetSet* sheet = mBuffer.mutable_sheet(); - if (include_types) write_sheet(sheet); else sheet->set_all(true); - } - if (mPile->settings.flags.bits.stone) { - StockpileSettings::StoneSet* stone = mBuffer.mutable_stone(); - if (include_types) write_stone(stone); else stone->set_all(true); - } - if (mPile->settings.flags.bits.weapons) { - StockpileSettings::WeaponsSet* weapons = mBuffer.mutable_weapons(); - if (include_types) write_weapons(weapons); else weapons->set_all(true); - } - if (mPile->settings.flags.bits.wood) { - StockpileSettings::WoodSet* wood = mBuffer.mutable_wood(); - if (include_types) write_wood(wood); else wood->set_all(true); - } + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_animals, + std::bind(&StockpileSettings::mutable_animals, mBuffer), + std::bind(&StockpileSerializer::write_animals, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_armor, + std::bind(&StockpileSettings::mutable_armor, mBuffer), + std::bind(&StockpileSerializer::write_armor, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_bars_blocks, + std::bind(&StockpileSettings::mutable_barsblocks, mBuffer), + std::bind(&StockpileSerializer::write_bars_blocks, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_cloth, + std::bind(&StockpileSettings::mutable_cloth, mBuffer), + std::bind(&StockpileSerializer::write_cloth, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_coins, + std::bind(&StockpileSettings::mutable_coin, mBuffer), + std::bind(&StockpileSerializer::write_coins, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_finished_goods, + std::bind(&StockpileSettings::mutable_finished_goods, mBuffer), + std::bind(&StockpileSerializer::write_finished_goods, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_food, + std::bind(&StockpileSettings::mutable_food, mBuffer), + std::bind(&StockpileSerializer::write_food, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_furniture, + std::bind(&StockpileSettings::mutable_furniture, mBuffer), + std::bind(&StockpileSerializer::write_furniture, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_gems, + std::bind(&StockpileSettings::mutable_gems, mBuffer), + std::bind(&StockpileSerializer::write_gems, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_leather, + std::bind(&StockpileSettings::mutable_leather, mBuffer), + std::bind(&StockpileSerializer::write_leather, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_corpses, + std::bind(&StockpileSettings::mutable_corpses_v50, mBuffer), + std::bind(&StockpileSerializer::write_corpses, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_refuse, + std::bind(&StockpileSettings::mutable_refuse, mBuffer), + std::bind(&StockpileSerializer::write_refuse, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_sheet, + std::bind(&StockpileSettings::mutable_sheet, mBuffer), + std::bind(&StockpileSerializer::write_sheet, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_stone, + std::bind(&StockpileSettings::mutable_stone, mBuffer), + std::bind(&StockpileSerializer::write_stone, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_weapons, + std::bind(&StockpileSettings::mutable_weapons, mBuffer), + std::bind(&StockpileSerializer::write_weapons, this, _1)); + write_cat(include_types, + mPile->settings.flags.whole, + mPile->settings.flags.mask_wood, + std::bind(&StockpileSettings::mutable_wood, mBuffer), + std::bind(&StockpileSerializer::write_wood, this, _1)); } void StockpileSerializer::read(DeserializeMode mode, const std::string& filter) { @@ -858,16 +874,22 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil }); } -void StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) { - animals->set_empty_cages(mPile->settings.animals.empty_cages); - animals->set_empty_traps(mPile->settings.animals.empty_traps); - for (size_t i = 0; i < mPile->settings.animals.enabled.size(); ++i) { - if (mPile->settings.animals.enabled.at(i) == 1) { - df::creature_raw* r = find_creature(i); - DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); - animals->add_enabled(r->creature_id); +bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) { + auto & panimals = mPile->settings.animals; + bool all = panimals.empty_cages && panimals.empty_traps; + + animals->set_empty_cages(panimals.empty_cages); + animals->set_empty_traps(panimals.empty_traps); + for (size_t i = 0; i < panimals.enabled.size(); ++i) { + if (!panimals.enabled.at(i)) { + all = false; + continue; } + df::creature_raw* r = find_creature(i); + DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); + animals->add_enabled(r->creature_id); } + return all; } void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& filter) { @@ -905,645 +927,792 @@ void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& }); } -food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { - using df::enums::organic_mat_category::organic_mat_category; - using namespace std::placeholders; - switch (cat) { - case organic_mat_category::Meat: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_meat(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; - return food_pair(setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); - } - case organic_mat_category::Fish: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_fish(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; - return food_pair(setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); - } - case organic_mat_category::UnpreparedFish: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_unprepared_fish(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; - return food_pair(setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); - } - case organic_mat_category::Eggs: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_egg(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; - return food_pair(setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); - } - case organic_mat_category::Plants: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_plants(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; - return food_pair(setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); - } - case organic_mat_category::PlantDrink: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_drink_plant(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; - return food_pair(setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); - } - case organic_mat_category::CreatureDrink: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_drink_animal(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; - return food_pair(setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); - } - case organic_mat_category::PlantCheese: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_cheese_plant(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; - return food_pair(setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); - } - case organic_mat_category::CreatureCheese: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_cheese_animal(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; - return food_pair(setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); - } - case organic_mat_category::Seed: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_seeds(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; - return food_pair(setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); - } - case organic_mat_category::Leaf: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_leaves(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; - return food_pair(setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); - } - case organic_mat_category::PlantPowder: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_powder_plant(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; - return food_pair(setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); - } - case organic_mat_category::CreaturePowder: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_powder_creature(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; - return food_pair(setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); - } - case organic_mat_category::Glob: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_glob(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; - return food_pair(setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); - } - case organic_mat_category::PlantLiquid: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_liquid_plant(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; - return food_pair(setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); - } - case organic_mat_category::CreatureLiquid: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_liquid_animal(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; - return food_pair(setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); - } - case organic_mat_category::MiscLiquid: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_liquid_misc(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; - return food_pair(setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); - } - - case organic_mat_category::Paste: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_glob_paste(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; - return food_pair(setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); - } - case organic_mat_category::Pressed: - { - FuncWriteExport setter = [=](const std::string& id) { - mBuffer.mutable_food()->add_glob_pressed(id); - }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; - return food_pair(setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); - } - case organic_mat_category::Leather: - case organic_mat_category::Silk: - case organic_mat_category::PlantFiber: - case organic_mat_category::Bone: - case organic_mat_category::Shell: - case organic_mat_category::Wood: - case organic_mat_category::Horn: - case organic_mat_category::Pearl: - case organic_mat_category::Tooth: - case organic_mat_category::EdibleCheese: - case organic_mat_category::AnyDrink: - case organic_mat_category::EdiblePlant: - case organic_mat_category::CookableLiquid: - case organic_mat_category::CookablePowder: - case organic_mat_category::CookableSeed: - case organic_mat_category::CookableLeaf: - case organic_mat_category::Yarn: - case organic_mat_category::MetalThread: - default: - // not used in stockpile food menu - break; - } - return food_pair(); +static bool armor_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -void StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { - DEBUG(log).print("food:\n"); - food->set_prepared_meals(mPile->settings.food.prepared_meals); - - using df::enums::organic_mat_category::organic_mat_category; - using traits = df::enum_traits; - for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { - food_pair p = food_map((organic_mat_category)mat_category); - if (!p.valid) - continue; - DEBUG(log).print("food: %s\n", traits::key_table[mat_category]); - serialize_list_organic_mat(p.set_value, p.stockpile_values, (organic_mat_category)mat_category); - } -} +bool StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { -void StockpileSerializer::read_food(DeserializeMode mode, const std::string& filter) { - using df::enums::organic_mat_category::organic_mat_category; - using traits = df::enum_traits; - if (mBuffer.has_food()) { - mPile->settings.flags.bits.food = 1; - const StockpileSettings::FoodSet food = mBuffer.food(); - DEBUG(log).print("food:\n"); + auto & parmor = mPile->settings.armor; + bool all = parmor.unusable && parmor.usable; - if (food.has_prepared_meals()) - mPile->settings.food.prepared_meals = food.prepared_meals(); - else - mPile->settings.food.prepared_meals = true; + armor->set_unusable(parmor.unusable); + armor->set_usable(parmor.usable); - DEBUG(log).print("prepared_meals: %d\n", mPile->settings.food.prepared_meals); + // armor type + all = serialize_list_itemdef( + [=](const std::string& token) { armor->add_body(token); }, + parmor.body, + std::vector(world->raws.itemdefs.armor.begin(), world->raws.itemdefs.armor.end()), + item_type::ARMOR) && all; - for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { - food_pair p = food_map((organic_mat_category)mat_category); - if (!p.valid) - continue; - unserialize_list_organic_mat(p.get_value, p.serialized_count, p.stockpile_values, (organic_mat_category)mat_category); - } - } - else { - for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { - food_pair p = food_map((organic_mat_category)mat_category); - if (!p.valid) - continue; - p.stockpile_values->clear(); - } - mPile->settings.flags.bits.food = 0; - mPile->settings.food.prepared_meals = false; - } -} + // helm type + all = serialize_list_itemdef( + [=](const std::string& token) { armor->add_head(token); }, + parmor.head, + std::vector(world->raws.itemdefs.helms.begin(), world->raws.itemdefs.helms.end()), + item_type::HELM) && all; -void StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furniture) { - // FURNITURE type - using df::enums::furniture_type::furniture_type; - using type_traits = df::enum_traits; - for (size_t i = 0; i < mPile->settings.furniture.type.size(); ++i) { - if (mPile->settings.furniture.type.at(i)) { - std::string f_type(type_traits::key_table[i]); - furniture->add_type(f_type); - DEBUG(log).print("furniture_type %zd is %s\n", i, f_type.c_str()); - } - } - // metal, stone/clay materials - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::furniture_mat_is_allowed, this, _1); - serialize_list_material( - filter, [=](const std::string& token) { furniture->add_mats(token); }, - mPile->settings.furniture.mats); + // shoes type + all = serialize_list_itemdef( + [=](const std::string& token) { armor->add_feet(token); }, + parmor.feet, + std::vector(world->raws.itemdefs.shoes.begin(), world->raws.itemdefs.shoes.end()), + item_type::SHOES) && all; + + // gloves type + all = serialize_list_itemdef( + [=](const std::string& token) { armor->add_hands(token); }, + parmor.hands, + std::vector(world->raws.itemdefs.gloves.begin(), world->raws.itemdefs.gloves.end()), + item_type::GLOVES) && all; + + // pant type + all = serialize_list_itemdef( + [=](const std::string& token) { armor->add_legs(token); }, + parmor.legs, + std::vector(world->raws.itemdefs.pants.begin(), world->raws.itemdefs.pants.end()), + item_type::PANTS) && all; + + // shield type + all = serialize_list_itemdef( + [=](const std::string& token) { armor->add_shield(token); }, + parmor.shield, + std::vector(world->raws.itemdefs.shields.begin(), world->raws.itemdefs.shields.end()), + item_type::SHIELD) && all; + + // materials + all = serialize_list_material( + armor_mat_is_allowed, + [=](const std::string& token) { armor->add_mats(token); }, + parmor.mats) && all; // other mats - serialize_list_other_mats( - mOtherMatsFurniture.mats, [=](const std::string& token) { furniture->add_other_mats(token); }, - mPile->settings.furniture.other_mats); + all = serialize_list_other_mats( + mOtherMatsWeaponsArmor.mats, [=](const std::string& token) { armor->add_other_mats(token); }, + parmor.other_mats) && all; - serialize_list_quality([=](const std::string& token) { furniture->add_quality_core(token); }, - mPile->settings.furniture.quality_core); - serialize_list_quality([=](const std::string& token) { furniture->add_quality_total(token); }, - mPile->settings.furniture.quality_total); -} + // quality core + all = serialize_list_quality([=](const std::string& token) { armor->add_quality_core(token); }, + parmor.quality_core) && all; -bool StockpileSerializer::furniture_mat_is_allowed(const MaterialInfo& mi) { - return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); + // quality total + all = serialize_list_quality([=](const std::string& token) { armor->add_quality_total(token); }, + parmor.quality_total) && all; + + return all; } -void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_furniture()) { - mPile->settings.flags.bits.furniture = 1; - const StockpileSettings::FurnitureSet furniture = mBuffer.furniture(); - DEBUG(log).print("furniture:\n"); +void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_armor()) { + mPile->settings.flags.bits.armor = 1; + const StockpileSettings::ArmorSet armor = mBuffer.armor(); + DEBUG(log).print("armor:\n"); - // type - using df::enums::furniture_type::furniture_type; - df::enum_traits type_traits; - mPile->settings.furniture.type.clear(); - mPile->settings.furniture.type.resize(type_traits.last_item_value + 1, '\0'); - if (furniture.type_size() > 0) { - for (int i = 0; i < furniture.type_size(); ++i) { - const std::string type = furniture.type(i); - df::enum_traits::base_type idx = linear_index(type_traits, type); - DEBUG(log).print("type %d is %s\n", idx, type.c_str()); - if (idx < 0 || size_t(idx) >= mPile->settings.furniture.type.size()) { - WARN(log).print("furniture type index invalid %s, idx=%d\n", type.c_str(), idx); - continue; - } - mPile->settings.furniture.type.at(idx) = 1; - } - } + bool unusable = armor.unusable(); + bool usable = armor.usable(); + DEBUG(log).print("unusable %d\n", unusable); + DEBUG(log).print("usable %d\n", usable); + mPile->settings.armor.unusable = unusable; + mPile->settings.armor.usable = usable; + + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.body(idx); }, + armor.body_size(), &mPile->settings.armor.body, item_type::ARMOR); + + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.head(idx); }, + armor.head_size(), &mPile->settings.armor.head, item_type::HELM); + + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.feet(idx); }, + armor.feet_size(), &mPile->settings.armor.feet, item_type::SHOES); + + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.hands(idx); }, + armor.hands_size(), &mPile->settings.armor.hands, item_type::GLOVES); + + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.legs(idx); }, + armor.legs_size(), &mPile->settings.armor.legs, item_type::PANTS); + + unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.shield(idx); }, + armor.shield_size(), &mPile->settings.armor.shield, item_type::SHIELD); - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::furniture_mat_is_allowed, this, _1); unserialize_list_material( - filter, [=](const size_t& idx) -> const std::string& { return furniture.mats(idx); }, - furniture.mats_size(), &mPile->settings.furniture.mats); + armor_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return armor.mats(idx); }, + armor.mats_size(), &mPile->settings.armor.mats); - // other materials unserialize_list_other_mats( - mOtherMatsFurniture.mats, [=](const size_t& idx) -> const std::string& { return furniture.other_mats(idx); }, - furniture.other_mats_size(), &mPile->settings.furniture.other_mats); + mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return armor.other_mats(idx); }, + armor.other_mats_size(), &mPile->settings.armor.other_mats); - // core quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_core(idx); }, - furniture.quality_core_size(), mPile->settings.furniture.quality_core); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_core(idx); }, + armor.quality_core_size(), mPile->settings.armor.quality_core); - // total quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_total(idx); }, - furniture.quality_total_size(), mPile->settings.furniture.quality_total); + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_total(idx); }, + armor.quality_total_size(), mPile->settings.armor.quality_total); } else { - mPile->settings.flags.bits.furniture = 0; - mPile->settings.furniture.type.clear(); - mPile->settings.furniture.other_mats.clear(); - mPile->settings.furniture.mats.clear(); - quality_clear(mPile->settings.furniture.quality_core); - quality_clear(mPile->settings.furniture.quality_total); + mPile->settings.flags.bits.armor = 0; + mPile->settings.armor.body.clear(); + mPile->settings.armor.head.clear(); + mPile->settings.armor.feet.clear(); + mPile->settings.armor.hands.clear(); + mPile->settings.armor.legs.clear(); + mPile->settings.armor.shield.clear(); + mPile->settings.armor.other_mats.clear(); + mPile->settings.armor.mats.clear(); + quality_clear(mPile->settings.armor.quality_core); + quality_clear(mPile->settings.armor.quality_total); } } -bool StockpileSerializer::refuse_creature_is_allowed(const df::creature_raw* raw) { - if (!raw) - return false; - // wagon and generated creatures not allowed, except angels - const bool is_wagon = raw->creature_id == "EQUIPMENT_WAGON"; - const bool is_generated = raw->flags.is_set(creature_raw_flags::GENERATED); - const bool is_angel = is_generated && raw->creature_id.find("DIVINE_") != std::string::npos; - return !is_wagon && !(is_generated && !is_angel); +static bool bars_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -void StockpileSerializer::refuse_write_helper(std::function add_value, const vector& list) { - for (size_t i = 0; i < list.size(); ++i) { - if (list.at(i) == 1) { - df::creature_raw* r = find_creature(i); - // skip forgotten beasts, titans, demons, and night creatures - if (!refuse_creature_is_allowed(r)) - continue; - DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); - add_value(r->creature_id); - } - } +static bool blocks_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::refuse_type_is_allowed(item_type::item_type type) { - if (type == item_type::NONE || type == item_type::BAR || type == item_type::SMALLGEM || type == item_type::BLOCKS || type == item_type::ROUGH || type == item_type::BOULDER || type == item_type::CORPSE || type == item_type::CORPSEPIECE || type == item_type::ROCK || type == item_type::ORTHOPEDIC_CAST) - return false; - return true; -} +bool StockpileSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { + bool all = serialize_list_material( + bars_mat_is_allowed, + [=](const std::string& token) { bars_blocks->add_bars_mats(token); }, + mPile->settings.bars_blocks.bars_mats); -void StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { - DEBUG(log).print("refuse:\n"); - refuse->set_fresh_raw_hide(mPile->settings.refuse.fresh_raw_hide); - refuse->set_rotten_raw_hide(mPile->settings.refuse.rotten_raw_hide); + all = serialize_list_material( + blocks_mat_is_allowed, + [=](const std::string& token) { bars_blocks->add_blocks_mats(token); }, + mPile->settings.bars_blocks.blocks_mats) && all; - // type - DEBUG(log).print("getting types\n"); - FuncItemAllowed filter = std::bind(&StockpileSerializer::refuse_type_is_allowed, this, _1); - serialize_list_item_type( - filter, [=](const std::string& token) { - DEBUG(log).print("adding type: %s\n", token.c_str()); - refuse->add_type(token); - }, - mPile->settings.refuse.type); - - // corpses - refuse_write_helper([=](const std::string& id) { refuse->add_corpses(id); }, - mPile->settings.refuse.corpses); - // body_parts - refuse_write_helper([=](const std::string& id) { refuse->add_body_parts(id); }, - mPile->settings.refuse.body_parts); - // skulls - refuse_write_helper([=](const std::string& id) { refuse->add_skulls(id); }, - mPile->settings.refuse.skulls); - // bones - refuse_write_helper([=](const std::string& id) { refuse->add_bones(id); }, - mPile->settings.refuse.bones); - // hair - refuse_write_helper([=](const std::string& id) { refuse->add_hair(id); }, - mPile->settings.refuse.hair); - // shells - refuse_write_helper([=](const std::string& id) { refuse->add_shells(id); }, - mPile->settings.refuse.shells); - // teeth - refuse_write_helper([=](const std::string& id) { refuse->add_teeth(id); }, - mPile->settings.refuse.teeth); - // horns - refuse_write_helper([=](const std::string& id) { refuse->add_horns(id); }, - mPile->settings.refuse.horns); -} - -void StockpileSerializer::refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list) { - pile_list->clear(); - pile_list->resize(world->raws.creatures.all.size(), '\0'); - if (list_size > 0) { - for (size_t i = 0; i < list_size; ++i) { - const std::string creature_id = get_value(i); - const int idx = find_creature(creature_id); - const df::creature_raw* creature = find_creature(idx); - if (idx < 0 || !refuse_creature_is_allowed(creature) || size_t(idx) >= pile_list->size()) { - WARN(log).print("invalid refuse creature %s, idx=%d\n", creature_id.c_str(), idx); - continue; - } - DEBUG(log).print("creature %d is %s\n", idx, creature_id.c_str()); - pile_list->at(idx) = 1; - } - } + all = serialize_list_other_mats( + mOtherMatsBars.mats, [=](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, + mPile->settings.bars_blocks.bars_other_mats) && all; + + all = serialize_list_other_mats( + mOtherMatsBlocks.mats, [=](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, + mPile->settings.bars_blocks.blocks_other_mats) && all; + + return all; } -void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_refuse()) { - mPile->settings.flags.bits.refuse = 1; - const StockpileSettings::RefuseSet refuse = mBuffer.refuse(); - DEBUG(log).print("refuse:\n"); - DEBUG(log).print(" fresh hide %d\n", refuse.fresh_raw_hide()); - DEBUG(log).print(" rotten hide %d\n", refuse.rotten_raw_hide()); - mPile->settings.refuse.fresh_raw_hide = refuse.fresh_raw_hide(); - mPile->settings.refuse.rotten_raw_hide = refuse.rotten_raw_hide(); +void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_barsblocks()) { + mPile->settings.flags.bits.bars_blocks = 1; + const StockpileSettings::BarsBlocksSet bars_blocks = mBuffer.barsblocks(); + DEBUG(log).print("bars_blocks:\n"); - // type - FuncItemAllowed filter = std::bind(&StockpileSerializer::refuse_type_is_allowed, this, _1); - unserialize_list_item_type( - filter, [=](const size_t& idx) -> const std::string& { return refuse.type(idx); }, - refuse.type_size(), &mPile->settings.refuse.type); + unserialize_list_material( + bars_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_mats(idx); }, + bars_blocks.bars_mats_size(), &mPile->settings.bars_blocks.bars_mats); - // corpses - DEBUG(log).print(" corpses\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.corpses(idx); }, - refuse.corpses_size(), &mPile->settings.refuse.corpses); - // body_parts - DEBUG(log).print(" body_parts\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.body_parts(idx); }, - refuse.body_parts_size(), &mPile->settings.refuse.body_parts); - // skulls - DEBUG(log).print(" skulls\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.skulls(idx); }, - refuse.skulls_size(), &mPile->settings.refuse.skulls); - // bones - DEBUG(log).print(" bones\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.bones(idx); }, - refuse.bones_size(), &mPile->settings.refuse.bones); - // hair - DEBUG(log).print(" hair\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.hair(idx); }, - refuse.hair_size(), &mPile->settings.refuse.hair); - // shells - DEBUG(log).print(" shells\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.shells(idx); }, - refuse.shells_size(), &mPile->settings.refuse.shells); - // teeth - DEBUG(log).print(" teeth\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.teeth(idx); }, - refuse.teeth_size(), &mPile->settings.refuse.teeth); - // horns - DEBUG(log).print(" horns\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.horns(idx); }, - refuse.horns_size(), &mPile->settings.refuse.horns); + unserialize_list_material( + blocks_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_mats(idx); }, + bars_blocks.blocks_mats_size(), &mPile->settings.bars_blocks.blocks_mats); + + unserialize_list_other_mats( + mOtherMatsBars.mats, + [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_other_mats(idx); }, + bars_blocks.bars_other_mats_size(), &mPile->settings.bars_blocks.bars_other_mats); + + unserialize_list_other_mats( + mOtherMatsBlocks.mats, + [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_other_mats(idx); }, + bars_blocks.blocks_other_mats_size(), &mPile->settings.bars_blocks.blocks_other_mats); } else { - mPile->settings.flags.bits.refuse = 0; - mPile->settings.refuse.type.clear(); - mPile->settings.refuse.corpses.clear(); - mPile->settings.refuse.body_parts.clear(); - mPile->settings.refuse.skulls.clear(); - mPile->settings.refuse.bones.clear(); - mPile->settings.refuse.hair.clear(); - mPile->settings.refuse.shells.clear(); - mPile->settings.refuse.teeth.clear(); - mPile->settings.refuse.horns.clear(); - mPile->settings.refuse.fresh_raw_hide = false; - mPile->settings.refuse.rotten_raw_hide = false; + mPile->settings.flags.bits.bars_blocks = 0; + mPile->settings.bars_blocks.bars_other_mats.clear(); + mPile->settings.bars_blocks.bars_mats.clear(); + mPile->settings.bars_blocks.blocks_other_mats.clear(); + mPile->settings.bars_blocks.blocks_mats.clear(); } } -bool StockpileSerializer::stone_is_allowed(const MaterialInfo& mi) { - if (!mi.isValid()) - return false; - const bool is_allowed_soil = mi.inorganic->flags.is_set(inorganic_flags::SOIL) && !mi.inorganic->flags.is_set(inorganic_flags::AQUIFER); - const bool is_allowed_stone = mi.material->flags.is_set(material_flags::IS_STONE) && !mi.material->flags.is_set(material_flags::NO_STONE_STOCKPILE); - return is_allowed_soil || is_allowed_stone; -} +bool StockpileSerializer::write_cloth(StockpileSettings::ClothSet* cloth) { + bool all = true; -void StockpileSerializer::write_stone(StockpileSettings::StoneSet* stone) { - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::stone_is_allowed, this, _1); - serialize_list_material( - filter, [=](const std::string& token) { stone->add_mats(token); }, - mPile->settings.stone.mats); -} + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_thread_silk(token); }, + &mPile->settings.cloth.thread_silk, organic_mat_category::Silk) && all; -void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_stone()) { - mPile->settings.flags.bits.stone = 1; - const StockpileSettings::StoneSet stone = mBuffer.stone(); - DEBUG(log).print("stone:\n"); + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_thread_plant(token); }, + &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber) && all; - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::stone_is_allowed, this, _1); - unserialize_list_material( - filter, [=](const size_t& idx) -> const std::string& { return stone.mats(idx); }, - stone.mats_size(), &mPile->settings.stone.mats); - } - else { - mPile->settings.flags.bits.stone = 0; - mPile->settings.stone.mats.clear(); - } -} + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_thread_yarn(token); }, + &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn) && all; -bool StockpileSerializer::coins_mat_is_allowed(const MaterialInfo& mi) { - return mi.isValid(); -} + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_thread_metal(token); }, + &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread) && all; -void StockpileSerializer::write_coins(StockpileSettings::CoinSet* coins) { - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::coins_mat_is_allowed, this, _1); - serialize_list_material( - filter, [=](const std::string& token) { coins->add_mats(token); }, - mPile->settings.coins.mats); + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_cloth_silk(token); }, + &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk) && all; + + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_cloth_plant(token); }, + &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber) && all; + + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_cloth_yarn(token); }, + &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn) && all; + + all = serialize_list_organic_mat( + [=](const std::string& token) { cloth->add_cloth_metal(token); }, + &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread) && all; + + return all; } -void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_coin()) { - mPile->settings.flags.bits.coins = 1; - const StockpileSettings::CoinSet coins = mBuffer.coin(); - DEBUG(log).print("coins:\n"); +void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_cloth()) { + mPile->settings.flags.bits.cloth = 1; + const StockpileSettings::ClothSet cloth = mBuffer.cloth(); + DEBUG(log).print("cloth:\n"); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_silk(idx); }, + cloth.thread_silk_size(), &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_plant(idx); }, + cloth.thread_plant_size(), &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_yarn(idx); }, + cloth.thread_yarn_size(), &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_metal(idx); }, + cloth.thread_metal_size(), &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_silk(idx); }, + cloth.cloth_silk_size(), &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_plant(idx); }, + cloth.cloth_plant_size(), &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_yarn(idx); }, + cloth.cloth_yarn_size(), &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn); + + unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_metal(idx); }, + cloth.cloth_metal_size(), &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); + } + else { + mPile->settings.cloth.thread_metal.clear(); + mPile->settings.cloth.thread_plant.clear(); + mPile->settings.cloth.thread_silk.clear(); + mPile->settings.cloth.thread_yarn.clear(); + mPile->settings.cloth.cloth_metal.clear(); + mPile->settings.cloth.cloth_plant.clear(); + mPile->settings.cloth.cloth_silk.clear(); + mPile->settings.cloth.cloth_yarn.clear(); + mPile->settings.flags.bits.cloth = 0; + } +} + +static bool coins_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid(); +} + +bool StockpileSerializer::write_coins(StockpileSettings::CoinSet* coins) { + return serialize_list_material( + coins_mat_is_allowed, + [=](const std::string& token) { coins->add_mats(token); }, + mPile->settings.coins.mats); +} + +void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_coin()) { + mPile->settings.flags.bits.coins = 1; + const StockpileSettings::CoinSet coins = mBuffer.coin(); + DEBUG(log).print("coins:\n"); + + unserialize_list_material( + coins_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return coins.mats(idx); }, + coins.mats_size(), &mPile->settings.coins.mats); + } + else { + mPile->settings.flags.bits.coins = 0; + mPile->settings.coins.mats.clear(); + } +} + +static bool finished_goods_type_is_allowed(item_type::item_type type) { + switch (type) { + case item_type::CHAIN: + case item_type::FLASK: + case item_type::GOBLET: + case item_type::INSTRUMENT: + case item_type::TOY: + case item_type::ARMOR: + case item_type::SHOES: + case item_type::HELM: + case item_type::GLOVES: + case item_type::FIGURINE: + case item_type::AMULET: + case item_type::SCEPTER: + case item_type::CROWN: + case item_type::RING: + case item_type::EARRING: + case item_type::BRACELET: + case item_type::GEM: + case item_type::TOTEM: + case item_type::PANTS: + case item_type::BACKPACK: + case item_type::QUIVER: + case item_type::SPLINT: + case item_type::CRUTCH: + case item_type::TOOL: + case item_type::BOOK: + return true; + default: + return false; + } +} + +static bool finished_goods_mat_is_allowed(const MaterialInfo& mi) { + return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); +} + +bool StockpileSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { + bool all = serialize_list_item_type( + finished_goods_type_is_allowed, + [=](const std::string& token) { finished_goods->add_type(token); }, + mPile->settings.finished_goods.type); + + all = serialize_list_material( + finished_goods_mat_is_allowed, + [=](const std::string& token) { finished_goods->add_mats(token); }, + mPile->settings.finished_goods.mats) && all; + + all = serialize_list_other_mats( + mOtherMatsFinishedGoods.mats, [=](const std::string& token) { finished_goods->add_other_mats(token); }, + mPile->settings.finished_goods.other_mats) && all; + + all = serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_core(token); }, + mPile->settings.finished_goods.quality_core) && all; + + all = serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_total(token); }, + mPile->settings.finished_goods.quality_total) && all; + + return all; +} + +void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_finished_goods()) { + mPile->settings.flags.bits.finished_goods = 1; + const StockpileSettings::FinishedGoodsSet finished_goods = mBuffer.finished_goods(); + DEBUG(log).print("finished_goods:\n"); + + unserialize_list_item_type( + finished_goods_type_is_allowed, + [=](const size_t& idx) -> const std::string& { return finished_goods.type(idx); }, + finished_goods.type_size(), &mPile->settings.finished_goods.type); + + unserialize_list_material( + finished_goods_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return finished_goods.mats(idx); }, + finished_goods.mats_size(), &mPile->settings.finished_goods.mats); + + unserialize_list_other_mats( + mOtherMatsFinishedGoods.mats, [=](const size_t& idx) -> const std::string& { return finished_goods.other_mats(idx); }, + finished_goods.other_mats_size(), &mPile->settings.finished_goods.other_mats); + + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_core(idx); }, + finished_goods.quality_core_size(), mPile->settings.finished_goods.quality_core); + + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_total(idx); }, + finished_goods.quality_total_size(), mPile->settings.finished_goods.quality_total); + } + else { + mPile->settings.flags.bits.finished_goods = 0; + mPile->settings.finished_goods.type.clear(); + mPile->settings.finished_goods.other_mats.clear(); + mPile->settings.finished_goods.mats.clear(); + quality_clear(mPile->settings.finished_goods.quality_core); + quality_clear(mPile->settings.finished_goods.quality_total); + } +} + +food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { + using df::enums::organic_mat_category::organic_mat_category; + + switch (cat) { + case organic_mat_category::Meat: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_meat(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; + return food_pair(setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); + } + case organic_mat_category::Fish: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_fish(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; + return food_pair(setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); + } + case organic_mat_category::UnpreparedFish: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_unprepared_fish(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; + return food_pair(setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); + } + case organic_mat_category::Eggs: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_egg(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; + return food_pair(setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); + } + case organic_mat_category::Plants: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_plants(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; + return food_pair(setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); + } + case organic_mat_category::PlantDrink: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_drink_plant(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; + return food_pair(setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); + } + case organic_mat_category::CreatureDrink: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_drink_animal(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; + return food_pair(setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); + } + case organic_mat_category::PlantCheese: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_cheese_plant(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; + return food_pair(setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); + } + case organic_mat_category::CreatureCheese: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_cheese_animal(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; + return food_pair(setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); + } + case organic_mat_category::Seed: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_seeds(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; + return food_pair(setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); + } + case organic_mat_category::Leaf: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_leaves(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; + return food_pair(setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); + } + case organic_mat_category::PlantPowder: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_powder_plant(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; + return food_pair(setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); + } + case organic_mat_category::CreaturePowder: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_powder_creature(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; + return food_pair(setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); + } + case organic_mat_category::Glob: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_glob(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; + return food_pair(setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); + } + case organic_mat_category::PlantLiquid: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_liquid_plant(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; + return food_pair(setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); + } + case organic_mat_category::CreatureLiquid: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_liquid_animal(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; + return food_pair(setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); + } + case organic_mat_category::MiscLiquid: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_liquid_misc(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; + return food_pair(setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); + } + + case organic_mat_category::Paste: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_glob_paste(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; + return food_pair(setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); + } + case organic_mat_category::Pressed: + { + FuncWriteExport setter = [=](const std::string& id) { + mBuffer.mutable_food()->add_glob_pressed(id); + }; + FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; + return food_pair(setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); + } + case organic_mat_category::Leather: + case organic_mat_category::Silk: + case organic_mat_category::PlantFiber: + case organic_mat_category::Bone: + case organic_mat_category::Shell: + case organic_mat_category::Wood: + case organic_mat_category::Horn: + case organic_mat_category::Pearl: + case organic_mat_category::Tooth: + case organic_mat_category::EdibleCheese: + case organic_mat_category::AnyDrink: + case organic_mat_category::EdiblePlant: + case organic_mat_category::CookableLiquid: + case organic_mat_category::CookablePowder: + case organic_mat_category::CookableSeed: + case organic_mat_category::CookableLeaf: + case organic_mat_category::Yarn: + case organic_mat_category::MetalThread: + default: + // not used in stockpile food menu + break; + } + return food_pair(); +} + +bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { + DEBUG(log).print("food:\n"); + + auto & pfood = mPile->settings.food; + bool all = pfood.prepared_meals; + + food->set_prepared_meals(pfood.prepared_meals); + + using df::enums::organic_mat_category::organic_mat_category; + using traits = df::enum_traits; + for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { + food_pair p = food_map((organic_mat_category)mat_category); + if (!p.valid) + continue; + DEBUG(log).print("food: %s\n", traits::key_table[mat_category]); + all = serialize_list_organic_mat(p.set_value, p.stockpile_values, (organic_mat_category)mat_category) && all; + } + + return all; +} + +void StockpileSerializer::read_food(DeserializeMode mode, const std::string& filter) { + using df::enums::organic_mat_category::organic_mat_category; + using traits = df::enum_traits; + if (mBuffer.has_food()) { + mPile->settings.flags.bits.food = 1; + const StockpileSettings::FoodSet food = mBuffer.food(); + DEBUG(log).print("food:\n"); + + if (food.has_prepared_meals()) + mPile->settings.food.prepared_meals = food.prepared_meals(); + else + mPile->settings.food.prepared_meals = true; - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::coins_mat_is_allowed, this, _1); - unserialize_list_material( - filter, [=](const size_t& idx) -> const std::string& { return coins.mats(idx); }, - coins.mats_size(), &mPile->settings.coins.mats); + DEBUG(log).print("prepared_meals: %d\n", mPile->settings.food.prepared_meals); + + for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { + food_pair p = food_map((organic_mat_category)mat_category); + if (!p.valid) + continue; + unserialize_list_organic_mat(p.get_value, p.serialized_count, p.stockpile_values, (organic_mat_category)mat_category); + } } else { - mPile->settings.flags.bits.coins = 0; - mPile->settings.coins.mats.clear(); + for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { + food_pair p = food_map((organic_mat_category)mat_category); + if (!p.valid) + continue; + p.stockpile_values->clear(); + } + mPile->settings.flags.bits.food = 0; + mPile->settings.food.prepared_meals = false; } } -bool StockpileSerializer::bars_mat_is_allowed(const MaterialInfo& mi) { - return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); -} - -bool StockpileSerializer::blocks_mat_is_allowed(const MaterialInfo& mi) { +static bool furniture_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { - MaterialInfo mi; - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::bars_mat_is_allowed, this, _1); - serialize_list_material( - filter, [=](const std::string& token) { bars_blocks->add_bars_mats(token); }, - mPile->settings.bars_blocks.bars_mats); +bool StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furniture) { + using df::enums::furniture_type::furniture_type; + using type_traits = df::enum_traits; - // blocks mats - filter = std::bind(&StockpileSerializer::blocks_mat_is_allowed, this, _1); - serialize_list_material( - filter, [=](const std::string& token) { bars_blocks->add_blocks_mats(token); }, - mPile->settings.bars_blocks.blocks_mats); + auto & pfurniture = mPile->settings.furniture; + bool all = true; - // bars other mats - serialize_list_other_mats( - mOtherMatsBars.mats, [=](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, - mPile->settings.bars_blocks.bars_other_mats); + for (size_t i = 0; i < pfurniture.type.size(); ++i) { + if (!pfurniture.type.at(i)) { + all = false; + continue; + } + std::string f_type(type_traits::key_table[i]); + furniture->add_type(f_type); + DEBUG(log).print("furniture_type %zd is %s\n", i, f_type.c_str()); + } + all = serialize_list_material( + furniture_mat_is_allowed, + [=](const std::string& token) { furniture->add_mats(token); }, + pfurniture.mats) && all; + all = serialize_list_other_mats( + mOtherMatsFurniture.mats, + [=](const std::string& token) { furniture->add_other_mats(token); }, + pfurniture.other_mats) && all; + all = serialize_list_quality( + [=](const std::string& token) { furniture->add_quality_core(token); }, + pfurniture.quality_core) && all; + all = serialize_list_quality( + [=](const std::string& token) { furniture->add_quality_total(token); }, + pfurniture.quality_total) && all; - // blocks other mats - serialize_list_other_mats( - mOtherMatsBlocks.mats, [=](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, - mPile->settings.bars_blocks.blocks_other_mats); + return all; } -void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_barsblocks()) { - mPile->settings.flags.bits.bars_blocks = 1; - const StockpileSettings::BarsBlocksSet bars_blocks = mBuffer.barsblocks(); - DEBUG(log).print("bars_blocks:\n"); - // bars - FuncMaterialAllowed filter = std::bind(&StockpileSerializer::bars_mat_is_allowed, this, _1); - unserialize_list_material( - filter, [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_mats(idx); }, - bars_blocks.bars_mats_size(), &mPile->settings.bars_blocks.bars_mats); +void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_furniture()) { + mPile->settings.flags.bits.furniture = 1; + const StockpileSettings::FurnitureSet furniture = mBuffer.furniture(); + DEBUG(log).print("furniture:\n"); + + // type + using df::enums::furniture_type::furniture_type; + df::enum_traits type_traits; + mPile->settings.furniture.type.clear(); + mPile->settings.furniture.type.resize(type_traits.last_item_value + 1, '\0'); + if (furniture.type_size() > 0) { + for (int i = 0; i < furniture.type_size(); ++i) { + const std::string type = furniture.type(i); + df::enum_traits::base_type idx = linear_index(type_traits, type); + DEBUG(log).print("type %d is %s\n", idx, type.c_str()); + if (idx < 0 || size_t(idx) >= mPile->settings.furniture.type.size()) { + WARN(log).print("furniture type index invalid %s, idx=%d\n", type.c_str(), idx); + continue; + } + mPile->settings.furniture.type.at(idx) = 1; + } + } - // blocks - filter = std::bind(&StockpileSerializer::blocks_mat_is_allowed, this, _1); unserialize_list_material( - filter, [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_mats(idx); }, - bars_blocks.blocks_mats_size(), &mPile->settings.bars_blocks.blocks_mats); - // bars other mats - unserialize_list_other_mats( - mOtherMatsBars.mats, [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_other_mats(idx); }, - bars_blocks.bars_other_mats_size(), &mPile->settings.bars_blocks.bars_other_mats); + furniture_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return furniture.mats(idx); }, + furniture.mats_size(), &mPile->settings.furniture.mats); - // blocks other mats unserialize_list_other_mats( - mOtherMatsBlocks.mats, [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_other_mats(idx); }, - bars_blocks.blocks_other_mats_size(), &mPile->settings.bars_blocks.blocks_other_mats); + mOtherMatsFurniture.mats, [=](const size_t& idx) -> const std::string& { return furniture.other_mats(idx); }, + furniture.other_mats_size(), &mPile->settings.furniture.other_mats); + + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_core(idx); }, + furniture.quality_core_size(), mPile->settings.furniture.quality_core); + + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_total(idx); }, + furniture.quality_total_size(), mPile->settings.furniture.quality_total); } else { - mPile->settings.flags.bits.bars_blocks = 0; - mPile->settings.bars_blocks.bars_other_mats.clear(); - mPile->settings.bars_blocks.bars_mats.clear(); - mPile->settings.bars_blocks.blocks_other_mats.clear(); - mPile->settings.bars_blocks.blocks_mats.clear(); + mPile->settings.flags.bits.furniture = 0; + mPile->settings.furniture.type.clear(); + mPile->settings.furniture.other_mats.clear(); + mPile->settings.furniture.mats.clear(); + quality_clear(mPile->settings.furniture.quality_core); + quality_clear(mPile->settings.furniture.quality_total); } } -bool StockpileSerializer::gem_mat_is_allowed(const MaterialInfo& mi) { +static bool gem_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_GEM); } -bool StockpileSerializer::gem_cut_mat_is_allowed(const MaterialInfo& mi) { + +static bool gem_cut_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::gem_other_mat_is_allowed(MaterialInfo& mi) { + +static bool gem_other_mat_is_allowed(MaterialInfo& mi) { return mi.isValid() && (mi.getToken() == "GLASS_GREEN" || mi.getToken() == "GLASS_CLEAR" || mi.getToken() == "GLASS_CRYSTAL"); } -void StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { +bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { MaterialInfo mi; - // rough mats - FuncMaterialAllowed filter_rough = std::bind(&StockpileSerializer::gem_mat_is_allowed, this, _1); - serialize_list_material( - filter_rough, [=](const std::string& token) { gems->add_rough_mats(token); }, - mPile->settings.gems.rough_mats); - // cut mats - FuncMaterialAllowed filter_cut = std::bind(&StockpileSerializer::gem_cut_mat_is_allowed, this, _1); - serialize_list_material( - filter_cut, [=](const std::string& token) { gems->add_cut_mats(token); }, - mPile->settings.gems.cut_mats); - // rough other - for (size_t i = 0; i < mPile->settings.gems.rough_other_mats.size(); ++i) { - if (mPile->settings.gems.rough_other_mats.at(i)) { - mi.decode(i, -1); - if (!gem_other_mat_is_allowed(mi)) - continue; - DEBUG(log).print("gem rough_other mat %zd is %s\n", i, mi.getToken().c_str()); - gems->add_rough_other_mats(mi.getToken()); + + auto & pgems = mPile->settings.gems; + + bool all = serialize_list_material( + gem_mat_is_allowed, + [=](const std::string& token) { gems->add_rough_mats(token); }, + pgems.rough_mats); + + all = serialize_list_material( + gem_cut_mat_is_allowed, + [=](const std::string& token) { gems->add_cut_mats(token); }, + pgems.cut_mats) && all; + + for (size_t i = 0; i < pgems.rough_other_mats.size(); ++i) { + if (!pgems.rough_other_mats.at(i)) { + all = false; + continue; } + mi.decode(i, -1); + if (!gem_other_mat_is_allowed(mi)) + continue; + DEBUG(log).print("gem rough_other mat %zd is %s\n", i, mi.getToken().c_str()); + gems->add_rough_other_mats(mi.getToken()); } - // cut other - for (size_t i = 0; i < mPile->settings.gems.cut_other_mats.size(); ++i) { - if (mPile->settings.gems.cut_other_mats.at(i)) { - mi.decode(i, -1); - if (!mi.isValid()) - mi.decode(0, i); - if (!gem_other_mat_is_allowed(mi)) - continue; - DEBUG(log).print("gem cut_other mat %zd is %s\n", i, mi.getToken().c_str()); - gems->add_cut_other_mats(mi.getToken()); + + for (size_t i = 0; i < pgems.cut_other_mats.size(); ++i) { + if (!pgems.cut_other_mats.at(i)) { + all = false; + continue; } + mi.decode(i, -1); + if (!mi.isValid()) + mi.decode(0, i); + if (!gem_other_mat_is_allowed(mi)) + continue; + DEBUG(log).print("gem cut_other mat %zd is %s\n", i, mi.getToken().c_str()); + gems->add_cut_other_mats(mi.getToken()); } + + return all; } void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& filter) { @@ -1551,16 +1720,15 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil mPile->settings.flags.bits.gems = 1; const StockpileSettings::GemsSet gems = mBuffer.gems(); DEBUG(log).print("gems:\n"); - // rough - FuncMaterialAllowed filter_rough = std::bind(&StockpileSerializer::gem_mat_is_allowed, this, _1); + unserialize_list_material( - filter_rough, [=](const size_t& idx) -> const std::string& { return gems.rough_mats(idx); }, + gem_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return gems.rough_mats(idx); }, gems.rough_mats_size(), &mPile->settings.gems.rough_mats); - // cut - FuncMaterialAllowed filter_cut = std::bind(&StockpileSerializer::gem_cut_mat_is_allowed, this, _1); unserialize_list_material( - filter_cut, [=](const size_t& idx) -> const std::string& { return gems.cut_mats(idx); }, + gem_cut_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return gems.cut_mats(idx); }, gems.cut_mats_size(), &mPile->settings.gems.cut_mats); const size_t builtin_size = std::extentraws.mat_table.builtin)>::value; @@ -1603,278 +1771,272 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil } } -bool StockpileSerializer::finished_goods_type_is_allowed(item_type::item_type type) { - switch (type) { - case item_type::CHAIN: - case item_type::FLASK: - case item_type::GOBLET: - case item_type::INSTRUMENT: - case item_type::TOY: - case item_type::ARMOR: - case item_type::SHOES: - case item_type::HELM: - case item_type::GLOVES: - case item_type::FIGURINE: - case item_type::AMULET: - case item_type::SCEPTER: - case item_type::CROWN: - case item_type::RING: - case item_type::EARRING: - case item_type::BRACELET: - case item_type::GEM: - case item_type::TOTEM: - case item_type::PANTS: - case item_type::BACKPACK: - case item_type::QUIVER: - case item_type::SPLINT: - case item_type::CRUTCH: - case item_type::TOOL: - case item_type::BOOK: - return true; - default: - return false; - } +bool StockpileSerializer::write_leather(StockpileSettings::LeatherSet* leather) { + return serialize_list_organic_mat( + [=](const std::string& id) { leather->add_mats(id); }, + &mPile->settings.leather.mats, organic_mat_category::Leather); } -bool StockpileSerializer::finished_goods_mat_is_allowed(const MaterialInfo& mi) { - return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); -} +void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_leather()) { + mPile->settings.flags.bits.leather = 1; + const StockpileSettings::LeatherSet leather = mBuffer.leather(); + DEBUG(log).print("leather:\n"); -void StockpileSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { - // type - FuncItemAllowed filter = std::bind(&StockpileSerializer::finished_goods_type_is_allowed, this, _1); - serialize_list_item_type( - filter, [=](const std::string& token) { finished_goods->add_type(token); }, - mPile->settings.finished_goods.type); + unserialize_list_organic_mat([=](size_t idx) -> std::string { return leather.mats(idx); }, + leather.mats_size(), &mPile->settings.leather.mats, organic_mat_category::Leather); + } + else { + mPile->settings.flags.bits.leather = 0; + mPile->settings.leather.mats.clear(); + } +} - // materials - FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::finished_goods_mat_is_allowed, this, _1); - serialize_list_material( - mat_filter, [=](const std::string& token) { finished_goods->add_mats(token); }, - mPile->settings.finished_goods.mats); +bool StockpileSerializer::write_corpses(StockpileSettings::CorpsesSet* corpses) { + bool all = true; - // other mats - serialize_list_other_mats( - mOtherMatsFinishedGoods.mats, [=](const std::string& token) { finished_goods->add_other_mats(token); }, - mPile->settings.finished_goods.other_mats); + return all; +} - // quality core - serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_core(token); }, - mPile->settings.finished_goods.quality_core); +void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& filter) { - // quality total - serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_total(token); }, - mPile->settings.finished_goods.quality_total); } -void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_finished_goods()) { - mPile->settings.flags.bits.finished_goods = 1; - const StockpileSettings::FinishedGoodsSet finished_goods = mBuffer.finished_goods(); - DEBUG(log).print("finished_goods:\n"); +static bool refuse_creature_is_allowed(const df::creature_raw* raw) { + if (!raw) + return false; + // wagon and generated creatures not allowed, except angels + const bool is_wagon = raw->creature_id == "EQUIPMENT_WAGON"; + const bool is_generated = raw->flags.is_set(creature_raw_flags::GENERATED); + const bool is_angel = is_generated && raw->creature_id.find("DIVINE_") != std::string::npos; + return !is_wagon && !(is_generated && !is_angel); +} - // type - FuncItemAllowed filter = std::bind(&StockpileSerializer::finished_goods_type_is_allowed, this, _1); - unserialize_list_item_type( - filter, [=](const size_t& idx) -> const std::string& { return finished_goods.type(idx); }, - finished_goods.type_size(), &mPile->settings.finished_goods.type); +static bool refuse_write_helper(std::function add_value, const vector& list) { + bool all = true; + for (size_t i = 0; i < list.size(); ++i) { + if (!list.at(i)) { + all = false; + continue; + } + df::creature_raw* r = find_creature(i); + // skip forgotten beasts, titans, demons, and night creatures + if (!refuse_creature_is_allowed(r)) + continue; + DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); + add_value(r->creature_id); + } + return all; +} - // materials - FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::finished_goods_mat_is_allowed, this, _1); - unserialize_list_material( - mat_filter, [=](const size_t& idx) -> const std::string& { return finished_goods.mats(idx); }, - finished_goods.mats_size(), &mPile->settings.finished_goods.mats); +static bool refuse_type_is_allowed(item_type::item_type type) { + if (type == item_type::NONE || type == item_type::BAR || type == item_type::SMALLGEM || type == item_type::BLOCKS || type == item_type::ROUGH || type == item_type::BOULDER || type == item_type::CORPSE || type == item_type::CORPSEPIECE || type == item_type::ROCK || type == item_type::ORTHOPEDIC_CAST) + return false; + return true; +} - // other mats - unserialize_list_other_mats( - mOtherMatsFinishedGoods.mats, [=](const size_t& idx) -> const std::string& { return finished_goods.other_mats(idx); }, - finished_goods.other_mats_size(), &mPile->settings.finished_goods.other_mats); +bool StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { + auto & prefuse = mPile->settings.refuse; + bool all = prefuse.fresh_raw_hide && prefuse.rotten_raw_hide; - // core quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_core(idx); }, - finished_goods.quality_core_size(), mPile->settings.finished_goods.quality_core); + DEBUG(log).print("refuse:\n"); + refuse->set_fresh_raw_hide(prefuse.fresh_raw_hide); + refuse->set_rotten_raw_hide(prefuse.rotten_raw_hide); - // total quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_total(idx); }, - finished_goods.quality_total_size(), mPile->settings.finished_goods.quality_total); - } - else { - mPile->settings.flags.bits.finished_goods = 0; - mPile->settings.finished_goods.type.clear(); - mPile->settings.finished_goods.other_mats.clear(); - mPile->settings.finished_goods.mats.clear(); - quality_clear(mPile->settings.finished_goods.quality_core); - quality_clear(mPile->settings.finished_goods.quality_total); - } -} + DEBUG(log).print("getting types\n"); + all = serialize_list_item_type( + refuse_type_is_allowed, + [=](const std::string& token) { + DEBUG(log).print("adding type: %s\n", token.c_str()); + refuse->add_type(token); + }, + prefuse.type) && all; + + all = refuse_write_helper([=](const std::string& id) { refuse->add_corpses(id); }, + prefuse.corpses) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_body_parts(id); }, + prefuse.body_parts) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_skulls(id); }, + prefuse.skulls) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_bones(id); }, + prefuse.bones) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_hair(id); }, + prefuse.hair) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_shells(id); }, + prefuse.shells) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_teeth(id); }, + prefuse.teeth) && all; + all = refuse_write_helper([=](const std::string& id) { refuse->add_horns(id); }, + prefuse.horns) && all; -void StockpileSerializer::write_leather(StockpileSettings::LeatherSet* leather) { - FuncWriteExport setter = [=](const std::string& id) { - leather->add_mats(id); - }; - serialize_list_organic_mat(setter, &mPile->settings.leather.mats, organic_mat_category::Leather); + return all; } -void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_leather()) { - mPile->settings.flags.bits.leather = 1; - const StockpileSettings::LeatherSet leather = mBuffer.leather(); - DEBUG(log).print("leather:\n"); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return leather.mats(idx); }, - leather.mats_size(), &mPile->settings.leather.mats, organic_mat_category::Leather); - } - else { - mPile->settings.flags.bits.leather = 0; - mPile->settings.leather.mats.clear(); +static void refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list) { + pile_list->clear(); + pile_list->resize(world->raws.creatures.all.size(), '\0'); + if (list_size > 0) { + for (size_t i = 0; i < list_size; ++i) { + const std::string creature_id = get_value(i); + const int idx = find_creature(creature_id); + const df::creature_raw* creature = find_creature(idx); + if (idx < 0 || !refuse_creature_is_allowed(creature) || size_t(idx) >= pile_list->size()) { + WARN(log).print("invalid refuse creature %s, idx=%d\n", creature_id.c_str(), idx); + continue; + } + DEBUG(log).print("creature %d is %s\n", idx, creature_id.c_str()); + pile_list->at(idx) = 1; + } } } -void StockpileSerializer::write_cloth(StockpileSettings::ClothSet* cloth) { - serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_silk(token); }, - &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); - - serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_plant(token); }, - &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber); - - serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_yarn(token); }, - &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn); +void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_refuse()) { + mPile->settings.flags.bits.refuse = 1; + const StockpileSettings::RefuseSet refuse = mBuffer.refuse(); + DEBUG(log).print("refuse:\n"); + DEBUG(log).print(" fresh hide %d\n", refuse.fresh_raw_hide()); + DEBUG(log).print(" rotten hide %d\n", refuse.rotten_raw_hide()); + mPile->settings.refuse.fresh_raw_hide = refuse.fresh_raw_hide(); + mPile->settings.refuse.rotten_raw_hide = refuse.rotten_raw_hide(); - serialize_list_organic_mat([=](const std::string& token) { cloth->add_thread_metal(token); }, - &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread); + unserialize_list_item_type( + refuse_type_is_allowed, + [=](const size_t& idx) -> const std::string& { return refuse.type(idx); }, + refuse.type_size(), &mPile->settings.refuse.type); - serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_silk(token); }, - &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk); + DEBUG(log).print(" corpses\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.corpses(idx); }, + refuse.corpses_size(), &mPile->settings.refuse.corpses); - serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_plant(token); }, - &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber); + DEBUG(log).print(" body_parts\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.body_parts(idx); }, + refuse.body_parts_size(), &mPile->settings.refuse.body_parts); - serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_yarn(token); }, - &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn); + DEBUG(log).print(" skulls\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.skulls(idx); }, + refuse.skulls_size(), &mPile->settings.refuse.skulls); - serialize_list_organic_mat([=](const std::string& token) { cloth->add_cloth_metal(token); }, - &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); -} -void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_cloth()) { - mPile->settings.flags.bits.cloth = 1; - const StockpileSettings::ClothSet cloth = mBuffer.cloth(); - DEBUG(log).print("cloth:\n"); + DEBUG(log).print(" bones\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.bones(idx); }, + refuse.bones_size(), &mPile->settings.refuse.bones); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_silk(idx); }, - cloth.thread_silk_size(), &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); + DEBUG(log).print(" hair\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.hair(idx); }, + refuse.hair_size(), &mPile->settings.refuse.hair); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_plant(idx); }, - cloth.thread_plant_size(), &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber); + DEBUG(log).print(" shells\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.shells(idx); }, + refuse.shells_size(), &mPile->settings.refuse.shells); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_yarn(idx); }, - cloth.thread_yarn_size(), &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn); + DEBUG(log).print(" teeth\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.teeth(idx); }, + refuse.teeth_size(), &mPile->settings.refuse.teeth); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_metal(idx); }, - cloth.thread_metal_size(), &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread); + DEBUG(log).print(" horns\n"); + refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.horns(idx); }, + refuse.horns_size(), &mPile->settings.refuse.horns); + } + else { + mPile->settings.flags.bits.refuse = 0; + mPile->settings.refuse.type.clear(); + mPile->settings.refuse.corpses.clear(); + mPile->settings.refuse.body_parts.clear(); + mPile->settings.refuse.skulls.clear(); + mPile->settings.refuse.bones.clear(); + mPile->settings.refuse.hair.clear(); + mPile->settings.refuse.shells.clear(); + mPile->settings.refuse.teeth.clear(); + mPile->settings.refuse.horns.clear(); + mPile->settings.refuse.fresh_raw_hide = false; + mPile->settings.refuse.rotten_raw_hide = false; + } +} - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_silk(idx); }, - cloth.cloth_silk_size(), &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk); +bool StockpileSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { + bool all = true; - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_plant(idx); }, - cloth.cloth_plant_size(), &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber); + return all; +} - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_yarn(idx); }, - cloth.cloth_yarn_size(), &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn); +void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& filter) { - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_metal(idx); }, - cloth.cloth_metal_size(), &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); - } - else { - mPile->settings.cloth.thread_metal.clear(); - mPile->settings.cloth.thread_plant.clear(); - mPile->settings.cloth.thread_silk.clear(); - mPile->settings.cloth.thread_yarn.clear(); - mPile->settings.cloth.cloth_metal.clear(); - mPile->settings.cloth.cloth_plant.clear(); - mPile->settings.cloth.cloth_silk.clear(); - mPile->settings.cloth.cloth_yarn.clear(); - mPile->settings.flags.bits.cloth = 0; - } } -bool StockpileSerializer::wood_mat_is_allowed(const df::plant_raw* plant) { - return plant && plant->flags.is_set(plant_raw_flags::TREE); +static bool stone_is_allowed(const MaterialInfo& mi) { + if (!mi.isValid()) + return false; + const bool is_allowed_soil = mi.inorganic->flags.is_set(inorganic_flags::SOIL) && !mi.inorganic->flags.is_set(inorganic_flags::AQUIFER); + const bool is_allowed_stone = mi.material->flags.is_set(material_flags::IS_STONE) && !mi.material->flags.is_set(material_flags::NO_STONE_STOCKPILE); + return is_allowed_soil || is_allowed_stone; } -void StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { - for (size_t i = 0; i < mPile->settings.wood.mats.size(); ++i) { - if (mPile->settings.wood.mats.at(i)) { - const df::plant_raw* plant = find_plant(i); - if (!wood_mat_is_allowed(plant)) - continue; - wood->add_mats(plant->id); - DEBUG(log).print("plant %zd is %s\n", i, plant->id.c_str()); - } - } +bool StockpileSerializer::write_stone(StockpileSettings::StoneSet* stone) { + return serialize_list_material( + stone_is_allowed, + [=](const std::string& token) { stone->add_mats(token); }, + mPile->settings.stone.mats); } -void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_wood()) { - mPile->settings.flags.bits.wood = 1; - const StockpileSettings::WoodSet wood = mBuffer.wood(); - DEBUG(log).print("wood: \n"); - mPile->settings.wood.mats.clear(); - mPile->settings.wood.mats.resize(world->raws.plants.all.size(), '\0'); - for (int i = 0; i < wood.mats_size(); ++i) { - const std::string token = wood.mats(i); - const size_t idx = find_plant(token); - if (idx < 0 || idx >= mPile->settings.wood.mats.size()) { - WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); - continue; - } - DEBUG(log).print("plant %zd is %s\n", idx, token.c_str()); - mPile->settings.wood.mats.at(idx) = 1; - } +void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_stone()) { + mPile->settings.flags.bits.stone = 1; + const StockpileSettings::StoneSet stone = mBuffer.stone(); + DEBUG(log).print("stone:\n"); + + unserialize_list_material( + stone_is_allowed, + [=](const size_t& idx) -> const std::string& { return stone.mats(idx); }, + stone.mats_size(), &mPile->settings.stone.mats); } else { - mPile->settings.flags.bits.wood = 0; - mPile->settings.wood.mats.clear(); + mPile->settings.flags.bits.stone = 0; + mPile->settings.stone.mats.clear(); } } -bool StockpileSerializer::weapons_mat_is_allowed(const MaterialInfo& mi) { +static bool weapons_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -void StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) { - weapons->set_unusable(mPile->settings.weapons.unusable); - weapons->set_usable(mPile->settings.weapons.usable); +bool StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) { + auto & pweapons = mPile->settings.weapons; + bool all = pweapons.unusable && pweapons.usable; + + weapons->set_unusable(pweapons.unusable); + weapons->set_usable(pweapons.usable); - // weapon type - serialize_list_itemdef([=](const std::string& token) { weapons->add_weapon_type(token); }, - mPile->settings.weapons.weapon_type, + all = serialize_list_itemdef( + [=](const std::string& token) { weapons->add_weapon_type(token); }, + pweapons.weapon_type, std::vector(world->raws.itemdefs.weapons.begin(), world->raws.itemdefs.weapons.end()), - item_type::WEAPON); + item_type::WEAPON) && all; - // trapcomp type - serialize_list_itemdef([=](const std::string& token) { weapons->add_trapcomp_type(token); }, - mPile->settings.weapons.trapcomp_type, + all = serialize_list_itemdef( + [=](const std::string& token) { weapons->add_trapcomp_type(token); }, + pweapons.trapcomp_type, std::vector(world->raws.itemdefs.trapcomps.begin(), world->raws.itemdefs.trapcomps.end()), - item_type::TRAPCOMP); + item_type::TRAPCOMP) && all; - // materials - FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::weapons_mat_is_allowed, this, _1); - serialize_list_material( - mat_filter, [=](const std::string& token) { weapons->add_mats(token); }, - mPile->settings.weapons.mats); + all = serialize_list_material( + weapons_mat_is_allowed, + [=](const std::string& token) { weapons->add_mats(token); }, + pweapons.mats) && all; - // other mats - serialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [=](const std::string& token) { weapons->add_other_mats(token); }, - mPile->settings.weapons.other_mats); + all = serialize_list_other_mats( + mOtherMatsWeaponsArmor.mats, + [=](const std::string& token) { weapons->add_other_mats(token); }, + pweapons.other_mats) && all; - // quality core - serialize_list_quality([=](const std::string& token) { weapons->add_quality_core(token); }, - mPile->settings.weapons.quality_core); + all = serialize_list_quality( + [=](const std::string& token) { weapons->add_quality_core(token); }, + pweapons.quality_core) && all; - // quality total - serialize_list_quality([=](const std::string& token) { weapons->add_quality_total(token); }, - mPile->settings.weapons.quality_total); + all = serialize_list_quality( + [=](const std::string& token) { weapons->add_quality_total(token); }, + pweapons.quality_total) && all; + + return all; } void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& filter) { @@ -1890,29 +2052,24 @@ void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& mPile->settings.weapons.unusable = unusable; mPile->settings.weapons.usable = usable; - // weapon type unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return weapons.weapon_type(idx); }, weapons.weapon_type_size(), &mPile->settings.weapons.weapon_type, item_type::WEAPON); - // trapcomp type unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return weapons.trapcomp_type(idx); }, weapons.trapcomp_type_size(), &mPile->settings.weapons.trapcomp_type, item_type::TRAPCOMP); - // materials - FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::weapons_mat_is_allowed, this, _1); unserialize_list_material( - mat_filter, [=](const size_t& idx) -> const std::string& { return weapons.mats(idx); }, + weapons_mat_is_allowed, + [=](const size_t& idx) -> const std::string& { return weapons.mats(idx); }, weapons.mats_size(), &mPile->settings.weapons.mats); - // other mats unserialize_list_other_mats( mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return weapons.other_mats(idx); }, weapons.other_mats_size(), &mPile->settings.weapons.other_mats); - // core quality unserialize_list_quality([=](const size_t& idx) -> const std::string& { return weapons.quality_core(idx); }, weapons.quality_core_size(), mPile->settings.weapons.quality_core); - // total quality + unserialize_list_quality([=](const size_t& idx) -> const std::string& { return weapons.quality_total(idx); }, weapons.quality_total_size(), mPile->settings.weapons.quality_total); } @@ -1927,152 +2084,47 @@ void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& } } -bool StockpileSerializer::armor_mat_is_allowed(const MaterialInfo& mi) { - return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); +static bool wood_mat_is_allowed(const df::plant_raw* plant) { + return plant && plant->flags.is_set(plant_raw_flags::TREE); } -void StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { - armor->set_unusable(mPile->settings.armor.unusable); - armor->set_usable(mPile->settings.armor.usable); - - // armor type - serialize_list_itemdef([=](const std::string& token) { armor->add_body(token); }, - mPile->settings.armor.body, - std::vector(world->raws.itemdefs.armor.begin(), world->raws.itemdefs.armor.end()), - item_type::ARMOR); - - // helm type - serialize_list_itemdef([=](const std::string& token) { armor->add_head(token); }, - mPile->settings.armor.head, - std::vector(world->raws.itemdefs.helms.begin(), world->raws.itemdefs.helms.end()), - item_type::HELM); - - // shoes type - serialize_list_itemdef([=](const std::string& token) { armor->add_feet(token); }, - mPile->settings.armor.feet, - std::vector(world->raws.itemdefs.shoes.begin(), world->raws.itemdefs.shoes.end()), - item_type::SHOES); - - // gloves type - serialize_list_itemdef([=](const std::string& token) { armor->add_hands(token); }, - mPile->settings.armor.hands, - std::vector(world->raws.itemdefs.gloves.begin(), world->raws.itemdefs.gloves.end()), - item_type::GLOVES); - - // pant type - serialize_list_itemdef([=](const std::string& token) { armor->add_legs(token); }, - mPile->settings.armor.legs, - std::vector(world->raws.itemdefs.pants.begin(), world->raws.itemdefs.pants.end()), - item_type::PANTS); - - // shield type - serialize_list_itemdef([=](const std::string& token) { armor->add_shield(token); }, - mPile->settings.armor.shield, - std::vector(world->raws.itemdefs.shields.begin(), world->raws.itemdefs.shields.end()), - item_type::SHIELD); - - // materials - FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::armor_mat_is_allowed, this, _1); - serialize_list_material( - mat_filter, [=](const std::string& token) { armor->add_mats(token); }, - mPile->settings.armor.mats); - - // other mats - serialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [=](const std::string& token) { armor->add_other_mats(token); }, - mPile->settings.armor.other_mats); - - // quality core - serialize_list_quality([=](const std::string& token) { armor->add_quality_core(token); }, - mPile->settings.armor.quality_core); - - // quality total - serialize_list_quality([=](const std::string& token) { armor->add_quality_total(token); }, - mPile->settings.armor.quality_total); +bool StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { + bool all = true; + for (size_t i = 0; i < mPile->settings.wood.mats.size(); ++i) { + if (!mPile->settings.wood.mats.at(i)) { + all = false; + continue; + } + const df::plant_raw* plant = find_plant(i); + if (!wood_mat_is_allowed(plant)) + continue; + wood->add_mats(plant->id); + DEBUG(log).print("plant %zd is %s\n", i, plant->id.c_str()); + } + return all; } -void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_armor()) { - mPile->settings.flags.bits.armor = 1; - const StockpileSettings::ArmorSet armor = mBuffer.armor(); - DEBUG(log).print("armor:\n"); - - bool unusable = armor.unusable(); - bool usable = armor.usable(); - DEBUG(log).print("unusable %d\n", unusable); - DEBUG(log).print("usable %d\n", usable); - mPile->settings.armor.unusable = unusable; - mPile->settings.armor.usable = usable; - - // body type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.body(idx); }, - armor.body_size(), &mPile->settings.armor.body, item_type::ARMOR); - - // head type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.head(idx); }, - armor.head_size(), &mPile->settings.armor.head, item_type::HELM); - - // feet type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.feet(idx); }, - armor.feet_size(), &mPile->settings.armor.feet, item_type::SHOES); - - // hands type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.hands(idx); }, - armor.hands_size(), &mPile->settings.armor.hands, item_type::GLOVES); - - // legs type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.legs(idx); }, - armor.legs_size(), &mPile->settings.armor.legs, item_type::PANTS); - - // shield type - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.shield(idx); }, - armor.shield_size(), &mPile->settings.armor.shield, item_type::SHIELD); - - // materials - FuncMaterialAllowed mat_filter = std::bind(&StockpileSerializer::armor_mat_is_allowed, this, _1); - unserialize_list_material( - mat_filter, [=](const size_t& idx) -> const std::string& { return armor.mats(idx); }, - armor.mats_size(), &mPile->settings.armor.mats); - - // other mats - unserialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return armor.other_mats(idx); }, - armor.other_mats_size(), &mPile->settings.armor.other_mats); +void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& filter) { + if (mBuffer.has_wood()) { + mPile->settings.flags.bits.wood = 1; + const StockpileSettings::WoodSet wood = mBuffer.wood(); + DEBUG(log).print("wood: \n"); - // core quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_core(idx); }, - armor.quality_core_size(), mPile->settings.armor.quality_core); - // total quality - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_total(idx); }, - armor.quality_total_size(), mPile->settings.armor.quality_total); + mPile->settings.wood.mats.clear(); + mPile->settings.wood.mats.resize(world->raws.plants.all.size(), '\0'); + for (int i = 0; i < wood.mats_size(); ++i) { + const std::string token = wood.mats(i); + const size_t idx = find_plant(token); + if (idx < 0 || idx >= mPile->settings.wood.mats.size()) { + WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); + continue; + } + DEBUG(log).print("plant %zd is %s\n", idx, token.c_str()); + mPile->settings.wood.mats.at(idx) = 1; + } } else { - mPile->settings.flags.bits.armor = 0; - mPile->settings.armor.body.clear(); - mPile->settings.armor.head.clear(); - mPile->settings.armor.feet.clear(); - mPile->settings.armor.hands.clear(); - mPile->settings.armor.legs.clear(); - mPile->settings.armor.shield.clear(); - mPile->settings.armor.other_mats.clear(); - mPile->settings.armor.mats.clear(); - quality_clear(mPile->settings.armor.quality_core); - quality_clear(mPile->settings.armor.quality_total); + mPile->settings.flags.bits.wood = 0; + mPile->settings.wood.mats.clear(); } } - -void StockpileSerializer::write_corpses(StockpileSettings::CorpsesSet* corpses) { - -} - -void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& filter) { - -} - -void StockpileSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { - -} - -void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& filter) { - -} diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index 24c6d5d98..4085744d0 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -96,94 +96,44 @@ private: // parse serialized data into ui indices void read(DeserializeMode mode, const std::string& filter); - /** - * Given a list of other_materials and an index, return its corresponding token - * @return empty string if not found - * @see other_mats_token - */ - std::string other_mats_index(const std::map other_mats, int idx); - - /** - * Given a list of other_materials and a token, return its corresponding index - * @return -1 if not found - * @see other_mats_index - */ - int other_mats_token(const std::map other_mats, const std::string& token); - void write_containers(); void read_containers(DeserializeMode mode); void write_general(); void read_general(DeserializeMode mode); - void write_animals(dfstockpiles::StockpileSettings::AnimalsSet* animals); + bool write_ammo(dfstockpiles::StockpileSettings::AmmoSet* ammo); + void read_ammo(DeserializeMode mode, const std::string& filter); + bool write_animals(dfstockpiles::StockpileSettings::AnimalsSet* animals); void read_animals(DeserializeMode mode, const std::string& filter); - + bool write_armor(dfstockpiles::StockpileSettings::ArmorSet* armor); + void read_armor(DeserializeMode mode, const std::string& filter); + bool write_bars_blocks(dfstockpiles::StockpileSettings::BarsBlocksSet* bars_blocks); + void read_bars_blocks(DeserializeMode mode, const std::string& filter); + bool write_cloth(dfstockpiles::StockpileSettings::ClothSet* cloth); + void read_cloth(DeserializeMode mode, const std::string& filter); + bool write_coins(dfstockpiles::StockpileSettings::CoinSet* coins); + void read_coins(DeserializeMode mode, const std::string& filter); + bool write_finished_goods(dfstockpiles::StockpileSettings::FinishedGoodsSet* finished_goods); + void read_finished_goods(DeserializeMode mode, const std::string& filter); food_pair food_map(df::enums::organic_mat_category::organic_mat_category cat); - - void write_food(dfstockpiles::StockpileSettings::FoodSet* food); + bool write_food(dfstockpiles::StockpileSettings::FoodSet* food); void read_food(DeserializeMode mode, const std::string& filter); - - void write_furniture(dfstockpiles::StockpileSettings::FurnitureSet* furniture); - bool furniture_mat_is_allowed(const DFHack::MaterialInfo& mi); + bool write_furniture(dfstockpiles::StockpileSettings::FurnitureSet* furniture); void read_furniture(DeserializeMode mode, const std::string& filter); - - bool refuse_creature_is_allowed(const df::creature_raw* raw); - - void refuse_write_helper(std::function add_value, const std::vector& list); - - bool refuse_type_is_allowed(df::enums::item_type::item_type type); - - void write_refuse(dfstockpiles::StockpileSettings::RefuseSet* refuse); - void refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list); - - void read_refuse(DeserializeMode mode, const std::string& filter); - - bool stone_is_allowed(const DFHack::MaterialInfo& mi); - - void write_stone(dfstockpiles::StockpileSettings::StoneSet* stone); - - void read_stone(DeserializeMode mode, const std::string& filter); - - bool write_ammo(dfstockpiles::StockpileSettings::AmmoSet* ammo); - void read_ammo(DeserializeMode mode, const std::string& filter); - bool coins_mat_is_allowed(const DFHack::MaterialInfo& mi); - - void write_coins(dfstockpiles::StockpileSettings::CoinSet* coins); - - void read_coins(DeserializeMode mode, const std::string& filter); - bool bars_mat_is_allowed(const DFHack::MaterialInfo& mi); - - bool blocks_mat_is_allowed(const DFHack::MaterialInfo& mi); - - void write_bars_blocks(dfstockpiles::StockpileSettings::BarsBlocksSet* bars_blocks); - void read_bars_blocks(DeserializeMode mode, const std::string& filter); - bool gem_mat_is_allowed(const DFHack::MaterialInfo& mi); - bool gem_cut_mat_is_allowed(const DFHack::MaterialInfo& mi); - bool gem_other_mat_is_allowed(DFHack::MaterialInfo& mi); - - void write_gems(dfstockpiles::StockpileSettings::GemsSet* gems); - + bool write_gems(dfstockpiles::StockpileSettings::GemsSet* gems); void read_gems(DeserializeMode mode, const std::string& filter); - - bool finished_goods_type_is_allowed(df::enums::item_type::item_type type); - bool finished_goods_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_finished_goods(dfstockpiles::StockpileSettings::FinishedGoodsSet* finished_goods); - void read_finished_goods(DeserializeMode mode, const std::string& filter); - void write_leather(dfstockpiles::StockpileSettings::LeatherSet* leather); + bool write_leather(dfstockpiles::StockpileSettings::LeatherSet* leather); void read_leather(DeserializeMode mode, const std::string& filter); - void write_cloth(dfstockpiles::StockpileSettings::ClothSet* cloth); - void read_cloth(DeserializeMode mode, const std::string& filter); - bool wood_mat_is_allowed(const df::plant_raw* plant); - void write_wood(dfstockpiles::StockpileSettings::WoodSet* wood); - void read_wood(DeserializeMode mode, const std::string& filter); - bool weapons_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_weapons(dfstockpiles::StockpileSettings::WeaponsSet* weapons); - void read_weapons(DeserializeMode mode, const std::string& filter); - bool armor_mat_is_allowed(const DFHack::MaterialInfo& mi); - void write_armor(dfstockpiles::StockpileSettings::ArmorSet* armor); - void read_armor(DeserializeMode mode, const std::string& filter); - void write_corpses(dfstockpiles::StockpileSettings::CorpsesSet* corpses); + bool write_corpses(dfstockpiles::StockpileSettings::CorpsesSet* corpses); void read_corpses(DeserializeMode mode, const std::string& filter); - void write_sheet(dfstockpiles::StockpileSettings::SheetSet* sheet); + bool write_refuse(dfstockpiles::StockpileSettings::RefuseSet* refuse); + void read_refuse(DeserializeMode mode, const std::string& filter); + bool write_sheet(dfstockpiles::StockpileSettings::SheetSet* sheet); void read_sheet(DeserializeMode mode, const std::string& filter); + bool write_stone(dfstockpiles::StockpileSettings::StoneSet* stone); + void read_stone(DeserializeMode mode, const std::string& filter); + bool write_weapons(dfstockpiles::StockpileSettings::WeaponsSet* weapons); + void read_weapons(DeserializeMode mode, const std::string& filter); + bool write_wood(dfstockpiles::StockpileSettings::WoodSet* wood); + void read_wood(DeserializeMode mode, const std::string& filter); }; From 06fa43932cbea53b9bee289a526f891d0b25f2fa Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 00:32:19 -0700 Subject: [PATCH 095/439] animals works --- plugins/lua/stockpiles.lua | 14 +- plugins/stockpiles/StockpileSerializer.cpp | 185 +++++++++++---------- 2 files changed, 108 insertions(+), 91 deletions(-) diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index 6770c044e..1a92e2c0c 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -92,6 +92,12 @@ local function export_stockpile(name, opts) end end + if includedElements == 0 then + for _,v in pairs(included_elements) do + includedElements = includedElements | v + end + end + stockpiles_export(name, get_sp_id(opts), includedElements) end @@ -142,14 +148,14 @@ local function process_args(opts, args) opts.filter = '' return argparse.processArgsGetopt(args, { - {'f', 'filter', has_arg=true, + {'f', 'filter', hasArg=true, handler=function(arg) opts.filter = arg end}, {'h', 'help', handler=function() opts.help = true end}, - {'i', 'include', has_arg=true, + {'i', 'include', hasArg=true, handler=function(arg) opts.includes = parse_include(arg) end}, - {'m', 'mode', has_arg=true, + {'m', 'mode', hasArg=true, handler=function(arg) opts.mode = parse_mode(arg) end}, - {'s', 'stockpile', has_arg=true, + {'s', 'stockpile', hasArg=true, handler=function(arg) opts.id = argparse.nonnegativeInt(arg, 'stockpile') end}, }) end diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 3b2849333..2d72aa822 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -10,6 +10,7 @@ // df #include "df/building_stockpilest.h" +#include "df/creature_raw.h" #include "df/inorganic_raw.h" #include "df/item_quality.h" #include @@ -520,7 +521,7 @@ static void unserialize_list_material(FuncMaterialAllowed is_allowed, } template -static void write_cat(bool include_types, uint32_t cat_flags, +static void write_cat(const char *name, bool include_types, uint32_t cat_flags, enum df::stockpile_group_set::Mask cat_mask, std::function mutable_cat_fn, std::function write_cat_fn) { @@ -528,13 +529,17 @@ static void write_cat(bool include_types, uint32_t cat_flags, return; T_cat_set* cat_set = mutable_cat_fn(); + if (!include_types) { + DEBUG(log).print("including all for %s since only category is being recorded\n", name); cat_set->set_all(true); return; } if (write_cat_fn(cat_set)) { - // all fields were set. might as well clear them and use the "all" flag + // all fields were set. clear them and use the "all" flag instead so "all" can be applied + // to other worlds with other generated types + DEBUG(log).print("including all for %s since all fields were enabled\n", name); cat_set->Clear(); cat_set->set_all(true); } @@ -554,90 +559,90 @@ void StockpileSerializer::write(uint32_t includedElements) { bool include_types = 0 != (includedElements & INCLUDED_ELEMENTS_TYPES); - write_cat(include_types, + write_cat("ammo", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_ammo, - std::bind(&StockpileSettings::mutable_ammo, mBuffer), + std::bind(&StockpileSettings::mutable_ammo, &mBuffer), std::bind(&StockpileSerializer::write_ammo, this, _1)); - write_cat(include_types, + write_cat("animals", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_animals, - std::bind(&StockpileSettings::mutable_animals, mBuffer), + std::bind(&StockpileSettings::mutable_animals, &mBuffer), std::bind(&StockpileSerializer::write_animals, this, _1)); - write_cat(include_types, + write_cat("armor", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_armor, - std::bind(&StockpileSettings::mutable_armor, mBuffer), + std::bind(&StockpileSettings::mutable_armor, &mBuffer), std::bind(&StockpileSerializer::write_armor, this, _1)); - write_cat(include_types, + write_cat("bars_blocks", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_bars_blocks, - std::bind(&StockpileSettings::mutable_barsblocks, mBuffer), + std::bind(&StockpileSettings::mutable_barsblocks, &mBuffer), std::bind(&StockpileSerializer::write_bars_blocks, this, _1)); - write_cat(include_types, + write_cat("cloth", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_cloth, - std::bind(&StockpileSettings::mutable_cloth, mBuffer), + std::bind(&StockpileSettings::mutable_cloth, &mBuffer), std::bind(&StockpileSerializer::write_cloth, this, _1)); - write_cat(include_types, + write_cat("coin", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_coins, - std::bind(&StockpileSettings::mutable_coin, mBuffer), + std::bind(&StockpileSettings::mutable_coin, &mBuffer), std::bind(&StockpileSerializer::write_coins, this, _1)); - write_cat(include_types, + write_cat("finished_goods", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_finished_goods, - std::bind(&StockpileSettings::mutable_finished_goods, mBuffer), + std::bind(&StockpileSettings::mutable_finished_goods, &mBuffer), std::bind(&StockpileSerializer::write_finished_goods, this, _1)); - write_cat(include_types, + write_cat("food", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_food, - std::bind(&StockpileSettings::mutable_food, mBuffer), + std::bind(&StockpileSettings::mutable_food, &mBuffer), std::bind(&StockpileSerializer::write_food, this, _1)); - write_cat(include_types, + write_cat("furniture", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_furniture, - std::bind(&StockpileSettings::mutable_furniture, mBuffer), + std::bind(&StockpileSettings::mutable_furniture, &mBuffer), std::bind(&StockpileSerializer::write_furniture, this, _1)); - write_cat(include_types, + write_cat("gems", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_gems, - std::bind(&StockpileSettings::mutable_gems, mBuffer), + std::bind(&StockpileSettings::mutable_gems, &mBuffer), std::bind(&StockpileSerializer::write_gems, this, _1)); - write_cat(include_types, + write_cat("leather", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_leather, - std::bind(&StockpileSettings::mutable_leather, mBuffer), + std::bind(&StockpileSettings::mutable_leather, &mBuffer), std::bind(&StockpileSerializer::write_leather, this, _1)); - write_cat(include_types, + write_cat("corpses", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_corpses, - std::bind(&StockpileSettings::mutable_corpses_v50, mBuffer), + std::bind(&StockpileSettings::mutable_corpses_v50, &mBuffer), std::bind(&StockpileSerializer::write_corpses, this, _1)); - write_cat(include_types, + write_cat("refuse", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_refuse, - std::bind(&StockpileSettings::mutable_refuse, mBuffer), + std::bind(&StockpileSettings::mutable_refuse, &mBuffer), std::bind(&StockpileSerializer::write_refuse, this, _1)); - write_cat(include_types, + write_cat("sheet", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_sheet, - std::bind(&StockpileSettings::mutable_sheet, mBuffer), + std::bind(&StockpileSettings::mutable_sheet, &mBuffer), std::bind(&StockpileSerializer::write_sheet, this, _1)); - write_cat(include_types, + write_cat("stone", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_stone, - std::bind(&StockpileSettings::mutable_stone, mBuffer), + std::bind(&StockpileSettings::mutable_stone, &mBuffer), std::bind(&StockpileSerializer::write_stone, this, _1)); - write_cat(include_types, + write_cat("weapons", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_weapons, - std::bind(&StockpileSettings::mutable_weapons, mBuffer), + std::bind(&StockpileSettings::mutable_weapons, &mBuffer), std::bind(&StockpileSerializer::write_weapons, this, _1)); - write_cat(include_types, + write_cat("wood", include_types, mPile->settings.flags.whole, mPile->settings.flags.mask_wood, - std::bind(&StockpileSettings::mutable_wood, mBuffer), + std::bind(&StockpileSettings::mutable_wood, &mBuffer), std::bind(&StockpileSerializer::write_wood, this, _1)); } @@ -672,6 +677,7 @@ void StockpileSerializer::read(DeserializeMode mode, const std::string& filter) } void StockpileSerializer::write_containers() { + DEBUG(log).print("writing container settings\n"); mBuffer.set_max_bins(mPile->max_bins); mBuffer.set_max_barrels(mPile->max_barrels); mBuffer.set_max_wheelbarrows(mPile->max_wheelbarrows); @@ -682,18 +688,10 @@ static void read_elem(const char *name, DeserializeMode mode, std::function has_elem_fn, std::function elem_fn, T_elem &setting) { - bool has_elem = has_elem_fn(); - bool is_set = has_elem && elem_fn() != 0; - bool just_disable = is_set && mode == DESERIALIZE_MODE_DISABLE; - - if (mode == DESERIALIZE_MODE_SET || just_disable) { - DEBUG(log).print("clearing %s\n", name); - setting = 0; - } - - if (!has_elem || just_disable) + if (!has_elem_fn()) return; + bool is_set = elem_fn() != 0; if (mode == DESERIALIZE_MODE_SET || is_set) { T_elem val = (mode == DESERIALIZE_MODE_DISABLE) ? 0 : elem_fn(); DEBUG(log).print("setting %s=%d\n", name, val); @@ -728,11 +726,30 @@ static void read_category(const char *name, DeserializeMode mode, if (mode == DESERIALIZE_MODE_SET || mode == DESERIALIZE_MODE_ENABLE) cat_flags |= cat_mask; - bool force = mode == DESERIALIZE_MODE_SET || all; char val = (mode == DESERIALIZE_MODE_DISABLE) ? (char)0 : (char)1; DEBUG(log).print("setting %s %s elements to %d\n", all ? "all" : "marked", name, val); - set_fn(force, val); + set_fn(all, val); +} + +static void set_elem(bool all, char val, bool enabled, bool& elem) { + if (all || enabled) + elem = val; +} + +static bool matches_filter(const std::string& filter, const std::string& name) { + if (!filter.size()) + return true; + return std::search(name.begin(), name.end(), filter.begin(), filter.end(), + [](unsigned char ch1, unsigned char ch2) { return std::toupper(ch1) == std::toupper(ch2); } + ) != name.end(); +} + +static void set_filter_elem(const std::string& filter, char val, df::creature_raw* r, char& elem) { + if (matches_filter(filter, r->name[0])) { + DEBUG(log).print("setting %s (%s) to %d\n", r->name[0].c_str(), r->creature_id.c_str(), val); + elem = val; + } } void StockpileSerializer::read_containers(DeserializeMode mode) { @@ -751,6 +768,7 @@ void StockpileSerializer::read_containers(DeserializeMode mode) { } void StockpileSerializer::write_general() { + DEBUG(log).print("writing general settings\n"); mBuffer.set_use_links_only(mPile->use_links_only); mBuffer.set_allow_inorganic(mPile->settings.allow_inorganic); mBuffer.set_allow_organic(mPile->settings.allow_organic); @@ -776,22 +794,17 @@ static bool ammo_mat_is_allowed(const MaterialInfo& mi) { } bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { - bool all = true; - - // ammo type - all = serialize_list_itemdef( + bool all = serialize_list_itemdef( [=](const std::string& token) { ammo->add_type(token); }, mPile->settings.ammo.type, std::vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), - item_type::AMMO) && all; + item_type::AMMO); - // metal all = serialize_list_material( ammo_mat_is_allowed, [=](const std::string& token) { ammo->add_mats(token); }, mPile->settings.ammo.mats) && all; - // other mats - only wood and bone are expected if (mPile->settings.ammo.other_mats.size() > 2) { WARN(log).print("ammo other materials > 2: %zd\n", mPile->settings.ammo.other_mats.size()); @@ -809,12 +822,10 @@ bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { DEBUG(log).print("other mats %zd is %s\n", i, token.c_str()); } - // quality core all = serialize_list_quality( [=](const std::string& token) { ammo->add_quality_core(token); }, mPile->settings.ammo.quality_core) && all; - // quality total all = serialize_list_quality( [=](const std::string& token) { ammo->add_quality_total(token); }, mPile->settings.ammo.quality_total) && all; @@ -823,13 +834,13 @@ bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { } void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& filter) { + auto & pammo = mPile->settings.ammo; read_category("ammo", mode, std::bind(&StockpileSettings::has_ammo, mBuffer), std::bind(&StockpileSettings::ammo, mBuffer), mPile->settings.flags.whole, mPile->settings.flags.mask_ammo, [&]() { - auto & pammo = mPile->settings.ammo; pammo.type.clear(); pammo.mats.clear(); pammo.other_mats.clear(); @@ -838,18 +849,15 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil }, [&](bool force, char val) { auto & bammo = mBuffer.ammo(); - auto & pammo = mPile->settings.ammo; - // ammo type + unserialize_list_itemdef( - [=](const size_t& idx) -> const std::string& { return bammo.type(idx); }, + [&](const size_t& idx) -> const std::string& { return bammo.type(idx); }, bammo.type_size(), &pammo.type, item_type::AMMO); - // materials metals unserialize_list_material(ammo_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, + [&](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, bammo.mats_size(), &pammo.mats); - // others pammo.other_mats.clear(); pammo.other_mats.resize(2, '\0'); if (bammo.other_mats_size() > 0) { @@ -859,16 +867,15 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 : -1; DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); - if (idx != -1) - pammo.other_mats.at(idx) = 1; + if (idx == -1) + continue; + pammo.other_mats.at(idx) = 1; } } - // core quality unserialize_list_quality([=](const size_t& idx) -> const std::string& { return bammo.quality_core(idx); }, bammo.quality_core_size(), pammo.quality_core); - // total quality unserialize_list_quality([=](const size_t& idx) -> const std::string& { return bammo.quality_total(idx); }, bammo.quality_total_size(), pammo.quality_total); }); @@ -886,43 +893,47 @@ bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) continue; } df::creature_raw* r = find_creature(i); - DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); + if (r->flags.is_set(creature_raw_flags::GENERATED) + || r->creature_id == "EQUIPMENT_WAGON") + continue; + DEBUG(log).print("saving creature %s\n", r->creature_id.c_str()); animals->add_enabled(r->creature_id); } return all; } void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& filter) { + auto & panimals = mPile->settings.animals; read_category("animals", mode, std::bind(&StockpileSettings::has_animals, mBuffer), std::bind(&StockpileSettings::animals, mBuffer), mPile->settings.flags.whole, mPile->settings.flags.mask_animals, [&]() { - auto & panimals = mPile->settings.animals; panimals.empty_cages = false; panimals.empty_traps = false; panimals.enabled.clear(); }, - [&](bool force, char val) { + [&](bool all, char val) { auto & banimals = mBuffer.animals(); - auto & panimals = mPile->settings.animals; - if (force || banimals.empty_cages()) - panimals.empty_cages = banimals.empty_cages() && val; - if (force || banimals.empty_traps()) - panimals.empty_traps = banimals.empty_traps() && val; - - panimals.enabled.resize(world->raws.creatures.all.size(), '\0'); - for (auto i = 0; i < banimals.enabled_size(); ++i) { - const std::string& id = banimals.enabled(i); - int idx = find_creature(id); - DEBUG(log).print("%s %d\n", id.c_str(), idx); - if (idx < 0 || size_t(idx) >= panimals.enabled.size()) { - WARN(log).print("animal index invalid: %d\n", idx); - continue; + set_elem(all, val, banimals.empty_cages(), panimals.empty_cages); + set_elem(all, val, banimals.empty_traps(), panimals.empty_traps); + + size_t num_animals = world->raws.creatures.all.size(); + panimals.enabled.resize(num_animals, '\0'); + if (all) { + for (auto idx = 0; idx < num_animals; ++idx) + set_filter_elem(filter, val, find_creature(idx), panimals.enabled.at(idx)); + } else { + for (auto i = 0; i < banimals.enabled_size(); ++i) { + const std::string& id = banimals.enabled(i); + int idx = find_creature(id); + if (idx < 0 || size_t(idx) >= num_animals) { + WARN(log).print("animal index invalid: %d\n", idx); + continue; + } + set_filter_elem(filter, val, find_creature(idx), panimals.enabled.at(idx)); } - if (!filter.size() || id.find(filter) != id.npos) - panimals.enabled.at(idx) = val; } }); } From 0a9e81418e041b2c097a58149fa95c84262ae701 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 10:07:03 -0700 Subject: [PATCH 096/439] port two helper functions --- plugins/stockpiles/StockpileSerializer.cpp | 152 ++++++++++++--------- 1 file changed, 87 insertions(+), 65 deletions(-) diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 2d72aa822..eb18576f0 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -222,6 +222,34 @@ static typename df::enum_traits::base_type linear_index(df::enum_traits tr return -1; } +static void set_elem(bool all, char val, bool enabled, bool& elem) { + if (all || enabled) + elem = val; +} + +static bool matches_filter(const string& filter, const string& name) { + if (!filter.size()) + return true; + return std::search(name.begin(), name.end(), filter.begin(), filter.end(), + [](unsigned char ch1, unsigned char ch2) { return std::toupper(ch1) == std::toupper(ch2); } + ) != name.end(); +} + +static void set_filter_elem(const string& filter, char val, const string& name, const string& id, char& elem) { + if (matches_filter(filter, name)) { + DEBUG(log).print("setting %s (%s) to %d\n", name.c_str(), id.c_str(), val); + elem = val; + } +} + +template +static void set_filter_elem(const string& filter, char val, const string& name, T id, char& elem) { + if (matches_filter(filter, name)) { + DEBUG(log).print("setting %s (%d) to %d\n", name.c_str(), (int32_t)id, val); + elem = val; + } +} + /** * There are many repeated (un)serialization cases throughout the stockpile_settings structure, * so the most common cases have been generalized into generic functions using lambdas. @@ -252,29 +280,35 @@ static bool serialize_list_itemdef(FuncWriteExport add_value, ItemTypeInfo ii; if (!ii.decode(type, i)) continue; + DEBUG(log).print("adding itemdef type %s\n", ii.getToken().c_str()); add_value(ii.getToken()); - DEBUG(log).print("itemdef type %zd is %s\n", i, ii.getToken().c_str()); } return all; } -static void unserialize_list_itemdef(FuncReadImport read_value, - int32_t list_size, - std::vector* pile_list, - item_type::item_type type) { - pile_list->clear(); - pile_list->resize(Items::getSubtypeCount(type), '\0'); - for (int i = 0; i < list_size; ++i) { - std::string token = read_value(i); +static void unserialize_list_itemdef(bool all, char val, const string& filter, FuncReadImport read_value, + int32_t list_size, std::vector& pile_list, item_type::item_type type) { + int num_elems = Items::getSubtypeCount(type); + pile_list.resize(num_elems, '\0'); + if (all) { + for (auto idx = 0; idx < num_elems; ++idx) { + ItemTypeInfo ii; + ii.decode(type, idx); + set_filter_elem(filter, val, ii.toString(), idx, pile_list.at(idx)); + } + return; + } + + for (auto i = 0; i < list_size; ++i) { + string id = read_value(i); ItemTypeInfo ii; - if (!ii.find(token)) + if (!ii.find(id)) continue; - DEBUG(log).print("itemdef %d is %s\n", ii.subtype, token.c_str()); - if (size_t(ii.subtype) >= pile_list->size()) { - WARN(log).print("itemdef index too large! idx[%d] max_size[%zd]\n", ii.subtype, pile_list->size()); + if (ii.subtype < 0 || size_t(ii.subtype) >= pile_list.size()) { + WARN(log).print("item type index invalid: %d\n", ii.subtype); continue; } - pile_list->at(ii.subtype) = 1; + set_filter_elem(filter, val, id, ii.subtype, pile_list.at(ii.subtype)); } } @@ -291,7 +325,7 @@ static bool serialize_list_quality(FuncWriteExport add_value, } const std::string f_type(quality_traits::key_table[i]); add_value(f_type); - DEBUG(log).print("quality: %zd is %s\n", i, f_type.c_str()); + DEBUG(log).print("adding quality %s\n", f_type.c_str()); } return all; } @@ -485,38 +519,44 @@ static bool serialize_list_material(FuncMaterialAllowed is_allowed, mi.decode(0, i); if (!is_allowed(mi)) continue; - DEBUG(log).print("material %zd is %s\n", i, mi.getToken().c_str()); + DEBUG(log).print("adding material %s\n", mi.getToken().c_str()); add_value(mi.getToken()); } return all; } -static void unserialize_list_material(FuncMaterialAllowed is_allowed, - FuncReadImport read_value, int32_t list_size, - std::vector* pile_list) { - // we initialize all possible (allowed) values to 0, - // then all other not-allowed values to 1 - // why? because that's how the memory is in DF before - // we muck with it. - std::set idx_set; - pile_list->clear(); - pile_list->resize(world->raws.inorganics.size(), 0); - for (size_t i = 0; i < pile_list->size(); ++i) { +static void unserialize_list_material(bool all, char val, const string& filter, + FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, + std::vector& pile_list) { + // we initialize all disallowed values to 1 + // why? because that's how the memory is in DF before we muck with it. + size_t num_elems = world->raws.inorganics.size(); + pile_list.resize(num_elems, 0); + for (size_t i = 0; i < pile_list.size(); ++i) { MaterialInfo mi(0, i); - pile_list->at(i) = is_allowed(mi) ? 0 : 1; + if (!is_allowed(mi)) + pile_list.at(i) = 1; } - for (int i = 0; i < list_size; ++i) { - const std::string token = read_value(i); + + if (all) { + for (auto idx = 0; idx < num_elems; ++idx) { + MaterialInfo mi; + mi.decode(0, idx); + set_filter_elem(filter, val, mi.toString(), idx, pile_list.at(idx)); + } + return; + } + + for (auto i = 0; i < list_size; ++i) { + string id = read_value(i); MaterialInfo mi; - mi.find(token); - if (!is_allowed(mi)) + if (!mi.find(id) || !is_allowed(mi)) continue; - DEBUG(log).print("material %d is %s\n", mi.index, token.c_str()); - if (size_t(mi.index) >= pile_list->size()) { - WARN(log).print("material index too large! idx[%d] max_size[%zd]\n", mi.index, pile_list->size()); + if (mi.index < 0 || size_t(mi.index) >= pile_list.size()) { + WARN(log).print("material type index invalid: %d\n", mi.index); continue; } - pile_list->at(mi.index) = 1; + set_filter_elem(filter, val, id, mi.index, pile_list.at(mi.index)); } } @@ -732,26 +772,6 @@ static void read_category(const char *name, DeserializeMode mode, set_fn(all, val); } -static void set_elem(bool all, char val, bool enabled, bool& elem) { - if (all || enabled) - elem = val; -} - -static bool matches_filter(const std::string& filter, const std::string& name) { - if (!filter.size()) - return true; - return std::search(name.begin(), name.end(), filter.begin(), filter.end(), - [](unsigned char ch1, unsigned char ch2) { return std::toupper(ch1) == std::toupper(ch2); } - ) != name.end(); -} - -static void set_filter_elem(const std::string& filter, char val, df::creature_raw* r, char& elem) { - if (matches_filter(filter, r->name[0])) { - DEBUG(log).print("setting %s (%s) to %d\n", r->name[0].c_str(), r->creature_id.c_str(), val); - elem = val; - } -} - void StockpileSerializer::read_containers(DeserializeMode mode) { read_elem("max_bins", mode, std::bind(&StockpileSettings::has_max_bins, mBuffer), @@ -847,18 +867,17 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil quality_clear(pammo.quality_core); quality_clear(pammo.quality_total); }, - [&](bool force, char val) { + [&](bool all, char val) { auto & bammo = mBuffer.ammo(); - unserialize_list_itemdef( + unserialize_list_itemdef(all, val, filter, [&](const size_t& idx) -> const std::string& { return bammo.type(idx); }, - bammo.type_size(), &pammo.type, item_type::AMMO); + bammo.type_size(), pammo.type, item_type::AMMO); - unserialize_list_material(ammo_mat_is_allowed, + unserialize_list_material(all, val, filter, ammo_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, - bammo.mats_size(), &pammo.mats); + bammo.mats_size(), pammo.mats); - pammo.other_mats.clear(); pammo.other_mats.resize(2, '\0'); if (bammo.other_mats_size() > 0) { // TODO remove hardcoded value @@ -922,8 +941,10 @@ void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& size_t num_animals = world->raws.creatures.all.size(); panimals.enabled.resize(num_animals, '\0'); if (all) { - for (auto idx = 0; idx < num_animals; ++idx) - set_filter_elem(filter, val, find_creature(idx), panimals.enabled.at(idx)); + for (auto idx = 0; idx < num_animals; ++idx) { + auto r = find_creature(idx); + set_filter_elem(filter, val, r->name[0], r->creature_id, panimals.enabled.at(idx)); + } } else { for (auto i = 0; i < banimals.enabled_size(); ++i) { const std::string& id = banimals.enabled(i); @@ -932,7 +953,8 @@ void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& WARN(log).print("animal index invalid: %d\n", idx); continue; } - set_filter_elem(filter, val, find_creature(idx), panimals.enabled.at(idx)); + auto r = find_creature(idx); + set_filter_elem(filter, val, r->name[0], r->creature_id, panimals.enabled.at(idx)); } } }); From a545bc8120d388ed85aaabf3224c962873c61544 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 15:14:28 -0700 Subject: [PATCH 097/439] it compiles! --- plugins/stockpiles/StockpileSerializer.cpp | 1502 +++++++++++--------- plugins/stockpiles/proto/stockpiles.proto | 3 + 2 files changed, 801 insertions(+), 704 deletions(-) diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index eb18576f0..1ce6b65b1 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -242,8 +242,8 @@ static void set_filter_elem(const string& filter, char val, const string& name, } } -template -static void set_filter_elem(const string& filter, char val, const string& name, T id, char& elem) { +template +static void set_filter_elem(const string& filter, T_val val, const string& name, T_id id, T_val& elem) { if (matches_filter(filter, name)) { DEBUG(log).print("setting %s (%d) to %d\n", name.c_str(), (int32_t)id, val); elem = val; @@ -334,23 +334,26 @@ static void quality_clear(bool(&pile_list)[7]) { std::fill(pile_list, pile_list + 7, false); } -static void unserialize_list_quality(FuncReadImport read_value, - int32_t list_size, - bool(&pile_list)[7]) { - quality_clear(pile_list); - if (list_size > 0 && list_size <= 7) { - using df::enums::item_quality::item_quality; - df::enum_traits quality_traits; - for (int i = 0; i < list_size; ++i) { - const std::string quality = read_value(i); - df::enum_traits::base_type idx = linear_index(quality_traits, quality); - if (idx < 0) { - WARN(log).print("invalid quality token: %s\n", quality.c_str()); - continue; - } - DEBUG(log).print("quality: %d is %s\n", idx, quality.c_str()); - pile_list[idx] = true; +static void unserialize_list_quality(bool all, bool val, const string& filter, + FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]) { + if (all) { + for (auto idx = 0; idx < 7; ++idx) { + string id = ENUM_KEY_STR(item_quality, (df::item_quality)idx); + set_filter_elem(filter, val, id, idx, pile_list[idx]); } + return; + } + + using df::enums::item_quality::item_quality; + df::enum_traits quality_traits; + for (int i = 0; i < list_size; ++i) { + const std::string quality = read_value(i); + df::enum_traits::base_type idx = linear_index(quality_traits, quality); + if (idx < 0) { + WARN(log).print("invalid quality token: %s\n", quality.c_str()); + continue; + } + set_filter_elem(filter, val, quality, idx, pile_list[idx]); } } @@ -392,13 +395,17 @@ static bool serialize_list_other_mats( return all; } -static void unserialize_list_other_mats( - const std::map other_mats, - FuncReadImport read_value, - int32_t list_size, - std::vector* pile_list) { - pile_list->clear(); - pile_list->resize(other_mats.size(), '\0'); +static void unserialize_list_other_mats(bool all, char val, const string& filter, + const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { + size_t num_elems = other_mats.size(); + pile_list.resize(num_elems, '\0'); + + if (all) { + for (auto & entry : other_mats) + set_filter_elem(filter, val, entry.second, entry.first, pile_list.at(entry.first)); + return; + } + for (int i = 0; i < list_size; ++i) { const std::string token = read_value(i); size_t idx = other_mats_token(other_mats, token); @@ -406,12 +413,11 @@ static void unserialize_list_other_mats( WARN(log).print("invalid other mat with token %s\n", token.c_str()); continue; } - DEBUG(log).print("other_mats %zd is %s\n", idx, token.c_str()); - if (idx >= pile_list->size()) { - WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, pile_list->size()); + if (idx >= num_elems) { + WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, num_elems); continue; } - pile_list->at(idx) = 1; + set_filter_elem(filter, val, token, idx, pile_list.at(idx)); } } @@ -439,20 +445,26 @@ static bool serialize_list_organic_mat(FuncWriteExport add_value, return all; } -static void unserialize_list_organic_mat(FuncReadImport get_value, - size_t list_size, std::vector* pile_list, - organic_mat_category::organic_mat_category cat) { - pile_list->clear(); - pile_list->resize(OrganicMatLookup::food_max_size(cat), '\0'); +static void unserialize_list_organic_mat(bool all, char val, const string& filter, FuncReadImport read_value, + size_t list_size, std::vector& pile_list, organic_mat_category::organic_mat_category cat) { + size_t num_elems = OrganicMatLookup::food_max_size(cat); + pile_list.resize(num_elems, '\0'); + if (all) { + for (size_t idx = 0; idx < num_elems; ++idx) { + string token = OrganicMatLookup::food_token_by_idx(cat, idx); + set_filter_elem(filter, val, token, idx, pile_list.at(idx)); + } + return; + } + for (size_t i = 0; i < list_size; ++i) { - std::string token = get_value(i); + const std::string token = read_value(i); int16_t idx = OrganicMatLookup::food_idx_by_token(cat, token); - DEBUG(log).print(" organic_material %d is %s\n", idx, token.c_str()); - if (size_t(idx) >= pile_list->size()) { - WARN(log).print("organic mat index too large! idx[%d] max_size[%zd]\n", idx, pile_list->size()); + if (idx < 0 || size_t(idx) >= num_elems) { + WARN(log).print("organic mat index too large! idx[%d] max_size[%zd]\n", idx, num_elems); continue; } - pile_list->at(idx) = 1; + set_filter_elem(filter, val, token, idx, pile_list.at(idx)); } } @@ -481,29 +493,37 @@ static bool serialize_list_item_type(FuncItemAllowed is_allowed, return all; } -static void unserialize_list_item_type(FuncItemAllowed is_allowed, - FuncReadImport read_value, int32_t list_size, - std::vector* pile_list) { - pile_list->clear(); - pile_list->resize(112, '\0'); // TODO remove hardcoded list size value - for (size_t i = 0; i < pile_list->size(); ++i) { - pile_list->at(i) = is_allowed((item_type::item_type)i) ? 0 : 1; +static void unserialize_list_item_type(bool all, char val, const string& filter, FuncItemAllowed is_allowed, + FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { + // TODO can we remove the hardcoded list size? + size_t num_elems = 112; + pile_list.resize(num_elems, '\0'); + for (size_t i = 0; i < num_elems; ++i) { + if (!is_allowed((df::item_type)i)) + pile_list.at(i) = 1; } + + if (all) { + for (size_t idx = 0; idx < num_elems; ++idx) { + string id = ENUM_KEY_STR(item_type, (df::item_type)idx); + set_filter_elem(filter, val, id, idx, pile_list.at(idx)); + } + return; + } + using df::enums::item_type::item_type; df::enum_traits type_traits; - for (int32_t i = 0; i < list_size; ++i) { + for (int i = 0; i < list_size; ++i) { const std::string token = read_value(i); // subtract one because item_type starts at -1 const df::enum_traits::base_type idx = linear_index(type_traits, token) - 1; - const item_type type = (item_type)idx; - if (!is_allowed(type)) + if (!is_allowed((item_type)idx)) continue; - DEBUG(log).print("item_type %d is %s\n", idx, token.c_str()); - if (size_t(idx) >= pile_list->size()) { - WARN(log).print("error item_type index too large! idx[%d] max_size[%zd]\n", idx, pile_list->size()); + if (idx < 0 || size_t(idx) >= num_elems) { + WARN(log).print("error item_type index too large! idx[%d] max_size[%zd]\n", idx, num_elems); continue; } - pile_list->at(idx) = 1; + set_filter_elem(filter, val, token, idx, pile_list.at(idx)); } } @@ -539,7 +559,7 @@ static void unserialize_list_material(bool all, char val, const string& filter, } if (all) { - for (auto idx = 0; idx < num_elems; ++idx) { + for (size_t idx = 0; idx < num_elems; ++idx) { MaterialInfo mi; mi.decode(0, idx); set_filter_elem(filter, val, mi.toString(), idx, pile_list.at(idx)); @@ -560,6 +580,48 @@ static void unserialize_list_material(bool all, char val, const string& filter, } } +static bool serialize_list_creature(FuncWriteExport add_value, const std::vector& list) { + bool all = true; + + for (size_t i = 0; i < list.size(); ++i) { + if (!list.at(i)) { + all = false; + continue; + } + df::creature_raw* r = find_creature(i); + if (r->flags.is_set(creature_raw_flags::GENERATED) + || r->creature_id == "EQUIPMENT_WAGON") + continue; + DEBUG(log).print("adding creature %s\n", r->creature_id.c_str()); + add_value(r->creature_id); + } + return all; +} + +static void unserialize_list_creature(bool all, char val, const string& filter, + FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { + size_t num_elems = world->raws.creatures.all.size(); + pile_list.resize(num_elems, '\0'); + if (all) { + for (size_t idx = 0; idx < num_elems; ++idx) { + auto r = find_creature(idx); + set_filter_elem(filter, val, r->name[0], r->creature_id, pile_list.at(idx)); + } + return; + } + + for (auto i = 0; i < list_size; ++i) { + string id = read_value(i); + int idx = find_creature(id); + if (idx < 0 || size_t(idx) >= num_elems) { + WARN(log).print("animal index invalid: %d\n", idx); + continue; + } + auto r = find_creature(idx); + set_filter_elem(filter, val, r->name[0], r->creature_id, pile_list.at(idx)); + } +} + template static void write_cat(const char *name, bool include_types, uint32_t cat_flags, enum df::stockpile_group_set::Mask cat_mask, @@ -815,14 +877,14 @@ static bool ammo_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { bool all = serialize_list_itemdef( - [=](const std::string& token) { ammo->add_type(token); }, + [&](const std::string& token) { ammo->add_type(token); }, mPile->settings.ammo.type, std::vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), item_type::AMMO); all = serialize_list_material( ammo_mat_is_allowed, - [=](const std::string& token) { ammo->add_mats(token); }, + [&](const std::string& token) { ammo->add_mats(token); }, mPile->settings.ammo.mats) && all; if (mPile->settings.ammo.other_mats.size() > 2) { @@ -843,61 +905,78 @@ bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { } all = serialize_list_quality( - [=](const std::string& token) { ammo->add_quality_core(token); }, + [&](const std::string& token) { ammo->add_quality_core(token); }, mPile->settings.ammo.quality_core) && all; all = serialize_list_quality( - [=](const std::string& token) { ammo->add_quality_total(token); }, + [&](const std::string& token) { ammo->add_quality_total(token); }, mPile->settings.ammo.quality_total) && all; return all; } void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& filter) { - auto & pammo = mPile->settings.ammo; - read_category("ammo", mode, - std::bind(&StockpileSettings::has_ammo, mBuffer), - std::bind(&StockpileSettings::ammo, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_ammo, - [&]() { - pammo.type.clear(); - pammo.mats.clear(); - pammo.other_mats.clear(); - quality_clear(pammo.quality_core); - quality_clear(pammo.quality_total); - }, - [&](bool all, char val) { - auto & bammo = mBuffer.ammo(); - - unserialize_list_itemdef(all, val, filter, - [&](const size_t& idx) -> const std::string& { return bammo.type(idx); }, - bammo.type_size(), pammo.type, item_type::AMMO); - - unserialize_list_material(all, val, filter, ammo_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, - bammo.mats_size(), pammo.mats); - - pammo.other_mats.resize(2, '\0'); - if (bammo.other_mats_size() > 0) { - // TODO remove hardcoded value - for (int i = 0; i < bammo.other_mats_size(); ++i) { - const std::string token = bammo.other_mats(i); - const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 - : -1; - DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); - if (idx == -1) - continue; - pammo.other_mats.at(idx) = 1; - } + auto & pammo = mPile->settings.ammo; + read_category("ammo", mode, + std::bind(&StockpileSettings::has_ammo, mBuffer), + std::bind(&StockpileSettings::ammo, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_ammo, + [&]() { + pammo.type.clear(); + pammo.mats.clear(); + pammo.other_mats.clear(); + quality_clear(pammo.quality_core); + quality_clear(pammo.quality_total); + }, + [&](bool all, char val) { + auto & bammo = mBuffer.ammo(); + + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bammo.type(idx); }, + bammo.type_size(), pammo.type, item_type::AMMO); + + unserialize_list_material(all, val, filter, ammo_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, + bammo.mats_size(), pammo.mats); + + pammo.other_mats.resize(2, '\0'); + if (bammo.other_mats_size() > 0) { + // TODO remove hardcoded value + for (int i = 0; i < bammo.other_mats_size(); ++i) { + const std::string token = bammo.other_mats(i); + const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 + : -1; + DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); + if (idx == -1) + continue; + pammo.other_mats.at(idx) = 1; } + } - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return bammo.quality_core(idx); }, - bammo.quality_core_size(), pammo.quality_core); + pammo.other_mats.resize(2, '\0'); + if (all) { + set_filter_elem(filter, val, "WOOD", 0, pammo.other_mats.at(0)); + set_filter_elem(filter, val, "BONE", 1, pammo.other_mats.at(1)); + } else { + // TODO can we un-hardcode the values? + for (int i = 0; i < bammo.other_mats_size(); ++i) { + const std::string id = bammo.other_mats(i); + const int32_t idx = id == "WOOD" ? 0 : id == "BONE" ? 1 : -1; + if (idx == -1) + continue; + set_filter_elem(filter, val, id, idx, pammo.other_mats.at(idx)); + } + } - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return bammo.quality_total(idx); }, - bammo.quality_total_size(), pammo.quality_total); - }); + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bammo.quality_core(idx); }, + bammo.quality_core_size(), pammo.quality_core); + + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bammo.quality_total(idx); }, + bammo.quality_total_size(), pammo.quality_total); + }); } bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) { @@ -906,58 +985,34 @@ bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) animals->set_empty_cages(panimals.empty_cages); animals->set_empty_traps(panimals.empty_traps); - for (size_t i = 0; i < panimals.enabled.size(); ++i) { - if (!panimals.enabled.at(i)) { - all = false; - continue; - } - df::creature_raw* r = find_creature(i); - if (r->flags.is_set(creature_raw_flags::GENERATED) - || r->creature_id == "EQUIPMENT_WAGON") - continue; - DEBUG(log).print("saving creature %s\n", r->creature_id.c_str()); - animals->add_enabled(r->creature_id); - } - return all; + + return serialize_list_creature( + [&](const std::string& token) { animals->add_enabled(token); }, + panimals.enabled) && all; } void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& filter) { auto & panimals = mPile->settings.animals; read_category("animals", mode, - std::bind(&StockpileSettings::has_animals, mBuffer), - std::bind(&StockpileSettings::animals, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_animals, - [&]() { - panimals.empty_cages = false; - panimals.empty_traps = false; - panimals.enabled.clear(); - }, - [&](bool all, char val) { - auto & banimals = mBuffer.animals(); - set_elem(all, val, banimals.empty_cages(), panimals.empty_cages); - set_elem(all, val, banimals.empty_traps(), panimals.empty_traps); - - size_t num_animals = world->raws.creatures.all.size(); - panimals.enabled.resize(num_animals, '\0'); - if (all) { - for (auto idx = 0; idx < num_animals; ++idx) { - auto r = find_creature(idx); - set_filter_elem(filter, val, r->name[0], r->creature_id, panimals.enabled.at(idx)); - } - } else { - for (auto i = 0; i < banimals.enabled_size(); ++i) { - const std::string& id = banimals.enabled(i); - int idx = find_creature(id); - if (idx < 0 || size_t(idx) >= num_animals) { - WARN(log).print("animal index invalid: %d\n", idx); - continue; - } - auto r = find_creature(idx); - set_filter_elem(filter, val, r->name[0], r->creature_id, panimals.enabled.at(idx)); - } - } - }); + std::bind(&StockpileSettings::has_animals, mBuffer), + std::bind(&StockpileSettings::animals, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_animals, + [&]() { + panimals.empty_cages = false; + panimals.empty_traps = false; + panimals.enabled.clear(); + }, + [&](bool all, char val) { + auto & banimals = mBuffer.animals(); + + set_elem(all, val, banimals.empty_cages(), panimals.empty_cages); + set_elem(all, val, banimals.empty_traps(), panimals.empty_traps); + + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const std::string& { return banimals.enabled(idx); }, + banimals.enabled_size(), panimals.enabled); + }); } static bool armor_mat_is_allowed(const MaterialInfo& mi) { @@ -974,42 +1029,42 @@ bool StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { // armor type all = serialize_list_itemdef( - [=](const std::string& token) { armor->add_body(token); }, + [&](const std::string& token) { armor->add_body(token); }, parmor.body, std::vector(world->raws.itemdefs.armor.begin(), world->raws.itemdefs.armor.end()), item_type::ARMOR) && all; // helm type all = serialize_list_itemdef( - [=](const std::string& token) { armor->add_head(token); }, + [&](const std::string& token) { armor->add_head(token); }, parmor.head, std::vector(world->raws.itemdefs.helms.begin(), world->raws.itemdefs.helms.end()), item_type::HELM) && all; // shoes type all = serialize_list_itemdef( - [=](const std::string& token) { armor->add_feet(token); }, + [&](const std::string& token) { armor->add_feet(token); }, parmor.feet, std::vector(world->raws.itemdefs.shoes.begin(), world->raws.itemdefs.shoes.end()), item_type::SHOES) && all; // gloves type all = serialize_list_itemdef( - [=](const std::string& token) { armor->add_hands(token); }, + [&](const std::string& token) { armor->add_hands(token); }, parmor.hands, std::vector(world->raws.itemdefs.gloves.begin(), world->raws.itemdefs.gloves.end()), item_type::GLOVES) && all; // pant type all = serialize_list_itemdef( - [=](const std::string& token) { armor->add_legs(token); }, + [&](const std::string& token) { armor->add_legs(token); }, parmor.legs, std::vector(world->raws.itemdefs.pants.begin(), world->raws.itemdefs.pants.end()), item_type::PANTS) && all; // shield type all = serialize_list_itemdef( - [=](const std::string& token) { armor->add_shield(token); }, + [&](const std::string& token) { armor->add_shield(token); }, parmor.shield, std::vector(world->raws.itemdefs.shields.begin(), world->raws.itemdefs.shields.end()), item_type::SHIELD) && all; @@ -1017,84 +1072,91 @@ bool StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { // materials all = serialize_list_material( armor_mat_is_allowed, - [=](const std::string& token) { armor->add_mats(token); }, + [&](const std::string& token) { armor->add_mats(token); }, parmor.mats) && all; // other mats all = serialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [=](const std::string& token) { armor->add_other_mats(token); }, + mOtherMatsWeaponsArmor.mats, [&](const std::string& token) { armor->add_other_mats(token); }, parmor.other_mats) && all; // quality core - all = serialize_list_quality([=](const std::string& token) { armor->add_quality_core(token); }, + all = serialize_list_quality([&](const std::string& token) { armor->add_quality_core(token); }, parmor.quality_core) && all; // quality total - all = serialize_list_quality([=](const std::string& token) { armor->add_quality_total(token); }, + all = serialize_list_quality([&](const std::string& token) { armor->add_quality_total(token); }, parmor.quality_total) && all; return all; } void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_armor()) { - mPile->settings.flags.bits.armor = 1; - const StockpileSettings::ArmorSet armor = mBuffer.armor(); - DEBUG(log).print("armor:\n"); + auto & parmor = mPile->settings.armor; + read_category("armor", mode, + std::bind(&StockpileSettings::has_armor, mBuffer), + std::bind(&StockpileSettings::armor, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_armor, + [&]() { + parmor.body.clear(); + parmor.head.clear(); + parmor.feet.clear(); + parmor.hands.clear(); + parmor.legs.clear(); + parmor.shield.clear(); + parmor.other_mats.clear(); + parmor.mats.clear(); + quality_clear(parmor.quality_core); + quality_clear(parmor.quality_total); + }, + [&](bool all, char val) { + auto & barmor = mBuffer.armor(); - bool unusable = armor.unusable(); - bool usable = armor.usable(); - DEBUG(log).print("unusable %d\n", unusable); - DEBUG(log).print("usable %d\n", usable); - mPile->settings.armor.unusable = unusable; - mPile->settings.armor.usable = usable; + set_elem(all, val, barmor.unusable(), parmor.unusable); + set_elem(all, val, barmor.usable(), parmor.usable); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.body(idx); }, - armor.body_size(), &mPile->settings.armor.body, item_type::ARMOR); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.body(idx); }, + barmor.body_size(), parmor.body, item_type::ARMOR); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.head(idx); }, - armor.head_size(), &mPile->settings.armor.head, item_type::HELM); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.head(idx); }, + barmor.head_size(), parmor.head, item_type::HELM); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.feet(idx); }, - armor.feet_size(), &mPile->settings.armor.feet, item_type::SHOES); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.feet(idx); }, + barmor.feet_size(), parmor.feet, item_type::SHOES); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.hands(idx); }, - armor.hands_size(), &mPile->settings.armor.hands, item_type::GLOVES); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.hands(idx); }, + barmor.hands_size(), parmor.hands, item_type::GLOVES); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.legs(idx); }, - armor.legs_size(), &mPile->settings.armor.legs, item_type::PANTS); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.legs(idx); }, + barmor.legs_size(), parmor.legs, item_type::PANTS); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return armor.shield(idx); }, - armor.shield_size(), &mPile->settings.armor.shield, item_type::SHIELD); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.shield(idx); }, + barmor.shield_size(), parmor.shield, item_type::SHIELD); - unserialize_list_material( - armor_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return armor.mats(idx); }, - armor.mats_size(), &mPile->settings.armor.mats); + unserialize_list_material(all, val, filter, + armor_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return barmor.mats(idx); }, + barmor.mats_size(), parmor.mats); - unserialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return armor.other_mats(idx); }, - armor.other_mats_size(), &mPile->settings.armor.other_mats); + unserialize_list_other_mats(all, val, filter, + mOtherMatsWeaponsArmor.mats, [&](const size_t& idx) -> const std::string& { return barmor.other_mats(idx); }, + barmor.other_mats_size(), parmor.other_mats); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_core(idx); }, - armor.quality_core_size(), mPile->settings.armor.quality_core); + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.quality_core(idx); }, + barmor.quality_core_size(), parmor.quality_core); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return armor.quality_total(idx); }, - armor.quality_total_size(), mPile->settings.armor.quality_total); - } - else { - mPile->settings.flags.bits.armor = 0; - mPile->settings.armor.body.clear(); - mPile->settings.armor.head.clear(); - mPile->settings.armor.feet.clear(); - mPile->settings.armor.hands.clear(); - mPile->settings.armor.legs.clear(); - mPile->settings.armor.shield.clear(); - mPile->settings.armor.other_mats.clear(); - mPile->settings.armor.mats.clear(); - quality_clear(mPile->settings.armor.quality_core); - quality_clear(mPile->settings.armor.quality_total); - } + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return barmor.quality_total(idx); }, + barmor.quality_total_size(), parmor.quality_total); + }); } static bool bars_mat_is_allowed(const MaterialInfo& mi) { @@ -1108,139 +1170,152 @@ static bool blocks_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { bool all = serialize_list_material( bars_mat_is_allowed, - [=](const std::string& token) { bars_blocks->add_bars_mats(token); }, + [&](const std::string& token) { bars_blocks->add_bars_mats(token); }, mPile->settings.bars_blocks.bars_mats); all = serialize_list_material( blocks_mat_is_allowed, - [=](const std::string& token) { bars_blocks->add_blocks_mats(token); }, + [&](const std::string& token) { bars_blocks->add_blocks_mats(token); }, mPile->settings.bars_blocks.blocks_mats) && all; all = serialize_list_other_mats( - mOtherMatsBars.mats, [=](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, + mOtherMatsBars.mats, [&](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, mPile->settings.bars_blocks.bars_other_mats) && all; all = serialize_list_other_mats( - mOtherMatsBlocks.mats, [=](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, + mOtherMatsBlocks.mats, [&](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, mPile->settings.bars_blocks.blocks_other_mats) && all; return all; } void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_barsblocks()) { - mPile->settings.flags.bits.bars_blocks = 1; - const StockpileSettings::BarsBlocksSet bars_blocks = mBuffer.barsblocks(); - DEBUG(log).print("bars_blocks:\n"); + auto & pbarsblocks = mPile->settings.bars_blocks; + read_category("bars_blocks", mode, + std::bind(&StockpileSettings::has_barsblocks, mBuffer), + std::bind(&StockpileSettings::barsblocks, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_bars_blocks, + [&]() { + pbarsblocks.bars_other_mats.clear(); + pbarsblocks.bars_mats.clear(); + pbarsblocks.blocks_other_mats.clear(); + pbarsblocks.blocks_mats.clear(); + }, + [&](bool all, char val) { + auto & bbarsblocks = mBuffer.barsblocks(); - unserialize_list_material( - bars_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_mats(idx); }, - bars_blocks.bars_mats_size(), &mPile->settings.bars_blocks.bars_mats); + unserialize_list_material(all, val, filter, bars_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bbarsblocks.bars_mats(idx); }, + bbarsblocks.bars_mats_size(), pbarsblocks.bars_mats); - unserialize_list_material( - blocks_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_mats(idx); }, - bars_blocks.blocks_mats_size(), &mPile->settings.bars_blocks.blocks_mats); + unserialize_list_material(all, val, filter, + blocks_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_mats(idx); }, + bbarsblocks.blocks_mats_size(), pbarsblocks.blocks_mats); - unserialize_list_other_mats( - mOtherMatsBars.mats, - [=](const size_t& idx) -> const std::string& { return bars_blocks.bars_other_mats(idx); }, - bars_blocks.bars_other_mats_size(), &mPile->settings.bars_blocks.bars_other_mats); + unserialize_list_other_mats(all, val, filter, + mOtherMatsBars.mats, + [&](const size_t& idx) -> const std::string& { return bbarsblocks.bars_other_mats(idx); }, + bbarsblocks.bars_other_mats_size(), pbarsblocks.bars_other_mats); - unserialize_list_other_mats( - mOtherMatsBlocks.mats, - [=](const size_t& idx) -> const std::string& { return bars_blocks.blocks_other_mats(idx); }, - bars_blocks.blocks_other_mats_size(), &mPile->settings.bars_blocks.blocks_other_mats); - } - else { - mPile->settings.flags.bits.bars_blocks = 0; - mPile->settings.bars_blocks.bars_other_mats.clear(); - mPile->settings.bars_blocks.bars_mats.clear(); - mPile->settings.bars_blocks.blocks_other_mats.clear(); - mPile->settings.bars_blocks.blocks_mats.clear(); - } + unserialize_list_other_mats(all, val, filter, + mOtherMatsBlocks.mats, + [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_other_mats(idx); }, + bbarsblocks.blocks_other_mats_size(), pbarsblocks.blocks_other_mats); + }); } bool StockpileSerializer::write_cloth(StockpileSettings::ClothSet* cloth) { bool all = true; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_thread_silk(token); }, + [&](const std::string& token) { cloth->add_thread_silk(token); }, &mPile->settings.cloth.thread_silk, organic_mat_category::Silk) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_thread_plant(token); }, + [&](const std::string& token) { cloth->add_thread_plant(token); }, &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_thread_yarn(token); }, + [&](const std::string& token) { cloth->add_thread_yarn(token); }, &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_thread_metal(token); }, + [&](const std::string& token) { cloth->add_thread_metal(token); }, &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_cloth_silk(token); }, + [&](const std::string& token) { cloth->add_cloth_silk(token); }, &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_cloth_plant(token); }, + [&](const std::string& token) { cloth->add_cloth_plant(token); }, &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_cloth_yarn(token); }, + [&](const std::string& token) { cloth->add_cloth_yarn(token); }, &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn) && all; all = serialize_list_organic_mat( - [=](const std::string& token) { cloth->add_cloth_metal(token); }, + [&](const std::string& token) { cloth->add_cloth_metal(token); }, &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread) && all; return all; } void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_cloth()) { - mPile->settings.flags.bits.cloth = 1; - const StockpileSettings::ClothSet cloth = mBuffer.cloth(); - DEBUG(log).print("cloth:\n"); + auto & pcloth = mPile->settings.cloth; + read_category("cloth", mode, + std::bind(&StockpileSettings::has_cloth, mBuffer), + std::bind(&StockpileSettings::cloth, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_cloth, + [&]() { + pcloth.thread_metal.clear(); + pcloth.thread_plant.clear(); + pcloth.thread_silk.clear(); + pcloth.thread_yarn.clear(); + pcloth.cloth_metal.clear(); + pcloth.cloth_plant.clear(); + pcloth.cloth_silk.clear(); + pcloth.cloth_yarn.clear(); + }, + [&](bool all, char val) { + auto & bcloth = mBuffer.cloth(); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_silk(idx); }, - cloth.thread_silk_size(), &mPile->settings.cloth.thread_silk, organic_mat_category::Silk); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.thread_silk(idx); }, + bcloth.thread_silk_size(), pcloth.thread_silk, organic_mat_category::Silk); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_plant(idx); }, - cloth.thread_plant_size(), &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.thread_plant(idx); }, + bcloth.thread_plant_size(), pcloth.thread_plant, organic_mat_category::PlantFiber); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_yarn(idx); }, - cloth.thread_yarn_size(), &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.thread_yarn(idx); }, + bcloth.thread_yarn_size(), pcloth.thread_yarn, organic_mat_category::Yarn); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.thread_metal(idx); }, - cloth.thread_metal_size(), &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.thread_metal(idx); }, + bcloth.thread_metal_size(), pcloth.thread_metal, organic_mat_category::MetalThread); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_silk(idx); }, - cloth.cloth_silk_size(), &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.cloth_silk(idx); }, + bcloth.cloth_silk_size(), pcloth.cloth_silk, organic_mat_category::Silk); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_plant(idx); }, - cloth.cloth_plant_size(), &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.cloth_plant(idx); }, + bcloth.cloth_plant_size(), pcloth.cloth_plant, organic_mat_category::PlantFiber); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_yarn(idx); }, - cloth.cloth_yarn_size(), &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.cloth_yarn(idx); }, + bcloth.cloth_yarn_size(), pcloth.cloth_yarn, organic_mat_category::Yarn); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return cloth.cloth_metal(idx); }, - cloth.cloth_metal_size(), &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread); - } - else { - mPile->settings.cloth.thread_metal.clear(); - mPile->settings.cloth.thread_plant.clear(); - mPile->settings.cloth.thread_silk.clear(); - mPile->settings.cloth.thread_yarn.clear(); - mPile->settings.cloth.cloth_metal.clear(); - mPile->settings.cloth.cloth_plant.clear(); - mPile->settings.cloth.cloth_silk.clear(); - mPile->settings.cloth.cloth_yarn.clear(); - mPile->settings.flags.bits.cloth = 0; - } + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bcloth.cloth_metal(idx); }, + bcloth.cloth_metal_size(), pcloth.cloth_metal, organic_mat_category::MetalThread); + }); } static bool coins_mat_is_allowed(const MaterialInfo& mi) { @@ -1250,25 +1325,27 @@ static bool coins_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_coins(StockpileSettings::CoinSet* coins) { return serialize_list_material( coins_mat_is_allowed, - [=](const std::string& token) { coins->add_mats(token); }, + [&](const std::string& token) { coins->add_mats(token); }, mPile->settings.coins.mats); } void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_coin()) { - mPile->settings.flags.bits.coins = 1; - const StockpileSettings::CoinSet coins = mBuffer.coin(); - DEBUG(log).print("coins:\n"); + auto & pcoins = mPile->settings.coins; + read_category("coin", mode, + std::bind(&StockpileSettings::has_coin, mBuffer), + std::bind(&StockpileSettings::coin, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_coins, + [&]() { + pcoins.mats.clear(); + }, + [&](bool all, char val) { + auto & bcoin = mBuffer.coin(); - unserialize_list_material( - coins_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return coins.mats(idx); }, - coins.mats_size(), &mPile->settings.coins.mats); - } - else { - mPile->settings.flags.bits.coins = 0; - mPile->settings.coins.mats.clear(); - } + unserialize_list_material(all, val, filter, coins_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bcoin.mats(idx); }, + bcoin.mats_size(), pcoins.mats); + }); } static bool finished_goods_type_is_allowed(item_type::item_type type) { @@ -1311,61 +1388,64 @@ static bool finished_goods_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { bool all = serialize_list_item_type( finished_goods_type_is_allowed, - [=](const std::string& token) { finished_goods->add_type(token); }, + [&](const std::string& token) { finished_goods->add_type(token); }, mPile->settings.finished_goods.type); all = serialize_list_material( finished_goods_mat_is_allowed, - [=](const std::string& token) { finished_goods->add_mats(token); }, + [&](const std::string& token) { finished_goods->add_mats(token); }, mPile->settings.finished_goods.mats) && all; all = serialize_list_other_mats( - mOtherMatsFinishedGoods.mats, [=](const std::string& token) { finished_goods->add_other_mats(token); }, + mOtherMatsFinishedGoods.mats, [&](const std::string& token) { finished_goods->add_other_mats(token); }, mPile->settings.finished_goods.other_mats) && all; - all = serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_core(token); }, + all = serialize_list_quality([&](const std::string& token) { finished_goods->add_quality_core(token); }, mPile->settings.finished_goods.quality_core) && all; - all = serialize_list_quality([=](const std::string& token) { finished_goods->add_quality_total(token); }, + all = serialize_list_quality([&](const std::string& token) { finished_goods->add_quality_total(token); }, mPile->settings.finished_goods.quality_total) && all; return all; } void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_finished_goods()) { - mPile->settings.flags.bits.finished_goods = 1; - const StockpileSettings::FinishedGoodsSet finished_goods = mBuffer.finished_goods(); - DEBUG(log).print("finished_goods:\n"); + auto & pfinished_goods = mPile->settings.finished_goods; + read_category("finished_goods", mode, + std::bind(&StockpileSettings::has_finished_goods, mBuffer), + std::bind(&StockpileSettings::finished_goods, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_finished_goods, + [&]() { + pfinished_goods.type.clear(); + pfinished_goods.other_mats.clear(); + pfinished_goods.mats.clear(); + quality_clear(pfinished_goods.quality_core); + quality_clear(pfinished_goods.quality_total); + }, + [&](bool all, char val) { + auto & bfinished_goods = mBuffer.finished_goods(); - unserialize_list_item_type( - finished_goods_type_is_allowed, - [=](const size_t& idx) -> const std::string& { return finished_goods.type(idx); }, - finished_goods.type_size(), &mPile->settings.finished_goods.type); + unserialize_list_item_type(all, val, filter, finished_goods_type_is_allowed, + [&](const size_t& idx) -> const std::string& { return bfinished_goods.type(idx); }, + bfinished_goods.type_size(), pfinished_goods.type); - unserialize_list_material( - finished_goods_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return finished_goods.mats(idx); }, - finished_goods.mats_size(), &mPile->settings.finished_goods.mats); + unserialize_list_material(all, val, filter, finished_goods_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bfinished_goods.mats(idx); }, + bfinished_goods.mats_size(), pfinished_goods.mats); - unserialize_list_other_mats( - mOtherMatsFinishedGoods.mats, [=](const size_t& idx) -> const std::string& { return finished_goods.other_mats(idx); }, - finished_goods.other_mats_size(), &mPile->settings.finished_goods.other_mats); + unserialize_list_other_mats(all, val, filter, mOtherMatsFinishedGoods.mats, + [&](const size_t& idx) -> const std::string& { return bfinished_goods.other_mats(idx); }, + bfinished_goods.other_mats_size(), pfinished_goods.other_mats); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_core(idx); }, - finished_goods.quality_core_size(), mPile->settings.finished_goods.quality_core); + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bfinished_goods.quality_core(idx); }, + bfinished_goods.quality_core_size(), pfinished_goods.quality_core); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return finished_goods.quality_total(idx); }, - finished_goods.quality_total_size(), mPile->settings.finished_goods.quality_total); - } - else { - mPile->settings.flags.bits.finished_goods = 0; - mPile->settings.finished_goods.type.clear(); - mPile->settings.finished_goods.other_mats.clear(); - mPile->settings.finished_goods.mats.clear(); - quality_clear(mPile->settings.finished_goods.quality_core); - quality_clear(mPile->settings.finished_goods.quality_total); - } + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bfinished_goods.quality_total(idx); }, + bfinished_goods.quality_total_size(), pfinished_goods.quality_total); + }); } food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { @@ -1374,155 +1454,155 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego switch (cat) { case organic_mat_category::Meat: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_meat(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; return food_pair(setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); } case organic_mat_category::Fish: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_fish(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; return food_pair(setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); } case organic_mat_category::UnpreparedFish: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_unprepared_fish(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; return food_pair(setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); } case organic_mat_category::Eggs: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_egg(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; return food_pair(setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); } case organic_mat_category::Plants: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_plants(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; return food_pair(setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); } case organic_mat_category::PlantDrink: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_drink_plant(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; return food_pair(setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); } case organic_mat_category::CreatureDrink: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_drink_animal(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; return food_pair(setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); } case organic_mat_category::PlantCheese: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_cheese_plant(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; return food_pair(setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); } case organic_mat_category::CreatureCheese: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_cheese_animal(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; return food_pair(setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); } case organic_mat_category::Seed: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_seeds(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; return food_pair(setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); } case organic_mat_category::Leaf: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_leaves(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; return food_pair(setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); } case organic_mat_category::PlantPowder: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_powder_plant(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; return food_pair(setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); } case organic_mat_category::CreaturePowder: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_powder_creature(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; return food_pair(setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); } case organic_mat_category::Glob: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_glob(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; return food_pair(setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); } case organic_mat_category::PlantLiquid: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_liquid_plant(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; return food_pair(setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); } case organic_mat_category::CreatureLiquid: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_liquid_animal(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; return food_pair(setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); } case organic_mat_category::MiscLiquid: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_liquid_misc(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; return food_pair(setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); } case organic_mat_category::Paste: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_glob_paste(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; return food_pair(setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); } case organic_mat_category::Pressed: { - FuncWriteExport setter = [=](const std::string& id) { + FuncWriteExport setter = [&](const std::string& id) { mBuffer.mutable_food()->add_glob_pressed(id); }; - FuncReadImport getter = [=](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; + FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; return food_pair(setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); } case organic_mat_category::Leather: @@ -1551,8 +1631,6 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego } bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { - DEBUG(log).print("food:\n"); - auto & pfood = mPile->settings.food; bool all = pfood.prepared_meals; @@ -1574,35 +1652,37 @@ bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { void StockpileSerializer::read_food(DeserializeMode mode, const std::string& filter) { using df::enums::organic_mat_category::organic_mat_category; using traits = df::enum_traits; - if (mBuffer.has_food()) { - mPile->settings.flags.bits.food = 1; - const StockpileSettings::FoodSet food = mBuffer.food(); - DEBUG(log).print("food:\n"); - - if (food.has_prepared_meals()) - mPile->settings.food.prepared_meals = food.prepared_meals(); - else - mPile->settings.food.prepared_meals = true; - - DEBUG(log).print("prepared_meals: %d\n", mPile->settings.food.prepared_meals); - - for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { - food_pair p = food_map((organic_mat_category)mat_category); - if (!p.valid) - continue; - unserialize_list_organic_mat(p.get_value, p.serialized_count, p.stockpile_values, (organic_mat_category)mat_category); - } - } - else { - for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { - food_pair p = food_map((organic_mat_category)mat_category); - if (!p.valid) - continue; - p.stockpile_values->clear(); - } - mPile->settings.flags.bits.food = 0; - mPile->settings.food.prepared_meals = false; - } + + auto & pfood = mPile->settings.food; + read_category("food", mode, + std::bind(&StockpileSettings::has_food, mBuffer), + std::bind(&StockpileSettings::food, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_food, + [&]() { + pfood.prepared_meals = false; + for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { + food_pair p = food_map((organic_mat_category)mat_category); + if (!p.valid) + continue; + p.stockpile_values->clear(); + } + }, + [&](bool all, char val) { + auto & bfood = mBuffer.food(); + + set_elem(all, val, bfood.prepared_meals(), pfood.prepared_meals); + + for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { + food_pair p = food_map((organic_mat_category)mat_category); + if (!p.valid) + continue; + unserialize_list_organic_mat(all, val, filter, + p.get_value, p.serialized_count, *p.stockpile_values, + (organic_mat_category)mat_category); + } + }); + } static bool furniture_mat_is_allowed(const MaterialInfo& mi) { @@ -1627,69 +1707,77 @@ bool StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furni } all = serialize_list_material( furniture_mat_is_allowed, - [=](const std::string& token) { furniture->add_mats(token); }, + [&](const std::string& token) { furniture->add_mats(token); }, pfurniture.mats) && all; all = serialize_list_other_mats( mOtherMatsFurniture.mats, - [=](const std::string& token) { furniture->add_other_mats(token); }, + [&](const std::string& token) { furniture->add_other_mats(token); }, pfurniture.other_mats) && all; all = serialize_list_quality( - [=](const std::string& token) { furniture->add_quality_core(token); }, + [&](const std::string& token) { furniture->add_quality_core(token); }, pfurniture.quality_core) && all; all = serialize_list_quality( - [=](const std::string& token) { furniture->add_quality_total(token); }, + [&](const std::string& token) { furniture->add_quality_total(token); }, pfurniture.quality_total) && all; return all; } void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_furniture()) { - mPile->settings.flags.bits.furniture = 1; - const StockpileSettings::FurnitureSet furniture = mBuffer.furniture(); - DEBUG(log).print("furniture:\n"); - - // type - using df::enums::furniture_type::furniture_type; - df::enum_traits type_traits; - mPile->settings.furniture.type.clear(); - mPile->settings.furniture.type.resize(type_traits.last_item_value + 1, '\0'); - if (furniture.type_size() > 0) { - for (int i = 0; i < furniture.type_size(); ++i) { - const std::string type = furniture.type(i); - df::enum_traits::base_type idx = linear_index(type_traits, type); - DEBUG(log).print("type %d is %s\n", idx, type.c_str()); - if (idx < 0 || size_t(idx) >= mPile->settings.furniture.type.size()) { - WARN(log).print("furniture type index invalid %s, idx=%d\n", type.c_str(), idx); - continue; + auto & pfurniture = mPile->settings.furniture; + read_category("furniture", mode, + std::bind(&StockpileSettings::has_furniture, mBuffer), + std::bind(&StockpileSettings::furniture, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_furniture, + [&]() { + pfurniture.type.clear(); + pfurniture.other_mats.clear(); + pfurniture.mats.clear(); + quality_clear(pfurniture.quality_core); + quality_clear(pfurniture.quality_total); + }, + [&](bool all, char val) { + auto & bfurniture = mBuffer.furniture(); + + using df::enums::furniture_type::furniture_type; + df::enum_traits type_traits; + size_t num_elems = type_traits.last_item_value + 1; + pfurniture.type.resize(num_elems, '\0'); + + if (all) { + for (size_t idx = 0; idx < num_elems; ++idx) { + string id = ENUM_KEY_STR(furniture_type, (df::furniture_type)idx); + set_filter_elem(filter, val, id, idx, pfurniture.type.at(idx)); + } + } else { + for (int i = 0; i < bfurniture.type_size(); ++i) { + const std::string token = bfurniture.type(i); + df::enum_traits::base_type idx = linear_index(type_traits, token); + if (idx < 0 || size_t(idx) >= pfurniture.type.size()) { + WARN(log).print("furniture type index invalid %s, idx=%d\n", token.c_str(), idx); + continue; + } + set_filter_elem(filter, val, token, idx, pfurniture.type.at(idx)); } - mPile->settings.furniture.type.at(idx) = 1; } - } - unserialize_list_material( - furniture_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return furniture.mats(idx); }, - furniture.mats_size(), &mPile->settings.furniture.mats); + unserialize_list_material(all, val, filter, furniture_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bfurniture.mats(idx); }, + bfurniture.mats_size(), pfurniture.mats); - unserialize_list_other_mats( - mOtherMatsFurniture.mats, [=](const size_t& idx) -> const std::string& { return furniture.other_mats(idx); }, - furniture.other_mats_size(), &mPile->settings.furniture.other_mats); + unserialize_list_other_mats(all, val, filter, + mOtherMatsFurniture.mats, [&](const size_t& idx) -> const std::string& { return bfurniture.other_mats(idx); }, + bfurniture.other_mats_size(), pfurniture.other_mats); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_core(idx); }, - furniture.quality_core_size(), mPile->settings.furniture.quality_core); + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bfurniture.quality_core(idx); }, + bfurniture.quality_core_size(), pfurniture.quality_core); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return furniture.quality_total(idx); }, - furniture.quality_total_size(), mPile->settings.furniture.quality_total); - } - else { - mPile->settings.flags.bits.furniture = 0; - mPile->settings.furniture.type.clear(); - mPile->settings.furniture.other_mats.clear(); - mPile->settings.furniture.mats.clear(); - quality_clear(mPile->settings.furniture.quality_core); - quality_clear(mPile->settings.furniture.quality_total); - } + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bfurniture.quality_total(idx); }, + bfurniture.quality_total_size(), pfurniture.quality_total); + }); } static bool gem_mat_is_allowed(const MaterialInfo& mi) { @@ -1711,12 +1799,12 @@ bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { bool all = serialize_list_material( gem_mat_is_allowed, - [=](const std::string& token) { gems->add_rough_mats(token); }, + [&](const std::string& token) { gems->add_rough_mats(token); }, pgems.rough_mats); all = serialize_list_material( gem_cut_mat_is_allowed, - [=](const std::string& token) { gems->add_cut_mats(token); }, + [&](const std::string& token) { gems->add_cut_mats(token); }, pgems.cut_mats) && all; for (size_t i = 0; i < pgems.rough_other_mats.size(); ++i) { @@ -1749,121 +1837,108 @@ bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { } void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_gems()) { - mPile->settings.flags.bits.gems = 1; - const StockpileSettings::GemsSet gems = mBuffer.gems(); - DEBUG(log).print("gems:\n"); - - unserialize_list_material( - gem_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return gems.rough_mats(idx); }, - gems.rough_mats_size(), &mPile->settings.gems.rough_mats); - - unserialize_list_material( - gem_cut_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return gems.cut_mats(idx); }, - gems.cut_mats_size(), &mPile->settings.gems.cut_mats); - - const size_t builtin_size = std::extentraws.mat_table.builtin)>::value; - // rough other - mPile->settings.gems.rough_other_mats.clear(); - mPile->settings.gems.rough_other_mats.resize(builtin_size, '\0'); - for (int i = 0; i < gems.rough_other_mats_size(); ++i) { - const std::string token = gems.rough_other_mats(i); - MaterialInfo mi; - mi.find(token); - if (!mi.isValid() || size_t(mi.type) >= builtin_size) { - WARN(log).print("invalid gem mat %s idx=%d\n", token.c_str(), mi.type); - continue; - } - DEBUG(log).print("rough_other mats %d is %s\n", mi.type, token.c_str()); - mPile->settings.gems.rough_other_mats.at(mi.type) = 1; - } - - // cut other - mPile->settings.gems.cut_other_mats.clear(); - mPile->settings.gems.cut_other_mats.resize(builtin_size, '\0'); - for (int i = 0; i < gems.cut_other_mats_size(); ++i) { - const std::string token = gems.cut_other_mats(i); - MaterialInfo mi; - mi.find(token); - if (!mi.isValid() || size_t(mi.type) >= builtin_size) { - WARN(log).print("invalid gem mat %s idx=%d\n", token.c_str(), mi.type); - continue; + auto & pgems = mPile->settings.gems; + read_category("gems", mode, + std::bind(&StockpileSettings::has_gems, mBuffer), + std::bind(&StockpileSettings::gems, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_gems, + [&]() { + pgems.cut_other_mats.clear(); + pgems.cut_mats.clear(); + pgems.rough_other_mats.clear(); + pgems.rough_mats.clear(); + }, + [&](bool all, char val) { + auto & bgems = mBuffer.gems(); + + unserialize_list_material(all, val, filter, gem_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bgems.rough_mats(idx); }, + bgems.rough_mats_size(),pgems.rough_mats); + + unserialize_list_material(all, val, filter, gem_cut_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bgems.cut_mats(idx); }, + bgems.cut_mats_size(), pgems.cut_mats); + + const size_t builtin_size = std::extentraws.mat_table.builtin)>::value; + pgems.rough_other_mats.resize(builtin_size, '\0'); + pgems.cut_other_mats.resize(builtin_size, '\0'); + if (all) { + for (size_t idx = 0; idx < builtin_size; ++idx) { + MaterialInfo mi; + mi.decode(0, idx); + set_filter_elem(filter, val, mi.toString(), idx, pgems.rough_other_mats.at(idx)); + set_filter_elem(filter, val, mi.toString(), idx, pgems.cut_other_mats.at(idx)); + } + return; + } else { + MaterialInfo mi; + for (size_t i = 0; i < builtin_size; ++i) { + string id = bgems.rough_other_mats(i); + if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) + set_filter_elem(filter, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); + id = bgems.cut_other_mats(i); + if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) + set_filter_elem(filter, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); + } } - DEBUG(log).print("cut_other mats %d is %s\n", mi.type, token.c_str()); - mPile->settings.gems.cut_other_mats.at(mi.type) = 1; - } - } - else { - mPile->settings.flags.bits.gems = 0; - mPile->settings.gems.cut_other_mats.clear(); - mPile->settings.gems.cut_mats.clear(); - mPile->settings.gems.rough_other_mats.clear(); - mPile->settings.gems.rough_mats.clear(); - } + }); } bool StockpileSerializer::write_leather(StockpileSettings::LeatherSet* leather) { return serialize_list_organic_mat( - [=](const std::string& id) { leather->add_mats(id); }, + [&](const std::string& id) { leather->add_mats(id); }, &mPile->settings.leather.mats, organic_mat_category::Leather); } void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_leather()) { - mPile->settings.flags.bits.leather = 1; - const StockpileSettings::LeatherSet leather = mBuffer.leather(); - DEBUG(log).print("leather:\n"); + auto & pleather = mPile->settings.leather; + read_category("leather", mode, + std::bind(&StockpileSettings::has_leather, mBuffer), + std::bind(&StockpileSettings::leather, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_leather, + [&]() { + pleather.mats.clear(); + }, + [&](bool all, char val) { + auto & bleather = mBuffer.leather(); - unserialize_list_organic_mat([=](size_t idx) -> std::string { return leather.mats(idx); }, - leather.mats_size(), &mPile->settings.leather.mats, organic_mat_category::Leather); - } - else { - mPile->settings.flags.bits.leather = 0; - mPile->settings.leather.mats.clear(); - } + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bleather.mats(idx); }, + bleather.mats_size(), pleather.mats, organic_mat_category::Leather); + }); } bool StockpileSerializer::write_corpses(StockpileSettings::CorpsesSet* corpses) { - bool all = true; - - return all; + return serialize_list_creature( + [&](const std::string& token) { corpses->add_corpses(token); }, + mPile->settings.corpses.corpses); } void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& filter) { - -} - -static bool refuse_creature_is_allowed(const df::creature_raw* raw) { - if (!raw) - return false; - // wagon and generated creatures not allowed, except angels - const bool is_wagon = raw->creature_id == "EQUIPMENT_WAGON"; - const bool is_generated = raw->flags.is_set(creature_raw_flags::GENERATED); - const bool is_angel = is_generated && raw->creature_id.find("DIVINE_") != std::string::npos; - return !is_wagon && !(is_generated && !is_angel); -} - -static bool refuse_write_helper(std::function add_value, const vector& list) { - bool all = true; - for (size_t i = 0; i < list.size(); ++i) { - if (!list.at(i)) { - all = false; - continue; - } - df::creature_raw* r = find_creature(i); - // skip forgotten beasts, titans, demons, and night creatures - if (!refuse_creature_is_allowed(r)) - continue; - DEBUG(log).print("creature %s %zd\n", r->creature_id.c_str(), i); - add_value(r->creature_id); - } - return all; + auto & pcorpses = mPile->settings.corpses; + read_category("corpses", mode, + std::bind(&StockpileSettings::has_corpses_v50, mBuffer), + std::bind(&StockpileSettings::corpses_v50, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_corpses, + [&]() { + pcorpses.corpses.clear(); + }, + [&](bool all, char val) { + auto & bcorpses = mBuffer.corpses_v50(); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bcorpses.corpses(idx); }, + bcorpses.corpses_size(), pcorpses.corpses); + }); } static bool refuse_type_is_allowed(item_type::item_type type) { - if (type == item_type::NONE || type == item_type::BAR || type == item_type::SMALLGEM || type == item_type::BLOCKS || type == item_type::ROUGH || type == item_type::BOULDER || type == item_type::CORPSE || type == item_type::CORPSEPIECE || type == item_type::ROCK || type == item_type::ORTHOPEDIC_CAST) + if (type == item_type::NONE || type == item_type::BAR || type == item_type::SMALLGEM + || type == item_type::BLOCKS || type == item_type::ROUGH || type == item_type::BOULDER + || type == item_type::CORPSE || type == item_type::CORPSEPIECE || type == item_type::ROCK + || type == item_type::ORTHOPEDIC_CAST) return false; return true; } @@ -1872,128 +1947,133 @@ bool StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { auto & prefuse = mPile->settings.refuse; bool all = prefuse.fresh_raw_hide && prefuse.rotten_raw_hide; - DEBUG(log).print("refuse:\n"); refuse->set_fresh_raw_hide(prefuse.fresh_raw_hide); refuse->set_rotten_raw_hide(prefuse.rotten_raw_hide); - DEBUG(log).print("getting types\n"); - all = serialize_list_item_type( - refuse_type_is_allowed, - [=](const std::string& token) { - DEBUG(log).print("adding type: %s\n", token.c_str()); - refuse->add_type(token); - }, + all = serialize_list_item_type(refuse_type_is_allowed, + [&](const std::string& token) { refuse->add_type(token); }, prefuse.type) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_corpses(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_corpses(token); }, prefuse.corpses) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_body_parts(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_body_parts(token); }, prefuse.body_parts) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_skulls(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_skulls(token); }, prefuse.skulls) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_bones(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_bones(token); }, prefuse.bones) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_hair(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_hair(token); }, prefuse.hair) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_shells(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_shells(token); }, prefuse.shells) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_teeth(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_teeth(token); }, prefuse.teeth) && all; - all = refuse_write_helper([=](const std::string& id) { refuse->add_horns(id); }, + all = serialize_list_creature( + [&](const std::string& token) { refuse->add_horns(token); }, prefuse.horns) && all; return all; } -static void refuse_read_helper(std::function get_value, size_t list_size, std::vector* pile_list) { - pile_list->clear(); - pile_list->resize(world->raws.creatures.all.size(), '\0'); - if (list_size > 0) { - for (size_t i = 0; i < list_size; ++i) { - const std::string creature_id = get_value(i); - const int idx = find_creature(creature_id); - const df::creature_raw* creature = find_creature(idx); - if (idx < 0 || !refuse_creature_is_allowed(creature) || size_t(idx) >= pile_list->size()) { - WARN(log).print("invalid refuse creature %s, idx=%d\n", creature_id.c_str(), idx); - continue; - } - DEBUG(log).print("creature %d is %s\n", idx, creature_id.c_str()); - pile_list->at(idx) = 1; - } - } -} - void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_refuse()) { - mPile->settings.flags.bits.refuse = 1; - const StockpileSettings::RefuseSet refuse = mBuffer.refuse(); - DEBUG(log).print("refuse:\n"); - DEBUG(log).print(" fresh hide %d\n", refuse.fresh_raw_hide()); - DEBUG(log).print(" rotten hide %d\n", refuse.rotten_raw_hide()); - mPile->settings.refuse.fresh_raw_hide = refuse.fresh_raw_hide(); - mPile->settings.refuse.rotten_raw_hide = refuse.rotten_raw_hide(); - - unserialize_list_item_type( - refuse_type_is_allowed, - [=](const size_t& idx) -> const std::string& { return refuse.type(idx); }, - refuse.type_size(), &mPile->settings.refuse.type); - - DEBUG(log).print(" corpses\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.corpses(idx); }, - refuse.corpses_size(), &mPile->settings.refuse.corpses); - - DEBUG(log).print(" body_parts\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.body_parts(idx); }, - refuse.body_parts_size(), &mPile->settings.refuse.body_parts); - - DEBUG(log).print(" skulls\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.skulls(idx); }, - refuse.skulls_size(), &mPile->settings.refuse.skulls); - - DEBUG(log).print(" bones\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.bones(idx); }, - refuse.bones_size(), &mPile->settings.refuse.bones); - - DEBUG(log).print(" hair\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.hair(idx); }, - refuse.hair_size(), &mPile->settings.refuse.hair); - - DEBUG(log).print(" shells\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.shells(idx); }, - refuse.shells_size(), &mPile->settings.refuse.shells); - - DEBUG(log).print(" teeth\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.teeth(idx); }, - refuse.teeth_size(), &mPile->settings.refuse.teeth); - - DEBUG(log).print(" horns\n"); - refuse_read_helper([=](const size_t& idx) -> const std::string& { return refuse.horns(idx); }, - refuse.horns_size(), &mPile->settings.refuse.horns); - } - else { - mPile->settings.flags.bits.refuse = 0; - mPile->settings.refuse.type.clear(); - mPile->settings.refuse.corpses.clear(); - mPile->settings.refuse.body_parts.clear(); - mPile->settings.refuse.skulls.clear(); - mPile->settings.refuse.bones.clear(); - mPile->settings.refuse.hair.clear(); - mPile->settings.refuse.shells.clear(); - mPile->settings.refuse.teeth.clear(); - mPile->settings.refuse.horns.clear(); - mPile->settings.refuse.fresh_raw_hide = false; - mPile->settings.refuse.rotten_raw_hide = false; - } + auto & prefuse = mPile->settings.refuse; + read_category("refuse", mode, + std::bind(&StockpileSettings::has_refuse, mBuffer), + std::bind(&StockpileSettings::refuse, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_refuse, + [&]() { + prefuse.fresh_raw_hide = false; + prefuse.rotten_raw_hide = false; + prefuse.type.clear(); + prefuse.corpses.clear(); + prefuse.body_parts.clear(); + prefuse.skulls.clear(); + prefuse.bones.clear(); + prefuse.hair.clear(); + prefuse.shells.clear(); + prefuse.teeth.clear(); + prefuse.horns.clear(); + }, + [&](bool all, char val) { + auto & brefuse = mBuffer.refuse(); + + set_elem(all, val, brefuse.fresh_raw_hide(), prefuse.fresh_raw_hide); + set_elem(all, val, brefuse.rotten_raw_hide(), prefuse.rotten_raw_hide); + + unserialize_list_item_type(all, val, filter, refuse_type_is_allowed, + [&](const size_t& idx) -> const string& { return brefuse.type(idx); }, + brefuse.type_size(), prefuse.type); + + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.corpses(idx); }, + brefuse.corpses_size(), prefuse.corpses); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.body_parts(idx); }, + brefuse.body_parts_size(), prefuse.body_parts); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.skulls(idx); }, + brefuse.skulls_size(), prefuse.skulls); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.bones(idx); }, + brefuse.bones_size(), prefuse.bones); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.hair(idx); }, + brefuse.hair_size(), prefuse.hair); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.shells(idx); }, + brefuse.shells_size(), prefuse.shells); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.teeth(idx); }, + brefuse.teeth_size(), prefuse.teeth); + unserialize_list_creature(all, val, filter, + [&](const size_t& idx) -> const string& { return brefuse.horns(idx); }, + brefuse.horns_size(), prefuse.horns); + }); + } bool StockpileSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { - bool all = true; + bool all = serialize_list_organic_mat( + [&](const std::string& token) { sheet->add_paper(token); }, + &mPile->settings.sheet.paper, organic_mat_category::Paper); + + all = serialize_list_organic_mat( + [&](const std::string& token) { sheet->add_parchment(token); }, + &mPile->settings.sheet.parchment, organic_mat_category::Parchment) && all; return all; } void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& filter) { + auto & psheet = mPile->settings.sheet; + read_category("sheet", mode, + std::bind(&StockpileSettings::has_sheet, mBuffer), + std::bind(&StockpileSettings::sheet, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_sheet, + [&]() { + psheet.paper.clear(); + psheet.parchment.clear(); + }, + [&](bool all, char val) { + auto & bsheet = mBuffer.sheet(); + + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bsheet.paper(idx); }, + bsheet.paper_size(), psheet.paper, organic_mat_category::Paper); + unserialize_list_organic_mat(all, val, filter, + [&](size_t idx) -> std::string { return bsheet.parchment(idx); }, + bsheet.parchment_size(), psheet.parchment, organic_mat_category::Parchment); + }); } static bool stone_is_allowed(const MaterialInfo& mi) { @@ -2007,25 +2087,27 @@ static bool stone_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_stone(StockpileSettings::StoneSet* stone) { return serialize_list_material( stone_is_allowed, - [=](const std::string& token) { stone->add_mats(token); }, + [&](const std::string& token) { stone->add_mats(token); }, mPile->settings.stone.mats); } void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_stone()) { - mPile->settings.flags.bits.stone = 1; - const StockpileSettings::StoneSet stone = mBuffer.stone(); - DEBUG(log).print("stone:\n"); + auto & pstone = mPile->settings.stone; + read_category("stone", mode, + std::bind(&StockpileSettings::has_stone, mBuffer), + std::bind(&StockpileSettings::stone, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_stone, + [&]() { + pstone.mats.clear(); + }, + [&](bool all, char val) { + auto & bstone = mBuffer.stone(); - unserialize_list_material( - stone_is_allowed, - [=](const size_t& idx) -> const std::string& { return stone.mats(idx); }, - stone.mats_size(), &mPile->settings.stone.mats); - } - else { - mPile->settings.flags.bits.stone = 0; - mPile->settings.stone.mats.clear(); - } + unserialize_list_material(all, val, filter, stone_is_allowed, + [&](const size_t& idx) -> const std::string& { return bstone.mats(idx); }, + bstone.mats_size(), pstone.mats); + }); } static bool weapons_mat_is_allowed(const MaterialInfo& mi) { @@ -2040,81 +2122,83 @@ bool StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) weapons->set_usable(pweapons.usable); all = serialize_list_itemdef( - [=](const std::string& token) { weapons->add_weapon_type(token); }, + [&](const std::string& token) { weapons->add_weapon_type(token); }, pweapons.weapon_type, std::vector(world->raws.itemdefs.weapons.begin(), world->raws.itemdefs.weapons.end()), item_type::WEAPON) && all; all = serialize_list_itemdef( - [=](const std::string& token) { weapons->add_trapcomp_type(token); }, + [&](const std::string& token) { weapons->add_trapcomp_type(token); }, pweapons.trapcomp_type, std::vector(world->raws.itemdefs.trapcomps.begin(), world->raws.itemdefs.trapcomps.end()), item_type::TRAPCOMP) && all; all = serialize_list_material( weapons_mat_is_allowed, - [=](const std::string& token) { weapons->add_mats(token); }, + [&](const std::string& token) { weapons->add_mats(token); }, pweapons.mats) && all; all = serialize_list_other_mats( mOtherMatsWeaponsArmor.mats, - [=](const std::string& token) { weapons->add_other_mats(token); }, + [&](const std::string& token) { weapons->add_other_mats(token); }, pweapons.other_mats) && all; all = serialize_list_quality( - [=](const std::string& token) { weapons->add_quality_core(token); }, + [&](const std::string& token) { weapons->add_quality_core(token); }, pweapons.quality_core) && all; all = serialize_list_quality( - [=](const std::string& token) { weapons->add_quality_total(token); }, + [&](const std::string& token) { weapons->add_quality_total(token); }, pweapons.quality_total) && all; return all; } void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_weapons()) { - mPile->settings.flags.bits.weapons = 1; - const StockpileSettings::WeaponsSet weapons = mBuffer.weapons(); - DEBUG(log).print("weapons: \n"); + auto & pweapons = mPile->settings.weapons; + read_category("weapons", mode, + std::bind(&StockpileSettings::has_weapons, mBuffer), + std::bind(&StockpileSettings::weapons, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_weapons, + [&]() { + pweapons.weapon_type.clear(); + pweapons.trapcomp_type.clear(); + pweapons.other_mats.clear(); + pweapons.mats.clear(); + quality_clear(pweapons.quality_core); + quality_clear(pweapons.quality_total); + }, + [&](bool all, char val) { + auto & bweapons = mBuffer.weapons(); - bool unusable = weapons.unusable(); - bool usable = weapons.usable(); - DEBUG(log).print("unusable %d\n", unusable); - DEBUG(log).print("usable %d\n", usable); - mPile->settings.weapons.unusable = unusable; - mPile->settings.weapons.usable = usable; + set_elem(all, val, bweapons.unusable(), pweapons.unusable); + set_elem(all, val, bweapons.usable(), pweapons.usable); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return weapons.weapon_type(idx); }, - weapons.weapon_type_size(), &mPile->settings.weapons.weapon_type, item_type::WEAPON); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bweapons.weapon_type(idx); }, + bweapons.weapon_type_size(), pweapons.weapon_type, item_type::WEAPON); - unserialize_list_itemdef([=](const size_t& idx) -> const std::string& { return weapons.trapcomp_type(idx); }, - weapons.trapcomp_type_size(), &mPile->settings.weapons.trapcomp_type, item_type::TRAPCOMP); + unserialize_list_itemdef(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bweapons.trapcomp_type(idx); }, + bweapons.trapcomp_type_size(), pweapons.trapcomp_type, item_type::TRAPCOMP); - unserialize_list_material( - weapons_mat_is_allowed, - [=](const size_t& idx) -> const std::string& { return weapons.mats(idx); }, - weapons.mats_size(), &mPile->settings.weapons.mats); + unserialize_list_material(all, val, filter, weapons_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bweapons.mats(idx); }, + bweapons.mats_size(), pweapons.mats); - unserialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [=](const size_t& idx) -> const std::string& { return weapons.other_mats(idx); }, - weapons.other_mats_size(), &mPile->settings.weapons.other_mats); + unserialize_list_other_mats(all, val, filter, mOtherMatsWeaponsArmor.mats, + [&](const size_t& idx) -> const std::string& { return bweapons.other_mats(idx); }, + bweapons.other_mats_size(), pweapons.other_mats); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return weapons.quality_core(idx); }, - weapons.quality_core_size(), mPile->settings.weapons.quality_core); + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bweapons.quality_core(idx); }, + bweapons.quality_core_size(), pweapons.quality_core); - unserialize_list_quality([=](const size_t& idx) -> const std::string& { return weapons.quality_total(idx); }, - weapons.quality_total_size(), mPile->settings.weapons.quality_total); - } - else { - mPile->settings.flags.bits.weapons = 0; - mPile->settings.weapons.weapon_type.clear(); - mPile->settings.weapons.trapcomp_type.clear(); - mPile->settings.weapons.other_mats.clear(); - mPile->settings.weapons.mats.clear(); - quality_clear(mPile->settings.weapons.quality_core); - quality_clear(mPile->settings.weapons.quality_total); - } + unserialize_list_quality(all, val, filter, + [&](const size_t& idx) -> const std::string& { return bweapons.quality_total(idx); }, + bweapons.quality_total_size(), pweapons.quality_total); + }); } static bool wood_mat_is_allowed(const df::plant_raw* plant) { @@ -2138,26 +2222,36 @@ bool StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { } void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& filter) { - if (mBuffer.has_wood()) { - mPile->settings.flags.bits.wood = 1; - const StockpileSettings::WoodSet wood = mBuffer.wood(); - DEBUG(log).print("wood: \n"); - - mPile->settings.wood.mats.clear(); - mPile->settings.wood.mats.resize(world->raws.plants.all.size(), '\0'); - for (int i = 0; i < wood.mats_size(); ++i) { - const std::string token = wood.mats(i); - const size_t idx = find_plant(token); - if (idx < 0 || idx >= mPile->settings.wood.mats.size()) { - WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); - continue; + auto & pwood = mPile->settings.wood; + read_category("wood", mode, + std::bind(&StockpileSettings::has_wood, mBuffer), + std::bind(&StockpileSettings::wood, mBuffer), + mPile->settings.flags.whole, + mPile->settings.flags.mask_wood, + [&]() { + pwood.mats.clear(); + }, + [&](bool all, char val) { + auto & bwood = mBuffer.wood(); + + size_t num_elems = world->raws.plants.all.size(); + pwood.mats.resize(num_elems, '\0'); + + if (all) { + for (size_t idx = 0; idx < num_elems; ++idx) { + string id = world->raws.plants.all[idx]->id; + set_filter_elem(filter, val, id, idx, pwood.mats.at(idx)); + } + } else { + for (int i = 0; i < bwood.mats_size(); ++i) { + const std::string token = bwood.mats(i); + const size_t idx = find_plant(token); + if (idx < 0 || (size_t)idx >= num_elems) { + WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); + continue; + } + set_filter_elem(filter, val, token, idx, pwood.mats.at(idx)); + } } - DEBUG(log).print("plant %zd is %s\n", idx, token.c_str()); - mPile->settings.wood.mats.at(idx) = 1; - } - } - else { - mPile->settings.flags.bits.wood = 0; - mPile->settings.wood.mats.clear(); - } + }); } diff --git a/plugins/stockpiles/proto/stockpiles.proto b/plugins/stockpiles/proto/stockpiles.proto index 66815335b..681e7d927 100644 --- a/plugins/stockpiles/proto/stockpiles.proto +++ b/plugins/stockpiles/proto/stockpiles.proto @@ -148,9 +148,12 @@ message StockpileSettings { } message CorpsesSet { optional bool all = 1; + repeated string corpses = 2; } message SheetSet { optional bool all = 1; + repeated string paper = 2; + repeated string parchment = 3; } // general settings From f13df882b6f06978cd9c8c05b29ab3ecd1269fe0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 15:41:34 -0700 Subject: [PATCH 098/439] properly filter when setting gems --- plugins/stockpiles/StockpileSerializer.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 1ce6b65b1..04b046a3e 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1866,9 +1866,13 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil if (all) { for (size_t idx = 0; idx < builtin_size; ++idx) { MaterialInfo mi; - mi.decode(0, idx); - set_filter_elem(filter, val, mi.toString(), idx, pgems.rough_other_mats.at(idx)); - set_filter_elem(filter, val, mi.toString(), idx, pgems.cut_other_mats.at(idx)); + mi.decode(idx, -1); + if (gem_other_mat_is_allowed(mi)) + set_filter_elem(filter, val, mi.getToken(), idx, pgems.rough_other_mats.at(idx)); + if (!mi.isValid()) + mi.decode(0, idx); + if (gem_other_mat_is_allowed(mi)) + set_filter_elem(filter, val, mi.getToken(), idx, pgems.cut_other_mats.at(idx)); } return; } else { From 284d80b0765fd8937bb746564b4137f3e54c93f7 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 15:45:07 -0700 Subject: [PATCH 099/439] rename some leftover categories --- ...iege_ammo.dfstock => category_furniture.dfstock} | Bin ...tegory_sheet.dfstock => category_sheets.dfstock} | Bin ..._components.dfstock => category_weapons.dfstock} | Bin .../{woodprefix.dfstock => category_wood.dfstock} | Bin 4 files changed, 0 insertions(+), 0 deletions(-) rename data/stockpiles/{category_furniture_siege_ammo.dfstock => category_furniture.dfstock} (100%) rename data/stockpiles/{category_sheet.dfstock => category_sheets.dfstock} (100%) rename data/stockpiles/{category_weapons_trap_components.dfstock => category_weapons.dfstock} (100%) rename data/stockpiles/{woodprefix.dfstock => category_wood.dfstock} (100%) diff --git a/data/stockpiles/category_furniture_siege_ammo.dfstock b/data/stockpiles/category_furniture.dfstock similarity index 100% rename from data/stockpiles/category_furniture_siege_ammo.dfstock rename to data/stockpiles/category_furniture.dfstock diff --git a/data/stockpiles/category_sheet.dfstock b/data/stockpiles/category_sheets.dfstock similarity index 100% rename from data/stockpiles/category_sheet.dfstock rename to data/stockpiles/category_sheets.dfstock diff --git a/data/stockpiles/category_weapons_trap_components.dfstock b/data/stockpiles/category_weapons.dfstock similarity index 100% rename from data/stockpiles/category_weapons_trap_components.dfstock rename to data/stockpiles/category_weapons.dfstock diff --git a/data/stockpiles/woodprefix.dfstock b/data/stockpiles/category_wood.dfstock similarity index 100% rename from data/stockpiles/woodprefix.dfstock rename to data/stockpiles/category_wood.dfstock From c2a7de232e15edd1c83bd1dfd39f7a73d1ba1acd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 15:45:29 -0700 Subject: [PATCH 100/439] use new "all" format categories --- data/stockpiles/category_ammo.dfstock | Bin 1015 -> 4 bytes data/stockpiles/category_animals.dfstock | 71 +- data/stockpiles/category_armor.dfstock | Bin 2040 -> 5 bytes data/stockpiles/category_bars_blocks.dfstock | Bin 3450 -> 4 bytes data/stockpiles/category_cloth.dfstock | 142 +- data/stockpiles/category_coins.dfstock | Bin 7467 -> 4 bytes data/stockpiles/category_corpses.dfstock | Bin 21 -> 5 bytes .../category_finished_goods.dfstock | Bin 5995 -> 4 bytes data/stockpiles/category_food.dfstock | 18620 +--------------- data/stockpiles/category_furniture.dfstock | Bin 3259 -> 4 bytes data/stockpiles/category_gems.dfstock | Bin 7728 -> 4 bytes data/stockpiles/category_leather.dfstock | 1364 +- data/stockpiles/category_refuse.dfstock | 584 +- data/stockpiles/category_sheets.dfstock | Bin 21 -> 5 bytes data/stockpiles/category_stone.dfstock | Bin 1832 -> 4 bytes data/stockpiles/category_weapons.dfstock | Bin 3838 -> 5 bytes data/stockpiles/category_wood.dfstock | Bin 674 -> 4 bytes 17 files changed, 5 insertions(+), 20776 deletions(-) diff --git a/data/stockpiles/category_ammo.dfstock b/data/stockpiles/category_ammo.dfstock index 744b76cb4ad5dddc46b0881fb390fbf943f0d263..55a20e7e65d1873e449810e03d7e7ce96f9141dd 100644 GIT binary patch literal 4 LcmZ=_GGGJ%0doL$ literal 1015 zcmZvZK~LK-6vt}`iLQukbS-o_=9pWB5Q3YXxUI!YT-k0TxI_`8QlzM$ES1K$*l|aW z969c|Z?dm4Q)umy-0Yv9f6xDC@^8P>!(qrTnWACxx=IKKB|H5O6br#)*%^Gm1b7@^ zp=5V2<~-=`5gt+JGmE$wY|9OceESa3 zU2drJ#dwLpQrbW&svTWZF=gXq{W_ZgRxFx@b{z%kE1}t;xvPtuzS&M`tf)vvOlLo- zVI|lIsMD(*0KT?E0mXsc7{e@FKgLqNjUuT}jW7T`>F=hA4lIC0<4y6gIU<1ltK@xX z-wYRA(q#QZM+Oom!7vT++{016%!|$d{W2}wPht9_%F4y6aND@7@5gU(KAMGYy5@KZ-kyu P>lqDRQ0otB{Y9<+l)4>` diff --git a/data/stockpiles/category_animals.dfstock b/data/stockpiles/category_animals.dfstock index e09193a2f..9796e4535 100644 --- a/data/stockpiles/category_animals.dfstock +++ b/data/stockpiles/category_animals.dfstock @@ -1,71 +1,2 @@ -™÷TOADTOAD_MAN -GIANT_TOADWORMWORM_MAN BIRD_BLUEJAY BLUEJAY_MAN GIANT_BLUEJAY BIRD_CARDINAL CARDINAL_MANGIANT_CARDINAL BIRD_GRACKLE GRACKLE_MAN GIANT_GRACKLE BIRD_ORIOLE -ORIOLE_MAN GIANT_ORIOLEBIRD_RW_BLACKBIRDRW_BLACKBIRD_MANGIANT_RW_BLACKBIRD BIRD_PENGUINBIRD_PENGUIN_LITTLEBIRD_PENGUIN_EMPEROR PENGUIN MANBIRD_PENGUIN_GIANTBIRD_FALCON_PEREGRINEPEREGRINE FALCON MANGIANT PEREGRINE FALCON BIRD_KIWIKIWI MANBIRD_KIWI_GIANT BIRD_OSTRICH OSTRICH MANBIRD_OSTRICH_GIANT BIRD_CROWCROW_MAN -GIANT_CROW -BIRD_RAVEN RAVEN_MAN GIANT_RAVENBIRD_CASSOWARY CASSOWARY_MANGIANT_CASSOWARYBIRD_KEAKEA_MAN GIANT_KEABIRD_OWL_SNOWY SNOWY_OWL_MANGIANT_SNOWY_OWLSPARROW SPARROW_MAN GIANT_SPARROWBIRD_STORK_WHITEWHITE_STORK_MANGIANT_WHITE_STORK BIRD_LOONLOON_MAN -GIANT_LOON BIRD_OWL_BARN BARN_OWL_MANGIANT_BARN_OWL BIRD_PARAKEET PARAKEET_MANGIANT_PARAKEET BIRD_KAKAPO -KAKAPO_MAN GIANT_KAKAPOBIRD_PARROT_GREYGREY_PARROT_MANGIANT_GREY_PARROT BIRD_PUFFIN -PUFFIN_MAN GIANT_PUFFIN BIRD_SWANSWAN_MAN -GIANT_SWAN BIRD_LORIKEET LORIKEET_MANGIANT_LORIKEET BIRD_WRENWREN_MAN -GIANT_WREN BIRD_OSPREY -OSPREY_MAN GIANT_OSPREYBIRD_EMUEMU_MAN GIANT_EMUBIRD_COCKATIEL COCKATIEL_MANGIANT_COCKATIELBIRD_LOVEBIRD_PEACH-FACEDPEACH-FACED_LOVEBIRD_MANGIANT_PEACH-FACED_LOVEBIRD BIRD_MAGPIE -MAGPIE_MAN GIANT_MAGPIE BIRD_KESTREL KESTREL_MAN GIANT_KESTRELBIRD_ALBATROSS ALBATROSS_MANGIANT_ALBATROSSBIRD_OWL_GREAT_HORNEDGREAT_HORNED_OWL_MANGIANT_GREAT_HORNED_OWL -BIRD_EAGLE EAGLE_MAN GIANT_EAGLE BIRD_HORNBILL HORNBILL_MANGIANT_HORNBILLBIRD_LOVEBIRD_MASKEDMASKED_LOVEBIRD_MANGIANT_MASKED_LOVEBIRD BIRD_BUSHTIT BUSHTIT_MAN GIANT_BUSHTIT DAMSELFLY DAMSELFLY_MANGIANT_DAMSELFLYMOTHMOTH_MAN -GIANT_MOTH GRASSHOPPERGRASSHOPPER_MANGIANT_GRASSHOPPER BARK_SCORPIONBARK_SCORPION_MANGIANT_BARK_SCORPIONMANTIS -MANTIS_MAN GIANT_MANTISTICKTICK_MAN -GIANT_TICKLOUSE LOUSE_MAN GIANT_LOUSETHRIPS -THRIPS_MAN GIANT_THRIPSSLUGSLUG_MAN -GIANT_SLUGMOSQUITO MOSQUITO_MANGIANT_MOSQUITOSPIDER_JUMPINGJUMPING_SPIDER_MANGIANT_JUMPING_SPIDERTERMITE -MOON_SNAILMOON_SNAIL_MANGIANT_MOON_SNAILSPIDER_BROWN_RECLUSEBROWN_RECLUSE_SPIDER_MANGIANT_BROWN_RECLUSE_SPIDERSNAIL SNAIL_MAN GIANT_SNAIL GECKO_LEOPARDLEOPARD_GECKO_MANGIANT_LEOPARD_GECKODESERT TORTOISEDESERT_TORTOISE_MANGIANT_DESERT_TORTOISE GILA_MONSTERGILA_MONSTER_MANGIANT_GILA_MONSTERDOGCATMULEDONKEYHORSECOWSHEEPPIGGOAT BIRD_CHICKENCAVY BIRD_DUCK WATER_BUFFALOREINDEER -BIRD_GOOSEYAKLLAMAALPACABIRD_GUINEAFOWLBIRD_PEAFOWL_BLUE BIRD_TURKEYRABBITEQUIPMENT_WAGONCHIMERACENTAURGRIFFONFLYFLY_MAN GIANT_FLY ROACH_LARGE ROACH_MAN GIANT_ROACHBEETLE -BEETLE_MAN GIANT_BEETLEANTBUTTERFLY_MONARCHBUTTERFLY_MONARCH_MANGIANT_BUTTERFLY_MONARCHFIREFLY FIREFLY_MAN GIANT_FIREFLY DRAGONFLY DRAGONFLY_MANGIANT_DRAGONFLY HONEY_BEE BUMBLEBEE GOAT_MOUNTAINGOAT_MOUNTAIN_MANGIANT_GOAT_MOUNTAIN MARMOT_HOARYMARMOT_HOARY_MANGIANT_MARMOT_HOARYGNOME_MOUNTAIN -GNOME_DARKWALRUS -WALRUS_MAN GIANT_WALRUSFISH_LAMPREY_SEASHARK_GREAT_WHITE SHARK_FRILLSHARK_SPINY_DOGFISHSHARK_WOBBEGONG_SPOTTED SHARK_WHALE SHARK_BASKING SHARK_NURSESHARK_MAKO_SHORTFINSHARK_MAKO_LONGFIN SHARK_TIGER -SHARK_BULLSHARK_REEF_BLACKTIPSHARK_REEF_WHITETIP -SHARK_BLUESHARK_HAMMERHEAD SHARK_ANGELFISH_SKATE_COMMONFISH_RAY_MANTA FISH_STINGRAYFISH_COELACANTH FISH_STURGEONFISH_CONGER_EEL FISH_MILKFISHFISH_COD FISH_OPAHFISH_GROUPER_GIANT FISH_BLUEFISHFISH_SUNFISH_OCEANFISH_SWORDFISH FISH_MARLIN FISH_HALIBUTFISH_BARRACUDA_GREATFISH_TUNA_BLUEFINNARWHAL NARWHAL MANNARWHAL, GIANTHIPPO HIPPO_MAN GIANT_HIPPOFISH_GAR_LONGNOSE FISH_CARPFISH_TIGERFISH FISH_PIKEPLATYPUS PLATYPUS MANPLATYPUS, GIANT BEAR_GRIZZLYBEAR_GRIZZLY_MANGIANT_BEAR_GRIZZLY -BEAR_BLACKBEAR_BLACK_MANGIANT_BEAR_BLACKDEERDEER_MAN -GIANT_DEERFOXFOX_MAN GIANT_FOXRACCOON RACCOON_MAN GIANT_RACCOONMACAQUE_RHESUSMACAQUE_RHESUS_MANGIANT_MACAQUE_RHESUSCOUGAR -COUGAR_MAN GIANT_COUGARWOLFWOLF_MAN -GIANT_WOLF GROUNDHOG GROUNDHOG_MANGIANT_GROUNDHOG ALLIGATOR ALLIGATOR_MANGIANT_ALLIGATOR BIRD_BUZZARD BUZZARD_MAN GIANT_BUZZARDPANDAPANDA, GIGANTIC PANDA MANCAPYBARACAPYBARA, GIANT CAPYBARA MANBADGER -BADGER MAN BADGER, GIANTMOOSE MOOSE MAN MOOSE, GIANT RED PANDA RED PANDA MANRED PANDA, GIANTELEPHANT ELEPHANT_MANGIANT_ELEPHANTWARTHOG WARTHOG_MAN GIANT_WARTHOGLIONLION_MAN -GIANT_LIONLEOPARD LEOPARD_MAN GIANT_LEOPARDJAGUAR -JAGUAR_MAN GIANT_JAGUARTIGER TIGER_MAN GIANT_TIGERCHEETAH CHEETAH_MAN GIANT_CHEETAHGAZELLE GAZELLE_MAN GIANT_GAZELLEMANDRILL MANDRILL_MANGIANT_MANDRILL -CHIMPANZEEBONOBOGORILLA ORANGUTANGIBBON_SIAMANGGIBBON_WHITE_HANDEDGIBBON_BLACK_HANDED GIBBON_GRAYGIBBON_SILVERYGIBBON_PILEATED GIBBON_BILOUGIBBON_WHITE_BROWEDGIBBON_BLACK_CRESTED CAMEL_1_HUMPCAMEL_1_HUMP_MANGIANT_CAMEL_1_HUMP CAMEL_2_HUMPCAMEL_2_HUMP_MANGIANT_CAMEL_2_HUMPCROCODILE_SALTWATERCROCODILE_SALTWATER_MANGIANT_CROCODILE_SALTWATER BIRD_VULTURE VULTURE_MAN GIANT_VULTURE -RHINOCEROSRHINOCEROS_MANGIANT_RHINOCEROSGIRAFFE GIRAFFE_MAN GIANT_GIRAFFE HONEY BADGERHONEY BADGER MANHONEY BADGER, GIANTGIANT TORTOISEGIANT TORTOISE MANGIGANTIC TORTOISE ARMADILLO ARMADILLO MANARMADILLO, GIANTMUSKOX -MUSKOX_MAN GIANT_MUSKOXELKELK_MAN GIANT_ELK -BEAR_POLARBEAR_POLAR_MANGIANT_BEAR_POLAR WOLVERINE WOLVERINE_MANGIANT_WOLVERINE -CHINCHILLACHINCHILLA_MANGIANT_CHINCHILLA FLOATING_GUTSDRUNIAN CREEPING_EYEVORACIOUS_CAVE_CRAWLERBLIND_CAVE_OGRE -CAP_HOPPER -MAGMA_CRABCRUNDLE HUNGRY_HEAD -FLESH_BALLELK_BIRD HELMET_SNAKEGREEN_DEVOURERRUTHERERCREEPY_CRAWLERDRALTHAGIANT_EARTHWORM BLOOD_MANBUGBATMANERA -MOLEMARIANJABBERER POND_GRABBERBLIND_CAVE_BEAR CAVE_DRAGONREACHERELEMENTMAN_GABBROGORLAK CAVE_FLOATERPLUMP_HELMET_MAN CAVE_BLOBELEMENTMAN_AMETHYSTOCTOPUS OCTOPUS_MAN GIANT_OCTOPUSCRABCRAB_MAN -GIANT_CRAB LEOPARD_SEALLEOPARD_SEAL_MANGIANT_LEOPARD_SEAL -CUTTLEFISHCUTTLEFISH_MANGIANT_CUTTLEFISHORCAORCA_MAN -GIANT_ORCASPONGE -SPONGE_MAN GIANT_SPONGEHORSESHOE_CRABHORSESHOE_CRAB_MANGIANT_HORSESHOE_CRAB SPERM_WHALESPERM_WHALE_MANGIANT_SPERM_WHALE ELEPHANT_SEALELEPHANT_SEAL_MANGIANT_ELEPHANT_SEAL HARP_SEAL HARP_SEAL_MANGIANT_HARP_SEALNAUTILUS NAUTILUS_MANGIANT_NAUTILUS FOXSQUIRREL MOGHOPPER RAT_DEMONWAMBLER_FLUFFYLIZARD_RHINO_TWO_LEGGED WORM_KNUCKLESPIDER_PHANTOM FLY_ACORN -GNAT_BLOODLIZARD -LIZARD_MAN GIANT_LIZARDSKINK SKINK_MAN GIANT_SKINK CHAMELEON CHAMELEON_MANGIANT_CHAMELEONANOLE ANOLE_MAN GIANT_ANOLEIGUANA -IGUANA_MAN GIANT_IGUANA RIVER OTTER SEA OTTER OTTER_MAN GIANT_OTTERSNAPPING TURTLEALLIGATOR SNAPPING TURTLESNAPPING_TURTLE_MANGIANT_SNAPPING_TURTLEBEAVER -BEAVER_MAN GIANT_BEAVERLEECH LEECH_MAN GIANT_LEECHAXOLOTL AXOLOTL_MAN GIANT_AXOLOTLMINKMINK_MAN -GIANT_MINK POND_TURTLEPOND_TURTLE_MANGIANT_POND_TURTLERATRAT_MAN SQUIRREL_GRAYSQUIRREL_GRAY_MANGIANT_SQUIRREL_GRAY SQUIRREL_REDSQUIRREL_RED_MANGIANT_SQUIRREL_REDCHIPMUNK CHIPMUNK_MANGIANT_CHIPMUNKHAMSTER HAMSTER_MAN GIANT_HAMSTERHEDGEHOG HEDGEHOG_MANGIANT_HEDGEHOGSQUIRREL_FLYINGFLYING_SQUIRREL_MANGIANT_FLYING_SQUIRRELMUSSELOYSTER FISH_SALMONFISH_CLOWNFISH FISH_HAGFISHFISH_LAMPREY_BROOK FISH_RAY_BATFISH_RAY_THORNBACKFISH_RATFISH_SPOTTED FISH_HERRING FISH_SHAD FISH_ANCHOVYFISH_TROUT_STEELHEAD FISH_HAKE FISH_SEAHORSE FISH_GLASSEYEFISH_PUFFER_WHITE_SPOTTED FISH_SOLE FISH_FLOUNDER FISH_MACKERELJELLYFISH_SEA_NETTLESQUID SQUID MANGIGANTIC SQUID FISH_LUNGFISHFISH_LOACH_CLOWNFISH_BULLHEAD_BROWNFISH_BULLHEAD_YELLOWFISH_BULLHEAD_BLACKFISH_KNIFEFISH_BANDED FISH_CHARFISH_TROUT_RAINBOWFISH_MOLLY_SAILFIN -FISH_GUPPY -FISH_PERCHDWARFHUMANELFGOBLINKOBOLDGREMLINTROLLOGREUNICORNDRAGONSATYRCOLOSSUS_BRONZEGIANTCYCLOPSETTINMINOTAURYETI SASQUATCH BLIZZARD_MANWOLF_ICEFAIRYPIXIEBEAK_DOG GRIMELING BLENDEC_FOUL STRANGLER NIGHTWINGHARPYHYDRA MERPERSON SEA_SERPENT SEA_MONSTERBIRD_ROCCROCODILE_CAVETOAD_GIANT_CAVE OLM_GIANT BAT_GIANT RAT_GIANT RAT_LARGEMOLE_DOG_NAKED -TROGLODYTE -MOLE_GIANTIMP_FIRESPIDER_CAVE_GIANT SPIDER_CAVE FISH_CAVE CAVE_FISH_MAN LOBSTER_CAVE -SNAKE_FIREOLMOLM_MANBATBAT_MANMAGGOT_PURRINGELEMENTMAN_FIREELEMENTMAN_MAGMAELEMENTMAN_IRONELEMENTMAN_MUDBIRD_SWALLOW_CAVECAVE_SWALLOW_MANBIRD_SWALLOW_CAVE_GIANT AMPHIBIAN_MAN REPTILE_MAN SERPENT_MANANT_MAN -RODENT MAN WILD_BOAR WILD_BOAR_MANGIANT_WILD_BOARCOYOTE -COYOTE_MAN GIANT_COYOTEKANGAROO KANGAROO_MANGIANT_KANGAROOKOALA KOALA_MAN GIANT_KOALAADDER ADDER_MAN GIANT_ADDERECHIDNA ECHIDNA_MAN GIANT_ECHIDNA PORCUPINE PORCUPINE_MANGIANT_PORCUPINE KINGSNAKE KINGSNAKE_MANGIANT_KINGSNAKE GRAY_LANGURGRAY_LANGUR_MANGIANT_GRAY_LANGURBOBCAT -BOBCAT_MAN GIANT_BOBCATSKUNK SKUNK_MAN GIANT_SKUNKGREEN_TREE_FROGGREEN_TREE_FROG_MANGIANT_GREEN_TREE_FROGHAREHARE_MAN -GIANT_HARE RATTLESNAKERATTLESNAKE_MANGIANT_RATTLESNAKEWEASEL -WEASEL_MAN GIANT_WEASELCOPPERHEAD_SNAKECOPPERHEAD_SNAKE_MANGIANT_COPPERHEAD_SNAKEIBEXIBEX_MAN -GIANT_IBEXWOMBAT -WOMBAT_MAN GIANT_WOMBATDINGO DINGO_MAN GIANT_DINGOCOATI COATI_MAN GIANT_COATIOPOSSUM OPOSSUM_MAN GIANT_OPOSSUMMONGOOSE MONGOOSE_MANGIANT_MONGOOSEHYENA HYENA_MAN GIANT_HYENAANACONDA ANACONDA_MANGIANT_ANACONDAMONITOR_LIZARDMONITOR_LIZARD_MANGIANT_MONITOR_LIZARD -KING_COBRAKING_COBRA_MANGIANT_KING_COBRAOCELOT -OCELOT_MAN GIANT_OCELOTJACKAL -JACKAL_MAN GIANT_JACKALCAPUCHIN CAPUCHIN_MANGIANT_CAPUCHINSLOTH SLOTH_MAN GIANT_SLOTH SPIDER_MONKEYSPIDER_MONKEY_MANGIANT_SPIDER_MONKEYPANGOLIN PANGOLIN_MANGIANT_PANGOLIN BLACK_MAMBABLACK_MAMBA_MANGIANT_BLACK_MAMBA -BEAR_SLOTHSLOTH_BEAR_MANGIANT_SLOTH_BEARAYE-AYE AYE-AYE_MAN GIANT_AYE-AYE -BUSHMASTERBUSHMASTER_MANGIANT_BUSHMASTERPYTHON -PYTHON_MAN GIANT_PYTHONTAPIR TAPIR_MAN GIANT_TAPIRIMPALA -IMPALA_MAN GIANT_IMPALAAARDVARK AARDVARK_MANGIANT_AARDVARK LION_TAMARINLION_TAMARIN_MANGIANT_LION_TAMARINSTOAT STOAT_MAN GIANT_STOATLYNXLYNX_MAN -GIANT_LYNXGNOLLNAGAFORGOTTEN_BEAST_1FORGOTTEN_BEAST_2FORGOTTEN_BEAST_3FORGOTTEN_BEAST_4FORGOTTEN_BEAST_5FORGOTTEN_BEAST_6FORGOTTEN_BEAST_7FORGOTTEN_BEAST_8FORGOTTEN_BEAST_9FORGOTTEN_BEAST_10FORGOTTEN_BEAST_11FORGOTTEN_BEAST_12FORGOTTEN_BEAST_13FORGOTTEN_BEAST_14FORGOTTEN_BEAST_15FORGOTTEN_BEAST_16FORGOTTEN_BEAST_17FORGOTTEN_BEAST_18FORGOTTEN_BEAST_19FORGOTTEN_BEAST_20FORGOTTEN_BEAST_21FORGOTTEN_BEAST_22FORGOTTEN_BEAST_23FORGOTTEN_BEAST_24FORGOTTEN_BEAST_25FORGOTTEN_BEAST_26FORGOTTEN_BEAST_27FORGOTTEN_BEAST_28FORGOTTEN_BEAST_29FORGOTTEN_BEAST_30FORGOTTEN_BEAST_31FORGOTTEN_BEAST_32FORGOTTEN_BEAST_33FORGOTTEN_BEAST_34FORGOTTEN_BEAST_35FORGOTTEN_BEAST_36FORGOTTEN_BEAST_37FORGOTTEN_BEAST_38FORGOTTEN_BEAST_39FORGOTTEN_BEAST_40FORGOTTEN_BEAST_41FORGOTTEN_BEAST_42FORGOTTEN_BEAST_43FORGOTTEN_BEAST_44FORGOTTEN_BEAST_45FORGOTTEN_BEAST_46FORGOTTEN_BEAST_47FORGOTTEN_BEAST_48FORGOTTEN_BEAST_49FORGOTTEN_BEAST_50FORGOTTEN_BEAST_51FORGOTTEN_BEAST_52FORGOTTEN_BEAST_53FORGOTTEN_BEAST_54FORGOTTEN_BEAST_55FORGOTTEN_BEAST_56FORGOTTEN_BEAST_57FORGOTTEN_BEAST_58FORGOTTEN_BEAST_59FORGOTTEN_BEAST_60FORGOTTEN_BEAST_61FORGOTTEN_BEAST_62FORGOTTEN_BEAST_63FORGOTTEN_BEAST_64FORGOTTEN_BEAST_65FORGOTTEN_BEAST_66FORGOTTEN_BEAST_67FORGOTTEN_BEAST_68FORGOTTEN_BEAST_69FORGOTTEN_BEAST_70FORGOTTEN_BEAST_71FORGOTTEN_BEAST_72FORGOTTEN_BEAST_73FORGOTTEN_BEAST_74FORGOTTEN_BEAST_75FORGOTTEN_BEAST_76FORGOTTEN_BEAST_77FORGOTTEN_BEAST_78FORGOTTEN_BEAST_79FORGOTTEN_BEAST_80FORGOTTEN_BEAST_81FORGOTTEN_BEAST_82FORGOTTEN_BEAST_83FORGOTTEN_BEAST_84FORGOTTEN_BEAST_85FORGOTTEN_BEAST_86FORGOTTEN_BEAST_87FORGOTTEN_BEAST_88FORGOTTEN_BEAST_89FORGOTTEN_BEAST_90FORGOTTEN_BEAST_91FORGOTTEN_BEAST_92FORGOTTEN_BEAST_93FORGOTTEN_BEAST_94FORGOTTEN_BEAST_95FORGOTTEN_BEAST_96FORGOTTEN_BEAST_97FORGOTTEN_BEAST_98FORGOTTEN_BEAST_99FORGOTTEN_BEAST_100FORGOTTEN_BEAST_101FORGOTTEN_BEAST_102FORGOTTEN_BEAST_103FORGOTTEN_BEAST_104FORGOTTEN_BEAST_105FORGOTTEN_BEAST_106FORGOTTEN_BEAST_107FORGOTTEN_BEAST_108FORGOTTEN_BEAST_109FORGOTTEN_BEAST_110FORGOTTEN_BEAST_111FORGOTTEN_BEAST_112FORGOTTEN_BEAST_113FORGOTTEN_BEAST_114FORGOTTEN_BEAST_115FORGOTTEN_BEAST_116FORGOTTEN_BEAST_117FORGOTTEN_BEAST_118FORGOTTEN_BEAST_119FORGOTTEN_BEAST_120FORGOTTEN_BEAST_121FORGOTTEN_BEAST_122FORGOTTEN_BEAST_123FORGOTTEN_BEAST_124FORGOTTEN_BEAST_125FORGOTTEN_BEAST_126FORGOTTEN_BEAST_127FORGOTTEN_BEAST_128FORGOTTEN_BEAST_129FORGOTTEN_BEAST_130FORGOTTEN_BEAST_131FORGOTTEN_BEAST_132FORGOTTEN_BEAST_133FORGOTTEN_BEAST_134FORGOTTEN_BEAST_135FORGOTTEN_BEAST_136FORGOTTEN_BEAST_137FORGOTTEN_BEAST_138FORGOTTEN_BEAST_139FORGOTTEN_BEAST_140FORGOTTEN_BEAST_141FORGOTTEN_BEAST_142FORGOTTEN_BEAST_143FORGOTTEN_BEAST_144FORGOTTEN_BEAST_145FORGOTTEN_BEAST_146FORGOTTEN_BEAST_147FORGOTTEN_BEAST_148FORGOTTEN_BEAST_149FORGOTTEN_BEAST_150FORGOTTEN_BEAST_151FORGOTTEN_BEAST_152FORGOTTEN_BEAST_153FORGOTTEN_BEAST_154FORGOTTEN_BEAST_155FORGOTTEN_BEAST_156FORGOTTEN_BEAST_157FORGOTTEN_BEAST_158FORGOTTEN_BEAST_159FORGOTTEN_BEAST_160FORGOTTEN_BEAST_161FORGOTTEN_BEAST_162FORGOTTEN_BEAST_163FORGOTTEN_BEAST_164FORGOTTEN_BEAST_165FORGOTTEN_BEAST_166FORGOTTEN_BEAST_167FORGOTTEN_BEAST_168FORGOTTEN_BEAST_169FORGOTTEN_BEAST_170FORGOTTEN_BEAST_171FORGOTTEN_BEAST_172FORGOTTEN_BEAST_173FORGOTTEN_BEAST_174FORGOTTEN_BEAST_175FORGOTTEN_BEAST_176FORGOTTEN_BEAST_177FORGOTTEN_BEAST_178FORGOTTEN_BEAST_179FORGOTTEN_BEAST_180FORGOTTEN_BEAST_181FORGOTTEN_BEAST_182FORGOTTEN_BEAST_183FORGOTTEN_BEAST_184FORGOTTEN_BEAST_185FORGOTTEN_BEAST_186FORGOTTEN_BEAST_187FORGOTTEN_BEAST_188FORGOTTEN_BEAST_189FORGOTTEN_BEAST_190FORGOTTEN_BEAST_191FORGOTTEN_BEAST_192FORGOTTEN_BEAST_193FORGOTTEN_BEAST_194FORGOTTEN_BEAST_195FORGOTTEN_BEAST_196FORGOTTEN_BEAST_197FORGOTTEN_BEAST_198FORGOTTEN_BEAST_199FORGOTTEN_BEAST_200FORGOTTEN_BEAST_201FORGOTTEN_BEAST_202FORGOTTEN_BEAST_203FORGOTTEN_BEAST_204FORGOTTEN_BEAST_205FORGOTTEN_BEAST_206FORGOTTEN_BEAST_207FORGOTTEN_BEAST_208FORGOTTEN_BEAST_209FORGOTTEN_BEAST_210FORGOTTEN_BEAST_211FORGOTTEN_BEAST_212FORGOTTEN_BEAST_213FORGOTTEN_BEAST_214FORGOTTEN_BEAST_215FORGOTTEN_BEAST_216FORGOTTEN_BEAST_217FORGOTTEN_BEAST_218FORGOTTEN_BEAST_219FORGOTTEN_BEAST_220FORGOTTEN_BEAST_221FORGOTTEN_BEAST_222FORGOTTEN_BEAST_223FORGOTTEN_BEAST_224FORGOTTEN_BEAST_225FORGOTTEN_BEAST_226FORGOTTEN_BEAST_227FORGOTTEN_BEAST_228FORGOTTEN_BEAST_229FORGOTTEN_BEAST_230FORGOTTEN_BEAST_231FORGOTTEN_BEAST_232FORGOTTEN_BEAST_233FORGOTTEN_BEAST_234FORGOTTEN_BEAST_235FORGOTTEN_BEAST_236FORGOTTEN_BEAST_237FORGOTTEN_BEAST_238FORGOTTEN_BEAST_239FORGOTTEN_BEAST_240FORGOTTEN_BEAST_241FORGOTTEN_BEAST_242FORGOTTEN_BEAST_243FORGOTTEN_BEAST_244FORGOTTEN_BEAST_245FORGOTTEN_BEAST_246FORGOTTEN_BEAST_247FORGOTTEN_BEAST_248FORGOTTEN_BEAST_249FORGOTTEN_BEAST_250FORGOTTEN_BEAST_251FORGOTTEN_BEAST_252FORGOTTEN_BEAST_253FORGOTTEN_BEAST_254FORGOTTEN_BEAST_255FORGOTTEN_BEAST_256FORGOTTEN_BEAST_257FORGOTTEN_BEAST_258FORGOTTEN_BEAST_259FORGOTTEN_BEAST_260FORGOTTEN_BEAST_261FORGOTTEN_BEAST_262FORGOTTEN_BEAST_263FORGOTTEN_BEAST_264FORGOTTEN_BEAST_265FORGOTTEN_BEAST_266FORGOTTEN_BEAST_267FORGOTTEN_BEAST_268FORGOTTEN_BEAST_269FORGOTTEN_BEAST_270FORGOTTEN_BEAST_271FORGOTTEN_BEAST_272FORGOTTEN_BEAST_273FORGOTTEN_BEAST_274FORGOTTEN_BEAST_275FORGOTTEN_BEAST_276FORGOTTEN_BEAST_277FORGOTTEN_BEAST_278FORGOTTEN_BEAST_279FORGOTTEN_BEAST_280FORGOTTEN_BEAST_281FORGOTTEN_BEAST_282FORGOTTEN_BEAST_283FORGOTTEN_BEAST_284FORGOTTEN_BEAST_285FORGOTTEN_BEAST_286FORGOTTEN_BEAST_287FORGOTTEN_BEAST_288FORGOTTEN_BEAST_289FORGOTTEN_BEAST_290FORGOTTEN_BEAST_291FORGOTTEN_BEAST_292FORGOTTEN_BEAST_293FORGOTTEN_BEAST_294FORGOTTEN_BEAST_295FORGOTTEN_BEAST_296FORGOTTEN_BEAST_297FORGOTTEN_BEAST_298FORGOTTEN_BEAST_299FORGOTTEN_BEAST_300FORGOTTEN_BEAST_301FORGOTTEN_BEAST_302FORGOTTEN_BEAST_303FORGOTTEN_BEAST_304FORGOTTEN_BEAST_305FORGOTTEN_BEAST_306FORGOTTEN_BEAST_307FORGOTTEN_BEAST_308FORGOTTEN_BEAST_309FORGOTTEN_BEAST_310FORGOTTEN_BEAST_311FORGOTTEN_BEAST_312FORGOTTEN_BEAST_313FORGOTTEN_BEAST_314FORGOTTEN_BEAST_315FORGOTTEN_BEAST_316FORGOTTEN_BEAST_317FORGOTTEN_BEAST_318FORGOTTEN_BEAST_319FORGOTTEN_BEAST_320FORGOTTEN_BEAST_321FORGOTTEN_BEAST_322FORGOTTEN_BEAST_323FORGOTTEN_BEAST_324FORGOTTEN_BEAST_325FORGOTTEN_BEAST_326FORGOTTEN_BEAST_327FORGOTTEN_BEAST_328FORGOTTEN_BEAST_329FORGOTTEN_BEAST_330FORGOTTEN_BEAST_331FORGOTTEN_BEAST_332FORGOTTEN_BEAST_333FORGOTTEN_BEAST_334FORGOTTEN_BEAST_335FORGOTTEN_BEAST_336FORGOTTEN_BEAST_337FORGOTTEN_BEAST_338FORGOTTEN_BEAST_339FORGOTTEN_BEAST_340FORGOTTEN_BEAST_341FORGOTTEN_BEAST_342FORGOTTEN_BEAST_343FORGOTTEN_BEAST_344FORGOTTEN_BEAST_345FORGOTTEN_BEAST_346FORGOTTEN_BEAST_347FORGOTTEN_BEAST_348FORGOTTEN_BEAST_349FORGOTTEN_BEAST_350FORGOTTEN_BEAST_351FORGOTTEN_BEAST_352FORGOTTEN_BEAST_353FORGOTTEN_BEAST_354FORGOTTEN_BEAST_355FORGOTTEN_BEAST_356FORGOTTEN_BEAST_357FORGOTTEN_BEAST_358FORGOTTEN_BEAST_359FORGOTTEN_BEAST_360FORGOTTEN_BEAST_361FORGOTTEN_BEAST_362FORGOTTEN_BEAST_363FORGOTTEN_BEAST_364FORGOTTEN_BEAST_365FORGOTTEN_BEAST_366FORGOTTEN_BEAST_367FORGOTTEN_BEAST_368FORGOTTEN_BEAST_369FORGOTTEN_BEAST_370FORGOTTEN_BEAST_371FORGOTTEN_BEAST_372FORGOTTEN_BEAST_373FORGOTTEN_BEAST_374FORGOTTEN_BEAST_375FORGOTTEN_BEAST_376FORGOTTEN_BEAST_377FORGOTTEN_BEAST_378FORGOTTEN_BEAST_379FORGOTTEN_BEAST_380FORGOTTEN_BEAST_381FORGOTTEN_BEAST_382FORGOTTEN_BEAST_383FORGOTTEN_BEAST_384FORGOTTEN_BEAST_385FORGOTTEN_BEAST_386FORGOTTEN_BEAST_387FORGOTTEN_BEAST_388FORGOTTEN_BEAST_389FORGOTTEN_BEAST_390FORGOTTEN_BEAST_391FORGOTTEN_BEAST_392FORGOTTEN_BEAST_393FORGOTTEN_BEAST_394FORGOTTEN_BEAST_395FORGOTTEN_BEAST_396FORGOTTEN_BEAST_397FORGOTTEN_BEAST_398FORGOTTEN_BEAST_399FORGOTTEN_BEAST_400FORGOTTEN_BEAST_401FORGOTTEN_BEAST_402FORGOTTEN_BEAST_403FORGOTTEN_BEAST_404FORGOTTEN_BEAST_405FORGOTTEN_BEAST_406FORGOTTEN_BEAST_407FORGOTTEN_BEAST_408FORGOTTEN_BEAST_409FORGOTTEN_BEAST_410FORGOTTEN_BEAST_411FORGOTTEN_BEAST_412FORGOTTEN_BEAST_413FORGOTTEN_BEAST_414FORGOTTEN_BEAST_415FORGOTTEN_BEAST_416FORGOTTEN_BEAST_417FORGOTTEN_BEAST_418FORGOTTEN_BEAST_419FORGOTTEN_BEAST_420FORGOTTEN_BEAST_421FORGOTTEN_BEAST_422FORGOTTEN_BEAST_423FORGOTTEN_BEAST_424FORGOTTEN_BEAST_425FORGOTTEN_BEAST_426FORGOTTEN_BEAST_427FORGOTTEN_BEAST_428FORGOTTEN_BEAST_429FORGOTTEN_BEAST_430FORGOTTEN_BEAST_431FORGOTTEN_BEAST_432FORGOTTEN_BEAST_433FORGOTTEN_BEAST_434FORGOTTEN_BEAST_435FORGOTTEN_BEAST_436FORGOTTEN_BEAST_437FORGOTTEN_BEAST_438FORGOTTEN_BEAST_439FORGOTTEN_BEAST_440FORGOTTEN_BEAST_441FORGOTTEN_BEAST_442FORGOTTEN_BEAST_443FORGOTTEN_BEAST_444FORGOTTEN_BEAST_445FORGOTTEN_BEAST_446FORGOTTEN_BEAST_447FORGOTTEN_BEAST_448FORGOTTEN_BEAST_449FORGOTTEN_BEAST_450FORGOTTEN_BEAST_451FORGOTTEN_BEAST_452FORGOTTEN_BEAST_453FORGOTTEN_BEAST_454FORGOTTEN_BEAST_455FORGOTTEN_BEAST_456FORGOTTEN_BEAST_457FORGOTTEN_BEAST_458FORGOTTEN_BEAST_459FORGOTTEN_BEAST_460FORGOTTEN_BEAST_461FORGOTTEN_BEAST_462FORGOTTEN_BEAST_463FORGOTTEN_BEAST_464FORGOTTEN_BEAST_465FORGOTTEN_BEAST_466FORGOTTEN_BEAST_467FORGOTTEN_BEAST_468FORGOTTEN_BEAST_469FORGOTTEN_BEAST_470FORGOTTEN_BEAST_471FORGOTTEN_BEAST_472FORGOTTEN_BEAST_473FORGOTTEN_BEAST_474FORGOTTEN_BEAST_475FORGOTTEN_BEAST_476FORGOTTEN_BEAST_477FORGOTTEN_BEAST_478FORGOTTEN_BEAST_479FORGOTTEN_BEAST_480FORGOTTEN_BEAST_481FORGOTTEN_BEAST_482FORGOTTEN_BEAST_483FORGOTTEN_BEAST_484FORGOTTEN_BEAST_485FORGOTTEN_BEAST_486FORGOTTEN_BEAST_487FORGOTTEN_BEAST_488FORGOTTEN_BEAST_489FORGOTTEN_BEAST_490FORGOTTEN_BEAST_491FORGOTTEN_BEAST_492FORGOTTEN_BEAST_493FORGOTTEN_BEAST_494FORGOTTEN_BEAST_495FORGOTTEN_BEAST_496FORGOTTEN_BEAST_497FORGOTTEN_BEAST_498FORGOTTEN_BEAST_499FORGOTTEN_BEAST_500FORGOTTEN_BEAST_501FORGOTTEN_BEAST_502FORGOTTEN_BEAST_503FORGOTTEN_BEAST_504FORGOTTEN_BEAST_505FORGOTTEN_BEAST_506FORGOTTEN_BEAST_507FORGOTTEN_BEAST_508FORGOTTEN_BEAST_509FORGOTTEN_BEAST_510FORGOTTEN_BEAST_511FORGOTTEN_BEAST_512FORGOTTEN_BEAST_513FORGOTTEN_BEAST_514FORGOTTEN_BEAST_515FORGOTTEN_BEAST_516FORGOTTEN_BEAST_517FORGOTTEN_BEAST_518FORGOTTEN_BEAST_519FORGOTTEN_BEAST_520FORGOTTEN_BEAST_521FORGOTTEN_BEAST_522FORGOTTEN_BEAST_523FORGOTTEN_BEAST_524FORGOTTEN_BEAST_525FORGOTTEN_BEAST_526FORGOTTEN_BEAST_527FORGOTTEN_BEAST_528FORGOTTEN_BEAST_529FORGOTTEN_BEAST_530FORGOTTEN_BEAST_531FORGOTTEN_BEAST_532FORGOTTEN_BEAST_533FORGOTTEN_BEAST_534FORGOTTEN_BEAST_535FORGOTTEN_BEAST_536FORGOTTEN_BEAST_537FORGOTTEN_BEAST_538FORGOTTEN_BEAST_539FORGOTTEN_BEAST_540FORGOTTEN_BEAST_541FORGOTTEN_BEAST_542FORGOTTEN_BEAST_543FORGOTTEN_BEAST_544FORGOTTEN_BEAST_545FORGOTTEN_BEAST_546FORGOTTEN_BEAST_547FORGOTTEN_BEAST_548FORGOTTEN_BEAST_549FORGOTTEN_BEAST_550FORGOTTEN_BEAST_551FORGOTTEN_BEAST_552FORGOTTEN_BEAST_553FORGOTTEN_BEAST_554FORGOTTEN_BEAST_555FORGOTTEN_BEAST_556FORGOTTEN_BEAST_557FORGOTTEN_BEAST_558FORGOTTEN_BEAST_559FORGOTTEN_BEAST_560FORGOTTEN_BEAST_561FORGOTTEN_BEAST_562FORGOTTEN_BEAST_563FORGOTTEN_BEAST_564FORGOTTEN_BEAST_565FORGOTTEN_BEAST_566FORGOTTEN_BEAST_567FORGOTTEN_BEAST_568FORGOTTEN_BEAST_569FORGOTTEN_BEAST_570FORGOTTEN_BEAST_571FORGOTTEN_BEAST_572FORGOTTEN_BEAST_573FORGOTTEN_BEAST_574FORGOTTEN_BEAST_575FORGOTTEN_BEAST_576FORGOTTEN_BEAST_577FORGOTTEN_BEAST_578FORGOTTEN_BEAST_579FORGOTTEN_BEAST_580FORGOTTEN_BEAST_581FORGOTTEN_BEAST_582FORGOTTEN_BEAST_583FORGOTTEN_BEAST_584FORGOTTEN_BEAST_585FORGOTTEN_BEAST_586FORGOTTEN_BEAST_587FORGOTTEN_BEAST_588FORGOTTEN_BEAST_589FORGOTTEN_BEAST_590FORGOTTEN_BEAST_591FORGOTTEN_BEAST_592FORGOTTEN_BEAST_593FORGOTTEN_BEAST_594FORGOTTEN_BEAST_595FORGOTTEN_BEAST_596FORGOTTEN_BEAST_597FORGOTTEN_BEAST_598FORGOTTEN_BEAST_599FORGOTTEN_BEAST_600FORGOTTEN_BEAST_601FORGOTTEN_BEAST_602FORGOTTEN_BEAST_603FORGOTTEN_BEAST_604FORGOTTEN_BEAST_605FORGOTTEN_BEAST_606FORGOTTEN_BEAST_607FORGOTTEN_BEAST_608FORGOTTEN_BEAST_609FORGOTTEN_BEAST_610FORGOTTEN_BEAST_611FORGOTTEN_BEAST_612FORGOTTEN_BEAST_613FORGOTTEN_BEAST_614FORGOTTEN_BEAST_615FORGOTTEN_BEAST_616FORGOTTEN_BEAST_617FORGOTTEN_BEAST_618FORGOTTEN_BEAST_619FORGOTTEN_BEAST_620FORGOTTEN_BEAST_621FORGOTTEN_BEAST_622FORGOTTEN_BEAST_623FORGOTTEN_BEAST_624FORGOTTEN_BEAST_625FORGOTTEN_BEAST_626FORGOTTEN_BEAST_627FORGOTTEN_BEAST_628FORGOTTEN_BEAST_629FORGOTTEN_BEAST_630FORGOTTEN_BEAST_631FORGOTTEN_BEAST_632FORGOTTEN_BEAST_633FORGOTTEN_BEAST_634FORGOTTEN_BEAST_635FORGOTTEN_BEAST_636FORGOTTEN_BEAST_637FORGOTTEN_BEAST_638FORGOTTEN_BEAST_639FORGOTTEN_BEAST_640FORGOTTEN_BEAST_641FORGOTTEN_BEAST_642FORGOTTEN_BEAST_643FORGOTTEN_BEAST_644FORGOTTEN_BEAST_645FORGOTTEN_BEAST_646FORGOTTEN_BEAST_647FORGOTTEN_BEAST_648FORGOTTEN_BEAST_649FORGOTTEN_BEAST_650FORGOTTEN_BEAST_651FORGOTTEN_BEAST_652FORGOTTEN_BEAST_653FORGOTTEN_BEAST_654FORGOTTEN_BEAST_655FORGOTTEN_BEAST_656FORGOTTEN_BEAST_657FORGOTTEN_BEAST_658FORGOTTEN_BEAST_659FORGOTTEN_BEAST_660FORGOTTEN_BEAST_661FORGOTTEN_BEAST_662FORGOTTEN_BEAST_663FORGOTTEN_BEAST_664FORGOTTEN_BEAST_665FORGOTTEN_BEAST_666FORGOTTEN_BEAST_667FORGOTTEN_BEAST_668FORGOTTEN_BEAST_669FORGOTTEN_BEAST_670FORGOTTEN_BEAST_671FORGOTTEN_BEAST_672FORGOTTEN_BEAST_673FORGOTTEN_BEAST_674FORGOTTEN_BEAST_675FORGOTTEN_BEAST_676FORGOTTEN_BEAST_677FORGOTTEN_BEAST_678FORGOTTEN_BEAST_679FORGOTTEN_BEAST_680FORGOTTEN_BEAST_681FORGOTTEN_BEAST_682FORGOTTEN_BEAST_683FORGOTTEN_BEAST_684FORGOTTEN_BEAST_685FORGOTTEN_BEAST_686FORGOTTEN_BEAST_687FORGOTTEN_BEAST_688FORGOTTEN_BEAST_689FORGOTTEN_BEAST_690FORGOTTEN_BEAST_691FORGOTTEN_BEAST_692FORGOTTEN_BEAST_693FORGOTTEN_BEAST_694FORGOTTEN_BEAST_695FORGOTTEN_BEAST_696FORGOTTEN_BEAST_697FORGOTTEN_BEAST_698FORGOTTEN_BEAST_699FORGOTTEN_BEAST_700FORGOTTEN_BEAST_701FORGOTTEN_BEAST_702FORGOTTEN_BEAST_703FORGOTTEN_BEAST_704FORGOTTEN_BEAST_705FORGOTTEN_BEAST_706FORGOTTEN_BEAST_707FORGOTTEN_BEAST_708FORGOTTEN_BEAST_709FORGOTTEN_BEAST_710FORGOTTEN_BEAST_711FORGOTTEN_BEAST_712FORGOTTEN_BEAST_713FORGOTTEN_BEAST_714FORGOTTEN_BEAST_715FORGOTTEN_BEAST_716FORGOTTEN_BEAST_717FORGOTTEN_BEAST_718FORGOTTEN_BEAST_719FORGOTTEN_BEAST_720FORGOTTEN_BEAST_721FORGOTTEN_BEAST_722FORGOTTEN_BEAST_723FORGOTTEN_BEAST_724FORGOTTEN_BEAST_725FORGOTTEN_BEAST_726FORGOTTEN_BEAST_727FORGOTTEN_BEAST_728FORGOTTEN_BEAST_729FORGOTTEN_BEAST_730FORGOTTEN_BEAST_731FORGOTTEN_BEAST_732FORGOTTEN_BEAST_733FORGOTTEN_BEAST_734FORGOTTEN_BEAST_735FORGOTTEN_BEAST_736FORGOTTEN_BEAST_737FORGOTTEN_BEAST_738FORGOTTEN_BEAST_739FORGOTTEN_BEAST_740FORGOTTEN_BEAST_741FORGOTTEN_BEAST_742FORGOTTEN_BEAST_743FORGOTTEN_BEAST_744FORGOTTEN_BEAST_745FORGOTTEN_BEAST_746FORGOTTEN_BEAST_747FORGOTTEN_BEAST_748FORGOTTEN_BEAST_749FORGOTTEN_BEAST_750FORGOTTEN_BEAST_751FORGOTTEN_BEAST_752FORGOTTEN_BEAST_753FORGOTTEN_BEAST_754FORGOTTEN_BEAST_755FORGOTTEN_BEAST_756FORGOTTEN_BEAST_757FORGOTTEN_BEAST_758FORGOTTEN_BEAST_759FORGOTTEN_BEAST_760FORGOTTEN_BEAST_761FORGOTTEN_BEAST_762FORGOTTEN_BEAST_763FORGOTTEN_BEAST_764FORGOTTEN_BEAST_765FORGOTTEN_BEAST_766FORGOTTEN_BEAST_767FORGOTTEN_BEAST_768FORGOTTEN_BEAST_769FORGOTTEN_BEAST_770FORGOTTEN_BEAST_771FORGOTTEN_BEAST_772FORGOTTEN_BEAST_773FORGOTTEN_BEAST_774FORGOTTEN_BEAST_775FORGOTTEN_BEAST_776FORGOTTEN_BEAST_777FORGOTTEN_BEAST_778FORGOTTEN_BEAST_779FORGOTTEN_BEAST_780FORGOTTEN_BEAST_781FORGOTTEN_BEAST_782FORGOTTEN_BEAST_783FORGOTTEN_BEAST_784FORGOTTEN_BEAST_785FORGOTTEN_BEAST_786FORGOTTEN_BEAST_787FORGOTTEN_BEAST_788FORGOTTEN_BEAST_789FORGOTTEN_BEAST_790FORGOTTEN_BEAST_791FORGOTTEN_BEAST_792FORGOTTEN_BEAST_793FORGOTTEN_BEAST_794FORGOTTEN_BEAST_795FORGOTTEN_BEAST_796FORGOTTEN_BEAST_797FORGOTTEN_BEAST_798FORGOTTEN_BEAST_799FORGOTTEN_BEAST_800FORGOTTEN_BEAST_801FORGOTTEN_BEAST_802FORGOTTEN_BEAST_803FORGOTTEN_BEAST_804FORGOTTEN_BEAST_805FORGOTTEN_BEAST_806FORGOTTEN_BEAST_807FORGOTTEN_BEAST_808FORGOTTEN_BEAST_809FORGOTTEN_BEAST_810FORGOTTEN_BEAST_811FORGOTTEN_BEAST_812FORGOTTEN_BEAST_813FORGOTTEN_BEAST_814FORGOTTEN_BEAST_815FORGOTTEN_BEAST_816FORGOTTEN_BEAST_817FORGOTTEN_BEAST_818FORGOTTEN_BEAST_819FORGOTTEN_BEAST_820FORGOTTEN_BEAST_821FORGOTTEN_BEAST_822FORGOTTEN_BEAST_823FORGOTTEN_BEAST_824FORGOTTEN_BEAST_825FORGOTTEN_BEAST_826FORGOTTEN_BEAST_827FORGOTTEN_BEAST_828FORGOTTEN_BEAST_829FORGOTTEN_BEAST_830FORGOTTEN_BEAST_831FORGOTTEN_BEAST_832FORGOTTEN_BEAST_833FORGOTTEN_BEAST_834FORGOTTEN_BEAST_835FORGOTTEN_BEAST_836FORGOTTEN_BEAST_837FORGOTTEN_BEAST_838FORGOTTEN_BEAST_839FORGOTTEN_BEAST_840FORGOTTEN_BEAST_841FORGOTTEN_BEAST_842FORGOTTEN_BEAST_843FORGOTTEN_BEAST_844FORGOTTEN_BEAST_845FORGOTTEN_BEAST_846FORGOTTEN_BEAST_847FORGOTTEN_BEAST_848FORGOTTEN_BEAST_849FORGOTTEN_BEAST_850FORGOTTEN_BEAST_851FORGOTTEN_BEAST_852FORGOTTEN_BEAST_853FORGOTTEN_BEAST_854FORGOTTEN_BEAST_855FORGOTTEN_BEAST_856FORGOTTEN_BEAST_857FORGOTTEN_BEAST_858FORGOTTEN_BEAST_859FORGOTTEN_BEAST_860FORGOTTEN_BEAST_861FORGOTTEN_BEAST_862FORGOTTEN_BEAST_863FORGOTTEN_BEAST_864FORGOTTEN_BEAST_865FORGOTTEN_BEAST_866FORGOTTEN_BEAST_867TITAN_1TITAN_2TITAN_3TITAN_4TITAN_5TITAN_6TITAN_7TITAN_8TITAN_9TITAN_10TITAN_11TITAN_12TITAN_13TITAN_14TITAN_15TITAN_16TITAN_17TITAN_18TITAN_19TITAN_20TITAN_21TITAN_22TITAN_23TITAN_24TITAN_25TITAN_26TITAN_27TITAN_28TITAN_29TITAN_30TITAN_31TITAN_32TITAN_33DEMON_1DEMON_2DEMON_3DEMON_4DEMON_5DEMON_6DEMON_7DEMON_8DEMON_9DEMON_10DEMON_11DEMON_12DEMON_13DEMON_14DEMON_15DEMON_16DEMON_17DEMON_18DEMON_19DEMON_20DEMON_21DEMON_22DEMON_23DEMON_24DEMON_25DEMON_26DEMON_27DEMON_28DEMON_29DEMON_30DEMON_31DEMON_32DEMON_33DEMON_34DEMON_35DEMON_36DEMON_37DEMON_38DEMON_39DEMON_40DEMON_41DEMON_42DEMON_43DEMON_44DEMON_45DEMON_46DEMON_47DEMON_48DEMON_49DEMON_50DEMON_51DEMON_52NIGHT_CREATURE_1NIGHT_CREATURE_2NIGHT_CREATURE_3NIGHT_CREATURE_4NIGHT_CREATURE_5NIGHT_CREATURE_6NIGHT_CREATURE_7NIGHT_CREATURE_8NIGHT_CREATURE_9NIGHT_CREATURE_10NIGHT_CREATURE_11NIGHT_CREATURE_12NIGHT_CREATURE_13NIGHT_CREATURE_14NIGHT_CREATURE_15NIGHT_CREATURE_16NIGHT_CREATURE_17NIGHT_CREATURE_18NIGHT_CREATURE_19NIGHT_CREATURE_20NIGHT_CREATURE_21NIGHT_CREATURE_22NIGHT_CREATURE_23NIGHT_CREATURE_24NIGHT_CREATURE_25NIGHT_CREATURE_26NIGHT_CREATURE_27NIGHT_CREATURE_28NIGHT_CREATURE_29NIGHT_CREATURE_30NIGHT_CREATURE_31NIGHT_CREATURE_32NIGHT_CREATURE_33NIGHT_CREATURE_34NIGHT_CREATURE_35NIGHT_CREATURE_36NIGHT_CREATURE_37NIGHT_CREATURE_38NIGHT_CREATURE_39NIGHT_CREATURE_40NIGHT_CREATURE_41NIGHT_CREATURE_42NIGHT_CREATURE_43NIGHT_CREATURE_44NIGHT_CREATURE_45NIGHT_CREATURE_46NIGHT_CREATURE_47NIGHT_CREATURE_48NIGHT_CREATURE_49NIGHT_CREATURE_50NIGHT_CREATURE_51NIGHT_CREATURE_52NIGHT_CREATURE_53NIGHT_CREATURE_54NIGHT_CREATURE_55NIGHT_CREATURE_56NIGHT_CREATURE_57NIGHT_CREATURE_58NIGHT_CREATURE_59NIGHT_CREATURE_60NIGHT_CREATURE_61NIGHT_CREATURE_62NIGHT_CREATURE_63NIGHT_CREATURE_64NIGHT_CREATURE_65NIGHT_CREATURE_66NIGHT_CREATURE_67NIGHT_CREATURE_68NIGHT_CREATURE_69NIGHT_CREATURE_70NIGHT_CREATURE_71NIGHT_CREATURE_72NIGHT_CREATURE_73NIGHT_CREATURE_74NIGHT_CREATURE_75NIGHT_CREATURE_76NIGHT_CREATURE_77NIGHT_CREATURE_78NIGHT_CREATURE_79NIGHT_CREATURE_80NIGHT_CREATURE_81NIGHT_CREATURE_82NIGHT_CREATURE_83NIGHT_CREATURE_84NIGHT_CREATURE_85NIGHT_CREATURE_86NIGHT_CREATURE_87NIGHT_CREATURE_88NIGHT_CREATURE_89NIGHT_CREATURE_90NIGHT_CREATURE_91NIGHT_CREATURE_92NIGHT_CREATURE_93NIGHT_CREATURE_94NIGHT_CREATURE_95NIGHT_CREATURE_96NIGHT_CREATURE_97NIGHT_CREATURE_98NIGHT_CREATURE_99NIGHT_CREATURE_100NIGHT_CREATURE_101NIGHT_CREATURE_102NIGHT_CREATURE_103NIGHT_CREATURE_104HF1248 DIVINE_1HF1248 DIVINE_2HF1248 DIVINE_3HF1108 DIVINE_1HF1108 DIVINE_2HF1108 DIVINE_3HF1249 DIVINE_1HF1249 DIVINE_2HF1249 DIVINE_3HF1345 DIVINE_1HF1345 DIVINE_2HF1345 DIVINE_3˜ ¨°¸À \ No newline at end of file +  \ No newline at end of file diff --git a/data/stockpiles/category_armor.dfstock b/data/stockpiles/category_armor.dfstock index 8d69cec678552608e310a1d01ab3fd05581ddda6..54a2d54eee3204330dc86b6d12ee8684d24cf1aa 100644 GIT binary patch literal 5 McmeBTWXfO!00WW$_W%F@ literal 2040 zcmZ{kL2ueH6vv6gv<}pDqbmj4Q;*!*s;Zisojei~Cq}k`wU-RFR6;^+#i+D?g`IZX zamO8Z+;QJzUuBN~O^Uq>*uVet|Jm=^`Re@LsT>j+3+XZqaheTNDuF27<3vN{z))kt zc&b7sb){j59Ec7?kk0th`X;>kJv3M#v`|im4YM< zI8n;2dML`(WZRRMN)x`CmM@7+=v$Tu84!G>E|cQLJP_Qc?{XdO2Ox{Y6TRL`f<6)O zqU#m5pty!&mMfq;xi6MSsUlDs(4&?|^jMH)yDKvM-m#<~7vq3~rzNuOd@Tmiy?ok( zp$3_DSORq4z*@2n2l~MfIJqny3ajcD6BFK#v&|GNm!(L}s!_)AqR?iZ1P?4Z-r;p{ zJ(nmaUWA|ctZ2JAmqJ0Bb?AK#DN}J@hqPg!wL{@##3wOcsYM|QG`mwq1AI2Xxb(Pq z<`p}&urmugx3CLZIMF)Cu??Qu;F%4c+u%iaOU!O2cca-;w>lh8r`~LIJ0IV4w>y)& z@$_ju-BOPa+!>Ua(_3PcHhLK&-3x@_Ho+XBD4AAc62?L&yKR_C|^3t lXGd9dl)0mPcKqmka=tmvcgOkRlzuvmUry<_Q~KkS{sDA}NDlx2 diff --git a/data/stockpiles/category_bars_blocks.dfstock b/data/stockpiles/category_bars_blocks.dfstock index fdc5bb346f0e1b6a1f16b3d6b568bfa023f03368..b7ae54bb1f020e87b6765ea97e5112c6b7d6b560 100644 GIT binary patch literal 4 LcmWGy(qIGt0iytZ literal 3450 zcmZ`*%WmB^5VcUF2ppts+`Ouy8~uS{7>2tWQMANdieyR3&hTo#EGc)x6=NIR~lD_!S*+`+e_#yqgaFV=E|IULYclomRQkuSIC|tf2 znop;XSHd4dBt3neKU!PmKPh8{UALe!aBD^SkFOf)bgZ^ zz&j;dd6N0hv)3v`P0eAD1Cpg zjLhF};ON!8mie2_fu0I@!3|1F!eMn?3M$54A&IbtWC7fYTO`#djzloS0&o)^G|>415TK_#A};Sus@*E?Zd5$U^&qwaM;*Ysig!I%Z(euQNjWmzsW%2v=I7DmYbBE4) zAvGz3G4OCsGxtd%$c?uJ1DR^jkCHq=;s^p&+HMjAf`x|k!iL~-Zq#|p10|4-XhW-3 zj*?IlVNI=V%V~)cSx{L<6=PsqG}6ZC0guRU)Wz65owl=TUM=BugX&OvLwIaY<3Q&2?mYT5^t7fm9d%$ zWC*(_xJ0V87lJo7UmalR@ANw9OBK^Hv|YebYgG>cg7g#$cOv&f*J6%@GKNa>NKs)+ zCT(&UC>mw-)W~Y>U}L?RwkcMlKDxk`U>WdxNZ=U#C?o23T~+a79$N#(jbpp&UdgIY zuPAh#Y3_!!Las}%+EE46_n_J`t^H*{(+XGXR`HTFGXgDH@3?DCL@Y#A4p+fCQ;_SG z>_F>jbB4Ht@G@DJAp>KT`)pGc>R2#V_x@i13Iv^45=&kMs z2Z88LMbU8Ua9^X}C3T;Y=`D}G?*D_!j4G-S>7Z(X<3Ivx-m-Vk6`+xaKLh!Y)miSO#pJU^2|#h6fE#NU|sBxnkl$t z>yT-VV~YR-IA6nMV6~^m9@Zr!lIJ1U0m7T#iRjVk4Yz|`?_f7O*zFE>hp9N(xY`4+ h_rRMy@OBTp`?Cihn>>H`1p^N|k diff --git a/data/stockpiles/category_cloth.dfstock b/data/stockpiles/category_cloth.dfstock index 62d84c402..d88106c6b 100644 --- a/data/stockpiles/category_cloth.dfstock +++ b/data/stockpiles/category_cloth.dfstock @@ -1,141 +1 @@ -rêL -"CREATURE:SPIDER_BROWN_RECLUSE:SILK -&CREATURE:BROWN_RECLUSE_SPIDER_MAN:SILK -(CREATURE:GIANT_BROWN_RECLUSE_SPIDER:SILK -CREATURE:SPIDER_PHANTOM:SILK -CREATURE:SPIDER_CAVE_GIANT:SILK -CREATURE:SPIDER_CAVE:SILK -INORGANIC:DIVINE_2 -INORGANIC:DIVINE_4 -INORGANIC:DIVINE_6 -INORGANIC:DIVINE_8 -INORGANIC:DIVINE_10 -INORGANIC:DIVINE_12 -INORGANIC:DIVINE_14 -INORGANIC:DIVINE_16 -INORGANIC:DIVINE_18 -INORGANIC:DIVINE_20 - CREATURE:FORGOTTEN_BEAST_10:SILK - CREATURE:FORGOTTEN_BEAST_12:SILK - CREATURE:FORGOTTEN_BEAST_17:SILK - CREATURE:FORGOTTEN_BEAST_20:SILK - CREATURE:FORGOTTEN_BEAST_29:SILK - CREATURE:FORGOTTEN_BEAST_31:SILK - CREATURE:FORGOTTEN_BEAST_42:SILK - CREATURE:FORGOTTEN_BEAST_55:SILK - CREATURE:FORGOTTEN_BEAST_65:SILK - CREATURE:FORGOTTEN_BEAST_68:SILK - CREATURE:FORGOTTEN_BEAST_71:SILK - CREATURE:FORGOTTEN_BEAST_74:SILK - CREATURE:FORGOTTEN_BEAST_91:SILK -!CREATURE:FORGOTTEN_BEAST_101:SILK -!CREATURE:FORGOTTEN_BEAST_109:SILK -!CREATURE:FORGOTTEN_BEAST_119:SILK -!CREATURE:FORGOTTEN_BEAST_121:SILK -!CREATURE:FORGOTTEN_BEAST_125:SILK -!CREATURE:FORGOTTEN_BEAST_128:SILK -!CREATURE:FORGOTTEN_BEAST_132:SILK -!CREATURE:FORGOTTEN_BEAST_142:SILK -!CREATURE:FORGOTTEN_BEAST_146:SILK -!CREATURE:FORGOTTEN_BEAST_168:SILK -!CREATURE:FORGOTTEN_BEAST_173:SILK -!CREATURE:FORGOTTEN_BEAST_186:SILK -!CREATURE:FORGOTTEN_BEAST_204:SILK -!CREATURE:FORGOTTEN_BEAST_213:SILK -!CREATURE:FORGOTTEN_BEAST_224:SILK -!CREATURE:FORGOTTEN_BEAST_235:SILK -!CREATURE:FORGOTTEN_BEAST_236:SILK -!CREATURE:FORGOTTEN_BEAST_239:SILK -!CREATURE:FORGOTTEN_BEAST_248:SILK -!CREATURE:FORGOTTEN_BEAST_275:SILK -!CREATURE:FORGOTTEN_BEAST_277:SILK -!CREATURE:FORGOTTEN_BEAST_281:SILK -!CREATURE:FORGOTTEN_BEAST_289:SILK -!CREATURE:FORGOTTEN_BEAST_290:SILK -!CREATURE:FORGOTTEN_BEAST_293:SILK -!CREATURE:FORGOTTEN_BEAST_297:SILK -!CREATURE:FORGOTTEN_BEAST_309:SILK -!CREATURE:FORGOTTEN_BEAST_311:SILK -!CREATURE:FORGOTTEN_BEAST_313:SILK -!CREATURE:FORGOTTEN_BEAST_326:SILK -!CREATURE:FORGOTTEN_BEAST_330:SILK -!CREATURE:FORGOTTEN_BEAST_341:SILK -!CREATURE:FORGOTTEN_BEAST_343:SILK -!CREATURE:FORGOTTEN_BEAST_357:SILK -!CREATURE:FORGOTTEN_BEAST_362:SILK -!CREATURE:FORGOTTEN_BEAST_371:SILK -!CREATURE:FORGOTTEN_BEAST_376:SILK -!CREATURE:FORGOTTEN_BEAST_379:SILK -!CREATURE:FORGOTTEN_BEAST_384:SILK -!CREATURE:FORGOTTEN_BEAST_397:SILK -!CREATURE:FORGOTTEN_BEAST_398:SILK -!CREATURE:FORGOTTEN_BEAST_403:SILK -!CREATURE:FORGOTTEN_BEAST_412:SILK -!CREATURE:FORGOTTEN_BEAST_426:SILK -!CREATURE:FORGOTTEN_BEAST_427:SILK -!CREATURE:FORGOTTEN_BEAST_432:SILK -!CREATURE:FORGOTTEN_BEAST_435:SILK -!CREATURE:FORGOTTEN_BEAST_438:SILK -!CREATURE:FORGOTTEN_BEAST_442:SILK -!CREATURE:FORGOTTEN_BEAST_456:SILK -!CREATURE:FORGOTTEN_BEAST_460:SILK -!CREATURE:FORGOTTEN_BEAST_465:SILK -!CREATURE:FORGOTTEN_BEAST_467:SILK -!CREATURE:FORGOTTEN_BEAST_472:SILK -!CREATURE:FORGOTTEN_BEAST_476:SILK -!CREATURE:FORGOTTEN_BEAST_486:SILK -!CREATURE:FORGOTTEN_BEAST_508:SILK -!CREATURE:FORGOTTEN_BEAST_549:SILK -!CREATURE:FORGOTTEN_BEAST_567:SILK -!CREATURE:FORGOTTEN_BEAST_568:SILK -!CREATURE:FORGOTTEN_BEAST_575:SILK -!CREATURE:FORGOTTEN_BEAST_580:SILK -!CREATURE:FORGOTTEN_BEAST_583:SILK -!CREATURE:FORGOTTEN_BEAST_588:SILK -!CREATURE:FORGOTTEN_BEAST_589:SILK -!CREATURE:FORGOTTEN_BEAST_600:SILK -!CREATURE:FORGOTTEN_BEAST_605:SILK -!CREATURE:FORGOTTEN_BEAST_606:SILK -!CREATURE:FORGOTTEN_BEAST_612:SILK -!CREATURE:FORGOTTEN_BEAST_613:SILK -!CREATURE:FORGOTTEN_BEAST_614:SILK -!CREATURE:FORGOTTEN_BEAST_630:SILK -!CREATURE:FORGOTTEN_BEAST_632:SILK -!CREATURE:FORGOTTEN_BEAST_639:SILK -!CREATURE:FORGOTTEN_BEAST_643:SILK -!CREATURE:FORGOTTEN_BEAST_650:SILK -!CREATURE:FORGOTTEN_BEAST_653:SILK -!CREATURE:FORGOTTEN_BEAST_661:SILK -!CREATURE:FORGOTTEN_BEAST_662:SILK -!CREATURE:FORGOTTEN_BEAST_676:SILK -!CREATURE:FORGOTTEN_BEAST_680:SILK -!CREATURE:FORGOTTEN_BEAST_697:SILK -!CREATURE:FORGOTTEN_BEAST_706:SILK -!CREATURE:FORGOTTEN_BEAST_720:SILK -!CREATURE:FORGOTTEN_BEAST_723:SILK -!CREATURE:FORGOTTEN_BEAST_730:SILK -!CREATURE:FORGOTTEN_BEAST_757:SILK -!CREATURE:FORGOTTEN_BEAST_764:SILK -!CREATURE:FORGOTTEN_BEAST_765:SILK -!CREATURE:FORGOTTEN_BEAST_768:SILK -!CREATURE:FORGOTTEN_BEAST_774:SILK -!CREATURE:FORGOTTEN_BEAST_791:SILK -!CREATURE:FORGOTTEN_BEAST_809:SILK -!CREATURE:FORGOTTEN_BEAST_814:SILK -!CREATURE:FORGOTTEN_BEAST_821:SILK -!CREATURE:FORGOTTEN_BEAST_827:SILK -!CREATURE:FORGOTTEN_BEAST_829:SILK -!CREATURE:FORGOTTEN_BEAST_843:SILK -!CREATURE:FORGOTTEN_BEAST_855:SILK -!CREATURE:FORGOTTEN_BEAST_863:SILK -CREATURE:TITAN_4:SILK -CREATURE:TITAN_9:SILK -CREATURE:TITAN_14:SILK -CREATURE:TITAN_15:SILK -CREATURE:TITAN_16:SILK -CREATURE:TITAN_21:SILK -CREATURE:TITAN_22:SILK -CREATURE:TITAN_23:SILK -CREATURE:DEMON_39:SILK -CREATURE:DEMON_42:SILK -CREATURE:DEMON_51:SILKPLANT:FLAX:THREADPLANT:JUTE:THREADPLANT:HEMP:THREADPLANT:COTTON:THREADPLANT:RAMIE:THREADPLANT:KENAF:THREADPLANT:GRASS_TAIL_PIG:THREADPLANT:REED_ROPE:THREADCREATURE:SHEEP:HAIRCREATURE:LLAMA:HAIRCREATURE:ALPACA:HAIRCREATURE:TROLL:HAIRCREATURE:GNOLL:HAIR"INORGANIC:ADAMANTINE*"CREATURE:SPIDER_BROWN_RECLUSE:SILK*&CREATURE:BROWN_RECLUSE_SPIDER_MAN:SILK*(CREATURE:GIANT_BROWN_RECLUSE_SPIDER:SILK*CREATURE:SPIDER_PHANTOM:SILK*CREATURE:SPIDER_CAVE_GIANT:SILK*CREATURE:SPIDER_CAVE:SILK*INORGANIC:DIVINE_2*INORGANIC:DIVINE_4*INORGANIC:DIVINE_6*INORGANIC:DIVINE_8*INORGANIC:DIVINE_10*INORGANIC:DIVINE_12*INORGANIC:DIVINE_14*INORGANIC:DIVINE_16*INORGANIC:DIVINE_18*INORGANIC:DIVINE_20* CREATURE:FORGOTTEN_BEAST_10:SILK* CREATURE:FORGOTTEN_BEAST_12:SILK* CREATURE:FORGOTTEN_BEAST_17:SILK* CREATURE:FORGOTTEN_BEAST_20:SILK* CREATURE:FORGOTTEN_BEAST_29:SILK* CREATURE:FORGOTTEN_BEAST_31:SILK* CREATURE:FORGOTTEN_BEAST_42:SILK* CREATURE:FORGOTTEN_BEAST_55:SILK* CREATURE:FORGOTTEN_BEAST_65:SILK* CREATURE:FORGOTTEN_BEAST_68:SILK* CREATURE:FORGOTTEN_BEAST_71:SILK* CREATURE:FORGOTTEN_BEAST_74:SILK* CREATURE:FORGOTTEN_BEAST_91:SILK*!CREATURE:FORGOTTEN_BEAST_101:SILK*!CREATURE:FORGOTTEN_BEAST_109:SILK*!CREATURE:FORGOTTEN_BEAST_119:SILK*!CREATURE:FORGOTTEN_BEAST_121:SILK*!CREATURE:FORGOTTEN_BEAST_125:SILK*!CREATURE:FORGOTTEN_BEAST_128:SILK*!CREATURE:FORGOTTEN_BEAST_132:SILK*!CREATURE:FORGOTTEN_BEAST_142:SILK*!CREATURE:FORGOTTEN_BEAST_146:SILK*!CREATURE:FORGOTTEN_BEAST_168:SILK*!CREATURE:FORGOTTEN_BEAST_173:SILK*!CREATURE:FORGOTTEN_BEAST_186:SILK*!CREATURE:FORGOTTEN_BEAST_204:SILK*!CREATURE:FORGOTTEN_BEAST_213:SILK*!CREATURE:FORGOTTEN_BEAST_224:SILK*!CREATURE:FORGOTTEN_BEAST_235:SILK*!CREATURE:FORGOTTEN_BEAST_236:SILK*!CREATURE:FORGOTTEN_BEAST_239:SILK*!CREATURE:FORGOTTEN_BEAST_248:SILK*!CREATURE:FORGOTTEN_BEAST_275:SILK*!CREATURE:FORGOTTEN_BEAST_277:SILK*!CREATURE:FORGOTTEN_BEAST_281:SILK*!CREATURE:FORGOTTEN_BEAST_289:SILK*!CREATURE:FORGOTTEN_BEAST_290:SILK*!CREATURE:FORGOTTEN_BEAST_293:SILK*!CREATURE:FORGOTTEN_BEAST_297:SILK*!CREATURE:FORGOTTEN_BEAST_309:SILK*!CREATURE:FORGOTTEN_BEAST_311:SILK*!CREATURE:FORGOTTEN_BEAST_313:SILK*!CREATURE:FORGOTTEN_BEAST_326:SILK*!CREATURE:FORGOTTEN_BEAST_330:SILK*!CREATURE:FORGOTTEN_BEAST_341:SILK*!CREATURE:FORGOTTEN_BEAST_343:SILK*!CREATURE:FORGOTTEN_BEAST_357:SILK*!CREATURE:FORGOTTEN_BEAST_362:SILK*!CREATURE:FORGOTTEN_BEAST_371:SILK*!CREATURE:FORGOTTEN_BEAST_376:SILK*!CREATURE:FORGOTTEN_BEAST_379:SILK*!CREATURE:FORGOTTEN_BEAST_384:SILK*!CREATURE:FORGOTTEN_BEAST_397:SILK*!CREATURE:FORGOTTEN_BEAST_398:SILK*!CREATURE:FORGOTTEN_BEAST_403:SILK*!CREATURE:FORGOTTEN_BEAST_412:SILK*!CREATURE:FORGOTTEN_BEAST_426:SILK*!CREATURE:FORGOTTEN_BEAST_427:SILK*!CREATURE:FORGOTTEN_BEAST_432:SILK*!CREATURE:FORGOTTEN_BEAST_435:SILK*!CREATURE:FORGOTTEN_BEAST_438:SILK*!CREATURE:FORGOTTEN_BEAST_442:SILK*!CREATURE:FORGOTTEN_BEAST_456:SILK*!CREATURE:FORGOTTEN_BEAST_460:SILK*!CREATURE:FORGOTTEN_BEAST_465:SILK*!CREATURE:FORGOTTEN_BEAST_467:SILK*!CREATURE:FORGOTTEN_BEAST_472:SILK*!CREATURE:FORGOTTEN_BEAST_476:SILK*!CREATURE:FORGOTTEN_BEAST_486:SILK*!CREATURE:FORGOTTEN_BEAST_508:SILK*!CREATURE:FORGOTTEN_BEAST_549:SILK*!CREATURE:FORGOTTEN_BEAST_567:SILK*!CREATURE:FORGOTTEN_BEAST_568:SILK*!CREATURE:FORGOTTEN_BEAST_575:SILK*!CREATURE:FORGOTTEN_BEAST_580:SILK*!CREATURE:FORGOTTEN_BEAST_583:SILK*!CREATURE:FORGOTTEN_BEAST_588:SILK*!CREATURE:FORGOTTEN_BEAST_589:SILK*!CREATURE:FORGOTTEN_BEAST_600:SILK*!CREATURE:FORGOTTEN_BEAST_605:SILK*!CREATURE:FORGOTTEN_BEAST_606:SILK*!CREATURE:FORGOTTEN_BEAST_612:SILK*!CREATURE:FORGOTTEN_BEAST_613:SILK*!CREATURE:FORGOTTEN_BEAST_614:SILK*!CREATURE:FORGOTTEN_BEAST_630:SILK*!CREATURE:FORGOTTEN_BEAST_632:SILK*!CREATURE:FORGOTTEN_BEAST_639:SILK*!CREATURE:FORGOTTEN_BEAST_643:SILK*!CREATURE:FORGOTTEN_BEAST_650:SILK*!CREATURE:FORGOTTEN_BEAST_653:SILK*!CREATURE:FORGOTTEN_BEAST_661:SILK*!CREATURE:FORGOTTEN_BEAST_662:SILK*!CREATURE:FORGOTTEN_BEAST_676:SILK*!CREATURE:FORGOTTEN_BEAST_680:SILK*!CREATURE:FORGOTTEN_BEAST_697:SILK*!CREATURE:FORGOTTEN_BEAST_706:SILK*!CREATURE:FORGOTTEN_BEAST_720:SILK*!CREATURE:FORGOTTEN_BEAST_723:SILK*!CREATURE:FORGOTTEN_BEAST_730:SILK*!CREATURE:FORGOTTEN_BEAST_757:SILK*!CREATURE:FORGOTTEN_BEAST_764:SILK*!CREATURE:FORGOTTEN_BEAST_765:SILK*!CREATURE:FORGOTTEN_BEAST_768:SILK*!CREATURE:FORGOTTEN_BEAST_774:SILK*!CREATURE:FORGOTTEN_BEAST_791:SILK*!CREATURE:FORGOTTEN_BEAST_809:SILK*!CREATURE:FORGOTTEN_BEAST_814:SILK*!CREATURE:FORGOTTEN_BEAST_821:SILK*!CREATURE:FORGOTTEN_BEAST_827:SILK*!CREATURE:FORGOTTEN_BEAST_829:SILK*!CREATURE:FORGOTTEN_BEAST_843:SILK*!CREATURE:FORGOTTEN_BEAST_855:SILK*!CREATURE:FORGOTTEN_BEAST_863:SILK*CREATURE:TITAN_4:SILK*CREATURE:TITAN_9:SILK*CREATURE:TITAN_14:SILK*CREATURE:TITAN_15:SILK*CREATURE:TITAN_16:SILK*CREATURE:TITAN_21:SILK*CREATURE:TITAN_22:SILK*CREATURE:TITAN_23:SILK*CREATURE:DEMON_39:SILK*CREATURE:DEMON_42:SILK*CREATURE:DEMON_51:SILK2PLANT:FLAX:THREAD2PLANT:JUTE:THREAD2PLANT:HEMP:THREAD2PLANT:COTTON:THREAD2PLANT:RAMIE:THREAD2PLANT:KENAF:THREAD2PLANT:GRASS_TAIL_PIG:THREAD2PLANT:REED_ROPE:THREAD:CREATURE:SHEEP:HAIR:CREATURE:LLAMA:HAIR:CREATURE:ALPACA:HAIR:CREATURE:TROLL:HAIR:CREATURE:GNOLL:HAIRBINORGANIC:ADAMANTINE˜ ¨°¸À \ No newline at end of file +rH \ No newline at end of file diff --git a/data/stockpiles/category_coins.dfstock b/data/stockpiles/category_coins.dfstock index 4f17935dae690a5aa517f6459fb3bef185464a95..a48133ac400899723d0a7ba9616a9c311dcc5114 100644 GIT binary patch literal 4 LcmeZb5?}-X0aE~8 literal 7467 zcmZ`;xsv3#6`XP_Lej2Q$7qj;^5jlepEDjvqDgdt1P36io9*zI6d_0Enlfd|+)vvC zz?w=Dq}d7Z;T`!B57jUK{<8n0YK$#Kqw+7xnuh-_jV|`zUDut`XK5M9P20{9*f~kf zR^C;U^EVkzd6)Y?UF~L8ILCnNBy9Zox}#O)7`$Uli%vCt&HJR5d1rzB;rcB$?f-iH zvz4!%wBxgCSwY1Z=fx z%FE`zU6(Q~^3yma?T0IFjgw=j(Dzp`Q?Bm2YX32TE*2;ig_ZlC(q-3~Ms6*(#^zEB)PiCVt{O`%zy<>0PzrwS!7Ht5xu?|B zN}opaJO-S2Y?|SX8CM&tkZ)#kUKy*o%*e7lh*ESjUozdx!;2_p$7<0kcYxcyR?ONK zG@et(0|(QJ*-4o;rU<#>^K0W=dVWBI0ZPzWSmkmBPl?ufWd~=X3kjSXtp(H930rW^ zb732)m1sD`GOioeb`Hw@2XXi+3hZrlhfEH&7BR1xcVrW%!iXaiP>$6J@2z^%e zg3^I48twuUCD13Y4GcRkOVkCe%DWzRrWN|a)#fxDzV_huJ9qS}c#GkX*RQBtQcqE5 z2yj^>-mTY^AaVm#ashj(Rjh#WCH;;6Z4B{RE* z4mX|$q~WS5RB4z9*_t z7eSJ50&a3BAV(>Dt79d_l2EYHI1mzsMpNUDHWQ3I7~_x^FX#STI!dhVGlkIxl_B@@ zpsQ)mlm_}3sz4SXa{qJ(ul0$ADNgDDQOmA^5U|q%icw=KK=~-K6Ky~~E@~VUk}7y2 zj;-e;GcTYp@Qk6bV%uRM2uy+ox#dX0-buWY-8s6*B&e2WOp4UH!A2#lmY4)*Di>D3 z)K%C02on}4Ers$-Ek-@?u^04tU}=#xMqfOFXt+eV2Ub&u+oD>e?P4sjfRle&@HHV) zU*Mp5oVv?`S71)Z1&_R3GZkw?XI%UoafeveAsOB71=Ez;_*y`|=xj)(sl61@*?A>xHwT11aZxeX zgbpN0D^$G5zPn0eDKZR`e44F>C=9eK6CnWd35mn(1)peFA;P#$yG-U3ia2`>#cO{N zj>9W=7IRw-I$RKB-{qBpA`ntGQsGTa2=pOCQOJi1*Ky~MBMj*`Avx4AUd0sdSnQq+DlK)zJji_oVy_ zCUA-loPJ7B%T}>cXfT3LGPXt6HXUQGQ(5?wP6q{1FYgkyo*VSpLqtN{6|vFiTfFBK zR0I<-ZB!b^`j08Iw(rzjd}@JiSP~uAV3ZC@gr5L)9~`6#wyMi3v<~{3{mw-H=8sN! z^zFAGQl-pT@y4Gc!1Ln1_Eee9p}#sRVN6iS@`O?_e%GjtsJV*%>Wf>`rEj+561fqqP}ZZBfYO2f z292N6R=){1FplN8{MK2Hu|8t5XASn>jMEH21_K<&uq7JD0xq35;l~k*rIli?J$Nvd z`28;=mH6&CgWm!nu%j{f5swN8?=cjATcH&AaV#y5|Ir}%)wc*OGTv|+ChWL^-L7DF zE7<)C_OOCIu3%3q*k|sKi_f3dz?(JjxCY*?fp=@*{TleN20pHVPix>>M8{8j9brD# zsG{i$l!tB&!jBvH?FN3gf!}Z74;%R72L7~xf9CO-{J;6MwQ#ewaNJtB-CDTYTDad@ zc-UHa+*)|rTG)ylrKZ7+QgYmi{J0hQaVzrUR^-R6$d3;!eZeb>|0jTdbXi~F<2ro1 z4&SZA_v`S6Cy(p9pVr~e2_IuPX`e+r?X!rdeHQVw&mx}oS;W&mi+I{+5l{Op;%T2n zd?Vf!T?zZawWY2^d?Q{kZGHbnyx`gT{)d0gA38D3*;uRF%J>9kGLX$uT|Dd0nZAP9o=Mp3lH9ZJ-a)QsiJz)ie>0b>)m z4$%CI9&^kw#~yp^f9N0TLrSyrXyhIi-g!m7pU?ZeB>(o`PiH5x6uO?BTp8h4v(v(6 zMupi-*FLzmQgxWU47Qt{2v=D*JMpDees)|cQ(>{OYy3L9(nafZt!Ag9YUB1-UaBT2 zte4Ji>e(^A7PD7Mxb&a1%n7OD!k2}rW+%ah_@@zdfVND?RfB)C)3>c&L&>RcjD{np z(zQXBv*Tc`nH^`=uI9%ZYxDVeW3YECjSb}-A8Iv+()6RWuAZMXFm2}WUKulgWt0e| za`R)a&1!xksti9)q;V_Y$rR#hUX83vB321(~5!Z`f>e{+O z)LQ;kJ6rSb!kT>X(f&IuA|#eb+caYd^sJO&EjPNByeET|8@2e=UN180JqvtL&@tby zXmqhn-m%PxpzF5cb*PJsrC+?>@5Q3U@Af|%wLx*WS19@7_Y-k&`pT%qZzms&=r|~( zHfO`av{iD3RQ9RZPP3M2W02`T?2RB`2bdJQ#UJlKWd?BC4oUmXUhb?{+f<=n?}eH6 zRU691Clk?514SlsQ2}`|5u^fWjNUB%yjLNW6P1=*zzNW+H^QmKAE%#v0CxZ1$HqEz z4Z3wfF$iBqKmrXUghPXnplR#wnn8qq)<_|PQ=(f8R}P6&OHqh0QlFVtE#HV-Ehx!G zG}ms2Xo!NPZN$h@X3)qfe70X%@2B>YG%28%*TQKpH9RGx$`U#~$_J;Ym*VD>;*lNYT-V1+s5WA)pv3h#q!=1quX-V2 zEVS9K1|+@GZYL#!4SHxNrrH4dn;MFJWEui?qh)BJXZS)pd}UYN@@)&a-f)wG?)q@Z z>qxnB2m2}`~yV?0gSq{2TPIV(dCE48l zeiB#m7!|6-Bb_g9;B03XuN-XN3TA6LrI^dFlB8<9*hp7f+E{OW3uP_NQ z1mnRCn*X$K|FyO_oG!tZ9;_Z>s8sh9(NK3{u~l2&9O#j{u0@4L-DifZlxY5LIWS$H z2g>~$FyJsb7`%zd2Ut)p1}#&xN5WP0kY+MIY~T>-G#OBU8%9nN^c5hc8kFp#qr|#4 z(>Sf5GUR?bPA{iDQ&{k0ssd>M$^FGIBiBzf3~^Eih)RVL$8&aCfH5kZ3dS>FfDORM zMePp?lPW|YZkvcnMqZLaLA*1SY%zUE1T&E)y5&gH+JU?#t0lU~PNYVyarmRwO*%?k zZ4|CbBbG~FfYfJQk4KpFf$)~=h}3**IySqLUUf_@s={d&_Zm7}qTC&`smHV^57M?% zmQcXS-+hQRAyDtciSsyhyAP3pIUPHBkIUy&^|c`zJ3qI$**WH+7|=xMk+}X)K{&xqF@Wg-PYJ|S^9d%-7Km5X#- zr&Tud8buskaQd--5RS*ibrf?`b|wu7((h%d!3ZQNYNc^aCJFcf4;~y(iE$jFIr0nX zw<$T)FpYE6vLoXyA z1F$uT>542Z*euf_-m`7%x%x&IDL`61_>9XeCgAvuAPu%`+%VE+0Bv-bAR1I~qE!7X zrZmM@ncYR5s!?=}hb7__ythbxiFkv<7U^%=94C>YZw(^G26k~yR{1twPPmkSIfw~f zQm!+nt6l}wcctUAP{I@$99{?XVXHVL3=qMVtZUGe! z`1y0fFP;;A`JC{pi!=N9&Hek^#~&`vH+K&Y^6~cF)7>{0udnXk-#z@W`+4TS|L*Sb z{@cfkbM=p}@4kDw|Mvau!^JPE+rK~EJ-++?;o?j@KHa~&{rc(hgT_nNcsbU1`9b3) kYrNcRy!@c?pGQYO9v%I3^y25EPyTiE;@?Lv{&V!=f7onI82|tP diff --git a/data/stockpiles/category_food.dfstock b/data/stockpiles/category_food.dfstock index 9333d0c61..32829f677 100644 --- a/data/stockpiles/category_food.dfstock +++ b/data/stockpiles/category_food.dfstock @@ -1,18619 +1 @@ -©À- -PLANT:WORMY TENDRILS:STRUCTURAL -PLANT:EYEBALL:STRUCTURAL -CREATURE:TOAD:MUSCLE -CREATURE:TOAD:EYE -CREATURE:TOAD:BRAIN -CREATURE:TOAD:LUNG -CREATURE:TOAD:HEART -CREATURE:TOAD:LIVER -CREATURE:TOAD:GUT -CREATURE:TOAD:STOMACH -CREATURE:TOAD:GIZZARD -CREATURE:TOAD:PANCREAS -CREATURE:TOAD:SPLEEN -CREATURE:TOAD:KIDNEY -CREATURE:TOAD_MAN:MUSCLE -CREATURE:TOAD_MAN:EYE -CREATURE:TOAD_MAN:BRAIN -CREATURE:TOAD_MAN:LUNG -CREATURE:TOAD_MAN:HEART -CREATURE:TOAD_MAN:LIVER -CREATURE:TOAD_MAN:GUT -CREATURE:TOAD_MAN:STOMACH -CREATURE:TOAD_MAN:GIZZARD -CREATURE:TOAD_MAN:PANCREAS -CREATURE:TOAD_MAN:SPLEEN -CREATURE:TOAD_MAN:KIDNEY -CREATURE:GIANT_TOAD:MUSCLE -CREATURE:GIANT_TOAD:EYE -CREATURE:GIANT_TOAD:BRAIN -CREATURE:GIANT_TOAD:LUNG -CREATURE:GIANT_TOAD:HEART -CREATURE:GIANT_TOAD:LIVER -CREATURE:GIANT_TOAD:GUT -CREATURE:GIANT_TOAD:STOMACH -CREATURE:GIANT_TOAD:GIZZARD -CREATURE:GIANT_TOAD:PANCREAS -CREATURE:GIANT_TOAD:SPLEEN -CREATURE:GIANT_TOAD:KIDNEY -CREATURE:WORM:MUSCLE -CREATURE:WORM:EYE -CREATURE:WORM:BRAIN -CREATURE:WORM:LUNG -CREATURE:WORM:HEART -CREATURE:WORM:LIVER -CREATURE:WORM:GUT -CREATURE:WORM:STOMACH -CREATURE:WORM:GIZZARD -CREATURE:WORM:PANCREAS -CREATURE:WORM:SPLEEN -CREATURE:WORM:KIDNEY -CREATURE:WORM_MAN:MUSCLE -CREATURE:WORM_MAN:EYE -CREATURE:WORM_MAN:BRAIN -CREATURE:WORM_MAN:LUNG -CREATURE:WORM_MAN:HEART -CREATURE:WORM_MAN:LIVER -CREATURE:WORM_MAN:GUT -CREATURE:WORM_MAN:STOMACH -CREATURE:WORM_MAN:GIZZARD -CREATURE:WORM_MAN:PANCREAS -CREATURE:WORM_MAN:SPLEEN -CREATURE:WORM_MAN:KIDNEY -CREATURE:BIRD_BLUEJAY:MUSCLE -CREATURE:BIRD_BLUEJAY:EYE -CREATURE:BIRD_BLUEJAY:BRAIN -CREATURE:BIRD_BLUEJAY:LUNG -CREATURE:BIRD_BLUEJAY:HEART -CREATURE:BIRD_BLUEJAY:LIVER -CREATURE:BIRD_BLUEJAY:GUT -CREATURE:BIRD_BLUEJAY:STOMACH -CREATURE:BIRD_BLUEJAY:GIZZARD -CREATURE:BIRD_BLUEJAY:PANCREAS -CREATURE:BIRD_BLUEJAY:SPLEEN -CREATURE:BIRD_BLUEJAY:KIDNEY -CREATURE:BLUEJAY_MAN:MUSCLE -CREATURE:BLUEJAY_MAN:EYE -CREATURE:BLUEJAY_MAN:BRAIN -CREATURE:BLUEJAY_MAN:LUNG -CREATURE:BLUEJAY_MAN:HEART -CREATURE:BLUEJAY_MAN:LIVER -CREATURE:BLUEJAY_MAN:GUT -CREATURE:BLUEJAY_MAN:STOMACH -CREATURE:BLUEJAY_MAN:GIZZARD -CREATURE:BLUEJAY_MAN:PANCREAS -CREATURE:BLUEJAY_MAN:SPLEEN -CREATURE:BLUEJAY_MAN:KIDNEY -CREATURE:GIANT_BLUEJAY:MUSCLE -CREATURE:GIANT_BLUEJAY:EYE -CREATURE:GIANT_BLUEJAY:BRAIN -CREATURE:GIANT_BLUEJAY:LUNG -CREATURE:GIANT_BLUEJAY:HEART -CREATURE:GIANT_BLUEJAY:LIVER -CREATURE:GIANT_BLUEJAY:GUT -CREATURE:GIANT_BLUEJAY:STOMACH -CREATURE:GIANT_BLUEJAY:GIZZARD -CREATURE:GIANT_BLUEJAY:PANCREAS -CREATURE:GIANT_BLUEJAY:SPLEEN -CREATURE:GIANT_BLUEJAY:KIDNEY -CREATURE:BIRD_CARDINAL:MUSCLE -CREATURE:BIRD_CARDINAL:EYE -CREATURE:BIRD_CARDINAL:BRAIN -CREATURE:BIRD_CARDINAL:LUNG -CREATURE:BIRD_CARDINAL:HEART -CREATURE:BIRD_CARDINAL:LIVER -CREATURE:BIRD_CARDINAL:GUT -CREATURE:BIRD_CARDINAL:STOMACH -CREATURE:BIRD_CARDINAL:GIZZARD -CREATURE:BIRD_CARDINAL:PANCREAS -CREATURE:BIRD_CARDINAL:SPLEEN -CREATURE:BIRD_CARDINAL:KIDNEY -CREATURE:CARDINAL_MAN:MUSCLE -CREATURE:CARDINAL_MAN:EYE -CREATURE:CARDINAL_MAN:BRAIN -CREATURE:CARDINAL_MAN:LUNG -CREATURE:CARDINAL_MAN:HEART -CREATURE:CARDINAL_MAN:LIVER -CREATURE:CARDINAL_MAN:GUT -CREATURE:CARDINAL_MAN:STOMACH -CREATURE:CARDINAL_MAN:GIZZARD -CREATURE:CARDINAL_MAN:PANCREAS -CREATURE:CARDINAL_MAN:SPLEEN -CREATURE:CARDINAL_MAN:KIDNEY -CREATURE:GIANT_CARDINAL:MUSCLE -CREATURE:GIANT_CARDINAL:EYE -CREATURE:GIANT_CARDINAL:BRAIN -CREATURE:GIANT_CARDINAL:LUNG -CREATURE:GIANT_CARDINAL:HEART -CREATURE:GIANT_CARDINAL:LIVER -CREATURE:GIANT_CARDINAL:GUT -CREATURE:GIANT_CARDINAL:STOMACH -CREATURE:GIANT_CARDINAL:GIZZARD - CREATURE:GIANT_CARDINAL:PANCREAS -CREATURE:GIANT_CARDINAL:SPLEEN -CREATURE:GIANT_CARDINAL:KIDNEY -CREATURE:BIRD_GRACKLE:MUSCLE -CREATURE:BIRD_GRACKLE:EYE -CREATURE:BIRD_GRACKLE:BRAIN -CREATURE:BIRD_GRACKLE:LUNG -CREATURE:BIRD_GRACKLE:HEART -CREATURE:BIRD_GRACKLE:LIVER -CREATURE:BIRD_GRACKLE:GUT -CREATURE:BIRD_GRACKLE:STOMACH -CREATURE:BIRD_GRACKLE:GIZZARD -CREATURE:BIRD_GRACKLE:PANCREAS -CREATURE:BIRD_GRACKLE:SPLEEN -CREATURE:BIRD_GRACKLE:KIDNEY -CREATURE:GRACKLE_MAN:MUSCLE -CREATURE:GRACKLE_MAN:EYE -CREATURE:GRACKLE_MAN:BRAIN -CREATURE:GRACKLE_MAN:LUNG -CREATURE:GRACKLE_MAN:HEART -CREATURE:GRACKLE_MAN:LIVER -CREATURE:GRACKLE_MAN:GUT -CREATURE:GRACKLE_MAN:STOMACH -CREATURE:GRACKLE_MAN:GIZZARD -CREATURE:GRACKLE_MAN:PANCREAS -CREATURE:GRACKLE_MAN:SPLEEN -CREATURE:GRACKLE_MAN:KIDNEY -CREATURE:GIANT_GRACKLE:MUSCLE -CREATURE:GIANT_GRACKLE:EYE -CREATURE:GIANT_GRACKLE:BRAIN -CREATURE:GIANT_GRACKLE:LUNG -CREATURE:GIANT_GRACKLE:HEART -CREATURE:GIANT_GRACKLE:LIVER -CREATURE:GIANT_GRACKLE:GUT -CREATURE:GIANT_GRACKLE:STOMACH -CREATURE:GIANT_GRACKLE:GIZZARD -CREATURE:GIANT_GRACKLE:PANCREAS -CREATURE:GIANT_GRACKLE:SPLEEN -CREATURE:GIANT_GRACKLE:KIDNEY -CREATURE:BIRD_ORIOLE:MUSCLE -CREATURE:BIRD_ORIOLE:EYE -CREATURE:BIRD_ORIOLE:BRAIN -CREATURE:BIRD_ORIOLE:LUNG -CREATURE:BIRD_ORIOLE:HEART -CREATURE:BIRD_ORIOLE:LIVER -CREATURE:BIRD_ORIOLE:GUT -CREATURE:BIRD_ORIOLE:STOMACH -CREATURE:BIRD_ORIOLE:GIZZARD -CREATURE:BIRD_ORIOLE:PANCREAS -CREATURE:BIRD_ORIOLE:SPLEEN -CREATURE:BIRD_ORIOLE:KIDNEY -CREATURE:ORIOLE_MAN:MUSCLE -CREATURE:ORIOLE_MAN:EYE -CREATURE:ORIOLE_MAN:BRAIN -CREATURE:ORIOLE_MAN:LUNG -CREATURE:ORIOLE_MAN:HEART -CREATURE:ORIOLE_MAN:LIVER -CREATURE:ORIOLE_MAN:GUT -CREATURE:ORIOLE_MAN:STOMACH -CREATURE:ORIOLE_MAN:GIZZARD -CREATURE:ORIOLE_MAN:PANCREAS -CREATURE:ORIOLE_MAN:SPLEEN -CREATURE:ORIOLE_MAN:KIDNEY -CREATURE:GIANT_ORIOLE:MUSCLE -CREATURE:GIANT_ORIOLE:EYE -CREATURE:GIANT_ORIOLE:BRAIN -CREATURE:GIANT_ORIOLE:LUNG -CREATURE:GIANT_ORIOLE:HEART -CREATURE:GIANT_ORIOLE:LIVER -CREATURE:GIANT_ORIOLE:GUT -CREATURE:GIANT_ORIOLE:STOMACH -CREATURE:GIANT_ORIOLE:GIZZARD -CREATURE:GIANT_ORIOLE:PANCREAS -CREATURE:GIANT_ORIOLE:SPLEEN -CREATURE:GIANT_ORIOLE:KIDNEY -!CREATURE:BIRD_RW_BLACKBIRD:MUSCLE -CREATURE:BIRD_RW_BLACKBIRD:EYE - CREATURE:BIRD_RW_BLACKBIRD:BRAIN -CREATURE:BIRD_RW_BLACKBIRD:LUNG - CREATURE:BIRD_RW_BLACKBIRD:HEART - CREATURE:BIRD_RW_BLACKBIRD:LIVER -CREATURE:BIRD_RW_BLACKBIRD:GUT -"CREATURE:BIRD_RW_BLACKBIRD:STOMACH -"CREATURE:BIRD_RW_BLACKBIRD:GIZZARD -#CREATURE:BIRD_RW_BLACKBIRD:PANCREAS -!CREATURE:BIRD_RW_BLACKBIRD:SPLEEN -!CREATURE:BIRD_RW_BLACKBIRD:KIDNEY - CREATURE:RW_BLACKBIRD_MAN:MUSCLE -CREATURE:RW_BLACKBIRD_MAN:EYE -CREATURE:RW_BLACKBIRD_MAN:BRAIN -CREATURE:RW_BLACKBIRD_MAN:LUNG -CREATURE:RW_BLACKBIRD_MAN:HEART -CREATURE:RW_BLACKBIRD_MAN:LIVER -CREATURE:RW_BLACKBIRD_MAN:GUT -!CREATURE:RW_BLACKBIRD_MAN:STOMACH -!CREATURE:RW_BLACKBIRD_MAN:GIZZARD -"CREATURE:RW_BLACKBIRD_MAN:PANCREAS - CREATURE:RW_BLACKBIRD_MAN:SPLEEN - CREATURE:RW_BLACKBIRD_MAN:KIDNEY -"CREATURE:GIANT_RW_BLACKBIRD:MUSCLE -CREATURE:GIANT_RW_BLACKBIRD:EYE -!CREATURE:GIANT_RW_BLACKBIRD:BRAIN - CREATURE:GIANT_RW_BLACKBIRD:LUNG -!CREATURE:GIANT_RW_BLACKBIRD:HEART -!CREATURE:GIANT_RW_BLACKBIRD:LIVER -CREATURE:GIANT_RW_BLACKBIRD:GUT -#CREATURE:GIANT_RW_BLACKBIRD:STOMACH -#CREATURE:GIANT_RW_BLACKBIRD:GIZZARD -$CREATURE:GIANT_RW_BLACKBIRD:PANCREAS -"CREATURE:GIANT_RW_BLACKBIRD:SPLEEN -"CREATURE:GIANT_RW_BLACKBIRD:KIDNEY -CREATURE:BIRD_PENGUIN:MUSCLE -CREATURE:BIRD_PENGUIN:EYE -CREATURE:BIRD_PENGUIN:BRAIN -CREATURE:BIRD_PENGUIN:LUNG -CREATURE:BIRD_PENGUIN:HEART -CREATURE:BIRD_PENGUIN:LIVER -CREATURE:BIRD_PENGUIN:GUT -CREATURE:BIRD_PENGUIN:STOMACH -CREATURE:BIRD_PENGUIN:GIZZARD -CREATURE:BIRD_PENGUIN:PANCREAS -CREATURE:BIRD_PENGUIN:SPLEEN -CREATURE:BIRD_PENGUIN:KIDNEY -#CREATURE:BIRD_PENGUIN_LITTLE:MUSCLE - CREATURE:BIRD_PENGUIN_LITTLE:EYE -"CREATURE:BIRD_PENGUIN_LITTLE:BRAIN -!CREATURE:BIRD_PENGUIN_LITTLE:LUNG -"CREATURE:BIRD_PENGUIN_LITTLE:HEART -"CREATURE:BIRD_PENGUIN_LITTLE:LIVER - CREATURE:BIRD_PENGUIN_LITTLE:GUT -$CREATURE:BIRD_PENGUIN_LITTLE:STOMACH -$CREATURE:BIRD_PENGUIN_LITTLE:GIZZARD -%CREATURE:BIRD_PENGUIN_LITTLE:PANCREAS -#CREATURE:BIRD_PENGUIN_LITTLE:SPLEEN -#CREATURE:BIRD_PENGUIN_LITTLE:KIDNEY -$CREATURE:BIRD_PENGUIN_EMPEROR:MUSCLE -!CREATURE:BIRD_PENGUIN_EMPEROR:EYE -#CREATURE:BIRD_PENGUIN_EMPEROR:BRAIN -"CREATURE:BIRD_PENGUIN_EMPEROR:LUNG -#CREATURE:BIRD_PENGUIN_EMPEROR:HEART -#CREATURE:BIRD_PENGUIN_EMPEROR:LIVER -!CREATURE:BIRD_PENGUIN_EMPEROR:GUT -%CREATURE:BIRD_PENGUIN_EMPEROR:STOMACH -%CREATURE:BIRD_PENGUIN_EMPEROR:GIZZARD -&CREATURE:BIRD_PENGUIN_EMPEROR:PANCREAS -$CREATURE:BIRD_PENGUIN_EMPEROR:SPLEEN -$CREATURE:BIRD_PENGUIN_EMPEROR:KIDNEY -CREATURE:PENGUIN MAN:MUSCLE -CREATURE:PENGUIN MAN:EYE -CREATURE:PENGUIN MAN:BRAIN -CREATURE:PENGUIN MAN:LUNG -CREATURE:PENGUIN MAN:HEART -CREATURE:PENGUIN MAN:LIVER -CREATURE:PENGUIN MAN:GUT -CREATURE:PENGUIN MAN:STOMACH -CREATURE:PENGUIN MAN:GIZZARD -CREATURE:PENGUIN MAN:PANCREAS -CREATURE:PENGUIN MAN:SPLEEN -CREATURE:PENGUIN MAN:KIDNEY -"CREATURE:BIRD_PENGUIN_GIANT:MUSCLE -CREATURE:BIRD_PENGUIN_GIANT:EYE -!CREATURE:BIRD_PENGUIN_GIANT:BRAIN - CREATURE:BIRD_PENGUIN_GIANT:LUNG -!CREATURE:BIRD_PENGUIN_GIANT:HEART -!CREATURE:BIRD_PENGUIN_GIANT:LIVER -CREATURE:BIRD_PENGUIN_GIANT:GUT -#CREATURE:BIRD_PENGUIN_GIANT:STOMACH -#CREATURE:BIRD_PENGUIN_GIANT:GIZZARD -$CREATURE:BIRD_PENGUIN_GIANT:PANCREAS -"CREATURE:BIRD_PENGUIN_GIANT:SPLEEN -"CREATURE:BIRD_PENGUIN_GIANT:KIDNEY -%CREATURE:BIRD_FALCON_PEREGRINE:MUSCLE -"CREATURE:BIRD_FALCON_PEREGRINE:EYE -$CREATURE:BIRD_FALCON_PEREGRINE:BRAIN -#CREATURE:BIRD_FALCON_PEREGRINE:LUNG -$CREATURE:BIRD_FALCON_PEREGRINE:HEART -$CREATURE:BIRD_FALCON_PEREGRINE:LIVER -"CREATURE:BIRD_FALCON_PEREGRINE:GUT -&CREATURE:BIRD_FALCON_PEREGRINE:STOMACH -&CREATURE:BIRD_FALCON_PEREGRINE:GIZZARD -'CREATURE:BIRD_FALCON_PEREGRINE:PANCREAS -%CREATURE:BIRD_FALCON_PEREGRINE:SPLEEN -%CREATURE:BIRD_FALCON_PEREGRINE:KIDNEY -$CREATURE:PEREGRINE FALCON MAN:MUSCLE -!CREATURE:PEREGRINE FALCON MAN:EYE -#CREATURE:PEREGRINE FALCON MAN:BRAIN -"CREATURE:PEREGRINE FALCON MAN:LUNG -#CREATURE:PEREGRINE FALCON MAN:HEART -#CREATURE:PEREGRINE FALCON MAN:LIVER -!CREATURE:PEREGRINE FALCON MAN:GUT -%CREATURE:PEREGRINE FALCON MAN:STOMACH -%CREATURE:PEREGRINE FALCON MAN:GIZZARD -&CREATURE:PEREGRINE FALCON MAN:PANCREAS -$CREATURE:PEREGRINE FALCON MAN:SPLEEN -$CREATURE:PEREGRINE FALCON MAN:KIDNEY -&CREATURE:GIANT PEREGRINE FALCON:MUSCLE -#CREATURE:GIANT PEREGRINE FALCON:EYE -%CREATURE:GIANT PEREGRINE FALCON:BRAIN -$CREATURE:GIANT PEREGRINE FALCON:LUNG -%CREATURE:GIANT PEREGRINE FALCON:HEART -%CREATURE:GIANT PEREGRINE FALCON:LIVER -#CREATURE:GIANT PEREGRINE FALCON:GUT -'CREATURE:GIANT PEREGRINE FALCON:STOMACH -'CREATURE:GIANT PEREGRINE FALCON:GIZZARD -(CREATURE:GIANT PEREGRINE FALCON:PANCREAS -&CREATURE:GIANT PEREGRINE FALCON:SPLEEN -&CREATURE:GIANT PEREGRINE FALCON:KIDNEY -CREATURE:BIRD_KIWI:MUSCLE -CREATURE:BIRD_KIWI:EYE -CREATURE:BIRD_KIWI:BRAIN -CREATURE:BIRD_KIWI:LUNG -CREATURE:BIRD_KIWI:HEART -CREATURE:BIRD_KIWI:LIVER -CREATURE:BIRD_KIWI:GUT -CREATURE:BIRD_KIWI:STOMACH -CREATURE:BIRD_KIWI:GIZZARD -CREATURE:BIRD_KIWI:PANCREAS -CREATURE:BIRD_KIWI:SPLEEN -CREATURE:BIRD_KIWI:KIDNEY -CREATURE:KIWI MAN:MUSCLE -CREATURE:KIWI MAN:EYE -CREATURE:KIWI MAN:BRAIN -CREATURE:KIWI MAN:LUNG -CREATURE:KIWI MAN:HEART -CREATURE:KIWI MAN:LIVER -CREATURE:KIWI MAN:GUT -CREATURE:KIWI MAN:STOMACH -CREATURE:KIWI MAN:GIZZARD -CREATURE:KIWI MAN:PANCREAS -CREATURE:KIWI MAN:SPLEEN -CREATURE:KIWI MAN:KIDNEY -CREATURE:BIRD_KIWI_GIANT:MUSCLE -CREATURE:BIRD_KIWI_GIANT:EYE -CREATURE:BIRD_KIWI_GIANT:BRAIN -CREATURE:BIRD_KIWI_GIANT:LUNG -CREATURE:BIRD_KIWI_GIANT:HEART -CREATURE:BIRD_KIWI_GIANT:LIVER -CREATURE:BIRD_KIWI_GIANT:GUT - CREATURE:BIRD_KIWI_GIANT:STOMACH - CREATURE:BIRD_KIWI_GIANT:GIZZARD -!CREATURE:BIRD_KIWI_GIANT:PANCREAS -CREATURE:BIRD_KIWI_GIANT:SPLEEN -CREATURE:BIRD_KIWI_GIANT:KIDNEY -CREATURE:BIRD_OSTRICH:MUSCLE -CREATURE:BIRD_OSTRICH:EYE -CREATURE:BIRD_OSTRICH:BRAIN -CREATURE:BIRD_OSTRICH:LUNG -CREATURE:BIRD_OSTRICH:HEART -CREATURE:BIRD_OSTRICH:LIVER -CREATURE:BIRD_OSTRICH:GUT -CREATURE:BIRD_OSTRICH:STOMACH -CREATURE:BIRD_OSTRICH:GIZZARD -CREATURE:BIRD_OSTRICH:PANCREAS -CREATURE:BIRD_OSTRICH:SPLEEN -CREATURE:BIRD_OSTRICH:KIDNEY -CREATURE:OSTRICH MAN:MUSCLE -CREATURE:OSTRICH MAN:EYE -CREATURE:OSTRICH MAN:BRAIN -CREATURE:OSTRICH MAN:LUNG -CREATURE:OSTRICH MAN:HEART -CREATURE:OSTRICH MAN:LIVER -CREATURE:OSTRICH MAN:GUT -CREATURE:OSTRICH MAN:STOMACH -CREATURE:OSTRICH MAN:GIZZARD -CREATURE:OSTRICH MAN:PANCREAS -CREATURE:OSTRICH MAN:SPLEEN -CREATURE:OSTRICH MAN:KIDNEY -"CREATURE:BIRD_OSTRICH_GIANT:MUSCLE -CREATURE:BIRD_OSTRICH_GIANT:EYE -!CREATURE:BIRD_OSTRICH_GIANT:BRAIN - CREATURE:BIRD_OSTRICH_GIANT:LUNG -!CREATURE:BIRD_OSTRICH_GIANT:HEART -!CREATURE:BIRD_OSTRICH_GIANT:LIVER -CREATURE:BIRD_OSTRICH_GIANT:GUT -#CREATURE:BIRD_OSTRICH_GIANT:STOMACH -#CREATURE:BIRD_OSTRICH_GIANT:GIZZARD -$CREATURE:BIRD_OSTRICH_GIANT:PANCREAS -"CREATURE:BIRD_OSTRICH_GIANT:SPLEEN -"CREATURE:BIRD_OSTRICH_GIANT:KIDNEY -CREATURE:BIRD_CROW:MUSCLE -CREATURE:BIRD_CROW:EYE -CREATURE:BIRD_CROW:BRAIN -CREATURE:BIRD_CROW:LUNG -CREATURE:BIRD_CROW:HEART -CREATURE:BIRD_CROW:LIVER -CREATURE:BIRD_CROW:GUT -CREATURE:BIRD_CROW:STOMACH -CREATURE:BIRD_CROW:GIZZARD -CREATURE:BIRD_CROW:PANCREAS -CREATURE:BIRD_CROW:SPLEEN -CREATURE:BIRD_CROW:KIDNEY -CREATURE:CROW_MAN:MUSCLE -CREATURE:CROW_MAN:EYE -CREATURE:CROW_MAN:BRAIN -CREATURE:CROW_MAN:LUNG -CREATURE:CROW_MAN:HEART -CREATURE:CROW_MAN:LIVER -CREATURE:CROW_MAN:GUT -CREATURE:CROW_MAN:STOMACH -CREATURE:CROW_MAN:GIZZARD -CREATURE:CROW_MAN:PANCREAS -CREATURE:CROW_MAN:SPLEEN -CREATURE:CROW_MAN:KIDNEY -CREATURE:GIANT_CROW:MUSCLE -CREATURE:GIANT_CROW:EYE -CREATURE:GIANT_CROW:BRAIN -CREATURE:GIANT_CROW:LUNG -CREATURE:GIANT_CROW:HEART -CREATURE:GIANT_CROW:LIVER -CREATURE:GIANT_CROW:GUT -CREATURE:GIANT_CROW:STOMACH -CREATURE:GIANT_CROW:GIZZARD -CREATURE:GIANT_CROW:PANCREAS -CREATURE:GIANT_CROW:SPLEEN -CREATURE:GIANT_CROW:KIDNEY -CREATURE:BIRD_RAVEN:MUSCLE -CREATURE:BIRD_RAVEN:EYE -CREATURE:BIRD_RAVEN:BRAIN -CREATURE:BIRD_RAVEN:LUNG -CREATURE:BIRD_RAVEN:HEART -CREATURE:BIRD_RAVEN:LIVER -CREATURE:BIRD_RAVEN:GUT -CREATURE:BIRD_RAVEN:STOMACH -CREATURE:BIRD_RAVEN:GIZZARD -CREATURE:BIRD_RAVEN:PANCREAS -CREATURE:BIRD_RAVEN:SPLEEN -CREATURE:BIRD_RAVEN:KIDNEY -CREATURE:RAVEN_MAN:MUSCLE -CREATURE:RAVEN_MAN:EYE -CREATURE:RAVEN_MAN:BRAIN -CREATURE:RAVEN_MAN:LUNG -CREATURE:RAVEN_MAN:HEART -CREATURE:RAVEN_MAN:LIVER -CREATURE:RAVEN_MAN:GUT -CREATURE:RAVEN_MAN:STOMACH -CREATURE:RAVEN_MAN:GIZZARD -CREATURE:RAVEN_MAN:PANCREAS -CREATURE:RAVEN_MAN:SPLEEN -CREATURE:RAVEN_MAN:KIDNEY -CREATURE:GIANT_RAVEN:MUSCLE -CREATURE:GIANT_RAVEN:EYE -CREATURE:GIANT_RAVEN:BRAIN -CREATURE:GIANT_RAVEN:LUNG -CREATURE:GIANT_RAVEN:HEART -CREATURE:GIANT_RAVEN:LIVER -CREATURE:GIANT_RAVEN:GUT -CREATURE:GIANT_RAVEN:STOMACH -CREATURE:GIANT_RAVEN:GIZZARD -CREATURE:GIANT_RAVEN:PANCREAS -CREATURE:GIANT_RAVEN:SPLEEN -CREATURE:GIANT_RAVEN:KIDNEY -CREATURE:BIRD_CASSOWARY:MUSCLE -CREATURE:BIRD_CASSOWARY:EYE -CREATURE:BIRD_CASSOWARY:BRAIN -CREATURE:BIRD_CASSOWARY:LUNG -CREATURE:BIRD_CASSOWARY:HEART -CREATURE:BIRD_CASSOWARY:LIVER -CREATURE:BIRD_CASSOWARY:GUT -CREATURE:BIRD_CASSOWARY:STOMACH -CREATURE:BIRD_CASSOWARY:GIZZARD - CREATURE:BIRD_CASSOWARY:PANCREAS -CREATURE:BIRD_CASSOWARY:SPLEEN -CREATURE:BIRD_CASSOWARY:KIDNEY -CREATURE:CASSOWARY_MAN:MUSCLE -CREATURE:CASSOWARY_MAN:EYE -CREATURE:CASSOWARY_MAN:BRAIN -CREATURE:CASSOWARY_MAN:LUNG -CREATURE:CASSOWARY_MAN:HEART -CREATURE:CASSOWARY_MAN:LIVER -CREATURE:CASSOWARY_MAN:GUT -CREATURE:CASSOWARY_MAN:STOMACH -CREATURE:CASSOWARY_MAN:GIZZARD -CREATURE:CASSOWARY_MAN:PANCREAS -CREATURE:CASSOWARY_MAN:SPLEEN -CREATURE:CASSOWARY_MAN:KIDNEY -CREATURE:GIANT_CASSOWARY:MUSCLE -CREATURE:GIANT_CASSOWARY:EYE -CREATURE:GIANT_CASSOWARY:BRAIN -CREATURE:GIANT_CASSOWARY:LUNG -CREATURE:GIANT_CASSOWARY:HEART -CREATURE:GIANT_CASSOWARY:LIVER -CREATURE:GIANT_CASSOWARY:GUT - CREATURE:GIANT_CASSOWARY:STOMACH - CREATURE:GIANT_CASSOWARY:GIZZARD -!CREATURE:GIANT_CASSOWARY:PANCREAS -CREATURE:GIANT_CASSOWARY:SPLEEN -CREATURE:GIANT_CASSOWARY:KIDNEY -CREATURE:BIRD_KEA:MUSCLE -CREATURE:BIRD_KEA:EYE -CREATURE:BIRD_KEA:BRAIN -CREATURE:BIRD_KEA:LUNG -CREATURE:BIRD_KEA:HEART -CREATURE:BIRD_KEA:LIVER -CREATURE:BIRD_KEA:GUT -CREATURE:BIRD_KEA:STOMACH -CREATURE:BIRD_KEA:GIZZARD -CREATURE:BIRD_KEA:PANCREAS -CREATURE:BIRD_KEA:SPLEEN -CREATURE:BIRD_KEA:KIDNEY -CREATURE:KEA_MAN:MUSCLE -CREATURE:KEA_MAN:EYE -CREATURE:KEA_MAN:BRAIN -CREATURE:KEA_MAN:LUNG -CREATURE:KEA_MAN:HEART -CREATURE:KEA_MAN:LIVER -CREATURE:KEA_MAN:GUT -CREATURE:KEA_MAN:STOMACH -CREATURE:KEA_MAN:GIZZARD -CREATURE:KEA_MAN:PANCREAS -CREATURE:KEA_MAN:SPLEEN -CREATURE:KEA_MAN:KIDNEY -CREATURE:GIANT_KEA:MUSCLE -CREATURE:GIANT_KEA:EYE -CREATURE:GIANT_KEA:BRAIN -CREATURE:GIANT_KEA:LUNG -CREATURE:GIANT_KEA:HEART -CREATURE:GIANT_KEA:LIVER -CREATURE:GIANT_KEA:GUT -CREATURE:GIANT_KEA:STOMACH -CREATURE:GIANT_KEA:GIZZARD -CREATURE:GIANT_KEA:PANCREAS -CREATURE:GIANT_KEA:SPLEEN -CREATURE:GIANT_KEA:KIDNEY -CREATURE:BIRD_OWL_SNOWY:MUSCLE -CREATURE:BIRD_OWL_SNOWY:EYE -CREATURE:BIRD_OWL_SNOWY:BRAIN -CREATURE:BIRD_OWL_SNOWY:LUNG -CREATURE:BIRD_OWL_SNOWY:HEART -CREATURE:BIRD_OWL_SNOWY:LIVER -CREATURE:BIRD_OWL_SNOWY:GUT -CREATURE:BIRD_OWL_SNOWY:STOMACH -CREATURE:BIRD_OWL_SNOWY:GIZZARD - CREATURE:BIRD_OWL_SNOWY:PANCREAS -CREATURE:BIRD_OWL_SNOWY:SPLEEN -CREATURE:BIRD_OWL_SNOWY:KIDNEY -CREATURE:SNOWY_OWL_MAN:MUSCLE -CREATURE:SNOWY_OWL_MAN:EYE -CREATURE:SNOWY_OWL_MAN:BRAIN -CREATURE:SNOWY_OWL_MAN:LUNG -CREATURE:SNOWY_OWL_MAN:HEART -CREATURE:SNOWY_OWL_MAN:LIVER -CREATURE:SNOWY_OWL_MAN:GUT -CREATURE:SNOWY_OWL_MAN:STOMACH -CREATURE:SNOWY_OWL_MAN:GIZZARD -CREATURE:SNOWY_OWL_MAN:PANCREAS -CREATURE:SNOWY_OWL_MAN:SPLEEN -CREATURE:SNOWY_OWL_MAN:KIDNEY -CREATURE:GIANT_SNOWY_OWL:MUSCLE -CREATURE:GIANT_SNOWY_OWL:EYE -CREATURE:GIANT_SNOWY_OWL:BRAIN -CREATURE:GIANT_SNOWY_OWL:LUNG -CREATURE:GIANT_SNOWY_OWL:HEART -CREATURE:GIANT_SNOWY_OWL:LIVER -CREATURE:GIANT_SNOWY_OWL:GUT - CREATURE:GIANT_SNOWY_OWL:STOMACH - CREATURE:GIANT_SNOWY_OWL:GIZZARD -!CREATURE:GIANT_SNOWY_OWL:PANCREAS -CREATURE:GIANT_SNOWY_OWL:SPLEEN -CREATURE:GIANT_SNOWY_OWL:KIDNEY -CREATURE:SPARROW:MUSCLE -CREATURE:SPARROW:EYE -CREATURE:SPARROW:BRAIN -CREATURE:SPARROW:LUNG -CREATURE:SPARROW:HEART -CREATURE:SPARROW:LIVER -CREATURE:SPARROW:GUT -CREATURE:SPARROW:STOMACH -CREATURE:SPARROW:GIZZARD -CREATURE:SPARROW:PANCREAS -CREATURE:SPARROW:SPLEEN -CREATURE:SPARROW:KIDNEY -CREATURE:SPARROW_MAN:MUSCLE -CREATURE:SPARROW_MAN:EYE -CREATURE:SPARROW_MAN:BRAIN -CREATURE:SPARROW_MAN:LUNG -CREATURE:SPARROW_MAN:HEART -CREATURE:SPARROW_MAN:LIVER -CREATURE:SPARROW_MAN:GUT -CREATURE:SPARROW_MAN:STOMACH -CREATURE:SPARROW_MAN:GIZZARD -CREATURE:SPARROW_MAN:PANCREAS -CREATURE:SPARROW_MAN:SPLEEN -CREATURE:SPARROW_MAN:KIDNEY -CREATURE:GIANT_SPARROW:MUSCLE -CREATURE:GIANT_SPARROW:EYE -CREATURE:GIANT_SPARROW:BRAIN -CREATURE:GIANT_SPARROW:LUNG -CREATURE:GIANT_SPARROW:HEART -CREATURE:GIANT_SPARROW:LIVER -CREATURE:GIANT_SPARROW:GUT -CREATURE:GIANT_SPARROW:STOMACH -CREATURE:GIANT_SPARROW:GIZZARD -CREATURE:GIANT_SPARROW:PANCREAS -CREATURE:GIANT_SPARROW:SPLEEN -CREATURE:GIANT_SPARROW:KIDNEY - CREATURE:BIRD_STORK_WHITE:MUSCLE -CREATURE:BIRD_STORK_WHITE:EYE -CREATURE:BIRD_STORK_WHITE:BRAIN -CREATURE:BIRD_STORK_WHITE:LUNG -CREATURE:BIRD_STORK_WHITE:HEART -CREATURE:BIRD_STORK_WHITE:LIVER -CREATURE:BIRD_STORK_WHITE:GUT -!CREATURE:BIRD_STORK_WHITE:STOMACH -!CREATURE:BIRD_STORK_WHITE:GIZZARD -"CREATURE:BIRD_STORK_WHITE:PANCREAS - CREATURE:BIRD_STORK_WHITE:SPLEEN - CREATURE:BIRD_STORK_WHITE:KIDNEY -CREATURE:WHITE_STORK_MAN:MUSCLE -CREATURE:WHITE_STORK_MAN:EYE -CREATURE:WHITE_STORK_MAN:BRAIN -CREATURE:WHITE_STORK_MAN:LUNG -CREATURE:WHITE_STORK_MAN:HEART -CREATURE:WHITE_STORK_MAN:LIVER -CREATURE:WHITE_STORK_MAN:GUT - CREATURE:WHITE_STORK_MAN:STOMACH - CREATURE:WHITE_STORK_MAN:GIZZARD -!CREATURE:WHITE_STORK_MAN:PANCREAS -CREATURE:WHITE_STORK_MAN:SPLEEN -CREATURE:WHITE_STORK_MAN:KIDNEY -!CREATURE:GIANT_WHITE_STORK:MUSCLE -CREATURE:GIANT_WHITE_STORK:EYE - CREATURE:GIANT_WHITE_STORK:BRAIN -CREATURE:GIANT_WHITE_STORK:LUNG - CREATURE:GIANT_WHITE_STORK:HEART - CREATURE:GIANT_WHITE_STORK:LIVER -CREATURE:GIANT_WHITE_STORK:GUT -"CREATURE:GIANT_WHITE_STORK:STOMACH -"CREATURE:GIANT_WHITE_STORK:GIZZARD -#CREATURE:GIANT_WHITE_STORK:PANCREAS -!CREATURE:GIANT_WHITE_STORK:SPLEEN -!CREATURE:GIANT_WHITE_STORK:KIDNEY -CREATURE:BIRD_LOON:MUSCLE -CREATURE:BIRD_LOON:EYE -CREATURE:BIRD_LOON:BRAIN -CREATURE:BIRD_LOON:LUNG -CREATURE:BIRD_LOON:HEART -CREATURE:BIRD_LOON:LIVER -CREATURE:BIRD_LOON:GUT -CREATURE:BIRD_LOON:STOMACH -CREATURE:BIRD_LOON:GIZZARD -CREATURE:BIRD_LOON:PANCREAS -CREATURE:BIRD_LOON:SPLEEN -CREATURE:BIRD_LOON:KIDNEY -CREATURE:LOON_MAN:MUSCLE -CREATURE:LOON_MAN:EYE -CREATURE:LOON_MAN:BRAIN -CREATURE:LOON_MAN:LUNG -CREATURE:LOON_MAN:HEART -CREATURE:LOON_MAN:LIVER -CREATURE:LOON_MAN:GUT -CREATURE:LOON_MAN:STOMACH -CREATURE:LOON_MAN:GIZZARD -CREATURE:LOON_MAN:PANCREAS -CREATURE:LOON_MAN:SPLEEN -CREATURE:LOON_MAN:KIDNEY -CREATURE:GIANT_LOON:MUSCLE -CREATURE:GIANT_LOON:EYE -CREATURE:GIANT_LOON:BRAIN -CREATURE:GIANT_LOON:LUNG -CREATURE:GIANT_LOON:HEART -CREATURE:GIANT_LOON:LIVER -CREATURE:GIANT_LOON:GUT -CREATURE:GIANT_LOON:STOMACH -CREATURE:GIANT_LOON:GIZZARD -CREATURE:GIANT_LOON:PANCREAS -CREATURE:GIANT_LOON:SPLEEN -CREATURE:GIANT_LOON:KIDNEY -CREATURE:BIRD_OWL_BARN:MUSCLE -CREATURE:BIRD_OWL_BARN:EYE -CREATURE:BIRD_OWL_BARN:BRAIN -CREATURE:BIRD_OWL_BARN:LUNG -CREATURE:BIRD_OWL_BARN:HEART -CREATURE:BIRD_OWL_BARN:LIVER -CREATURE:BIRD_OWL_BARN:GUT -CREATURE:BIRD_OWL_BARN:STOMACH -CREATURE:BIRD_OWL_BARN:GIZZARD -CREATURE:BIRD_OWL_BARN:PANCREAS -CREATURE:BIRD_OWL_BARN:SPLEEN -CREATURE:BIRD_OWL_BARN:KIDNEY -CREATURE:BARN_OWL_MAN:MUSCLE -CREATURE:BARN_OWL_MAN:EYE -CREATURE:BARN_OWL_MAN:BRAIN -CREATURE:BARN_OWL_MAN:LUNG -CREATURE:BARN_OWL_MAN:HEART -CREATURE:BARN_OWL_MAN:LIVER -CREATURE:BARN_OWL_MAN:GUT -CREATURE:BARN_OWL_MAN:STOMACH -CREATURE:BARN_OWL_MAN:GIZZARD -CREATURE:BARN_OWL_MAN:PANCREAS -CREATURE:BARN_OWL_MAN:SPLEEN -CREATURE:BARN_OWL_MAN:KIDNEY -CREATURE:GIANT_BARN_OWL:MUSCLE -CREATURE:GIANT_BARN_OWL:EYE -CREATURE:GIANT_BARN_OWL:BRAIN -CREATURE:GIANT_BARN_OWL:LUNG -CREATURE:GIANT_BARN_OWL:HEART -CREATURE:GIANT_BARN_OWL:LIVER -CREATURE:GIANT_BARN_OWL:GUT -CREATURE:GIANT_BARN_OWL:STOMACH -CREATURE:GIANT_BARN_OWL:GIZZARD - CREATURE:GIANT_BARN_OWL:PANCREAS -CREATURE:GIANT_BARN_OWL:SPLEEN -CREATURE:GIANT_BARN_OWL:KIDNEY -CREATURE:BIRD_PARAKEET:MUSCLE -CREATURE:BIRD_PARAKEET:EYE -CREATURE:BIRD_PARAKEET:BRAIN -CREATURE:BIRD_PARAKEET:LUNG -CREATURE:BIRD_PARAKEET:HEART -CREATURE:BIRD_PARAKEET:LIVER -CREATURE:BIRD_PARAKEET:GUT -CREATURE:BIRD_PARAKEET:STOMACH -CREATURE:BIRD_PARAKEET:GIZZARD -CREATURE:BIRD_PARAKEET:PANCREAS -CREATURE:BIRD_PARAKEET:SPLEEN -CREATURE:BIRD_PARAKEET:KIDNEY -CREATURE:PARAKEET_MAN:MUSCLE -CREATURE:PARAKEET_MAN:EYE -CREATURE:PARAKEET_MAN:BRAIN -CREATURE:PARAKEET_MAN:LUNG -CREATURE:PARAKEET_MAN:HEART -CREATURE:PARAKEET_MAN:LIVER -CREATURE:PARAKEET_MAN:GUT -CREATURE:PARAKEET_MAN:STOMACH -CREATURE:PARAKEET_MAN:GIZZARD -CREATURE:PARAKEET_MAN:PANCREAS -CREATURE:PARAKEET_MAN:SPLEEN -CREATURE:PARAKEET_MAN:KIDNEY -CREATURE:GIANT_PARAKEET:MUSCLE -CREATURE:GIANT_PARAKEET:EYE -CREATURE:GIANT_PARAKEET:BRAIN -CREATURE:GIANT_PARAKEET:LUNG -CREATURE:GIANT_PARAKEET:HEART -CREATURE:GIANT_PARAKEET:LIVER -CREATURE:GIANT_PARAKEET:GUT -CREATURE:GIANT_PARAKEET:STOMACH -CREATURE:GIANT_PARAKEET:GIZZARD - CREATURE:GIANT_PARAKEET:PANCREAS -CREATURE:GIANT_PARAKEET:SPLEEN -CREATURE:GIANT_PARAKEET:KIDNEY -CREATURE:BIRD_KAKAPO:MUSCLE -CREATURE:BIRD_KAKAPO:EYE -CREATURE:BIRD_KAKAPO:BRAIN -CREATURE:BIRD_KAKAPO:LUNG -CREATURE:BIRD_KAKAPO:HEART -CREATURE:BIRD_KAKAPO:LIVER -CREATURE:BIRD_KAKAPO:GUT -CREATURE:BIRD_KAKAPO:STOMACH -CREATURE:BIRD_KAKAPO:GIZZARD -CREATURE:BIRD_KAKAPO:PANCREAS -CREATURE:BIRD_KAKAPO:SPLEEN -CREATURE:BIRD_KAKAPO:KIDNEY -CREATURE:KAKAPO_MAN:MUSCLE -CREATURE:KAKAPO_MAN:EYE -CREATURE:KAKAPO_MAN:BRAIN -CREATURE:KAKAPO_MAN:LUNG -CREATURE:KAKAPO_MAN:HEART -CREATURE:KAKAPO_MAN:LIVER -CREATURE:KAKAPO_MAN:GUT -CREATURE:KAKAPO_MAN:STOMACH -CREATURE:KAKAPO_MAN:GIZZARD -CREATURE:KAKAPO_MAN:PANCREAS -CREATURE:KAKAPO_MAN:SPLEEN -CREATURE:KAKAPO_MAN:KIDNEY -CREATURE:GIANT_KAKAPO:MUSCLE -CREATURE:GIANT_KAKAPO:EYE -CREATURE:GIANT_KAKAPO:BRAIN -CREATURE:GIANT_KAKAPO:LUNG -CREATURE:GIANT_KAKAPO:HEART -CREATURE:GIANT_KAKAPO:LIVER -CREATURE:GIANT_KAKAPO:GUT -CREATURE:GIANT_KAKAPO:STOMACH -CREATURE:GIANT_KAKAPO:GIZZARD -CREATURE:GIANT_KAKAPO:PANCREAS -CREATURE:GIANT_KAKAPO:SPLEEN -CREATURE:GIANT_KAKAPO:KIDNEY - CREATURE:BIRD_PARROT_GREY:MUSCLE -CREATURE:BIRD_PARROT_GREY:EYE -CREATURE:BIRD_PARROT_GREY:BRAIN -CREATURE:BIRD_PARROT_GREY:LUNG -CREATURE:BIRD_PARROT_GREY:HEART -CREATURE:BIRD_PARROT_GREY:LIVER -CREATURE:BIRD_PARROT_GREY:GUT -!CREATURE:BIRD_PARROT_GREY:STOMACH -!CREATURE:BIRD_PARROT_GREY:GIZZARD -"CREATURE:BIRD_PARROT_GREY:PANCREAS - CREATURE:BIRD_PARROT_GREY:SPLEEN - CREATURE:BIRD_PARROT_GREY:KIDNEY -CREATURE:GREY_PARROT_MAN:MUSCLE -CREATURE:GREY_PARROT_MAN:EYE -CREATURE:GREY_PARROT_MAN:BRAIN -CREATURE:GREY_PARROT_MAN:LUNG -CREATURE:GREY_PARROT_MAN:HEART -CREATURE:GREY_PARROT_MAN:LIVER -CREATURE:GREY_PARROT_MAN:GUT - CREATURE:GREY_PARROT_MAN:STOMACH - CREATURE:GREY_PARROT_MAN:GIZZARD -!CREATURE:GREY_PARROT_MAN:PANCREAS -CREATURE:GREY_PARROT_MAN:SPLEEN -CREATURE:GREY_PARROT_MAN:KIDNEY -!CREATURE:GIANT_GREY_PARROT:MUSCLE -CREATURE:GIANT_GREY_PARROT:EYE - CREATURE:GIANT_GREY_PARROT:BRAIN -CREATURE:GIANT_GREY_PARROT:LUNG - CREATURE:GIANT_GREY_PARROT:HEART - CREATURE:GIANT_GREY_PARROT:LIVER -CREATURE:GIANT_GREY_PARROT:GUT -"CREATURE:GIANT_GREY_PARROT:STOMACH -"CREATURE:GIANT_GREY_PARROT:GIZZARD -#CREATURE:GIANT_GREY_PARROT:PANCREAS -!CREATURE:GIANT_GREY_PARROT:SPLEEN -!CREATURE:GIANT_GREY_PARROT:KIDNEY -CREATURE:BIRD_PUFFIN:MUSCLE -CREATURE:BIRD_PUFFIN:EYE -CREATURE:BIRD_PUFFIN:BRAIN -CREATURE:BIRD_PUFFIN:LUNG -CREATURE:BIRD_PUFFIN:HEART -CREATURE:BIRD_PUFFIN:LIVER -CREATURE:BIRD_PUFFIN:GUT -CREATURE:BIRD_PUFFIN:STOMACH -CREATURE:BIRD_PUFFIN:GIZZARD -CREATURE:BIRD_PUFFIN:PANCREAS -CREATURE:BIRD_PUFFIN:SPLEEN -CREATURE:BIRD_PUFFIN:KIDNEY -CREATURE:PUFFIN_MAN:MUSCLE -CREATURE:PUFFIN_MAN:EYE -CREATURE:PUFFIN_MAN:BRAIN -CREATURE:PUFFIN_MAN:LUNG -CREATURE:PUFFIN_MAN:HEART -CREATURE:PUFFIN_MAN:LIVER -CREATURE:PUFFIN_MAN:GUT -CREATURE:PUFFIN_MAN:STOMACH -CREATURE:PUFFIN_MAN:GIZZARD -CREATURE:PUFFIN_MAN:PANCREAS -CREATURE:PUFFIN_MAN:SPLEEN -CREATURE:PUFFIN_MAN:KIDNEY -CREATURE:GIANT_PUFFIN:MUSCLE -CREATURE:GIANT_PUFFIN:EYE -CREATURE:GIANT_PUFFIN:BRAIN -CREATURE:GIANT_PUFFIN:LUNG -CREATURE:GIANT_PUFFIN:HEART -CREATURE:GIANT_PUFFIN:LIVER -CREATURE:GIANT_PUFFIN:GUT -CREATURE:GIANT_PUFFIN:STOMACH -CREATURE:GIANT_PUFFIN:GIZZARD -CREATURE:GIANT_PUFFIN:PANCREAS -CREATURE:GIANT_PUFFIN:SPLEEN -CREATURE:GIANT_PUFFIN:KIDNEY -CREATURE:BIRD_SWAN:MUSCLE -CREATURE:BIRD_SWAN:EYE -CREATURE:BIRD_SWAN:BRAIN -CREATURE:BIRD_SWAN:LUNG -CREATURE:BIRD_SWAN:HEART -CREATURE:BIRD_SWAN:LIVER -CREATURE:BIRD_SWAN:GUT -CREATURE:BIRD_SWAN:STOMACH -CREATURE:BIRD_SWAN:GIZZARD -CREATURE:BIRD_SWAN:PANCREAS -CREATURE:BIRD_SWAN:SPLEEN -CREATURE:BIRD_SWAN:KIDNEY -CREATURE:SWAN_MAN:MUSCLE -CREATURE:SWAN_MAN:EYE -CREATURE:SWAN_MAN:BRAIN -CREATURE:SWAN_MAN:LUNG -CREATURE:SWAN_MAN:HEART -CREATURE:SWAN_MAN:LIVER -CREATURE:SWAN_MAN:GUT -CREATURE:SWAN_MAN:STOMACH -CREATURE:SWAN_MAN:GIZZARD -CREATURE:SWAN_MAN:PANCREAS -CREATURE:SWAN_MAN:SPLEEN -CREATURE:SWAN_MAN:KIDNEY -CREATURE:GIANT_SWAN:MUSCLE -CREATURE:GIANT_SWAN:EYE -CREATURE:GIANT_SWAN:BRAIN -CREATURE:GIANT_SWAN:LUNG -CREATURE:GIANT_SWAN:HEART -CREATURE:GIANT_SWAN:LIVER -CREATURE:GIANT_SWAN:GUT -CREATURE:GIANT_SWAN:STOMACH -CREATURE:GIANT_SWAN:GIZZARD -CREATURE:GIANT_SWAN:PANCREAS -CREATURE:GIANT_SWAN:SPLEEN -CREATURE:GIANT_SWAN:KIDNEY -CREATURE:BIRD_LORIKEET:MUSCLE -CREATURE:BIRD_LORIKEET:EYE -CREATURE:BIRD_LORIKEET:BRAIN -CREATURE:BIRD_LORIKEET:LUNG -CREATURE:BIRD_LORIKEET:HEART -CREATURE:BIRD_LORIKEET:LIVER -CREATURE:BIRD_LORIKEET:GUT -CREATURE:BIRD_LORIKEET:STOMACH -CREATURE:BIRD_LORIKEET:GIZZARD -CREATURE:BIRD_LORIKEET:PANCREAS -CREATURE:BIRD_LORIKEET:SPLEEN -CREATURE:BIRD_LORIKEET:KIDNEY -CREATURE:LORIKEET_MAN:MUSCLE -CREATURE:LORIKEET_MAN:EYE -CREATURE:LORIKEET_MAN:BRAIN -CREATURE:LORIKEET_MAN:LUNG -CREATURE:LORIKEET_MAN:HEART -CREATURE:LORIKEET_MAN:LIVER -CREATURE:LORIKEET_MAN:GUT -CREATURE:LORIKEET_MAN:STOMACH -CREATURE:LORIKEET_MAN:GIZZARD -CREATURE:LORIKEET_MAN:PANCREAS -CREATURE:LORIKEET_MAN:SPLEEN -CREATURE:LORIKEET_MAN:KIDNEY -CREATURE:GIANT_LORIKEET:MUSCLE -CREATURE:GIANT_LORIKEET:EYE -CREATURE:GIANT_LORIKEET:BRAIN -CREATURE:GIANT_LORIKEET:LUNG -CREATURE:GIANT_LORIKEET:HEART -CREATURE:GIANT_LORIKEET:LIVER -CREATURE:GIANT_LORIKEET:GUT -CREATURE:GIANT_LORIKEET:STOMACH -CREATURE:GIANT_LORIKEET:GIZZARD - CREATURE:GIANT_LORIKEET:PANCREAS -CREATURE:GIANT_LORIKEET:SPLEEN -CREATURE:GIANT_LORIKEET:KIDNEY -CREATURE:BIRD_WREN:MUSCLE -CREATURE:BIRD_WREN:EYE -CREATURE:BIRD_WREN:BRAIN -CREATURE:BIRD_WREN:LUNG -CREATURE:BIRD_WREN:HEART -CREATURE:BIRD_WREN:LIVER -CREATURE:BIRD_WREN:GUT -CREATURE:BIRD_WREN:STOMACH -CREATURE:BIRD_WREN:GIZZARD -CREATURE:BIRD_WREN:PANCREAS -CREATURE:BIRD_WREN:SPLEEN -CREATURE:BIRD_WREN:KIDNEY -CREATURE:WREN_MAN:MUSCLE -CREATURE:WREN_MAN:EYE -CREATURE:WREN_MAN:BRAIN -CREATURE:WREN_MAN:LUNG -CREATURE:WREN_MAN:HEART -CREATURE:WREN_MAN:LIVER -CREATURE:WREN_MAN:GUT -CREATURE:WREN_MAN:STOMACH -CREATURE:WREN_MAN:GIZZARD -CREATURE:WREN_MAN:PANCREAS -CREATURE:WREN_MAN:SPLEEN -CREATURE:WREN_MAN:KIDNEY -CREATURE:GIANT_WREN:MUSCLE -CREATURE:GIANT_WREN:EYE -CREATURE:GIANT_WREN:BRAIN -CREATURE:GIANT_WREN:LUNG -CREATURE:GIANT_WREN:HEART -CREATURE:GIANT_WREN:LIVER -CREATURE:GIANT_WREN:GUT -CREATURE:GIANT_WREN:STOMACH -CREATURE:GIANT_WREN:GIZZARD -CREATURE:GIANT_WREN:PANCREAS -CREATURE:GIANT_WREN:SPLEEN -CREATURE:GIANT_WREN:KIDNEY -CREATURE:BIRD_OSPREY:MUSCLE -CREATURE:BIRD_OSPREY:EYE -CREATURE:BIRD_OSPREY:BRAIN -CREATURE:BIRD_OSPREY:LUNG -CREATURE:BIRD_OSPREY:HEART -CREATURE:BIRD_OSPREY:LIVER -CREATURE:BIRD_OSPREY:GUT -CREATURE:BIRD_OSPREY:STOMACH -CREATURE:BIRD_OSPREY:GIZZARD -CREATURE:BIRD_OSPREY:PANCREAS -CREATURE:BIRD_OSPREY:SPLEEN -CREATURE:BIRD_OSPREY:KIDNEY -CREATURE:OSPREY_MAN:MUSCLE -CREATURE:OSPREY_MAN:EYE -CREATURE:OSPREY_MAN:BRAIN -CREATURE:OSPREY_MAN:LUNG -CREATURE:OSPREY_MAN:HEART -CREATURE:OSPREY_MAN:LIVER -CREATURE:OSPREY_MAN:GUT -CREATURE:OSPREY_MAN:STOMACH -CREATURE:OSPREY_MAN:GIZZARD -CREATURE:OSPREY_MAN:PANCREAS -CREATURE:OSPREY_MAN:SPLEEN -CREATURE:OSPREY_MAN:KIDNEY -CREATURE:GIANT_OSPREY:MUSCLE -CREATURE:GIANT_OSPREY:EYE -CREATURE:GIANT_OSPREY:BRAIN -CREATURE:GIANT_OSPREY:LUNG -CREATURE:GIANT_OSPREY:HEART -CREATURE:GIANT_OSPREY:LIVER -CREATURE:GIANT_OSPREY:GUT -CREATURE:GIANT_OSPREY:STOMACH -CREATURE:GIANT_OSPREY:GIZZARD -CREATURE:GIANT_OSPREY:PANCREAS -CREATURE:GIANT_OSPREY:SPLEEN -CREATURE:GIANT_OSPREY:KIDNEY -CREATURE:BIRD_EMU:MUSCLE -CREATURE:BIRD_EMU:EYE -CREATURE:BIRD_EMU:BRAIN -CREATURE:BIRD_EMU:LUNG -CREATURE:BIRD_EMU:HEART -CREATURE:BIRD_EMU:LIVER -CREATURE:BIRD_EMU:GUT -CREATURE:BIRD_EMU:STOMACH -CREATURE:BIRD_EMU:GIZZARD -CREATURE:BIRD_EMU:PANCREAS -CREATURE:BIRD_EMU:SPLEEN -CREATURE:BIRD_EMU:KIDNEY -CREATURE:EMU_MAN:MUSCLE -CREATURE:EMU_MAN:EYE -CREATURE:EMU_MAN:BRAIN -CREATURE:EMU_MAN:LUNG -CREATURE:EMU_MAN:HEART -CREATURE:EMU_MAN:LIVER -CREATURE:EMU_MAN:GUT -CREATURE:EMU_MAN:STOMACH -CREATURE:EMU_MAN:GIZZARD -CREATURE:EMU_MAN:PANCREAS -CREATURE:EMU_MAN:SPLEEN -CREATURE:EMU_MAN:KIDNEY -CREATURE:GIANT_EMU:MUSCLE -CREATURE:GIANT_EMU:EYE -CREATURE:GIANT_EMU:BRAIN -CREATURE:GIANT_EMU:LUNG -CREATURE:GIANT_EMU:HEART -CREATURE:GIANT_EMU:LIVER -CREATURE:GIANT_EMU:GUT -CREATURE:GIANT_EMU:STOMACH -CREATURE:GIANT_EMU:GIZZARD -CREATURE:GIANT_EMU:PANCREAS -CREATURE:GIANT_EMU:SPLEEN -CREATURE:GIANT_EMU:KIDNEY -CREATURE:BIRD_COCKATIEL:MUSCLE -CREATURE:BIRD_COCKATIEL:EYE -CREATURE:BIRD_COCKATIEL:BRAIN -CREATURE:BIRD_COCKATIEL:LUNG -CREATURE:BIRD_COCKATIEL:HEART -CREATURE:BIRD_COCKATIEL:LIVER -CREATURE:BIRD_COCKATIEL:GUT -CREATURE:BIRD_COCKATIEL:STOMACH -CREATURE:BIRD_COCKATIEL:GIZZARD - CREATURE:BIRD_COCKATIEL:PANCREAS -CREATURE:BIRD_COCKATIEL:SPLEEN -CREATURE:BIRD_COCKATIEL:KIDNEY -CREATURE:COCKATIEL_MAN:MUSCLE -CREATURE:COCKATIEL_MAN:EYE -CREATURE:COCKATIEL_MAN:BRAIN -CREATURE:COCKATIEL_MAN:LUNG -CREATURE:COCKATIEL_MAN:HEART -CREATURE:COCKATIEL_MAN:LIVER -CREATURE:COCKATIEL_MAN:GUT -CREATURE:COCKATIEL_MAN:STOMACH -CREATURE:COCKATIEL_MAN:GIZZARD -CREATURE:COCKATIEL_MAN:PANCREAS -CREATURE:COCKATIEL_MAN:SPLEEN -CREATURE:COCKATIEL_MAN:KIDNEY -CREATURE:GIANT_COCKATIEL:MUSCLE -CREATURE:GIANT_COCKATIEL:EYE -CREATURE:GIANT_COCKATIEL:BRAIN -CREATURE:GIANT_COCKATIEL:LUNG -CREATURE:GIANT_COCKATIEL:HEART -CREATURE:GIANT_COCKATIEL:LIVER -CREATURE:GIANT_COCKATIEL:GUT - CREATURE:GIANT_COCKATIEL:STOMACH - CREATURE:GIANT_COCKATIEL:GIZZARD -!CREATURE:GIANT_COCKATIEL:PANCREAS -CREATURE:GIANT_COCKATIEL:SPLEEN -CREATURE:GIANT_COCKATIEL:KIDNEY -)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:MUSCLE -&CREATURE:BIRD_LOVEBIRD_PEACH-FACED:EYE -(CREATURE:BIRD_LOVEBIRD_PEACH-FACED:BRAIN -'CREATURE:BIRD_LOVEBIRD_PEACH-FACED:LUNG -(CREATURE:BIRD_LOVEBIRD_PEACH-FACED:HEART -(CREATURE:BIRD_LOVEBIRD_PEACH-FACED:LIVER -&CREATURE:BIRD_LOVEBIRD_PEACH-FACED:GUT -*CREATURE:BIRD_LOVEBIRD_PEACH-FACED:STOMACH -*CREATURE:BIRD_LOVEBIRD_PEACH-FACED:GIZZARD -+CREATURE:BIRD_LOVEBIRD_PEACH-FACED:PANCREAS -)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:SPLEEN -)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:KIDNEY -(CREATURE:PEACH-FACED_LOVEBIRD_MAN:MUSCLE -%CREATURE:PEACH-FACED_LOVEBIRD_MAN:EYE -'CREATURE:PEACH-FACED_LOVEBIRD_MAN:BRAIN -&CREATURE:PEACH-FACED_LOVEBIRD_MAN:LUNG -'CREATURE:PEACH-FACED_LOVEBIRD_MAN:HEART -'CREATURE:PEACH-FACED_LOVEBIRD_MAN:LIVER -%CREATURE:PEACH-FACED_LOVEBIRD_MAN:GUT -)CREATURE:PEACH-FACED_LOVEBIRD_MAN:STOMACH -)CREATURE:PEACH-FACED_LOVEBIRD_MAN:GIZZARD -*CREATURE:PEACH-FACED_LOVEBIRD_MAN:PANCREAS -(CREATURE:PEACH-FACED_LOVEBIRD_MAN:SPLEEN -(CREATURE:PEACH-FACED_LOVEBIRD_MAN:KIDNEY -*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:MUSCLE -'CREATURE:GIANT_PEACH-FACED_LOVEBIRD:EYE -)CREATURE:GIANT_PEACH-FACED_LOVEBIRD:BRAIN -(CREATURE:GIANT_PEACH-FACED_LOVEBIRD:LUNG -)CREATURE:GIANT_PEACH-FACED_LOVEBIRD:HEART -)CREATURE:GIANT_PEACH-FACED_LOVEBIRD:LIVER -'CREATURE:GIANT_PEACH-FACED_LOVEBIRD:GUT -+CREATURE:GIANT_PEACH-FACED_LOVEBIRD:STOMACH -+CREATURE:GIANT_PEACH-FACED_LOVEBIRD:GIZZARD -,CREATURE:GIANT_PEACH-FACED_LOVEBIRD:PANCREAS -*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:SPLEEN -*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:KIDNEY -CREATURE:BIRD_MAGPIE:MUSCLE -CREATURE:BIRD_MAGPIE:EYE -CREATURE:BIRD_MAGPIE:BRAIN -CREATURE:BIRD_MAGPIE:LUNG -CREATURE:BIRD_MAGPIE:HEART -CREATURE:BIRD_MAGPIE:LIVER -CREATURE:BIRD_MAGPIE:GUT -CREATURE:BIRD_MAGPIE:STOMACH -CREATURE:BIRD_MAGPIE:GIZZARD -CREATURE:BIRD_MAGPIE:PANCREAS -CREATURE:BIRD_MAGPIE:SPLEEN -CREATURE:BIRD_MAGPIE:KIDNEY -CREATURE:MAGPIE_MAN:MUSCLE -CREATURE:MAGPIE_MAN:EYE -CREATURE:MAGPIE_MAN:BRAIN -CREATURE:MAGPIE_MAN:LUNG -CREATURE:MAGPIE_MAN:HEART -CREATURE:MAGPIE_MAN:LIVER -CREATURE:MAGPIE_MAN:GUT -CREATURE:MAGPIE_MAN:STOMACH -CREATURE:MAGPIE_MAN:GIZZARD -CREATURE:MAGPIE_MAN:PANCREAS -CREATURE:MAGPIE_MAN:SPLEEN -CREATURE:MAGPIE_MAN:KIDNEY -CREATURE:GIANT_MAGPIE:MUSCLE -CREATURE:GIANT_MAGPIE:EYE -CREATURE:GIANT_MAGPIE:BRAIN -CREATURE:GIANT_MAGPIE:LUNG -CREATURE:GIANT_MAGPIE:HEART -CREATURE:GIANT_MAGPIE:LIVER -CREATURE:GIANT_MAGPIE:GUT -CREATURE:GIANT_MAGPIE:STOMACH -CREATURE:GIANT_MAGPIE:GIZZARD -CREATURE:GIANT_MAGPIE:PANCREAS -CREATURE:GIANT_MAGPIE:SPLEEN -CREATURE:GIANT_MAGPIE:KIDNEY -CREATURE:BIRD_KESTREL:MUSCLE -CREATURE:BIRD_KESTREL:EYE -CREATURE:BIRD_KESTREL:BRAIN -CREATURE:BIRD_KESTREL:LUNG -CREATURE:BIRD_KESTREL:HEART -CREATURE:BIRD_KESTREL:LIVER -CREATURE:BIRD_KESTREL:GUT -CREATURE:BIRD_KESTREL:STOMACH -CREATURE:BIRD_KESTREL:GIZZARD -CREATURE:BIRD_KESTREL:PANCREAS -CREATURE:BIRD_KESTREL:SPLEEN -CREATURE:BIRD_KESTREL:KIDNEY -CREATURE:KESTREL_MAN:MUSCLE -CREATURE:KESTREL_MAN:EYE -CREATURE:KESTREL_MAN:BRAIN -CREATURE:KESTREL_MAN:LUNG -CREATURE:KESTREL_MAN:HEART -CREATURE:KESTREL_MAN:LIVER -CREATURE:KESTREL_MAN:GUT -CREATURE:KESTREL_MAN:STOMACH -CREATURE:KESTREL_MAN:GIZZARD -CREATURE:KESTREL_MAN:PANCREAS -CREATURE:KESTREL_MAN:SPLEEN -CREATURE:KESTREL_MAN:KIDNEY -CREATURE:GIANT_KESTREL:MUSCLE -CREATURE:GIANT_KESTREL:EYE -CREATURE:GIANT_KESTREL:BRAIN -CREATURE:GIANT_KESTREL:LUNG -CREATURE:GIANT_KESTREL:HEART -CREATURE:GIANT_KESTREL:LIVER -CREATURE:GIANT_KESTREL:GUT -CREATURE:GIANT_KESTREL:STOMACH -CREATURE:GIANT_KESTREL:GIZZARD -CREATURE:GIANT_KESTREL:PANCREAS -CREATURE:GIANT_KESTREL:SPLEEN -CREATURE:GIANT_KESTREL:KIDNEY -CREATURE:BIRD_ALBATROSS:MUSCLE -CREATURE:BIRD_ALBATROSS:EYE -CREATURE:BIRD_ALBATROSS:BRAIN -CREATURE:BIRD_ALBATROSS:LUNG -CREATURE:BIRD_ALBATROSS:HEART -CREATURE:BIRD_ALBATROSS:LIVER -CREATURE:BIRD_ALBATROSS:GUT -CREATURE:BIRD_ALBATROSS:STOMACH -CREATURE:BIRD_ALBATROSS:GIZZARD - CREATURE:BIRD_ALBATROSS:PANCREAS -CREATURE:BIRD_ALBATROSS:SPLEEN -CREATURE:BIRD_ALBATROSS:KIDNEY -CREATURE:ALBATROSS_MAN:MUSCLE -CREATURE:ALBATROSS_MAN:EYE -CREATURE:ALBATROSS_MAN:BRAIN -CREATURE:ALBATROSS_MAN:LUNG -CREATURE:ALBATROSS_MAN:HEART -CREATURE:ALBATROSS_MAN:LIVER -CREATURE:ALBATROSS_MAN:GUT -CREATURE:ALBATROSS_MAN:STOMACH -CREATURE:ALBATROSS_MAN:GIZZARD -CREATURE:ALBATROSS_MAN:PANCREAS -CREATURE:ALBATROSS_MAN:SPLEEN -CREATURE:ALBATROSS_MAN:KIDNEY -CREATURE:GIANT_ALBATROSS:MUSCLE -CREATURE:GIANT_ALBATROSS:EYE -CREATURE:GIANT_ALBATROSS:BRAIN -CREATURE:GIANT_ALBATROSS:LUNG -CREATURE:GIANT_ALBATROSS:HEART -CREATURE:GIANT_ALBATROSS:LIVER -CREATURE:GIANT_ALBATROSS:GUT - CREATURE:GIANT_ALBATROSS:STOMACH - CREATURE:GIANT_ALBATROSS:GIZZARD -!CREATURE:GIANT_ALBATROSS:PANCREAS -CREATURE:GIANT_ALBATROSS:SPLEEN -CREATURE:GIANT_ALBATROSS:KIDNEY -%CREATURE:BIRD_OWL_GREAT_HORNED:MUSCLE -"CREATURE:BIRD_OWL_GREAT_HORNED:EYE -$CREATURE:BIRD_OWL_GREAT_HORNED:BRAIN -#CREATURE:BIRD_OWL_GREAT_HORNED:LUNG -$CREATURE:BIRD_OWL_GREAT_HORNED:HEART -$CREATURE:BIRD_OWL_GREAT_HORNED:LIVER -"CREATURE:BIRD_OWL_GREAT_HORNED:GUT -&CREATURE:BIRD_OWL_GREAT_HORNED:STOMACH -&CREATURE:BIRD_OWL_GREAT_HORNED:GIZZARD -'CREATURE:BIRD_OWL_GREAT_HORNED:PANCREAS -%CREATURE:BIRD_OWL_GREAT_HORNED:SPLEEN -%CREATURE:BIRD_OWL_GREAT_HORNED:KIDNEY -$CREATURE:GREAT_HORNED_OWL_MAN:MUSCLE -!CREATURE:GREAT_HORNED_OWL_MAN:EYE -#CREATURE:GREAT_HORNED_OWL_MAN:BRAIN -"CREATURE:GREAT_HORNED_OWL_MAN:LUNG -#CREATURE:GREAT_HORNED_OWL_MAN:HEART -#CREATURE:GREAT_HORNED_OWL_MAN:LIVER -!CREATURE:GREAT_HORNED_OWL_MAN:GUT -%CREATURE:GREAT_HORNED_OWL_MAN:STOMACH -%CREATURE:GREAT_HORNED_OWL_MAN:GIZZARD -&CREATURE:GREAT_HORNED_OWL_MAN:PANCREAS -$CREATURE:GREAT_HORNED_OWL_MAN:SPLEEN -$CREATURE:GREAT_HORNED_OWL_MAN:KIDNEY -&CREATURE:GIANT_GREAT_HORNED_OWL:MUSCLE -#CREATURE:GIANT_GREAT_HORNED_OWL:EYE -%CREATURE:GIANT_GREAT_HORNED_OWL:BRAIN -$CREATURE:GIANT_GREAT_HORNED_OWL:LUNG -%CREATURE:GIANT_GREAT_HORNED_OWL:HEART -%CREATURE:GIANT_GREAT_HORNED_OWL:LIVER -#CREATURE:GIANT_GREAT_HORNED_OWL:GUT -'CREATURE:GIANT_GREAT_HORNED_OWL:STOMACH -'CREATURE:GIANT_GREAT_HORNED_OWL:GIZZARD -(CREATURE:GIANT_GREAT_HORNED_OWL:PANCREAS -&CREATURE:GIANT_GREAT_HORNED_OWL:SPLEEN -&CREATURE:GIANT_GREAT_HORNED_OWL:KIDNEY -CREATURE:BIRD_EAGLE:MUSCLE -CREATURE:BIRD_EAGLE:EYE -CREATURE:BIRD_EAGLE:BRAIN -CREATURE:BIRD_EAGLE:LUNG -CREATURE:BIRD_EAGLE:HEART -CREATURE:BIRD_EAGLE:LIVER -CREATURE:BIRD_EAGLE:GUT -CREATURE:BIRD_EAGLE:STOMACH -CREATURE:BIRD_EAGLE:GIZZARD -CREATURE:BIRD_EAGLE:PANCREAS -CREATURE:BIRD_EAGLE:SPLEEN -CREATURE:BIRD_EAGLE:KIDNEY -CREATURE:EAGLE_MAN:MUSCLE -CREATURE:EAGLE_MAN:EYE -CREATURE:EAGLE_MAN:BRAIN -CREATURE:EAGLE_MAN:LUNG -CREATURE:EAGLE_MAN:HEART -CREATURE:EAGLE_MAN:LIVER -CREATURE:EAGLE_MAN:GUT -CREATURE:EAGLE_MAN:STOMACH -CREATURE:EAGLE_MAN:GIZZARD -CREATURE:EAGLE_MAN:PANCREAS -CREATURE:EAGLE_MAN:SPLEEN -CREATURE:EAGLE_MAN:KIDNEY -CREATURE:GIANT_EAGLE:MUSCLE -CREATURE:GIANT_EAGLE:EYE -CREATURE:GIANT_EAGLE:BRAIN -CREATURE:GIANT_EAGLE:LUNG -CREATURE:GIANT_EAGLE:HEART -CREATURE:GIANT_EAGLE:LIVER -CREATURE:GIANT_EAGLE:GUT -CREATURE:GIANT_EAGLE:STOMACH -CREATURE:GIANT_EAGLE:GIZZARD -CREATURE:GIANT_EAGLE:PANCREAS -CREATURE:GIANT_EAGLE:SPLEEN -CREATURE:GIANT_EAGLE:KIDNEY -CREATURE:BIRD_HORNBILL:MUSCLE -CREATURE:BIRD_HORNBILL:EYE -CREATURE:BIRD_HORNBILL:BRAIN -CREATURE:BIRD_HORNBILL:LUNG -CREATURE:BIRD_HORNBILL:HEART -CREATURE:BIRD_HORNBILL:LIVER -CREATURE:BIRD_HORNBILL:GUT -CREATURE:BIRD_HORNBILL:STOMACH -CREATURE:BIRD_HORNBILL:GIZZARD -CREATURE:BIRD_HORNBILL:PANCREAS -CREATURE:BIRD_HORNBILL:SPLEEN -CREATURE:BIRD_HORNBILL:KIDNEY -CREATURE:HORNBILL_MAN:MUSCLE -CREATURE:HORNBILL_MAN:EYE -CREATURE:HORNBILL_MAN:BRAIN -CREATURE:HORNBILL_MAN:LUNG -CREATURE:HORNBILL_MAN:HEART -CREATURE:HORNBILL_MAN:LIVER -CREATURE:HORNBILL_MAN:GUT -CREATURE:HORNBILL_MAN:STOMACH -CREATURE:HORNBILL_MAN:GIZZARD -CREATURE:HORNBILL_MAN:PANCREAS -CREATURE:HORNBILL_MAN:SPLEEN -CREATURE:HORNBILL_MAN:KIDNEY -CREATURE:GIANT_HORNBILL:MUSCLE -CREATURE:GIANT_HORNBILL:EYE -CREATURE:GIANT_HORNBILL:BRAIN -CREATURE:GIANT_HORNBILL:LUNG -CREATURE:GIANT_HORNBILL:HEART -CREATURE:GIANT_HORNBILL:LIVER -CREATURE:GIANT_HORNBILL:GUT -CREATURE:GIANT_HORNBILL:STOMACH -CREATURE:GIANT_HORNBILL:GIZZARD - CREATURE:GIANT_HORNBILL:PANCREAS -CREATURE:GIANT_HORNBILL:SPLEEN -CREATURE:GIANT_HORNBILL:KIDNEY -$CREATURE:BIRD_LOVEBIRD_MASKED:MUSCLE -!CREATURE:BIRD_LOVEBIRD_MASKED:EYE -#CREATURE:BIRD_LOVEBIRD_MASKED:BRAIN -"CREATURE:BIRD_LOVEBIRD_MASKED:LUNG -#CREATURE:BIRD_LOVEBIRD_MASKED:HEART -#CREATURE:BIRD_LOVEBIRD_MASKED:LIVER -!CREATURE:BIRD_LOVEBIRD_MASKED:GUT -%CREATURE:BIRD_LOVEBIRD_MASKED:STOMACH -%CREATURE:BIRD_LOVEBIRD_MASKED:GIZZARD -&CREATURE:BIRD_LOVEBIRD_MASKED:PANCREAS -$CREATURE:BIRD_LOVEBIRD_MASKED:SPLEEN -$CREATURE:BIRD_LOVEBIRD_MASKED:KIDNEY -#CREATURE:MASKED_LOVEBIRD_MAN:MUSCLE - CREATURE:MASKED_LOVEBIRD_MAN:EYE -"CREATURE:MASKED_LOVEBIRD_MAN:BRAIN -!CREATURE:MASKED_LOVEBIRD_MAN:LUNG -"CREATURE:MASKED_LOVEBIRD_MAN:HEART -"CREATURE:MASKED_LOVEBIRD_MAN:LIVER - CREATURE:MASKED_LOVEBIRD_MAN:GUT -$CREATURE:MASKED_LOVEBIRD_MAN:STOMACH -$CREATURE:MASKED_LOVEBIRD_MAN:GIZZARD -%CREATURE:MASKED_LOVEBIRD_MAN:PANCREAS -#CREATURE:MASKED_LOVEBIRD_MAN:SPLEEN -#CREATURE:MASKED_LOVEBIRD_MAN:KIDNEY -%CREATURE:GIANT_MASKED_LOVEBIRD:MUSCLE -"CREATURE:GIANT_MASKED_LOVEBIRD:EYE -$CREATURE:GIANT_MASKED_LOVEBIRD:BRAIN -#CREATURE:GIANT_MASKED_LOVEBIRD:LUNG -$CREATURE:GIANT_MASKED_LOVEBIRD:HEART -$CREATURE:GIANT_MASKED_LOVEBIRD:LIVER -"CREATURE:GIANT_MASKED_LOVEBIRD:GUT -&CREATURE:GIANT_MASKED_LOVEBIRD:STOMACH -&CREATURE:GIANT_MASKED_LOVEBIRD:GIZZARD -'CREATURE:GIANT_MASKED_LOVEBIRD:PANCREAS -%CREATURE:GIANT_MASKED_LOVEBIRD:SPLEEN -%CREATURE:GIANT_MASKED_LOVEBIRD:KIDNEY -CREATURE:BIRD_BUSHTIT:MUSCLE -CREATURE:BIRD_BUSHTIT:EYE -CREATURE:BIRD_BUSHTIT:BRAIN -CREATURE:BIRD_BUSHTIT:LUNG -CREATURE:BIRD_BUSHTIT:HEART -CREATURE:BIRD_BUSHTIT:LIVER -CREATURE:BIRD_BUSHTIT:GUT -CREATURE:BIRD_BUSHTIT:STOMACH -CREATURE:BIRD_BUSHTIT:GIZZARD -CREATURE:BIRD_BUSHTIT:PANCREAS -CREATURE:BIRD_BUSHTIT:SPLEEN -CREATURE:BIRD_BUSHTIT:KIDNEY -CREATURE:BUSHTIT_MAN:MUSCLE -CREATURE:BUSHTIT_MAN:EYE -CREATURE:BUSHTIT_MAN:BRAIN -CREATURE:BUSHTIT_MAN:LUNG -CREATURE:BUSHTIT_MAN:HEART -CREATURE:BUSHTIT_MAN:LIVER -CREATURE:BUSHTIT_MAN:GUT -CREATURE:BUSHTIT_MAN:STOMACH -CREATURE:BUSHTIT_MAN:GIZZARD -CREATURE:BUSHTIT_MAN:PANCREAS -CREATURE:BUSHTIT_MAN:SPLEEN -CREATURE:BUSHTIT_MAN:KIDNEY -CREATURE:GIANT_BUSHTIT:MUSCLE -CREATURE:GIANT_BUSHTIT:EYE -CREATURE:GIANT_BUSHTIT:BRAIN -CREATURE:GIANT_BUSHTIT:LUNG -CREATURE:GIANT_BUSHTIT:HEART -CREATURE:GIANT_BUSHTIT:LIVER -CREATURE:GIANT_BUSHTIT:GUT -CREATURE:GIANT_BUSHTIT:STOMACH -CREATURE:GIANT_BUSHTIT:GIZZARD -CREATURE:GIANT_BUSHTIT:PANCREAS -CREATURE:GIANT_BUSHTIT:SPLEEN -CREATURE:GIANT_BUSHTIT:KIDNEY -CREATURE:DAMSELFLY:MUSCLE -CREATURE:DAMSELFLY:EYE -CREATURE:DAMSELFLY:BRAIN -CREATURE:DAMSELFLY:LUNG -CREATURE:DAMSELFLY:HEART -CREATURE:DAMSELFLY:LIVER -CREATURE:DAMSELFLY:GUT -CREATURE:DAMSELFLY:STOMACH -CREATURE:DAMSELFLY:GIZZARD -CREATURE:DAMSELFLY:PANCREAS -CREATURE:DAMSELFLY:SPLEEN -CREATURE:DAMSELFLY:KIDNEY -CREATURE:DAMSELFLY_MAN:MUSCLE -CREATURE:DAMSELFLY_MAN:EYE -CREATURE:DAMSELFLY_MAN:BRAIN -CREATURE:DAMSELFLY_MAN:LUNG -CREATURE:DAMSELFLY_MAN:HEART -CREATURE:DAMSELFLY_MAN:LIVER -CREATURE:DAMSELFLY_MAN:GUT -CREATURE:DAMSELFLY_MAN:STOMACH -CREATURE:DAMSELFLY_MAN:GIZZARD -CREATURE:DAMSELFLY_MAN:PANCREAS -CREATURE:DAMSELFLY_MAN:SPLEEN -CREATURE:DAMSELFLY_MAN:KIDNEY -CREATURE:GIANT_DAMSELFLY:MUSCLE -CREATURE:GIANT_DAMSELFLY:EYE -CREATURE:GIANT_DAMSELFLY:BRAIN -CREATURE:GIANT_DAMSELFLY:LUNG -CREATURE:GIANT_DAMSELFLY:HEART -CREATURE:GIANT_DAMSELFLY:LIVER -CREATURE:GIANT_DAMSELFLY:GUT - CREATURE:GIANT_DAMSELFLY:STOMACH - CREATURE:GIANT_DAMSELFLY:GIZZARD -!CREATURE:GIANT_DAMSELFLY:PANCREAS -CREATURE:GIANT_DAMSELFLY:SPLEEN -CREATURE:GIANT_DAMSELFLY:KIDNEY -CREATURE:MOTH:MUSCLE -CREATURE:MOTH:EYE -CREATURE:MOTH:BRAIN -CREATURE:MOTH:LUNG -CREATURE:MOTH:HEART -CREATURE:MOTH:LIVER -CREATURE:MOTH:GUT -CREATURE:MOTH:STOMACH -CREATURE:MOTH:GIZZARD -CREATURE:MOTH:PANCREAS -CREATURE:MOTH:SPLEEN -CREATURE:MOTH:KIDNEY -CREATURE:MOTH_MAN:MUSCLE -CREATURE:MOTH_MAN:EYE -CREATURE:MOTH_MAN:BRAIN -CREATURE:MOTH_MAN:LUNG -CREATURE:MOTH_MAN:HEART -CREATURE:MOTH_MAN:LIVER -CREATURE:MOTH_MAN:GUT -CREATURE:MOTH_MAN:STOMACH -CREATURE:MOTH_MAN:GIZZARD -CREATURE:MOTH_MAN:PANCREAS -CREATURE:MOTH_MAN:SPLEEN -CREATURE:MOTH_MAN:KIDNEY -CREATURE:GIANT_MOTH:MUSCLE -CREATURE:GIANT_MOTH:EYE -CREATURE:GIANT_MOTH:BRAIN -CREATURE:GIANT_MOTH:LUNG -CREATURE:GIANT_MOTH:HEART -CREATURE:GIANT_MOTH:LIVER -CREATURE:GIANT_MOTH:GUT -CREATURE:GIANT_MOTH:STOMACH -CREATURE:GIANT_MOTH:GIZZARD -CREATURE:GIANT_MOTH:PANCREAS -CREATURE:GIANT_MOTH:SPLEEN -CREATURE:GIANT_MOTH:KIDNEY -CREATURE:GRASSHOPPER:MUSCLE -CREATURE:GRASSHOPPER:EYE -CREATURE:GRASSHOPPER:BRAIN -CREATURE:GRASSHOPPER:LUNG -CREATURE:GRASSHOPPER:HEART -CREATURE:GRASSHOPPER:LIVER -CREATURE:GRASSHOPPER:GUT -CREATURE:GRASSHOPPER:STOMACH -CREATURE:GRASSHOPPER:GIZZARD -CREATURE:GRASSHOPPER:PANCREAS -CREATURE:GRASSHOPPER:SPLEEN -CREATURE:GRASSHOPPER:KIDNEY -CREATURE:GRASSHOPPER_MAN:MUSCLE -CREATURE:GRASSHOPPER_MAN:EYE -CREATURE:GRASSHOPPER_MAN:BRAIN -CREATURE:GRASSHOPPER_MAN:LUNG -CREATURE:GRASSHOPPER_MAN:HEART -CREATURE:GRASSHOPPER_MAN:LIVER -CREATURE:GRASSHOPPER_MAN:GUT - CREATURE:GRASSHOPPER_MAN:STOMACH - CREATURE:GRASSHOPPER_MAN:GIZZARD -!CREATURE:GRASSHOPPER_MAN:PANCREAS -CREATURE:GRASSHOPPER_MAN:SPLEEN -CREATURE:GRASSHOPPER_MAN:KIDNEY -!CREATURE:GIANT_GRASSHOPPER:MUSCLE -CREATURE:GIANT_GRASSHOPPER:EYE - CREATURE:GIANT_GRASSHOPPER:BRAIN -CREATURE:GIANT_GRASSHOPPER:LUNG - CREATURE:GIANT_GRASSHOPPER:HEART - CREATURE:GIANT_GRASSHOPPER:LIVER -CREATURE:GIANT_GRASSHOPPER:GUT -"CREATURE:GIANT_GRASSHOPPER:STOMACH -"CREATURE:GIANT_GRASSHOPPER:GIZZARD -#CREATURE:GIANT_GRASSHOPPER:PANCREAS -!CREATURE:GIANT_GRASSHOPPER:SPLEEN -!CREATURE:GIANT_GRASSHOPPER:KIDNEY -CREATURE:BARK_SCORPION:MUSCLE -CREATURE:BARK_SCORPION:EYE -CREATURE:BARK_SCORPION:BRAIN -CREATURE:BARK_SCORPION:LUNG -CREATURE:BARK_SCORPION:HEART -CREATURE:BARK_SCORPION:LIVER -CREATURE:BARK_SCORPION:GUT -CREATURE:BARK_SCORPION:STOMACH -CREATURE:BARK_SCORPION:GIZZARD -CREATURE:BARK_SCORPION:PANCREAS -CREATURE:BARK_SCORPION:SPLEEN -CREATURE:BARK_SCORPION:KIDNEY -!CREATURE:BARK_SCORPION_MAN:MUSCLE -CREATURE:BARK_SCORPION_MAN:EYE - CREATURE:BARK_SCORPION_MAN:BRAIN -CREATURE:BARK_SCORPION_MAN:LUNG - CREATURE:BARK_SCORPION_MAN:HEART - CREATURE:BARK_SCORPION_MAN:LIVER -CREATURE:BARK_SCORPION_MAN:GUT -"CREATURE:BARK_SCORPION_MAN:STOMACH -"CREATURE:BARK_SCORPION_MAN:GIZZARD -#CREATURE:BARK_SCORPION_MAN:PANCREAS -!CREATURE:BARK_SCORPION_MAN:SPLEEN -!CREATURE:BARK_SCORPION_MAN:KIDNEY -#CREATURE:GIANT_BARK_SCORPION:MUSCLE - CREATURE:GIANT_BARK_SCORPION:EYE -"CREATURE:GIANT_BARK_SCORPION:BRAIN -!CREATURE:GIANT_BARK_SCORPION:LUNG -"CREATURE:GIANT_BARK_SCORPION:HEART -"CREATURE:GIANT_BARK_SCORPION:LIVER - CREATURE:GIANT_BARK_SCORPION:GUT -$CREATURE:GIANT_BARK_SCORPION:STOMACH -$CREATURE:GIANT_BARK_SCORPION:GIZZARD -%CREATURE:GIANT_BARK_SCORPION:PANCREAS -#CREATURE:GIANT_BARK_SCORPION:SPLEEN -#CREATURE:GIANT_BARK_SCORPION:KIDNEY -CREATURE:MANTIS:MUSCLE -CREATURE:MANTIS:EYE -CREATURE:MANTIS:BRAIN -CREATURE:MANTIS:LUNG -CREATURE:MANTIS:HEART -CREATURE:MANTIS:LIVER -CREATURE:MANTIS:GUT -CREATURE:MANTIS:STOMACH -CREATURE:MANTIS:GIZZARD -CREATURE:MANTIS:PANCREAS -CREATURE:MANTIS:SPLEEN -CREATURE:MANTIS:KIDNEY -CREATURE:MANTIS_MAN:MUSCLE -CREATURE:MANTIS_MAN:EYE -CREATURE:MANTIS_MAN:BRAIN -CREATURE:MANTIS_MAN:LUNG -CREATURE:MANTIS_MAN:HEART -CREATURE:MANTIS_MAN:LIVER -CREATURE:MANTIS_MAN:GUT -CREATURE:MANTIS_MAN:STOMACH -CREATURE:MANTIS_MAN:GIZZARD -CREATURE:MANTIS_MAN:PANCREAS -CREATURE:MANTIS_MAN:SPLEEN -CREATURE:MANTIS_MAN:KIDNEY -CREATURE:GIANT_MANTIS:MUSCLE -CREATURE:GIANT_MANTIS:EYE -CREATURE:GIANT_MANTIS:BRAIN -CREATURE:GIANT_MANTIS:LUNG -CREATURE:GIANT_MANTIS:HEART -CREATURE:GIANT_MANTIS:LIVER -CREATURE:GIANT_MANTIS:GUT -CREATURE:GIANT_MANTIS:STOMACH -CREATURE:GIANT_MANTIS:GIZZARD -CREATURE:GIANT_MANTIS:PANCREAS -CREATURE:GIANT_MANTIS:SPLEEN -CREATURE:GIANT_MANTIS:KIDNEY -CREATURE:TICK:MUSCLE -CREATURE:TICK:EYE -CREATURE:TICK:BRAIN -CREATURE:TICK:LUNG -CREATURE:TICK:HEART -CREATURE:TICK:LIVER -CREATURE:TICK:GUT -CREATURE:TICK:STOMACH -CREATURE:TICK:GIZZARD -CREATURE:TICK:PANCREAS -CREATURE:TICK:SPLEEN -CREATURE:TICK:KIDNEY -CREATURE:TICK_MAN:MUSCLE -CREATURE:TICK_MAN:EYE -CREATURE:TICK_MAN:BRAIN -CREATURE:TICK_MAN:LUNG -CREATURE:TICK_MAN:HEART -CREATURE:TICK_MAN:LIVER -CREATURE:TICK_MAN:GUT -CREATURE:TICK_MAN:STOMACH -CREATURE:TICK_MAN:GIZZARD -CREATURE:TICK_MAN:PANCREAS -CREATURE:TICK_MAN:SPLEEN -CREATURE:TICK_MAN:KIDNEY -CREATURE:GIANT_TICK:MUSCLE -CREATURE:GIANT_TICK:EYE -CREATURE:GIANT_TICK:BRAIN -CREATURE:GIANT_TICK:LUNG -CREATURE:GIANT_TICK:HEART -CREATURE:GIANT_TICK:LIVER -CREATURE:GIANT_TICK:GUT -CREATURE:GIANT_TICK:STOMACH -CREATURE:GIANT_TICK:GIZZARD -CREATURE:GIANT_TICK:PANCREAS -CREATURE:GIANT_TICK:SPLEEN -CREATURE:GIANT_TICK:KIDNEY -CREATURE:LOUSE:MUSCLE -CREATURE:LOUSE:EYE -CREATURE:LOUSE:BRAIN -CREATURE:LOUSE:LUNG -CREATURE:LOUSE:HEART -CREATURE:LOUSE:LIVER -CREATURE:LOUSE:GUT -CREATURE:LOUSE:STOMACH -CREATURE:LOUSE:GIZZARD -CREATURE:LOUSE:PANCREAS -CREATURE:LOUSE:SPLEEN -CREATURE:LOUSE:KIDNEY -CREATURE:LOUSE_MAN:MUSCLE -CREATURE:LOUSE_MAN:EYE -CREATURE:LOUSE_MAN:BRAIN -CREATURE:LOUSE_MAN:LUNG -CREATURE:LOUSE_MAN:HEART -CREATURE:LOUSE_MAN:LIVER -CREATURE:LOUSE_MAN:GUT -CREATURE:LOUSE_MAN:STOMACH -CREATURE:LOUSE_MAN:GIZZARD -CREATURE:LOUSE_MAN:PANCREAS -CREATURE:LOUSE_MAN:SPLEEN -CREATURE:LOUSE_MAN:KIDNEY -CREATURE:GIANT_LOUSE:MUSCLE -CREATURE:GIANT_LOUSE:EYE -CREATURE:GIANT_LOUSE:BRAIN -CREATURE:GIANT_LOUSE:LUNG -CREATURE:GIANT_LOUSE:HEART -CREATURE:GIANT_LOUSE:LIVER -CREATURE:GIANT_LOUSE:GUT -CREATURE:GIANT_LOUSE:STOMACH -CREATURE:GIANT_LOUSE:GIZZARD -CREATURE:GIANT_LOUSE:PANCREAS -CREATURE:GIANT_LOUSE:SPLEEN -CREATURE:GIANT_LOUSE:KIDNEY -CREATURE:THRIPS:MUSCLE -CREATURE:THRIPS:EYE -CREATURE:THRIPS:BRAIN -CREATURE:THRIPS:LUNG -CREATURE:THRIPS:HEART -CREATURE:THRIPS:LIVER -CREATURE:THRIPS:GUT -CREATURE:THRIPS:STOMACH -CREATURE:THRIPS:GIZZARD -CREATURE:THRIPS:PANCREAS -CREATURE:THRIPS:SPLEEN -CREATURE:THRIPS:KIDNEY -CREATURE:THRIPS_MAN:MUSCLE -CREATURE:THRIPS_MAN:EYE -CREATURE:THRIPS_MAN:BRAIN -CREATURE:THRIPS_MAN:LUNG -CREATURE:THRIPS_MAN:HEART -CREATURE:THRIPS_MAN:LIVER -CREATURE:THRIPS_MAN:GUT -CREATURE:THRIPS_MAN:STOMACH -CREATURE:THRIPS_MAN:GIZZARD -CREATURE:THRIPS_MAN:PANCREAS -CREATURE:THRIPS_MAN:SPLEEN -CREATURE:THRIPS_MAN:KIDNEY -CREATURE:GIANT_THRIPS:MUSCLE -CREATURE:GIANT_THRIPS:EYE -CREATURE:GIANT_THRIPS:BRAIN -CREATURE:GIANT_THRIPS:LUNG -CREATURE:GIANT_THRIPS:HEART -CREATURE:GIANT_THRIPS:LIVER -CREATURE:GIANT_THRIPS:GUT -CREATURE:GIANT_THRIPS:STOMACH -CREATURE:GIANT_THRIPS:GIZZARD -CREATURE:GIANT_THRIPS:PANCREAS -CREATURE:GIANT_THRIPS:SPLEEN -CREATURE:GIANT_THRIPS:KIDNEY -CREATURE:SLUG:MUSCLE -CREATURE:SLUG:EYE -CREATURE:SLUG:BRAIN -CREATURE:SLUG:LUNG -CREATURE:SLUG:HEART -CREATURE:SLUG:LIVER -CREATURE:SLUG:GUT -CREATURE:SLUG:STOMACH -CREATURE:SLUG:GIZZARD -CREATURE:SLUG:PANCREAS -CREATURE:SLUG:SPLEEN -CREATURE:SLUG:KIDNEY -CREATURE:SLUG_MAN:MUSCLE -CREATURE:SLUG_MAN:EYE -CREATURE:SLUG_MAN:BRAIN -CREATURE:SLUG_MAN:LUNG -CREATURE:SLUG_MAN:HEART -CREATURE:SLUG_MAN:LIVER -CREATURE:SLUG_MAN:GUT -CREATURE:SLUG_MAN:STOMACH -CREATURE:SLUG_MAN:GIZZARD -CREATURE:SLUG_MAN:PANCREAS -CREATURE:SLUG_MAN:SPLEEN -CREATURE:SLUG_MAN:KIDNEY -CREATURE:GIANT_SLUG:MUSCLE -CREATURE:GIANT_SLUG:EYE -CREATURE:GIANT_SLUG:BRAIN -CREATURE:GIANT_SLUG:LUNG -CREATURE:GIANT_SLUG:HEART -CREATURE:GIANT_SLUG:LIVER -CREATURE:GIANT_SLUG:GUT -CREATURE:GIANT_SLUG:STOMACH -CREATURE:GIANT_SLUG:GIZZARD -CREATURE:GIANT_SLUG:PANCREAS -CREATURE:GIANT_SLUG:SPLEEN -CREATURE:GIANT_SLUG:KIDNEY -CREATURE:MOSQUITO:MUSCLE -CREATURE:MOSQUITO:EYE -CREATURE:MOSQUITO:BRAIN -CREATURE:MOSQUITO:LUNG -CREATURE:MOSQUITO:HEART -CREATURE:MOSQUITO:LIVER -CREATURE:MOSQUITO:GUT -CREATURE:MOSQUITO:STOMACH -CREATURE:MOSQUITO:GIZZARD -CREATURE:MOSQUITO:PANCREAS -CREATURE:MOSQUITO:SPLEEN -CREATURE:MOSQUITO:KIDNEY -CREATURE:MOSQUITO_MAN:MUSCLE -CREATURE:MOSQUITO_MAN:EYE -CREATURE:MOSQUITO_MAN:BRAIN -CREATURE:MOSQUITO_MAN:LUNG -CREATURE:MOSQUITO_MAN:HEART -CREATURE:MOSQUITO_MAN:LIVER -CREATURE:MOSQUITO_MAN:GUT -CREATURE:MOSQUITO_MAN:STOMACH -CREATURE:MOSQUITO_MAN:GIZZARD -CREATURE:MOSQUITO_MAN:PANCREAS -CREATURE:MOSQUITO_MAN:SPLEEN -CREATURE:MOSQUITO_MAN:KIDNEY -CREATURE:GIANT_MOSQUITO:MUSCLE -CREATURE:GIANT_MOSQUITO:EYE -CREATURE:GIANT_MOSQUITO:BRAIN -CREATURE:GIANT_MOSQUITO:LUNG -CREATURE:GIANT_MOSQUITO:HEART -CREATURE:GIANT_MOSQUITO:LIVER -CREATURE:GIANT_MOSQUITO:GUT -CREATURE:GIANT_MOSQUITO:STOMACH -CREATURE:GIANT_MOSQUITO:GIZZARD - CREATURE:GIANT_MOSQUITO:PANCREAS -CREATURE:GIANT_MOSQUITO:SPLEEN -CREATURE:GIANT_MOSQUITO:KIDNEY -CREATURE:SPIDER_JUMPING:MUSCLE -CREATURE:SPIDER_JUMPING:EYE -CREATURE:SPIDER_JUMPING:BRAIN -CREATURE:SPIDER_JUMPING:LUNG -CREATURE:SPIDER_JUMPING:HEART -CREATURE:SPIDER_JUMPING:LIVER -CREATURE:SPIDER_JUMPING:GUT -CREATURE:SPIDER_JUMPING:STOMACH -CREATURE:SPIDER_JUMPING:GIZZARD - CREATURE:SPIDER_JUMPING:PANCREAS -CREATURE:SPIDER_JUMPING:SPLEEN -CREATURE:SPIDER_JUMPING:KIDNEY -"CREATURE:JUMPING_SPIDER_MAN:MUSCLE -CREATURE:JUMPING_SPIDER_MAN:EYE -!CREATURE:JUMPING_SPIDER_MAN:BRAIN - CREATURE:JUMPING_SPIDER_MAN:LUNG -!CREATURE:JUMPING_SPIDER_MAN:HEART -!CREATURE:JUMPING_SPIDER_MAN:LIVER -CREATURE:JUMPING_SPIDER_MAN:GUT -#CREATURE:JUMPING_SPIDER_MAN:STOMACH -#CREATURE:JUMPING_SPIDER_MAN:GIZZARD -$CREATURE:JUMPING_SPIDER_MAN:PANCREAS -"CREATURE:JUMPING_SPIDER_MAN:SPLEEN -"CREATURE:JUMPING_SPIDER_MAN:KIDNEY -$CREATURE:GIANT_JUMPING_SPIDER:MUSCLE -!CREATURE:GIANT_JUMPING_SPIDER:EYE -#CREATURE:GIANT_JUMPING_SPIDER:BRAIN -"CREATURE:GIANT_JUMPING_SPIDER:LUNG -#CREATURE:GIANT_JUMPING_SPIDER:HEART -#CREATURE:GIANT_JUMPING_SPIDER:LIVER -!CREATURE:GIANT_JUMPING_SPIDER:GUT -%CREATURE:GIANT_JUMPING_SPIDER:STOMACH -%CREATURE:GIANT_JUMPING_SPIDER:GIZZARD -&CREATURE:GIANT_JUMPING_SPIDER:PANCREAS -$CREATURE:GIANT_JUMPING_SPIDER:SPLEEN -$CREATURE:GIANT_JUMPING_SPIDER:KIDNEY -CREATURE:TERMITE:MUSCLE -CREATURE:TERMITE:EYE -CREATURE:TERMITE:BRAIN -CREATURE:TERMITE:LUNG -CREATURE:TERMITE:HEART -CREATURE:TERMITE:LIVER -CREATURE:TERMITE:GUT -CREATURE:TERMITE:STOMACH -CREATURE:TERMITE:GIZZARD -CREATURE:TERMITE:PANCREAS -CREATURE:TERMITE:SPLEEN -CREATURE:TERMITE:KIDNEY -CREATURE:MOON_SNAIL:MUSCLE -CREATURE:MOON_SNAIL:EYE -CREATURE:MOON_SNAIL:BRAIN -CREATURE:MOON_SNAIL:LUNG -CREATURE:MOON_SNAIL:HEART -CREATURE:MOON_SNAIL:LIVER -CREATURE:MOON_SNAIL:GUT -CREATURE:MOON_SNAIL:STOMACH -CREATURE:MOON_SNAIL:GIZZARD -CREATURE:MOON_SNAIL:PANCREAS -CREATURE:MOON_SNAIL:SPLEEN -CREATURE:MOON_SNAIL:KIDNEY -CREATURE:MOON_SNAIL_MAN:MUSCLE -CREATURE:MOON_SNAIL_MAN:EYE -CREATURE:MOON_SNAIL_MAN:BRAIN -CREATURE:MOON_SNAIL_MAN:LUNG -CREATURE:MOON_SNAIL_MAN:HEART -CREATURE:MOON_SNAIL_MAN:LIVER -CREATURE:MOON_SNAIL_MAN:GUT -CREATURE:MOON_SNAIL_MAN:STOMACH -CREATURE:MOON_SNAIL_MAN:GIZZARD - CREATURE:MOON_SNAIL_MAN:PANCREAS -CREATURE:MOON_SNAIL_MAN:SPLEEN -CREATURE:MOON_SNAIL_MAN:KIDNEY - CREATURE:GIANT_MOON_SNAIL:MUSCLE -CREATURE:GIANT_MOON_SNAIL:EYE -CREATURE:GIANT_MOON_SNAIL:BRAIN -CREATURE:GIANT_MOON_SNAIL:LUNG -CREATURE:GIANT_MOON_SNAIL:HEART -CREATURE:GIANT_MOON_SNAIL:LIVER -CREATURE:GIANT_MOON_SNAIL:GUT -!CREATURE:GIANT_MOON_SNAIL:STOMACH -!CREATURE:GIANT_MOON_SNAIL:GIZZARD -"CREATURE:GIANT_MOON_SNAIL:PANCREAS - CREATURE:GIANT_MOON_SNAIL:SPLEEN - CREATURE:GIANT_MOON_SNAIL:KIDNEY -$CREATURE:SPIDER_BROWN_RECLUSE:MUSCLE -!CREATURE:SPIDER_BROWN_RECLUSE:EYE -#CREATURE:SPIDER_BROWN_RECLUSE:BRAIN -"CREATURE:SPIDER_BROWN_RECLUSE:LUNG -#CREATURE:SPIDER_BROWN_RECLUSE:HEART -#CREATURE:SPIDER_BROWN_RECLUSE:LIVER -!CREATURE:SPIDER_BROWN_RECLUSE:GUT -%CREATURE:SPIDER_BROWN_RECLUSE:STOMACH -%CREATURE:SPIDER_BROWN_RECLUSE:GIZZARD -&CREATURE:SPIDER_BROWN_RECLUSE:PANCREAS -$CREATURE:SPIDER_BROWN_RECLUSE:SPLEEN -$CREATURE:SPIDER_BROWN_RECLUSE:KIDNEY -(CREATURE:BROWN_RECLUSE_SPIDER_MAN:MUSCLE -%CREATURE:BROWN_RECLUSE_SPIDER_MAN:EYE -'CREATURE:BROWN_RECLUSE_SPIDER_MAN:BRAIN -&CREATURE:BROWN_RECLUSE_SPIDER_MAN:LUNG -'CREATURE:BROWN_RECLUSE_SPIDER_MAN:HEART -'CREATURE:BROWN_RECLUSE_SPIDER_MAN:LIVER -%CREATURE:BROWN_RECLUSE_SPIDER_MAN:GUT -)CREATURE:BROWN_RECLUSE_SPIDER_MAN:STOMACH -)CREATURE:BROWN_RECLUSE_SPIDER_MAN:GIZZARD -*CREATURE:BROWN_RECLUSE_SPIDER_MAN:PANCREAS -(CREATURE:BROWN_RECLUSE_SPIDER_MAN:SPLEEN -(CREATURE:BROWN_RECLUSE_SPIDER_MAN:KIDNEY -*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:MUSCLE -'CREATURE:GIANT_BROWN_RECLUSE_SPIDER:EYE -)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:BRAIN -(CREATURE:GIANT_BROWN_RECLUSE_SPIDER:LUNG -)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:HEART -)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:LIVER -'CREATURE:GIANT_BROWN_RECLUSE_SPIDER:GUT -+CREATURE:GIANT_BROWN_RECLUSE_SPIDER:STOMACH -+CREATURE:GIANT_BROWN_RECLUSE_SPIDER:GIZZARD -,CREATURE:GIANT_BROWN_RECLUSE_SPIDER:PANCREAS -*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:SPLEEN -*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:KIDNEY -CREATURE:SNAIL:MUSCLE -CREATURE:SNAIL:EYE -CREATURE:SNAIL:BRAIN -CREATURE:SNAIL:LUNG -CREATURE:SNAIL:HEART -CREATURE:SNAIL:LIVER -CREATURE:SNAIL:GUT -CREATURE:SNAIL:STOMACH -CREATURE:SNAIL:GIZZARD -CREATURE:SNAIL:PANCREAS -CREATURE:SNAIL:SPLEEN -CREATURE:SNAIL:KIDNEY -CREATURE:SNAIL_MAN:MUSCLE -CREATURE:SNAIL_MAN:EYE -CREATURE:SNAIL_MAN:BRAIN -CREATURE:SNAIL_MAN:LUNG -CREATURE:SNAIL_MAN:HEART -CREATURE:SNAIL_MAN:LIVER -CREATURE:SNAIL_MAN:GUT -CREATURE:SNAIL_MAN:STOMACH -CREATURE:SNAIL_MAN:GIZZARD -CREATURE:SNAIL_MAN:PANCREAS -CREATURE:SNAIL_MAN:SPLEEN -CREATURE:SNAIL_MAN:KIDNEY -CREATURE:GIANT_SNAIL:MUSCLE -CREATURE:GIANT_SNAIL:EYE -CREATURE:GIANT_SNAIL:BRAIN -CREATURE:GIANT_SNAIL:LUNG -CREATURE:GIANT_SNAIL:HEART -CREATURE:GIANT_SNAIL:LIVER -CREATURE:GIANT_SNAIL:GUT -CREATURE:GIANT_SNAIL:STOMACH -CREATURE:GIANT_SNAIL:GIZZARD -CREATURE:GIANT_SNAIL:PANCREAS -CREATURE:GIANT_SNAIL:SPLEEN -CREATURE:GIANT_SNAIL:KIDNEY -CREATURE:GECKO_LEOPARD:MUSCLE -CREATURE:GECKO_LEOPARD:EYE -CREATURE:GECKO_LEOPARD:BRAIN -CREATURE:GECKO_LEOPARD:LUNG -CREATURE:GECKO_LEOPARD:HEART -CREATURE:GECKO_LEOPARD:LIVER -CREATURE:GECKO_LEOPARD:GUT -CREATURE:GECKO_LEOPARD:STOMACH -CREATURE:GECKO_LEOPARD:GIZZARD -CREATURE:GECKO_LEOPARD:PANCREAS -CREATURE:GECKO_LEOPARD:SPLEEN -CREATURE:GECKO_LEOPARD:KIDNEY -!CREATURE:LEOPARD_GECKO_MAN:MUSCLE -CREATURE:LEOPARD_GECKO_MAN:EYE - CREATURE:LEOPARD_GECKO_MAN:BRAIN -CREATURE:LEOPARD_GECKO_MAN:LUNG - CREATURE:LEOPARD_GECKO_MAN:HEART - CREATURE:LEOPARD_GECKO_MAN:LIVER -CREATURE:LEOPARD_GECKO_MAN:GUT -"CREATURE:LEOPARD_GECKO_MAN:STOMACH -"CREATURE:LEOPARD_GECKO_MAN:GIZZARD -#CREATURE:LEOPARD_GECKO_MAN:PANCREAS -!CREATURE:LEOPARD_GECKO_MAN:SPLEEN -!CREATURE:LEOPARD_GECKO_MAN:KIDNEY -#CREATURE:GIANT_LEOPARD_GECKO:MUSCLE - CREATURE:GIANT_LEOPARD_GECKO:EYE -"CREATURE:GIANT_LEOPARD_GECKO:BRAIN -!CREATURE:GIANT_LEOPARD_GECKO:LUNG -"CREATURE:GIANT_LEOPARD_GECKO:HEART -"CREATURE:GIANT_LEOPARD_GECKO:LIVER - CREATURE:GIANT_LEOPARD_GECKO:GUT -$CREATURE:GIANT_LEOPARD_GECKO:STOMACH -$CREATURE:GIANT_LEOPARD_GECKO:GIZZARD -%CREATURE:GIANT_LEOPARD_GECKO:PANCREAS -#CREATURE:GIANT_LEOPARD_GECKO:SPLEEN -#CREATURE:GIANT_LEOPARD_GECKO:KIDNEY -CREATURE:DESERT TORTOISE:MUSCLE -CREATURE:DESERT TORTOISE:EYE -CREATURE:DESERT TORTOISE:BRAIN -CREATURE:DESERT TORTOISE:LUNG -CREATURE:DESERT TORTOISE:HEART -CREATURE:DESERT TORTOISE:LIVER -CREATURE:DESERT TORTOISE:GUT - CREATURE:DESERT TORTOISE:STOMACH - CREATURE:DESERT TORTOISE:GIZZARD -!CREATURE:DESERT TORTOISE:PANCREAS -CREATURE:DESERT TORTOISE:SPLEEN -CREATURE:DESERT TORTOISE:KIDNEY -#CREATURE:DESERT_TORTOISE_MAN:MUSCLE - CREATURE:DESERT_TORTOISE_MAN:EYE -"CREATURE:DESERT_TORTOISE_MAN:BRAIN -!CREATURE:DESERT_TORTOISE_MAN:LUNG -"CREATURE:DESERT_TORTOISE_MAN:HEART -"CREATURE:DESERT_TORTOISE_MAN:LIVER - CREATURE:DESERT_TORTOISE_MAN:GUT -$CREATURE:DESERT_TORTOISE_MAN:STOMACH -$CREATURE:DESERT_TORTOISE_MAN:GIZZARD -%CREATURE:DESERT_TORTOISE_MAN:PANCREAS -#CREATURE:DESERT_TORTOISE_MAN:SPLEEN -#CREATURE:DESERT_TORTOISE_MAN:KIDNEY -%CREATURE:GIANT_DESERT_TORTOISE:MUSCLE -"CREATURE:GIANT_DESERT_TORTOISE:EYE -$CREATURE:GIANT_DESERT_TORTOISE:BRAIN -#CREATURE:GIANT_DESERT_TORTOISE:LUNG -$CREATURE:GIANT_DESERT_TORTOISE:HEART -$CREATURE:GIANT_DESERT_TORTOISE:LIVER -"CREATURE:GIANT_DESERT_TORTOISE:GUT -&CREATURE:GIANT_DESERT_TORTOISE:STOMACH -&CREATURE:GIANT_DESERT_TORTOISE:GIZZARD -'CREATURE:GIANT_DESERT_TORTOISE:PANCREAS -%CREATURE:GIANT_DESERT_TORTOISE:SPLEEN -%CREATURE:GIANT_DESERT_TORTOISE:KIDNEY -CREATURE:GILA_MONSTER:MUSCLE -CREATURE:GILA_MONSTER:EYE -CREATURE:GILA_MONSTER:BRAIN -CREATURE:GILA_MONSTER:LUNG -CREATURE:GILA_MONSTER:HEART -CREATURE:GILA_MONSTER:LIVER -CREATURE:GILA_MONSTER:GUT -CREATURE:GILA_MONSTER:STOMACH -CREATURE:GILA_MONSTER:GIZZARD -CREATURE:GILA_MONSTER:PANCREAS -CREATURE:GILA_MONSTER:SPLEEN -CREATURE:GILA_MONSTER:KIDNEY - CREATURE:GILA_MONSTER_MAN:MUSCLE -CREATURE:GILA_MONSTER_MAN:EYE -CREATURE:GILA_MONSTER_MAN:BRAIN -CREATURE:GILA_MONSTER_MAN:LUNG -CREATURE:GILA_MONSTER_MAN:HEART -CREATURE:GILA_MONSTER_MAN:LIVER -CREATURE:GILA_MONSTER_MAN:GUT -!CREATURE:GILA_MONSTER_MAN:STOMACH -!CREATURE:GILA_MONSTER_MAN:GIZZARD -"CREATURE:GILA_MONSTER_MAN:PANCREAS - CREATURE:GILA_MONSTER_MAN:SPLEEN - CREATURE:GILA_MONSTER_MAN:KIDNEY -"CREATURE:GIANT_GILA_MONSTER:MUSCLE -CREATURE:GIANT_GILA_MONSTER:EYE -!CREATURE:GIANT_GILA_MONSTER:BRAIN - CREATURE:GIANT_GILA_MONSTER:LUNG -!CREATURE:GIANT_GILA_MONSTER:HEART -!CREATURE:GIANT_GILA_MONSTER:LIVER -CREATURE:GIANT_GILA_MONSTER:GUT -#CREATURE:GIANT_GILA_MONSTER:STOMACH -#CREATURE:GIANT_GILA_MONSTER:GIZZARD -$CREATURE:GIANT_GILA_MONSTER:PANCREAS -"CREATURE:GIANT_GILA_MONSTER:SPLEEN -"CREATURE:GIANT_GILA_MONSTER:KIDNEY -CREATURE:DOG:MUSCLE -CREATURE:DOG:EYE -CREATURE:DOG:BRAIN -CREATURE:DOG:LUNG -CREATURE:DOG:HEART -CREATURE:DOG:LIVER -CREATURE:DOG:GUT -CREATURE:DOG:STOMACH -CREATURE:DOG:GIZZARD -CREATURE:DOG:PANCREAS -CREATURE:DOG:SPLEEN -CREATURE:DOG:KIDNEY -CREATURE:CAT:MUSCLE -CREATURE:CAT:EYE -CREATURE:CAT:BRAIN -CREATURE:CAT:LUNG -CREATURE:CAT:HEART -CREATURE:CAT:LIVER -CREATURE:CAT:GUT -CREATURE:CAT:STOMACH -CREATURE:CAT:GIZZARD -CREATURE:CAT:PANCREAS -CREATURE:CAT:SPLEEN -CREATURE:CAT:KIDNEY -CREATURE:MULE:MUSCLE -CREATURE:MULE:EYE -CREATURE:MULE:BRAIN -CREATURE:MULE:LUNG -CREATURE:MULE:HEART -CREATURE:MULE:LIVER -CREATURE:MULE:GUT -CREATURE:MULE:STOMACH -CREATURE:MULE:GIZZARD -CREATURE:MULE:PANCREAS -CREATURE:MULE:SPLEEN -CREATURE:MULE:KIDNEY -CREATURE:DONKEY:MUSCLE -CREATURE:DONKEY:EYE -CREATURE:DONKEY:BRAIN -CREATURE:DONKEY:LUNG -CREATURE:DONKEY:HEART -CREATURE:DONKEY:LIVER -CREATURE:DONKEY:GUT -CREATURE:DONKEY:STOMACH -CREATURE:DONKEY:GIZZARD -CREATURE:DONKEY:PANCREAS -CREATURE:DONKEY:SPLEEN -CREATURE:DONKEY:KIDNEY -CREATURE:HORSE:MUSCLE -CREATURE:HORSE:EYE -CREATURE:HORSE:BRAIN -CREATURE:HORSE:LUNG -CREATURE:HORSE:HEART -CREATURE:HORSE:LIVER -CREATURE:HORSE:GUT -CREATURE:HORSE:STOMACH -CREATURE:HORSE:GIZZARD -CREATURE:HORSE:PANCREAS -CREATURE:HORSE:SPLEEN -CREATURE:HORSE:KIDNEY -CREATURE:COW:MUSCLE -CREATURE:COW:EYE -CREATURE:COW:BRAIN -CREATURE:COW:LUNG -CREATURE:COW:HEART -CREATURE:COW:LIVER -CREATURE:COW:GUT -CREATURE:COW:STOMACH -CREATURE:COW:GIZZARD -CREATURE:COW:PANCREAS -CREATURE:COW:SPLEEN -CREATURE:COW:KIDNEY -CREATURE:SHEEP:MUSCLE -CREATURE:SHEEP:EYE -CREATURE:SHEEP:BRAIN -CREATURE:SHEEP:LUNG -CREATURE:SHEEP:HEART -CREATURE:SHEEP:LIVER -CREATURE:SHEEP:GUT -CREATURE:SHEEP:STOMACH -CREATURE:SHEEP:GIZZARD -CREATURE:SHEEP:PANCREAS -CREATURE:SHEEP:SPLEEN -CREATURE:SHEEP:KIDNEY -CREATURE:PIG:MUSCLE -CREATURE:PIG:EYE -CREATURE:PIG:BRAIN -CREATURE:PIG:LUNG -CREATURE:PIG:HEART -CREATURE:PIG:LIVER -CREATURE:PIG:GUT -CREATURE:PIG:STOMACH -CREATURE:PIG:GIZZARD -CREATURE:PIG:PANCREAS -CREATURE:PIG:SPLEEN -CREATURE:PIG:KIDNEY -CREATURE:GOAT:MUSCLE -CREATURE:GOAT:EYE -CREATURE:GOAT:BRAIN -CREATURE:GOAT:LUNG -CREATURE:GOAT:HEART -CREATURE:GOAT:LIVER -CREATURE:GOAT:GUT -CREATURE:GOAT:STOMACH -CREATURE:GOAT:GIZZARD -CREATURE:GOAT:PANCREAS -CREATURE:GOAT:SPLEEN -CREATURE:GOAT:KIDNEY -CREATURE:BIRD_CHICKEN:MUSCLE -CREATURE:BIRD_CHICKEN:EYE -CREATURE:BIRD_CHICKEN:BRAIN -CREATURE:BIRD_CHICKEN:LUNG -CREATURE:BIRD_CHICKEN:HEART -CREATURE:BIRD_CHICKEN:LIVER -CREATURE:BIRD_CHICKEN:GUT -CREATURE:BIRD_CHICKEN:STOMACH -CREATURE:BIRD_CHICKEN:GIZZARD -CREATURE:BIRD_CHICKEN:PANCREAS -CREATURE:BIRD_CHICKEN:SPLEEN -CREATURE:BIRD_CHICKEN:KIDNEY -CREATURE:CAVY:MUSCLE -CREATURE:CAVY:EYE -CREATURE:CAVY:BRAIN -CREATURE:CAVY:LUNG -CREATURE:CAVY:HEART -CREATURE:CAVY:LIVER -CREATURE:CAVY:GUT -CREATURE:CAVY:STOMACH -CREATURE:CAVY:GIZZARD -CREATURE:CAVY:PANCREAS -CREATURE:CAVY:SPLEEN -CREATURE:CAVY:KIDNEY -CREATURE:BIRD_DUCK:MUSCLE -CREATURE:BIRD_DUCK:EYE -CREATURE:BIRD_DUCK:BRAIN -CREATURE:BIRD_DUCK:LUNG -CREATURE:BIRD_DUCK:HEART -CREATURE:BIRD_DUCK:LIVER -CREATURE:BIRD_DUCK:GUT -CREATURE:BIRD_DUCK:STOMACH -CREATURE:BIRD_DUCK:GIZZARD -CREATURE:BIRD_DUCK:PANCREAS -CREATURE:BIRD_DUCK:SPLEEN -CREATURE:BIRD_DUCK:KIDNEY -CREATURE:WATER_BUFFALO:MUSCLE -CREATURE:WATER_BUFFALO:EYE -CREATURE:WATER_BUFFALO:BRAIN -CREATURE:WATER_BUFFALO:LUNG -CREATURE:WATER_BUFFALO:HEART -CREATURE:WATER_BUFFALO:LIVER -CREATURE:WATER_BUFFALO:GUT -CREATURE:WATER_BUFFALO:STOMACH -CREATURE:WATER_BUFFALO:GIZZARD -CREATURE:WATER_BUFFALO:PANCREAS -CREATURE:WATER_BUFFALO:SPLEEN -CREATURE:WATER_BUFFALO:KIDNEY -CREATURE:REINDEER:MUSCLE -CREATURE:REINDEER:EYE -CREATURE:REINDEER:BRAIN -CREATURE:REINDEER:LUNG -CREATURE:REINDEER:HEART -CREATURE:REINDEER:LIVER -CREATURE:REINDEER:GUT -CREATURE:REINDEER:STOMACH -CREATURE:REINDEER:GIZZARD -CREATURE:REINDEER:PANCREAS -CREATURE:REINDEER:SPLEEN -CREATURE:REINDEER:KIDNEY -CREATURE:BIRD_GOOSE:MUSCLE -CREATURE:BIRD_GOOSE:EYE -CREATURE:BIRD_GOOSE:BRAIN -CREATURE:BIRD_GOOSE:LUNG -CREATURE:BIRD_GOOSE:HEART -CREATURE:BIRD_GOOSE:LIVER -CREATURE:BIRD_GOOSE:GUT -CREATURE:BIRD_GOOSE:STOMACH -CREATURE:BIRD_GOOSE:GIZZARD -CREATURE:BIRD_GOOSE:PANCREAS -CREATURE:BIRD_GOOSE:SPLEEN -CREATURE:BIRD_GOOSE:KIDNEY -CREATURE:YAK:MUSCLE -CREATURE:YAK:EYE -CREATURE:YAK:BRAIN -CREATURE:YAK:LUNG -CREATURE:YAK:HEART -CREATURE:YAK:LIVER -CREATURE:YAK:GUT -CREATURE:YAK:STOMACH -CREATURE:YAK:GIZZARD -CREATURE:YAK:PANCREAS -CREATURE:YAK:SPLEEN -CREATURE:YAK:KIDNEY -CREATURE:LLAMA:MUSCLE -CREATURE:LLAMA:EYE -CREATURE:LLAMA:BRAIN -CREATURE:LLAMA:LUNG -CREATURE:LLAMA:HEART -CREATURE:LLAMA:LIVER -CREATURE:LLAMA:GUT -CREATURE:LLAMA:STOMACH -CREATURE:LLAMA:GIZZARD -CREATURE:LLAMA:PANCREAS -CREATURE:LLAMA:SPLEEN -CREATURE:LLAMA:KIDNEY -CREATURE:ALPACA:MUSCLE -CREATURE:ALPACA:EYE -CREATURE:ALPACA:BRAIN -CREATURE:ALPACA:LUNG -CREATURE:ALPACA:HEART -CREATURE:ALPACA:LIVER -CREATURE:ALPACA:GUT -CREATURE:ALPACA:STOMACH -CREATURE:ALPACA:GIZZARD -CREATURE:ALPACA:PANCREAS -CREATURE:ALPACA:SPLEEN -CREATURE:ALPACA:KIDNEY -CREATURE:BIRD_GUINEAFOWL:MUSCLE -CREATURE:BIRD_GUINEAFOWL:EYE -CREATURE:BIRD_GUINEAFOWL:BRAIN -CREATURE:BIRD_GUINEAFOWL:LUNG -CREATURE:BIRD_GUINEAFOWL:HEART -CREATURE:BIRD_GUINEAFOWL:LIVER -CREATURE:BIRD_GUINEAFOWL:GUT - CREATURE:BIRD_GUINEAFOWL:STOMACH - CREATURE:BIRD_GUINEAFOWL:GIZZARD -!CREATURE:BIRD_GUINEAFOWL:PANCREAS -CREATURE:BIRD_GUINEAFOWL:SPLEEN -CREATURE:BIRD_GUINEAFOWL:KIDNEY -!CREATURE:BIRD_PEAFOWL_BLUE:MUSCLE -CREATURE:BIRD_PEAFOWL_BLUE:EYE - CREATURE:BIRD_PEAFOWL_BLUE:BRAIN -CREATURE:BIRD_PEAFOWL_BLUE:LUNG - CREATURE:BIRD_PEAFOWL_BLUE:HEART - CREATURE:BIRD_PEAFOWL_BLUE:LIVER -CREATURE:BIRD_PEAFOWL_BLUE:GUT -"CREATURE:BIRD_PEAFOWL_BLUE:STOMACH -"CREATURE:BIRD_PEAFOWL_BLUE:GIZZARD -#CREATURE:BIRD_PEAFOWL_BLUE:PANCREAS -!CREATURE:BIRD_PEAFOWL_BLUE:SPLEEN -!CREATURE:BIRD_PEAFOWL_BLUE:KIDNEY -CREATURE:BIRD_TURKEY:MUSCLE -CREATURE:BIRD_TURKEY:EYE -CREATURE:BIRD_TURKEY:BRAIN -CREATURE:BIRD_TURKEY:LUNG -CREATURE:BIRD_TURKEY:HEART -CREATURE:BIRD_TURKEY:LIVER -CREATURE:BIRD_TURKEY:GUT -CREATURE:BIRD_TURKEY:STOMACH -CREATURE:BIRD_TURKEY:GIZZARD -CREATURE:BIRD_TURKEY:PANCREAS -CREATURE:BIRD_TURKEY:SPLEEN -CREATURE:BIRD_TURKEY:KIDNEY -CREATURE:RABBIT:MUSCLE -CREATURE:RABBIT:EYE -CREATURE:RABBIT:BRAIN -CREATURE:RABBIT:LUNG -CREATURE:RABBIT:HEART -CREATURE:RABBIT:LIVER -CREATURE:RABBIT:GUT -CREATURE:RABBIT:STOMACH -CREATURE:RABBIT:GIZZARD -CREATURE:RABBIT:PANCREAS -CREATURE:RABBIT:SPLEEN -CREATURE:RABBIT:KIDNEY -CREATURE:FLY:MUSCLE -CREATURE:FLY:EYE -CREATURE:FLY:BRAIN -CREATURE:FLY:LUNG -CREATURE:FLY:HEART -CREATURE:FLY:LIVER -CREATURE:FLY:GUT -CREATURE:FLY:STOMACH -CREATURE:FLY:GIZZARD -CREATURE:FLY:PANCREAS -CREATURE:FLY:SPLEEN -CREATURE:FLY:KIDNEY -CREATURE:FLY_MAN:MUSCLE -CREATURE:FLY_MAN:EYE -CREATURE:FLY_MAN:BRAIN -CREATURE:FLY_MAN:LUNG -CREATURE:FLY_MAN:HEART -CREATURE:FLY_MAN:LIVER -CREATURE:FLY_MAN:GUT -CREATURE:FLY_MAN:STOMACH -CREATURE:FLY_MAN:GIZZARD -CREATURE:FLY_MAN:PANCREAS -CREATURE:FLY_MAN:SPLEEN -CREATURE:FLY_MAN:KIDNEY -CREATURE:GIANT_FLY:MUSCLE -CREATURE:GIANT_FLY:EYE -CREATURE:GIANT_FLY:BRAIN -CREATURE:GIANT_FLY:LUNG -CREATURE:GIANT_FLY:HEART -CREATURE:GIANT_FLY:LIVER -CREATURE:GIANT_FLY:GUT -CREATURE:GIANT_FLY:STOMACH -CREATURE:GIANT_FLY:GIZZARD -CREATURE:GIANT_FLY:PANCREAS -CREATURE:GIANT_FLY:SPLEEN -CREATURE:GIANT_FLY:KIDNEY -CREATURE:ROACH_LARGE:MUSCLE -CREATURE:ROACH_LARGE:EYE -CREATURE:ROACH_LARGE:BRAIN -CREATURE:ROACH_LARGE:LUNG -CREATURE:ROACH_LARGE:HEART -CREATURE:ROACH_LARGE:LIVER -CREATURE:ROACH_LARGE:GUT -CREATURE:ROACH_LARGE:STOMACH -CREATURE:ROACH_LARGE:GIZZARD -CREATURE:ROACH_LARGE:PANCREAS -CREATURE:ROACH_LARGE:SPLEEN -CREATURE:ROACH_LARGE:KIDNEY -CREATURE:ROACH_MAN:MUSCLE -CREATURE:ROACH_MAN:EYE -CREATURE:ROACH_MAN:BRAIN -CREATURE:ROACH_MAN:LUNG -CREATURE:ROACH_MAN:HEART -CREATURE:ROACH_MAN:LIVER -CREATURE:ROACH_MAN:GUT -CREATURE:ROACH_MAN:STOMACH -CREATURE:ROACH_MAN:GIZZARD -CREATURE:ROACH_MAN:PANCREAS -CREATURE:ROACH_MAN:SPLEEN -CREATURE:ROACH_MAN:KIDNEY -CREATURE:GIANT_ROACH:MUSCLE -CREATURE:GIANT_ROACH:EYE -CREATURE:GIANT_ROACH:BRAIN -CREATURE:GIANT_ROACH:LUNG -CREATURE:GIANT_ROACH:HEART -CREATURE:GIANT_ROACH:LIVER -CREATURE:GIANT_ROACH:GUT -CREATURE:GIANT_ROACH:STOMACH -CREATURE:GIANT_ROACH:GIZZARD -CREATURE:GIANT_ROACH:PANCREAS -CREATURE:GIANT_ROACH:SPLEEN -CREATURE:GIANT_ROACH:KIDNEY -CREATURE:BEETLE:MUSCLE -CREATURE:BEETLE:EYE -CREATURE:BEETLE:BRAIN -CREATURE:BEETLE:LUNG -CREATURE:BEETLE:HEART -CREATURE:BEETLE:LIVER -CREATURE:BEETLE:GUT -CREATURE:BEETLE:STOMACH -CREATURE:BEETLE:GIZZARD -CREATURE:BEETLE:PANCREAS -CREATURE:BEETLE:SPLEEN -CREATURE:BEETLE:KIDNEY -CREATURE:BEETLE_MAN:MUSCLE -CREATURE:BEETLE_MAN:EYE -CREATURE:BEETLE_MAN:BRAIN -CREATURE:BEETLE_MAN:LUNG -CREATURE:BEETLE_MAN:HEART -CREATURE:BEETLE_MAN:LIVER -CREATURE:BEETLE_MAN:GUT -CREATURE:BEETLE_MAN:STOMACH -CREATURE:BEETLE_MAN:GIZZARD -CREATURE:BEETLE_MAN:PANCREAS -CREATURE:BEETLE_MAN:SPLEEN -CREATURE:BEETLE_MAN:KIDNEY -CREATURE:GIANT_BEETLE:MUSCLE -CREATURE:GIANT_BEETLE:EYE -CREATURE:GIANT_BEETLE:BRAIN -CREATURE:GIANT_BEETLE:LUNG -CREATURE:GIANT_BEETLE:HEART -CREATURE:GIANT_BEETLE:LIVER -CREATURE:GIANT_BEETLE:GUT -CREATURE:GIANT_BEETLE:STOMACH -CREATURE:GIANT_BEETLE:GIZZARD -CREATURE:GIANT_BEETLE:PANCREAS -CREATURE:GIANT_BEETLE:SPLEEN -CREATURE:GIANT_BEETLE:KIDNEY -CREATURE:ANT:MUSCLE -CREATURE:ANT:EYE -CREATURE:ANT:BRAIN -CREATURE:ANT:LUNG -CREATURE:ANT:HEART -CREATURE:ANT:LIVER -CREATURE:ANT:GUT -CREATURE:ANT:STOMACH -CREATURE:ANT:GIZZARD -CREATURE:ANT:PANCREAS -CREATURE:ANT:SPLEEN -CREATURE:ANT:KIDNEY -!CREATURE:BUTTERFLY_MONARCH:MUSCLE -CREATURE:BUTTERFLY_MONARCH:EYE - CREATURE:BUTTERFLY_MONARCH:BRAIN -CREATURE:BUTTERFLY_MONARCH:LUNG - CREATURE:BUTTERFLY_MONARCH:HEART - CREATURE:BUTTERFLY_MONARCH:LIVER -CREATURE:BUTTERFLY_MONARCH:GUT -"CREATURE:BUTTERFLY_MONARCH:STOMACH -"CREATURE:BUTTERFLY_MONARCH:GIZZARD -#CREATURE:BUTTERFLY_MONARCH:PANCREAS -!CREATURE:BUTTERFLY_MONARCH:SPLEEN -!CREATURE:BUTTERFLY_MONARCH:KIDNEY -%CREATURE:BUTTERFLY_MONARCH_MAN:MUSCLE -"CREATURE:BUTTERFLY_MONARCH_MAN:EYE -$CREATURE:BUTTERFLY_MONARCH_MAN:BRAIN -#CREATURE:BUTTERFLY_MONARCH_MAN:LUNG -$CREATURE:BUTTERFLY_MONARCH_MAN:HEART -$CREATURE:BUTTERFLY_MONARCH_MAN:LIVER -"CREATURE:BUTTERFLY_MONARCH_MAN:GUT -&CREATURE:BUTTERFLY_MONARCH_MAN:STOMACH -&CREATURE:BUTTERFLY_MONARCH_MAN:GIZZARD -'CREATURE:BUTTERFLY_MONARCH_MAN:PANCREAS -%CREATURE:BUTTERFLY_MONARCH_MAN:SPLEEN -%CREATURE:BUTTERFLY_MONARCH_MAN:KIDNEY -'CREATURE:GIANT_BUTTERFLY_MONARCH:MUSCLE -$CREATURE:GIANT_BUTTERFLY_MONARCH:EYE -&CREATURE:GIANT_BUTTERFLY_MONARCH:BRAIN -%CREATURE:GIANT_BUTTERFLY_MONARCH:LUNG -&CREATURE:GIANT_BUTTERFLY_MONARCH:HEART -&CREATURE:GIANT_BUTTERFLY_MONARCH:LIVER -$CREATURE:GIANT_BUTTERFLY_MONARCH:GUT -(CREATURE:GIANT_BUTTERFLY_MONARCH:STOMACH -(CREATURE:GIANT_BUTTERFLY_MONARCH:GIZZARD -)CREATURE:GIANT_BUTTERFLY_MONARCH:PANCREAS -'CREATURE:GIANT_BUTTERFLY_MONARCH:SPLEEN -'CREATURE:GIANT_BUTTERFLY_MONARCH:KIDNEY -CREATURE:FIREFLY:MUSCLE -CREATURE:FIREFLY:EYE -CREATURE:FIREFLY:BRAIN -CREATURE:FIREFLY:LUNG -CREATURE:FIREFLY:HEART -CREATURE:FIREFLY:LIVER -CREATURE:FIREFLY:GUT -CREATURE:FIREFLY:STOMACH -CREATURE:FIREFLY:GIZZARD -CREATURE:FIREFLY:PANCREAS -CREATURE:FIREFLY:SPLEEN -CREATURE:FIREFLY:KIDNEY -CREATURE:FIREFLY_MAN:MUSCLE -CREATURE:FIREFLY_MAN:EYE -CREATURE:FIREFLY_MAN:BRAIN -CREATURE:FIREFLY_MAN:LUNG -CREATURE:FIREFLY_MAN:HEART -CREATURE:FIREFLY_MAN:LIVER -CREATURE:FIREFLY_MAN:GUT -CREATURE:FIREFLY_MAN:STOMACH -CREATURE:FIREFLY_MAN:GIZZARD -CREATURE:FIREFLY_MAN:PANCREAS -CREATURE:FIREFLY_MAN:SPLEEN -CREATURE:FIREFLY_MAN:KIDNEY -CREATURE:GIANT_FIREFLY:MUSCLE -CREATURE:GIANT_FIREFLY:EYE -CREATURE:GIANT_FIREFLY:BRAIN -CREATURE:GIANT_FIREFLY:LUNG -CREATURE:GIANT_FIREFLY:HEART -CREATURE:GIANT_FIREFLY:LIVER -CREATURE:GIANT_FIREFLY:GUT -CREATURE:GIANT_FIREFLY:STOMACH -CREATURE:GIANT_FIREFLY:GIZZARD -CREATURE:GIANT_FIREFLY:PANCREAS -CREATURE:GIANT_FIREFLY:SPLEEN -CREATURE:GIANT_FIREFLY:KIDNEY -CREATURE:DRAGONFLY:MUSCLE -CREATURE:DRAGONFLY:EYE -CREATURE:DRAGONFLY:BRAIN -CREATURE:DRAGONFLY:LUNG -CREATURE:DRAGONFLY:HEART -CREATURE:DRAGONFLY:LIVER -CREATURE:DRAGONFLY:GUT -CREATURE:DRAGONFLY:STOMACH -CREATURE:DRAGONFLY:GIZZARD -CREATURE:DRAGONFLY:PANCREAS -CREATURE:DRAGONFLY:SPLEEN -CREATURE:DRAGONFLY:KIDNEY -CREATURE:DRAGONFLY_MAN:MUSCLE -CREATURE:DRAGONFLY_MAN:EYE -CREATURE:DRAGONFLY_MAN:BRAIN -CREATURE:DRAGONFLY_MAN:LUNG -CREATURE:DRAGONFLY_MAN:HEART -CREATURE:DRAGONFLY_MAN:LIVER -CREATURE:DRAGONFLY_MAN:GUT -CREATURE:DRAGONFLY_MAN:STOMACH -CREATURE:DRAGONFLY_MAN:GIZZARD -CREATURE:DRAGONFLY_MAN:PANCREAS -CREATURE:DRAGONFLY_MAN:SPLEEN -CREATURE:DRAGONFLY_MAN:KIDNEY -CREATURE:GIANT_DRAGONFLY:MUSCLE -CREATURE:GIANT_DRAGONFLY:EYE -CREATURE:GIANT_DRAGONFLY:BRAIN -CREATURE:GIANT_DRAGONFLY:LUNG -CREATURE:GIANT_DRAGONFLY:HEART -CREATURE:GIANT_DRAGONFLY:LIVER -CREATURE:GIANT_DRAGONFLY:GUT - CREATURE:GIANT_DRAGONFLY:STOMACH - CREATURE:GIANT_DRAGONFLY:GIZZARD -!CREATURE:GIANT_DRAGONFLY:PANCREAS -CREATURE:GIANT_DRAGONFLY:SPLEEN -CREATURE:GIANT_DRAGONFLY:KIDNEY -CREATURE:HONEY_BEE:MUSCLE -CREATURE:HONEY_BEE:EYE -CREATURE:HONEY_BEE:BRAIN -CREATURE:HONEY_BEE:LUNG -CREATURE:HONEY_BEE:HEART -CREATURE:HONEY_BEE:LIVER -CREATURE:HONEY_BEE:GUT -CREATURE:HONEY_BEE:STOMACH -CREATURE:HONEY_BEE:GIZZARD -CREATURE:HONEY_BEE:PANCREAS -CREATURE:HONEY_BEE:SPLEEN -CREATURE:HONEY_BEE:KIDNEY -CREATURE:BUMBLEBEE:MUSCLE -CREATURE:BUMBLEBEE:EYE -CREATURE:BUMBLEBEE:BRAIN -CREATURE:BUMBLEBEE:LUNG -CREATURE:BUMBLEBEE:HEART -CREATURE:BUMBLEBEE:LIVER -CREATURE:BUMBLEBEE:GUT -CREATURE:BUMBLEBEE:STOMACH -CREATURE:BUMBLEBEE:GIZZARD -CREATURE:BUMBLEBEE:PANCREAS -CREATURE:BUMBLEBEE:SPLEEN -CREATURE:BUMBLEBEE:KIDNEY -CREATURE:GOAT_MOUNTAIN:MUSCLE -CREATURE:GOAT_MOUNTAIN:EYE -CREATURE:GOAT_MOUNTAIN:BRAIN -CREATURE:GOAT_MOUNTAIN:LUNG -CREATURE:GOAT_MOUNTAIN:HEART -CREATURE:GOAT_MOUNTAIN:LIVER -CREATURE:GOAT_MOUNTAIN:GUT -CREATURE:GOAT_MOUNTAIN:STOMACH -CREATURE:GOAT_MOUNTAIN:GIZZARD -CREATURE:GOAT_MOUNTAIN:PANCREAS -CREATURE:GOAT_MOUNTAIN:SPLEEN -CREATURE:GOAT_MOUNTAIN:KIDNEY -!CREATURE:GOAT_MOUNTAIN_MAN:MUSCLE -CREATURE:GOAT_MOUNTAIN_MAN:EYE - CREATURE:GOAT_MOUNTAIN_MAN:BRAIN -CREATURE:GOAT_MOUNTAIN_MAN:LUNG - CREATURE:GOAT_MOUNTAIN_MAN:HEART - CREATURE:GOAT_MOUNTAIN_MAN:LIVER -CREATURE:GOAT_MOUNTAIN_MAN:GUT -"CREATURE:GOAT_MOUNTAIN_MAN:STOMACH -"CREATURE:GOAT_MOUNTAIN_MAN:GIZZARD -#CREATURE:GOAT_MOUNTAIN_MAN:PANCREAS -!CREATURE:GOAT_MOUNTAIN_MAN:SPLEEN -!CREATURE:GOAT_MOUNTAIN_MAN:KIDNEY -#CREATURE:GIANT_GOAT_MOUNTAIN:MUSCLE - CREATURE:GIANT_GOAT_MOUNTAIN:EYE -"CREATURE:GIANT_GOAT_MOUNTAIN:BRAIN -!CREATURE:GIANT_GOAT_MOUNTAIN:LUNG -"CREATURE:GIANT_GOAT_MOUNTAIN:HEART -"CREATURE:GIANT_GOAT_MOUNTAIN:LIVER - CREATURE:GIANT_GOAT_MOUNTAIN:GUT -$CREATURE:GIANT_GOAT_MOUNTAIN:STOMACH -$CREATURE:GIANT_GOAT_MOUNTAIN:GIZZARD -%CREATURE:GIANT_GOAT_MOUNTAIN:PANCREAS -#CREATURE:GIANT_GOAT_MOUNTAIN:SPLEEN -#CREATURE:GIANT_GOAT_MOUNTAIN:KIDNEY -CREATURE:MARMOT_HOARY:MUSCLE -CREATURE:MARMOT_HOARY:EYE -CREATURE:MARMOT_HOARY:BRAIN -CREATURE:MARMOT_HOARY:LUNG -CREATURE:MARMOT_HOARY:HEART -CREATURE:MARMOT_HOARY:LIVER -CREATURE:MARMOT_HOARY:GUT -CREATURE:MARMOT_HOARY:STOMACH -CREATURE:MARMOT_HOARY:GIZZARD -CREATURE:MARMOT_HOARY:PANCREAS -CREATURE:MARMOT_HOARY:SPLEEN -CREATURE:MARMOT_HOARY:KIDNEY - CREATURE:MARMOT_HOARY_MAN:MUSCLE -CREATURE:MARMOT_HOARY_MAN:EYE -CREATURE:MARMOT_HOARY_MAN:BRAIN -CREATURE:MARMOT_HOARY_MAN:LUNG -CREATURE:MARMOT_HOARY_MAN:HEART -CREATURE:MARMOT_HOARY_MAN:LIVER -CREATURE:MARMOT_HOARY_MAN:GUT -!CREATURE:MARMOT_HOARY_MAN:STOMACH -!CREATURE:MARMOT_HOARY_MAN:GIZZARD -"CREATURE:MARMOT_HOARY_MAN:PANCREAS - CREATURE:MARMOT_HOARY_MAN:SPLEEN - CREATURE:MARMOT_HOARY_MAN:KIDNEY -"CREATURE:GIANT_MARMOT_HOARY:MUSCLE -CREATURE:GIANT_MARMOT_HOARY:EYE -!CREATURE:GIANT_MARMOT_HOARY:BRAIN - CREATURE:GIANT_MARMOT_HOARY:LUNG -!CREATURE:GIANT_MARMOT_HOARY:HEART -!CREATURE:GIANT_MARMOT_HOARY:LIVER -CREATURE:GIANT_MARMOT_HOARY:GUT -#CREATURE:GIANT_MARMOT_HOARY:STOMACH -#CREATURE:GIANT_MARMOT_HOARY:GIZZARD -$CREATURE:GIANT_MARMOT_HOARY:PANCREAS -"CREATURE:GIANT_MARMOT_HOARY:SPLEEN -"CREATURE:GIANT_MARMOT_HOARY:KIDNEY -CREATURE:GNOME_MOUNTAIN:MUSCLE -CREATURE:GNOME_MOUNTAIN:EYE -CREATURE:GNOME_MOUNTAIN:BRAIN -CREATURE:GNOME_MOUNTAIN:LUNG -CREATURE:GNOME_MOUNTAIN:HEART -CREATURE:GNOME_MOUNTAIN:LIVER -CREATURE:GNOME_MOUNTAIN:GUT -CREATURE:GNOME_MOUNTAIN:STOMACH -CREATURE:GNOME_MOUNTAIN:GIZZARD - CREATURE:GNOME_MOUNTAIN:PANCREAS -CREATURE:GNOME_MOUNTAIN:SPLEEN -CREATURE:GNOME_MOUNTAIN:KIDNEY -CREATURE:GNOME_DARK:MUSCLE -CREATURE:GNOME_DARK:EYE -CREATURE:GNOME_DARK:BRAIN -CREATURE:GNOME_DARK:LUNG -CREATURE:GNOME_DARK:HEART -CREATURE:GNOME_DARK:LIVER -CREATURE:GNOME_DARK:GUT -CREATURE:GNOME_DARK:STOMACH -CREATURE:GNOME_DARK:GIZZARD -CREATURE:GNOME_DARK:PANCREAS -CREATURE:GNOME_DARK:SPLEEN -CREATURE:GNOME_DARK:KIDNEY -CREATURE:WALRUS:MUSCLE -CREATURE:WALRUS:EYE -CREATURE:WALRUS:BRAIN -CREATURE:WALRUS:LUNG -CREATURE:WALRUS:HEART -CREATURE:WALRUS:LIVER -CREATURE:WALRUS:GUT -CREATURE:WALRUS:STOMACH -CREATURE:WALRUS:GIZZARD -CREATURE:WALRUS:PANCREAS -CREATURE:WALRUS:SPLEEN -CREATURE:WALRUS:KIDNEY -CREATURE:WALRUS_MAN:MUSCLE -CREATURE:WALRUS_MAN:EYE -CREATURE:WALRUS_MAN:BRAIN -CREATURE:WALRUS_MAN:LUNG -CREATURE:WALRUS_MAN:HEART -CREATURE:WALRUS_MAN:LIVER -CREATURE:WALRUS_MAN:GUT -CREATURE:WALRUS_MAN:STOMACH -CREATURE:WALRUS_MAN:GIZZARD -CREATURE:WALRUS_MAN:PANCREAS -CREATURE:WALRUS_MAN:SPLEEN -CREATURE:WALRUS_MAN:KIDNEY -CREATURE:GIANT_WALRUS:MUSCLE -CREATURE:GIANT_WALRUS:EYE -CREATURE:GIANT_WALRUS:BRAIN -CREATURE:GIANT_WALRUS:LUNG -CREATURE:GIANT_WALRUS:HEART -CREATURE:GIANT_WALRUS:LIVER -CREATURE:GIANT_WALRUS:GUT -CREATURE:GIANT_WALRUS:STOMACH -CREATURE:GIANT_WALRUS:GIZZARD -CREATURE:GIANT_WALRUS:PANCREAS -CREATURE:GIANT_WALRUS:SPLEEN -CREATURE:GIANT_WALRUS:KIDNEY - CREATURE:FISH_LAMPREY_SEA:MUSCLE -CREATURE:FISH_LAMPREY_SEA:EYE -CREATURE:FISH_LAMPREY_SEA:BRAIN -CREATURE:FISH_LAMPREY_SEA:LUNG -CREATURE:FISH_LAMPREY_SEA:HEART -CREATURE:FISH_LAMPREY_SEA:LIVER -CREATURE:FISH_LAMPREY_SEA:GUT -!CREATURE:FISH_LAMPREY_SEA:STOMACH -!CREATURE:FISH_LAMPREY_SEA:GIZZARD -"CREATURE:FISH_LAMPREY_SEA:PANCREAS - CREATURE:FISH_LAMPREY_SEA:SPLEEN - CREATURE:FISH_LAMPREY_SEA:KIDNEY -!CREATURE:SHARK_GREAT_WHITE:MUSCLE -CREATURE:SHARK_GREAT_WHITE:EYE - CREATURE:SHARK_GREAT_WHITE:BRAIN -CREATURE:SHARK_GREAT_WHITE:LUNG - CREATURE:SHARK_GREAT_WHITE:HEART - CREATURE:SHARK_GREAT_WHITE:LIVER -CREATURE:SHARK_GREAT_WHITE:GUT -"CREATURE:SHARK_GREAT_WHITE:STOMACH -"CREATURE:SHARK_GREAT_WHITE:GIZZARD -#CREATURE:SHARK_GREAT_WHITE:PANCREAS -!CREATURE:SHARK_GREAT_WHITE:SPLEEN -!CREATURE:SHARK_GREAT_WHITE:KIDNEY -CREATURE:SHARK_FRILL:MUSCLE -CREATURE:SHARK_FRILL:EYE -CREATURE:SHARK_FRILL:BRAIN -CREATURE:SHARK_FRILL:LUNG -CREATURE:SHARK_FRILL:HEART -CREATURE:SHARK_FRILL:LIVER -CREATURE:SHARK_FRILL:GUT -CREATURE:SHARK_FRILL:STOMACH -CREATURE:SHARK_FRILL:GIZZARD -CREATURE:SHARK_FRILL:PANCREAS -CREATURE:SHARK_FRILL:SPLEEN -CREATURE:SHARK_FRILL:KIDNEY -#CREATURE:SHARK_SPINY_DOGFISH:MUSCLE - CREATURE:SHARK_SPINY_DOGFISH:EYE -"CREATURE:SHARK_SPINY_DOGFISH:BRAIN -!CREATURE:SHARK_SPINY_DOGFISH:LUNG -"CREATURE:SHARK_SPINY_DOGFISH:HEART -"CREATURE:SHARK_SPINY_DOGFISH:LIVER - CREATURE:SHARK_SPINY_DOGFISH:GUT -$CREATURE:SHARK_SPINY_DOGFISH:STOMACH -$CREATURE:SHARK_SPINY_DOGFISH:GIZZARD -%CREATURE:SHARK_SPINY_DOGFISH:PANCREAS -#CREATURE:SHARK_SPINY_DOGFISH:SPLEEN -#CREATURE:SHARK_SPINY_DOGFISH:KIDNEY -'CREATURE:SHARK_WOBBEGONG_SPOTTED:MUSCLE -$CREATURE:SHARK_WOBBEGONG_SPOTTED:EYE -&CREATURE:SHARK_WOBBEGONG_SPOTTED:BRAIN -%CREATURE:SHARK_WOBBEGONG_SPOTTED:LUNG -&CREATURE:SHARK_WOBBEGONG_SPOTTED:HEART -&CREATURE:SHARK_WOBBEGONG_SPOTTED:LIVER -$CREATURE:SHARK_WOBBEGONG_SPOTTED:GUT -(CREATURE:SHARK_WOBBEGONG_SPOTTED:STOMACH -(CREATURE:SHARK_WOBBEGONG_SPOTTED:GIZZARD -)CREATURE:SHARK_WOBBEGONG_SPOTTED:PANCREAS -'CREATURE:SHARK_WOBBEGONG_SPOTTED:SPLEEN -'CREATURE:SHARK_WOBBEGONG_SPOTTED:KIDNEY -CREATURE:SHARK_WHALE:MUSCLE -CREATURE:SHARK_WHALE:EYE -CREATURE:SHARK_WHALE:BRAIN -CREATURE:SHARK_WHALE:LUNG -CREATURE:SHARK_WHALE:HEART -CREATURE:SHARK_WHALE:LIVER -CREATURE:SHARK_WHALE:GUT -CREATURE:SHARK_WHALE:STOMACH -CREATURE:SHARK_WHALE:GIZZARD -CREATURE:SHARK_WHALE:PANCREAS -CREATURE:SHARK_WHALE:SPLEEN -CREATURE:SHARK_WHALE:KIDNEY -CREATURE:SHARK_BASKING:MUSCLE -CREATURE:SHARK_BASKING:EYE -CREATURE:SHARK_BASKING:BRAIN -CREATURE:SHARK_BASKING:LUNG -CREATURE:SHARK_BASKING:HEART -CREATURE:SHARK_BASKING:LIVER -CREATURE:SHARK_BASKING:GUT -CREATURE:SHARK_BASKING:STOMACH -CREATURE:SHARK_BASKING:GIZZARD -CREATURE:SHARK_BASKING:PANCREAS -CREATURE:SHARK_BASKING:SPLEEN -CREATURE:SHARK_BASKING:KIDNEY -CREATURE:SHARK_NURSE:MUSCLE -CREATURE:SHARK_NURSE:EYE -CREATURE:SHARK_NURSE:BRAIN -CREATURE:SHARK_NURSE:LUNG -CREATURE:SHARK_NURSE:HEART -CREATURE:SHARK_NURSE:LIVER -CREATURE:SHARK_NURSE:GUT -CREATURE:SHARK_NURSE:STOMACH -CREATURE:SHARK_NURSE:GIZZARD -CREATURE:SHARK_NURSE:PANCREAS -CREATURE:SHARK_NURSE:SPLEEN -CREATURE:SHARK_NURSE:KIDNEY -#CREATURE:SHARK_MAKO_SHORTFIN:MUSCLE - CREATURE:SHARK_MAKO_SHORTFIN:EYE -"CREATURE:SHARK_MAKO_SHORTFIN:BRAIN -!CREATURE:SHARK_MAKO_SHORTFIN:LUNG -"CREATURE:SHARK_MAKO_SHORTFIN:HEART -"CREATURE:SHARK_MAKO_SHORTFIN:LIVER - CREATURE:SHARK_MAKO_SHORTFIN:GUT -$CREATURE:SHARK_MAKO_SHORTFIN:STOMACH -$CREATURE:SHARK_MAKO_SHORTFIN:GIZZARD -%CREATURE:SHARK_MAKO_SHORTFIN:PANCREAS -#CREATURE:SHARK_MAKO_SHORTFIN:SPLEEN -#CREATURE:SHARK_MAKO_SHORTFIN:KIDNEY -"CREATURE:SHARK_MAKO_LONGFIN:MUSCLE -CREATURE:SHARK_MAKO_LONGFIN:EYE -!CREATURE:SHARK_MAKO_LONGFIN:BRAIN - CREATURE:SHARK_MAKO_LONGFIN:LUNG -!CREATURE:SHARK_MAKO_LONGFIN:HEART -!CREATURE:SHARK_MAKO_LONGFIN:LIVER -CREATURE:SHARK_MAKO_LONGFIN:GUT -#CREATURE:SHARK_MAKO_LONGFIN:STOMACH -#CREATURE:SHARK_MAKO_LONGFIN:GIZZARD -$CREATURE:SHARK_MAKO_LONGFIN:PANCREAS -"CREATURE:SHARK_MAKO_LONGFIN:SPLEEN -"CREATURE:SHARK_MAKO_LONGFIN:KIDNEY -CREATURE:SHARK_TIGER:MUSCLE -CREATURE:SHARK_TIGER:EYE -CREATURE:SHARK_TIGER:BRAIN -CREATURE:SHARK_TIGER:LUNG -CREATURE:SHARK_TIGER:HEART -CREATURE:SHARK_TIGER:LIVER -CREATURE:SHARK_TIGER:GUT -CREATURE:SHARK_TIGER:STOMACH -CREATURE:SHARK_TIGER:GIZZARD -CREATURE:SHARK_TIGER:PANCREAS -CREATURE:SHARK_TIGER:SPLEEN -CREATURE:SHARK_TIGER:KIDNEY -CREATURE:SHARK_BULL:MUSCLE -CREATURE:SHARK_BULL:EYE -CREATURE:SHARK_BULL:BRAIN -CREATURE:SHARK_BULL:LUNG -CREATURE:SHARK_BULL:HEART -CREATURE:SHARK_BULL:LIVER -CREATURE:SHARK_BULL:GUT -CREATURE:SHARK_BULL:STOMACH -CREATURE:SHARK_BULL:GIZZARD -CREATURE:SHARK_BULL:PANCREAS -CREATURE:SHARK_BULL:SPLEEN -CREATURE:SHARK_BULL:KIDNEY -#CREATURE:SHARK_REEF_BLACKTIP:MUSCLE - CREATURE:SHARK_REEF_BLACKTIP:EYE -"CREATURE:SHARK_REEF_BLACKTIP:BRAIN -!CREATURE:SHARK_REEF_BLACKTIP:LUNG -"CREATURE:SHARK_REEF_BLACKTIP:HEART -"CREATURE:SHARK_REEF_BLACKTIP:LIVER - CREATURE:SHARK_REEF_BLACKTIP:GUT -$CREATURE:SHARK_REEF_BLACKTIP:STOMACH -$CREATURE:SHARK_REEF_BLACKTIP:GIZZARD -%CREATURE:SHARK_REEF_BLACKTIP:PANCREAS -#CREATURE:SHARK_REEF_BLACKTIP:SPLEEN -#CREATURE:SHARK_REEF_BLACKTIP:KIDNEY -#CREATURE:SHARK_REEF_WHITETIP:MUSCLE - CREATURE:SHARK_REEF_WHITETIP:EYE -"CREATURE:SHARK_REEF_WHITETIP:BRAIN -!CREATURE:SHARK_REEF_WHITETIP:LUNG -"CREATURE:SHARK_REEF_WHITETIP:HEART -"CREATURE:SHARK_REEF_WHITETIP:LIVER - CREATURE:SHARK_REEF_WHITETIP:GUT -$CREATURE:SHARK_REEF_WHITETIP:STOMACH -$CREATURE:SHARK_REEF_WHITETIP:GIZZARD -%CREATURE:SHARK_REEF_WHITETIP:PANCREAS -#CREATURE:SHARK_REEF_WHITETIP:SPLEEN -#CREATURE:SHARK_REEF_WHITETIP:KIDNEY -CREATURE:SHARK_BLUE:MUSCLE -CREATURE:SHARK_BLUE:EYE -CREATURE:SHARK_BLUE:BRAIN -CREATURE:SHARK_BLUE:LUNG -CREATURE:SHARK_BLUE:HEART -CREATURE:SHARK_BLUE:LIVER -CREATURE:SHARK_BLUE:GUT -CREATURE:SHARK_BLUE:STOMACH -CREATURE:SHARK_BLUE:GIZZARD -CREATURE:SHARK_BLUE:PANCREAS -CREATURE:SHARK_BLUE:SPLEEN -CREATURE:SHARK_BLUE:KIDNEY - CREATURE:SHARK_HAMMERHEAD:MUSCLE -CREATURE:SHARK_HAMMERHEAD:EYE -CREATURE:SHARK_HAMMERHEAD:BRAIN -CREATURE:SHARK_HAMMERHEAD:LUNG -CREATURE:SHARK_HAMMERHEAD:HEART -CREATURE:SHARK_HAMMERHEAD:LIVER -CREATURE:SHARK_HAMMERHEAD:GUT -!CREATURE:SHARK_HAMMERHEAD:STOMACH -!CREATURE:SHARK_HAMMERHEAD:GIZZARD -"CREATURE:SHARK_HAMMERHEAD:PANCREAS - CREATURE:SHARK_HAMMERHEAD:SPLEEN - CREATURE:SHARK_HAMMERHEAD:KIDNEY -CREATURE:SHARK_ANGEL:MUSCLE -CREATURE:SHARK_ANGEL:EYE -CREATURE:SHARK_ANGEL:BRAIN -CREATURE:SHARK_ANGEL:LUNG -CREATURE:SHARK_ANGEL:HEART -CREATURE:SHARK_ANGEL:LIVER -CREATURE:SHARK_ANGEL:GUT -CREATURE:SHARK_ANGEL:STOMACH -CREATURE:SHARK_ANGEL:GIZZARD -CREATURE:SHARK_ANGEL:PANCREAS -CREATURE:SHARK_ANGEL:SPLEEN -CREATURE:SHARK_ANGEL:KIDNEY -!CREATURE:FISH_SKATE_COMMON:MUSCLE -CREATURE:FISH_SKATE_COMMON:EYE - CREATURE:FISH_SKATE_COMMON:BRAIN -CREATURE:FISH_SKATE_COMMON:LUNG - CREATURE:FISH_SKATE_COMMON:HEART - CREATURE:FISH_SKATE_COMMON:LIVER -CREATURE:FISH_SKATE_COMMON:GUT -"CREATURE:FISH_SKATE_COMMON:STOMACH -"CREATURE:FISH_SKATE_COMMON:GIZZARD -#CREATURE:FISH_SKATE_COMMON:PANCREAS -!CREATURE:FISH_SKATE_COMMON:SPLEEN -!CREATURE:FISH_SKATE_COMMON:KIDNEY -CREATURE:FISH_RAY_MANTA:MUSCLE -CREATURE:FISH_RAY_MANTA:EYE -CREATURE:FISH_RAY_MANTA:BRAIN -CREATURE:FISH_RAY_MANTA:LUNG -CREATURE:FISH_RAY_MANTA:HEART -CREATURE:FISH_RAY_MANTA:LIVER -CREATURE:FISH_RAY_MANTA:GUT -CREATURE:FISH_RAY_MANTA:STOMACH -CREATURE:FISH_RAY_MANTA:GIZZARD - CREATURE:FISH_RAY_MANTA:PANCREAS -CREATURE:FISH_RAY_MANTA:SPLEEN -CREATURE:FISH_RAY_MANTA:KIDNEY -CREATURE:FISH_STINGRAY:MUSCLE -CREATURE:FISH_STINGRAY:EYE -CREATURE:FISH_STINGRAY:BRAIN -CREATURE:FISH_STINGRAY:LUNG -CREATURE:FISH_STINGRAY:HEART -CREATURE:FISH_STINGRAY:LIVER -CREATURE:FISH_STINGRAY:GUT -CREATURE:FISH_STINGRAY:STOMACH -CREATURE:FISH_STINGRAY:GIZZARD -CREATURE:FISH_STINGRAY:PANCREAS -CREATURE:FISH_STINGRAY:SPLEEN -CREATURE:FISH_STINGRAY:KIDNEY -CREATURE:FISH_COELACANTH:MUSCLE -CREATURE:FISH_COELACANTH:EYE -CREATURE:FISH_COELACANTH:BRAIN -CREATURE:FISH_COELACANTH:LUNG -CREATURE:FISH_COELACANTH:HEART -CREATURE:FISH_COELACANTH:LIVER -CREATURE:FISH_COELACANTH:GUT - CREATURE:FISH_COELACANTH:STOMACH - CREATURE:FISH_COELACANTH:GIZZARD -!CREATURE:FISH_COELACANTH:PANCREAS -CREATURE:FISH_COELACANTH:SPLEEN -CREATURE:FISH_COELACANTH:KIDNEY -CREATURE:FISH_STURGEON:MUSCLE -CREATURE:FISH_STURGEON:EYE -CREATURE:FISH_STURGEON:BRAIN -CREATURE:FISH_STURGEON:LUNG -CREATURE:FISH_STURGEON:HEART -CREATURE:FISH_STURGEON:LIVER -CREATURE:FISH_STURGEON:GUT -CREATURE:FISH_STURGEON:STOMACH -CREATURE:FISH_STURGEON:GIZZARD -CREATURE:FISH_STURGEON:PANCREAS -CREATURE:FISH_STURGEON:SPLEEN -CREATURE:FISH_STURGEON:KIDNEY -CREATURE:FISH_CONGER_EEL:MUSCLE -CREATURE:FISH_CONGER_EEL:EYE -CREATURE:FISH_CONGER_EEL:BRAIN -CREATURE:FISH_CONGER_EEL:LUNG -CREATURE:FISH_CONGER_EEL:HEART -CREATURE:FISH_CONGER_EEL:LIVER -CREATURE:FISH_CONGER_EEL:GUT - CREATURE:FISH_CONGER_EEL:STOMACH - CREATURE:FISH_CONGER_EEL:GIZZARD -!CREATURE:FISH_CONGER_EEL:PANCREAS -CREATURE:FISH_CONGER_EEL:SPLEEN -CREATURE:FISH_CONGER_EEL:KIDNEY -CREATURE:FISH_MILKFISH:MUSCLE -CREATURE:FISH_MILKFISH:EYE -CREATURE:FISH_MILKFISH:BRAIN -CREATURE:FISH_MILKFISH:LUNG -CREATURE:FISH_MILKFISH:HEART -CREATURE:FISH_MILKFISH:LIVER -CREATURE:FISH_MILKFISH:GUT -CREATURE:FISH_MILKFISH:STOMACH -CREATURE:FISH_MILKFISH:GIZZARD -CREATURE:FISH_MILKFISH:PANCREAS -CREATURE:FISH_MILKFISH:SPLEEN -CREATURE:FISH_MILKFISH:KIDNEY -CREATURE:FISH_COD:MUSCLE -CREATURE:FISH_COD:EYE -CREATURE:FISH_COD:BRAIN -CREATURE:FISH_COD:LUNG -CREATURE:FISH_COD:HEART -CREATURE:FISH_COD:LIVER -CREATURE:FISH_COD:GUT -CREATURE:FISH_COD:STOMACH -CREATURE:FISH_COD:GIZZARD -CREATURE:FISH_COD:PANCREAS -CREATURE:FISH_COD:SPLEEN -CREATURE:FISH_COD:KIDNEY -CREATURE:FISH_OPAH:MUSCLE -CREATURE:FISH_OPAH:EYE -CREATURE:FISH_OPAH:BRAIN -CREATURE:FISH_OPAH:LUNG -CREATURE:FISH_OPAH:HEART -CREATURE:FISH_OPAH:LIVER -CREATURE:FISH_OPAH:GUT -CREATURE:FISH_OPAH:STOMACH -CREATURE:FISH_OPAH:GIZZARD -CREATURE:FISH_OPAH:PANCREAS -CREATURE:FISH_OPAH:SPLEEN -CREATURE:FISH_OPAH:KIDNEY -"CREATURE:FISH_GROUPER_GIANT:MUSCLE -CREATURE:FISH_GROUPER_GIANT:EYE -!CREATURE:FISH_GROUPER_GIANT:BRAIN - CREATURE:FISH_GROUPER_GIANT:LUNG -!CREATURE:FISH_GROUPER_GIANT:HEART -!CREATURE:FISH_GROUPER_GIANT:LIVER -CREATURE:FISH_GROUPER_GIANT:GUT -#CREATURE:FISH_GROUPER_GIANT:STOMACH -#CREATURE:FISH_GROUPER_GIANT:GIZZARD -$CREATURE:FISH_GROUPER_GIANT:PANCREAS -"CREATURE:FISH_GROUPER_GIANT:SPLEEN -"CREATURE:FISH_GROUPER_GIANT:KIDNEY -CREATURE:FISH_BLUEFISH:MUSCLE -CREATURE:FISH_BLUEFISH:EYE -CREATURE:FISH_BLUEFISH:BRAIN -CREATURE:FISH_BLUEFISH:LUNG -CREATURE:FISH_BLUEFISH:HEART -CREATURE:FISH_BLUEFISH:LIVER -CREATURE:FISH_BLUEFISH:GUT -CREATURE:FISH_BLUEFISH:STOMACH -CREATURE:FISH_BLUEFISH:GIZZARD -CREATURE:FISH_BLUEFISH:PANCREAS -CREATURE:FISH_BLUEFISH:SPLEEN -CREATURE:FISH_BLUEFISH:KIDNEY -"CREATURE:FISH_SUNFISH_OCEAN:MUSCLE -CREATURE:FISH_SUNFISH_OCEAN:EYE -!CREATURE:FISH_SUNFISH_OCEAN:BRAIN - CREATURE:FISH_SUNFISH_OCEAN:LUNG -!CREATURE:FISH_SUNFISH_OCEAN:HEART -!CREATURE:FISH_SUNFISH_OCEAN:LIVER -CREATURE:FISH_SUNFISH_OCEAN:GUT -#CREATURE:FISH_SUNFISH_OCEAN:STOMACH -#CREATURE:FISH_SUNFISH_OCEAN:GIZZARD -$CREATURE:FISH_SUNFISH_OCEAN:PANCREAS -"CREATURE:FISH_SUNFISH_OCEAN:SPLEEN -"CREATURE:FISH_SUNFISH_OCEAN:KIDNEY -CREATURE:FISH_SWORDFISH:MUSCLE -CREATURE:FISH_SWORDFISH:EYE -CREATURE:FISH_SWORDFISH:BRAIN -CREATURE:FISH_SWORDFISH:LUNG -CREATURE:FISH_SWORDFISH:HEART -CREATURE:FISH_SWORDFISH:LIVER -CREATURE:FISH_SWORDFISH:GUT -CREATURE:FISH_SWORDFISH:STOMACH -CREATURE:FISH_SWORDFISH:GIZZARD - CREATURE:FISH_SWORDFISH:PANCREAS -CREATURE:FISH_SWORDFISH:SPLEEN -CREATURE:FISH_SWORDFISH:KIDNEY -CREATURE:FISH_MARLIN:MUSCLE -CREATURE:FISH_MARLIN:EYE -CREATURE:FISH_MARLIN:BRAIN -CREATURE:FISH_MARLIN:LUNG -CREATURE:FISH_MARLIN:HEART -CREATURE:FISH_MARLIN:LIVER -CREATURE:FISH_MARLIN:GUT -CREATURE:FISH_MARLIN:STOMACH -CREATURE:FISH_MARLIN:GIZZARD -CREATURE:FISH_MARLIN:PANCREAS -CREATURE:FISH_MARLIN:SPLEEN -CREATURE:FISH_MARLIN:KIDNEY -CREATURE:FISH_HALIBUT:MUSCLE -CREATURE:FISH_HALIBUT:EYE -CREATURE:FISH_HALIBUT:BRAIN -CREATURE:FISH_HALIBUT:LUNG -CREATURE:FISH_HALIBUT:HEART -CREATURE:FISH_HALIBUT:LIVER -CREATURE:FISH_HALIBUT:GUT -CREATURE:FISH_HALIBUT:STOMACH -CREATURE:FISH_HALIBUT:GIZZARD -CREATURE:FISH_HALIBUT:PANCREAS -CREATURE:FISH_HALIBUT:SPLEEN -CREATURE:FISH_HALIBUT:KIDNEY -$CREATURE:FISH_BARRACUDA_GREAT:MUSCLE -!CREATURE:FISH_BARRACUDA_GREAT:EYE -#CREATURE:FISH_BARRACUDA_GREAT:BRAIN -"CREATURE:FISH_BARRACUDA_GREAT:LUNG -#CREATURE:FISH_BARRACUDA_GREAT:HEART -#CREATURE:FISH_BARRACUDA_GREAT:LIVER -!CREATURE:FISH_BARRACUDA_GREAT:GUT -%CREATURE:FISH_BARRACUDA_GREAT:STOMACH -%CREATURE:FISH_BARRACUDA_GREAT:GIZZARD -&CREATURE:FISH_BARRACUDA_GREAT:PANCREAS -$CREATURE:FISH_BARRACUDA_GREAT:SPLEEN -$CREATURE:FISH_BARRACUDA_GREAT:KIDNEY -!CREATURE:FISH_TUNA_BLUEFIN:MUSCLE -CREATURE:FISH_TUNA_BLUEFIN:EYE - CREATURE:FISH_TUNA_BLUEFIN:BRAIN -CREATURE:FISH_TUNA_BLUEFIN:LUNG - CREATURE:FISH_TUNA_BLUEFIN:HEART - CREATURE:FISH_TUNA_BLUEFIN:LIVER -CREATURE:FISH_TUNA_BLUEFIN:GUT -"CREATURE:FISH_TUNA_BLUEFIN:STOMACH -"CREATURE:FISH_TUNA_BLUEFIN:GIZZARD -#CREATURE:FISH_TUNA_BLUEFIN:PANCREAS -!CREATURE:FISH_TUNA_BLUEFIN:SPLEEN -!CREATURE:FISH_TUNA_BLUEFIN:KIDNEY -CREATURE:NARWHAL:MUSCLE -CREATURE:NARWHAL:EYE -CREATURE:NARWHAL:BRAIN -CREATURE:NARWHAL:LUNG -CREATURE:NARWHAL:HEART -CREATURE:NARWHAL:LIVER -CREATURE:NARWHAL:GUT -CREATURE:NARWHAL:STOMACH -CREATURE:NARWHAL:GIZZARD -CREATURE:NARWHAL:PANCREAS -CREATURE:NARWHAL:SPLEEN -CREATURE:NARWHAL:KIDNEY -CREATURE:NARWHAL MAN:MUSCLE -CREATURE:NARWHAL MAN:EYE -CREATURE:NARWHAL MAN:BRAIN -CREATURE:NARWHAL MAN:LUNG -CREATURE:NARWHAL MAN:HEART -CREATURE:NARWHAL MAN:LIVER -CREATURE:NARWHAL MAN:GUT -CREATURE:NARWHAL MAN:STOMACH -CREATURE:NARWHAL MAN:GIZZARD -CREATURE:NARWHAL MAN:PANCREAS -CREATURE:NARWHAL MAN:SPLEEN -CREATURE:NARWHAL MAN:KIDNEY -CREATURE:NARWHAL, GIANT:MUSCLE -CREATURE:NARWHAL, GIANT:EYE -CREATURE:NARWHAL, GIANT:BRAIN -CREATURE:NARWHAL, GIANT:LUNG -CREATURE:NARWHAL, GIANT:HEART -CREATURE:NARWHAL, GIANT:LIVER -CREATURE:NARWHAL, GIANT:GUT -CREATURE:NARWHAL, GIANT:STOMACH -CREATURE:NARWHAL, GIANT:GIZZARD - CREATURE:NARWHAL, GIANT:PANCREAS -CREATURE:NARWHAL, GIANT:SPLEEN -CREATURE:NARWHAL, GIANT:KIDNEY -CREATURE:HIPPO:MUSCLE -CREATURE:HIPPO:EYE -CREATURE:HIPPO:BRAIN -CREATURE:HIPPO:LUNG -CREATURE:HIPPO:HEART -CREATURE:HIPPO:LIVER -CREATURE:HIPPO:GUT -CREATURE:HIPPO:STOMACH -CREATURE:HIPPO:GIZZARD -CREATURE:HIPPO:PANCREAS -CREATURE:HIPPO:SPLEEN -CREATURE:HIPPO:KIDNEY -CREATURE:HIPPO_MAN:MUSCLE -CREATURE:HIPPO_MAN:EYE -CREATURE:HIPPO_MAN:BRAIN -CREATURE:HIPPO_MAN:LUNG -CREATURE:HIPPO_MAN:HEART -CREATURE:HIPPO_MAN:LIVER -CREATURE:HIPPO_MAN:GUT -CREATURE:HIPPO_MAN:STOMACH -CREATURE:HIPPO_MAN:GIZZARD -CREATURE:HIPPO_MAN:PANCREAS -CREATURE:HIPPO_MAN:SPLEEN -CREATURE:HIPPO_MAN:KIDNEY -CREATURE:GIANT_HIPPO:MUSCLE -CREATURE:GIANT_HIPPO:EYE -CREATURE:GIANT_HIPPO:BRAIN -CREATURE:GIANT_HIPPO:LUNG -CREATURE:GIANT_HIPPO:HEART -CREATURE:GIANT_HIPPO:LIVER -CREATURE:GIANT_HIPPO:GUT -CREATURE:GIANT_HIPPO:STOMACH -CREATURE:GIANT_HIPPO:GIZZARD -CREATURE:GIANT_HIPPO:PANCREAS -CREATURE:GIANT_HIPPO:SPLEEN -CREATURE:GIANT_HIPPO:KIDNEY -!CREATURE:FISH_GAR_LONGNOSE:MUSCLE -CREATURE:FISH_GAR_LONGNOSE:EYE - CREATURE:FISH_GAR_LONGNOSE:BRAIN -CREATURE:FISH_GAR_LONGNOSE:LUNG - CREATURE:FISH_GAR_LONGNOSE:HEART - CREATURE:FISH_GAR_LONGNOSE:LIVER -CREATURE:FISH_GAR_LONGNOSE:GUT -"CREATURE:FISH_GAR_LONGNOSE:STOMACH -"CREATURE:FISH_GAR_LONGNOSE:GIZZARD -#CREATURE:FISH_GAR_LONGNOSE:PANCREAS -!CREATURE:FISH_GAR_LONGNOSE:SPLEEN -!CREATURE:FISH_GAR_LONGNOSE:KIDNEY -CREATURE:FISH_CARP:MUSCLE -CREATURE:FISH_CARP:EYE -CREATURE:FISH_CARP:BRAIN -CREATURE:FISH_CARP:LUNG -CREATURE:FISH_CARP:HEART -CREATURE:FISH_CARP:LIVER -CREATURE:FISH_CARP:GUT -CREATURE:FISH_CARP:STOMACH -CREATURE:FISH_CARP:GIZZARD -CREATURE:FISH_CARP:PANCREAS -CREATURE:FISH_CARP:SPLEEN -CREATURE:FISH_CARP:KIDNEY -CREATURE:FISH_TIGERFISH:MUSCLE -CREATURE:FISH_TIGERFISH:EYE -CREATURE:FISH_TIGERFISH:BRAIN -CREATURE:FISH_TIGERFISH:LUNG -CREATURE:FISH_TIGERFISH:HEART -CREATURE:FISH_TIGERFISH:LIVER -CREATURE:FISH_TIGERFISH:GUT -CREATURE:FISH_TIGERFISH:STOMACH -CREATURE:FISH_TIGERFISH:GIZZARD - CREATURE:FISH_TIGERFISH:PANCREAS -CREATURE:FISH_TIGERFISH:SPLEEN -CREATURE:FISH_TIGERFISH:KIDNEY -CREATURE:FISH_PIKE:MUSCLE -CREATURE:FISH_PIKE:EYE -CREATURE:FISH_PIKE:BRAIN -CREATURE:FISH_PIKE:LUNG -CREATURE:FISH_PIKE:HEART -CREATURE:FISH_PIKE:LIVER -CREATURE:FISH_PIKE:GUT -CREATURE:FISH_PIKE:STOMACH -CREATURE:FISH_PIKE:GIZZARD -CREATURE:FISH_PIKE:PANCREAS -CREATURE:FISH_PIKE:SPLEEN -CREATURE:FISH_PIKE:KIDNEY -CREATURE:PLATYPUS:MUSCLE -CREATURE:PLATYPUS:EYE -CREATURE:PLATYPUS:BRAIN -CREATURE:PLATYPUS:LUNG -CREATURE:PLATYPUS:HEART -CREATURE:PLATYPUS:LIVER -CREATURE:PLATYPUS:GUT -CREATURE:PLATYPUS:STOMACH -CREATURE:PLATYPUS:GIZZARD -CREATURE:PLATYPUS:PANCREAS -CREATURE:PLATYPUS:SPLEEN -CREATURE:PLATYPUS:KIDNEY -CREATURE:PLATYPUS MAN:MUSCLE -CREATURE:PLATYPUS MAN:EYE -CREATURE:PLATYPUS MAN:BRAIN -CREATURE:PLATYPUS MAN:LUNG -CREATURE:PLATYPUS MAN:HEART -CREATURE:PLATYPUS MAN:LIVER -CREATURE:PLATYPUS MAN:GUT -CREATURE:PLATYPUS MAN:STOMACH -CREATURE:PLATYPUS MAN:GIZZARD -CREATURE:PLATYPUS MAN:PANCREAS -CREATURE:PLATYPUS MAN:SPLEEN -CREATURE:PLATYPUS MAN:KIDNEY -CREATURE:PLATYPUS, GIANT:MUSCLE -CREATURE:PLATYPUS, GIANT:EYE -CREATURE:PLATYPUS, GIANT:BRAIN -CREATURE:PLATYPUS, GIANT:LUNG -CREATURE:PLATYPUS, GIANT:HEART -CREATURE:PLATYPUS, GIANT:LIVER -CREATURE:PLATYPUS, GIANT:GUT - CREATURE:PLATYPUS, GIANT:STOMACH - CREATURE:PLATYPUS, GIANT:GIZZARD -!CREATURE:PLATYPUS, GIANT:PANCREAS -CREATURE:PLATYPUS, GIANT:SPLEEN -CREATURE:PLATYPUS, GIANT:KIDNEY -CREATURE:BEAR_GRIZZLY:MUSCLE -CREATURE:BEAR_GRIZZLY:EYE -CREATURE:BEAR_GRIZZLY:BRAIN -CREATURE:BEAR_GRIZZLY:LUNG -CREATURE:BEAR_GRIZZLY:HEART -CREATURE:BEAR_GRIZZLY:LIVER -CREATURE:BEAR_GRIZZLY:GUT -CREATURE:BEAR_GRIZZLY:STOMACH -CREATURE:BEAR_GRIZZLY:GIZZARD -CREATURE:BEAR_GRIZZLY:PANCREAS -CREATURE:BEAR_GRIZZLY:SPLEEN -CREATURE:BEAR_GRIZZLY:KIDNEY - CREATURE:BEAR_GRIZZLY_MAN:MUSCLE -CREATURE:BEAR_GRIZZLY_MAN:EYE -CREATURE:BEAR_GRIZZLY_MAN:BRAIN -CREATURE:BEAR_GRIZZLY_MAN:LUNG -CREATURE:BEAR_GRIZZLY_MAN:HEART -CREATURE:BEAR_GRIZZLY_MAN:LIVER -CREATURE:BEAR_GRIZZLY_MAN:GUT -!CREATURE:BEAR_GRIZZLY_MAN:STOMACH -!CREATURE:BEAR_GRIZZLY_MAN:GIZZARD -"CREATURE:BEAR_GRIZZLY_MAN:PANCREAS - CREATURE:BEAR_GRIZZLY_MAN:SPLEEN - CREATURE:BEAR_GRIZZLY_MAN:KIDNEY -"CREATURE:GIANT_BEAR_GRIZZLY:MUSCLE -CREATURE:GIANT_BEAR_GRIZZLY:EYE -!CREATURE:GIANT_BEAR_GRIZZLY:BRAIN - CREATURE:GIANT_BEAR_GRIZZLY:LUNG -!CREATURE:GIANT_BEAR_GRIZZLY:HEART -!CREATURE:GIANT_BEAR_GRIZZLY:LIVER -CREATURE:GIANT_BEAR_GRIZZLY:GUT -#CREATURE:GIANT_BEAR_GRIZZLY:STOMACH -#CREATURE:GIANT_BEAR_GRIZZLY:GIZZARD -$CREATURE:GIANT_BEAR_GRIZZLY:PANCREAS -"CREATURE:GIANT_BEAR_GRIZZLY:SPLEEN -"CREATURE:GIANT_BEAR_GRIZZLY:KIDNEY -CREATURE:BEAR_BLACK:MUSCLE -CREATURE:BEAR_BLACK:EYE -CREATURE:BEAR_BLACK:BRAIN -CREATURE:BEAR_BLACK:LUNG -CREATURE:BEAR_BLACK:HEART -CREATURE:BEAR_BLACK:LIVER -CREATURE:BEAR_BLACK:GUT -CREATURE:BEAR_BLACK:STOMACH -CREATURE:BEAR_BLACK:GIZZARD -CREATURE:BEAR_BLACK:PANCREAS -CREATURE:BEAR_BLACK:SPLEEN -CREATURE:BEAR_BLACK:KIDNEY -CREATURE:BEAR_BLACK_MAN:MUSCLE -CREATURE:BEAR_BLACK_MAN:EYE -CREATURE:BEAR_BLACK_MAN:BRAIN -CREATURE:BEAR_BLACK_MAN:LUNG -CREATURE:BEAR_BLACK_MAN:HEART -CREATURE:BEAR_BLACK_MAN:LIVER -CREATURE:BEAR_BLACK_MAN:GUT -CREATURE:BEAR_BLACK_MAN:STOMACH -CREATURE:BEAR_BLACK_MAN:GIZZARD - CREATURE:BEAR_BLACK_MAN:PANCREAS -CREATURE:BEAR_BLACK_MAN:SPLEEN -CREATURE:BEAR_BLACK_MAN:KIDNEY - CREATURE:GIANT_BEAR_BLACK:MUSCLE -CREATURE:GIANT_BEAR_BLACK:EYE -CREATURE:GIANT_BEAR_BLACK:BRAIN -CREATURE:GIANT_BEAR_BLACK:LUNG -CREATURE:GIANT_BEAR_BLACK:HEART -CREATURE:GIANT_BEAR_BLACK:LIVER -CREATURE:GIANT_BEAR_BLACK:GUT -!CREATURE:GIANT_BEAR_BLACK:STOMACH -!CREATURE:GIANT_BEAR_BLACK:GIZZARD -"CREATURE:GIANT_BEAR_BLACK:PANCREAS - CREATURE:GIANT_BEAR_BLACK:SPLEEN - CREATURE:GIANT_BEAR_BLACK:KIDNEY -CREATURE:DEER:MUSCLE -CREATURE:DEER:EYE -CREATURE:DEER:BRAIN -CREATURE:DEER:LUNG -CREATURE:DEER:HEART -CREATURE:DEER:LIVER -CREATURE:DEER:GUT -CREATURE:DEER:STOMACH -CREATURE:DEER:GIZZARD -CREATURE:DEER:PANCREAS -CREATURE:DEER:SPLEEN -CREATURE:DEER:KIDNEY -CREATURE:DEER_MAN:MUSCLE -CREATURE:DEER_MAN:EYE -CREATURE:DEER_MAN:BRAIN -CREATURE:DEER_MAN:LUNG -CREATURE:DEER_MAN:HEART -CREATURE:DEER_MAN:LIVER -CREATURE:DEER_MAN:GUT -CREATURE:DEER_MAN:STOMACH -CREATURE:DEER_MAN:GIZZARD -CREATURE:DEER_MAN:PANCREAS -CREATURE:DEER_MAN:SPLEEN -CREATURE:DEER_MAN:KIDNEY -CREATURE:GIANT_DEER:MUSCLE -CREATURE:GIANT_DEER:EYE -CREATURE:GIANT_DEER:BRAIN -CREATURE:GIANT_DEER:LUNG -CREATURE:GIANT_DEER:HEART -CREATURE:GIANT_DEER:LIVER -CREATURE:GIANT_DEER:GUT -CREATURE:GIANT_DEER:STOMACH -CREATURE:GIANT_DEER:GIZZARD -CREATURE:GIANT_DEER:PANCREAS -CREATURE:GIANT_DEER:SPLEEN -CREATURE:GIANT_DEER:KIDNEY -CREATURE:FOX:MUSCLE -CREATURE:FOX:EYE -CREATURE:FOX:BRAIN -CREATURE:FOX:LUNG -CREATURE:FOX:HEART -CREATURE:FOX:LIVER -CREATURE:FOX:GUT -CREATURE:FOX:STOMACH -CREATURE:FOX:GIZZARD -CREATURE:FOX:PANCREAS -CREATURE:FOX:SPLEEN -CREATURE:FOX:KIDNEY -CREATURE:FOX_MAN:MUSCLE -CREATURE:FOX_MAN:EYE -CREATURE:FOX_MAN:BRAIN -CREATURE:FOX_MAN:LUNG -CREATURE:FOX_MAN:HEART -CREATURE:FOX_MAN:LIVER -CREATURE:FOX_MAN:GUT -CREATURE:FOX_MAN:STOMACH -CREATURE:FOX_MAN:GIZZARD -CREATURE:FOX_MAN:PANCREAS -CREATURE:FOX_MAN:SPLEEN -CREATURE:FOX_MAN:KIDNEY -CREATURE:GIANT_FOX:MUSCLE -CREATURE:GIANT_FOX:EYE -CREATURE:GIANT_FOX:BRAIN -CREATURE:GIANT_FOX:LUNG -CREATURE:GIANT_FOX:HEART -CREATURE:GIANT_FOX:LIVER -CREATURE:GIANT_FOX:GUT -CREATURE:GIANT_FOX:STOMACH -CREATURE:GIANT_FOX:GIZZARD -CREATURE:GIANT_FOX:PANCREAS -CREATURE:GIANT_FOX:SPLEEN -CREATURE:GIANT_FOX:KIDNEY -CREATURE:RACCOON:MUSCLE -CREATURE:RACCOON:EYE -CREATURE:RACCOON:BRAIN -CREATURE:RACCOON:LUNG -CREATURE:RACCOON:HEART -CREATURE:RACCOON:LIVER -CREATURE:RACCOON:GUT -CREATURE:RACCOON:STOMACH -CREATURE:RACCOON:GIZZARD -CREATURE:RACCOON:PANCREAS -CREATURE:RACCOON:SPLEEN -CREATURE:RACCOON:KIDNEY -CREATURE:RACCOON_MAN:MUSCLE -CREATURE:RACCOON_MAN:EYE -CREATURE:RACCOON_MAN:BRAIN -CREATURE:RACCOON_MAN:LUNG -CREATURE:RACCOON_MAN:HEART -CREATURE:RACCOON_MAN:LIVER -CREATURE:RACCOON_MAN:GUT -CREATURE:RACCOON_MAN:STOMACH -CREATURE:RACCOON_MAN:GIZZARD -CREATURE:RACCOON_MAN:PANCREAS -CREATURE:RACCOON_MAN:SPLEEN -CREATURE:RACCOON_MAN:KIDNEY -CREATURE:GIANT_RACCOON:MUSCLE -CREATURE:GIANT_RACCOON:EYE -CREATURE:GIANT_RACCOON:BRAIN -CREATURE:GIANT_RACCOON:LUNG -CREATURE:GIANT_RACCOON:HEART -CREATURE:GIANT_RACCOON:LIVER -CREATURE:GIANT_RACCOON:GUT -CREATURE:GIANT_RACCOON:STOMACH -CREATURE:GIANT_RACCOON:GIZZARD -CREATURE:GIANT_RACCOON:PANCREAS -CREATURE:GIANT_RACCOON:SPLEEN -CREATURE:GIANT_RACCOON:KIDNEY -CREATURE:MACAQUE_RHESUS:MUSCLE -CREATURE:MACAQUE_RHESUS:EYE -CREATURE:MACAQUE_RHESUS:BRAIN -CREATURE:MACAQUE_RHESUS:LUNG -CREATURE:MACAQUE_RHESUS:HEART -CREATURE:MACAQUE_RHESUS:LIVER -CREATURE:MACAQUE_RHESUS:GUT -CREATURE:MACAQUE_RHESUS:STOMACH -CREATURE:MACAQUE_RHESUS:GIZZARD - CREATURE:MACAQUE_RHESUS:PANCREAS -CREATURE:MACAQUE_RHESUS:SPLEEN -CREATURE:MACAQUE_RHESUS:KIDNEY -"CREATURE:MACAQUE_RHESUS_MAN:MUSCLE -CREATURE:MACAQUE_RHESUS_MAN:EYE -!CREATURE:MACAQUE_RHESUS_MAN:BRAIN - CREATURE:MACAQUE_RHESUS_MAN:LUNG -!CREATURE:MACAQUE_RHESUS_MAN:HEART -!CREATURE:MACAQUE_RHESUS_MAN:LIVER -CREATURE:MACAQUE_RHESUS_MAN:GUT -#CREATURE:MACAQUE_RHESUS_MAN:STOMACH -#CREATURE:MACAQUE_RHESUS_MAN:GIZZARD -$CREATURE:MACAQUE_RHESUS_MAN:PANCREAS -"CREATURE:MACAQUE_RHESUS_MAN:SPLEEN -"CREATURE:MACAQUE_RHESUS_MAN:KIDNEY -$CREATURE:GIANT_MACAQUE_RHESUS:MUSCLE -!CREATURE:GIANT_MACAQUE_RHESUS:EYE -#CREATURE:GIANT_MACAQUE_RHESUS:BRAIN -"CREATURE:GIANT_MACAQUE_RHESUS:LUNG -#CREATURE:GIANT_MACAQUE_RHESUS:HEART -#CREATURE:GIANT_MACAQUE_RHESUS:LIVER -!CREATURE:GIANT_MACAQUE_RHESUS:GUT -%CREATURE:GIANT_MACAQUE_RHESUS:STOMACH -%CREATURE:GIANT_MACAQUE_RHESUS:GIZZARD -&CREATURE:GIANT_MACAQUE_RHESUS:PANCREAS -$CREATURE:GIANT_MACAQUE_RHESUS:SPLEEN -$CREATURE:GIANT_MACAQUE_RHESUS:KIDNEY -CREATURE:COUGAR:MUSCLE -CREATURE:COUGAR:EYE -CREATURE:COUGAR:BRAIN -CREATURE:COUGAR:LUNG -CREATURE:COUGAR:HEART -CREATURE:COUGAR:LIVER -CREATURE:COUGAR:GUT -CREATURE:COUGAR:STOMACH -CREATURE:COUGAR:GIZZARD -CREATURE:COUGAR:PANCREAS -CREATURE:COUGAR:SPLEEN -CREATURE:COUGAR:KIDNEY -CREATURE:COUGAR_MAN:MUSCLE -CREATURE:COUGAR_MAN:EYE -CREATURE:COUGAR_MAN:BRAIN -CREATURE:COUGAR_MAN:LUNG -CREATURE:COUGAR_MAN:HEART -CREATURE:COUGAR_MAN:LIVER -CREATURE:COUGAR_MAN:GUT -CREATURE:COUGAR_MAN:STOMACH -CREATURE:COUGAR_MAN:GIZZARD -CREATURE:COUGAR_MAN:PANCREAS -CREATURE:COUGAR_MAN:SPLEEN -CREATURE:COUGAR_MAN:KIDNEY -CREATURE:GIANT_COUGAR:MUSCLE -CREATURE:GIANT_COUGAR:EYE -CREATURE:GIANT_COUGAR:BRAIN -CREATURE:GIANT_COUGAR:LUNG -CREATURE:GIANT_COUGAR:HEART -CREATURE:GIANT_COUGAR:LIVER -CREATURE:GIANT_COUGAR:GUT -CREATURE:GIANT_COUGAR:STOMACH -CREATURE:GIANT_COUGAR:GIZZARD -CREATURE:GIANT_COUGAR:PANCREAS -CREATURE:GIANT_COUGAR:SPLEEN -CREATURE:GIANT_COUGAR:KIDNEY -CREATURE:WOLF:MUSCLE -CREATURE:WOLF:EYE -CREATURE:WOLF:BRAIN -CREATURE:WOLF:LUNG -CREATURE:WOLF:HEART -CREATURE:WOLF:LIVER -CREATURE:WOLF:GUT -CREATURE:WOLF:STOMACH -CREATURE:WOLF:GIZZARD -CREATURE:WOLF:PANCREAS -CREATURE:WOLF:SPLEEN -CREATURE:WOLF:KIDNEY -CREATURE:WOLF_MAN:MUSCLE -CREATURE:WOLF_MAN:EYE -CREATURE:WOLF_MAN:BRAIN -CREATURE:WOLF_MAN:LUNG -CREATURE:WOLF_MAN:HEART -CREATURE:WOLF_MAN:LIVER -CREATURE:WOLF_MAN:GUT -CREATURE:WOLF_MAN:STOMACH -CREATURE:WOLF_MAN:GIZZARD -CREATURE:WOLF_MAN:PANCREAS -CREATURE:WOLF_MAN:SPLEEN -CREATURE:WOLF_MAN:KIDNEY -CREATURE:GIANT_WOLF:MUSCLE -CREATURE:GIANT_WOLF:EYE -CREATURE:GIANT_WOLF:BRAIN -CREATURE:GIANT_WOLF:LUNG -CREATURE:GIANT_WOLF:HEART -CREATURE:GIANT_WOLF:LIVER -CREATURE:GIANT_WOLF:GUT -CREATURE:GIANT_WOLF:STOMACH -CREATURE:GIANT_WOLF:GIZZARD -CREATURE:GIANT_WOLF:PANCREAS -CREATURE:GIANT_WOLF:SPLEEN -CREATURE:GIANT_WOLF:KIDNEY -CREATURE:GROUNDHOG:MUSCLE -CREATURE:GROUNDHOG:EYE -CREATURE:GROUNDHOG:BRAIN -CREATURE:GROUNDHOG:LUNG -CREATURE:GROUNDHOG:HEART -CREATURE:GROUNDHOG:LIVER -CREATURE:GROUNDHOG:GUT -CREATURE:GROUNDHOG:STOMACH -CREATURE:GROUNDHOG:GIZZARD -CREATURE:GROUNDHOG:PANCREAS -CREATURE:GROUNDHOG:SPLEEN -CREATURE:GROUNDHOG:KIDNEY -CREATURE:GROUNDHOG_MAN:MUSCLE -CREATURE:GROUNDHOG_MAN:EYE -CREATURE:GROUNDHOG_MAN:BRAIN -CREATURE:GROUNDHOG_MAN:LUNG -CREATURE:GROUNDHOG_MAN:HEART -CREATURE:GROUNDHOG_MAN:LIVER -CREATURE:GROUNDHOG_MAN:GUT -CREATURE:GROUNDHOG_MAN:STOMACH -CREATURE:GROUNDHOG_MAN:GIZZARD -CREATURE:GROUNDHOG_MAN:PANCREAS -CREATURE:GROUNDHOG_MAN:SPLEEN -CREATURE:GROUNDHOG_MAN:KIDNEY -CREATURE:GIANT_GROUNDHOG:MUSCLE -CREATURE:GIANT_GROUNDHOG:EYE -CREATURE:GIANT_GROUNDHOG:BRAIN -CREATURE:GIANT_GROUNDHOG:LUNG -CREATURE:GIANT_GROUNDHOG:HEART -CREATURE:GIANT_GROUNDHOG:LIVER -CREATURE:GIANT_GROUNDHOG:GUT - CREATURE:GIANT_GROUNDHOG:STOMACH - CREATURE:GIANT_GROUNDHOG:GIZZARD -!CREATURE:GIANT_GROUNDHOG:PANCREAS -CREATURE:GIANT_GROUNDHOG:SPLEEN -CREATURE:GIANT_GROUNDHOG:KIDNEY -CREATURE:ALLIGATOR:MUSCLE -CREATURE:ALLIGATOR:EYE -CREATURE:ALLIGATOR:BRAIN -CREATURE:ALLIGATOR:LUNG -CREATURE:ALLIGATOR:HEART -CREATURE:ALLIGATOR:LIVER -CREATURE:ALLIGATOR:GUT -CREATURE:ALLIGATOR:STOMACH -CREATURE:ALLIGATOR:GIZZARD -CREATURE:ALLIGATOR:PANCREAS -CREATURE:ALLIGATOR:SPLEEN -CREATURE:ALLIGATOR:KIDNEY -CREATURE:ALLIGATOR_MAN:MUSCLE -CREATURE:ALLIGATOR_MAN:EYE -CREATURE:ALLIGATOR_MAN:BRAIN -CREATURE:ALLIGATOR_MAN:LUNG -CREATURE:ALLIGATOR_MAN:HEART -CREATURE:ALLIGATOR_MAN:LIVER -CREATURE:ALLIGATOR_MAN:GUT -CREATURE:ALLIGATOR_MAN:STOMACH -CREATURE:ALLIGATOR_MAN:GIZZARD -CREATURE:ALLIGATOR_MAN:PANCREAS -CREATURE:ALLIGATOR_MAN:SPLEEN -CREATURE:ALLIGATOR_MAN:KIDNEY -CREATURE:GIANT_ALLIGATOR:MUSCLE -CREATURE:GIANT_ALLIGATOR:EYE -CREATURE:GIANT_ALLIGATOR:BRAIN -CREATURE:GIANT_ALLIGATOR:LUNG -CREATURE:GIANT_ALLIGATOR:HEART -CREATURE:GIANT_ALLIGATOR:LIVER -CREATURE:GIANT_ALLIGATOR:GUT - CREATURE:GIANT_ALLIGATOR:STOMACH - CREATURE:GIANT_ALLIGATOR:GIZZARD -!CREATURE:GIANT_ALLIGATOR:PANCREAS -CREATURE:GIANT_ALLIGATOR:SPLEEN -CREATURE:GIANT_ALLIGATOR:KIDNEY -CREATURE:BIRD_BUZZARD:MUSCLE -CREATURE:BIRD_BUZZARD:EYE -CREATURE:BIRD_BUZZARD:BRAIN -CREATURE:BIRD_BUZZARD:LUNG -CREATURE:BIRD_BUZZARD:HEART -CREATURE:BIRD_BUZZARD:LIVER -CREATURE:BIRD_BUZZARD:GUT -CREATURE:BIRD_BUZZARD:STOMACH -CREATURE:BIRD_BUZZARD:GIZZARD -CREATURE:BIRD_BUZZARD:PANCREAS -CREATURE:BIRD_BUZZARD:SPLEEN -CREATURE:BIRD_BUZZARD:KIDNEY -CREATURE:BUZZARD_MAN:MUSCLE -CREATURE:BUZZARD_MAN:EYE -CREATURE:BUZZARD_MAN:BRAIN -CREATURE:BUZZARD_MAN:LUNG -CREATURE:BUZZARD_MAN:HEART -CREATURE:BUZZARD_MAN:LIVER -CREATURE:BUZZARD_MAN:GUT -CREATURE:BUZZARD_MAN:STOMACH -CREATURE:BUZZARD_MAN:GIZZARD -CREATURE:BUZZARD_MAN:PANCREAS -CREATURE:BUZZARD_MAN:SPLEEN -CREATURE:BUZZARD_MAN:KIDNEY -CREATURE:GIANT_BUZZARD:MUSCLE -CREATURE:GIANT_BUZZARD:EYE -CREATURE:GIANT_BUZZARD:BRAIN -CREATURE:GIANT_BUZZARD:LUNG -CREATURE:GIANT_BUZZARD:HEART -CREATURE:GIANT_BUZZARD:LIVER -CREATURE:GIANT_BUZZARD:GUT -CREATURE:GIANT_BUZZARD:STOMACH -CREATURE:GIANT_BUZZARD:GIZZARD -CREATURE:GIANT_BUZZARD:PANCREAS -CREATURE:GIANT_BUZZARD:SPLEEN -CREATURE:GIANT_BUZZARD:KIDNEY -CREATURE:PANDA:MUSCLE -CREATURE:PANDA:EYE -CREATURE:PANDA:BRAIN -CREATURE:PANDA:LUNG -CREATURE:PANDA:HEART -CREATURE:PANDA:LIVER -CREATURE:PANDA:GUT -CREATURE:PANDA:STOMACH -CREATURE:PANDA:GIZZARD -CREATURE:PANDA:PANCREAS -CREATURE:PANDA:SPLEEN -CREATURE:PANDA:KIDNEY -CREATURE:PANDA, GIGANTIC:MUSCLE -CREATURE:PANDA, GIGANTIC:EYE -CREATURE:PANDA, GIGANTIC:BRAIN -CREATURE:PANDA, GIGANTIC:LUNG -CREATURE:PANDA, GIGANTIC:HEART -CREATURE:PANDA, GIGANTIC:LIVER -CREATURE:PANDA, GIGANTIC:GUT - CREATURE:PANDA, GIGANTIC:STOMACH - CREATURE:PANDA, GIGANTIC:GIZZARD -!CREATURE:PANDA, GIGANTIC:PANCREAS -CREATURE:PANDA, GIGANTIC:SPLEEN -CREATURE:PANDA, GIGANTIC:KIDNEY -CREATURE:PANDA MAN:MUSCLE -CREATURE:PANDA MAN:EYE -CREATURE:PANDA MAN:BRAIN -CREATURE:PANDA MAN:LUNG -CREATURE:PANDA MAN:HEART -CREATURE:PANDA MAN:LIVER -CREATURE:PANDA MAN:GUT -CREATURE:PANDA MAN:STOMACH -CREATURE:PANDA MAN:GIZZARD -CREATURE:PANDA MAN:PANCREAS -CREATURE:PANDA MAN:SPLEEN -CREATURE:PANDA MAN:KIDNEY -CREATURE:CAPYBARA:MUSCLE -CREATURE:CAPYBARA:EYE -CREATURE:CAPYBARA:BRAIN -CREATURE:CAPYBARA:LUNG -CREATURE:CAPYBARA:HEART -CREATURE:CAPYBARA:LIVER -CREATURE:CAPYBARA:GUT -CREATURE:CAPYBARA:STOMACH -CREATURE:CAPYBARA:GIZZARD -CREATURE:CAPYBARA:PANCREAS -CREATURE:CAPYBARA:SPLEEN -CREATURE:CAPYBARA:KIDNEY -CREATURE:CAPYBARA, GIANT:MUSCLE -CREATURE:CAPYBARA, GIANT:EYE -CREATURE:CAPYBARA, GIANT:BRAIN -CREATURE:CAPYBARA, GIANT:LUNG -CREATURE:CAPYBARA, GIANT:HEART -CREATURE:CAPYBARA, GIANT:LIVER -CREATURE:CAPYBARA, GIANT:GUT - CREATURE:CAPYBARA, GIANT:STOMACH - CREATURE:CAPYBARA, GIANT:GIZZARD -!CREATURE:CAPYBARA, GIANT:PANCREAS -CREATURE:CAPYBARA, GIANT:SPLEEN -CREATURE:CAPYBARA, GIANT:KIDNEY -CREATURE:CAPYBARA MAN:MUSCLE -CREATURE:CAPYBARA MAN:EYE -CREATURE:CAPYBARA MAN:BRAIN -CREATURE:CAPYBARA MAN:LUNG -CREATURE:CAPYBARA MAN:HEART -CREATURE:CAPYBARA MAN:LIVER -CREATURE:CAPYBARA MAN:GUT -CREATURE:CAPYBARA MAN:STOMACH -CREATURE:CAPYBARA MAN:GIZZARD -CREATURE:CAPYBARA MAN:PANCREAS -CREATURE:CAPYBARA MAN:SPLEEN -CREATURE:CAPYBARA MAN:KIDNEY -CREATURE:BADGER:MUSCLE -CREATURE:BADGER:EYE -CREATURE:BADGER:BRAIN -CREATURE:BADGER:LUNG -CREATURE:BADGER:HEART -CREATURE:BADGER:LIVER -CREATURE:BADGER:GUT -CREATURE:BADGER:STOMACH -CREATURE:BADGER:GIZZARD -CREATURE:BADGER:PANCREAS -CREATURE:BADGER:SPLEEN -CREATURE:BADGER:KIDNEY -CREATURE:BADGER MAN:MUSCLE -CREATURE:BADGER MAN:EYE -CREATURE:BADGER MAN:BRAIN -CREATURE:BADGER MAN:LUNG -CREATURE:BADGER MAN:HEART -CREATURE:BADGER MAN:LIVER -CREATURE:BADGER MAN:GUT -CREATURE:BADGER MAN:STOMACH -CREATURE:BADGER MAN:GIZZARD -CREATURE:BADGER MAN:PANCREAS -CREATURE:BADGER MAN:SPLEEN -CREATURE:BADGER MAN:KIDNEY -CREATURE:BADGER, GIANT:MUSCLE -CREATURE:BADGER, GIANT:EYE -CREATURE:BADGER, GIANT:BRAIN -CREATURE:BADGER, GIANT:LUNG -CREATURE:BADGER, GIANT:HEART -CREATURE:BADGER, GIANT:LIVER -CREATURE:BADGER, GIANT:GUT -CREATURE:BADGER, GIANT:STOMACH -CREATURE:BADGER, GIANT:GIZZARD -CREATURE:BADGER, GIANT:PANCREAS -CREATURE:BADGER, GIANT:SPLEEN -CREATURE:BADGER, GIANT:KIDNEY -CREATURE:MOOSE:MUSCLE -CREATURE:MOOSE:EYE -CREATURE:MOOSE:BRAIN -CREATURE:MOOSE:LUNG -CREATURE:MOOSE:HEART -CREATURE:MOOSE:LIVER -CREATURE:MOOSE:GUT -CREATURE:MOOSE:STOMACH -CREATURE:MOOSE:GIZZARD -CREATURE:MOOSE:PANCREAS -CREATURE:MOOSE:SPLEEN -CREATURE:MOOSE:KIDNEY -CREATURE:MOOSE MAN:MUSCLE -CREATURE:MOOSE MAN:EYE -CREATURE:MOOSE MAN:BRAIN -CREATURE:MOOSE MAN:LUNG -CREATURE:MOOSE MAN:HEART -CREATURE:MOOSE MAN:LIVER -CREATURE:MOOSE MAN:GUT -CREATURE:MOOSE MAN:STOMACH -CREATURE:MOOSE MAN:GIZZARD -CREATURE:MOOSE MAN:PANCREAS -CREATURE:MOOSE MAN:SPLEEN -CREATURE:MOOSE MAN:KIDNEY -CREATURE:MOOSE, GIANT:MUSCLE -CREATURE:MOOSE, GIANT:EYE -CREATURE:MOOSE, GIANT:BRAIN -CREATURE:MOOSE, GIANT:LUNG -CREATURE:MOOSE, GIANT:HEART -CREATURE:MOOSE, GIANT:LIVER -CREATURE:MOOSE, GIANT:GUT -CREATURE:MOOSE, GIANT:STOMACH -CREATURE:MOOSE, GIANT:GIZZARD -CREATURE:MOOSE, GIANT:PANCREAS -CREATURE:MOOSE, GIANT:SPLEEN -CREATURE:MOOSE, GIANT:KIDNEY -CREATURE:RED PANDA:MUSCLE -CREATURE:RED PANDA:EYE -CREATURE:RED PANDA:BRAIN -CREATURE:RED PANDA:LUNG -CREATURE:RED PANDA:HEART -CREATURE:RED PANDA:LIVER -CREATURE:RED PANDA:GUT -CREATURE:RED PANDA:STOMACH -CREATURE:RED PANDA:GIZZARD -CREATURE:RED PANDA:PANCREAS -CREATURE:RED PANDA:SPLEEN -CREATURE:RED PANDA:KIDNEY -CREATURE:RED PANDA MAN:MUSCLE -CREATURE:RED PANDA MAN:EYE -CREATURE:RED PANDA MAN:BRAIN -CREATURE:RED PANDA MAN:LUNG -CREATURE:RED PANDA MAN:HEART -CREATURE:RED PANDA MAN:LIVER -CREATURE:RED PANDA MAN:GUT -CREATURE:RED PANDA MAN:STOMACH -CREATURE:RED PANDA MAN:GIZZARD -CREATURE:RED PANDA MAN:PANCREAS -CREATURE:RED PANDA MAN:SPLEEN -CREATURE:RED PANDA MAN:KIDNEY - CREATURE:RED PANDA, GIANT:MUSCLE -CREATURE:RED PANDA, GIANT:EYE -CREATURE:RED PANDA, GIANT:BRAIN -CREATURE:RED PANDA, GIANT:LUNG -CREATURE:RED PANDA, GIANT:HEART -CREATURE:RED PANDA, GIANT:LIVER -CREATURE:RED PANDA, GIANT:GUT -!CREATURE:RED PANDA, GIANT:STOMACH -!CREATURE:RED PANDA, GIANT:GIZZARD -"CREATURE:RED PANDA, GIANT:PANCREAS - CREATURE:RED PANDA, GIANT:SPLEEN - CREATURE:RED PANDA, GIANT:KIDNEY -CREATURE:ELEPHANT:MUSCLE -CREATURE:ELEPHANT:EYE -CREATURE:ELEPHANT:BRAIN -CREATURE:ELEPHANT:LUNG -CREATURE:ELEPHANT:HEART -CREATURE:ELEPHANT:LIVER -CREATURE:ELEPHANT:GUT -CREATURE:ELEPHANT:STOMACH -CREATURE:ELEPHANT:GIZZARD -CREATURE:ELEPHANT:PANCREAS -CREATURE:ELEPHANT:SPLEEN -CREATURE:ELEPHANT:KIDNEY -CREATURE:ELEPHANT_MAN:MUSCLE -CREATURE:ELEPHANT_MAN:EYE -CREATURE:ELEPHANT_MAN:BRAIN -CREATURE:ELEPHANT_MAN:LUNG -CREATURE:ELEPHANT_MAN:HEART -CREATURE:ELEPHANT_MAN:LIVER -CREATURE:ELEPHANT_MAN:GUT -CREATURE:ELEPHANT_MAN:STOMACH -CREATURE:ELEPHANT_MAN:GIZZARD -CREATURE:ELEPHANT_MAN:PANCREAS -CREATURE:ELEPHANT_MAN:SPLEEN -CREATURE:ELEPHANT_MAN:KIDNEY -CREATURE:GIANT_ELEPHANT:MUSCLE -CREATURE:GIANT_ELEPHANT:EYE -CREATURE:GIANT_ELEPHANT:BRAIN -CREATURE:GIANT_ELEPHANT:LUNG -CREATURE:GIANT_ELEPHANT:HEART -CREATURE:GIANT_ELEPHANT:LIVER -CREATURE:GIANT_ELEPHANT:GUT -CREATURE:GIANT_ELEPHANT:STOMACH -CREATURE:GIANT_ELEPHANT:GIZZARD - CREATURE:GIANT_ELEPHANT:PANCREAS -CREATURE:GIANT_ELEPHANT:SPLEEN -CREATURE:GIANT_ELEPHANT:KIDNEY -CREATURE:WARTHOG:MUSCLE -CREATURE:WARTHOG:EYE -CREATURE:WARTHOG:BRAIN -CREATURE:WARTHOG:LUNG -CREATURE:WARTHOG:HEART -CREATURE:WARTHOG:LIVER -CREATURE:WARTHOG:GUT -CREATURE:WARTHOG:STOMACH -CREATURE:WARTHOG:GIZZARD -CREATURE:WARTHOG:PANCREAS -CREATURE:WARTHOG:SPLEEN -CREATURE:WARTHOG:KIDNEY -CREATURE:WARTHOG_MAN:MUSCLE -CREATURE:WARTHOG_MAN:EYE -CREATURE:WARTHOG_MAN:BRAIN -CREATURE:WARTHOG_MAN:LUNG -CREATURE:WARTHOG_MAN:HEART -CREATURE:WARTHOG_MAN:LIVER -CREATURE:WARTHOG_MAN:GUT -CREATURE:WARTHOG_MAN:STOMACH -CREATURE:WARTHOG_MAN:GIZZARD -CREATURE:WARTHOG_MAN:PANCREAS -CREATURE:WARTHOG_MAN:SPLEEN -CREATURE:WARTHOG_MAN:KIDNEY -CREATURE:GIANT_WARTHOG:MUSCLE -CREATURE:GIANT_WARTHOG:EYE -CREATURE:GIANT_WARTHOG:BRAIN -CREATURE:GIANT_WARTHOG:LUNG -CREATURE:GIANT_WARTHOG:HEART -CREATURE:GIANT_WARTHOG:LIVER -CREATURE:GIANT_WARTHOG:GUT -CREATURE:GIANT_WARTHOG:STOMACH -CREATURE:GIANT_WARTHOG:GIZZARD -CREATURE:GIANT_WARTHOG:PANCREAS -CREATURE:GIANT_WARTHOG:SPLEEN -CREATURE:GIANT_WARTHOG:KIDNEY -CREATURE:LION:MUSCLE -CREATURE:LION:EYE -CREATURE:LION:BRAIN -CREATURE:LION:LUNG -CREATURE:LION:HEART -CREATURE:LION:LIVER -CREATURE:LION:GUT -CREATURE:LION:STOMACH -CREATURE:LION:GIZZARD -CREATURE:LION:PANCREAS -CREATURE:LION:SPLEEN -CREATURE:LION:KIDNEY -CREATURE:LION_MAN:MUSCLE -CREATURE:LION_MAN:EYE -CREATURE:LION_MAN:BRAIN -CREATURE:LION_MAN:LUNG -CREATURE:LION_MAN:HEART -CREATURE:LION_MAN:LIVER -CREATURE:LION_MAN:GUT -CREATURE:LION_MAN:STOMACH -CREATURE:LION_MAN:GIZZARD -CREATURE:LION_MAN:PANCREAS -CREATURE:LION_MAN:SPLEEN -CREATURE:LION_MAN:KIDNEY -CREATURE:GIANT_LION:MUSCLE -CREATURE:GIANT_LION:EYE -CREATURE:GIANT_LION:BRAIN -CREATURE:GIANT_LION:LUNG -CREATURE:GIANT_LION:HEART -CREATURE:GIANT_LION:LIVER -CREATURE:GIANT_LION:GUT -CREATURE:GIANT_LION:STOMACH -CREATURE:GIANT_LION:GIZZARD -CREATURE:GIANT_LION:PANCREAS -CREATURE:GIANT_LION:SPLEEN -CREATURE:GIANT_LION:KIDNEY -CREATURE:LEOPARD:MUSCLE -CREATURE:LEOPARD:EYE -CREATURE:LEOPARD:BRAIN -CREATURE:LEOPARD:LUNG -CREATURE:LEOPARD:HEART -CREATURE:LEOPARD:LIVER -CREATURE:LEOPARD:GUT -CREATURE:LEOPARD:STOMACH -CREATURE:LEOPARD:GIZZARD -CREATURE:LEOPARD:PANCREAS -CREATURE:LEOPARD:SPLEEN -CREATURE:LEOPARD:KIDNEY -CREATURE:LEOPARD_MAN:MUSCLE -CREATURE:LEOPARD_MAN:EYE -CREATURE:LEOPARD_MAN:BRAIN -CREATURE:LEOPARD_MAN:LUNG -CREATURE:LEOPARD_MAN:HEART -CREATURE:LEOPARD_MAN:LIVER -CREATURE:LEOPARD_MAN:GUT -CREATURE:LEOPARD_MAN:STOMACH -CREATURE:LEOPARD_MAN:GIZZARD -CREATURE:LEOPARD_MAN:PANCREAS -CREATURE:LEOPARD_MAN:SPLEEN -CREATURE:LEOPARD_MAN:KIDNEY -CREATURE:GIANT_LEOPARD:MUSCLE -CREATURE:GIANT_LEOPARD:EYE -CREATURE:GIANT_LEOPARD:BRAIN -CREATURE:GIANT_LEOPARD:LUNG -CREATURE:GIANT_LEOPARD:HEART -CREATURE:GIANT_LEOPARD:LIVER -CREATURE:GIANT_LEOPARD:GUT -CREATURE:GIANT_LEOPARD:STOMACH -CREATURE:GIANT_LEOPARD:GIZZARD -CREATURE:GIANT_LEOPARD:PANCREAS -CREATURE:GIANT_LEOPARD:SPLEEN -CREATURE:GIANT_LEOPARD:KIDNEY -CREATURE:JAGUAR:MUSCLE -CREATURE:JAGUAR:EYE -CREATURE:JAGUAR:BRAIN -CREATURE:JAGUAR:LUNG -CREATURE:JAGUAR:HEART -CREATURE:JAGUAR:LIVER -CREATURE:JAGUAR:GUT -CREATURE:JAGUAR:STOMACH -CREATURE:JAGUAR:GIZZARD -CREATURE:JAGUAR:PANCREAS -CREATURE:JAGUAR:SPLEEN -CREATURE:JAGUAR:KIDNEY -CREATURE:JAGUAR_MAN:MUSCLE -CREATURE:JAGUAR_MAN:EYE -CREATURE:JAGUAR_MAN:BRAIN -CREATURE:JAGUAR_MAN:LUNG -CREATURE:JAGUAR_MAN:HEART -CREATURE:JAGUAR_MAN:LIVER -CREATURE:JAGUAR_MAN:GUT -CREATURE:JAGUAR_MAN:STOMACH -CREATURE:JAGUAR_MAN:GIZZARD -CREATURE:JAGUAR_MAN:PANCREAS -CREATURE:JAGUAR_MAN:SPLEEN -CREATURE:JAGUAR_MAN:KIDNEY -CREATURE:GIANT_JAGUAR:MUSCLE -CREATURE:GIANT_JAGUAR:EYE -CREATURE:GIANT_JAGUAR:BRAIN -CREATURE:GIANT_JAGUAR:LUNG -CREATURE:GIANT_JAGUAR:HEART -CREATURE:GIANT_JAGUAR:LIVER -CREATURE:GIANT_JAGUAR:GUT -CREATURE:GIANT_JAGUAR:STOMACH -CREATURE:GIANT_JAGUAR:GIZZARD -CREATURE:GIANT_JAGUAR:PANCREAS -CREATURE:GIANT_JAGUAR:SPLEEN -CREATURE:GIANT_JAGUAR:KIDNEY -CREATURE:TIGER:MUSCLE -CREATURE:TIGER:EYE -CREATURE:TIGER:BRAIN -CREATURE:TIGER:LUNG -CREATURE:TIGER:HEART -CREATURE:TIGER:LIVER -CREATURE:TIGER:GUT -CREATURE:TIGER:STOMACH -CREATURE:TIGER:GIZZARD -CREATURE:TIGER:PANCREAS -CREATURE:TIGER:SPLEEN -CREATURE:TIGER:KIDNEY -CREATURE:TIGER_MAN:MUSCLE -CREATURE:TIGER_MAN:EYE -CREATURE:TIGER_MAN:BRAIN -CREATURE:TIGER_MAN:LUNG -CREATURE:TIGER_MAN:HEART -CREATURE:TIGER_MAN:LIVER -CREATURE:TIGER_MAN:GUT -CREATURE:TIGER_MAN:STOMACH -CREATURE:TIGER_MAN:GIZZARD -CREATURE:TIGER_MAN:PANCREAS -CREATURE:TIGER_MAN:SPLEEN -CREATURE:TIGER_MAN:KIDNEY -CREATURE:GIANT_TIGER:MUSCLE -CREATURE:GIANT_TIGER:EYE -CREATURE:GIANT_TIGER:BRAIN -CREATURE:GIANT_TIGER:LUNG -CREATURE:GIANT_TIGER:HEART -CREATURE:GIANT_TIGER:LIVER -CREATURE:GIANT_TIGER:GUT -CREATURE:GIANT_TIGER:STOMACH -CREATURE:GIANT_TIGER:GIZZARD -CREATURE:GIANT_TIGER:PANCREAS -CREATURE:GIANT_TIGER:SPLEEN -CREATURE:GIANT_TIGER:KIDNEY -CREATURE:CHEETAH:MUSCLE -CREATURE:CHEETAH:EYE -CREATURE:CHEETAH:BRAIN -CREATURE:CHEETAH:LUNG -CREATURE:CHEETAH:HEART -CREATURE:CHEETAH:LIVER -CREATURE:CHEETAH:GUT -CREATURE:CHEETAH:STOMACH -CREATURE:CHEETAH:GIZZARD -CREATURE:CHEETAH:PANCREAS -CREATURE:CHEETAH:SPLEEN -CREATURE:CHEETAH:KIDNEY -CREATURE:CHEETAH_MAN:MUSCLE -CREATURE:CHEETAH_MAN:EYE -CREATURE:CHEETAH_MAN:BRAIN -CREATURE:CHEETAH_MAN:LUNG -CREATURE:CHEETAH_MAN:HEART -CREATURE:CHEETAH_MAN:LIVER -CREATURE:CHEETAH_MAN:GUT -CREATURE:CHEETAH_MAN:STOMACH -CREATURE:CHEETAH_MAN:GIZZARD -CREATURE:CHEETAH_MAN:PANCREAS -CREATURE:CHEETAH_MAN:SPLEEN -CREATURE:CHEETAH_MAN:KIDNEY -CREATURE:GIANT_CHEETAH:MUSCLE -CREATURE:GIANT_CHEETAH:EYE -CREATURE:GIANT_CHEETAH:BRAIN -CREATURE:GIANT_CHEETAH:LUNG -CREATURE:GIANT_CHEETAH:HEART -CREATURE:GIANT_CHEETAH:LIVER -CREATURE:GIANT_CHEETAH:GUT -CREATURE:GIANT_CHEETAH:STOMACH -CREATURE:GIANT_CHEETAH:GIZZARD -CREATURE:GIANT_CHEETAH:PANCREAS -CREATURE:GIANT_CHEETAH:SPLEEN -CREATURE:GIANT_CHEETAH:KIDNEY -CREATURE:GAZELLE:MUSCLE -CREATURE:GAZELLE:EYE -CREATURE:GAZELLE:BRAIN -CREATURE:GAZELLE:LUNG -CREATURE:GAZELLE:HEART -CREATURE:GAZELLE:LIVER -CREATURE:GAZELLE:GUT -CREATURE:GAZELLE:STOMACH -CREATURE:GAZELLE:GIZZARD -CREATURE:GAZELLE:PANCREAS -CREATURE:GAZELLE:SPLEEN -CREATURE:GAZELLE:KIDNEY -CREATURE:GAZELLE_MAN:MUSCLE -CREATURE:GAZELLE_MAN:EYE -CREATURE:GAZELLE_MAN:BRAIN -CREATURE:GAZELLE_MAN:LUNG -CREATURE:GAZELLE_MAN:HEART -CREATURE:GAZELLE_MAN:LIVER -CREATURE:GAZELLE_MAN:GUT -CREATURE:GAZELLE_MAN:STOMACH -CREATURE:GAZELLE_MAN:GIZZARD -CREATURE:GAZELLE_MAN:PANCREAS -CREATURE:GAZELLE_MAN:SPLEEN -CREATURE:GAZELLE_MAN:KIDNEY -CREATURE:GIANT_GAZELLE:MUSCLE -CREATURE:GIANT_GAZELLE:EYE -CREATURE:GIANT_GAZELLE:BRAIN -CREATURE:GIANT_GAZELLE:LUNG -CREATURE:GIANT_GAZELLE:HEART -CREATURE:GIANT_GAZELLE:LIVER -CREATURE:GIANT_GAZELLE:GUT -CREATURE:GIANT_GAZELLE:STOMACH -CREATURE:GIANT_GAZELLE:GIZZARD -CREATURE:GIANT_GAZELLE:PANCREAS -CREATURE:GIANT_GAZELLE:SPLEEN -CREATURE:GIANT_GAZELLE:KIDNEY -CREATURE:MANDRILL:MUSCLE -CREATURE:MANDRILL:EYE -CREATURE:MANDRILL:BRAIN -CREATURE:MANDRILL:LUNG -CREATURE:MANDRILL:HEART -CREATURE:MANDRILL:LIVER -CREATURE:MANDRILL:GUT -CREATURE:MANDRILL:STOMACH -CREATURE:MANDRILL:GIZZARD -CREATURE:MANDRILL:PANCREAS -CREATURE:MANDRILL:SPLEEN -CREATURE:MANDRILL:KIDNEY -CREATURE:MANDRILL_MAN:MUSCLE -CREATURE:MANDRILL_MAN:EYE -CREATURE:MANDRILL_MAN:BRAIN -CREATURE:MANDRILL_MAN:LUNG -CREATURE:MANDRILL_MAN:HEART -CREATURE:MANDRILL_MAN:LIVER -CREATURE:MANDRILL_MAN:GUT -CREATURE:MANDRILL_MAN:STOMACH -CREATURE:MANDRILL_MAN:GIZZARD -CREATURE:MANDRILL_MAN:PANCREAS -CREATURE:MANDRILL_MAN:SPLEEN -CREATURE:MANDRILL_MAN:KIDNEY -CREATURE:GIANT_MANDRILL:MUSCLE -CREATURE:GIANT_MANDRILL:EYE -CREATURE:GIANT_MANDRILL:BRAIN -CREATURE:GIANT_MANDRILL:LUNG -CREATURE:GIANT_MANDRILL:HEART -CREATURE:GIANT_MANDRILL:LIVER -CREATURE:GIANT_MANDRILL:GUT -CREATURE:GIANT_MANDRILL:STOMACH -CREATURE:GIANT_MANDRILL:GIZZARD - CREATURE:GIANT_MANDRILL:PANCREAS -CREATURE:GIANT_MANDRILL:SPLEEN -CREATURE:GIANT_MANDRILL:KIDNEY -CREATURE:CHIMPANZEE:MUSCLE -CREATURE:CHIMPANZEE:EYE -CREATURE:CHIMPANZEE:BRAIN -CREATURE:CHIMPANZEE:LUNG -CREATURE:CHIMPANZEE:HEART -CREATURE:CHIMPANZEE:LIVER -CREATURE:CHIMPANZEE:GUT -CREATURE:CHIMPANZEE:STOMACH -CREATURE:CHIMPANZEE:GIZZARD -CREATURE:CHIMPANZEE:PANCREAS -CREATURE:CHIMPANZEE:SPLEEN -CREATURE:CHIMPANZEE:KIDNEY -CREATURE:BONOBO:MUSCLE -CREATURE:BONOBO:EYE -CREATURE:BONOBO:BRAIN -CREATURE:BONOBO:LUNG -CREATURE:BONOBO:HEART -CREATURE:BONOBO:LIVER -CREATURE:BONOBO:GUT -CREATURE:BONOBO:STOMACH -CREATURE:BONOBO:GIZZARD -CREATURE:BONOBO:PANCREAS -CREATURE:BONOBO:SPLEEN -CREATURE:BONOBO:KIDNEY -CREATURE:GORILLA:MUSCLE -CREATURE:GORILLA:EYE -CREATURE:GORILLA:BRAIN -CREATURE:GORILLA:LUNG -CREATURE:GORILLA:HEART -CREATURE:GORILLA:LIVER -CREATURE:GORILLA:GUT -CREATURE:GORILLA:STOMACH -CREATURE:GORILLA:GIZZARD -CREATURE:GORILLA:PANCREAS -CREATURE:GORILLA:SPLEEN -CREATURE:GORILLA:KIDNEY -CREATURE:ORANGUTAN:MUSCLE -CREATURE:ORANGUTAN:EYE -CREATURE:ORANGUTAN:BRAIN -CREATURE:ORANGUTAN:LUNG -CREATURE:ORANGUTAN:HEART -CREATURE:ORANGUTAN:LIVER -CREATURE:ORANGUTAN:GUT -CREATURE:ORANGUTAN:STOMACH -CREATURE:ORANGUTAN:GIZZARD -CREATURE:ORANGUTAN:PANCREAS -CREATURE:ORANGUTAN:SPLEEN -CREATURE:ORANGUTAN:KIDNEY -CREATURE:GIBBON_SIAMANG:MUSCLE -CREATURE:GIBBON_SIAMANG:EYE -CREATURE:GIBBON_SIAMANG:BRAIN -CREATURE:GIBBON_SIAMANG:LUNG -CREATURE:GIBBON_SIAMANG:HEART -CREATURE:GIBBON_SIAMANG:LIVER -CREATURE:GIBBON_SIAMANG:GUT -CREATURE:GIBBON_SIAMANG:STOMACH -CREATURE:GIBBON_SIAMANG:GIZZARD - CREATURE:GIBBON_SIAMANG:PANCREAS -CREATURE:GIBBON_SIAMANG:SPLEEN -CREATURE:GIBBON_SIAMANG:KIDNEY -#CREATURE:GIBBON_WHITE_HANDED:MUSCLE - CREATURE:GIBBON_WHITE_HANDED:EYE -"CREATURE:GIBBON_WHITE_HANDED:BRAIN -!CREATURE:GIBBON_WHITE_HANDED:LUNG -"CREATURE:GIBBON_WHITE_HANDED:HEART -"CREATURE:GIBBON_WHITE_HANDED:LIVER - CREATURE:GIBBON_WHITE_HANDED:GUT -$CREATURE:GIBBON_WHITE_HANDED:STOMACH -$CREATURE:GIBBON_WHITE_HANDED:GIZZARD -%CREATURE:GIBBON_WHITE_HANDED:PANCREAS -#CREATURE:GIBBON_WHITE_HANDED:SPLEEN -#CREATURE:GIBBON_WHITE_HANDED:KIDNEY -#CREATURE:GIBBON_BLACK_HANDED:MUSCLE - CREATURE:GIBBON_BLACK_HANDED:EYE -"CREATURE:GIBBON_BLACK_HANDED:BRAIN -!CREATURE:GIBBON_BLACK_HANDED:LUNG -"CREATURE:GIBBON_BLACK_HANDED:HEART -"CREATURE:GIBBON_BLACK_HANDED:LIVER - CREATURE:GIBBON_BLACK_HANDED:GUT -$CREATURE:GIBBON_BLACK_HANDED:STOMACH -$CREATURE:GIBBON_BLACK_HANDED:GIZZARD -%CREATURE:GIBBON_BLACK_HANDED:PANCREAS -#CREATURE:GIBBON_BLACK_HANDED:SPLEEN -#CREATURE:GIBBON_BLACK_HANDED:KIDNEY -CREATURE:GIBBON_GRAY:MUSCLE -CREATURE:GIBBON_GRAY:EYE -CREATURE:GIBBON_GRAY:BRAIN -CREATURE:GIBBON_GRAY:LUNG -CREATURE:GIBBON_GRAY:HEART -CREATURE:GIBBON_GRAY:LIVER -CREATURE:GIBBON_GRAY:GUT -CREATURE:GIBBON_GRAY:STOMACH -CREATURE:GIBBON_GRAY:GIZZARD -CREATURE:GIBBON_GRAY:PANCREAS -CREATURE:GIBBON_GRAY:SPLEEN -CREATURE:GIBBON_GRAY:KIDNEY -CREATURE:GIBBON_SILVERY:MUSCLE -CREATURE:GIBBON_SILVERY:EYE -CREATURE:GIBBON_SILVERY:BRAIN -CREATURE:GIBBON_SILVERY:LUNG -CREATURE:GIBBON_SILVERY:HEART -CREATURE:GIBBON_SILVERY:LIVER -CREATURE:GIBBON_SILVERY:GUT -CREATURE:GIBBON_SILVERY:STOMACH -CREATURE:GIBBON_SILVERY:GIZZARD - CREATURE:GIBBON_SILVERY:PANCREAS -CREATURE:GIBBON_SILVERY:SPLEEN -CREATURE:GIBBON_SILVERY:KIDNEY -CREATURE:GIBBON_PILEATED:MUSCLE -CREATURE:GIBBON_PILEATED:EYE -CREATURE:GIBBON_PILEATED:BRAIN -CREATURE:GIBBON_PILEATED:LUNG -CREATURE:GIBBON_PILEATED:HEART -CREATURE:GIBBON_PILEATED:LIVER -CREATURE:GIBBON_PILEATED:GUT - CREATURE:GIBBON_PILEATED:STOMACH - CREATURE:GIBBON_PILEATED:GIZZARD -!CREATURE:GIBBON_PILEATED:PANCREAS -CREATURE:GIBBON_PILEATED:SPLEEN -CREATURE:GIBBON_PILEATED:KIDNEY -CREATURE:GIBBON_BILOU:MUSCLE -CREATURE:GIBBON_BILOU:EYE -CREATURE:GIBBON_BILOU:BRAIN -CREATURE:GIBBON_BILOU:LUNG -CREATURE:GIBBON_BILOU:HEART -CREATURE:GIBBON_BILOU:LIVER -CREATURE:GIBBON_BILOU:GUT -CREATURE:GIBBON_BILOU:STOMACH -CREATURE:GIBBON_BILOU:GIZZARD -CREATURE:GIBBON_BILOU:PANCREAS -CREATURE:GIBBON_BILOU:SPLEEN -CREATURE:GIBBON_BILOU:KIDNEY -#CREATURE:GIBBON_WHITE_BROWED:MUSCLE - CREATURE:GIBBON_WHITE_BROWED:EYE -"CREATURE:GIBBON_WHITE_BROWED:BRAIN -!CREATURE:GIBBON_WHITE_BROWED:LUNG -"CREATURE:GIBBON_WHITE_BROWED:HEART -"CREATURE:GIBBON_WHITE_BROWED:LIVER - CREATURE:GIBBON_WHITE_BROWED:GUT -$CREATURE:GIBBON_WHITE_BROWED:STOMACH -$CREATURE:GIBBON_WHITE_BROWED:GIZZARD -%CREATURE:GIBBON_WHITE_BROWED:PANCREAS -#CREATURE:GIBBON_WHITE_BROWED:SPLEEN -#CREATURE:GIBBON_WHITE_BROWED:KIDNEY -$CREATURE:GIBBON_BLACK_CRESTED:MUSCLE -!CREATURE:GIBBON_BLACK_CRESTED:EYE -#CREATURE:GIBBON_BLACK_CRESTED:BRAIN -"CREATURE:GIBBON_BLACK_CRESTED:LUNG -#CREATURE:GIBBON_BLACK_CRESTED:HEART -#CREATURE:GIBBON_BLACK_CRESTED:LIVER -!CREATURE:GIBBON_BLACK_CRESTED:GUT -%CREATURE:GIBBON_BLACK_CRESTED:STOMACH -%CREATURE:GIBBON_BLACK_CRESTED:GIZZARD -&CREATURE:GIBBON_BLACK_CRESTED:PANCREAS -$CREATURE:GIBBON_BLACK_CRESTED:SPLEEN -$CREATURE:GIBBON_BLACK_CRESTED:KIDNEY -CREATURE:CAMEL_1_HUMP:MUSCLE -CREATURE:CAMEL_1_HUMP:EYE -CREATURE:CAMEL_1_HUMP:BRAIN -CREATURE:CAMEL_1_HUMP:LUNG -CREATURE:CAMEL_1_HUMP:HEART -CREATURE:CAMEL_1_HUMP:LIVER -CREATURE:CAMEL_1_HUMP:GUT -CREATURE:CAMEL_1_HUMP:STOMACH -CREATURE:CAMEL_1_HUMP:GIZZARD -CREATURE:CAMEL_1_HUMP:PANCREAS -CREATURE:CAMEL_1_HUMP:SPLEEN -CREATURE:CAMEL_1_HUMP:KIDNEY - CREATURE:CAMEL_1_HUMP_MAN:MUSCLE -CREATURE:CAMEL_1_HUMP_MAN:EYE -CREATURE:CAMEL_1_HUMP_MAN:BRAIN -CREATURE:CAMEL_1_HUMP_MAN:LUNG -CREATURE:CAMEL_1_HUMP_MAN:HEART -CREATURE:CAMEL_1_HUMP_MAN:LIVER -CREATURE:CAMEL_1_HUMP_MAN:GUT -!CREATURE:CAMEL_1_HUMP_MAN:STOMACH -!CREATURE:CAMEL_1_HUMP_MAN:GIZZARD -"CREATURE:CAMEL_1_HUMP_MAN:PANCREAS - CREATURE:CAMEL_1_HUMP_MAN:SPLEEN - CREATURE:CAMEL_1_HUMP_MAN:KIDNEY -"CREATURE:GIANT_CAMEL_1_HUMP:MUSCLE -CREATURE:GIANT_CAMEL_1_HUMP:EYE -!CREATURE:GIANT_CAMEL_1_HUMP:BRAIN - CREATURE:GIANT_CAMEL_1_HUMP:LUNG -!CREATURE:GIANT_CAMEL_1_HUMP:HEART -!CREATURE:GIANT_CAMEL_1_HUMP:LIVER -CREATURE:GIANT_CAMEL_1_HUMP:GUT -#CREATURE:GIANT_CAMEL_1_HUMP:STOMACH -#CREATURE:GIANT_CAMEL_1_HUMP:GIZZARD -$CREATURE:GIANT_CAMEL_1_HUMP:PANCREAS -"CREATURE:GIANT_CAMEL_1_HUMP:SPLEEN -"CREATURE:GIANT_CAMEL_1_HUMP:KIDNEY -CREATURE:CAMEL_2_HUMP:MUSCLE -CREATURE:CAMEL_2_HUMP:EYE -CREATURE:CAMEL_2_HUMP:BRAIN -CREATURE:CAMEL_2_HUMP:LUNG -CREATURE:CAMEL_2_HUMP:HEART -CREATURE:CAMEL_2_HUMP:LIVER -CREATURE:CAMEL_2_HUMP:GUT -CREATURE:CAMEL_2_HUMP:STOMACH -CREATURE:CAMEL_2_HUMP:GIZZARD -CREATURE:CAMEL_2_HUMP:PANCREAS -CREATURE:CAMEL_2_HUMP:SPLEEN -CREATURE:CAMEL_2_HUMP:KIDNEY - CREATURE:CAMEL_2_HUMP_MAN:MUSCLE -CREATURE:CAMEL_2_HUMP_MAN:EYE -CREATURE:CAMEL_2_HUMP_MAN:BRAIN -CREATURE:CAMEL_2_HUMP_MAN:LUNG -CREATURE:CAMEL_2_HUMP_MAN:HEART -CREATURE:CAMEL_2_HUMP_MAN:LIVER -CREATURE:CAMEL_2_HUMP_MAN:GUT -!CREATURE:CAMEL_2_HUMP_MAN:STOMACH -!CREATURE:CAMEL_2_HUMP_MAN:GIZZARD -"CREATURE:CAMEL_2_HUMP_MAN:PANCREAS - CREATURE:CAMEL_2_HUMP_MAN:SPLEEN - CREATURE:CAMEL_2_HUMP_MAN:KIDNEY -"CREATURE:GIANT_CAMEL_2_HUMP:MUSCLE -CREATURE:GIANT_CAMEL_2_HUMP:EYE -!CREATURE:GIANT_CAMEL_2_HUMP:BRAIN - CREATURE:GIANT_CAMEL_2_HUMP:LUNG -!CREATURE:GIANT_CAMEL_2_HUMP:HEART -!CREATURE:GIANT_CAMEL_2_HUMP:LIVER -CREATURE:GIANT_CAMEL_2_HUMP:GUT -#CREATURE:GIANT_CAMEL_2_HUMP:STOMACH -#CREATURE:GIANT_CAMEL_2_HUMP:GIZZARD -$CREATURE:GIANT_CAMEL_2_HUMP:PANCREAS -"CREATURE:GIANT_CAMEL_2_HUMP:SPLEEN -"CREATURE:GIANT_CAMEL_2_HUMP:KIDNEY -#CREATURE:CROCODILE_SALTWATER:MUSCLE - CREATURE:CROCODILE_SALTWATER:EYE -"CREATURE:CROCODILE_SALTWATER:BRAIN -!CREATURE:CROCODILE_SALTWATER:LUNG -"CREATURE:CROCODILE_SALTWATER:HEART -"CREATURE:CROCODILE_SALTWATER:LIVER - CREATURE:CROCODILE_SALTWATER:GUT -$CREATURE:CROCODILE_SALTWATER:STOMACH -$CREATURE:CROCODILE_SALTWATER:GIZZARD -%CREATURE:CROCODILE_SALTWATER:PANCREAS -#CREATURE:CROCODILE_SALTWATER:SPLEEN -#CREATURE:CROCODILE_SALTWATER:KIDNEY -'CREATURE:CROCODILE_SALTWATER_MAN:MUSCLE -$CREATURE:CROCODILE_SALTWATER_MAN:EYE -&CREATURE:CROCODILE_SALTWATER_MAN:BRAIN -%CREATURE:CROCODILE_SALTWATER_MAN:LUNG -&CREATURE:CROCODILE_SALTWATER_MAN:HEART -&CREATURE:CROCODILE_SALTWATER_MAN:LIVER -$CREATURE:CROCODILE_SALTWATER_MAN:GUT -(CREATURE:CROCODILE_SALTWATER_MAN:STOMACH -(CREATURE:CROCODILE_SALTWATER_MAN:GIZZARD -)CREATURE:CROCODILE_SALTWATER_MAN:PANCREAS -'CREATURE:CROCODILE_SALTWATER_MAN:SPLEEN -'CREATURE:CROCODILE_SALTWATER_MAN:KIDNEY -)CREATURE:GIANT_CROCODILE_SALTWATER:MUSCLE -&CREATURE:GIANT_CROCODILE_SALTWATER:EYE -(CREATURE:GIANT_CROCODILE_SALTWATER:BRAIN -'CREATURE:GIANT_CROCODILE_SALTWATER:LUNG -(CREATURE:GIANT_CROCODILE_SALTWATER:HEART -(CREATURE:GIANT_CROCODILE_SALTWATER:LIVER -&CREATURE:GIANT_CROCODILE_SALTWATER:GUT -*CREATURE:GIANT_CROCODILE_SALTWATER:STOMACH -*CREATURE:GIANT_CROCODILE_SALTWATER:GIZZARD -+CREATURE:GIANT_CROCODILE_SALTWATER:PANCREAS -)CREATURE:GIANT_CROCODILE_SALTWATER:SPLEEN -)CREATURE:GIANT_CROCODILE_SALTWATER:KIDNEY -CREATURE:BIRD_VULTURE:MUSCLE -CREATURE:BIRD_VULTURE:EYE -CREATURE:BIRD_VULTURE:BRAIN -CREATURE:BIRD_VULTURE:LUNG -CREATURE:BIRD_VULTURE:HEART -CREATURE:BIRD_VULTURE:LIVER -CREATURE:BIRD_VULTURE:GUT -CREATURE:BIRD_VULTURE:STOMACH -CREATURE:BIRD_VULTURE:GIZZARD -CREATURE:BIRD_VULTURE:PANCREAS -CREATURE:BIRD_VULTURE:SPLEEN -CREATURE:BIRD_VULTURE:KIDNEY -CREATURE:VULTURE_MAN:MUSCLE -CREATURE:VULTURE_MAN:EYE -CREATURE:VULTURE_MAN:BRAIN -CREATURE:VULTURE_MAN:LUNG -CREATURE:VULTURE_MAN:HEART -CREATURE:VULTURE_MAN:LIVER -CREATURE:VULTURE_MAN:GUT -CREATURE:VULTURE_MAN:STOMACH -CREATURE:VULTURE_MAN:GIZZARD -CREATURE:VULTURE_MAN:PANCREAS -CREATURE:VULTURE_MAN:SPLEEN -CREATURE:VULTURE_MAN:KIDNEY -CREATURE:GIANT_VULTURE:MUSCLE -CREATURE:GIANT_VULTURE:EYE -CREATURE:GIANT_VULTURE:BRAIN -CREATURE:GIANT_VULTURE:LUNG -CREATURE:GIANT_VULTURE:HEART -CREATURE:GIANT_VULTURE:LIVER -CREATURE:GIANT_VULTURE:GUT -CREATURE:GIANT_VULTURE:STOMACH -CREATURE:GIANT_VULTURE:GIZZARD -CREATURE:GIANT_VULTURE:PANCREAS -CREATURE:GIANT_VULTURE:SPLEEN -CREATURE:GIANT_VULTURE:KIDNEY -CREATURE:RHINOCEROS:MUSCLE -CREATURE:RHINOCEROS:EYE -CREATURE:RHINOCEROS:BRAIN -CREATURE:RHINOCEROS:LUNG -CREATURE:RHINOCEROS:HEART -CREATURE:RHINOCEROS:LIVER -CREATURE:RHINOCEROS:GUT -CREATURE:RHINOCEROS:STOMACH -CREATURE:RHINOCEROS:GIZZARD -CREATURE:RHINOCEROS:PANCREAS -CREATURE:RHINOCEROS:SPLEEN -CREATURE:RHINOCEROS:KIDNEY -CREATURE:RHINOCEROS_MAN:MUSCLE -CREATURE:RHINOCEROS_MAN:EYE -CREATURE:RHINOCEROS_MAN:BRAIN -CREATURE:RHINOCEROS_MAN:LUNG -CREATURE:RHINOCEROS_MAN:HEART -CREATURE:RHINOCEROS_MAN:LIVER -CREATURE:RHINOCEROS_MAN:GUT -CREATURE:RHINOCEROS_MAN:STOMACH -CREATURE:RHINOCEROS_MAN:GIZZARD - CREATURE:RHINOCEROS_MAN:PANCREAS -CREATURE:RHINOCEROS_MAN:SPLEEN -CREATURE:RHINOCEROS_MAN:KIDNEY - CREATURE:GIANT_RHINOCEROS:MUSCLE -CREATURE:GIANT_RHINOCEROS:EYE -CREATURE:GIANT_RHINOCEROS:BRAIN -CREATURE:GIANT_RHINOCEROS:LUNG -CREATURE:GIANT_RHINOCEROS:HEART -CREATURE:GIANT_RHINOCEROS:LIVER -CREATURE:GIANT_RHINOCEROS:GUT -!CREATURE:GIANT_RHINOCEROS:STOMACH -!CREATURE:GIANT_RHINOCEROS:GIZZARD -"CREATURE:GIANT_RHINOCEROS:PANCREAS - CREATURE:GIANT_RHINOCEROS:SPLEEN - CREATURE:GIANT_RHINOCEROS:KIDNEY -CREATURE:GIRAFFE:MUSCLE -CREATURE:GIRAFFE:EYE -CREATURE:GIRAFFE:BRAIN -CREATURE:GIRAFFE:LUNG -CREATURE:GIRAFFE:HEART -CREATURE:GIRAFFE:LIVER -CREATURE:GIRAFFE:GUT -CREATURE:GIRAFFE:STOMACH -CREATURE:GIRAFFE:GIZZARD -CREATURE:GIRAFFE:PANCREAS -CREATURE:GIRAFFE:SPLEEN -CREATURE:GIRAFFE:KIDNEY -CREATURE:GIRAFFE_MAN:MUSCLE -CREATURE:GIRAFFE_MAN:EYE -CREATURE:GIRAFFE_MAN:BRAIN -CREATURE:GIRAFFE_MAN:LUNG -CREATURE:GIRAFFE_MAN:HEART -CREATURE:GIRAFFE_MAN:LIVER -CREATURE:GIRAFFE_MAN:GUT -CREATURE:GIRAFFE_MAN:STOMACH -CREATURE:GIRAFFE_MAN:GIZZARD -CREATURE:GIRAFFE_MAN:PANCREAS -CREATURE:GIRAFFE_MAN:SPLEEN -CREATURE:GIRAFFE_MAN:KIDNEY -CREATURE:GIANT_GIRAFFE:MUSCLE -CREATURE:GIANT_GIRAFFE:EYE -CREATURE:GIANT_GIRAFFE:BRAIN -CREATURE:GIANT_GIRAFFE:LUNG -CREATURE:GIANT_GIRAFFE:HEART -CREATURE:GIANT_GIRAFFE:LIVER -CREATURE:GIANT_GIRAFFE:GUT -CREATURE:GIANT_GIRAFFE:STOMACH -CREATURE:GIANT_GIRAFFE:GIZZARD -CREATURE:GIANT_GIRAFFE:PANCREAS -CREATURE:GIANT_GIRAFFE:SPLEEN -CREATURE:GIANT_GIRAFFE:KIDNEY -CREATURE:HONEY BADGER:MUSCLE -CREATURE:HONEY BADGER:EYE -CREATURE:HONEY BADGER:BRAIN -CREATURE:HONEY BADGER:LUNG -CREATURE:HONEY BADGER:HEART -CREATURE:HONEY BADGER:LIVER -CREATURE:HONEY BADGER:GUT -CREATURE:HONEY BADGER:STOMACH -CREATURE:HONEY BADGER:GIZZARD -CREATURE:HONEY BADGER:PANCREAS -CREATURE:HONEY BADGER:SPLEEN -CREATURE:HONEY BADGER:KIDNEY - CREATURE:HONEY BADGER MAN:MUSCLE -CREATURE:HONEY BADGER MAN:EYE -CREATURE:HONEY BADGER MAN:BRAIN -CREATURE:HONEY BADGER MAN:LUNG -CREATURE:HONEY BADGER MAN:HEART -CREATURE:HONEY BADGER MAN:LIVER -CREATURE:HONEY BADGER MAN:GUT -!CREATURE:HONEY BADGER MAN:STOMACH -!CREATURE:HONEY BADGER MAN:GIZZARD -"CREATURE:HONEY BADGER MAN:PANCREAS - CREATURE:HONEY BADGER MAN:SPLEEN - CREATURE:HONEY BADGER MAN:KIDNEY -#CREATURE:HONEY BADGER, GIANT:MUSCLE - CREATURE:HONEY BADGER, GIANT:EYE -"CREATURE:HONEY BADGER, GIANT:BRAIN -!CREATURE:HONEY BADGER, GIANT:LUNG -"CREATURE:HONEY BADGER, GIANT:HEART -"CREATURE:HONEY BADGER, GIANT:LIVER - CREATURE:HONEY BADGER, GIANT:GUT -$CREATURE:HONEY BADGER, GIANT:STOMACH -$CREATURE:HONEY BADGER, GIANT:GIZZARD -%CREATURE:HONEY BADGER, GIANT:PANCREAS -#CREATURE:HONEY BADGER, GIANT:SPLEEN -#CREATURE:HONEY BADGER, GIANT:KIDNEY -CREATURE:GIANT TORTOISE:MUSCLE -CREATURE:GIANT TORTOISE:EYE -CREATURE:GIANT TORTOISE:BRAIN -CREATURE:GIANT TORTOISE:LUNG -CREATURE:GIANT TORTOISE:HEART -CREATURE:GIANT TORTOISE:LIVER -CREATURE:GIANT TORTOISE:GUT -CREATURE:GIANT TORTOISE:STOMACH -CREATURE:GIANT TORTOISE:GIZZARD - CREATURE:GIANT TORTOISE:PANCREAS -CREATURE:GIANT TORTOISE:SPLEEN -CREATURE:GIANT TORTOISE:KIDNEY -"CREATURE:GIANT TORTOISE MAN:MUSCLE -CREATURE:GIANT TORTOISE MAN:EYE -!CREATURE:GIANT TORTOISE MAN:BRAIN - CREATURE:GIANT TORTOISE MAN:LUNG -!CREATURE:GIANT TORTOISE MAN:HEART -!CREATURE:GIANT TORTOISE MAN:LIVER -CREATURE:GIANT TORTOISE MAN:GUT -#CREATURE:GIANT TORTOISE MAN:STOMACH -#CREATURE:GIANT TORTOISE MAN:GIZZARD -$CREATURE:GIANT TORTOISE MAN:PANCREAS -"CREATURE:GIANT TORTOISE MAN:SPLEEN -"CREATURE:GIANT TORTOISE MAN:KIDNEY -!CREATURE:GIGANTIC TORTOISE:MUSCLE -CREATURE:GIGANTIC TORTOISE:EYE - CREATURE:GIGANTIC TORTOISE:BRAIN -CREATURE:GIGANTIC TORTOISE:LUNG - CREATURE:GIGANTIC TORTOISE:HEART - CREATURE:GIGANTIC TORTOISE:LIVER -CREATURE:GIGANTIC TORTOISE:GUT -"CREATURE:GIGANTIC TORTOISE:STOMACH -"CREATURE:GIGANTIC TORTOISE:GIZZARD -#CREATURE:GIGANTIC TORTOISE:PANCREAS -!CREATURE:GIGANTIC TORTOISE:SPLEEN -!CREATURE:GIGANTIC TORTOISE:KIDNEY -CREATURE:ARMADILLO:MUSCLE -CREATURE:ARMADILLO:EYE -CREATURE:ARMADILLO:BRAIN -CREATURE:ARMADILLO:LUNG -CREATURE:ARMADILLO:HEART -CREATURE:ARMADILLO:LIVER -CREATURE:ARMADILLO:GUT -CREATURE:ARMADILLO:STOMACH -CREATURE:ARMADILLO:GIZZARD -CREATURE:ARMADILLO:PANCREAS -CREATURE:ARMADILLO:SPLEEN -CREATURE:ARMADILLO:KIDNEY -CREATURE:ARMADILLO MAN:MUSCLE -CREATURE:ARMADILLO MAN:EYE -CREATURE:ARMADILLO MAN:BRAIN -CREATURE:ARMADILLO MAN:LUNG -CREATURE:ARMADILLO MAN:HEART -CREATURE:ARMADILLO MAN:LIVER -CREATURE:ARMADILLO MAN:GUT -CREATURE:ARMADILLO MAN:STOMACH -CREATURE:ARMADILLO MAN:GIZZARD -CREATURE:ARMADILLO MAN:PANCREAS -CREATURE:ARMADILLO MAN:SPLEEN -CREATURE:ARMADILLO MAN:KIDNEY - CREATURE:ARMADILLO, GIANT:MUSCLE -CREATURE:ARMADILLO, GIANT:EYE -CREATURE:ARMADILLO, GIANT:BRAIN -CREATURE:ARMADILLO, GIANT:LUNG -CREATURE:ARMADILLO, GIANT:HEART -CREATURE:ARMADILLO, GIANT:LIVER -CREATURE:ARMADILLO, GIANT:GUT -!CREATURE:ARMADILLO, GIANT:STOMACH -!CREATURE:ARMADILLO, GIANT:GIZZARD -"CREATURE:ARMADILLO, GIANT:PANCREAS - CREATURE:ARMADILLO, GIANT:SPLEEN - CREATURE:ARMADILLO, GIANT:KIDNEY -CREATURE:MUSKOX:MUSCLE -CREATURE:MUSKOX:EYE -CREATURE:MUSKOX:BRAIN -CREATURE:MUSKOX:LUNG -CREATURE:MUSKOX:HEART -CREATURE:MUSKOX:LIVER -CREATURE:MUSKOX:GUT -CREATURE:MUSKOX:STOMACH -CREATURE:MUSKOX:GIZZARD -CREATURE:MUSKOX:PANCREAS -CREATURE:MUSKOX:SPLEEN -CREATURE:MUSKOX:KIDNEY -CREATURE:MUSKOX_MAN:MUSCLE -CREATURE:MUSKOX_MAN:EYE -CREATURE:MUSKOX_MAN:BRAIN -CREATURE:MUSKOX_MAN:LUNG -CREATURE:MUSKOX_MAN:HEART -CREATURE:MUSKOX_MAN:LIVER -CREATURE:MUSKOX_MAN:GUT -CREATURE:MUSKOX_MAN:STOMACH -CREATURE:MUSKOX_MAN:GIZZARD -CREATURE:MUSKOX_MAN:PANCREAS -CREATURE:MUSKOX_MAN:SPLEEN -CREATURE:MUSKOX_MAN:KIDNEY -CREATURE:GIANT_MUSKOX:MUSCLE -CREATURE:GIANT_MUSKOX:EYE -CREATURE:GIANT_MUSKOX:BRAIN -CREATURE:GIANT_MUSKOX:LUNG -CREATURE:GIANT_MUSKOX:HEART -CREATURE:GIANT_MUSKOX:LIVER -CREATURE:GIANT_MUSKOX:GUT -CREATURE:GIANT_MUSKOX:STOMACH -CREATURE:GIANT_MUSKOX:GIZZARD -CREATURE:GIANT_MUSKOX:PANCREAS -CREATURE:GIANT_MUSKOX:SPLEEN -CREATURE:GIANT_MUSKOX:KIDNEY -CREATURE:ELK:MUSCLE -CREATURE:ELK:EYE -CREATURE:ELK:BRAIN -CREATURE:ELK:LUNG -CREATURE:ELK:HEART -CREATURE:ELK:LIVER -CREATURE:ELK:GUT -CREATURE:ELK:STOMACH -CREATURE:ELK:GIZZARD -CREATURE:ELK:PANCREAS -CREATURE:ELK:SPLEEN -CREATURE:ELK:KIDNEY -CREATURE:ELK_MAN:MUSCLE -CREATURE:ELK_MAN:EYE -CREATURE:ELK_MAN:BRAIN -CREATURE:ELK_MAN:LUNG -CREATURE:ELK_MAN:HEART -CREATURE:ELK_MAN:LIVER -CREATURE:ELK_MAN:GUT -CREATURE:ELK_MAN:STOMACH -CREATURE:ELK_MAN:GIZZARD -CREATURE:ELK_MAN:PANCREAS -CREATURE:ELK_MAN:SPLEEN -CREATURE:ELK_MAN:KIDNEY -CREATURE:GIANT_ELK:MUSCLE -CREATURE:GIANT_ELK:EYE -CREATURE:GIANT_ELK:BRAIN -CREATURE:GIANT_ELK:LUNG -CREATURE:GIANT_ELK:HEART -CREATURE:GIANT_ELK:LIVER -CREATURE:GIANT_ELK:GUT -CREATURE:GIANT_ELK:STOMACH -CREATURE:GIANT_ELK:GIZZARD -CREATURE:GIANT_ELK:PANCREAS -CREATURE:GIANT_ELK:SPLEEN -CREATURE:GIANT_ELK:KIDNEY -CREATURE:BEAR_POLAR:MUSCLE -CREATURE:BEAR_POLAR:EYE -CREATURE:BEAR_POLAR:BRAIN -CREATURE:BEAR_POLAR:LUNG -CREATURE:BEAR_POLAR:HEART -CREATURE:BEAR_POLAR:LIVER -CREATURE:BEAR_POLAR:GUT -CREATURE:BEAR_POLAR:STOMACH -CREATURE:BEAR_POLAR:GIZZARD -CREATURE:BEAR_POLAR:PANCREAS -CREATURE:BEAR_POLAR:SPLEEN -CREATURE:BEAR_POLAR:KIDNEY -CREATURE:BEAR_POLAR_MAN:MUSCLE -CREATURE:BEAR_POLAR_MAN:EYE -CREATURE:BEAR_POLAR_MAN:BRAIN -CREATURE:BEAR_POLAR_MAN:LUNG -CREATURE:BEAR_POLAR_MAN:HEART -CREATURE:BEAR_POLAR_MAN:LIVER -CREATURE:BEAR_POLAR_MAN:GUT -CREATURE:BEAR_POLAR_MAN:STOMACH -CREATURE:BEAR_POLAR_MAN:GIZZARD - CREATURE:BEAR_POLAR_MAN:PANCREAS -CREATURE:BEAR_POLAR_MAN:SPLEEN -CREATURE:BEAR_POLAR_MAN:KIDNEY - CREATURE:GIANT_BEAR_POLAR:MUSCLE -CREATURE:GIANT_BEAR_POLAR:EYE -CREATURE:GIANT_BEAR_POLAR:BRAIN -CREATURE:GIANT_BEAR_POLAR:LUNG -CREATURE:GIANT_BEAR_POLAR:HEART -CREATURE:GIANT_BEAR_POLAR:LIVER -CREATURE:GIANT_BEAR_POLAR:GUT -!CREATURE:GIANT_BEAR_POLAR:STOMACH -!CREATURE:GIANT_BEAR_POLAR:GIZZARD -"CREATURE:GIANT_BEAR_POLAR:PANCREAS - CREATURE:GIANT_BEAR_POLAR:SPLEEN - CREATURE:GIANT_BEAR_POLAR:KIDNEY -CREATURE:WOLVERINE:MUSCLE -CREATURE:WOLVERINE:EYE -CREATURE:WOLVERINE:BRAIN -CREATURE:WOLVERINE:LUNG -CREATURE:WOLVERINE:HEART -CREATURE:WOLVERINE:LIVER -CREATURE:WOLVERINE:GUT -CREATURE:WOLVERINE:STOMACH -CREATURE:WOLVERINE:GIZZARD -CREATURE:WOLVERINE:PANCREAS -CREATURE:WOLVERINE:SPLEEN -CREATURE:WOLVERINE:KIDNEY -CREATURE:WOLVERINE_MAN:MUSCLE -CREATURE:WOLVERINE_MAN:EYE -CREATURE:WOLVERINE_MAN:BRAIN -CREATURE:WOLVERINE_MAN:LUNG -CREATURE:WOLVERINE_MAN:HEART -CREATURE:WOLVERINE_MAN:LIVER -CREATURE:WOLVERINE_MAN:GUT -CREATURE:WOLVERINE_MAN:STOMACH -CREATURE:WOLVERINE_MAN:GIZZARD -CREATURE:WOLVERINE_MAN:PANCREAS -CREATURE:WOLVERINE_MAN:SPLEEN -CREATURE:WOLVERINE_MAN:KIDNEY -CREATURE:GIANT_WOLVERINE:MUSCLE -CREATURE:GIANT_WOLVERINE:EYE -CREATURE:GIANT_WOLVERINE:BRAIN -CREATURE:GIANT_WOLVERINE:LUNG -CREATURE:GIANT_WOLVERINE:HEART -CREATURE:GIANT_WOLVERINE:LIVER -CREATURE:GIANT_WOLVERINE:GUT - CREATURE:GIANT_WOLVERINE:STOMACH - CREATURE:GIANT_WOLVERINE:GIZZARD -!CREATURE:GIANT_WOLVERINE:PANCREAS -CREATURE:GIANT_WOLVERINE:SPLEEN -CREATURE:GIANT_WOLVERINE:KIDNEY -CREATURE:CHINCHILLA:MUSCLE -CREATURE:CHINCHILLA:EYE -CREATURE:CHINCHILLA:BRAIN -CREATURE:CHINCHILLA:LUNG -CREATURE:CHINCHILLA:HEART -CREATURE:CHINCHILLA:LIVER -CREATURE:CHINCHILLA:GUT -CREATURE:CHINCHILLA:STOMACH -CREATURE:CHINCHILLA:GIZZARD -CREATURE:CHINCHILLA:PANCREAS -CREATURE:CHINCHILLA:SPLEEN -CREATURE:CHINCHILLA:KIDNEY -CREATURE:CHINCHILLA_MAN:MUSCLE -CREATURE:CHINCHILLA_MAN:EYE -CREATURE:CHINCHILLA_MAN:BRAIN -CREATURE:CHINCHILLA_MAN:LUNG -CREATURE:CHINCHILLA_MAN:HEART -CREATURE:CHINCHILLA_MAN:LIVER -CREATURE:CHINCHILLA_MAN:GUT -CREATURE:CHINCHILLA_MAN:STOMACH -CREATURE:CHINCHILLA_MAN:GIZZARD - CREATURE:CHINCHILLA_MAN:PANCREAS -CREATURE:CHINCHILLA_MAN:SPLEEN -CREATURE:CHINCHILLA_MAN:KIDNEY - CREATURE:GIANT_CHINCHILLA:MUSCLE -CREATURE:GIANT_CHINCHILLA:EYE -CREATURE:GIANT_CHINCHILLA:BRAIN -CREATURE:GIANT_CHINCHILLA:LUNG -CREATURE:GIANT_CHINCHILLA:HEART -CREATURE:GIANT_CHINCHILLA:LIVER -CREATURE:GIANT_CHINCHILLA:GUT -!CREATURE:GIANT_CHINCHILLA:STOMACH -!CREATURE:GIANT_CHINCHILLA:GIZZARD -"CREATURE:GIANT_CHINCHILLA:PANCREAS - CREATURE:GIANT_CHINCHILLA:SPLEEN - CREATURE:GIANT_CHINCHILLA:KIDNEY -CREATURE:FLOATING_GUTS:MUSCLE -CREATURE:FLOATING_GUTS:EYE -CREATURE:FLOATING_GUTS:BRAIN -CREATURE:FLOATING_GUTS:LUNG -CREATURE:FLOATING_GUTS:HEART -CREATURE:FLOATING_GUTS:LIVER -CREATURE:FLOATING_GUTS:GUT -CREATURE:FLOATING_GUTS:STOMACH -CREATURE:FLOATING_GUTS:GIZZARD -CREATURE:FLOATING_GUTS:PANCREAS -CREATURE:FLOATING_GUTS:SPLEEN -CREATURE:FLOATING_GUTS:KIDNEY -CREATURE:DRUNIAN:MUSCLE -CREATURE:DRUNIAN:EYE -CREATURE:DRUNIAN:BRAIN -CREATURE:DRUNIAN:LUNG -CREATURE:DRUNIAN:HEART -CREATURE:DRUNIAN:LIVER -CREATURE:DRUNIAN:GUT -CREATURE:DRUNIAN:STOMACH -CREATURE:DRUNIAN:GIZZARD -CREATURE:DRUNIAN:PANCREAS -CREATURE:DRUNIAN:SPLEEN -CREATURE:DRUNIAN:KIDNEY -CREATURE:CREEPING_EYE:MUSCLE -CREATURE:CREEPING_EYE:EYE -CREATURE:CREEPING_EYE:BRAIN -CREATURE:CREEPING_EYE:LUNG -CREATURE:CREEPING_EYE:HEART -CREATURE:CREEPING_EYE:LIVER -CREATURE:CREEPING_EYE:GUT -CREATURE:CREEPING_EYE:STOMACH -CREATURE:CREEPING_EYE:GIZZARD -CREATURE:CREEPING_EYE:PANCREAS -CREATURE:CREEPING_EYE:SPLEEN -CREATURE:CREEPING_EYE:KIDNEY -&CREATURE:VORACIOUS_CAVE_CRAWLER:MUSCLE -#CREATURE:VORACIOUS_CAVE_CRAWLER:EYE -%CREATURE:VORACIOUS_CAVE_CRAWLER:BRAIN -$CREATURE:VORACIOUS_CAVE_CRAWLER:LUNG -%CREATURE:VORACIOUS_CAVE_CRAWLER:HEART -%CREATURE:VORACIOUS_CAVE_CRAWLER:LIVER -#CREATURE:VORACIOUS_CAVE_CRAWLER:GUT -'CREATURE:VORACIOUS_CAVE_CRAWLER:STOMACH -'CREATURE:VORACIOUS_CAVE_CRAWLER:GIZZARD -(CREATURE:VORACIOUS_CAVE_CRAWLER:PANCREAS -&CREATURE:VORACIOUS_CAVE_CRAWLER:SPLEEN -&CREATURE:VORACIOUS_CAVE_CRAWLER:KIDNEY -CREATURE:BLIND_CAVE_OGRE:MUSCLE -CREATURE:BLIND_CAVE_OGRE:EYE -CREATURE:BLIND_CAVE_OGRE:BRAIN -CREATURE:BLIND_CAVE_OGRE:LUNG -CREATURE:BLIND_CAVE_OGRE:HEART -CREATURE:BLIND_CAVE_OGRE:LIVER -CREATURE:BLIND_CAVE_OGRE:GUT - CREATURE:BLIND_CAVE_OGRE:STOMACH - CREATURE:BLIND_CAVE_OGRE:GIZZARD -!CREATURE:BLIND_CAVE_OGRE:PANCREAS -CREATURE:BLIND_CAVE_OGRE:SPLEEN -CREATURE:BLIND_CAVE_OGRE:KIDNEY -CREATURE:CAP_HOPPER:MUSCLE -CREATURE:CAP_HOPPER:EYE -CREATURE:CAP_HOPPER:BRAIN -CREATURE:CAP_HOPPER:LUNG -CREATURE:CAP_HOPPER:HEART -CREATURE:CAP_HOPPER:LIVER -CREATURE:CAP_HOPPER:GUT -CREATURE:CAP_HOPPER:STOMACH -CREATURE:CAP_HOPPER:GIZZARD -CREATURE:CAP_HOPPER:PANCREAS -CREATURE:CAP_HOPPER:SPLEEN -CREATURE:CAP_HOPPER:KIDNEY -CREATURE:MAGMA_CRAB:MUSCLE -CREATURE:MAGMA_CRAB:EYE -CREATURE:MAGMA_CRAB:BRAIN -CREATURE:MAGMA_CRAB:LUNG -CREATURE:MAGMA_CRAB:HEART -CREATURE:MAGMA_CRAB:LIVER -CREATURE:MAGMA_CRAB:GUT -CREATURE:MAGMA_CRAB:STOMACH -CREATURE:MAGMA_CRAB:GIZZARD -CREATURE:MAGMA_CRAB:PANCREAS -CREATURE:MAGMA_CRAB:SPLEEN -CREATURE:MAGMA_CRAB:KIDNEY -CREATURE:CRUNDLE:MUSCLE -CREATURE:CRUNDLE:EYE -CREATURE:CRUNDLE:BRAIN -CREATURE:CRUNDLE:LUNG -CREATURE:CRUNDLE:HEART -CREATURE:CRUNDLE:LIVER -CREATURE:CRUNDLE:GUT -CREATURE:CRUNDLE:STOMACH -CREATURE:CRUNDLE:GIZZARD -CREATURE:CRUNDLE:PANCREAS -CREATURE:CRUNDLE:SPLEEN -CREATURE:CRUNDLE:KIDNEY -CREATURE:HUNGRY_HEAD:MUSCLE -CREATURE:HUNGRY_HEAD:EYE -CREATURE:HUNGRY_HEAD:BRAIN -CREATURE:HUNGRY_HEAD:LUNG -CREATURE:HUNGRY_HEAD:HEART -CREATURE:HUNGRY_HEAD:LIVER -CREATURE:HUNGRY_HEAD:GUT -CREATURE:HUNGRY_HEAD:STOMACH -CREATURE:HUNGRY_HEAD:GIZZARD -CREATURE:HUNGRY_HEAD:PANCREAS -CREATURE:HUNGRY_HEAD:SPLEEN -CREATURE:HUNGRY_HEAD:KIDNEY -CREATURE:FLESH_BALL:MUSCLE -CREATURE:ELK_BIRD:MUSCLE -CREATURE:ELK_BIRD:EYE -CREATURE:ELK_BIRD:BRAIN -CREATURE:ELK_BIRD:LUNG -CREATURE:ELK_BIRD:HEART -CREATURE:ELK_BIRD:LIVER -CREATURE:ELK_BIRD:GUT -CREATURE:ELK_BIRD:STOMACH -CREATURE:ELK_BIRD:GIZZARD -CREATURE:ELK_BIRD:PANCREAS -CREATURE:ELK_BIRD:SPLEEN -CREATURE:ELK_BIRD:KIDNEY -CREATURE:HELMET_SNAKE:MUSCLE -CREATURE:HELMET_SNAKE:EYE -CREATURE:HELMET_SNAKE:BRAIN -CREATURE:HELMET_SNAKE:LUNG -CREATURE:HELMET_SNAKE:HEART -CREATURE:HELMET_SNAKE:LIVER -CREATURE:HELMET_SNAKE:GUT -CREATURE:HELMET_SNAKE:STOMACH -CREATURE:HELMET_SNAKE:GIZZARD -CREATURE:HELMET_SNAKE:PANCREAS -CREATURE:HELMET_SNAKE:SPLEEN -CREATURE:HELMET_SNAKE:KIDNEY -CREATURE:GREEN_DEVOURER:MUSCLE -CREATURE:GREEN_DEVOURER:EYE -CREATURE:GREEN_DEVOURER:BRAIN -CREATURE:GREEN_DEVOURER:LUNG -CREATURE:GREEN_DEVOURER:HEART -CREATURE:GREEN_DEVOURER:LIVER -CREATURE:GREEN_DEVOURER:GUT -CREATURE:GREEN_DEVOURER:STOMACH -CREATURE:GREEN_DEVOURER:GIZZARD - CREATURE:GREEN_DEVOURER:PANCREAS -CREATURE:GREEN_DEVOURER:SPLEEN -CREATURE:GREEN_DEVOURER:KIDNEY -CREATURE:RUTHERER:MUSCLE -CREATURE:RUTHERER:EYE -CREATURE:RUTHERER:BRAIN -CREATURE:RUTHERER:LUNG -CREATURE:RUTHERER:HEART -CREATURE:RUTHERER:LIVER -CREATURE:RUTHERER:GUT -CREATURE:RUTHERER:STOMACH -CREATURE:RUTHERER:GIZZARD -CREATURE:RUTHERER:PANCREAS -CREATURE:RUTHERER:SPLEEN -CREATURE:RUTHERER:KIDNEY -CREATURE:CREEPY_CRAWLER:MUSCLE -CREATURE:CREEPY_CRAWLER:EYE -CREATURE:CREEPY_CRAWLER:BRAIN -CREATURE:CREEPY_CRAWLER:LUNG -CREATURE:CREEPY_CRAWLER:HEART -CREATURE:CREEPY_CRAWLER:LIVER -CREATURE:CREEPY_CRAWLER:GUT -CREATURE:CREEPY_CRAWLER:STOMACH -CREATURE:CREEPY_CRAWLER:GIZZARD - CREATURE:CREEPY_CRAWLER:PANCREAS -CREATURE:CREEPY_CRAWLER:SPLEEN -CREATURE:CREEPY_CRAWLER:KIDNEY -CREATURE:DRALTHA:MUSCLE -CREATURE:DRALTHA:EYE -CREATURE:DRALTHA:BRAIN -CREATURE:DRALTHA:LUNG -CREATURE:DRALTHA:HEART -CREATURE:DRALTHA:LIVER -CREATURE:DRALTHA:GUT -CREATURE:DRALTHA:STOMACH -CREATURE:DRALTHA:GIZZARD -CREATURE:DRALTHA:PANCREAS -CREATURE:DRALTHA:SPLEEN -CREATURE:DRALTHA:KIDNEY -CREATURE:GIANT_EARTHWORM:MUSCLE -CREATURE:GIANT_EARTHWORM:EYE -CREATURE:GIANT_EARTHWORM:BRAIN -CREATURE:GIANT_EARTHWORM:LUNG -CREATURE:GIANT_EARTHWORM:HEART -CREATURE:GIANT_EARTHWORM:LIVER -CREATURE:GIANT_EARTHWORM:GUT - CREATURE:GIANT_EARTHWORM:STOMACH - CREATURE:GIANT_EARTHWORM:GIZZARD -!CREATURE:GIANT_EARTHWORM:PANCREAS -CREATURE:GIANT_EARTHWORM:SPLEEN -CREATURE:GIANT_EARTHWORM:KIDNEY -CREATURE:BUGBAT:MUSCLE -CREATURE:BUGBAT:EYE -CREATURE:BUGBAT:BRAIN -CREATURE:BUGBAT:LUNG -CREATURE:BUGBAT:HEART -CREATURE:BUGBAT:LIVER -CREATURE:BUGBAT:GUT -CREATURE:BUGBAT:STOMACH -CREATURE:BUGBAT:GIZZARD -CREATURE:BUGBAT:PANCREAS -CREATURE:BUGBAT:SPLEEN -CREATURE:BUGBAT:KIDNEY -CREATURE:MANERA:MUSCLE -CREATURE:MANERA:EYE -CREATURE:MANERA:BRAIN -CREATURE:MANERA:LUNG -CREATURE:MANERA:HEART -CREATURE:MANERA:LIVER -CREATURE:MANERA:GUT -CREATURE:MANERA:STOMACH -CREATURE:MANERA:GIZZARD -CREATURE:MANERA:PANCREAS -CREATURE:MANERA:SPLEEN -CREATURE:MANERA:KIDNEY -CREATURE:MOLEMARIAN:MUSCLE -CREATURE:MOLEMARIAN:EYE -CREATURE:MOLEMARIAN:BRAIN -CREATURE:MOLEMARIAN:LUNG -CREATURE:MOLEMARIAN:HEART -CREATURE:MOLEMARIAN:LIVER -CREATURE:MOLEMARIAN:GUT -CREATURE:MOLEMARIAN:STOMACH -CREATURE:MOLEMARIAN:GIZZARD -CREATURE:MOLEMARIAN:PANCREAS -CREATURE:MOLEMARIAN:SPLEEN -CREATURE:MOLEMARIAN:KIDNEY -CREATURE:JABBERER:MUSCLE -CREATURE:JABBERER:EYE -CREATURE:JABBERER:BRAIN -CREATURE:JABBERER:LUNG -CREATURE:JABBERER:HEART -CREATURE:JABBERER:LIVER -CREATURE:JABBERER:GUT -CREATURE:JABBERER:STOMACH -CREATURE:JABBERER:GIZZARD -CREATURE:JABBERER:PANCREAS -CREATURE:JABBERER:SPLEEN -CREATURE:JABBERER:KIDNEY -CREATURE:POND_GRABBER:MUSCLE -CREATURE:POND_GRABBER:EYE -CREATURE:POND_GRABBER:BRAIN -CREATURE:POND_GRABBER:LUNG -CREATURE:POND_GRABBER:HEART -CREATURE:POND_GRABBER:LIVER -CREATURE:POND_GRABBER:GUT -CREATURE:POND_GRABBER:STOMACH -CREATURE:POND_GRABBER:GIZZARD -CREATURE:POND_GRABBER:PANCREAS -CREATURE:POND_GRABBER:SPLEEN -CREATURE:POND_GRABBER:KIDNEY -CREATURE:BLIND_CAVE_BEAR:MUSCLE -CREATURE:BLIND_CAVE_BEAR:EYE -CREATURE:BLIND_CAVE_BEAR:BRAIN -CREATURE:BLIND_CAVE_BEAR:LUNG -CREATURE:BLIND_CAVE_BEAR:HEART -CREATURE:BLIND_CAVE_BEAR:LIVER -CREATURE:BLIND_CAVE_BEAR:GUT - CREATURE:BLIND_CAVE_BEAR:STOMACH - CREATURE:BLIND_CAVE_BEAR:GIZZARD -!CREATURE:BLIND_CAVE_BEAR:PANCREAS -CREATURE:BLIND_CAVE_BEAR:SPLEEN -CREATURE:BLIND_CAVE_BEAR:KIDNEY -CREATURE:CAVE_DRAGON:MUSCLE -CREATURE:CAVE_DRAGON:EYE -CREATURE:CAVE_DRAGON:BRAIN -CREATURE:CAVE_DRAGON:LUNG -CREATURE:CAVE_DRAGON:HEART -CREATURE:CAVE_DRAGON:LIVER -CREATURE:CAVE_DRAGON:GUT -CREATURE:CAVE_DRAGON:STOMACH -CREATURE:CAVE_DRAGON:GIZZARD -CREATURE:CAVE_DRAGON:PANCREAS -CREATURE:CAVE_DRAGON:SPLEEN -CREATURE:CAVE_DRAGON:KIDNEY -CREATURE:REACHER:MUSCLE -CREATURE:REACHER:EYE -CREATURE:REACHER:BRAIN -CREATURE:REACHER:LUNG -CREATURE:REACHER:HEART -CREATURE:REACHER:LIVER -CREATURE:REACHER:GUT -CREATURE:REACHER:STOMACH -CREATURE:REACHER:GIZZARD -CREATURE:REACHER:PANCREAS -CREATURE:REACHER:SPLEEN -CREATURE:REACHER:KIDNEY -CREATURE:GORLAK:MUSCLE -CREATURE:GORLAK:EYE -CREATURE:GORLAK:BRAIN -CREATURE:GORLAK:LUNG -CREATURE:GORLAK:HEART -CREATURE:GORLAK:LIVER -CREATURE:GORLAK:GUT -CREATURE:GORLAK:STOMACH -CREATURE:GORLAK:GIZZARD -CREATURE:GORLAK:PANCREAS -CREATURE:GORLAK:SPLEEN -CREATURE:GORLAK:KIDNEY -CREATURE:OCTOPUS:MUSCLE -CREATURE:OCTOPUS:EYE -CREATURE:OCTOPUS:BRAIN -CREATURE:OCTOPUS:LUNG -CREATURE:OCTOPUS:HEART -CREATURE:OCTOPUS:LIVER -CREATURE:OCTOPUS:GUT -CREATURE:OCTOPUS:STOMACH -CREATURE:OCTOPUS:GIZZARD -CREATURE:OCTOPUS:PANCREAS -CREATURE:OCTOPUS:SPLEEN -CREATURE:OCTOPUS:KIDNEY -CREATURE:OCTOPUS_MAN:MUSCLE -CREATURE:OCTOPUS_MAN:EYE -CREATURE:OCTOPUS_MAN:BRAIN -CREATURE:OCTOPUS_MAN:LUNG -CREATURE:OCTOPUS_MAN:HEART -CREATURE:OCTOPUS_MAN:LIVER -CREATURE:OCTOPUS_MAN:GUT -CREATURE:OCTOPUS_MAN:STOMACH -CREATURE:OCTOPUS_MAN:GIZZARD -CREATURE:OCTOPUS_MAN:PANCREAS -CREATURE:OCTOPUS_MAN:SPLEEN -CREATURE:OCTOPUS_MAN:KIDNEY -CREATURE:GIANT_OCTOPUS:MUSCLE -CREATURE:GIANT_OCTOPUS:EYE -CREATURE:GIANT_OCTOPUS:BRAIN -CREATURE:GIANT_OCTOPUS:LUNG -CREATURE:GIANT_OCTOPUS:HEART -CREATURE:GIANT_OCTOPUS:LIVER -CREATURE:GIANT_OCTOPUS:GUT -CREATURE:GIANT_OCTOPUS:STOMACH -CREATURE:GIANT_OCTOPUS:GIZZARD -CREATURE:GIANT_OCTOPUS:PANCREAS -CREATURE:GIANT_OCTOPUS:SPLEEN -CREATURE:GIANT_OCTOPUS:KIDNEY -CREATURE:CRAB:MUSCLE -CREATURE:CRAB:EYE -CREATURE:CRAB:BRAIN -CREATURE:CRAB:LUNG -CREATURE:CRAB:HEART -CREATURE:CRAB:LIVER -CREATURE:CRAB:GUT -CREATURE:CRAB:STOMACH -CREATURE:CRAB:GIZZARD -CREATURE:CRAB:PANCREAS -CREATURE:CRAB:SPLEEN -CREATURE:CRAB:KIDNEY -CREATURE:CRAB_MAN:MUSCLE -CREATURE:CRAB_MAN:EYE -CREATURE:CRAB_MAN:BRAIN -CREATURE:CRAB_MAN:LUNG -CREATURE:CRAB_MAN:HEART -CREATURE:CRAB_MAN:LIVER -CREATURE:CRAB_MAN:GUT -CREATURE:CRAB_MAN:STOMACH -CREATURE:CRAB_MAN:GIZZARD -CREATURE:CRAB_MAN:PANCREAS -CREATURE:CRAB_MAN:SPLEEN -CREATURE:CRAB_MAN:KIDNEY -CREATURE:GIANT_CRAB:MUSCLE -CREATURE:GIANT_CRAB:EYE -CREATURE:GIANT_CRAB:BRAIN -CREATURE:GIANT_CRAB:LUNG -CREATURE:GIANT_CRAB:HEART -CREATURE:GIANT_CRAB:LIVER -CREATURE:GIANT_CRAB:GUT -CREATURE:GIANT_CRAB:STOMACH -CREATURE:GIANT_CRAB:GIZZARD -CREATURE:GIANT_CRAB:PANCREAS -CREATURE:GIANT_CRAB:SPLEEN -CREATURE:GIANT_CRAB:KIDNEY -CREATURE:LEOPARD_SEAL:MUSCLE -CREATURE:LEOPARD_SEAL:EYE -CREATURE:LEOPARD_SEAL:BRAIN -CREATURE:LEOPARD_SEAL:LUNG -CREATURE:LEOPARD_SEAL:HEART -CREATURE:LEOPARD_SEAL:LIVER -CREATURE:LEOPARD_SEAL:GUT -CREATURE:LEOPARD_SEAL:STOMACH -CREATURE:LEOPARD_SEAL:GIZZARD -CREATURE:LEOPARD_SEAL:PANCREAS -CREATURE:LEOPARD_SEAL:SPLEEN -CREATURE:LEOPARD_SEAL:KIDNEY - CREATURE:LEOPARD_SEAL_MAN:MUSCLE -CREATURE:LEOPARD_SEAL_MAN:EYE -CREATURE:LEOPARD_SEAL_MAN:BRAIN -CREATURE:LEOPARD_SEAL_MAN:LUNG -CREATURE:LEOPARD_SEAL_MAN:HEART -CREATURE:LEOPARD_SEAL_MAN:LIVER -CREATURE:LEOPARD_SEAL_MAN:GUT -!CREATURE:LEOPARD_SEAL_MAN:STOMACH -!CREATURE:LEOPARD_SEAL_MAN:GIZZARD -"CREATURE:LEOPARD_SEAL_MAN:PANCREAS - CREATURE:LEOPARD_SEAL_MAN:SPLEEN - CREATURE:LEOPARD_SEAL_MAN:KIDNEY -"CREATURE:GIANT_LEOPARD_SEAL:MUSCLE -CREATURE:GIANT_LEOPARD_SEAL:EYE -!CREATURE:GIANT_LEOPARD_SEAL:BRAIN - CREATURE:GIANT_LEOPARD_SEAL:LUNG -!CREATURE:GIANT_LEOPARD_SEAL:HEART -!CREATURE:GIANT_LEOPARD_SEAL:LIVER -CREATURE:GIANT_LEOPARD_SEAL:GUT -#CREATURE:GIANT_LEOPARD_SEAL:STOMACH -#CREATURE:GIANT_LEOPARD_SEAL:GIZZARD -$CREATURE:GIANT_LEOPARD_SEAL:PANCREAS -"CREATURE:GIANT_LEOPARD_SEAL:SPLEEN -"CREATURE:GIANT_LEOPARD_SEAL:KIDNEY -CREATURE:CUTTLEFISH:MUSCLE -CREATURE:CUTTLEFISH:EYE -CREATURE:CUTTLEFISH:BRAIN -CREATURE:CUTTLEFISH:LUNG -CREATURE:CUTTLEFISH:HEART -CREATURE:CUTTLEFISH:LIVER -CREATURE:CUTTLEFISH:GUT -CREATURE:CUTTLEFISH:STOMACH -CREATURE:CUTTLEFISH:GIZZARD -CREATURE:CUTTLEFISH:PANCREAS -CREATURE:CUTTLEFISH:SPLEEN -CREATURE:CUTTLEFISH:KIDNEY -CREATURE:CUTTLEFISH_MAN:MUSCLE -CREATURE:CUTTLEFISH_MAN:EYE -CREATURE:CUTTLEFISH_MAN:BRAIN -CREATURE:CUTTLEFISH_MAN:LUNG -CREATURE:CUTTLEFISH_MAN:HEART -CREATURE:CUTTLEFISH_MAN:LIVER -CREATURE:CUTTLEFISH_MAN:GUT -CREATURE:CUTTLEFISH_MAN:STOMACH -CREATURE:CUTTLEFISH_MAN:GIZZARD - CREATURE:CUTTLEFISH_MAN:PANCREAS -CREATURE:CUTTLEFISH_MAN:SPLEEN -CREATURE:CUTTLEFISH_MAN:KIDNEY - CREATURE:GIANT_CUTTLEFISH:MUSCLE -CREATURE:GIANT_CUTTLEFISH:EYE -CREATURE:GIANT_CUTTLEFISH:BRAIN -CREATURE:GIANT_CUTTLEFISH:LUNG -CREATURE:GIANT_CUTTLEFISH:HEART -CREATURE:GIANT_CUTTLEFISH:LIVER -CREATURE:GIANT_CUTTLEFISH:GUT -!CREATURE:GIANT_CUTTLEFISH:STOMACH -!CREATURE:GIANT_CUTTLEFISH:GIZZARD -"CREATURE:GIANT_CUTTLEFISH:PANCREAS - CREATURE:GIANT_CUTTLEFISH:SPLEEN - CREATURE:GIANT_CUTTLEFISH:KIDNEY -CREATURE:ORCA:MUSCLE -CREATURE:ORCA:EYE -CREATURE:ORCA:BRAIN -CREATURE:ORCA:LUNG -CREATURE:ORCA:HEART -CREATURE:ORCA:LIVER -CREATURE:ORCA:GUT -CREATURE:ORCA:STOMACH -CREATURE:ORCA:GIZZARD -CREATURE:ORCA:PANCREAS -CREATURE:ORCA:SPLEEN -CREATURE:ORCA:KIDNEY -CREATURE:ORCA_MAN:MUSCLE -CREATURE:ORCA_MAN:EYE -CREATURE:ORCA_MAN:BRAIN -CREATURE:ORCA_MAN:LUNG -CREATURE:ORCA_MAN:HEART -CREATURE:ORCA_MAN:LIVER -CREATURE:ORCA_MAN:GUT -CREATURE:ORCA_MAN:STOMACH -CREATURE:ORCA_MAN:GIZZARD -CREATURE:ORCA_MAN:PANCREAS -CREATURE:ORCA_MAN:SPLEEN -CREATURE:ORCA_MAN:KIDNEY -CREATURE:GIANT_ORCA:MUSCLE -CREATURE:GIANT_ORCA:EYE -CREATURE:GIANT_ORCA:BRAIN -CREATURE:GIANT_ORCA:LUNG -CREATURE:GIANT_ORCA:HEART -CREATURE:GIANT_ORCA:LIVER -CREATURE:GIANT_ORCA:GUT -CREATURE:GIANT_ORCA:STOMACH -CREATURE:GIANT_ORCA:GIZZARD -CREATURE:GIANT_ORCA:PANCREAS -CREATURE:GIANT_ORCA:SPLEEN -CREATURE:GIANT_ORCA:KIDNEY -CREATURE:HORSESHOE_CRAB:MUSCLE -CREATURE:HORSESHOE_CRAB:EYE -CREATURE:HORSESHOE_CRAB:BRAIN -CREATURE:HORSESHOE_CRAB:LUNG -CREATURE:HORSESHOE_CRAB:HEART -CREATURE:HORSESHOE_CRAB:LIVER -CREATURE:HORSESHOE_CRAB:GUT -CREATURE:HORSESHOE_CRAB:STOMACH -CREATURE:HORSESHOE_CRAB:GIZZARD - CREATURE:HORSESHOE_CRAB:PANCREAS -CREATURE:HORSESHOE_CRAB:SPLEEN -CREATURE:HORSESHOE_CRAB:KIDNEY -"CREATURE:HORSESHOE_CRAB_MAN:MUSCLE -CREATURE:HORSESHOE_CRAB_MAN:EYE -!CREATURE:HORSESHOE_CRAB_MAN:BRAIN - CREATURE:HORSESHOE_CRAB_MAN:LUNG -!CREATURE:HORSESHOE_CRAB_MAN:HEART -!CREATURE:HORSESHOE_CRAB_MAN:LIVER -CREATURE:HORSESHOE_CRAB_MAN:GUT -#CREATURE:HORSESHOE_CRAB_MAN:STOMACH -#CREATURE:HORSESHOE_CRAB_MAN:GIZZARD -$CREATURE:HORSESHOE_CRAB_MAN:PANCREAS -"CREATURE:HORSESHOE_CRAB_MAN:SPLEEN -"CREATURE:HORSESHOE_CRAB_MAN:KIDNEY -$CREATURE:GIANT_HORSESHOE_CRAB:MUSCLE -!CREATURE:GIANT_HORSESHOE_CRAB:EYE -#CREATURE:GIANT_HORSESHOE_CRAB:BRAIN -"CREATURE:GIANT_HORSESHOE_CRAB:LUNG -#CREATURE:GIANT_HORSESHOE_CRAB:HEART -#CREATURE:GIANT_HORSESHOE_CRAB:LIVER -!CREATURE:GIANT_HORSESHOE_CRAB:GUT -%CREATURE:GIANT_HORSESHOE_CRAB:STOMACH -%CREATURE:GIANT_HORSESHOE_CRAB:GIZZARD -&CREATURE:GIANT_HORSESHOE_CRAB:PANCREAS -$CREATURE:GIANT_HORSESHOE_CRAB:SPLEEN -$CREATURE:GIANT_HORSESHOE_CRAB:KIDNEY -CREATURE:SPERM_WHALE:MUSCLE -CREATURE:SPERM_WHALE:EYE -CREATURE:SPERM_WHALE:BRAIN -CREATURE:SPERM_WHALE:LUNG -CREATURE:SPERM_WHALE:HEART -CREATURE:SPERM_WHALE:LIVER -CREATURE:SPERM_WHALE:GUT -CREATURE:SPERM_WHALE:STOMACH -CREATURE:SPERM_WHALE:GIZZARD -CREATURE:SPERM_WHALE:PANCREAS -CREATURE:SPERM_WHALE:SPLEEN -CREATURE:SPERM_WHALE:KIDNEY -CREATURE:SPERM_WHALE_MAN:MUSCLE -CREATURE:SPERM_WHALE_MAN:EYE -CREATURE:SPERM_WHALE_MAN:BRAIN -CREATURE:SPERM_WHALE_MAN:LUNG -CREATURE:SPERM_WHALE_MAN:HEART -CREATURE:SPERM_WHALE_MAN:LIVER -CREATURE:SPERM_WHALE_MAN:GUT - CREATURE:SPERM_WHALE_MAN:STOMACH - CREATURE:SPERM_WHALE_MAN:GIZZARD -!CREATURE:SPERM_WHALE_MAN:PANCREAS -CREATURE:SPERM_WHALE_MAN:SPLEEN -CREATURE:SPERM_WHALE_MAN:KIDNEY -!CREATURE:GIANT_SPERM_WHALE:MUSCLE -CREATURE:GIANT_SPERM_WHALE:EYE - CREATURE:GIANT_SPERM_WHALE:BRAIN -CREATURE:GIANT_SPERM_WHALE:LUNG - CREATURE:GIANT_SPERM_WHALE:HEART - CREATURE:GIANT_SPERM_WHALE:LIVER -CREATURE:GIANT_SPERM_WHALE:GUT -"CREATURE:GIANT_SPERM_WHALE:STOMACH -"CREATURE:GIANT_SPERM_WHALE:GIZZARD -#CREATURE:GIANT_SPERM_WHALE:PANCREAS -!CREATURE:GIANT_SPERM_WHALE:SPLEEN -!CREATURE:GIANT_SPERM_WHALE:KIDNEY -CREATURE:ELEPHANT_SEAL:MUSCLE -CREATURE:ELEPHANT_SEAL:EYE -CREATURE:ELEPHANT_SEAL:BRAIN -CREATURE:ELEPHANT_SEAL:LUNG -CREATURE:ELEPHANT_SEAL:HEART -CREATURE:ELEPHANT_SEAL:LIVER -CREATURE:ELEPHANT_SEAL:GUT -CREATURE:ELEPHANT_SEAL:STOMACH -CREATURE:ELEPHANT_SEAL:GIZZARD -CREATURE:ELEPHANT_SEAL:PANCREAS -CREATURE:ELEPHANT_SEAL:SPLEEN -CREATURE:ELEPHANT_SEAL:KIDNEY -!CREATURE:ELEPHANT_SEAL_MAN:MUSCLE -CREATURE:ELEPHANT_SEAL_MAN:EYE - CREATURE:ELEPHANT_SEAL_MAN:BRAIN -CREATURE:ELEPHANT_SEAL_MAN:LUNG - CREATURE:ELEPHANT_SEAL_MAN:HEART - CREATURE:ELEPHANT_SEAL_MAN:LIVER -CREATURE:ELEPHANT_SEAL_MAN:GUT -"CREATURE:ELEPHANT_SEAL_MAN:STOMACH -"CREATURE:ELEPHANT_SEAL_MAN:GIZZARD -#CREATURE:ELEPHANT_SEAL_MAN:PANCREAS -!CREATURE:ELEPHANT_SEAL_MAN:SPLEEN -!CREATURE:ELEPHANT_SEAL_MAN:KIDNEY -#CREATURE:GIANT_ELEPHANT_SEAL:MUSCLE - CREATURE:GIANT_ELEPHANT_SEAL:EYE -"CREATURE:GIANT_ELEPHANT_SEAL:BRAIN -!CREATURE:GIANT_ELEPHANT_SEAL:LUNG -"CREATURE:GIANT_ELEPHANT_SEAL:HEART -"CREATURE:GIANT_ELEPHANT_SEAL:LIVER - CREATURE:GIANT_ELEPHANT_SEAL:GUT -$CREATURE:GIANT_ELEPHANT_SEAL:STOMACH -$CREATURE:GIANT_ELEPHANT_SEAL:GIZZARD -%CREATURE:GIANT_ELEPHANT_SEAL:PANCREAS -#CREATURE:GIANT_ELEPHANT_SEAL:SPLEEN -#CREATURE:GIANT_ELEPHANT_SEAL:KIDNEY -CREATURE:HARP_SEAL:MUSCLE -CREATURE:HARP_SEAL:EYE -CREATURE:HARP_SEAL:BRAIN -CREATURE:HARP_SEAL:LUNG -CREATURE:HARP_SEAL:HEART -CREATURE:HARP_SEAL:LIVER -CREATURE:HARP_SEAL:GUT -CREATURE:HARP_SEAL:STOMACH -CREATURE:HARP_SEAL:GIZZARD -CREATURE:HARP_SEAL:PANCREAS -CREATURE:HARP_SEAL:SPLEEN -CREATURE:HARP_SEAL:KIDNEY -CREATURE:HARP_SEAL_MAN:MUSCLE -CREATURE:HARP_SEAL_MAN:EYE -CREATURE:HARP_SEAL_MAN:BRAIN -CREATURE:HARP_SEAL_MAN:LUNG -CREATURE:HARP_SEAL_MAN:HEART -CREATURE:HARP_SEAL_MAN:LIVER -CREATURE:HARP_SEAL_MAN:GUT -CREATURE:HARP_SEAL_MAN:STOMACH -CREATURE:HARP_SEAL_MAN:GIZZARD -CREATURE:HARP_SEAL_MAN:PANCREAS -CREATURE:HARP_SEAL_MAN:SPLEEN -CREATURE:HARP_SEAL_MAN:KIDNEY -CREATURE:GIANT_HARP_SEAL:MUSCLE -CREATURE:GIANT_HARP_SEAL:EYE -CREATURE:GIANT_HARP_SEAL:BRAIN -CREATURE:GIANT_HARP_SEAL:LUNG -CREATURE:GIANT_HARP_SEAL:HEART -CREATURE:GIANT_HARP_SEAL:LIVER -CREATURE:GIANT_HARP_SEAL:GUT - CREATURE:GIANT_HARP_SEAL:STOMACH - CREATURE:GIANT_HARP_SEAL:GIZZARD -!CREATURE:GIANT_HARP_SEAL:PANCREAS -CREATURE:GIANT_HARP_SEAL:SPLEEN -CREATURE:GIANT_HARP_SEAL:KIDNEY -CREATURE:NAUTILUS:MUSCLE -CREATURE:NAUTILUS:EYE -CREATURE:NAUTILUS:BRAIN -CREATURE:NAUTILUS:LUNG -CREATURE:NAUTILUS:HEART -CREATURE:NAUTILUS:LIVER -CREATURE:NAUTILUS:GUT -CREATURE:NAUTILUS:STOMACH -CREATURE:NAUTILUS:GIZZARD -CREATURE:NAUTILUS:PANCREAS -CREATURE:NAUTILUS:SPLEEN -CREATURE:NAUTILUS:KIDNEY -CREATURE:NAUTILUS_MAN:MUSCLE -CREATURE:NAUTILUS_MAN:EYE -CREATURE:NAUTILUS_MAN:BRAIN -CREATURE:NAUTILUS_MAN:LUNG -CREATURE:NAUTILUS_MAN:HEART -CREATURE:NAUTILUS_MAN:LIVER -CREATURE:NAUTILUS_MAN:GUT -CREATURE:NAUTILUS_MAN:STOMACH -CREATURE:NAUTILUS_MAN:GIZZARD -CREATURE:NAUTILUS_MAN:PANCREAS -CREATURE:NAUTILUS_MAN:SPLEEN -CREATURE:NAUTILUS_MAN:KIDNEY -CREATURE:GIANT_NAUTILUS:MUSCLE -CREATURE:GIANT_NAUTILUS:EYE -CREATURE:GIANT_NAUTILUS:BRAIN -CREATURE:GIANT_NAUTILUS:LUNG -CREATURE:GIANT_NAUTILUS:HEART -CREATURE:GIANT_NAUTILUS:LIVER -CREATURE:GIANT_NAUTILUS:GUT -CREATURE:GIANT_NAUTILUS:STOMACH -CREATURE:GIANT_NAUTILUS:GIZZARD - CREATURE:GIANT_NAUTILUS:PANCREAS -CREATURE:GIANT_NAUTILUS:SPLEEN -CREATURE:GIANT_NAUTILUS:KIDNEY -CREATURE:FOXSQUIRREL:MUSCLE -CREATURE:FOXSQUIRREL:EYE -CREATURE:FOXSQUIRREL:BRAIN -CREATURE:FOXSQUIRREL:LUNG -CREATURE:FOXSQUIRREL:HEART -CREATURE:FOXSQUIRREL:LIVER -CREATURE:FOXSQUIRREL:GUT -CREATURE:FOXSQUIRREL:STOMACH -CREATURE:FOXSQUIRREL:GIZZARD -CREATURE:FOXSQUIRREL:PANCREAS -CREATURE:FOXSQUIRREL:SPLEEN -CREATURE:FOXSQUIRREL:KIDNEY -CREATURE:MOGHOPPER:MUSCLE -CREATURE:MOGHOPPER:EYE -CREATURE:MOGHOPPER:BRAIN -CREATURE:MOGHOPPER:LUNG -CREATURE:MOGHOPPER:HEART -CREATURE:MOGHOPPER:LIVER -CREATURE:MOGHOPPER:GUT -CREATURE:MOGHOPPER:STOMACH -CREATURE:MOGHOPPER:GIZZARD -CREATURE:MOGHOPPER:PANCREAS -CREATURE:MOGHOPPER:SPLEEN -CREATURE:MOGHOPPER:KIDNEY -CREATURE:RAT_DEMON:MUSCLE -CREATURE:RAT_DEMON:EYE -CREATURE:RAT_DEMON:BRAIN -CREATURE:RAT_DEMON:LUNG -CREATURE:RAT_DEMON:HEART -CREATURE:RAT_DEMON:LIVER -CREATURE:RAT_DEMON:GUT -CREATURE:RAT_DEMON:STOMACH -CREATURE:RAT_DEMON:GIZZARD -CREATURE:RAT_DEMON:PANCREAS -CREATURE:RAT_DEMON:SPLEEN -CREATURE:RAT_DEMON:KIDNEY -CREATURE:WAMBLER_FLUFFY:EYE -'CREATURE:LIZARD_RHINO_TWO_LEGGED:MUSCLE -$CREATURE:LIZARD_RHINO_TWO_LEGGED:EYE -&CREATURE:LIZARD_RHINO_TWO_LEGGED:BRAIN -%CREATURE:LIZARD_RHINO_TWO_LEGGED:LUNG -&CREATURE:LIZARD_RHINO_TWO_LEGGED:HEART -&CREATURE:LIZARD_RHINO_TWO_LEGGED:LIVER -$CREATURE:LIZARD_RHINO_TWO_LEGGED:GUT -(CREATURE:LIZARD_RHINO_TWO_LEGGED:STOMACH -(CREATURE:LIZARD_RHINO_TWO_LEGGED:GIZZARD -)CREATURE:LIZARD_RHINO_TWO_LEGGED:PANCREAS -'CREATURE:LIZARD_RHINO_TWO_LEGGED:SPLEEN -'CREATURE:LIZARD_RHINO_TWO_LEGGED:KIDNEY -CREATURE:WORM_KNUCKLE:MUSCLE -CREATURE:WORM_KNUCKLE:EYE -CREATURE:WORM_KNUCKLE:BRAIN -CREATURE:WORM_KNUCKLE:LUNG -CREATURE:WORM_KNUCKLE:HEART -CREATURE:WORM_KNUCKLE:LIVER -CREATURE:WORM_KNUCKLE:GUT -CREATURE:WORM_KNUCKLE:STOMACH -CREATURE:WORM_KNUCKLE:GIZZARD -CREATURE:WORM_KNUCKLE:PANCREAS -CREATURE:WORM_KNUCKLE:SPLEEN -CREATURE:WORM_KNUCKLE:KIDNEY -CREATURE:SPIDER_PHANTOM:MUSCLE -CREATURE:SPIDER_PHANTOM:EYE -CREATURE:SPIDER_PHANTOM:BRAIN -CREATURE:SPIDER_PHANTOM:LUNG -CREATURE:SPIDER_PHANTOM:HEART -CREATURE:SPIDER_PHANTOM:LIVER -CREATURE:SPIDER_PHANTOM:GUT -CREATURE:SPIDER_PHANTOM:STOMACH -CREATURE:SPIDER_PHANTOM:GIZZARD - CREATURE:SPIDER_PHANTOM:PANCREAS -CREATURE:SPIDER_PHANTOM:SPLEEN -CREATURE:SPIDER_PHANTOM:KIDNEY -CREATURE:FLY_ACORN:MUSCLE -CREATURE:FLY_ACORN:EYE -CREATURE:FLY_ACORN:BRAIN -CREATURE:FLY_ACORN:LUNG -CREATURE:FLY_ACORN:HEART -CREATURE:FLY_ACORN:LIVER -CREATURE:FLY_ACORN:GUT -CREATURE:FLY_ACORN:STOMACH -CREATURE:FLY_ACORN:GIZZARD -CREATURE:FLY_ACORN:PANCREAS -CREATURE:FLY_ACORN:SPLEEN -CREATURE:FLY_ACORN:KIDNEY -CREATURE:GNAT_BLOOD:MUSCLE -CREATURE:GNAT_BLOOD:EYE -CREATURE:GNAT_BLOOD:BRAIN -CREATURE:GNAT_BLOOD:LUNG -CREATURE:GNAT_BLOOD:HEART -CREATURE:GNAT_BLOOD:LIVER -CREATURE:GNAT_BLOOD:GUT -CREATURE:GNAT_BLOOD:STOMACH -CREATURE:GNAT_BLOOD:GIZZARD -CREATURE:GNAT_BLOOD:PANCREAS -CREATURE:GNAT_BLOOD:SPLEEN -CREATURE:GNAT_BLOOD:KIDNEY -CREATURE:LIZARD:MUSCLE -CREATURE:LIZARD:EYE -CREATURE:LIZARD:BRAIN -CREATURE:LIZARD:LUNG -CREATURE:LIZARD:HEART -CREATURE:LIZARD:LIVER -CREATURE:LIZARD:GUT -CREATURE:LIZARD:STOMACH -CREATURE:LIZARD:GIZZARD -CREATURE:LIZARD:PANCREAS -CREATURE:LIZARD:SPLEEN -CREATURE:LIZARD:KIDNEY -CREATURE:LIZARD_MAN:MUSCLE -CREATURE:LIZARD_MAN:EYE -CREATURE:LIZARD_MAN:BRAIN -CREATURE:LIZARD_MAN:LUNG -CREATURE:LIZARD_MAN:HEART -CREATURE:LIZARD_MAN:LIVER -CREATURE:LIZARD_MAN:GUT -CREATURE:LIZARD_MAN:STOMACH -CREATURE:LIZARD_MAN:GIZZARD -CREATURE:LIZARD_MAN:PANCREAS -CREATURE:LIZARD_MAN:SPLEEN -CREATURE:LIZARD_MAN:KIDNEY -CREATURE:GIANT_LIZARD:MUSCLE -CREATURE:GIANT_LIZARD:EYE -CREATURE:GIANT_LIZARD:BRAIN -CREATURE:GIANT_LIZARD:LUNG -CREATURE:GIANT_LIZARD:HEART -CREATURE:GIANT_LIZARD:LIVER -CREATURE:GIANT_LIZARD:GUT -CREATURE:GIANT_LIZARD:STOMACH -CREATURE:GIANT_LIZARD:GIZZARD -CREATURE:GIANT_LIZARD:PANCREAS -CREATURE:GIANT_LIZARD:SPLEEN -CREATURE:GIANT_LIZARD:KIDNEY -CREATURE:SKINK:MUSCLE -CREATURE:SKINK:EYE -CREATURE:SKINK:BRAIN -CREATURE:SKINK:LUNG -CREATURE:SKINK:HEART -CREATURE:SKINK:LIVER -CREATURE:SKINK:GUT -CREATURE:SKINK:STOMACH -CREATURE:SKINK:GIZZARD -CREATURE:SKINK:PANCREAS -CREATURE:SKINK:SPLEEN -CREATURE:SKINK:KIDNEY -CREATURE:SKINK_MAN:MUSCLE -CREATURE:SKINK_MAN:EYE -CREATURE:SKINK_MAN:BRAIN -CREATURE:SKINK_MAN:LUNG -CREATURE:SKINK_MAN:HEART -CREATURE:SKINK_MAN:LIVER -CREATURE:SKINK_MAN:GUT -CREATURE:SKINK_MAN:STOMACH -CREATURE:SKINK_MAN:GIZZARD -CREATURE:SKINK_MAN:PANCREAS -CREATURE:SKINK_MAN:SPLEEN -CREATURE:SKINK_MAN:KIDNEY -CREATURE:GIANT_SKINK:MUSCLE -CREATURE:GIANT_SKINK:EYE -CREATURE:GIANT_SKINK:BRAIN -CREATURE:GIANT_SKINK:LUNG -CREATURE:GIANT_SKINK:HEART -CREATURE:GIANT_SKINK:LIVER -CREATURE:GIANT_SKINK:GUT -CREATURE:GIANT_SKINK:STOMACH -CREATURE:GIANT_SKINK:GIZZARD -CREATURE:GIANT_SKINK:PANCREAS -CREATURE:GIANT_SKINK:SPLEEN -CREATURE:GIANT_SKINK:KIDNEY -CREATURE:CHAMELEON:MUSCLE -CREATURE:CHAMELEON:EYE -CREATURE:CHAMELEON:BRAIN -CREATURE:CHAMELEON:LUNG -CREATURE:CHAMELEON:HEART -CREATURE:CHAMELEON:LIVER -CREATURE:CHAMELEON:GUT -CREATURE:CHAMELEON:STOMACH -CREATURE:CHAMELEON:GIZZARD -CREATURE:CHAMELEON:PANCREAS -CREATURE:CHAMELEON:SPLEEN -CREATURE:CHAMELEON:KIDNEY -CREATURE:CHAMELEON_MAN:MUSCLE -CREATURE:CHAMELEON_MAN:EYE -CREATURE:CHAMELEON_MAN:BRAIN -CREATURE:CHAMELEON_MAN:LUNG -CREATURE:CHAMELEON_MAN:HEART -CREATURE:CHAMELEON_MAN:LIVER -CREATURE:CHAMELEON_MAN:GUT -CREATURE:CHAMELEON_MAN:STOMACH -CREATURE:CHAMELEON_MAN:GIZZARD -CREATURE:CHAMELEON_MAN:PANCREAS -CREATURE:CHAMELEON_MAN:SPLEEN -CREATURE:CHAMELEON_MAN:KIDNEY -CREATURE:GIANT_CHAMELEON:MUSCLE -CREATURE:GIANT_CHAMELEON:EYE -CREATURE:GIANT_CHAMELEON:BRAIN -CREATURE:GIANT_CHAMELEON:LUNG -CREATURE:GIANT_CHAMELEON:HEART -CREATURE:GIANT_CHAMELEON:LIVER -CREATURE:GIANT_CHAMELEON:GUT - CREATURE:GIANT_CHAMELEON:STOMACH - CREATURE:GIANT_CHAMELEON:GIZZARD -!CREATURE:GIANT_CHAMELEON:PANCREAS -CREATURE:GIANT_CHAMELEON:SPLEEN -CREATURE:GIANT_CHAMELEON:KIDNEY -CREATURE:ANOLE:MUSCLE -CREATURE:ANOLE:EYE -CREATURE:ANOLE:BRAIN -CREATURE:ANOLE:LUNG -CREATURE:ANOLE:HEART -CREATURE:ANOLE:LIVER -CREATURE:ANOLE:GUT -CREATURE:ANOLE:STOMACH -CREATURE:ANOLE:GIZZARD -CREATURE:ANOLE:PANCREAS -CREATURE:ANOLE:SPLEEN -CREATURE:ANOLE:KIDNEY -CREATURE:ANOLE_MAN:MUSCLE -CREATURE:ANOLE_MAN:EYE -CREATURE:ANOLE_MAN:BRAIN -CREATURE:ANOLE_MAN:LUNG -CREATURE:ANOLE_MAN:HEART -CREATURE:ANOLE_MAN:LIVER -CREATURE:ANOLE_MAN:GUT -CREATURE:ANOLE_MAN:STOMACH -CREATURE:ANOLE_MAN:GIZZARD -CREATURE:ANOLE_MAN:PANCREAS -CREATURE:ANOLE_MAN:SPLEEN -CREATURE:ANOLE_MAN:KIDNEY -CREATURE:GIANT_ANOLE:MUSCLE -CREATURE:GIANT_ANOLE:EYE -CREATURE:GIANT_ANOLE:BRAIN -CREATURE:GIANT_ANOLE:LUNG -CREATURE:GIANT_ANOLE:HEART -CREATURE:GIANT_ANOLE:LIVER -CREATURE:GIANT_ANOLE:GUT -CREATURE:GIANT_ANOLE:STOMACH -CREATURE:GIANT_ANOLE:GIZZARD -CREATURE:GIANT_ANOLE:PANCREAS -CREATURE:GIANT_ANOLE:SPLEEN -CREATURE:GIANT_ANOLE:KIDNEY -CREATURE:IGUANA:MUSCLE -CREATURE:IGUANA:EYE -CREATURE:IGUANA:BRAIN -CREATURE:IGUANA:LUNG -CREATURE:IGUANA:HEART -CREATURE:IGUANA:LIVER -CREATURE:IGUANA:GUT -CREATURE:IGUANA:STOMACH -CREATURE:IGUANA:GIZZARD -CREATURE:IGUANA:PANCREAS -CREATURE:IGUANA:SPLEEN -CREATURE:IGUANA:KIDNEY -CREATURE:IGUANA_MAN:MUSCLE -CREATURE:IGUANA_MAN:EYE -CREATURE:IGUANA_MAN:BRAIN -CREATURE:IGUANA_MAN:LUNG -CREATURE:IGUANA_MAN:HEART -CREATURE:IGUANA_MAN:LIVER -CREATURE:IGUANA_MAN:GUT -CREATURE:IGUANA_MAN:STOMACH -CREATURE:IGUANA_MAN:GIZZARD -CREATURE:IGUANA_MAN:PANCREAS -CREATURE:IGUANA_MAN:SPLEEN -CREATURE:IGUANA_MAN:KIDNEY -CREATURE:GIANT_IGUANA:MUSCLE -CREATURE:GIANT_IGUANA:EYE -CREATURE:GIANT_IGUANA:BRAIN -CREATURE:GIANT_IGUANA:LUNG -CREATURE:GIANT_IGUANA:HEART -CREATURE:GIANT_IGUANA:LIVER -CREATURE:GIANT_IGUANA:GUT -CREATURE:GIANT_IGUANA:STOMACH -CREATURE:GIANT_IGUANA:GIZZARD -CREATURE:GIANT_IGUANA:PANCREAS -CREATURE:GIANT_IGUANA:SPLEEN -CREATURE:GIANT_IGUANA:KIDNEY -CREATURE:RIVER OTTER:MUSCLE -CREATURE:RIVER OTTER:EYE -CREATURE:RIVER OTTER:BRAIN -CREATURE:RIVER OTTER:LUNG -CREATURE:RIVER OTTER:HEART -CREATURE:RIVER OTTER:LIVER -CREATURE:RIVER OTTER:GUT -CREATURE:RIVER OTTER:STOMACH -CREATURE:RIVER OTTER:GIZZARD -CREATURE:RIVER OTTER:PANCREAS -CREATURE:RIVER OTTER:SPLEEN -CREATURE:RIVER OTTER:KIDNEY -CREATURE:SEA OTTER:MUSCLE -CREATURE:SEA OTTER:EYE -CREATURE:SEA OTTER:BRAIN -CREATURE:SEA OTTER:LUNG -CREATURE:SEA OTTER:HEART -CREATURE:SEA OTTER:LIVER -CREATURE:SEA OTTER:GUT -CREATURE:SEA OTTER:STOMACH -CREATURE:SEA OTTER:GIZZARD -CREATURE:SEA OTTER:PANCREAS -CREATURE:SEA OTTER:SPLEEN -CREATURE:SEA OTTER:KIDNEY -CREATURE:OTTER_MAN:MUSCLE -CREATURE:OTTER_MAN:EYE -CREATURE:OTTER_MAN:BRAIN -CREATURE:OTTER_MAN:LUNG -CREATURE:OTTER_MAN:HEART -CREATURE:OTTER_MAN:LIVER -CREATURE:OTTER_MAN:GUT -CREATURE:OTTER_MAN:STOMACH -CREATURE:OTTER_MAN:GIZZARD -CREATURE:OTTER_MAN:PANCREAS -CREATURE:OTTER_MAN:SPLEEN -CREATURE:OTTER_MAN:KIDNEY -CREATURE:GIANT_OTTER:MUSCLE -CREATURE:GIANT_OTTER:EYE -CREATURE:GIANT_OTTER:BRAIN -CREATURE:GIANT_OTTER:LUNG -CREATURE:GIANT_OTTER:HEART -CREATURE:GIANT_OTTER:LIVER -CREATURE:GIANT_OTTER:GUT -CREATURE:GIANT_OTTER:STOMACH -CREATURE:GIANT_OTTER:GIZZARD -CREATURE:GIANT_OTTER:PANCREAS -CREATURE:GIANT_OTTER:SPLEEN -CREATURE:GIANT_OTTER:KIDNEY -CREATURE:SNAPPING TURTLE:MUSCLE -CREATURE:SNAPPING TURTLE:EYE -CREATURE:SNAPPING TURTLE:BRAIN -CREATURE:SNAPPING TURTLE:LUNG -CREATURE:SNAPPING TURTLE:HEART -CREATURE:SNAPPING TURTLE:LIVER -CREATURE:SNAPPING TURTLE:GUT - CREATURE:SNAPPING TURTLE:STOMACH - CREATURE:SNAPPING TURTLE:GIZZARD -!CREATURE:SNAPPING TURTLE:PANCREAS -CREATURE:SNAPPING TURTLE:SPLEEN -CREATURE:SNAPPING TURTLE:KIDNEY -)CREATURE:ALLIGATOR SNAPPING TURTLE:MUSCLE -&CREATURE:ALLIGATOR SNAPPING TURTLE:EYE -(CREATURE:ALLIGATOR SNAPPING TURTLE:BRAIN -'CREATURE:ALLIGATOR SNAPPING TURTLE:LUNG -(CREATURE:ALLIGATOR SNAPPING TURTLE:HEART -(CREATURE:ALLIGATOR SNAPPING TURTLE:LIVER -&CREATURE:ALLIGATOR SNAPPING TURTLE:GUT -*CREATURE:ALLIGATOR SNAPPING TURTLE:STOMACH -*CREATURE:ALLIGATOR SNAPPING TURTLE:GIZZARD -+CREATURE:ALLIGATOR SNAPPING TURTLE:PANCREAS -)CREATURE:ALLIGATOR SNAPPING TURTLE:SPLEEN -)CREATURE:ALLIGATOR SNAPPING TURTLE:KIDNEY -#CREATURE:SNAPPING_TURTLE_MAN:MUSCLE - CREATURE:SNAPPING_TURTLE_MAN:EYE -"CREATURE:SNAPPING_TURTLE_MAN:BRAIN -!CREATURE:SNAPPING_TURTLE_MAN:LUNG -"CREATURE:SNAPPING_TURTLE_MAN:HEART -"CREATURE:SNAPPING_TURTLE_MAN:LIVER - CREATURE:SNAPPING_TURTLE_MAN:GUT -$CREATURE:SNAPPING_TURTLE_MAN:STOMACH -$CREATURE:SNAPPING_TURTLE_MAN:GIZZARD -%CREATURE:SNAPPING_TURTLE_MAN:PANCREAS -#CREATURE:SNAPPING_TURTLE_MAN:SPLEEN -#CREATURE:SNAPPING_TURTLE_MAN:KIDNEY -%CREATURE:GIANT_SNAPPING_TURTLE:MUSCLE -"CREATURE:GIANT_SNAPPING_TURTLE:EYE -$CREATURE:GIANT_SNAPPING_TURTLE:BRAIN -#CREATURE:GIANT_SNAPPING_TURTLE:LUNG -$CREATURE:GIANT_SNAPPING_TURTLE:HEART -$CREATURE:GIANT_SNAPPING_TURTLE:LIVER -"CREATURE:GIANT_SNAPPING_TURTLE:GUT -&CREATURE:GIANT_SNAPPING_TURTLE:STOMACH -&CREATURE:GIANT_SNAPPING_TURTLE:GIZZARD -'CREATURE:GIANT_SNAPPING_TURTLE:PANCREAS -%CREATURE:GIANT_SNAPPING_TURTLE:SPLEEN -%CREATURE:GIANT_SNAPPING_TURTLE:KIDNEY -CREATURE:BEAVER:MUSCLE -CREATURE:BEAVER:EYE -CREATURE:BEAVER:BRAIN -CREATURE:BEAVER:LUNG -CREATURE:BEAVER:HEART -CREATURE:BEAVER:LIVER -CREATURE:BEAVER:GUT -CREATURE:BEAVER:STOMACH -CREATURE:BEAVER:GIZZARD -CREATURE:BEAVER:PANCREAS -CREATURE:BEAVER:SPLEEN -CREATURE:BEAVER:KIDNEY -CREATURE:BEAVER_MAN:MUSCLE -CREATURE:BEAVER_MAN:EYE -CREATURE:BEAVER_MAN:BRAIN -CREATURE:BEAVER_MAN:LUNG -CREATURE:BEAVER_MAN:HEART -CREATURE:BEAVER_MAN:LIVER -CREATURE:BEAVER_MAN:GUT -CREATURE:BEAVER_MAN:STOMACH -CREATURE:BEAVER_MAN:GIZZARD -CREATURE:BEAVER_MAN:PANCREAS -CREATURE:BEAVER_MAN:SPLEEN -CREATURE:BEAVER_MAN:KIDNEY -CREATURE:GIANT_BEAVER:MUSCLE -CREATURE:GIANT_BEAVER:EYE -CREATURE:GIANT_BEAVER:BRAIN -CREATURE:GIANT_BEAVER:LUNG -CREATURE:GIANT_BEAVER:HEART -CREATURE:GIANT_BEAVER:LIVER -CREATURE:GIANT_BEAVER:GUT -CREATURE:GIANT_BEAVER:STOMACH -CREATURE:GIANT_BEAVER:GIZZARD -CREATURE:GIANT_BEAVER:PANCREAS -CREATURE:GIANT_BEAVER:SPLEEN -CREATURE:GIANT_BEAVER:KIDNEY -CREATURE:LEECH:MUSCLE -CREATURE:LEECH:EYE -CREATURE:LEECH:BRAIN -CREATURE:LEECH:LUNG -CREATURE:LEECH:HEART -CREATURE:LEECH:LIVER -CREATURE:LEECH:GUT -CREATURE:LEECH:STOMACH -CREATURE:LEECH:GIZZARD -CREATURE:LEECH:PANCREAS -CREATURE:LEECH:SPLEEN -CREATURE:LEECH:KIDNEY -CREATURE:LEECH_MAN:MUSCLE -CREATURE:LEECH_MAN:EYE -CREATURE:LEECH_MAN:BRAIN -CREATURE:LEECH_MAN:LUNG -CREATURE:LEECH_MAN:HEART -CREATURE:LEECH_MAN:LIVER -CREATURE:LEECH_MAN:GUT -CREATURE:LEECH_MAN:STOMACH -CREATURE:LEECH_MAN:GIZZARD -CREATURE:LEECH_MAN:PANCREAS -CREATURE:LEECH_MAN:SPLEEN -CREATURE:LEECH_MAN:KIDNEY -CREATURE:GIANT_LEECH:MUSCLE -CREATURE:GIANT_LEECH:EYE -CREATURE:GIANT_LEECH:BRAIN -CREATURE:GIANT_LEECH:LUNG -CREATURE:GIANT_LEECH:HEART -CREATURE:GIANT_LEECH:LIVER -CREATURE:GIANT_LEECH:GUT -CREATURE:GIANT_LEECH:STOMACH -CREATURE:GIANT_LEECH:GIZZARD -CREATURE:GIANT_LEECH:PANCREAS -CREATURE:GIANT_LEECH:SPLEEN -CREATURE:GIANT_LEECH:KIDNEY -CREATURE:AXOLOTL:MUSCLE -CREATURE:AXOLOTL:EYE -CREATURE:AXOLOTL:BRAIN -CREATURE:AXOLOTL:LUNG -CREATURE:AXOLOTL:HEART -CREATURE:AXOLOTL:LIVER -CREATURE:AXOLOTL:GUT -CREATURE:AXOLOTL:STOMACH -CREATURE:AXOLOTL:GIZZARD -CREATURE:AXOLOTL:PANCREAS -CREATURE:AXOLOTL:SPLEEN -CREATURE:AXOLOTL:KIDNEY -CREATURE:AXOLOTL_MAN:MUSCLE -CREATURE:AXOLOTL_MAN:EYE -CREATURE:AXOLOTL_MAN:BRAIN -CREATURE:AXOLOTL_MAN:LUNG -CREATURE:AXOLOTL_MAN:HEART -CREATURE:AXOLOTL_MAN:LIVER -CREATURE:AXOLOTL_MAN:GUT -CREATURE:AXOLOTL_MAN:STOMACH -CREATURE:AXOLOTL_MAN:GIZZARD -CREATURE:AXOLOTL_MAN:PANCREAS -CREATURE:AXOLOTL_MAN:SPLEEN -CREATURE:AXOLOTL_MAN:KIDNEY -CREATURE:GIANT_AXOLOTL:MUSCLE -CREATURE:GIANT_AXOLOTL:EYE -CREATURE:GIANT_AXOLOTL:BRAIN -CREATURE:GIANT_AXOLOTL:LUNG -CREATURE:GIANT_AXOLOTL:HEART -CREATURE:GIANT_AXOLOTL:LIVER -CREATURE:GIANT_AXOLOTL:GUT -CREATURE:GIANT_AXOLOTL:STOMACH -CREATURE:GIANT_AXOLOTL:GIZZARD -CREATURE:GIANT_AXOLOTL:PANCREAS -CREATURE:GIANT_AXOLOTL:SPLEEN -CREATURE:GIANT_AXOLOTL:KIDNEY -CREATURE:MINK:MUSCLE -CREATURE:MINK:EYE -CREATURE:MINK:BRAIN -CREATURE:MINK:LUNG -CREATURE:MINK:HEART -CREATURE:MINK:LIVER -CREATURE:MINK:GUT -CREATURE:MINK:STOMACH -CREATURE:MINK:GIZZARD -CREATURE:MINK:PANCREAS -CREATURE:MINK:SPLEEN -CREATURE:MINK:KIDNEY -CREATURE:MINK_MAN:MUSCLE -CREATURE:MINK_MAN:EYE -CREATURE:MINK_MAN:BRAIN -CREATURE:MINK_MAN:LUNG -CREATURE:MINK_MAN:HEART -CREATURE:MINK_MAN:LIVER -CREATURE:MINK_MAN:GUT -CREATURE:MINK_MAN:STOMACH -CREATURE:MINK_MAN:GIZZARD -CREATURE:MINK_MAN:PANCREAS -CREATURE:MINK_MAN:SPLEEN -CREATURE:MINK_MAN:KIDNEY -CREATURE:GIANT_MINK:MUSCLE -CREATURE:GIANT_MINK:EYE -CREATURE:GIANT_MINK:BRAIN -CREATURE:GIANT_MINK:LUNG -CREATURE:GIANT_MINK:HEART -CREATURE:GIANT_MINK:LIVER -CREATURE:GIANT_MINK:GUT -CREATURE:GIANT_MINK:STOMACH -CREATURE:GIANT_MINK:GIZZARD -CREATURE:GIANT_MINK:PANCREAS -CREATURE:GIANT_MINK:SPLEEN -CREATURE:GIANT_MINK:KIDNEY -CREATURE:POND_TURTLE:MUSCLE -CREATURE:POND_TURTLE:EYE -CREATURE:POND_TURTLE:BRAIN -CREATURE:POND_TURTLE:LUNG -CREATURE:POND_TURTLE:HEART -CREATURE:POND_TURTLE:LIVER -CREATURE:POND_TURTLE:GUT -CREATURE:POND_TURTLE:STOMACH -CREATURE:POND_TURTLE:GIZZARD -CREATURE:POND_TURTLE:PANCREAS -CREATURE:POND_TURTLE:SPLEEN -CREATURE:POND_TURTLE:KIDNEY -CREATURE:POND_TURTLE_MAN:MUSCLE -CREATURE:POND_TURTLE_MAN:EYE -CREATURE:POND_TURTLE_MAN:BRAIN -CREATURE:POND_TURTLE_MAN:LUNG -CREATURE:POND_TURTLE_MAN:HEART -CREATURE:POND_TURTLE_MAN:LIVER -CREATURE:POND_TURTLE_MAN:GUT - CREATURE:POND_TURTLE_MAN:STOMACH - CREATURE:POND_TURTLE_MAN:GIZZARD -!CREATURE:POND_TURTLE_MAN:PANCREAS -CREATURE:POND_TURTLE_MAN:SPLEEN -CREATURE:POND_TURTLE_MAN:KIDNEY -!CREATURE:GIANT_POND_TURTLE:MUSCLE -CREATURE:GIANT_POND_TURTLE:EYE - CREATURE:GIANT_POND_TURTLE:BRAIN -CREATURE:GIANT_POND_TURTLE:LUNG - CREATURE:GIANT_POND_TURTLE:HEART - CREATURE:GIANT_POND_TURTLE:LIVER -CREATURE:GIANT_POND_TURTLE:GUT -"CREATURE:GIANT_POND_TURTLE:STOMACH -"CREATURE:GIANT_POND_TURTLE:GIZZARD -#CREATURE:GIANT_POND_TURTLE:PANCREAS -!CREATURE:GIANT_POND_TURTLE:SPLEEN -!CREATURE:GIANT_POND_TURTLE:KIDNEY -CREATURE:RAT:MUSCLE -CREATURE:RAT:EYE -CREATURE:RAT:BRAIN -CREATURE:RAT:LUNG -CREATURE:RAT:HEART -CREATURE:RAT:LIVER -CREATURE:RAT:GUT -CREATURE:RAT:STOMACH -CREATURE:RAT:GIZZARD -CREATURE:RAT:PANCREAS -CREATURE:RAT:SPLEEN -CREATURE:RAT:KIDNEY -CREATURE:RAT_MAN:MUSCLE -CREATURE:RAT_MAN:EYE -CREATURE:RAT_MAN:BRAIN -CREATURE:RAT_MAN:LUNG -CREATURE:RAT_MAN:HEART -CREATURE:RAT_MAN:LIVER -CREATURE:RAT_MAN:GUT -CREATURE:RAT_MAN:STOMACH -CREATURE:RAT_MAN:GIZZARD -CREATURE:RAT_MAN:PANCREAS -CREATURE:RAT_MAN:SPLEEN -CREATURE:RAT_MAN:KIDNEY -CREATURE:SQUIRREL_GRAY:MUSCLE -CREATURE:SQUIRREL_GRAY:EYE -CREATURE:SQUIRREL_GRAY:BRAIN -CREATURE:SQUIRREL_GRAY:LUNG -CREATURE:SQUIRREL_GRAY:HEART -CREATURE:SQUIRREL_GRAY:LIVER -CREATURE:SQUIRREL_GRAY:GUT -CREATURE:SQUIRREL_GRAY:STOMACH -CREATURE:SQUIRREL_GRAY:GIZZARD -CREATURE:SQUIRREL_GRAY:PANCREAS -CREATURE:SQUIRREL_GRAY:SPLEEN -CREATURE:SQUIRREL_GRAY:KIDNEY -!CREATURE:SQUIRREL_GRAY_MAN:MUSCLE -CREATURE:SQUIRREL_GRAY_MAN:EYE - CREATURE:SQUIRREL_GRAY_MAN:BRAIN -CREATURE:SQUIRREL_GRAY_MAN:LUNG - CREATURE:SQUIRREL_GRAY_MAN:HEART - CREATURE:SQUIRREL_GRAY_MAN:LIVER -CREATURE:SQUIRREL_GRAY_MAN:GUT -"CREATURE:SQUIRREL_GRAY_MAN:STOMACH -"CREATURE:SQUIRREL_GRAY_MAN:GIZZARD -#CREATURE:SQUIRREL_GRAY_MAN:PANCREAS -!CREATURE:SQUIRREL_GRAY_MAN:SPLEEN -!CREATURE:SQUIRREL_GRAY_MAN:KIDNEY -#CREATURE:GIANT_SQUIRREL_GRAY:MUSCLE - CREATURE:GIANT_SQUIRREL_GRAY:EYE -"CREATURE:GIANT_SQUIRREL_GRAY:BRAIN -!CREATURE:GIANT_SQUIRREL_GRAY:LUNG -"CREATURE:GIANT_SQUIRREL_GRAY:HEART -"CREATURE:GIANT_SQUIRREL_GRAY:LIVER - CREATURE:GIANT_SQUIRREL_GRAY:GUT -$CREATURE:GIANT_SQUIRREL_GRAY:STOMACH -$CREATURE:GIANT_SQUIRREL_GRAY:GIZZARD -%CREATURE:GIANT_SQUIRREL_GRAY:PANCREAS -#CREATURE:GIANT_SQUIRREL_GRAY:SPLEEN -#CREATURE:GIANT_SQUIRREL_GRAY:KIDNEY -CREATURE:SQUIRREL_RED:MUSCLE -CREATURE:SQUIRREL_RED:EYE -CREATURE:SQUIRREL_RED:BRAIN -CREATURE:SQUIRREL_RED:LUNG -CREATURE:SQUIRREL_RED:HEART -CREATURE:SQUIRREL_RED:LIVER -CREATURE:SQUIRREL_RED:GUT -CREATURE:SQUIRREL_RED:STOMACH -CREATURE:SQUIRREL_RED:GIZZARD -CREATURE:SQUIRREL_RED:PANCREAS -CREATURE:SQUIRREL_RED:SPLEEN -CREATURE:SQUIRREL_RED:KIDNEY - CREATURE:SQUIRREL_RED_MAN:MUSCLE -CREATURE:SQUIRREL_RED_MAN:EYE -CREATURE:SQUIRREL_RED_MAN:BRAIN -CREATURE:SQUIRREL_RED_MAN:LUNG -CREATURE:SQUIRREL_RED_MAN:HEART -CREATURE:SQUIRREL_RED_MAN:LIVER -CREATURE:SQUIRREL_RED_MAN:GUT -!CREATURE:SQUIRREL_RED_MAN:STOMACH -!CREATURE:SQUIRREL_RED_MAN:GIZZARD -"CREATURE:SQUIRREL_RED_MAN:PANCREAS - CREATURE:SQUIRREL_RED_MAN:SPLEEN - CREATURE:SQUIRREL_RED_MAN:KIDNEY -"CREATURE:GIANT_SQUIRREL_RED:MUSCLE -CREATURE:GIANT_SQUIRREL_RED:EYE -!CREATURE:GIANT_SQUIRREL_RED:BRAIN - CREATURE:GIANT_SQUIRREL_RED:LUNG -!CREATURE:GIANT_SQUIRREL_RED:HEART -!CREATURE:GIANT_SQUIRREL_RED:LIVER -CREATURE:GIANT_SQUIRREL_RED:GUT -#CREATURE:GIANT_SQUIRREL_RED:STOMACH -#CREATURE:GIANT_SQUIRREL_RED:GIZZARD -$CREATURE:GIANT_SQUIRREL_RED:PANCREAS -"CREATURE:GIANT_SQUIRREL_RED:SPLEEN -"CREATURE:GIANT_SQUIRREL_RED:KIDNEY -CREATURE:CHIPMUNK:MUSCLE -CREATURE:CHIPMUNK:EYE -CREATURE:CHIPMUNK:BRAIN -CREATURE:CHIPMUNK:LUNG -CREATURE:CHIPMUNK:HEART -CREATURE:CHIPMUNK:LIVER -CREATURE:CHIPMUNK:GUT -CREATURE:CHIPMUNK:STOMACH -CREATURE:CHIPMUNK:GIZZARD -CREATURE:CHIPMUNK:PANCREAS -CREATURE:CHIPMUNK:SPLEEN -CREATURE:CHIPMUNK:KIDNEY -CREATURE:CHIPMUNK_MAN:MUSCLE -CREATURE:CHIPMUNK_MAN:EYE -CREATURE:CHIPMUNK_MAN:BRAIN -CREATURE:CHIPMUNK_MAN:LUNG -CREATURE:CHIPMUNK_MAN:HEART -CREATURE:CHIPMUNK_MAN:LIVER -CREATURE:CHIPMUNK_MAN:GUT -CREATURE:CHIPMUNK_MAN:STOMACH -CREATURE:CHIPMUNK_MAN:GIZZARD -CREATURE:CHIPMUNK_MAN:PANCREAS -CREATURE:CHIPMUNK_MAN:SPLEEN -CREATURE:CHIPMUNK_MAN:KIDNEY -CREATURE:GIANT_CHIPMUNK:MUSCLE -CREATURE:GIANT_CHIPMUNK:EYE -CREATURE:GIANT_CHIPMUNK:BRAIN -CREATURE:GIANT_CHIPMUNK:LUNG -CREATURE:GIANT_CHIPMUNK:HEART -CREATURE:GIANT_CHIPMUNK:LIVER -CREATURE:GIANT_CHIPMUNK:GUT -CREATURE:GIANT_CHIPMUNK:STOMACH -CREATURE:GIANT_CHIPMUNK:GIZZARD - CREATURE:GIANT_CHIPMUNK:PANCREAS -CREATURE:GIANT_CHIPMUNK:SPLEEN -CREATURE:GIANT_CHIPMUNK:KIDNEY -CREATURE:HAMSTER:MUSCLE -CREATURE:HAMSTER:EYE -CREATURE:HAMSTER:BRAIN -CREATURE:HAMSTER:LUNG -CREATURE:HAMSTER:HEART -CREATURE:HAMSTER:LIVER -CREATURE:HAMSTER:GUT -CREATURE:HAMSTER:STOMACH -CREATURE:HAMSTER:GIZZARD -CREATURE:HAMSTER:PANCREAS -CREATURE:HAMSTER:SPLEEN -CREATURE:HAMSTER:KIDNEY -CREATURE:HAMSTER_MAN:MUSCLE -CREATURE:HAMSTER_MAN:EYE -CREATURE:HAMSTER_MAN:BRAIN -CREATURE:HAMSTER_MAN:LUNG -CREATURE:HAMSTER_MAN:HEART -CREATURE:HAMSTER_MAN:LIVER -CREATURE:HAMSTER_MAN:GUT -CREATURE:HAMSTER_MAN:STOMACH -CREATURE:HAMSTER_MAN:GIZZARD -CREATURE:HAMSTER_MAN:PANCREAS -CREATURE:HAMSTER_MAN:SPLEEN -CREATURE:HAMSTER_MAN:KIDNEY -CREATURE:GIANT_HAMSTER:MUSCLE -CREATURE:GIANT_HAMSTER:EYE -CREATURE:GIANT_HAMSTER:BRAIN -CREATURE:GIANT_HAMSTER:LUNG -CREATURE:GIANT_HAMSTER:HEART -CREATURE:GIANT_HAMSTER:LIVER -CREATURE:GIANT_HAMSTER:GUT -CREATURE:GIANT_HAMSTER:STOMACH -CREATURE:GIANT_HAMSTER:GIZZARD -CREATURE:GIANT_HAMSTER:PANCREAS -CREATURE:GIANT_HAMSTER:SPLEEN -CREATURE:GIANT_HAMSTER:KIDNEY -CREATURE:HEDGEHOG:MUSCLE -CREATURE:HEDGEHOG:EYE -CREATURE:HEDGEHOG:BRAIN -CREATURE:HEDGEHOG:LUNG -CREATURE:HEDGEHOG:HEART -CREATURE:HEDGEHOG:LIVER -CREATURE:HEDGEHOG:GUT -CREATURE:HEDGEHOG:STOMACH -CREATURE:HEDGEHOG:GIZZARD -CREATURE:HEDGEHOG:PANCREAS -CREATURE:HEDGEHOG:SPLEEN -CREATURE:HEDGEHOG:KIDNEY -CREATURE:HEDGEHOG_MAN:MUSCLE -CREATURE:HEDGEHOG_MAN:EYE -CREATURE:HEDGEHOG_MAN:BRAIN -CREATURE:HEDGEHOG_MAN:LUNG -CREATURE:HEDGEHOG_MAN:HEART -CREATURE:HEDGEHOG_MAN:LIVER -CREATURE:HEDGEHOG_MAN:GUT -CREATURE:HEDGEHOG_MAN:STOMACH -CREATURE:HEDGEHOG_MAN:GIZZARD -CREATURE:HEDGEHOG_MAN:PANCREAS -CREATURE:HEDGEHOG_MAN:SPLEEN -CREATURE:HEDGEHOG_MAN:KIDNEY -CREATURE:GIANT_HEDGEHOG:MUSCLE -CREATURE:GIANT_HEDGEHOG:EYE -CREATURE:GIANT_HEDGEHOG:BRAIN -CREATURE:GIANT_HEDGEHOG:LUNG -CREATURE:GIANT_HEDGEHOG:HEART -CREATURE:GIANT_HEDGEHOG:LIVER -CREATURE:GIANT_HEDGEHOG:GUT -CREATURE:GIANT_HEDGEHOG:STOMACH -CREATURE:GIANT_HEDGEHOG:GIZZARD - CREATURE:GIANT_HEDGEHOG:PANCREAS -CREATURE:GIANT_HEDGEHOG:SPLEEN -CREATURE:GIANT_HEDGEHOG:KIDNEY -CREATURE:SQUIRREL_FLYING:MUSCLE -CREATURE:SQUIRREL_FLYING:EYE -CREATURE:SQUIRREL_FLYING:BRAIN -CREATURE:SQUIRREL_FLYING:LUNG -CREATURE:SQUIRREL_FLYING:HEART -CREATURE:SQUIRREL_FLYING:LIVER -CREATURE:SQUIRREL_FLYING:GUT - CREATURE:SQUIRREL_FLYING:STOMACH - CREATURE:SQUIRREL_FLYING:GIZZARD -!CREATURE:SQUIRREL_FLYING:PANCREAS -CREATURE:SQUIRREL_FLYING:SPLEEN -CREATURE:SQUIRREL_FLYING:KIDNEY -#CREATURE:FLYING_SQUIRREL_MAN:MUSCLE - CREATURE:FLYING_SQUIRREL_MAN:EYE -"CREATURE:FLYING_SQUIRREL_MAN:BRAIN -!CREATURE:FLYING_SQUIRREL_MAN:LUNG -"CREATURE:FLYING_SQUIRREL_MAN:HEART -"CREATURE:FLYING_SQUIRREL_MAN:LIVER - CREATURE:FLYING_SQUIRREL_MAN:GUT -$CREATURE:FLYING_SQUIRREL_MAN:STOMACH -$CREATURE:FLYING_SQUIRREL_MAN:GIZZARD -%CREATURE:FLYING_SQUIRREL_MAN:PANCREAS -#CREATURE:FLYING_SQUIRREL_MAN:SPLEEN -#CREATURE:FLYING_SQUIRREL_MAN:KIDNEY -%CREATURE:GIANT_FLYING_SQUIRREL:MUSCLE -"CREATURE:GIANT_FLYING_SQUIRREL:EYE -$CREATURE:GIANT_FLYING_SQUIRREL:BRAIN -#CREATURE:GIANT_FLYING_SQUIRREL:LUNG -$CREATURE:GIANT_FLYING_SQUIRREL:HEART -$CREATURE:GIANT_FLYING_SQUIRREL:LIVER -"CREATURE:GIANT_FLYING_SQUIRREL:GUT -&CREATURE:GIANT_FLYING_SQUIRREL:STOMACH -&CREATURE:GIANT_FLYING_SQUIRREL:GIZZARD -'CREATURE:GIANT_FLYING_SQUIRREL:PANCREAS -%CREATURE:GIANT_FLYING_SQUIRREL:SPLEEN -%CREATURE:GIANT_FLYING_SQUIRREL:KIDNEY -CREATURE:MUSSEL:MUSCLE -CREATURE:OYSTER:MUSCLE -CREATURE:FISH_SALMON:MUSCLE -CREATURE:FISH_SALMON:EYE -CREATURE:FISH_SALMON:BRAIN -CREATURE:FISH_SALMON:LUNG -CREATURE:FISH_SALMON:HEART -CREATURE:FISH_SALMON:LIVER -CREATURE:FISH_SALMON:GUT -CREATURE:FISH_SALMON:STOMACH -CREATURE:FISH_SALMON:GIZZARD -CREATURE:FISH_SALMON:PANCREAS -CREATURE:FISH_SALMON:SPLEEN -CREATURE:FISH_SALMON:KIDNEY -CREATURE:FISH_CLOWNFISH:MUSCLE -CREATURE:FISH_CLOWNFISH:EYE -CREATURE:FISH_CLOWNFISH:BRAIN -CREATURE:FISH_CLOWNFISH:LUNG -CREATURE:FISH_CLOWNFISH:HEART -CREATURE:FISH_CLOWNFISH:LIVER -CREATURE:FISH_CLOWNFISH:GUT -CREATURE:FISH_CLOWNFISH:STOMACH -CREATURE:FISH_CLOWNFISH:GIZZARD - CREATURE:FISH_CLOWNFISH:PANCREAS -CREATURE:FISH_CLOWNFISH:SPLEEN -CREATURE:FISH_CLOWNFISH:KIDNEY -CREATURE:FISH_HAGFISH:MUSCLE -CREATURE:FISH_HAGFISH:EYE -CREATURE:FISH_HAGFISH:BRAIN -CREATURE:FISH_HAGFISH:LUNG -CREATURE:FISH_HAGFISH:HEART -CREATURE:FISH_HAGFISH:LIVER -CREATURE:FISH_HAGFISH:GUT -CREATURE:FISH_HAGFISH:STOMACH -CREATURE:FISH_HAGFISH:GIZZARD -CREATURE:FISH_HAGFISH:PANCREAS -CREATURE:FISH_HAGFISH:SPLEEN -CREATURE:FISH_HAGFISH:KIDNEY -"CREATURE:FISH_LAMPREY_BROOK:MUSCLE -CREATURE:FISH_LAMPREY_BROOK:EYE -!CREATURE:FISH_LAMPREY_BROOK:BRAIN - CREATURE:FISH_LAMPREY_BROOK:LUNG -!CREATURE:FISH_LAMPREY_BROOK:HEART -!CREATURE:FISH_LAMPREY_BROOK:LIVER -CREATURE:FISH_LAMPREY_BROOK:GUT -#CREATURE:FISH_LAMPREY_BROOK:STOMACH -#CREATURE:FISH_LAMPREY_BROOK:GIZZARD -$CREATURE:FISH_LAMPREY_BROOK:PANCREAS -"CREATURE:FISH_LAMPREY_BROOK:SPLEEN -"CREATURE:FISH_LAMPREY_BROOK:KIDNEY -CREATURE:FISH_RAY_BAT:MUSCLE -CREATURE:FISH_RAY_BAT:EYE -CREATURE:FISH_RAY_BAT:BRAIN -CREATURE:FISH_RAY_BAT:LUNG -CREATURE:FISH_RAY_BAT:HEART -CREATURE:FISH_RAY_BAT:LIVER -CREATURE:FISH_RAY_BAT:GUT -CREATURE:FISH_RAY_BAT:STOMACH -CREATURE:FISH_RAY_BAT:GIZZARD -CREATURE:FISH_RAY_BAT:PANCREAS -CREATURE:FISH_RAY_BAT:SPLEEN -CREATURE:FISH_RAY_BAT:KIDNEY -"CREATURE:FISH_RAY_THORNBACK:MUSCLE -CREATURE:FISH_RAY_THORNBACK:EYE -!CREATURE:FISH_RAY_THORNBACK:BRAIN - CREATURE:FISH_RAY_THORNBACK:LUNG -!CREATURE:FISH_RAY_THORNBACK:HEART -!CREATURE:FISH_RAY_THORNBACK:LIVER -CREATURE:FISH_RAY_THORNBACK:GUT -#CREATURE:FISH_RAY_THORNBACK:STOMACH -#CREATURE:FISH_RAY_THORNBACK:GIZZARD -$CREATURE:FISH_RAY_THORNBACK:PANCREAS -"CREATURE:FISH_RAY_THORNBACK:SPLEEN -"CREATURE:FISH_RAY_THORNBACK:KIDNEY -$CREATURE:FISH_RATFISH_SPOTTED:MUSCLE -!CREATURE:FISH_RATFISH_SPOTTED:EYE -#CREATURE:FISH_RATFISH_SPOTTED:BRAIN -"CREATURE:FISH_RATFISH_SPOTTED:LUNG -#CREATURE:FISH_RATFISH_SPOTTED:HEART -#CREATURE:FISH_RATFISH_SPOTTED:LIVER -!CREATURE:FISH_RATFISH_SPOTTED:GUT -%CREATURE:FISH_RATFISH_SPOTTED:STOMACH -%CREATURE:FISH_RATFISH_SPOTTED:GIZZARD -&CREATURE:FISH_RATFISH_SPOTTED:PANCREAS -$CREATURE:FISH_RATFISH_SPOTTED:SPLEEN -$CREATURE:FISH_RATFISH_SPOTTED:KIDNEY -CREATURE:FISH_HERRING:MUSCLE -CREATURE:FISH_HERRING:EYE -CREATURE:FISH_HERRING:BRAIN -CREATURE:FISH_HERRING:LUNG -CREATURE:FISH_HERRING:HEART -CREATURE:FISH_HERRING:LIVER -CREATURE:FISH_HERRING:GUT -CREATURE:FISH_HERRING:STOMACH -CREATURE:FISH_HERRING:GIZZARD -CREATURE:FISH_HERRING:PANCREAS -CREATURE:FISH_HERRING:SPLEEN -CREATURE:FISH_HERRING:KIDNEY -CREATURE:FISH_SHAD:MUSCLE -CREATURE:FISH_SHAD:EYE -CREATURE:FISH_SHAD:BRAIN -CREATURE:FISH_SHAD:LUNG -CREATURE:FISH_SHAD:HEART -CREATURE:FISH_SHAD:LIVER -CREATURE:FISH_SHAD:GUT -CREATURE:FISH_SHAD:STOMACH -CREATURE:FISH_SHAD:GIZZARD -CREATURE:FISH_SHAD:PANCREAS -CREATURE:FISH_SHAD:SPLEEN -CREATURE:FISH_SHAD:KIDNEY -CREATURE:FISH_ANCHOVY:MUSCLE -CREATURE:FISH_ANCHOVY:EYE -CREATURE:FISH_ANCHOVY:BRAIN -CREATURE:FISH_ANCHOVY:LUNG -CREATURE:FISH_ANCHOVY:HEART -CREATURE:FISH_ANCHOVY:LIVER -CREATURE:FISH_ANCHOVY:GUT -CREATURE:FISH_ANCHOVY:STOMACH -CREATURE:FISH_ANCHOVY:GIZZARD -CREATURE:FISH_ANCHOVY:PANCREAS -CREATURE:FISH_ANCHOVY:SPLEEN -CREATURE:FISH_ANCHOVY:KIDNEY -$CREATURE:FISH_TROUT_STEELHEAD:MUSCLE -!CREATURE:FISH_TROUT_STEELHEAD:EYE -#CREATURE:FISH_TROUT_STEELHEAD:BRAIN -"CREATURE:FISH_TROUT_STEELHEAD:LUNG -#CREATURE:FISH_TROUT_STEELHEAD:HEART -#CREATURE:FISH_TROUT_STEELHEAD:LIVER -!CREATURE:FISH_TROUT_STEELHEAD:GUT -%CREATURE:FISH_TROUT_STEELHEAD:STOMACH -%CREATURE:FISH_TROUT_STEELHEAD:GIZZARD -&CREATURE:FISH_TROUT_STEELHEAD:PANCREAS -$CREATURE:FISH_TROUT_STEELHEAD:SPLEEN -$CREATURE:FISH_TROUT_STEELHEAD:KIDNEY -CREATURE:FISH_HAKE:MUSCLE -CREATURE:FISH_HAKE:EYE -CREATURE:FISH_HAKE:BRAIN -CREATURE:FISH_HAKE:LUNG -CREATURE:FISH_HAKE:HEART -CREATURE:FISH_HAKE:LIVER -CREATURE:FISH_HAKE:GUT -CREATURE:FISH_HAKE:STOMACH -CREATURE:FISH_HAKE:GIZZARD -CREATURE:FISH_HAKE:PANCREAS -CREATURE:FISH_HAKE:SPLEEN -CREATURE:FISH_HAKE:KIDNEY -CREATURE:FISH_SEAHORSE:MUSCLE -CREATURE:FISH_SEAHORSE:EYE -CREATURE:FISH_SEAHORSE:BRAIN -CREATURE:FISH_SEAHORSE:LUNG -CREATURE:FISH_SEAHORSE:HEART -CREATURE:FISH_SEAHORSE:LIVER -CREATURE:FISH_SEAHORSE:GUT -CREATURE:FISH_SEAHORSE:STOMACH -CREATURE:FISH_SEAHORSE:GIZZARD -CREATURE:FISH_SEAHORSE:PANCREAS -CREATURE:FISH_SEAHORSE:SPLEEN -CREATURE:FISH_SEAHORSE:KIDNEY -CREATURE:FISH_GLASSEYE:MUSCLE -CREATURE:FISH_GLASSEYE:EYE -CREATURE:FISH_GLASSEYE:BRAIN -CREATURE:FISH_GLASSEYE:LUNG -CREATURE:FISH_GLASSEYE:HEART -CREATURE:FISH_GLASSEYE:LIVER -CREATURE:FISH_GLASSEYE:GUT -CREATURE:FISH_GLASSEYE:STOMACH -CREATURE:FISH_GLASSEYE:GIZZARD -CREATURE:FISH_GLASSEYE:PANCREAS -CREATURE:FISH_GLASSEYE:SPLEEN -CREATURE:FISH_GLASSEYE:KIDNEY -)CREATURE:FISH_PUFFER_WHITE_SPOTTED:MUSCLE -&CREATURE:FISH_PUFFER_WHITE_SPOTTED:EYE -(CREATURE:FISH_PUFFER_WHITE_SPOTTED:BRAIN -'CREATURE:FISH_PUFFER_WHITE_SPOTTED:LUNG -(CREATURE:FISH_PUFFER_WHITE_SPOTTED:HEART -(CREATURE:FISH_PUFFER_WHITE_SPOTTED:LIVER -&CREATURE:FISH_PUFFER_WHITE_SPOTTED:GUT -*CREATURE:FISH_PUFFER_WHITE_SPOTTED:STOMACH -*CREATURE:FISH_PUFFER_WHITE_SPOTTED:GIZZARD -+CREATURE:FISH_PUFFER_WHITE_SPOTTED:PANCREAS -)CREATURE:FISH_PUFFER_WHITE_SPOTTED:SPLEEN -)CREATURE:FISH_PUFFER_WHITE_SPOTTED:KIDNEY -CREATURE:FISH_SOLE:MUSCLE -CREATURE:FISH_SOLE:EYE -CREATURE:FISH_SOLE:BRAIN -CREATURE:FISH_SOLE:LUNG -CREATURE:FISH_SOLE:HEART -CREATURE:FISH_SOLE:LIVER -CREATURE:FISH_SOLE:GUT -CREATURE:FISH_SOLE:STOMACH -CREATURE:FISH_SOLE:GIZZARD -CREATURE:FISH_SOLE:PANCREAS -CREATURE:FISH_SOLE:SPLEEN -CREATURE:FISH_SOLE:KIDNEY -CREATURE:FISH_FLOUNDER:MUSCLE -CREATURE:FISH_FLOUNDER:EYE -CREATURE:FISH_FLOUNDER:BRAIN -CREATURE:FISH_FLOUNDER:LUNG -CREATURE:FISH_FLOUNDER:HEART -CREATURE:FISH_FLOUNDER:LIVER -CREATURE:FISH_FLOUNDER:GUT -CREATURE:FISH_FLOUNDER:STOMACH -CREATURE:FISH_FLOUNDER:GIZZARD -CREATURE:FISH_FLOUNDER:PANCREAS -CREATURE:FISH_FLOUNDER:SPLEEN -CREATURE:FISH_FLOUNDER:KIDNEY -CREATURE:FISH_MACKEREL:MUSCLE -CREATURE:FISH_MACKEREL:EYE -CREATURE:FISH_MACKEREL:BRAIN -CREATURE:FISH_MACKEREL:LUNG -CREATURE:FISH_MACKEREL:HEART -CREATURE:FISH_MACKEREL:LIVER -CREATURE:FISH_MACKEREL:GUT -CREATURE:FISH_MACKEREL:STOMACH -CREATURE:FISH_MACKEREL:GIZZARD -CREATURE:FISH_MACKEREL:PANCREAS -CREATURE:FISH_MACKEREL:SPLEEN -CREATURE:FISH_MACKEREL:KIDNEY -$CREATURE:JELLYFISH_SEA_NETTLE:MUSCLE -!CREATURE:JELLYFISH_SEA_NETTLE:EYE -#CREATURE:JELLYFISH_SEA_NETTLE:BRAIN -"CREATURE:JELLYFISH_SEA_NETTLE:LUNG -#CREATURE:JELLYFISH_SEA_NETTLE:HEART -#CREATURE:JELLYFISH_SEA_NETTLE:LIVER -!CREATURE:JELLYFISH_SEA_NETTLE:GUT -%CREATURE:JELLYFISH_SEA_NETTLE:STOMACH -%CREATURE:JELLYFISH_SEA_NETTLE:GIZZARD -&CREATURE:JELLYFISH_SEA_NETTLE:PANCREAS -$CREATURE:JELLYFISH_SEA_NETTLE:SPLEEN -$CREATURE:JELLYFISH_SEA_NETTLE:KIDNEY -CREATURE:SQUID:MUSCLE -CREATURE:SQUID:EYE -CREATURE:SQUID:BRAIN -CREATURE:SQUID:LUNG -CREATURE:SQUID:HEART -CREATURE:SQUID:LIVER -CREATURE:SQUID:GUT -CREATURE:SQUID:STOMACH -CREATURE:SQUID:GIZZARD -CREATURE:SQUID:PANCREAS -CREATURE:SQUID:SPLEEN -CREATURE:SQUID:KIDNEY -CREATURE:SQUID MAN:MUSCLE -CREATURE:SQUID MAN:EYE -CREATURE:SQUID MAN:BRAIN -CREATURE:SQUID MAN:LUNG -CREATURE:SQUID MAN:HEART -CREATURE:SQUID MAN:LIVER -CREATURE:SQUID MAN:GUT -CREATURE:SQUID MAN:STOMACH -CREATURE:SQUID MAN:GIZZARD -CREATURE:SQUID MAN:PANCREAS -CREATURE:SQUID MAN:SPLEEN -CREATURE:SQUID MAN:KIDNEY -CREATURE:GIGANTIC SQUID:MUSCLE -CREATURE:GIGANTIC SQUID:EYE -CREATURE:GIGANTIC SQUID:BRAIN -CREATURE:GIGANTIC SQUID:LUNG -CREATURE:GIGANTIC SQUID:HEART -CREATURE:GIGANTIC SQUID:LIVER -CREATURE:GIGANTIC SQUID:GUT -CREATURE:GIGANTIC SQUID:STOMACH -CREATURE:GIGANTIC SQUID:GIZZARD - CREATURE:GIGANTIC SQUID:PANCREAS -CREATURE:GIGANTIC SQUID:SPLEEN -CREATURE:GIGANTIC SQUID:KIDNEY -CREATURE:FISH_LUNGFISH:MUSCLE -CREATURE:FISH_LUNGFISH:EYE -CREATURE:FISH_LUNGFISH:BRAIN -CREATURE:FISH_LUNGFISH:LUNG -CREATURE:FISH_LUNGFISH:HEART -CREATURE:FISH_LUNGFISH:LIVER -CREATURE:FISH_LUNGFISH:GUT -CREATURE:FISH_LUNGFISH:STOMACH -CREATURE:FISH_LUNGFISH:GIZZARD -CREATURE:FISH_LUNGFISH:PANCREAS -CREATURE:FISH_LUNGFISH:SPLEEN -CREATURE:FISH_LUNGFISH:KIDNEY - CREATURE:FISH_LOACH_CLOWN:MUSCLE -CREATURE:FISH_LOACH_CLOWN:EYE -CREATURE:FISH_LOACH_CLOWN:BRAIN -CREATURE:FISH_LOACH_CLOWN:LUNG -CREATURE:FISH_LOACH_CLOWN:HEART -CREATURE:FISH_LOACH_CLOWN:LIVER -CREATURE:FISH_LOACH_CLOWN:GUT -!CREATURE:FISH_LOACH_CLOWN:STOMACH -!CREATURE:FISH_LOACH_CLOWN:GIZZARD -"CREATURE:FISH_LOACH_CLOWN:PANCREAS - CREATURE:FISH_LOACH_CLOWN:SPLEEN - CREATURE:FISH_LOACH_CLOWN:KIDNEY -#CREATURE:FISH_BULLHEAD_BROWN:MUSCLE - CREATURE:FISH_BULLHEAD_BROWN:EYE -"CREATURE:FISH_BULLHEAD_BROWN:BRAIN -!CREATURE:FISH_BULLHEAD_BROWN:LUNG -"CREATURE:FISH_BULLHEAD_BROWN:HEART -"CREATURE:FISH_BULLHEAD_BROWN:LIVER - CREATURE:FISH_BULLHEAD_BROWN:GUT -$CREATURE:FISH_BULLHEAD_BROWN:STOMACH -$CREATURE:FISH_BULLHEAD_BROWN:GIZZARD -%CREATURE:FISH_BULLHEAD_BROWN:PANCREAS -#CREATURE:FISH_BULLHEAD_BROWN:SPLEEN -#CREATURE:FISH_BULLHEAD_BROWN:KIDNEY -$CREATURE:FISH_BULLHEAD_YELLOW:MUSCLE -!CREATURE:FISH_BULLHEAD_YELLOW:EYE -#CREATURE:FISH_BULLHEAD_YELLOW:BRAIN -"CREATURE:FISH_BULLHEAD_YELLOW:LUNG -#CREATURE:FISH_BULLHEAD_YELLOW:HEART -#CREATURE:FISH_BULLHEAD_YELLOW:LIVER -!CREATURE:FISH_BULLHEAD_YELLOW:GUT -%CREATURE:FISH_BULLHEAD_YELLOW:STOMACH -%CREATURE:FISH_BULLHEAD_YELLOW:GIZZARD -&CREATURE:FISH_BULLHEAD_YELLOW:PANCREAS -$CREATURE:FISH_BULLHEAD_YELLOW:SPLEEN -$CREATURE:FISH_BULLHEAD_YELLOW:KIDNEY -#CREATURE:FISH_BULLHEAD_BLACK:MUSCLE - CREATURE:FISH_BULLHEAD_BLACK:EYE -"CREATURE:FISH_BULLHEAD_BLACK:BRAIN -!CREATURE:FISH_BULLHEAD_BLACK:LUNG -"CREATURE:FISH_BULLHEAD_BLACK:HEART -"CREATURE:FISH_BULLHEAD_BLACK:LIVER - CREATURE:FISH_BULLHEAD_BLACK:GUT -$CREATURE:FISH_BULLHEAD_BLACK:STOMACH -$CREATURE:FISH_BULLHEAD_BLACK:GIZZARD -%CREATURE:FISH_BULLHEAD_BLACK:PANCREAS -#CREATURE:FISH_BULLHEAD_BLACK:SPLEEN -#CREATURE:FISH_BULLHEAD_BLACK:KIDNEY -%CREATURE:FISH_KNIFEFISH_BANDED:MUSCLE -"CREATURE:FISH_KNIFEFISH_BANDED:EYE -$CREATURE:FISH_KNIFEFISH_BANDED:BRAIN -#CREATURE:FISH_KNIFEFISH_BANDED:LUNG -$CREATURE:FISH_KNIFEFISH_BANDED:HEART -$CREATURE:FISH_KNIFEFISH_BANDED:LIVER -"CREATURE:FISH_KNIFEFISH_BANDED:GUT -&CREATURE:FISH_KNIFEFISH_BANDED:STOMACH -&CREATURE:FISH_KNIFEFISH_BANDED:GIZZARD -'CREATURE:FISH_KNIFEFISH_BANDED:PANCREAS -%CREATURE:FISH_KNIFEFISH_BANDED:SPLEEN -%CREATURE:FISH_KNIFEFISH_BANDED:KIDNEY -CREATURE:FISH_CHAR:MUSCLE -CREATURE:FISH_CHAR:EYE -CREATURE:FISH_CHAR:BRAIN -CREATURE:FISH_CHAR:LUNG -CREATURE:FISH_CHAR:HEART -CREATURE:FISH_CHAR:LIVER -CREATURE:FISH_CHAR:GUT -CREATURE:FISH_CHAR:STOMACH -CREATURE:FISH_CHAR:GIZZARD -CREATURE:FISH_CHAR:PANCREAS -CREATURE:FISH_CHAR:SPLEEN -CREATURE:FISH_CHAR:KIDNEY -"CREATURE:FISH_TROUT_RAINBOW:MUSCLE -CREATURE:FISH_TROUT_RAINBOW:EYE -!CREATURE:FISH_TROUT_RAINBOW:BRAIN - CREATURE:FISH_TROUT_RAINBOW:LUNG -!CREATURE:FISH_TROUT_RAINBOW:HEART -!CREATURE:FISH_TROUT_RAINBOW:LIVER -CREATURE:FISH_TROUT_RAINBOW:GUT -#CREATURE:FISH_TROUT_RAINBOW:STOMACH -#CREATURE:FISH_TROUT_RAINBOW:GIZZARD -$CREATURE:FISH_TROUT_RAINBOW:PANCREAS -"CREATURE:FISH_TROUT_RAINBOW:SPLEEN -"CREATURE:FISH_TROUT_RAINBOW:KIDNEY -"CREATURE:FISH_MOLLY_SAILFIN:MUSCLE -CREATURE:FISH_MOLLY_SAILFIN:EYE -!CREATURE:FISH_MOLLY_SAILFIN:BRAIN - CREATURE:FISH_MOLLY_SAILFIN:LUNG -!CREATURE:FISH_MOLLY_SAILFIN:HEART -!CREATURE:FISH_MOLLY_SAILFIN:LIVER -CREATURE:FISH_MOLLY_SAILFIN:GUT -#CREATURE:FISH_MOLLY_SAILFIN:STOMACH -#CREATURE:FISH_MOLLY_SAILFIN:GIZZARD -$CREATURE:FISH_MOLLY_SAILFIN:PANCREAS -"CREATURE:FISH_MOLLY_SAILFIN:SPLEEN -"CREATURE:FISH_MOLLY_SAILFIN:KIDNEY -CREATURE:FISH_GUPPY:MUSCLE -CREATURE:FISH_GUPPY:EYE -CREATURE:FISH_GUPPY:BRAIN -CREATURE:FISH_GUPPY:LUNG -CREATURE:FISH_GUPPY:HEART -CREATURE:FISH_GUPPY:LIVER -CREATURE:FISH_GUPPY:GUT -CREATURE:FISH_GUPPY:STOMACH -CREATURE:FISH_GUPPY:GIZZARD -CREATURE:FISH_GUPPY:PANCREAS -CREATURE:FISH_GUPPY:SPLEEN -CREATURE:FISH_GUPPY:KIDNEY -CREATURE:FISH_PERCH:MUSCLE -CREATURE:FISH_PERCH:EYE -CREATURE:FISH_PERCH:BRAIN -CREATURE:FISH_PERCH:LUNG -CREATURE:FISH_PERCH:HEART -CREATURE:FISH_PERCH:LIVER -CREATURE:FISH_PERCH:GUT -CREATURE:FISH_PERCH:STOMACH -CREATURE:FISH_PERCH:GIZZARD -CREATURE:FISH_PERCH:PANCREAS -CREATURE:FISH_PERCH:SPLEEN -CREATURE:FISH_PERCH:KIDNEY -CREATURE:DWARF:MUSCLE -CREATURE:DWARF:EYE -CREATURE:DWARF:BRAIN -CREATURE:DWARF:LUNG -CREATURE:DWARF:HEART -CREATURE:DWARF:LIVER -CREATURE:DWARF:GUT -CREATURE:DWARF:STOMACH -CREATURE:DWARF:GIZZARD -CREATURE:DWARF:PANCREAS -CREATURE:DWARF:SPLEEN -CREATURE:DWARF:KIDNEY -CREATURE:HUMAN:MUSCLE -CREATURE:HUMAN:EYE -CREATURE:HUMAN:BRAIN -CREATURE:HUMAN:LUNG -CREATURE:HUMAN:HEART -CREATURE:HUMAN:LIVER -CREATURE:HUMAN:GUT -CREATURE:HUMAN:STOMACH -CREATURE:HUMAN:GIZZARD -CREATURE:HUMAN:PANCREAS -CREATURE:HUMAN:SPLEEN -CREATURE:HUMAN:KIDNEY -CREATURE:ELF:MUSCLE -CREATURE:ELF:EYE -CREATURE:ELF:BRAIN -CREATURE:ELF:LUNG -CREATURE:ELF:HEART -CREATURE:ELF:LIVER -CREATURE:ELF:GUT -CREATURE:ELF:STOMACH -CREATURE:ELF:GIZZARD -CREATURE:ELF:PANCREAS -CREATURE:ELF:SPLEEN -CREATURE:ELF:KIDNEY -CREATURE:GOBLIN:MUSCLE -CREATURE:GOBLIN:EYE -CREATURE:GOBLIN:BRAIN -CREATURE:GOBLIN:LUNG -CREATURE:GOBLIN:HEART -CREATURE:GOBLIN:LIVER -CREATURE:GOBLIN:GUT -CREATURE:GOBLIN:STOMACH -CREATURE:GOBLIN:GIZZARD -CREATURE:GOBLIN:PANCREAS -CREATURE:GOBLIN:SPLEEN -CREATURE:GOBLIN:KIDNEY -CREATURE:KOBOLD:MUSCLE -CREATURE:KOBOLD:EYE -CREATURE:KOBOLD:BRAIN -CREATURE:KOBOLD:LUNG -CREATURE:KOBOLD:HEART -CREATURE:KOBOLD:LIVER -CREATURE:KOBOLD:GUT -CREATURE:KOBOLD:STOMACH -CREATURE:KOBOLD:GIZZARD -CREATURE:KOBOLD:PANCREAS -CREATURE:KOBOLD:SPLEEN -CREATURE:KOBOLD:KIDNEY -CREATURE:GREMLIN:MUSCLE -CREATURE:GREMLIN:EYE -CREATURE:GREMLIN:BRAIN -CREATURE:GREMLIN:LUNG -CREATURE:GREMLIN:HEART -CREATURE:GREMLIN:LIVER -CREATURE:GREMLIN:GUT -CREATURE:GREMLIN:STOMACH -CREATURE:GREMLIN:GIZZARD -CREATURE:GREMLIN:PANCREAS -CREATURE:GREMLIN:SPLEEN -CREATURE:GREMLIN:KIDNEY -CREATURE:TROLL:MUSCLE -CREATURE:TROLL:EYE -CREATURE:TROLL:BRAIN -CREATURE:TROLL:LUNG -CREATURE:TROLL:HEART -CREATURE:TROLL:LIVER -CREATURE:TROLL:GUT -CREATURE:TROLL:STOMACH -CREATURE:TROLL:GIZZARD -CREATURE:TROLL:PANCREAS -CREATURE:TROLL:SPLEEN -CREATURE:TROLL:KIDNEY -CREATURE:OGRE:MUSCLE -CREATURE:OGRE:EYE -CREATURE:OGRE:BRAIN -CREATURE:OGRE:LUNG -CREATURE:OGRE:HEART -CREATURE:OGRE:LIVER -CREATURE:OGRE:GUT -CREATURE:OGRE:STOMACH -CREATURE:OGRE:GIZZARD -CREATURE:OGRE:PANCREAS -CREATURE:OGRE:SPLEEN -CREATURE:OGRE:KIDNEY -CREATURE:UNICORN:MUSCLE -CREATURE:UNICORN:EYE -CREATURE:UNICORN:BRAIN -CREATURE:UNICORN:LUNG -CREATURE:UNICORN:HEART -CREATURE:UNICORN:LIVER -CREATURE:UNICORN:GUT -CREATURE:UNICORN:STOMACH -CREATURE:UNICORN:GIZZARD -CREATURE:UNICORN:PANCREAS -CREATURE:UNICORN:SPLEEN -CREATURE:UNICORN:KIDNEY -CREATURE:DRAGON:MUSCLE -CREATURE:DRAGON:EYE -CREATURE:DRAGON:BRAIN -CREATURE:DRAGON:LUNG -CREATURE:DRAGON:HEART -CREATURE:DRAGON:LIVER -CREATURE:DRAGON:GUT -CREATURE:DRAGON:STOMACH -CREATURE:DRAGON:GIZZARD -CREATURE:DRAGON:PANCREAS -CREATURE:DRAGON:SPLEEN -CREATURE:DRAGON:KIDNEY -CREATURE:SATYR:MUSCLE -CREATURE:SATYR:EYE -CREATURE:SATYR:BRAIN -CREATURE:SATYR:LUNG -CREATURE:SATYR:HEART -CREATURE:SATYR:LIVER -CREATURE:SATYR:GUT -CREATURE:SATYR:STOMACH -CREATURE:SATYR:GIZZARD -CREATURE:SATYR:PANCREAS -CREATURE:SATYR:SPLEEN -CREATURE:SATYR:KIDNEY -CREATURE:GIANT:MUSCLE -CREATURE:GIANT:EYE -CREATURE:GIANT:BRAIN -CREATURE:GIANT:LUNG -CREATURE:GIANT:HEART -CREATURE:GIANT:LIVER -CREATURE:GIANT:GUT -CREATURE:GIANT:STOMACH -CREATURE:GIANT:GIZZARD -CREATURE:GIANT:PANCREAS -CREATURE:GIANT:SPLEEN -CREATURE:GIANT:KIDNEY -CREATURE:CYCLOPS:MUSCLE -CREATURE:CYCLOPS:EYE -CREATURE:CYCLOPS:BRAIN -CREATURE:CYCLOPS:LUNG -CREATURE:CYCLOPS:HEART -CREATURE:CYCLOPS:LIVER -CREATURE:CYCLOPS:GUT -CREATURE:CYCLOPS:STOMACH -CREATURE:CYCLOPS:GIZZARD -CREATURE:CYCLOPS:PANCREAS -CREATURE:CYCLOPS:SPLEEN -CREATURE:CYCLOPS:KIDNEY -CREATURE:ETTIN:MUSCLE -CREATURE:ETTIN:EYE -CREATURE:ETTIN:BRAIN -CREATURE:ETTIN:LUNG -CREATURE:ETTIN:HEART -CREATURE:ETTIN:LIVER -CREATURE:ETTIN:GUT -CREATURE:ETTIN:STOMACH -CREATURE:ETTIN:GIZZARD -CREATURE:ETTIN:PANCREAS -CREATURE:ETTIN:SPLEEN -CREATURE:ETTIN:KIDNEY -CREATURE:MINOTAUR:MUSCLE -CREATURE:MINOTAUR:EYE -CREATURE:MINOTAUR:BRAIN -CREATURE:MINOTAUR:LUNG -CREATURE:MINOTAUR:HEART -CREATURE:MINOTAUR:LIVER -CREATURE:MINOTAUR:GUT -CREATURE:MINOTAUR:STOMACH -CREATURE:MINOTAUR:GIZZARD -CREATURE:MINOTAUR:PANCREAS -CREATURE:MINOTAUR:SPLEEN -CREATURE:MINOTAUR:KIDNEY -CREATURE:YETI:MUSCLE -CREATURE:YETI:EYE -CREATURE:YETI:BRAIN -CREATURE:YETI:LUNG -CREATURE:YETI:HEART -CREATURE:YETI:LIVER -CREATURE:YETI:GUT -CREATURE:YETI:STOMACH -CREATURE:YETI:GIZZARD -CREATURE:YETI:PANCREAS -CREATURE:YETI:SPLEEN -CREATURE:YETI:KIDNEY -CREATURE:SASQUATCH:MUSCLE -CREATURE:SASQUATCH:EYE -CREATURE:SASQUATCH:BRAIN -CREATURE:SASQUATCH:LUNG -CREATURE:SASQUATCH:HEART -CREATURE:SASQUATCH:LIVER -CREATURE:SASQUATCH:GUT -CREATURE:SASQUATCH:STOMACH -CREATURE:SASQUATCH:GIZZARD -CREATURE:SASQUATCH:PANCREAS -CREATURE:SASQUATCH:SPLEEN -CREATURE:SASQUATCH:KIDNEY -CREATURE:BLIZZARD_MAN:MUSCLE -CREATURE:BLIZZARD_MAN:EYE -CREATURE:BLIZZARD_MAN:BRAIN -CREATURE:BLIZZARD_MAN:LUNG -CREATURE:BLIZZARD_MAN:HEART -CREATURE:BLIZZARD_MAN:LIVER -CREATURE:BLIZZARD_MAN:GUT -CREATURE:BLIZZARD_MAN:STOMACH -CREATURE:BLIZZARD_MAN:GIZZARD -CREATURE:BLIZZARD_MAN:PANCREAS -CREATURE:BLIZZARD_MAN:SPLEEN -CREATURE:BLIZZARD_MAN:KIDNEY -CREATURE:WOLF_ICE:MUSCLE -CREATURE:WOLF_ICE:EYE -CREATURE:WOLF_ICE:BRAIN -CREATURE:WOLF_ICE:LUNG -CREATURE:WOLF_ICE:HEART -CREATURE:WOLF_ICE:LIVER -CREATURE:WOLF_ICE:GUT -CREATURE:WOLF_ICE:STOMACH -CREATURE:WOLF_ICE:GIZZARD -CREATURE:WOLF_ICE:PANCREAS -CREATURE:WOLF_ICE:SPLEEN -CREATURE:WOLF_ICE:KIDNEY -CREATURE:FAIRY:MUSCLE -CREATURE:FAIRY:EYE -CREATURE:FAIRY:BRAIN -CREATURE:FAIRY:LUNG -CREATURE:FAIRY:HEART -CREATURE:FAIRY:LIVER -CREATURE:FAIRY:GUT -CREATURE:FAIRY:STOMACH -CREATURE:FAIRY:GIZZARD -CREATURE:FAIRY:PANCREAS -CREATURE:FAIRY:SPLEEN -CREATURE:FAIRY:KIDNEY -CREATURE:PIXIE:MUSCLE -CREATURE:PIXIE:EYE -CREATURE:PIXIE:BRAIN -CREATURE:PIXIE:LUNG -CREATURE:PIXIE:HEART -CREATURE:PIXIE:LIVER -CREATURE:PIXIE:GUT -CREATURE:PIXIE:STOMACH -CREATURE:PIXIE:GIZZARD -CREATURE:PIXIE:PANCREAS -CREATURE:PIXIE:SPLEEN -CREATURE:PIXIE:KIDNEY -CREATURE:BEAK_DOG:MUSCLE -CREATURE:BEAK_DOG:EYE -CREATURE:BEAK_DOG:BRAIN -CREATURE:BEAK_DOG:LUNG -CREATURE:BEAK_DOG:HEART -CREATURE:BEAK_DOG:LIVER -CREATURE:BEAK_DOG:GUT -CREATURE:BEAK_DOG:STOMACH -CREATURE:BEAK_DOG:GIZZARD -CREATURE:BEAK_DOG:PANCREAS -CREATURE:BEAK_DOG:SPLEEN -CREATURE:BEAK_DOG:KIDNEY -CREATURE:GRIMELING:MUSCLE -CREATURE:GRIMELING:EYE -CREATURE:GRIMELING:BRAIN -CREATURE:GRIMELING:LUNG -CREATURE:GRIMELING:HEART -CREATURE:GRIMELING:LIVER -CREATURE:GRIMELING:GUT -CREATURE:GRIMELING:STOMACH -CREATURE:GRIMELING:GIZZARD -CREATURE:GRIMELING:PANCREAS -CREATURE:GRIMELING:SPLEEN -CREATURE:GRIMELING:KIDNEY -CREATURE:BLENDEC_FOUL:MUSCLE -CREATURE:BLENDEC_FOUL:EYE -CREATURE:BLENDEC_FOUL:BRAIN -CREATURE:BLENDEC_FOUL:LUNG -CREATURE:BLENDEC_FOUL:HEART -CREATURE:BLENDEC_FOUL:LIVER -CREATURE:BLENDEC_FOUL:GUT -CREATURE:BLENDEC_FOUL:STOMACH -CREATURE:BLENDEC_FOUL:GIZZARD -CREATURE:BLENDEC_FOUL:PANCREAS -CREATURE:BLENDEC_FOUL:SPLEEN -CREATURE:BLENDEC_FOUL:KIDNEY -CREATURE:STRANGLER:MUSCLE -CREATURE:STRANGLER:EYE -CREATURE:STRANGLER:BRAIN -CREATURE:STRANGLER:LUNG -CREATURE:STRANGLER:HEART -CREATURE:STRANGLER:LIVER -CREATURE:STRANGLER:GUT -CREATURE:STRANGLER:STOMACH -CREATURE:STRANGLER:GIZZARD -CREATURE:STRANGLER:PANCREAS -CREATURE:STRANGLER:SPLEEN -CREATURE:STRANGLER:KIDNEY -CREATURE:NIGHTWING:MUSCLE -CREATURE:NIGHTWING:EYE -CREATURE:NIGHTWING:BRAIN -CREATURE:NIGHTWING:LUNG -CREATURE:NIGHTWING:HEART -CREATURE:NIGHTWING:LIVER -CREATURE:NIGHTWING:GUT -CREATURE:NIGHTWING:STOMACH -CREATURE:NIGHTWING:GIZZARD -CREATURE:NIGHTWING:PANCREAS -CREATURE:NIGHTWING:SPLEEN -CREATURE:NIGHTWING:KIDNEY -CREATURE:HARPY:MUSCLE -CREATURE:HARPY:EYE -CREATURE:HARPY:BRAIN -CREATURE:HARPY:LUNG -CREATURE:HARPY:HEART -CREATURE:HARPY:LIVER -CREATURE:HARPY:GUT -CREATURE:HARPY:STOMACH -CREATURE:HARPY:GIZZARD -CREATURE:HARPY:PANCREAS -CREATURE:HARPY:SPLEEN -CREATURE:HARPY:KIDNEY -CREATURE:HYDRA:MUSCLE -CREATURE:HYDRA:EYE -CREATURE:HYDRA:BRAIN -CREATURE:HYDRA:LUNG -CREATURE:HYDRA:HEART -CREATURE:HYDRA:LIVER -CREATURE:HYDRA:GUT -CREATURE:HYDRA:STOMACH -CREATURE:HYDRA:GIZZARD -CREATURE:HYDRA:PANCREAS -CREATURE:HYDRA:SPLEEN -CREATURE:HYDRA:KIDNEY -CREATURE:MERPERSON:MUSCLE -CREATURE:MERPERSON:EYE -CREATURE:MERPERSON:BRAIN -CREATURE:MERPERSON:LUNG -CREATURE:MERPERSON:HEART -CREATURE:MERPERSON:LIVER -CREATURE:MERPERSON:GUT -CREATURE:MERPERSON:STOMACH -CREATURE:MERPERSON:GIZZARD -CREATURE:MERPERSON:PANCREAS -CREATURE:MERPERSON:SPLEEN -CREATURE:MERPERSON:KIDNEY -CREATURE:SEA_SERPENT:MUSCLE -CREATURE:SEA_SERPENT:EYE -CREATURE:SEA_SERPENT:BRAIN -CREATURE:SEA_SERPENT:LUNG -CREATURE:SEA_SERPENT:HEART -CREATURE:SEA_SERPENT:LIVER -CREATURE:SEA_SERPENT:GUT -CREATURE:SEA_SERPENT:STOMACH -CREATURE:SEA_SERPENT:GIZZARD -CREATURE:SEA_SERPENT:PANCREAS -CREATURE:SEA_SERPENT:SPLEEN -CREATURE:SEA_SERPENT:KIDNEY -CREATURE:SEA_MONSTER:MUSCLE -CREATURE:SEA_MONSTER:EYE -CREATURE:SEA_MONSTER:BRAIN -CREATURE:SEA_MONSTER:LUNG -CREATURE:SEA_MONSTER:HEART -CREATURE:SEA_MONSTER:LIVER -CREATURE:SEA_MONSTER:GUT -CREATURE:SEA_MONSTER:STOMACH -CREATURE:SEA_MONSTER:GIZZARD -CREATURE:SEA_MONSTER:PANCREAS -CREATURE:SEA_MONSTER:SPLEEN -CREATURE:SEA_MONSTER:KIDNEY -CREATURE:BIRD_ROC:MUSCLE -CREATURE:BIRD_ROC:EYE -CREATURE:BIRD_ROC:BRAIN -CREATURE:BIRD_ROC:LUNG -CREATURE:BIRD_ROC:HEART -CREATURE:BIRD_ROC:LIVER -CREATURE:BIRD_ROC:GUT -CREATURE:BIRD_ROC:STOMACH -CREATURE:BIRD_ROC:GIZZARD -CREATURE:BIRD_ROC:PANCREAS -CREATURE:BIRD_ROC:SPLEEN -CREATURE:BIRD_ROC:KIDNEY -CREATURE:CROCODILE_CAVE:MUSCLE -CREATURE:CROCODILE_CAVE:EYE -CREATURE:CROCODILE_CAVE:BRAIN -CREATURE:CROCODILE_CAVE:LUNG -CREATURE:CROCODILE_CAVE:HEART -CREATURE:CROCODILE_CAVE:LIVER -CREATURE:CROCODILE_CAVE:GUT -CREATURE:CROCODILE_CAVE:STOMACH -CREATURE:CROCODILE_CAVE:GIZZARD - CREATURE:CROCODILE_CAVE:PANCREAS -CREATURE:CROCODILE_CAVE:SPLEEN -CREATURE:CROCODILE_CAVE:KIDNEY -CREATURE:TOAD_GIANT_CAVE:MUSCLE -CREATURE:TOAD_GIANT_CAVE:EYE -CREATURE:TOAD_GIANT_CAVE:BRAIN -CREATURE:TOAD_GIANT_CAVE:LUNG -CREATURE:TOAD_GIANT_CAVE:HEART -CREATURE:TOAD_GIANT_CAVE:LIVER -CREATURE:TOAD_GIANT_CAVE:GUT - CREATURE:TOAD_GIANT_CAVE:STOMACH - CREATURE:TOAD_GIANT_CAVE:GIZZARD -!CREATURE:TOAD_GIANT_CAVE:PANCREAS -CREATURE:TOAD_GIANT_CAVE:SPLEEN -CREATURE:TOAD_GIANT_CAVE:KIDNEY -CREATURE:OLM_GIANT:MUSCLE -CREATURE:OLM_GIANT:EYE -CREATURE:OLM_GIANT:BRAIN -CREATURE:OLM_GIANT:LUNG -CREATURE:OLM_GIANT:HEART -CREATURE:OLM_GIANT:LIVER -CREATURE:OLM_GIANT:GUT -CREATURE:OLM_GIANT:STOMACH -CREATURE:OLM_GIANT:GIZZARD -CREATURE:OLM_GIANT:PANCREAS -CREATURE:OLM_GIANT:SPLEEN -CREATURE:OLM_GIANT:KIDNEY -CREATURE:BAT_GIANT:MUSCLE -CREATURE:BAT_GIANT:EYE -CREATURE:BAT_GIANT:BRAIN -CREATURE:BAT_GIANT:LUNG -CREATURE:BAT_GIANT:HEART -CREATURE:BAT_GIANT:LIVER -CREATURE:BAT_GIANT:GUT -CREATURE:BAT_GIANT:STOMACH -CREATURE:BAT_GIANT:GIZZARD -CREATURE:BAT_GIANT:PANCREAS -CREATURE:BAT_GIANT:SPLEEN -CREATURE:BAT_GIANT:KIDNEY -CREATURE:RAT_GIANT:MUSCLE -CREATURE:RAT_GIANT:EYE -CREATURE:RAT_GIANT:BRAIN -CREATURE:RAT_GIANT:LUNG -CREATURE:RAT_GIANT:HEART -CREATURE:RAT_GIANT:LIVER -CREATURE:RAT_GIANT:GUT -CREATURE:RAT_GIANT:STOMACH -CREATURE:RAT_GIANT:GIZZARD -CREATURE:RAT_GIANT:PANCREAS -CREATURE:RAT_GIANT:SPLEEN -CREATURE:RAT_GIANT:KIDNEY -CREATURE:RAT_LARGE:MUSCLE -CREATURE:RAT_LARGE:EYE -CREATURE:RAT_LARGE:BRAIN -CREATURE:RAT_LARGE:LUNG -CREATURE:RAT_LARGE:HEART -CREATURE:RAT_LARGE:LIVER -CREATURE:RAT_LARGE:GUT -CREATURE:RAT_LARGE:STOMACH -CREATURE:RAT_LARGE:GIZZARD -CREATURE:RAT_LARGE:PANCREAS -CREATURE:RAT_LARGE:SPLEEN -CREATURE:RAT_LARGE:KIDNEY -CREATURE:MOLE_DOG_NAKED:MUSCLE -CREATURE:MOLE_DOG_NAKED:EYE -CREATURE:MOLE_DOG_NAKED:BRAIN -CREATURE:MOLE_DOG_NAKED:LUNG -CREATURE:MOLE_DOG_NAKED:HEART -CREATURE:MOLE_DOG_NAKED:LIVER -CREATURE:MOLE_DOG_NAKED:GUT -CREATURE:MOLE_DOG_NAKED:STOMACH -CREATURE:MOLE_DOG_NAKED:GIZZARD - CREATURE:MOLE_DOG_NAKED:PANCREAS -CREATURE:MOLE_DOG_NAKED:SPLEEN -CREATURE:MOLE_DOG_NAKED:KIDNEY -CREATURE:TROGLODYTE:MUSCLE -CREATURE:TROGLODYTE:EYE -CREATURE:TROGLODYTE:BRAIN -CREATURE:TROGLODYTE:LUNG -CREATURE:TROGLODYTE:HEART -CREATURE:TROGLODYTE:LIVER -CREATURE:TROGLODYTE:GUT -CREATURE:TROGLODYTE:STOMACH -CREATURE:TROGLODYTE:GIZZARD -CREATURE:TROGLODYTE:PANCREAS -CREATURE:TROGLODYTE:SPLEEN -CREATURE:TROGLODYTE:KIDNEY -CREATURE:MOLE_GIANT:MUSCLE -CREATURE:MOLE_GIANT:EYE -CREATURE:MOLE_GIANT:BRAIN -CREATURE:MOLE_GIANT:LUNG -CREATURE:MOLE_GIANT:HEART -CREATURE:MOLE_GIANT:LIVER -CREATURE:MOLE_GIANT:GUT -CREATURE:MOLE_GIANT:STOMACH -CREATURE:MOLE_GIANT:GIZZARD -CREATURE:MOLE_GIANT:PANCREAS -CREATURE:MOLE_GIANT:SPLEEN -CREATURE:MOLE_GIANT:KIDNEY -CREATURE:IMP_FIRE:MUSCLE -CREATURE:IMP_FIRE:EYE -CREATURE:IMP_FIRE:BRAIN -CREATURE:IMP_FIRE:LUNG -CREATURE:IMP_FIRE:HEART -CREATURE:IMP_FIRE:LIVER -CREATURE:IMP_FIRE:GUT -CREATURE:IMP_FIRE:STOMACH -CREATURE:IMP_FIRE:GIZZARD -CREATURE:IMP_FIRE:PANCREAS -CREATURE:IMP_FIRE:SPLEEN -CREATURE:IMP_FIRE:KIDNEY -!CREATURE:SPIDER_CAVE_GIANT:MUSCLE -CREATURE:SPIDER_CAVE_GIANT:EYE - CREATURE:SPIDER_CAVE_GIANT:BRAIN -CREATURE:SPIDER_CAVE_GIANT:LUNG - CREATURE:SPIDER_CAVE_GIANT:HEART - CREATURE:SPIDER_CAVE_GIANT:LIVER -CREATURE:SPIDER_CAVE_GIANT:GUT -"CREATURE:SPIDER_CAVE_GIANT:STOMACH -"CREATURE:SPIDER_CAVE_GIANT:GIZZARD -#CREATURE:SPIDER_CAVE_GIANT:PANCREAS -!CREATURE:SPIDER_CAVE_GIANT:SPLEEN -!CREATURE:SPIDER_CAVE_GIANT:KIDNEY -CREATURE:SPIDER_CAVE:MUSCLE -CREATURE:SPIDER_CAVE:EYE -CREATURE:SPIDER_CAVE:BRAIN -CREATURE:SPIDER_CAVE:LUNG -CREATURE:SPIDER_CAVE:HEART -CREATURE:SPIDER_CAVE:LIVER -CREATURE:SPIDER_CAVE:GUT -CREATURE:SPIDER_CAVE:STOMACH -CREATURE:SPIDER_CAVE:GIZZARD -CREATURE:SPIDER_CAVE:PANCREAS -CREATURE:SPIDER_CAVE:SPLEEN -CREATURE:SPIDER_CAVE:KIDNEY -CREATURE:FISH_CAVE:MUSCLE -CREATURE:FISH_CAVE:BRAIN -CREATURE:FISH_CAVE:LUNG -CREATURE:FISH_CAVE:HEART -CREATURE:FISH_CAVE:LIVER -CREATURE:FISH_CAVE:GUT -CREATURE:FISH_CAVE:STOMACH -CREATURE:FISH_CAVE:GIZZARD -CREATURE:FISH_CAVE:PANCREAS -CREATURE:FISH_CAVE:SPLEEN -CREATURE:FISH_CAVE:KIDNEY -CREATURE:CAVE_FISH_MAN:MUSCLE -CREATURE:CAVE_FISH_MAN:BRAIN -CREATURE:CAVE_FISH_MAN:LUNG -CREATURE:CAVE_FISH_MAN:HEART -CREATURE:CAVE_FISH_MAN:LIVER -CREATURE:CAVE_FISH_MAN:GUT -CREATURE:CAVE_FISH_MAN:STOMACH -CREATURE:CAVE_FISH_MAN:GIZZARD -CREATURE:CAVE_FISH_MAN:PANCREAS -CREATURE:CAVE_FISH_MAN:SPLEEN -CREATURE:CAVE_FISH_MAN:KIDNEY -CREATURE:LOBSTER_CAVE:MUSCLE -CREATURE:LOBSTER_CAVE:EYE -CREATURE:LOBSTER_CAVE:BRAIN -CREATURE:LOBSTER_CAVE:LUNG -CREATURE:LOBSTER_CAVE:HEART -CREATURE:LOBSTER_CAVE:LIVER -CREATURE:LOBSTER_CAVE:GUT -CREATURE:LOBSTER_CAVE:STOMACH -CREATURE:LOBSTER_CAVE:GIZZARD -CREATURE:LOBSTER_CAVE:PANCREAS -CREATURE:LOBSTER_CAVE:SPLEEN -CREATURE:LOBSTER_CAVE:KIDNEY -CREATURE:OLM:MUSCLE -CREATURE:OLM:EYE -CREATURE:OLM:BRAIN -CREATURE:OLM:LUNG -CREATURE:OLM:HEART -CREATURE:OLM:LIVER -CREATURE:OLM:GUT -CREATURE:OLM:STOMACH -CREATURE:OLM:GIZZARD -CREATURE:OLM:PANCREAS -CREATURE:OLM:SPLEEN -CREATURE:OLM:KIDNEY -CREATURE:OLM_MAN:MUSCLE -CREATURE:OLM_MAN:EYE -CREATURE:OLM_MAN:BRAIN -CREATURE:OLM_MAN:LUNG -CREATURE:OLM_MAN:HEART -CREATURE:OLM_MAN:LIVER -CREATURE:OLM_MAN:GUT -CREATURE:OLM_MAN:STOMACH -CREATURE:OLM_MAN:GIZZARD -CREATURE:OLM_MAN:PANCREAS -CREATURE:OLM_MAN:SPLEEN -CREATURE:OLM_MAN:KIDNEY -CREATURE:BAT:MUSCLE -CREATURE:BAT:EYE -CREATURE:BAT:BRAIN -CREATURE:BAT:LUNG -CREATURE:BAT:HEART -CREATURE:BAT:LIVER -CREATURE:BAT:GUT -CREATURE:BAT:STOMACH -CREATURE:BAT:GIZZARD -CREATURE:BAT:PANCREAS -CREATURE:BAT:SPLEEN -CREATURE:BAT:KIDNEY -CREATURE:BAT_MAN:MUSCLE -CREATURE:BAT_MAN:EYE -CREATURE:BAT_MAN:BRAIN -CREATURE:BAT_MAN:LUNG -CREATURE:BAT_MAN:HEART -CREATURE:BAT_MAN:LIVER -CREATURE:BAT_MAN:GUT -CREATURE:BAT_MAN:STOMACH -CREATURE:BAT_MAN:GIZZARD -CREATURE:BAT_MAN:PANCREAS -CREATURE:BAT_MAN:SPLEEN -CREATURE:BAT_MAN:KIDNEY -CREATURE:MAGGOT_PURRING:MUSCLE -CREATURE:MAGGOT_PURRING:EYE -CREATURE:MAGGOT_PURRING:BRAIN -CREATURE:MAGGOT_PURRING:LUNG -CREATURE:MAGGOT_PURRING:HEART -CREATURE:MAGGOT_PURRING:LIVER -CREATURE:MAGGOT_PURRING:GUT -CREATURE:MAGGOT_PURRING:STOMACH -CREATURE:MAGGOT_PURRING:GIZZARD - CREATURE:MAGGOT_PURRING:PANCREAS -CREATURE:MAGGOT_PURRING:SPLEEN -CREATURE:MAGGOT_PURRING:KIDNEY -!CREATURE:BIRD_SWALLOW_CAVE:MUSCLE -CREATURE:BIRD_SWALLOW_CAVE:EYE - CREATURE:BIRD_SWALLOW_CAVE:BRAIN -CREATURE:BIRD_SWALLOW_CAVE:LUNG - CREATURE:BIRD_SWALLOW_CAVE:HEART - CREATURE:BIRD_SWALLOW_CAVE:LIVER -CREATURE:BIRD_SWALLOW_CAVE:GUT -"CREATURE:BIRD_SWALLOW_CAVE:STOMACH -"CREATURE:BIRD_SWALLOW_CAVE:GIZZARD -#CREATURE:BIRD_SWALLOW_CAVE:PANCREAS -!CREATURE:BIRD_SWALLOW_CAVE:SPLEEN -!CREATURE:BIRD_SWALLOW_CAVE:KIDNEY - CREATURE:CAVE_SWALLOW_MAN:MUSCLE -CREATURE:CAVE_SWALLOW_MAN:EYE -CREATURE:CAVE_SWALLOW_MAN:BRAIN -CREATURE:CAVE_SWALLOW_MAN:LUNG -CREATURE:CAVE_SWALLOW_MAN:HEART -CREATURE:CAVE_SWALLOW_MAN:LIVER -CREATURE:CAVE_SWALLOW_MAN:GUT -!CREATURE:CAVE_SWALLOW_MAN:STOMACH -!CREATURE:CAVE_SWALLOW_MAN:GIZZARD -"CREATURE:CAVE_SWALLOW_MAN:PANCREAS - CREATURE:CAVE_SWALLOW_MAN:SPLEEN - CREATURE:CAVE_SWALLOW_MAN:KIDNEY -'CREATURE:BIRD_SWALLOW_CAVE_GIANT:MUSCLE -$CREATURE:BIRD_SWALLOW_CAVE_GIANT:EYE -&CREATURE:BIRD_SWALLOW_CAVE_GIANT:BRAIN -%CREATURE:BIRD_SWALLOW_CAVE_GIANT:LUNG -&CREATURE:BIRD_SWALLOW_CAVE_GIANT:HEART -&CREATURE:BIRD_SWALLOW_CAVE_GIANT:LIVER -$CREATURE:BIRD_SWALLOW_CAVE_GIANT:GUT -(CREATURE:BIRD_SWALLOW_CAVE_GIANT:STOMACH -(CREATURE:BIRD_SWALLOW_CAVE_GIANT:GIZZARD -)CREATURE:BIRD_SWALLOW_CAVE_GIANT:PANCREAS -'CREATURE:BIRD_SWALLOW_CAVE_GIANT:SPLEEN -'CREATURE:BIRD_SWALLOW_CAVE_GIANT:KIDNEY -CREATURE:AMPHIBIAN_MAN:MUSCLE -CREATURE:AMPHIBIAN_MAN:EYE -CREATURE:AMPHIBIAN_MAN:BRAIN -CREATURE:AMPHIBIAN_MAN:LUNG -CREATURE:AMPHIBIAN_MAN:HEART -CREATURE:AMPHIBIAN_MAN:LIVER -CREATURE:AMPHIBIAN_MAN:GUT -CREATURE:AMPHIBIAN_MAN:STOMACH -CREATURE:AMPHIBIAN_MAN:GIZZARD -CREATURE:AMPHIBIAN_MAN:PANCREAS -CREATURE:AMPHIBIAN_MAN:SPLEEN -CREATURE:AMPHIBIAN_MAN:KIDNEY -CREATURE:REPTILE_MAN:MUSCLE -CREATURE:REPTILE_MAN:EYE -CREATURE:REPTILE_MAN:BRAIN -CREATURE:REPTILE_MAN:LUNG -CREATURE:REPTILE_MAN:HEART -CREATURE:REPTILE_MAN:LIVER -CREATURE:REPTILE_MAN:GUT -CREATURE:REPTILE_MAN:STOMACH -CREATURE:REPTILE_MAN:GIZZARD -CREATURE:REPTILE_MAN:PANCREAS -CREATURE:REPTILE_MAN:SPLEEN -CREATURE:REPTILE_MAN:KIDNEY -CREATURE:SERPENT_MAN:MUSCLE -CREATURE:SERPENT_MAN:EYE -CREATURE:SERPENT_MAN:BRAIN -CREATURE:SERPENT_MAN:LUNG -CREATURE:SERPENT_MAN:HEART -CREATURE:SERPENT_MAN:LIVER -CREATURE:SERPENT_MAN:GUT -CREATURE:SERPENT_MAN:STOMACH -CREATURE:SERPENT_MAN:GIZZARD -CREATURE:SERPENT_MAN:PANCREAS -CREATURE:SERPENT_MAN:SPLEEN -CREATURE:SERPENT_MAN:KIDNEY -CREATURE:ANT_MAN:MUSCLE -CREATURE:ANT_MAN:EYE -CREATURE:ANT_MAN:BRAIN -CREATURE:ANT_MAN:LUNG -CREATURE:ANT_MAN:HEART -CREATURE:ANT_MAN:LIVER -CREATURE:ANT_MAN:GUT -CREATURE:ANT_MAN:STOMACH -CREATURE:ANT_MAN:GIZZARD -CREATURE:ANT_MAN:PANCREAS -CREATURE:ANT_MAN:SPLEEN -CREATURE:ANT_MAN:KIDNEY -CREATURE:RODENT MAN:MUSCLE -CREATURE:RODENT MAN:EYE -CREATURE:RODENT MAN:BRAIN -CREATURE:RODENT MAN:LUNG -CREATURE:RODENT MAN:HEART -CREATURE:RODENT MAN:LIVER -CREATURE:RODENT MAN:GUT -CREATURE:RODENT MAN:STOMACH -CREATURE:RODENT MAN:GIZZARD -CREATURE:RODENT MAN:PANCREAS -CREATURE:RODENT MAN:SPLEEN -CREATURE:RODENT MAN:KIDNEY -CREATURE:WILD_BOAR:MUSCLE -CREATURE:WILD_BOAR:EYE -CREATURE:WILD_BOAR:BRAIN -CREATURE:WILD_BOAR:LUNG -CREATURE:WILD_BOAR:HEART -CREATURE:WILD_BOAR:LIVER -CREATURE:WILD_BOAR:GUT -CREATURE:WILD_BOAR:STOMACH -CREATURE:WILD_BOAR:GIZZARD -CREATURE:WILD_BOAR:PANCREAS -CREATURE:WILD_BOAR:SPLEEN -CREATURE:WILD_BOAR:KIDNEY -CREATURE:WILD_BOAR_MAN:MUSCLE -CREATURE:WILD_BOAR_MAN:EYE -CREATURE:WILD_BOAR_MAN:BRAIN -CREATURE:WILD_BOAR_MAN:LUNG -CREATURE:WILD_BOAR_MAN:HEART -CREATURE:WILD_BOAR_MAN:LIVER -CREATURE:WILD_BOAR_MAN:GUT -CREATURE:WILD_BOAR_MAN:STOMACH -CREATURE:WILD_BOAR_MAN:GIZZARD -CREATURE:WILD_BOAR_MAN:PANCREAS -CREATURE:WILD_BOAR_MAN:SPLEEN -CREATURE:WILD_BOAR_MAN:KIDNEY -CREATURE:GIANT_WILD_BOAR:MUSCLE -CREATURE:GIANT_WILD_BOAR:EYE -CREATURE:GIANT_WILD_BOAR:BRAIN -CREATURE:GIANT_WILD_BOAR:LUNG -CREATURE:GIANT_WILD_BOAR:HEART -CREATURE:GIANT_WILD_BOAR:LIVER -CREATURE:GIANT_WILD_BOAR:GUT - CREATURE:GIANT_WILD_BOAR:STOMACH - CREATURE:GIANT_WILD_BOAR:GIZZARD -!CREATURE:GIANT_WILD_BOAR:PANCREAS -CREATURE:GIANT_WILD_BOAR:SPLEEN -CREATURE:GIANT_WILD_BOAR:KIDNEY -CREATURE:COYOTE:MUSCLE -CREATURE:COYOTE:EYE -CREATURE:COYOTE:BRAIN -CREATURE:COYOTE:LUNG -CREATURE:COYOTE:HEART -CREATURE:COYOTE:LIVER -CREATURE:COYOTE:GUT -CREATURE:COYOTE:STOMACH -CREATURE:COYOTE:GIZZARD -CREATURE:COYOTE:PANCREAS -CREATURE:COYOTE:SPLEEN -CREATURE:COYOTE:KIDNEY -CREATURE:COYOTE_MAN:MUSCLE -CREATURE:COYOTE_MAN:EYE -CREATURE:COYOTE_MAN:BRAIN -CREATURE:COYOTE_MAN:LUNG -CREATURE:COYOTE_MAN:HEART -CREATURE:COYOTE_MAN:LIVER -CREATURE:COYOTE_MAN:GUT -CREATURE:COYOTE_MAN:STOMACH -CREATURE:COYOTE_MAN:GIZZARD -CREATURE:COYOTE_MAN:PANCREAS -CREATURE:COYOTE_MAN:SPLEEN -CREATURE:COYOTE_MAN:KIDNEY -CREATURE:GIANT_COYOTE:MUSCLE -CREATURE:GIANT_COYOTE:EYE -CREATURE:GIANT_COYOTE:BRAIN -CREATURE:GIANT_COYOTE:LUNG -CREATURE:GIANT_COYOTE:HEART -CREATURE:GIANT_COYOTE:LIVER -CREATURE:GIANT_COYOTE:GUT -CREATURE:GIANT_COYOTE:STOMACH -CREATURE:GIANT_COYOTE:GIZZARD -CREATURE:GIANT_COYOTE:PANCREAS -CREATURE:GIANT_COYOTE:SPLEEN -CREATURE:GIANT_COYOTE:KIDNEY -CREATURE:KANGAROO:MUSCLE -CREATURE:KANGAROO:EYE -CREATURE:KANGAROO:BRAIN -CREATURE:KANGAROO:LUNG -CREATURE:KANGAROO:HEART -CREATURE:KANGAROO:LIVER -CREATURE:KANGAROO:GUT -CREATURE:KANGAROO:STOMACH -CREATURE:KANGAROO:GIZZARD -CREATURE:KANGAROO:PANCREAS -CREATURE:KANGAROO:SPLEEN -CREATURE:KANGAROO:KIDNEY -CREATURE:KANGAROO_MAN:MUSCLE -CREATURE:KANGAROO_MAN:EYE -CREATURE:KANGAROO_MAN:BRAIN -CREATURE:KANGAROO_MAN:LUNG -CREATURE:KANGAROO_MAN:HEART -CREATURE:KANGAROO_MAN:LIVER -CREATURE:KANGAROO_MAN:GUT -CREATURE:KANGAROO_MAN:STOMACH -CREATURE:KANGAROO_MAN:GIZZARD -CREATURE:KANGAROO_MAN:PANCREAS -CREATURE:KANGAROO_MAN:SPLEEN -CREATURE:KANGAROO_MAN:KIDNEY -CREATURE:GIANT_KANGAROO:MUSCLE -CREATURE:GIANT_KANGAROO:EYE -CREATURE:GIANT_KANGAROO:BRAIN -CREATURE:GIANT_KANGAROO:LUNG -CREATURE:GIANT_KANGAROO:HEART -CREATURE:GIANT_KANGAROO:LIVER -CREATURE:GIANT_KANGAROO:GUT -CREATURE:GIANT_KANGAROO:STOMACH -CREATURE:GIANT_KANGAROO:GIZZARD - CREATURE:GIANT_KANGAROO:PANCREAS -CREATURE:GIANT_KANGAROO:SPLEEN -CREATURE:GIANT_KANGAROO:KIDNEY -CREATURE:KOALA:MUSCLE -CREATURE:KOALA:EYE -CREATURE:KOALA:BRAIN -CREATURE:KOALA:LUNG -CREATURE:KOALA:HEART -CREATURE:KOALA:LIVER -CREATURE:KOALA:GUT -CREATURE:KOALA:STOMACH -CREATURE:KOALA:GIZZARD -CREATURE:KOALA:PANCREAS -CREATURE:KOALA:SPLEEN -CREATURE:KOALA:KIDNEY -CREATURE:KOALA_MAN:MUSCLE -CREATURE:KOALA_MAN:EYE -CREATURE:KOALA_MAN:BRAIN -CREATURE:KOALA_MAN:LUNG -CREATURE:KOALA_MAN:HEART -CREATURE:KOALA_MAN:LIVER -CREATURE:KOALA_MAN:GUT -CREATURE:KOALA_MAN:STOMACH -CREATURE:KOALA_MAN:GIZZARD -CREATURE:KOALA_MAN:PANCREAS -CREATURE:KOALA_MAN:SPLEEN -CREATURE:KOALA_MAN:KIDNEY -CREATURE:GIANT_KOALA:MUSCLE -CREATURE:GIANT_KOALA:EYE -CREATURE:GIANT_KOALA:BRAIN -CREATURE:GIANT_KOALA:LUNG -CREATURE:GIANT_KOALA:HEART -CREATURE:GIANT_KOALA:LIVER -CREATURE:GIANT_KOALA:GUT -CREATURE:GIANT_KOALA:STOMACH -CREATURE:GIANT_KOALA:GIZZARD -CREATURE:GIANT_KOALA:PANCREAS -CREATURE:GIANT_KOALA:SPLEEN -CREATURE:GIANT_KOALA:KIDNEY -CREATURE:ADDER:MUSCLE -CREATURE:ADDER:EYE -CREATURE:ADDER:BRAIN -CREATURE:ADDER:LUNG -CREATURE:ADDER:HEART -CREATURE:ADDER:LIVER -CREATURE:ADDER:GUT -CREATURE:ADDER:STOMACH -CREATURE:ADDER:GIZZARD -CREATURE:ADDER:PANCREAS -CREATURE:ADDER:SPLEEN -CREATURE:ADDER:KIDNEY -CREATURE:ADDER_MAN:MUSCLE -CREATURE:ADDER_MAN:EYE -CREATURE:ADDER_MAN:BRAIN -CREATURE:ADDER_MAN:LUNG -CREATURE:ADDER_MAN:HEART -CREATURE:ADDER_MAN:LIVER -CREATURE:ADDER_MAN:GUT -CREATURE:ADDER_MAN:STOMACH -CREATURE:ADDER_MAN:GIZZARD -CREATURE:ADDER_MAN:PANCREAS -CREATURE:ADDER_MAN:SPLEEN -CREATURE:ADDER_MAN:KIDNEY -CREATURE:GIANT_ADDER:MUSCLE -CREATURE:GIANT_ADDER:EYE -CREATURE:GIANT_ADDER:BRAIN -CREATURE:GIANT_ADDER:LUNG -CREATURE:GIANT_ADDER:HEART -CREATURE:GIANT_ADDER:LIVER -CREATURE:GIANT_ADDER:GUT -CREATURE:GIANT_ADDER:STOMACH -CREATURE:GIANT_ADDER:GIZZARD -CREATURE:GIANT_ADDER:PANCREAS -CREATURE:GIANT_ADDER:SPLEEN -CREATURE:GIANT_ADDER:KIDNEY -CREATURE:ECHIDNA:MUSCLE -CREATURE:ECHIDNA:EYE -CREATURE:ECHIDNA:BRAIN -CREATURE:ECHIDNA:LUNG -CREATURE:ECHIDNA:HEART -CREATURE:ECHIDNA:LIVER -CREATURE:ECHIDNA:GUT -CREATURE:ECHIDNA:STOMACH -CREATURE:ECHIDNA:GIZZARD -CREATURE:ECHIDNA:PANCREAS -CREATURE:ECHIDNA:SPLEEN -CREATURE:ECHIDNA:KIDNEY -CREATURE:ECHIDNA_MAN:MUSCLE -CREATURE:ECHIDNA_MAN:EYE -CREATURE:ECHIDNA_MAN:BRAIN -CREATURE:ECHIDNA_MAN:LUNG -CREATURE:ECHIDNA_MAN:HEART -CREATURE:ECHIDNA_MAN:LIVER -CREATURE:ECHIDNA_MAN:GUT -CREATURE:ECHIDNA_MAN:STOMACH -CREATURE:ECHIDNA_MAN:GIZZARD -CREATURE:ECHIDNA_MAN:PANCREAS -CREATURE:ECHIDNA_MAN:SPLEEN -CREATURE:ECHIDNA_MAN:KIDNEY -CREATURE:GIANT_ECHIDNA:MUSCLE -CREATURE:GIANT_ECHIDNA:EYE -CREATURE:GIANT_ECHIDNA:BRAIN -CREATURE:GIANT_ECHIDNA:LUNG -CREATURE:GIANT_ECHIDNA:HEART -CREATURE:GIANT_ECHIDNA:LIVER -CREATURE:GIANT_ECHIDNA:GUT -CREATURE:GIANT_ECHIDNA:STOMACH -CREATURE:GIANT_ECHIDNA:GIZZARD -CREATURE:GIANT_ECHIDNA:PANCREAS -CREATURE:GIANT_ECHIDNA:SPLEEN -CREATURE:GIANT_ECHIDNA:KIDNEY -CREATURE:PORCUPINE:MUSCLE -CREATURE:PORCUPINE:EYE -CREATURE:PORCUPINE:BRAIN -CREATURE:PORCUPINE:LUNG -CREATURE:PORCUPINE:HEART -CREATURE:PORCUPINE:LIVER -CREATURE:PORCUPINE:GUT -CREATURE:PORCUPINE:STOMACH -CREATURE:PORCUPINE:GIZZARD -CREATURE:PORCUPINE:PANCREAS -CREATURE:PORCUPINE:SPLEEN -CREATURE:PORCUPINE:KIDNEY -CREATURE:PORCUPINE_MAN:MUSCLE -CREATURE:PORCUPINE_MAN:EYE -CREATURE:PORCUPINE_MAN:BRAIN -CREATURE:PORCUPINE_MAN:LUNG -CREATURE:PORCUPINE_MAN:HEART -CREATURE:PORCUPINE_MAN:LIVER -CREATURE:PORCUPINE_MAN:GUT -CREATURE:PORCUPINE_MAN:STOMACH -CREATURE:PORCUPINE_MAN:GIZZARD -CREATURE:PORCUPINE_MAN:PANCREAS -CREATURE:PORCUPINE_MAN:SPLEEN -CREATURE:PORCUPINE_MAN:KIDNEY -CREATURE:GIANT_PORCUPINE:MUSCLE -CREATURE:GIANT_PORCUPINE:EYE -CREATURE:GIANT_PORCUPINE:BRAIN -CREATURE:GIANT_PORCUPINE:LUNG -CREATURE:GIANT_PORCUPINE:HEART -CREATURE:GIANT_PORCUPINE:LIVER -CREATURE:GIANT_PORCUPINE:GUT - CREATURE:GIANT_PORCUPINE:STOMACH - CREATURE:GIANT_PORCUPINE:GIZZARD -!CREATURE:GIANT_PORCUPINE:PANCREAS -CREATURE:GIANT_PORCUPINE:SPLEEN -CREATURE:GIANT_PORCUPINE:KIDNEY -CREATURE:KINGSNAKE:MUSCLE -CREATURE:KINGSNAKE:EYE -CREATURE:KINGSNAKE:BRAIN -CREATURE:KINGSNAKE:LUNG -CREATURE:KINGSNAKE:HEART -CREATURE:KINGSNAKE:LIVER -CREATURE:KINGSNAKE:GUT -CREATURE:KINGSNAKE:STOMACH -CREATURE:KINGSNAKE:GIZZARD -CREATURE:KINGSNAKE:PANCREAS -CREATURE:KINGSNAKE:SPLEEN -CREATURE:KINGSNAKE:KIDNEY -CREATURE:KINGSNAKE_MAN:MUSCLE -CREATURE:KINGSNAKE_MAN:EYE -CREATURE:KINGSNAKE_MAN:BRAIN -CREATURE:KINGSNAKE_MAN:LUNG -CREATURE:KINGSNAKE_MAN:HEART -CREATURE:KINGSNAKE_MAN:LIVER -CREATURE:KINGSNAKE_MAN:GUT -CREATURE:KINGSNAKE_MAN:STOMACH -CREATURE:KINGSNAKE_MAN:GIZZARD -CREATURE:KINGSNAKE_MAN:PANCREAS -CREATURE:KINGSNAKE_MAN:SPLEEN -CREATURE:KINGSNAKE_MAN:KIDNEY -CREATURE:GIANT_KINGSNAKE:MUSCLE -CREATURE:GIANT_KINGSNAKE:EYE -CREATURE:GIANT_KINGSNAKE:BRAIN -CREATURE:GIANT_KINGSNAKE:LUNG -CREATURE:GIANT_KINGSNAKE:HEART -CREATURE:GIANT_KINGSNAKE:LIVER -CREATURE:GIANT_KINGSNAKE:GUT - CREATURE:GIANT_KINGSNAKE:STOMACH - CREATURE:GIANT_KINGSNAKE:GIZZARD -!CREATURE:GIANT_KINGSNAKE:PANCREAS -CREATURE:GIANT_KINGSNAKE:SPLEEN -CREATURE:GIANT_KINGSNAKE:KIDNEY -CREATURE:GRAY_LANGUR:MUSCLE -CREATURE:GRAY_LANGUR:EYE -CREATURE:GRAY_LANGUR:BRAIN -CREATURE:GRAY_LANGUR:LUNG -CREATURE:GRAY_LANGUR:HEART -CREATURE:GRAY_LANGUR:LIVER -CREATURE:GRAY_LANGUR:GUT -CREATURE:GRAY_LANGUR:STOMACH -CREATURE:GRAY_LANGUR:GIZZARD -CREATURE:GRAY_LANGUR:PANCREAS -CREATURE:GRAY_LANGUR:SPLEEN -CREATURE:GRAY_LANGUR:KIDNEY -CREATURE:GRAY_LANGUR_MAN:MUSCLE -CREATURE:GRAY_LANGUR_MAN:EYE -CREATURE:GRAY_LANGUR_MAN:BRAIN -CREATURE:GRAY_LANGUR_MAN:LUNG -CREATURE:GRAY_LANGUR_MAN:HEART -CREATURE:GRAY_LANGUR_MAN:LIVER -CREATURE:GRAY_LANGUR_MAN:GUT - CREATURE:GRAY_LANGUR_MAN:STOMACH - CREATURE:GRAY_LANGUR_MAN:GIZZARD -!CREATURE:GRAY_LANGUR_MAN:PANCREAS -CREATURE:GRAY_LANGUR_MAN:SPLEEN -CREATURE:GRAY_LANGUR_MAN:KIDNEY -!CREATURE:GIANT_GRAY_LANGUR:MUSCLE -CREATURE:GIANT_GRAY_LANGUR:EYE - CREATURE:GIANT_GRAY_LANGUR:BRAIN -CREATURE:GIANT_GRAY_LANGUR:LUNG - CREATURE:GIANT_GRAY_LANGUR:HEART - CREATURE:GIANT_GRAY_LANGUR:LIVER -CREATURE:GIANT_GRAY_LANGUR:GUT -"CREATURE:GIANT_GRAY_LANGUR:STOMACH -"CREATURE:GIANT_GRAY_LANGUR:GIZZARD -#CREATURE:GIANT_GRAY_LANGUR:PANCREAS -!CREATURE:GIANT_GRAY_LANGUR:SPLEEN -!CREATURE:GIANT_GRAY_LANGUR:KIDNEY -CREATURE:BOBCAT:MUSCLE -CREATURE:BOBCAT:EYE -CREATURE:BOBCAT:BRAIN -CREATURE:BOBCAT:LUNG -CREATURE:BOBCAT:HEART -CREATURE:BOBCAT:LIVER -CREATURE:BOBCAT:GUT -CREATURE:BOBCAT:STOMACH -CREATURE:BOBCAT:GIZZARD -CREATURE:BOBCAT:PANCREAS -CREATURE:BOBCAT:SPLEEN -CREATURE:BOBCAT:KIDNEY -CREATURE:BOBCAT_MAN:MUSCLE -CREATURE:BOBCAT_MAN:EYE -CREATURE:BOBCAT_MAN:BRAIN -CREATURE:BOBCAT_MAN:LUNG -CREATURE:BOBCAT_MAN:HEART -CREATURE:BOBCAT_MAN:LIVER -CREATURE:BOBCAT_MAN:GUT -CREATURE:BOBCAT_MAN:STOMACH -CREATURE:BOBCAT_MAN:GIZZARD -CREATURE:BOBCAT_MAN:PANCREAS -CREATURE:BOBCAT_MAN:SPLEEN -CREATURE:BOBCAT_MAN:KIDNEY -CREATURE:GIANT_BOBCAT:MUSCLE -CREATURE:GIANT_BOBCAT:EYE -CREATURE:GIANT_BOBCAT:BRAIN -CREATURE:GIANT_BOBCAT:LUNG -CREATURE:GIANT_BOBCAT:HEART -CREATURE:GIANT_BOBCAT:LIVER -CREATURE:GIANT_BOBCAT:GUT -CREATURE:GIANT_BOBCAT:STOMACH -CREATURE:GIANT_BOBCAT:GIZZARD -CREATURE:GIANT_BOBCAT:PANCREAS -CREATURE:GIANT_BOBCAT:SPLEEN -CREATURE:GIANT_BOBCAT:KIDNEY -CREATURE:SKUNK:MUSCLE -CREATURE:SKUNK:EYE -CREATURE:SKUNK:BRAIN -CREATURE:SKUNK:LUNG -CREATURE:SKUNK:HEART -CREATURE:SKUNK:LIVER -CREATURE:SKUNK:GUT -CREATURE:SKUNK:STOMACH -CREATURE:SKUNK:GIZZARD -CREATURE:SKUNK:PANCREAS -CREATURE:SKUNK:SPLEEN -CREATURE:SKUNK:KIDNEY -CREATURE:SKUNK_MAN:MUSCLE -CREATURE:SKUNK_MAN:EYE -CREATURE:SKUNK_MAN:BRAIN -CREATURE:SKUNK_MAN:LUNG -CREATURE:SKUNK_MAN:HEART -CREATURE:SKUNK_MAN:LIVER -CREATURE:SKUNK_MAN:GUT -CREATURE:SKUNK_MAN:STOMACH -CREATURE:SKUNK_MAN:GIZZARD -CREATURE:SKUNK_MAN:PANCREAS -CREATURE:SKUNK_MAN:SPLEEN -CREATURE:SKUNK_MAN:KIDNEY -CREATURE:GIANT_SKUNK:MUSCLE -CREATURE:GIANT_SKUNK:EYE -CREATURE:GIANT_SKUNK:BRAIN -CREATURE:GIANT_SKUNK:LUNG -CREATURE:GIANT_SKUNK:HEART -CREATURE:GIANT_SKUNK:LIVER -CREATURE:GIANT_SKUNK:GUT -CREATURE:GIANT_SKUNK:STOMACH -CREATURE:GIANT_SKUNK:GIZZARD -CREATURE:GIANT_SKUNK:PANCREAS -CREATURE:GIANT_SKUNK:SPLEEN -CREATURE:GIANT_SKUNK:KIDNEY -CREATURE:GREEN_TREE_FROG:MUSCLE -CREATURE:GREEN_TREE_FROG:EYE -CREATURE:GREEN_TREE_FROG:BRAIN -CREATURE:GREEN_TREE_FROG:LUNG -CREATURE:GREEN_TREE_FROG:HEART -CREATURE:GREEN_TREE_FROG:LIVER -CREATURE:GREEN_TREE_FROG:GUT - CREATURE:GREEN_TREE_FROG:STOMACH - CREATURE:GREEN_TREE_FROG:GIZZARD -!CREATURE:GREEN_TREE_FROG:PANCREAS -CREATURE:GREEN_TREE_FROG:SPLEEN -CREATURE:GREEN_TREE_FROG:KIDNEY -#CREATURE:GREEN_TREE_FROG_MAN:MUSCLE - CREATURE:GREEN_TREE_FROG_MAN:EYE -"CREATURE:GREEN_TREE_FROG_MAN:BRAIN -!CREATURE:GREEN_TREE_FROG_MAN:LUNG -"CREATURE:GREEN_TREE_FROG_MAN:HEART -"CREATURE:GREEN_TREE_FROG_MAN:LIVER - CREATURE:GREEN_TREE_FROG_MAN:GUT -$CREATURE:GREEN_TREE_FROG_MAN:STOMACH -$CREATURE:GREEN_TREE_FROG_MAN:GIZZARD -%CREATURE:GREEN_TREE_FROG_MAN:PANCREAS -#CREATURE:GREEN_TREE_FROG_MAN:SPLEEN -#CREATURE:GREEN_TREE_FROG_MAN:KIDNEY -%CREATURE:GIANT_GREEN_TREE_FROG:MUSCLE -"CREATURE:GIANT_GREEN_TREE_FROG:EYE -$CREATURE:GIANT_GREEN_TREE_FROG:BRAIN -#CREATURE:GIANT_GREEN_TREE_FROG:LUNG -$CREATURE:GIANT_GREEN_TREE_FROG:HEART -$CREATURE:GIANT_GREEN_TREE_FROG:LIVER -"CREATURE:GIANT_GREEN_TREE_FROG:GUT -&CREATURE:GIANT_GREEN_TREE_FROG:STOMACH -&CREATURE:GIANT_GREEN_TREE_FROG:GIZZARD -'CREATURE:GIANT_GREEN_TREE_FROG:PANCREAS -%CREATURE:GIANT_GREEN_TREE_FROG:SPLEEN -%CREATURE:GIANT_GREEN_TREE_FROG:KIDNEY -CREATURE:HARE:MUSCLE -CREATURE:HARE:EYE -CREATURE:HARE:BRAIN -CREATURE:HARE:LUNG -CREATURE:HARE:HEART -CREATURE:HARE:LIVER -CREATURE:HARE:GUT -CREATURE:HARE:STOMACH -CREATURE:HARE:GIZZARD -CREATURE:HARE:PANCREAS -CREATURE:HARE:SPLEEN -CREATURE:HARE:KIDNEY -CREATURE:HARE_MAN:MUSCLE -CREATURE:HARE_MAN:EYE -CREATURE:HARE_MAN:BRAIN -CREATURE:HARE_MAN:LUNG -CREATURE:HARE_MAN:HEART -CREATURE:HARE_MAN:LIVER -CREATURE:HARE_MAN:GUT -CREATURE:HARE_MAN:STOMACH -CREATURE:HARE_MAN:GIZZARD -CREATURE:HARE_MAN:PANCREAS -CREATURE:HARE_MAN:SPLEEN -CREATURE:HARE_MAN:KIDNEY -CREATURE:GIANT_HARE:MUSCLE -CREATURE:GIANT_HARE:EYE -CREATURE:GIANT_HARE:BRAIN -CREATURE:GIANT_HARE:LUNG -CREATURE:GIANT_HARE:HEART -CREATURE:GIANT_HARE:LIVER -CREATURE:GIANT_HARE:GUT -CREATURE:GIANT_HARE:STOMACH -CREATURE:GIANT_HARE:GIZZARD -CREATURE:GIANT_HARE:PANCREAS -CREATURE:GIANT_HARE:SPLEEN -CREATURE:GIANT_HARE:KIDNEY -CREATURE:RATTLESNAKE:MUSCLE -CREATURE:RATTLESNAKE:EYE -CREATURE:RATTLESNAKE:BRAIN -CREATURE:RATTLESNAKE:LUNG -CREATURE:RATTLESNAKE:HEART -CREATURE:RATTLESNAKE:LIVER -CREATURE:RATTLESNAKE:GUT -CREATURE:RATTLESNAKE:STOMACH -CREATURE:RATTLESNAKE:GIZZARD -CREATURE:RATTLESNAKE:PANCREAS -CREATURE:RATTLESNAKE:SPLEEN -CREATURE:RATTLESNAKE:KIDNEY -CREATURE:RATTLESNAKE_MAN:MUSCLE -CREATURE:RATTLESNAKE_MAN:EYE -CREATURE:RATTLESNAKE_MAN:BRAIN -CREATURE:RATTLESNAKE_MAN:LUNG -CREATURE:RATTLESNAKE_MAN:HEART -CREATURE:RATTLESNAKE_MAN:LIVER -CREATURE:RATTLESNAKE_MAN:GUT - CREATURE:RATTLESNAKE_MAN:STOMACH - CREATURE:RATTLESNAKE_MAN:GIZZARD -!CREATURE:RATTLESNAKE_MAN:PANCREAS -CREATURE:RATTLESNAKE_MAN:SPLEEN -CREATURE:RATTLESNAKE_MAN:KIDNEY -!CREATURE:GIANT_RATTLESNAKE:MUSCLE -CREATURE:GIANT_RATTLESNAKE:EYE - CREATURE:GIANT_RATTLESNAKE:BRAIN -CREATURE:GIANT_RATTLESNAKE:LUNG - CREATURE:GIANT_RATTLESNAKE:HEART - CREATURE:GIANT_RATTLESNAKE:LIVER -CREATURE:GIANT_RATTLESNAKE:GUT -"CREATURE:GIANT_RATTLESNAKE:STOMACH -"CREATURE:GIANT_RATTLESNAKE:GIZZARD -#CREATURE:GIANT_RATTLESNAKE:PANCREAS -!CREATURE:GIANT_RATTLESNAKE:SPLEEN -!CREATURE:GIANT_RATTLESNAKE:KIDNEY -CREATURE:WEASEL:MUSCLE -CREATURE:WEASEL:EYE -CREATURE:WEASEL:BRAIN -CREATURE:WEASEL:LUNG -CREATURE:WEASEL:HEART -CREATURE:WEASEL:LIVER -CREATURE:WEASEL:GUT -CREATURE:WEASEL:STOMACH -CREATURE:WEASEL:GIZZARD -CREATURE:WEASEL:PANCREAS -CREATURE:WEASEL:SPLEEN -CREATURE:WEASEL:KIDNEY -CREATURE:WEASEL_MAN:MUSCLE -CREATURE:WEASEL_MAN:EYE -CREATURE:WEASEL_MAN:BRAIN -CREATURE:WEASEL_MAN:LUNG -CREATURE:WEASEL_MAN:HEART -CREATURE:WEASEL_MAN:LIVER -CREATURE:WEASEL_MAN:GUT -CREATURE:WEASEL_MAN:STOMACH -CREATURE:WEASEL_MAN:GIZZARD -CREATURE:WEASEL_MAN:PANCREAS -CREATURE:WEASEL_MAN:SPLEEN -CREATURE:WEASEL_MAN:KIDNEY -CREATURE:GIANT_WEASEL:MUSCLE -CREATURE:GIANT_WEASEL:EYE -CREATURE:GIANT_WEASEL:BRAIN -CREATURE:GIANT_WEASEL:LUNG -CREATURE:GIANT_WEASEL:HEART -CREATURE:GIANT_WEASEL:LIVER -CREATURE:GIANT_WEASEL:GUT -CREATURE:GIANT_WEASEL:STOMACH -CREATURE:GIANT_WEASEL:GIZZARD -CREATURE:GIANT_WEASEL:PANCREAS -CREATURE:GIANT_WEASEL:SPLEEN -CREATURE:GIANT_WEASEL:KIDNEY - CREATURE:COPPERHEAD_SNAKE:MUSCLE -CREATURE:COPPERHEAD_SNAKE:EYE -CREATURE:COPPERHEAD_SNAKE:BRAIN -CREATURE:COPPERHEAD_SNAKE:LUNG -CREATURE:COPPERHEAD_SNAKE:HEART -CREATURE:COPPERHEAD_SNAKE:LIVER -CREATURE:COPPERHEAD_SNAKE:GUT -!CREATURE:COPPERHEAD_SNAKE:STOMACH -!CREATURE:COPPERHEAD_SNAKE:GIZZARD -"CREATURE:COPPERHEAD_SNAKE:PANCREAS - CREATURE:COPPERHEAD_SNAKE:SPLEEN - CREATURE:COPPERHEAD_SNAKE:KIDNEY -$CREATURE:COPPERHEAD_SNAKE_MAN:MUSCLE -!CREATURE:COPPERHEAD_SNAKE_MAN:EYE -#CREATURE:COPPERHEAD_SNAKE_MAN:BRAIN -"CREATURE:COPPERHEAD_SNAKE_MAN:LUNG -#CREATURE:COPPERHEAD_SNAKE_MAN:HEART -#CREATURE:COPPERHEAD_SNAKE_MAN:LIVER -!CREATURE:COPPERHEAD_SNAKE_MAN:GUT -%CREATURE:COPPERHEAD_SNAKE_MAN:STOMACH -%CREATURE:COPPERHEAD_SNAKE_MAN:GIZZARD -&CREATURE:COPPERHEAD_SNAKE_MAN:PANCREAS -$CREATURE:COPPERHEAD_SNAKE_MAN:SPLEEN -$CREATURE:COPPERHEAD_SNAKE_MAN:KIDNEY -&CREATURE:GIANT_COPPERHEAD_SNAKE:MUSCLE -#CREATURE:GIANT_COPPERHEAD_SNAKE:EYE -%CREATURE:GIANT_COPPERHEAD_SNAKE:BRAIN -$CREATURE:GIANT_COPPERHEAD_SNAKE:LUNG -%CREATURE:GIANT_COPPERHEAD_SNAKE:HEART -%CREATURE:GIANT_COPPERHEAD_SNAKE:LIVER -#CREATURE:GIANT_COPPERHEAD_SNAKE:GUT -'CREATURE:GIANT_COPPERHEAD_SNAKE:STOMACH -'CREATURE:GIANT_COPPERHEAD_SNAKE:GIZZARD -(CREATURE:GIANT_COPPERHEAD_SNAKE:PANCREAS -&CREATURE:GIANT_COPPERHEAD_SNAKE:SPLEEN -&CREATURE:GIANT_COPPERHEAD_SNAKE:KIDNEY -CREATURE:IBEX:MUSCLE -CREATURE:IBEX:EYE -CREATURE:IBEX:BRAIN -CREATURE:IBEX:LUNG -CREATURE:IBEX:HEART -CREATURE:IBEX:LIVER -CREATURE:IBEX:GUT -CREATURE:IBEX:STOMACH -CREATURE:IBEX:GIZZARD -CREATURE:IBEX:PANCREAS -CREATURE:IBEX:SPLEEN -CREATURE:IBEX:KIDNEY -CREATURE:IBEX_MAN:MUSCLE -CREATURE:IBEX_MAN:EYE -CREATURE:IBEX_MAN:BRAIN -CREATURE:IBEX_MAN:LUNG -CREATURE:IBEX_MAN:HEART -CREATURE:IBEX_MAN:LIVER -CREATURE:IBEX_MAN:GUT -CREATURE:IBEX_MAN:STOMACH -CREATURE:IBEX_MAN:GIZZARD -CREATURE:IBEX_MAN:PANCREAS -CREATURE:IBEX_MAN:SPLEEN -CREATURE:IBEX_MAN:KIDNEY -CREATURE:GIANT_IBEX:MUSCLE -CREATURE:GIANT_IBEX:EYE -CREATURE:GIANT_IBEX:BRAIN -CREATURE:GIANT_IBEX:LUNG -CREATURE:GIANT_IBEX:HEART -CREATURE:GIANT_IBEX:LIVER -CREATURE:GIANT_IBEX:GUT -CREATURE:GIANT_IBEX:STOMACH -CREATURE:GIANT_IBEX:GIZZARD -CREATURE:GIANT_IBEX:PANCREAS -CREATURE:GIANT_IBEX:SPLEEN -CREATURE:GIANT_IBEX:KIDNEY -CREATURE:WOMBAT:MUSCLE -CREATURE:WOMBAT:EYE -CREATURE:WOMBAT:BRAIN -CREATURE:WOMBAT:LUNG -CREATURE:WOMBAT:HEART -CREATURE:WOMBAT:LIVER -CREATURE:WOMBAT:GUT -CREATURE:WOMBAT:STOMACH -CREATURE:WOMBAT:GIZZARD -CREATURE:WOMBAT:PANCREAS -CREATURE:WOMBAT:SPLEEN -CREATURE:WOMBAT:KIDNEY -CREATURE:WOMBAT_MAN:MUSCLE -CREATURE:WOMBAT_MAN:EYE -CREATURE:WOMBAT_MAN:BRAIN -CREATURE:WOMBAT_MAN:LUNG -CREATURE:WOMBAT_MAN:HEART -CREATURE:WOMBAT_MAN:LIVER -CREATURE:WOMBAT_MAN:GUT -CREATURE:WOMBAT_MAN:STOMACH -CREATURE:WOMBAT_MAN:GIZZARD -CREATURE:WOMBAT_MAN:PANCREAS -CREATURE:WOMBAT_MAN:SPLEEN -CREATURE:WOMBAT_MAN:KIDNEY -CREATURE:GIANT_WOMBAT:MUSCLE -CREATURE:GIANT_WOMBAT:EYE -CREATURE:GIANT_WOMBAT:BRAIN -CREATURE:GIANT_WOMBAT:LUNG -CREATURE:GIANT_WOMBAT:HEART -CREATURE:GIANT_WOMBAT:LIVER -CREATURE:GIANT_WOMBAT:GUT -CREATURE:GIANT_WOMBAT:STOMACH -CREATURE:GIANT_WOMBAT:GIZZARD -CREATURE:GIANT_WOMBAT:PANCREAS -CREATURE:GIANT_WOMBAT:SPLEEN -CREATURE:GIANT_WOMBAT:KIDNEY -CREATURE:DINGO:MUSCLE -CREATURE:DINGO:EYE -CREATURE:DINGO:BRAIN -CREATURE:DINGO:LUNG -CREATURE:DINGO:HEART -CREATURE:DINGO:LIVER -CREATURE:DINGO:GUT -CREATURE:DINGO:STOMACH -CREATURE:DINGO:GIZZARD -CREATURE:DINGO:PANCREAS -CREATURE:DINGO:SPLEEN -CREATURE:DINGO:KIDNEY -CREATURE:DINGO_MAN:MUSCLE -CREATURE:DINGO_MAN:EYE -CREATURE:DINGO_MAN:BRAIN -CREATURE:DINGO_MAN:LUNG -CREATURE:DINGO_MAN:HEART -CREATURE:DINGO_MAN:LIVER -CREATURE:DINGO_MAN:GUT -CREATURE:DINGO_MAN:STOMACH -CREATURE:DINGO_MAN:GIZZARD -CREATURE:DINGO_MAN:PANCREAS -CREATURE:DINGO_MAN:SPLEEN -CREATURE:DINGO_MAN:KIDNEY -CREATURE:GIANT_DINGO:MUSCLE -CREATURE:GIANT_DINGO:EYE -CREATURE:GIANT_DINGO:BRAIN -CREATURE:GIANT_DINGO:LUNG -CREATURE:GIANT_DINGO:HEART -CREATURE:GIANT_DINGO:LIVER -CREATURE:GIANT_DINGO:GUT -CREATURE:GIANT_DINGO:STOMACH -CREATURE:GIANT_DINGO:GIZZARD -CREATURE:GIANT_DINGO:PANCREAS -CREATURE:GIANT_DINGO:SPLEEN -CREATURE:GIANT_DINGO:KIDNEY -CREATURE:COATI:MUSCLE -CREATURE:COATI:EYE -CREATURE:COATI:BRAIN -CREATURE:COATI:LUNG -CREATURE:COATI:HEART -CREATURE:COATI:LIVER -CREATURE:COATI:GUT -CREATURE:COATI:STOMACH -CREATURE:COATI:GIZZARD -CREATURE:COATI:PANCREAS -CREATURE:COATI:SPLEEN -CREATURE:COATI:KIDNEY -CREATURE:COATI_MAN:MUSCLE -CREATURE:COATI_MAN:EYE -CREATURE:COATI_MAN:BRAIN -CREATURE:COATI_MAN:LUNG -CREATURE:COATI_MAN:HEART -CREATURE:COATI_MAN:LIVER -CREATURE:COATI_MAN:GUT -CREATURE:COATI_MAN:STOMACH -CREATURE:COATI_MAN:GIZZARD -CREATURE:COATI_MAN:PANCREAS -CREATURE:COATI_MAN:SPLEEN -CREATURE:COATI_MAN:KIDNEY -CREATURE:GIANT_COATI:MUSCLE -CREATURE:GIANT_COATI:EYE -CREATURE:GIANT_COATI:BRAIN -CREATURE:GIANT_COATI:LUNG -CREATURE:GIANT_COATI:HEART -CREATURE:GIANT_COATI:LIVER -CREATURE:GIANT_COATI:GUT -CREATURE:GIANT_COATI:STOMACH -CREATURE:GIANT_COATI:GIZZARD -CREATURE:GIANT_COATI:PANCREAS -CREATURE:GIANT_COATI:SPLEEN -CREATURE:GIANT_COATI:KIDNEY -CREATURE:OPOSSUM:MUSCLE -CREATURE:OPOSSUM:EYE -CREATURE:OPOSSUM:BRAIN -CREATURE:OPOSSUM:LUNG -CREATURE:OPOSSUM:HEART -CREATURE:OPOSSUM:LIVER -CREATURE:OPOSSUM:GUT -CREATURE:OPOSSUM:STOMACH -CREATURE:OPOSSUM:GIZZARD -CREATURE:OPOSSUM:PANCREAS -CREATURE:OPOSSUM:SPLEEN -CREATURE:OPOSSUM:KIDNEY -CREATURE:OPOSSUM_MAN:MUSCLE -CREATURE:OPOSSUM_MAN:EYE -CREATURE:OPOSSUM_MAN:BRAIN -CREATURE:OPOSSUM_MAN:LUNG -CREATURE:OPOSSUM_MAN:HEART -CREATURE:OPOSSUM_MAN:LIVER -CREATURE:OPOSSUM_MAN:GUT -CREATURE:OPOSSUM_MAN:STOMACH -CREATURE:OPOSSUM_MAN:GIZZARD -CREATURE:OPOSSUM_MAN:PANCREAS -CREATURE:OPOSSUM_MAN:SPLEEN -CREATURE:OPOSSUM_MAN:KIDNEY -CREATURE:GIANT_OPOSSUM:MUSCLE -CREATURE:GIANT_OPOSSUM:EYE -CREATURE:GIANT_OPOSSUM:BRAIN -CREATURE:GIANT_OPOSSUM:LUNG -CREATURE:GIANT_OPOSSUM:HEART -CREATURE:GIANT_OPOSSUM:LIVER -CREATURE:GIANT_OPOSSUM:GUT -CREATURE:GIANT_OPOSSUM:STOMACH -CREATURE:GIANT_OPOSSUM:GIZZARD -CREATURE:GIANT_OPOSSUM:PANCREAS -CREATURE:GIANT_OPOSSUM:SPLEEN -CREATURE:GIANT_OPOSSUM:KIDNEY -CREATURE:MONGOOSE:MUSCLE -CREATURE:MONGOOSE:EYE -CREATURE:MONGOOSE:BRAIN -CREATURE:MONGOOSE:LUNG -CREATURE:MONGOOSE:HEART -CREATURE:MONGOOSE:LIVER -CREATURE:MONGOOSE:GUT -CREATURE:MONGOOSE:STOMACH -CREATURE:MONGOOSE:GIZZARD -CREATURE:MONGOOSE:PANCREAS -CREATURE:MONGOOSE:SPLEEN -CREATURE:MONGOOSE:KIDNEY -CREATURE:MONGOOSE_MAN:MUSCLE -CREATURE:MONGOOSE_MAN:EYE -CREATURE:MONGOOSE_MAN:BRAIN -CREATURE:MONGOOSE_MAN:LUNG -CREATURE:MONGOOSE_MAN:HEART -CREATURE:MONGOOSE_MAN:LIVER -CREATURE:MONGOOSE_MAN:GUT -CREATURE:MONGOOSE_MAN:STOMACH -CREATURE:MONGOOSE_MAN:GIZZARD -CREATURE:MONGOOSE_MAN:PANCREAS -CREATURE:MONGOOSE_MAN:SPLEEN -CREATURE:MONGOOSE_MAN:KIDNEY -CREATURE:GIANT_MONGOOSE:MUSCLE -CREATURE:GIANT_MONGOOSE:EYE -CREATURE:GIANT_MONGOOSE:BRAIN -CREATURE:GIANT_MONGOOSE:LUNG -CREATURE:GIANT_MONGOOSE:HEART -CREATURE:GIANT_MONGOOSE:LIVER -CREATURE:GIANT_MONGOOSE:GUT -CREATURE:GIANT_MONGOOSE:STOMACH -CREATURE:GIANT_MONGOOSE:GIZZARD - CREATURE:GIANT_MONGOOSE:PANCREAS -CREATURE:GIANT_MONGOOSE:SPLEEN -CREATURE:GIANT_MONGOOSE:KIDNEY -CREATURE:HYENA:MUSCLE -CREATURE:HYENA:EYE -CREATURE:HYENA:BRAIN -CREATURE:HYENA:LUNG -CREATURE:HYENA:HEART -CREATURE:HYENA:LIVER -CREATURE:HYENA:GUT -CREATURE:HYENA:STOMACH -CREATURE:HYENA:GIZZARD -CREATURE:HYENA:PANCREAS -CREATURE:HYENA:SPLEEN -CREATURE:HYENA:KIDNEY -CREATURE:HYENA_MAN:MUSCLE -CREATURE:HYENA_MAN:EYE -CREATURE:HYENA_MAN:BRAIN -CREATURE:HYENA_MAN:LUNG -CREATURE:HYENA_MAN:HEART -CREATURE:HYENA_MAN:LIVER -CREATURE:HYENA_MAN:GUT -CREATURE:HYENA_MAN:STOMACH -CREATURE:HYENA_MAN:GIZZARD -CREATURE:HYENA_MAN:PANCREAS -CREATURE:HYENA_MAN:SPLEEN -CREATURE:HYENA_MAN:KIDNEY -CREATURE:GIANT_HYENA:MUSCLE -CREATURE:GIANT_HYENA:EYE -CREATURE:GIANT_HYENA:BRAIN -CREATURE:GIANT_HYENA:LUNG -CREATURE:GIANT_HYENA:HEART -CREATURE:GIANT_HYENA:LIVER -CREATURE:GIANT_HYENA:GUT -CREATURE:GIANT_HYENA:STOMACH -CREATURE:GIANT_HYENA:GIZZARD -CREATURE:GIANT_HYENA:PANCREAS -CREATURE:GIANT_HYENA:SPLEEN -CREATURE:GIANT_HYENA:KIDNEY -CREATURE:ANACONDA:MUSCLE -CREATURE:ANACONDA:EYE -CREATURE:ANACONDA:BRAIN -CREATURE:ANACONDA:LUNG -CREATURE:ANACONDA:HEART -CREATURE:ANACONDA:LIVER -CREATURE:ANACONDA:GUT -CREATURE:ANACONDA:STOMACH -CREATURE:ANACONDA:GIZZARD -CREATURE:ANACONDA:PANCREAS -CREATURE:ANACONDA:SPLEEN -CREATURE:ANACONDA:KIDNEY -CREATURE:ANACONDA_MAN:MUSCLE -CREATURE:ANACONDA_MAN:EYE -CREATURE:ANACONDA_MAN:BRAIN -CREATURE:ANACONDA_MAN:LUNG -CREATURE:ANACONDA_MAN:HEART -CREATURE:ANACONDA_MAN:LIVER -CREATURE:ANACONDA_MAN:GUT -CREATURE:ANACONDA_MAN:STOMACH -CREATURE:ANACONDA_MAN:GIZZARD -CREATURE:ANACONDA_MAN:PANCREAS -CREATURE:ANACONDA_MAN:SPLEEN -CREATURE:ANACONDA_MAN:KIDNEY -CREATURE:GIANT_ANACONDA:MUSCLE -CREATURE:GIANT_ANACONDA:EYE -CREATURE:GIANT_ANACONDA:BRAIN -CREATURE:GIANT_ANACONDA:LUNG -CREATURE:GIANT_ANACONDA:HEART -CREATURE:GIANT_ANACONDA:LIVER -CREATURE:GIANT_ANACONDA:GUT -CREATURE:GIANT_ANACONDA:STOMACH -CREATURE:GIANT_ANACONDA:GIZZARD - CREATURE:GIANT_ANACONDA:PANCREAS -CREATURE:GIANT_ANACONDA:SPLEEN -CREATURE:GIANT_ANACONDA:KIDNEY -CREATURE:MONITOR_LIZARD:MUSCLE -CREATURE:MONITOR_LIZARD:EYE -CREATURE:MONITOR_LIZARD:BRAIN -CREATURE:MONITOR_LIZARD:LUNG -CREATURE:MONITOR_LIZARD:HEART -CREATURE:MONITOR_LIZARD:LIVER -CREATURE:MONITOR_LIZARD:GUT -CREATURE:MONITOR_LIZARD:STOMACH -CREATURE:MONITOR_LIZARD:GIZZARD - CREATURE:MONITOR_LIZARD:PANCREAS -CREATURE:MONITOR_LIZARD:SPLEEN -CREATURE:MONITOR_LIZARD:KIDNEY -"CREATURE:MONITOR_LIZARD_MAN:MUSCLE -CREATURE:MONITOR_LIZARD_MAN:EYE -!CREATURE:MONITOR_LIZARD_MAN:BRAIN - CREATURE:MONITOR_LIZARD_MAN:LUNG -!CREATURE:MONITOR_LIZARD_MAN:HEART -!CREATURE:MONITOR_LIZARD_MAN:LIVER -CREATURE:MONITOR_LIZARD_MAN:GUT -#CREATURE:MONITOR_LIZARD_MAN:STOMACH -#CREATURE:MONITOR_LIZARD_MAN:GIZZARD -$CREATURE:MONITOR_LIZARD_MAN:PANCREAS -"CREATURE:MONITOR_LIZARD_MAN:SPLEEN -"CREATURE:MONITOR_LIZARD_MAN:KIDNEY -$CREATURE:GIANT_MONITOR_LIZARD:MUSCLE -!CREATURE:GIANT_MONITOR_LIZARD:EYE -#CREATURE:GIANT_MONITOR_LIZARD:BRAIN -"CREATURE:GIANT_MONITOR_LIZARD:LUNG -#CREATURE:GIANT_MONITOR_LIZARD:HEART -#CREATURE:GIANT_MONITOR_LIZARD:LIVER -!CREATURE:GIANT_MONITOR_LIZARD:GUT -%CREATURE:GIANT_MONITOR_LIZARD:STOMACH -%CREATURE:GIANT_MONITOR_LIZARD:GIZZARD -&CREATURE:GIANT_MONITOR_LIZARD:PANCREAS -$CREATURE:GIANT_MONITOR_LIZARD:SPLEEN -$CREATURE:GIANT_MONITOR_LIZARD:KIDNEY -CREATURE:KING_COBRA:MUSCLE -CREATURE:KING_COBRA:EYE -CREATURE:KING_COBRA:BRAIN -CREATURE:KING_COBRA:LUNG -CREATURE:KING_COBRA:HEART -CREATURE:KING_COBRA:LIVER -CREATURE:KING_COBRA:GUT -CREATURE:KING_COBRA:STOMACH -CREATURE:KING_COBRA:GIZZARD -CREATURE:KING_COBRA:PANCREAS -CREATURE:KING_COBRA:SPLEEN -CREATURE:KING_COBRA:KIDNEY -CREATURE:KING_COBRA_MAN:MUSCLE -CREATURE:KING_COBRA_MAN:EYE -CREATURE:KING_COBRA_MAN:BRAIN -CREATURE:KING_COBRA_MAN:LUNG -CREATURE:KING_COBRA_MAN:HEART -CREATURE:KING_COBRA_MAN:LIVER -CREATURE:KING_COBRA_MAN:GUT -CREATURE:KING_COBRA_MAN:STOMACH -CREATURE:KING_COBRA_MAN:GIZZARD - CREATURE:KING_COBRA_MAN:PANCREAS -CREATURE:KING_COBRA_MAN:SPLEEN -CREATURE:KING_COBRA_MAN:KIDNEY - CREATURE:GIANT_KING_COBRA:MUSCLE -CREATURE:GIANT_KING_COBRA:EYE -CREATURE:GIANT_KING_COBRA:BRAIN -CREATURE:GIANT_KING_COBRA:LUNG -CREATURE:GIANT_KING_COBRA:HEART -CREATURE:GIANT_KING_COBRA:LIVER -CREATURE:GIANT_KING_COBRA:GUT -!CREATURE:GIANT_KING_COBRA:STOMACH -!CREATURE:GIANT_KING_COBRA:GIZZARD -"CREATURE:GIANT_KING_COBRA:PANCREAS - CREATURE:GIANT_KING_COBRA:SPLEEN - CREATURE:GIANT_KING_COBRA:KIDNEY -CREATURE:OCELOT:MUSCLE -CREATURE:OCELOT:EYE -CREATURE:OCELOT:BRAIN -CREATURE:OCELOT:LUNG -CREATURE:OCELOT:HEART -CREATURE:OCELOT:LIVER -CREATURE:OCELOT:GUT -CREATURE:OCELOT:STOMACH -CREATURE:OCELOT:GIZZARD -CREATURE:OCELOT:PANCREAS -CREATURE:OCELOT:SPLEEN -CREATURE:OCELOT:KIDNEY -CREATURE:OCELOT_MAN:MUSCLE -CREATURE:OCELOT_MAN:EYE -CREATURE:OCELOT_MAN:BRAIN -CREATURE:OCELOT_MAN:LUNG -CREATURE:OCELOT_MAN:HEART -CREATURE:OCELOT_MAN:LIVER -CREATURE:OCELOT_MAN:GUT -CREATURE:OCELOT_MAN:STOMACH -CREATURE:OCELOT_MAN:GIZZARD -CREATURE:OCELOT_MAN:PANCREAS -CREATURE:OCELOT_MAN:SPLEEN -CREATURE:OCELOT_MAN:KIDNEY -CREATURE:GIANT_OCELOT:MUSCLE -CREATURE:GIANT_OCELOT:EYE -CREATURE:GIANT_OCELOT:BRAIN -CREATURE:GIANT_OCELOT:LUNG -CREATURE:GIANT_OCELOT:HEART -CREATURE:GIANT_OCELOT:LIVER -CREATURE:GIANT_OCELOT:GUT -CREATURE:GIANT_OCELOT:STOMACH -CREATURE:GIANT_OCELOT:GIZZARD -CREATURE:GIANT_OCELOT:PANCREAS -CREATURE:GIANT_OCELOT:SPLEEN -CREATURE:GIANT_OCELOT:KIDNEY -CREATURE:JACKAL:MUSCLE -CREATURE:JACKAL:EYE -CREATURE:JACKAL:BRAIN -CREATURE:JACKAL:LUNG -CREATURE:JACKAL:HEART -CREATURE:JACKAL:LIVER -CREATURE:JACKAL:GUT -CREATURE:JACKAL:STOMACH -CREATURE:JACKAL:GIZZARD -CREATURE:JACKAL:PANCREAS -CREATURE:JACKAL:SPLEEN -CREATURE:JACKAL:KIDNEY -CREATURE:JACKAL_MAN:MUSCLE -CREATURE:JACKAL_MAN:EYE -CREATURE:JACKAL_MAN:BRAIN -CREATURE:JACKAL_MAN:LUNG -CREATURE:JACKAL_MAN:HEART -CREATURE:JACKAL_MAN:LIVER -CREATURE:JACKAL_MAN:GUT -CREATURE:JACKAL_MAN:STOMACH -CREATURE:JACKAL_MAN:GIZZARD -CREATURE:JACKAL_MAN:PANCREAS -CREATURE:JACKAL_MAN:SPLEEN -CREATURE:JACKAL_MAN:KIDNEY -CREATURE:GIANT_JACKAL:MUSCLE -CREATURE:GIANT_JACKAL:EYE -CREATURE:GIANT_JACKAL:BRAIN -CREATURE:GIANT_JACKAL:LUNG -CREATURE:GIANT_JACKAL:HEART -CREATURE:GIANT_JACKAL:LIVER -CREATURE:GIANT_JACKAL:GUT -CREATURE:GIANT_JACKAL:STOMACH -CREATURE:GIANT_JACKAL:GIZZARD -CREATURE:GIANT_JACKAL:PANCREAS -CREATURE:GIANT_JACKAL:SPLEEN -CREATURE:GIANT_JACKAL:KIDNEY -CREATURE:CAPUCHIN:MUSCLE -CREATURE:CAPUCHIN:EYE -CREATURE:CAPUCHIN:BRAIN -CREATURE:CAPUCHIN:LUNG -CREATURE:CAPUCHIN:HEART -CREATURE:CAPUCHIN:LIVER -CREATURE:CAPUCHIN:GUT -CREATURE:CAPUCHIN:STOMACH -CREATURE:CAPUCHIN:GIZZARD -CREATURE:CAPUCHIN:PANCREAS -CREATURE:CAPUCHIN:SPLEEN -CREATURE:CAPUCHIN:KIDNEY -CREATURE:CAPUCHIN_MAN:MUSCLE -CREATURE:CAPUCHIN_MAN:EYE -CREATURE:CAPUCHIN_MAN:BRAIN -CREATURE:CAPUCHIN_MAN:LUNG -CREATURE:CAPUCHIN_MAN:HEART -CREATURE:CAPUCHIN_MAN:LIVER -CREATURE:CAPUCHIN_MAN:GUT -CREATURE:CAPUCHIN_MAN:STOMACH -CREATURE:CAPUCHIN_MAN:GIZZARD -CREATURE:CAPUCHIN_MAN:PANCREAS -CREATURE:CAPUCHIN_MAN:SPLEEN -CREATURE:CAPUCHIN_MAN:KIDNEY -CREATURE:GIANT_CAPUCHIN:MUSCLE -CREATURE:GIANT_CAPUCHIN:EYE -CREATURE:GIANT_CAPUCHIN:BRAIN -CREATURE:GIANT_CAPUCHIN:LUNG -CREATURE:GIANT_CAPUCHIN:HEART -CREATURE:GIANT_CAPUCHIN:LIVER -CREATURE:GIANT_CAPUCHIN:GUT -CREATURE:GIANT_CAPUCHIN:STOMACH -CREATURE:GIANT_CAPUCHIN:GIZZARD - CREATURE:GIANT_CAPUCHIN:PANCREAS -CREATURE:GIANT_CAPUCHIN:SPLEEN -CREATURE:GIANT_CAPUCHIN:KIDNEY -CREATURE:SLOTH:MUSCLE -CREATURE:SLOTH:EYE -CREATURE:SLOTH:BRAIN -CREATURE:SLOTH:LUNG -CREATURE:SLOTH:HEART -CREATURE:SLOTH:LIVER -CREATURE:SLOTH:GUT -CREATURE:SLOTH:STOMACH -CREATURE:SLOTH:GIZZARD -CREATURE:SLOTH:PANCREAS -CREATURE:SLOTH:SPLEEN -CREATURE:SLOTH:KIDNEY -CREATURE:SLOTH_MAN:MUSCLE -CREATURE:SLOTH_MAN:EYE -CREATURE:SLOTH_MAN:BRAIN -CREATURE:SLOTH_MAN:LUNG -CREATURE:SLOTH_MAN:HEART -CREATURE:SLOTH_MAN:LIVER -CREATURE:SLOTH_MAN:GUT -CREATURE:SLOTH_MAN:STOMACH -CREATURE:SLOTH_MAN:GIZZARD -CREATURE:SLOTH_MAN:PANCREAS -CREATURE:SLOTH_MAN:SPLEEN -CREATURE:SLOTH_MAN:KIDNEY -CREATURE:GIANT_SLOTH:MUSCLE -CREATURE:GIANT_SLOTH:EYE -CREATURE:GIANT_SLOTH:BRAIN -CREATURE:GIANT_SLOTH:LUNG -CREATURE:GIANT_SLOTH:HEART -CREATURE:GIANT_SLOTH:LIVER -CREATURE:GIANT_SLOTH:GUT -CREATURE:GIANT_SLOTH:STOMACH -CREATURE:GIANT_SLOTH:GIZZARD -CREATURE:GIANT_SLOTH:PANCREAS -CREATURE:GIANT_SLOTH:SPLEEN -CREATURE:GIANT_SLOTH:KIDNEY -CREATURE:SPIDER_MONKEY:MUSCLE -CREATURE:SPIDER_MONKEY:EYE -CREATURE:SPIDER_MONKEY:BRAIN -CREATURE:SPIDER_MONKEY:LUNG -CREATURE:SPIDER_MONKEY:HEART -CREATURE:SPIDER_MONKEY:LIVER -CREATURE:SPIDER_MONKEY:GUT -CREATURE:SPIDER_MONKEY:STOMACH -CREATURE:SPIDER_MONKEY:GIZZARD -CREATURE:SPIDER_MONKEY:PANCREAS -CREATURE:SPIDER_MONKEY:SPLEEN -CREATURE:SPIDER_MONKEY:KIDNEY -!CREATURE:SPIDER_MONKEY_MAN:MUSCLE -CREATURE:SPIDER_MONKEY_MAN:EYE - CREATURE:SPIDER_MONKEY_MAN:BRAIN -CREATURE:SPIDER_MONKEY_MAN:LUNG - CREATURE:SPIDER_MONKEY_MAN:HEART - CREATURE:SPIDER_MONKEY_MAN:LIVER -CREATURE:SPIDER_MONKEY_MAN:GUT -"CREATURE:SPIDER_MONKEY_MAN:STOMACH -"CREATURE:SPIDER_MONKEY_MAN:GIZZARD -#CREATURE:SPIDER_MONKEY_MAN:PANCREAS -!CREATURE:SPIDER_MONKEY_MAN:SPLEEN -!CREATURE:SPIDER_MONKEY_MAN:KIDNEY -#CREATURE:GIANT_SPIDER_MONKEY:MUSCLE - CREATURE:GIANT_SPIDER_MONKEY:EYE -"CREATURE:GIANT_SPIDER_MONKEY:BRAIN -!CREATURE:GIANT_SPIDER_MONKEY:LUNG -"CREATURE:GIANT_SPIDER_MONKEY:HEART -"CREATURE:GIANT_SPIDER_MONKEY:LIVER - CREATURE:GIANT_SPIDER_MONKEY:GUT -$CREATURE:GIANT_SPIDER_MONKEY:STOMACH -$CREATURE:GIANT_SPIDER_MONKEY:GIZZARD -%CREATURE:GIANT_SPIDER_MONKEY:PANCREAS -#CREATURE:GIANT_SPIDER_MONKEY:SPLEEN -#CREATURE:GIANT_SPIDER_MONKEY:KIDNEY -CREATURE:PANGOLIN:MUSCLE -CREATURE:PANGOLIN:EYE -CREATURE:PANGOLIN:BRAIN -CREATURE:PANGOLIN:LUNG -CREATURE:PANGOLIN:HEART -CREATURE:PANGOLIN:LIVER -CREATURE:PANGOLIN:GUT -CREATURE:PANGOLIN:STOMACH -CREATURE:PANGOLIN:GIZZARD -CREATURE:PANGOLIN:PANCREAS -CREATURE:PANGOLIN:SPLEEN -CREATURE:PANGOLIN:KIDNEY -CREATURE:PANGOLIN_MAN:MUSCLE -CREATURE:PANGOLIN_MAN:EYE -CREATURE:PANGOLIN_MAN:BRAIN -CREATURE:PANGOLIN_MAN:LUNG -CREATURE:PANGOLIN_MAN:HEART -CREATURE:PANGOLIN_MAN:LIVER -CREATURE:PANGOLIN_MAN:GUT -CREATURE:PANGOLIN_MAN:STOMACH -CREATURE:PANGOLIN_MAN:GIZZARD -CREATURE:PANGOLIN_MAN:PANCREAS -CREATURE:PANGOLIN_MAN:SPLEEN -CREATURE:PANGOLIN_MAN:KIDNEY -CREATURE:GIANT_PANGOLIN:MUSCLE -CREATURE:GIANT_PANGOLIN:EYE -CREATURE:GIANT_PANGOLIN:BRAIN -CREATURE:GIANT_PANGOLIN:LUNG -CREATURE:GIANT_PANGOLIN:HEART -CREATURE:GIANT_PANGOLIN:LIVER -CREATURE:GIANT_PANGOLIN:GUT -CREATURE:GIANT_PANGOLIN:STOMACH -CREATURE:GIANT_PANGOLIN:GIZZARD - CREATURE:GIANT_PANGOLIN:PANCREAS -CREATURE:GIANT_PANGOLIN:SPLEEN -CREATURE:GIANT_PANGOLIN:KIDNEY -CREATURE:BLACK_MAMBA:MUSCLE -CREATURE:BLACK_MAMBA:EYE -CREATURE:BLACK_MAMBA:BRAIN -CREATURE:BLACK_MAMBA:LUNG -CREATURE:BLACK_MAMBA:HEART -CREATURE:BLACK_MAMBA:LIVER -CREATURE:BLACK_MAMBA:GUT -CREATURE:BLACK_MAMBA:STOMACH -CREATURE:BLACK_MAMBA:GIZZARD -CREATURE:BLACK_MAMBA:PANCREAS -CREATURE:BLACK_MAMBA:SPLEEN -CREATURE:BLACK_MAMBA:KIDNEY -CREATURE:BLACK_MAMBA_MAN:MUSCLE -CREATURE:BLACK_MAMBA_MAN:EYE -CREATURE:BLACK_MAMBA_MAN:BRAIN -CREATURE:BLACK_MAMBA_MAN:LUNG -CREATURE:BLACK_MAMBA_MAN:HEART -CREATURE:BLACK_MAMBA_MAN:LIVER -CREATURE:BLACK_MAMBA_MAN:GUT - CREATURE:BLACK_MAMBA_MAN:STOMACH - CREATURE:BLACK_MAMBA_MAN:GIZZARD -!CREATURE:BLACK_MAMBA_MAN:PANCREAS -CREATURE:BLACK_MAMBA_MAN:SPLEEN -CREATURE:BLACK_MAMBA_MAN:KIDNEY -!CREATURE:GIANT_BLACK_MAMBA:MUSCLE -CREATURE:GIANT_BLACK_MAMBA:EYE - CREATURE:GIANT_BLACK_MAMBA:BRAIN -CREATURE:GIANT_BLACK_MAMBA:LUNG - CREATURE:GIANT_BLACK_MAMBA:HEART - CREATURE:GIANT_BLACK_MAMBA:LIVER -CREATURE:GIANT_BLACK_MAMBA:GUT -"CREATURE:GIANT_BLACK_MAMBA:STOMACH -"CREATURE:GIANT_BLACK_MAMBA:GIZZARD -#CREATURE:GIANT_BLACK_MAMBA:PANCREAS -!CREATURE:GIANT_BLACK_MAMBA:SPLEEN -!CREATURE:GIANT_BLACK_MAMBA:KIDNEY -CREATURE:BEAR_SLOTH:MUSCLE -CREATURE:BEAR_SLOTH:EYE -CREATURE:BEAR_SLOTH:BRAIN -CREATURE:BEAR_SLOTH:LUNG -CREATURE:BEAR_SLOTH:HEART -CREATURE:BEAR_SLOTH:LIVER -CREATURE:BEAR_SLOTH:GUT -CREATURE:BEAR_SLOTH:STOMACH -CREATURE:BEAR_SLOTH:GIZZARD -CREATURE:BEAR_SLOTH:PANCREAS -CREATURE:BEAR_SLOTH:SPLEEN -CREATURE:BEAR_SLOTH:KIDNEY -CREATURE:SLOTH_BEAR_MAN:MUSCLE -CREATURE:SLOTH_BEAR_MAN:EYE -CREATURE:SLOTH_BEAR_MAN:BRAIN -CREATURE:SLOTH_BEAR_MAN:LUNG -CREATURE:SLOTH_BEAR_MAN:HEART -CREATURE:SLOTH_BEAR_MAN:LIVER -CREATURE:SLOTH_BEAR_MAN:GUT -CREATURE:SLOTH_BEAR_MAN:STOMACH -CREATURE:SLOTH_BEAR_MAN:GIZZARD - CREATURE:SLOTH_BEAR_MAN:PANCREAS -CREATURE:SLOTH_BEAR_MAN:SPLEEN -CREATURE:SLOTH_BEAR_MAN:KIDNEY - CREATURE:GIANT_SLOTH_BEAR:MUSCLE -CREATURE:GIANT_SLOTH_BEAR:EYE -CREATURE:GIANT_SLOTH_BEAR:BRAIN -CREATURE:GIANT_SLOTH_BEAR:LUNG -CREATURE:GIANT_SLOTH_BEAR:HEART -CREATURE:GIANT_SLOTH_BEAR:LIVER -CREATURE:GIANT_SLOTH_BEAR:GUT -!CREATURE:GIANT_SLOTH_BEAR:STOMACH -!CREATURE:GIANT_SLOTH_BEAR:GIZZARD -"CREATURE:GIANT_SLOTH_BEAR:PANCREAS - CREATURE:GIANT_SLOTH_BEAR:SPLEEN - CREATURE:GIANT_SLOTH_BEAR:KIDNEY -CREATURE:AYE-AYE:MUSCLE -CREATURE:AYE-AYE:EYE -CREATURE:AYE-AYE:BRAIN -CREATURE:AYE-AYE:LUNG -CREATURE:AYE-AYE:HEART -CREATURE:AYE-AYE:LIVER -CREATURE:AYE-AYE:GUT -CREATURE:AYE-AYE:STOMACH -CREATURE:AYE-AYE:GIZZARD -CREATURE:AYE-AYE:PANCREAS -CREATURE:AYE-AYE:SPLEEN -CREATURE:AYE-AYE:KIDNEY -CREATURE:AYE-AYE_MAN:MUSCLE -CREATURE:AYE-AYE_MAN:EYE -CREATURE:AYE-AYE_MAN:BRAIN -CREATURE:AYE-AYE_MAN:LUNG -CREATURE:AYE-AYE_MAN:HEART -CREATURE:AYE-AYE_MAN:LIVER -CREATURE:AYE-AYE_MAN:GUT -CREATURE:AYE-AYE_MAN:STOMACH -CREATURE:AYE-AYE_MAN:GIZZARD -CREATURE:AYE-AYE_MAN:PANCREAS -CREATURE:AYE-AYE_MAN:SPLEEN -CREATURE:AYE-AYE_MAN:KIDNEY -CREATURE:GIANT_AYE-AYE:MUSCLE -CREATURE:GIANT_AYE-AYE:EYE -CREATURE:GIANT_AYE-AYE:BRAIN -CREATURE:GIANT_AYE-AYE:LUNG -CREATURE:GIANT_AYE-AYE:HEART -CREATURE:GIANT_AYE-AYE:LIVER -CREATURE:GIANT_AYE-AYE:GUT -CREATURE:GIANT_AYE-AYE:STOMACH -CREATURE:GIANT_AYE-AYE:GIZZARD -CREATURE:GIANT_AYE-AYE:PANCREAS -CREATURE:GIANT_AYE-AYE:SPLEEN -CREATURE:GIANT_AYE-AYE:KIDNEY -CREATURE:BUSHMASTER:MUSCLE -CREATURE:BUSHMASTER:EYE -CREATURE:BUSHMASTER:BRAIN -CREATURE:BUSHMASTER:LUNG -CREATURE:BUSHMASTER:HEART -CREATURE:BUSHMASTER:LIVER -CREATURE:BUSHMASTER:GUT -CREATURE:BUSHMASTER:STOMACH -CREATURE:BUSHMASTER:GIZZARD -CREATURE:BUSHMASTER:PANCREAS -CREATURE:BUSHMASTER:SPLEEN -CREATURE:BUSHMASTER:KIDNEY -CREATURE:BUSHMASTER_MAN:MUSCLE -CREATURE:BUSHMASTER_MAN:EYE -CREATURE:BUSHMASTER_MAN:BRAIN -CREATURE:BUSHMASTER_MAN:LUNG -CREATURE:BUSHMASTER_MAN:HEART -CREATURE:BUSHMASTER_MAN:LIVER -CREATURE:BUSHMASTER_MAN:GUT -CREATURE:BUSHMASTER_MAN:STOMACH -CREATURE:BUSHMASTER_MAN:GIZZARD - CREATURE:BUSHMASTER_MAN:PANCREAS -CREATURE:BUSHMASTER_MAN:SPLEEN -CREATURE:BUSHMASTER_MAN:KIDNEY - CREATURE:GIANT_BUSHMASTER:MUSCLE -CREATURE:GIANT_BUSHMASTER:EYE -CREATURE:GIANT_BUSHMASTER:BRAIN -CREATURE:GIANT_BUSHMASTER:LUNG -CREATURE:GIANT_BUSHMASTER:HEART -CREATURE:GIANT_BUSHMASTER:LIVER -CREATURE:GIANT_BUSHMASTER:GUT -!CREATURE:GIANT_BUSHMASTER:STOMACH -!CREATURE:GIANT_BUSHMASTER:GIZZARD -"CREATURE:GIANT_BUSHMASTER:PANCREAS - CREATURE:GIANT_BUSHMASTER:SPLEEN - CREATURE:GIANT_BUSHMASTER:KIDNEY -CREATURE:PYTHON:MUSCLE -CREATURE:PYTHON:EYE -CREATURE:PYTHON:BRAIN -CREATURE:PYTHON:LUNG -CREATURE:PYTHON:HEART -CREATURE:PYTHON:LIVER -CREATURE:PYTHON:GUT -CREATURE:PYTHON:STOMACH -CREATURE:PYTHON:GIZZARD -CREATURE:PYTHON:PANCREAS -CREATURE:PYTHON:SPLEEN -CREATURE:PYTHON:KIDNEY -CREATURE:PYTHON_MAN:MUSCLE -CREATURE:PYTHON_MAN:EYE -CREATURE:PYTHON_MAN:BRAIN -CREATURE:PYTHON_MAN:LUNG -CREATURE:PYTHON_MAN:HEART -CREATURE:PYTHON_MAN:LIVER -CREATURE:PYTHON_MAN:GUT -CREATURE:PYTHON_MAN:STOMACH -CREATURE:PYTHON_MAN:GIZZARD -CREATURE:PYTHON_MAN:PANCREAS -CREATURE:PYTHON_MAN:SPLEEN -CREATURE:PYTHON_MAN:KIDNEY -CREATURE:GIANT_PYTHON:MUSCLE -CREATURE:GIANT_PYTHON:EYE -CREATURE:GIANT_PYTHON:BRAIN -CREATURE:GIANT_PYTHON:LUNG -CREATURE:GIANT_PYTHON:HEART -CREATURE:GIANT_PYTHON:LIVER -CREATURE:GIANT_PYTHON:GUT -CREATURE:GIANT_PYTHON:STOMACH -CREATURE:GIANT_PYTHON:GIZZARD -CREATURE:GIANT_PYTHON:PANCREAS -CREATURE:GIANT_PYTHON:SPLEEN -CREATURE:GIANT_PYTHON:KIDNEY -CREATURE:TAPIR:MUSCLE -CREATURE:TAPIR:EYE -CREATURE:TAPIR:BRAIN -CREATURE:TAPIR:LUNG -CREATURE:TAPIR:HEART -CREATURE:TAPIR:LIVER -CREATURE:TAPIR:GUT -CREATURE:TAPIR:STOMACH -CREATURE:TAPIR:GIZZARD -CREATURE:TAPIR:PANCREAS -CREATURE:TAPIR:SPLEEN -CREATURE:TAPIR:KIDNEY -CREATURE:TAPIR_MAN:MUSCLE -CREATURE:TAPIR_MAN:EYE -CREATURE:TAPIR_MAN:BRAIN -CREATURE:TAPIR_MAN:LUNG -CREATURE:TAPIR_MAN:HEART -CREATURE:TAPIR_MAN:LIVER -CREATURE:TAPIR_MAN:GUT -CREATURE:TAPIR_MAN:STOMACH -CREATURE:TAPIR_MAN:GIZZARD -CREATURE:TAPIR_MAN:PANCREAS -CREATURE:TAPIR_MAN:SPLEEN -CREATURE:TAPIR_MAN:KIDNEY -CREATURE:GIANT_TAPIR:MUSCLE -CREATURE:GIANT_TAPIR:EYE -CREATURE:GIANT_TAPIR:BRAIN -CREATURE:GIANT_TAPIR:LUNG -CREATURE:GIANT_TAPIR:HEART -CREATURE:GIANT_TAPIR:LIVER -CREATURE:GIANT_TAPIR:GUT -CREATURE:GIANT_TAPIR:STOMACH -CREATURE:GIANT_TAPIR:GIZZARD -CREATURE:GIANT_TAPIR:PANCREAS -CREATURE:GIANT_TAPIR:SPLEEN -CREATURE:GIANT_TAPIR:KIDNEY -CREATURE:IMPALA:MUSCLE -CREATURE:IMPALA:EYE -CREATURE:IMPALA:BRAIN -CREATURE:IMPALA:LUNG -CREATURE:IMPALA:HEART -CREATURE:IMPALA:LIVER -CREATURE:IMPALA:GUT -CREATURE:IMPALA:STOMACH -CREATURE:IMPALA:GIZZARD -CREATURE:IMPALA:PANCREAS -CREATURE:IMPALA:SPLEEN -CREATURE:IMPALA:KIDNEY -CREATURE:IMPALA_MAN:MUSCLE -CREATURE:IMPALA_MAN:EYE -CREATURE:IMPALA_MAN:BRAIN -CREATURE:IMPALA_MAN:LUNG -CREATURE:IMPALA_MAN:HEART -CREATURE:IMPALA_MAN:LIVER -CREATURE:IMPALA_MAN:GUT -CREATURE:IMPALA_MAN:STOMACH -CREATURE:IMPALA_MAN:GIZZARD -CREATURE:IMPALA_MAN:PANCREAS -CREATURE:IMPALA_MAN:SPLEEN -CREATURE:IMPALA_MAN:KIDNEY -CREATURE:GIANT_IMPALA:MUSCLE -CREATURE:GIANT_IMPALA:EYE -CREATURE:GIANT_IMPALA:BRAIN -CREATURE:GIANT_IMPALA:LUNG -CREATURE:GIANT_IMPALA:HEART -CREATURE:GIANT_IMPALA:LIVER -CREATURE:GIANT_IMPALA:GUT -CREATURE:GIANT_IMPALA:STOMACH -CREATURE:GIANT_IMPALA:GIZZARD -CREATURE:GIANT_IMPALA:PANCREAS -CREATURE:GIANT_IMPALA:SPLEEN -CREATURE:GIANT_IMPALA:KIDNEY -CREATURE:AARDVARK:MUSCLE -CREATURE:AARDVARK:EYE -CREATURE:AARDVARK:BRAIN -CREATURE:AARDVARK:LUNG -CREATURE:AARDVARK:HEART -CREATURE:AARDVARK:LIVER -CREATURE:AARDVARK:GUT -CREATURE:AARDVARK:STOMACH -CREATURE:AARDVARK:GIZZARD -CREATURE:AARDVARK:PANCREAS -CREATURE:AARDVARK:SPLEEN -CREATURE:AARDVARK:KIDNEY -CREATURE:AARDVARK_MAN:MUSCLE -CREATURE:AARDVARK_MAN:EYE -CREATURE:AARDVARK_MAN:BRAIN -CREATURE:AARDVARK_MAN:LUNG -CREATURE:AARDVARK_MAN:HEART -CREATURE:AARDVARK_MAN:LIVER -CREATURE:AARDVARK_MAN:GUT -CREATURE:AARDVARK_MAN:STOMACH -CREATURE:AARDVARK_MAN:GIZZARD -CREATURE:AARDVARK_MAN:PANCREAS -CREATURE:AARDVARK_MAN:SPLEEN -CREATURE:AARDVARK_MAN:KIDNEY -CREATURE:GIANT_AARDVARK:MUSCLE -CREATURE:GIANT_AARDVARK:EYE -CREATURE:GIANT_AARDVARK:BRAIN -CREATURE:GIANT_AARDVARK:LUNG -CREATURE:GIANT_AARDVARK:HEART -CREATURE:GIANT_AARDVARK:LIVER -CREATURE:GIANT_AARDVARK:GUT -CREATURE:GIANT_AARDVARK:STOMACH -CREATURE:GIANT_AARDVARK:GIZZARD - CREATURE:GIANT_AARDVARK:PANCREAS -CREATURE:GIANT_AARDVARK:SPLEEN -CREATURE:GIANT_AARDVARK:KIDNEY -CREATURE:LION_TAMARIN:MUSCLE -CREATURE:LION_TAMARIN:EYE -CREATURE:LION_TAMARIN:BRAIN -CREATURE:LION_TAMARIN:LUNG -CREATURE:LION_TAMARIN:HEART -CREATURE:LION_TAMARIN:LIVER -CREATURE:LION_TAMARIN:GUT -CREATURE:LION_TAMARIN:STOMACH -CREATURE:LION_TAMARIN:GIZZARD -CREATURE:LION_TAMARIN:PANCREAS -CREATURE:LION_TAMARIN:SPLEEN -CREATURE:LION_TAMARIN:KIDNEY - CREATURE:LION_TAMARIN_MAN:MUSCLE -CREATURE:LION_TAMARIN_MAN:EYE -CREATURE:LION_TAMARIN_MAN:BRAIN -CREATURE:LION_TAMARIN_MAN:LUNG -CREATURE:LION_TAMARIN_MAN:HEART -CREATURE:LION_TAMARIN_MAN:LIVER -CREATURE:LION_TAMARIN_MAN:GUT -!CREATURE:LION_TAMARIN_MAN:STOMACH -!CREATURE:LION_TAMARIN_MAN:GIZZARD -"CREATURE:LION_TAMARIN_MAN:PANCREAS - CREATURE:LION_TAMARIN_MAN:SPLEEN - CREATURE:LION_TAMARIN_MAN:KIDNEY -"CREATURE:GIANT_LION_TAMARIN:MUSCLE -CREATURE:GIANT_LION_TAMARIN:EYE -!CREATURE:GIANT_LION_TAMARIN:BRAIN - CREATURE:GIANT_LION_TAMARIN:LUNG -!CREATURE:GIANT_LION_TAMARIN:HEART -!CREATURE:GIANT_LION_TAMARIN:LIVER -CREATURE:GIANT_LION_TAMARIN:GUT -#CREATURE:GIANT_LION_TAMARIN:STOMACH -#CREATURE:GIANT_LION_TAMARIN:GIZZARD -$CREATURE:GIANT_LION_TAMARIN:PANCREAS -"CREATURE:GIANT_LION_TAMARIN:SPLEEN -"CREATURE:GIANT_LION_TAMARIN:KIDNEY -CREATURE:STOAT:MUSCLE -CREATURE:STOAT:EYE -CREATURE:STOAT:BRAIN -CREATURE:STOAT:LUNG -CREATURE:STOAT:HEART -CREATURE:STOAT:LIVER -CREATURE:STOAT:GUT -CREATURE:STOAT:STOMACH -CREATURE:STOAT:GIZZARD -CREATURE:STOAT:PANCREAS -CREATURE:STOAT:SPLEEN -CREATURE:STOAT:KIDNEY -CREATURE:STOAT_MAN:MUSCLE -CREATURE:STOAT_MAN:EYE -CREATURE:STOAT_MAN:BRAIN -CREATURE:STOAT_MAN:LUNG -CREATURE:STOAT_MAN:HEART -CREATURE:STOAT_MAN:LIVER -CREATURE:STOAT_MAN:GUT -CREATURE:STOAT_MAN:STOMACH -CREATURE:STOAT_MAN:GIZZARD -CREATURE:STOAT_MAN:PANCREAS -CREATURE:STOAT_MAN:SPLEEN -CREATURE:STOAT_MAN:KIDNEY -CREATURE:GIANT_STOAT:MUSCLE -CREATURE:GIANT_STOAT:EYE -CREATURE:GIANT_STOAT:BRAIN -CREATURE:GIANT_STOAT:LUNG -CREATURE:GIANT_STOAT:HEART -CREATURE:GIANT_STOAT:LIVER -CREATURE:GIANT_STOAT:GUT -CREATURE:GIANT_STOAT:STOMACH -CREATURE:GIANT_STOAT:GIZZARD -CREATURE:GIANT_STOAT:PANCREAS -CREATURE:GIANT_STOAT:SPLEEN -CREATURE:GIANT_STOAT:KIDNEY -CREATURE:LYNX:MUSCLE -CREATURE:LYNX:EYE -CREATURE:LYNX:BRAIN -CREATURE:LYNX:LUNG -CREATURE:LYNX:HEART -CREATURE:LYNX:LIVER -CREATURE:LYNX:GUT -CREATURE:LYNX:STOMACH -CREATURE:LYNX:GIZZARD -CREATURE:LYNX:PANCREAS -CREATURE:LYNX:SPLEEN -CREATURE:LYNX:KIDNEY -CREATURE:LYNX_MAN:MUSCLE -CREATURE:LYNX_MAN:EYE -CREATURE:LYNX_MAN:BRAIN -CREATURE:LYNX_MAN:LUNG -CREATURE:LYNX_MAN:HEART -CREATURE:LYNX_MAN:LIVER -CREATURE:LYNX_MAN:GUT -CREATURE:LYNX_MAN:STOMACH -CREATURE:LYNX_MAN:GIZZARD -CREATURE:LYNX_MAN:PANCREAS -CREATURE:LYNX_MAN:SPLEEN -CREATURE:LYNX_MAN:KIDNEY -CREATURE:GIANT_LYNX:MUSCLE -CREATURE:GIANT_LYNX:EYE -CREATURE:GIANT_LYNX:BRAIN -CREATURE:GIANT_LYNX:LUNG -CREATURE:GIANT_LYNX:HEART -CREATURE:GIANT_LYNX:LIVER -CREATURE:GIANT_LYNX:GUT -CREATURE:GIANT_LYNX:STOMACH -CREATURE:GIANT_LYNX:GIZZARD -CREATURE:GIANT_LYNX:PANCREAS -CREATURE:GIANT_LYNX:SPLEEN -CREATURE:GIANT_LYNX:KIDNEY -CREATURE:GNOLL:MUSCLE -CREATURE:GNOLL:EYE -CREATURE:GNOLL:BRAIN -CREATURE:GNOLL:LUNG -CREATURE:GNOLL:HEART -CREATURE:GNOLL:LIVER -CREATURE:GNOLL:GUT -CREATURE:GNOLL:STOMACH -CREATURE:GNOLL:GIZZARD -CREATURE:GNOLL:PANCREAS -CREATURE:GNOLL:SPLEEN -CREATURE:GNOLL:KIDNEY -CREATURE:NAGA:MUSCLE -CREATURE:NAGA:EYE -CREATURE:NAGA:BRAIN -CREATURE:NAGA:LUNG -CREATURE:NAGA:HEART -CREATURE:NAGA:LIVER -CREATURE:NAGA:GUT -CREATURE:NAGA:STOMACH -CREATURE:NAGA:GIZZARD -CREATURE:NAGA:PANCREAS -CREATURE:NAGA:SPLEEN -CREATURE:NAGA:KIDNEY -!CREATURE:FORGOTTEN_BEAST_2:MUSCLE -CREATURE:FORGOTTEN_BEAST_2:EYE - CREATURE:FORGOTTEN_BEAST_2:BRAIN -CREATURE:FORGOTTEN_BEAST_2:LUNG - CREATURE:FORGOTTEN_BEAST_2:HEART - CREATURE:FORGOTTEN_BEAST_2:LIVER -CREATURE:FORGOTTEN_BEAST_2:GUT -"CREATURE:FORGOTTEN_BEAST_2:STOMACH -"CREATURE:FORGOTTEN_BEAST_2:GIZZARD -#CREATURE:FORGOTTEN_BEAST_2:PANCREAS -!CREATURE:FORGOTTEN_BEAST_2:SPLEEN -!CREATURE:FORGOTTEN_BEAST_2:KIDNEY -!CREATURE:FORGOTTEN_BEAST_4:MUSCLE -CREATURE:FORGOTTEN_BEAST_4:EYE - CREATURE:FORGOTTEN_BEAST_4:BRAIN -CREATURE:FORGOTTEN_BEAST_4:LUNG - CREATURE:FORGOTTEN_BEAST_4:HEART - CREATURE:FORGOTTEN_BEAST_4:LIVER -CREATURE:FORGOTTEN_BEAST_4:GUT -"CREATURE:FORGOTTEN_BEAST_4:STOMACH -"CREATURE:FORGOTTEN_BEAST_4:GIZZARD -#CREATURE:FORGOTTEN_BEAST_4:PANCREAS -!CREATURE:FORGOTTEN_BEAST_4:SPLEEN -!CREATURE:FORGOTTEN_BEAST_4:KIDNEY -!CREATURE:FORGOTTEN_BEAST_5:MUSCLE -CREATURE:FORGOTTEN_BEAST_5:EYE - CREATURE:FORGOTTEN_BEAST_5:BRAIN -CREATURE:FORGOTTEN_BEAST_5:LUNG - CREATURE:FORGOTTEN_BEAST_5:HEART - CREATURE:FORGOTTEN_BEAST_5:LIVER -CREATURE:FORGOTTEN_BEAST_5:GUT -"CREATURE:FORGOTTEN_BEAST_5:STOMACH -"CREATURE:FORGOTTEN_BEAST_5:GIZZARD -#CREATURE:FORGOTTEN_BEAST_5:PANCREAS -!CREATURE:FORGOTTEN_BEAST_5:SPLEEN -!CREATURE:FORGOTTEN_BEAST_5:KIDNEY -!CREATURE:FORGOTTEN_BEAST_6:MUSCLE -CREATURE:FORGOTTEN_BEAST_6:EYE - CREATURE:FORGOTTEN_BEAST_6:BRAIN -CREATURE:FORGOTTEN_BEAST_6:LUNG - CREATURE:FORGOTTEN_BEAST_6:HEART - CREATURE:FORGOTTEN_BEAST_6:LIVER -CREATURE:FORGOTTEN_BEAST_6:GUT -"CREATURE:FORGOTTEN_BEAST_6:STOMACH -"CREATURE:FORGOTTEN_BEAST_6:GIZZARD -#CREATURE:FORGOTTEN_BEAST_6:PANCREAS -!CREATURE:FORGOTTEN_BEAST_6:SPLEEN -!CREATURE:FORGOTTEN_BEAST_6:KIDNEY -!CREATURE:FORGOTTEN_BEAST_7:MUSCLE -CREATURE:FORGOTTEN_BEAST_7:EYE - CREATURE:FORGOTTEN_BEAST_7:BRAIN -CREATURE:FORGOTTEN_BEAST_7:LUNG - CREATURE:FORGOTTEN_BEAST_7:HEART - CREATURE:FORGOTTEN_BEAST_7:LIVER -CREATURE:FORGOTTEN_BEAST_7:GUT -"CREATURE:FORGOTTEN_BEAST_7:STOMACH -"CREATURE:FORGOTTEN_BEAST_7:GIZZARD -#CREATURE:FORGOTTEN_BEAST_7:PANCREAS -!CREATURE:FORGOTTEN_BEAST_7:SPLEEN -!CREATURE:FORGOTTEN_BEAST_7:KIDNEY -"CREATURE:FORGOTTEN_BEAST_10:MUSCLE -CREATURE:FORGOTTEN_BEAST_10:EYE -!CREATURE:FORGOTTEN_BEAST_10:BRAIN - CREATURE:FORGOTTEN_BEAST_10:LUNG -!CREATURE:FORGOTTEN_BEAST_10:HEART -!CREATURE:FORGOTTEN_BEAST_10:LIVER -CREATURE:FORGOTTEN_BEAST_10:GUT -#CREATURE:FORGOTTEN_BEAST_10:STOMACH -#CREATURE:FORGOTTEN_BEAST_10:GIZZARD -$CREATURE:FORGOTTEN_BEAST_10:PANCREAS -"CREATURE:FORGOTTEN_BEAST_10:SPLEEN -"CREATURE:FORGOTTEN_BEAST_10:KIDNEY -"CREATURE:FORGOTTEN_BEAST_12:MUSCLE -CREATURE:FORGOTTEN_BEAST_12:EYE -!CREATURE:FORGOTTEN_BEAST_12:BRAIN - CREATURE:FORGOTTEN_BEAST_12:LUNG -!CREATURE:FORGOTTEN_BEAST_12:HEART -!CREATURE:FORGOTTEN_BEAST_12:LIVER -CREATURE:FORGOTTEN_BEAST_12:GUT -#CREATURE:FORGOTTEN_BEAST_12:STOMACH -#CREATURE:FORGOTTEN_BEAST_12:GIZZARD -$CREATURE:FORGOTTEN_BEAST_12:PANCREAS -"CREATURE:FORGOTTEN_BEAST_12:SPLEEN -"CREATURE:FORGOTTEN_BEAST_12:KIDNEY -"CREATURE:FORGOTTEN_BEAST_13:MUSCLE -CREATURE:FORGOTTEN_BEAST_13:EYE -!CREATURE:FORGOTTEN_BEAST_13:BRAIN - CREATURE:FORGOTTEN_BEAST_13:LUNG -!CREATURE:FORGOTTEN_BEAST_13:HEART -!CREATURE:FORGOTTEN_BEAST_13:LIVER -CREATURE:FORGOTTEN_BEAST_13:GUT -#CREATURE:FORGOTTEN_BEAST_13:STOMACH -#CREATURE:FORGOTTEN_BEAST_13:GIZZARD -$CREATURE:FORGOTTEN_BEAST_13:PANCREAS -"CREATURE:FORGOTTEN_BEAST_13:SPLEEN -"CREATURE:FORGOTTEN_BEAST_13:KIDNEY -"CREATURE:FORGOTTEN_BEAST_16:MUSCLE -CREATURE:FORGOTTEN_BEAST_16:EYE -!CREATURE:FORGOTTEN_BEAST_16:BRAIN - CREATURE:FORGOTTEN_BEAST_16:LUNG -!CREATURE:FORGOTTEN_BEAST_16:HEART -!CREATURE:FORGOTTEN_BEAST_16:LIVER -CREATURE:FORGOTTEN_BEAST_16:GUT -#CREATURE:FORGOTTEN_BEAST_16:STOMACH -#CREATURE:FORGOTTEN_BEAST_16:GIZZARD -$CREATURE:FORGOTTEN_BEAST_16:PANCREAS -"CREATURE:FORGOTTEN_BEAST_16:SPLEEN -"CREATURE:FORGOTTEN_BEAST_16:KIDNEY -"CREATURE:FORGOTTEN_BEAST_17:MUSCLE -CREATURE:FORGOTTEN_BEAST_17:EYE -!CREATURE:FORGOTTEN_BEAST_17:BRAIN - CREATURE:FORGOTTEN_BEAST_17:LUNG -!CREATURE:FORGOTTEN_BEAST_17:HEART -!CREATURE:FORGOTTEN_BEAST_17:LIVER -CREATURE:FORGOTTEN_BEAST_17:GUT -#CREATURE:FORGOTTEN_BEAST_17:STOMACH -#CREATURE:FORGOTTEN_BEAST_17:GIZZARD -$CREATURE:FORGOTTEN_BEAST_17:PANCREAS -"CREATURE:FORGOTTEN_BEAST_17:SPLEEN -"CREATURE:FORGOTTEN_BEAST_17:KIDNEY -"CREATURE:FORGOTTEN_BEAST_18:MUSCLE -CREATURE:FORGOTTEN_BEAST_18:EYE -!CREATURE:FORGOTTEN_BEAST_18:BRAIN - CREATURE:FORGOTTEN_BEAST_18:LUNG -!CREATURE:FORGOTTEN_BEAST_18:HEART -!CREATURE:FORGOTTEN_BEAST_18:LIVER -CREATURE:FORGOTTEN_BEAST_18:GUT -#CREATURE:FORGOTTEN_BEAST_18:STOMACH -#CREATURE:FORGOTTEN_BEAST_18:GIZZARD -$CREATURE:FORGOTTEN_BEAST_18:PANCREAS -"CREATURE:FORGOTTEN_BEAST_18:SPLEEN -"CREATURE:FORGOTTEN_BEAST_18:KIDNEY -"CREATURE:FORGOTTEN_BEAST_19:MUSCLE -CREATURE:FORGOTTEN_BEAST_19:EYE -!CREATURE:FORGOTTEN_BEAST_19:BRAIN - CREATURE:FORGOTTEN_BEAST_19:LUNG -!CREATURE:FORGOTTEN_BEAST_19:HEART -!CREATURE:FORGOTTEN_BEAST_19:LIVER -CREATURE:FORGOTTEN_BEAST_19:GUT -#CREATURE:FORGOTTEN_BEAST_19:STOMACH -#CREATURE:FORGOTTEN_BEAST_19:GIZZARD -$CREATURE:FORGOTTEN_BEAST_19:PANCREAS -"CREATURE:FORGOTTEN_BEAST_19:SPLEEN -"CREATURE:FORGOTTEN_BEAST_19:KIDNEY -"CREATURE:FORGOTTEN_BEAST_20:MUSCLE -CREATURE:FORGOTTEN_BEAST_20:EYE -!CREATURE:FORGOTTEN_BEAST_20:BRAIN - CREATURE:FORGOTTEN_BEAST_20:LUNG -!CREATURE:FORGOTTEN_BEAST_20:HEART -!CREATURE:FORGOTTEN_BEAST_20:LIVER -CREATURE:FORGOTTEN_BEAST_20:GUT -#CREATURE:FORGOTTEN_BEAST_20:STOMACH -#CREATURE:FORGOTTEN_BEAST_20:GIZZARD -$CREATURE:FORGOTTEN_BEAST_20:PANCREAS -"CREATURE:FORGOTTEN_BEAST_20:SPLEEN -"CREATURE:FORGOTTEN_BEAST_20:KIDNEY -"CREATURE:FORGOTTEN_BEAST_22:MUSCLE -CREATURE:FORGOTTEN_BEAST_22:EYE -!CREATURE:FORGOTTEN_BEAST_22:BRAIN - CREATURE:FORGOTTEN_BEAST_22:LUNG -!CREATURE:FORGOTTEN_BEAST_22:HEART -!CREATURE:FORGOTTEN_BEAST_22:LIVER -CREATURE:FORGOTTEN_BEAST_22:GUT -#CREATURE:FORGOTTEN_BEAST_22:STOMACH -#CREATURE:FORGOTTEN_BEAST_22:GIZZARD -$CREATURE:FORGOTTEN_BEAST_22:PANCREAS -"CREATURE:FORGOTTEN_BEAST_22:SPLEEN -"CREATURE:FORGOTTEN_BEAST_22:KIDNEY -"CREATURE:FORGOTTEN_BEAST_23:MUSCLE -CREATURE:FORGOTTEN_BEAST_23:EYE -!CREATURE:FORGOTTEN_BEAST_23:BRAIN - CREATURE:FORGOTTEN_BEAST_23:LUNG -!CREATURE:FORGOTTEN_BEAST_23:HEART -!CREATURE:FORGOTTEN_BEAST_23:LIVER -CREATURE:FORGOTTEN_BEAST_23:GUT -#CREATURE:FORGOTTEN_BEAST_23:STOMACH -#CREATURE:FORGOTTEN_BEAST_23:GIZZARD -$CREATURE:FORGOTTEN_BEAST_23:PANCREAS -"CREATURE:FORGOTTEN_BEAST_23:SPLEEN -"CREATURE:FORGOTTEN_BEAST_23:KIDNEY -"CREATURE:FORGOTTEN_BEAST_24:MUSCLE -CREATURE:FORGOTTEN_BEAST_24:EYE -!CREATURE:FORGOTTEN_BEAST_24:BRAIN - CREATURE:FORGOTTEN_BEAST_24:LUNG -!CREATURE:FORGOTTEN_BEAST_24:HEART -!CREATURE:FORGOTTEN_BEAST_24:LIVER -CREATURE:FORGOTTEN_BEAST_24:GUT -#CREATURE:FORGOTTEN_BEAST_24:STOMACH -#CREATURE:FORGOTTEN_BEAST_24:GIZZARD -$CREATURE:FORGOTTEN_BEAST_24:PANCREAS -"CREATURE:FORGOTTEN_BEAST_24:SPLEEN -"CREATURE:FORGOTTEN_BEAST_24:KIDNEY -"CREATURE:FORGOTTEN_BEAST_25:MUSCLE -CREATURE:FORGOTTEN_BEAST_25:EYE -!CREATURE:FORGOTTEN_BEAST_25:BRAIN - CREATURE:FORGOTTEN_BEAST_25:LUNG -!CREATURE:FORGOTTEN_BEAST_25:HEART -!CREATURE:FORGOTTEN_BEAST_25:LIVER -CREATURE:FORGOTTEN_BEAST_25:GUT -#CREATURE:FORGOTTEN_BEAST_25:STOMACH -#CREATURE:FORGOTTEN_BEAST_25:GIZZARD -$CREATURE:FORGOTTEN_BEAST_25:PANCREAS -"CREATURE:FORGOTTEN_BEAST_25:SPLEEN -"CREATURE:FORGOTTEN_BEAST_25:KIDNEY -"CREATURE:FORGOTTEN_BEAST_26:MUSCLE -CREATURE:FORGOTTEN_BEAST_26:EYE -!CREATURE:FORGOTTEN_BEAST_26:BRAIN - CREATURE:FORGOTTEN_BEAST_26:LUNG -!CREATURE:FORGOTTEN_BEAST_26:HEART -!CREATURE:FORGOTTEN_BEAST_26:LIVER -CREATURE:FORGOTTEN_BEAST_26:GUT -#CREATURE:FORGOTTEN_BEAST_26:STOMACH -#CREATURE:FORGOTTEN_BEAST_26:GIZZARD -$CREATURE:FORGOTTEN_BEAST_26:PANCREAS -"CREATURE:FORGOTTEN_BEAST_26:SPLEEN -"CREATURE:FORGOTTEN_BEAST_26:KIDNEY -"CREATURE:FORGOTTEN_BEAST_27:MUSCLE -CREATURE:FORGOTTEN_BEAST_27:EYE -!CREATURE:FORGOTTEN_BEAST_27:BRAIN - CREATURE:FORGOTTEN_BEAST_27:LUNG -!CREATURE:FORGOTTEN_BEAST_27:HEART -!CREATURE:FORGOTTEN_BEAST_27:LIVER -CREATURE:FORGOTTEN_BEAST_27:GUT -#CREATURE:FORGOTTEN_BEAST_27:STOMACH -#CREATURE:FORGOTTEN_BEAST_27:GIZZARD -$CREATURE:FORGOTTEN_BEAST_27:PANCREAS -"CREATURE:FORGOTTEN_BEAST_27:SPLEEN -"CREATURE:FORGOTTEN_BEAST_27:KIDNEY -"CREATURE:FORGOTTEN_BEAST_28:MUSCLE -CREATURE:FORGOTTEN_BEAST_28:EYE -!CREATURE:FORGOTTEN_BEAST_28:BRAIN - CREATURE:FORGOTTEN_BEAST_28:LUNG -!CREATURE:FORGOTTEN_BEAST_28:HEART -!CREATURE:FORGOTTEN_BEAST_28:LIVER -CREATURE:FORGOTTEN_BEAST_28:GUT -#CREATURE:FORGOTTEN_BEAST_28:STOMACH -#CREATURE:FORGOTTEN_BEAST_28:GIZZARD -$CREATURE:FORGOTTEN_BEAST_28:PANCREAS -"CREATURE:FORGOTTEN_BEAST_28:SPLEEN -"CREATURE:FORGOTTEN_BEAST_28:KIDNEY -"CREATURE:FORGOTTEN_BEAST_29:MUSCLE -CREATURE:FORGOTTEN_BEAST_29:EYE -!CREATURE:FORGOTTEN_BEAST_29:BRAIN - CREATURE:FORGOTTEN_BEAST_29:LUNG -!CREATURE:FORGOTTEN_BEAST_29:HEART -!CREATURE:FORGOTTEN_BEAST_29:LIVER -CREATURE:FORGOTTEN_BEAST_29:GUT -#CREATURE:FORGOTTEN_BEAST_29:STOMACH -#CREATURE:FORGOTTEN_BEAST_29:GIZZARD -$CREATURE:FORGOTTEN_BEAST_29:PANCREAS -"CREATURE:FORGOTTEN_BEAST_29:SPLEEN -"CREATURE:FORGOTTEN_BEAST_29:KIDNEY -"CREATURE:FORGOTTEN_BEAST_32:MUSCLE -CREATURE:FORGOTTEN_BEAST_32:EYE -!CREATURE:FORGOTTEN_BEAST_32:BRAIN - CREATURE:FORGOTTEN_BEAST_32:LUNG -!CREATURE:FORGOTTEN_BEAST_32:HEART -!CREATURE:FORGOTTEN_BEAST_32:LIVER -CREATURE:FORGOTTEN_BEAST_32:GUT -#CREATURE:FORGOTTEN_BEAST_32:STOMACH -#CREATURE:FORGOTTEN_BEAST_32:GIZZARD -$CREATURE:FORGOTTEN_BEAST_32:PANCREAS -"CREATURE:FORGOTTEN_BEAST_32:SPLEEN -"CREATURE:FORGOTTEN_BEAST_32:KIDNEY -"CREATURE:FORGOTTEN_BEAST_33:MUSCLE -CREATURE:FORGOTTEN_BEAST_33:EYE -!CREATURE:FORGOTTEN_BEAST_33:BRAIN - CREATURE:FORGOTTEN_BEAST_33:LUNG -!CREATURE:FORGOTTEN_BEAST_33:HEART -!CREATURE:FORGOTTEN_BEAST_33:LIVER -CREATURE:FORGOTTEN_BEAST_33:GUT -#CREATURE:FORGOTTEN_BEAST_33:STOMACH -#CREATURE:FORGOTTEN_BEAST_33:GIZZARD -$CREATURE:FORGOTTEN_BEAST_33:PANCREAS -"CREATURE:FORGOTTEN_BEAST_33:SPLEEN -"CREATURE:FORGOTTEN_BEAST_33:KIDNEY -"CREATURE:FORGOTTEN_BEAST_34:MUSCLE -CREATURE:FORGOTTEN_BEAST_34:EYE -!CREATURE:FORGOTTEN_BEAST_34:BRAIN - CREATURE:FORGOTTEN_BEAST_34:LUNG -!CREATURE:FORGOTTEN_BEAST_34:HEART -!CREATURE:FORGOTTEN_BEAST_34:LIVER -CREATURE:FORGOTTEN_BEAST_34:GUT -#CREATURE:FORGOTTEN_BEAST_34:STOMACH -#CREATURE:FORGOTTEN_BEAST_34:GIZZARD -$CREATURE:FORGOTTEN_BEAST_34:PANCREAS -"CREATURE:FORGOTTEN_BEAST_34:SPLEEN -"CREATURE:FORGOTTEN_BEAST_34:KIDNEY -"CREATURE:FORGOTTEN_BEAST_35:MUSCLE -CREATURE:FORGOTTEN_BEAST_35:EYE -!CREATURE:FORGOTTEN_BEAST_35:BRAIN - CREATURE:FORGOTTEN_BEAST_35:LUNG -!CREATURE:FORGOTTEN_BEAST_35:HEART -!CREATURE:FORGOTTEN_BEAST_35:LIVER -CREATURE:FORGOTTEN_BEAST_35:GUT -#CREATURE:FORGOTTEN_BEAST_35:STOMACH -#CREATURE:FORGOTTEN_BEAST_35:GIZZARD -$CREATURE:FORGOTTEN_BEAST_35:PANCREAS -"CREATURE:FORGOTTEN_BEAST_35:SPLEEN -"CREATURE:FORGOTTEN_BEAST_35:KIDNEY -"CREATURE:FORGOTTEN_BEAST_36:MUSCLE -CREATURE:FORGOTTEN_BEAST_36:EYE -!CREATURE:FORGOTTEN_BEAST_36:BRAIN - CREATURE:FORGOTTEN_BEAST_36:LUNG -!CREATURE:FORGOTTEN_BEAST_36:HEART -!CREATURE:FORGOTTEN_BEAST_36:LIVER -CREATURE:FORGOTTEN_BEAST_36:GUT -#CREATURE:FORGOTTEN_BEAST_36:STOMACH -#CREATURE:FORGOTTEN_BEAST_36:GIZZARD -$CREATURE:FORGOTTEN_BEAST_36:PANCREAS -"CREATURE:FORGOTTEN_BEAST_36:SPLEEN -"CREATURE:FORGOTTEN_BEAST_36:KIDNEY -"CREATURE:FORGOTTEN_BEAST_39:MUSCLE -CREATURE:FORGOTTEN_BEAST_39:EYE -!CREATURE:FORGOTTEN_BEAST_39:BRAIN - CREATURE:FORGOTTEN_BEAST_39:LUNG -!CREATURE:FORGOTTEN_BEAST_39:HEART -!CREATURE:FORGOTTEN_BEAST_39:LIVER -CREATURE:FORGOTTEN_BEAST_39:GUT -#CREATURE:FORGOTTEN_BEAST_39:STOMACH -#CREATURE:FORGOTTEN_BEAST_39:GIZZARD -$CREATURE:FORGOTTEN_BEAST_39:PANCREAS -"CREATURE:FORGOTTEN_BEAST_39:SPLEEN -"CREATURE:FORGOTTEN_BEAST_39:KIDNEY -"CREATURE:FORGOTTEN_BEAST_41:MUSCLE -CREATURE:FORGOTTEN_BEAST_41:EYE -!CREATURE:FORGOTTEN_BEAST_41:BRAIN - CREATURE:FORGOTTEN_BEAST_41:LUNG -!CREATURE:FORGOTTEN_BEAST_41:HEART -!CREATURE:FORGOTTEN_BEAST_41:LIVER -CREATURE:FORGOTTEN_BEAST_41:GUT -#CREATURE:FORGOTTEN_BEAST_41:STOMACH -#CREATURE:FORGOTTEN_BEAST_41:GIZZARD -$CREATURE:FORGOTTEN_BEAST_41:PANCREAS -"CREATURE:FORGOTTEN_BEAST_41:SPLEEN -"CREATURE:FORGOTTEN_BEAST_41:KIDNEY -"CREATURE:FORGOTTEN_BEAST_42:MUSCLE -CREATURE:FORGOTTEN_BEAST_42:EYE -!CREATURE:FORGOTTEN_BEAST_42:BRAIN - CREATURE:FORGOTTEN_BEAST_42:LUNG -!CREATURE:FORGOTTEN_BEAST_42:HEART -!CREATURE:FORGOTTEN_BEAST_42:LIVER -CREATURE:FORGOTTEN_BEAST_42:GUT -#CREATURE:FORGOTTEN_BEAST_42:STOMACH -#CREATURE:FORGOTTEN_BEAST_42:GIZZARD -$CREATURE:FORGOTTEN_BEAST_42:PANCREAS -"CREATURE:FORGOTTEN_BEAST_42:SPLEEN -"CREATURE:FORGOTTEN_BEAST_42:KIDNEY -"CREATURE:FORGOTTEN_BEAST_43:MUSCLE -CREATURE:FORGOTTEN_BEAST_43:EYE -!CREATURE:FORGOTTEN_BEAST_43:BRAIN - CREATURE:FORGOTTEN_BEAST_43:LUNG -!CREATURE:FORGOTTEN_BEAST_43:HEART -!CREATURE:FORGOTTEN_BEAST_43:LIVER -CREATURE:FORGOTTEN_BEAST_43:GUT -#CREATURE:FORGOTTEN_BEAST_43:STOMACH -#CREATURE:FORGOTTEN_BEAST_43:GIZZARD -$CREATURE:FORGOTTEN_BEAST_43:PANCREAS -"CREATURE:FORGOTTEN_BEAST_43:SPLEEN -"CREATURE:FORGOTTEN_BEAST_43:KIDNEY -"CREATURE:FORGOTTEN_BEAST_44:MUSCLE -CREATURE:FORGOTTEN_BEAST_44:EYE -!CREATURE:FORGOTTEN_BEAST_44:BRAIN - CREATURE:FORGOTTEN_BEAST_44:LUNG -!CREATURE:FORGOTTEN_BEAST_44:HEART -!CREATURE:FORGOTTEN_BEAST_44:LIVER -CREATURE:FORGOTTEN_BEAST_44:GUT -#CREATURE:FORGOTTEN_BEAST_44:STOMACH -#CREATURE:FORGOTTEN_BEAST_44:GIZZARD -$CREATURE:FORGOTTEN_BEAST_44:PANCREAS -"CREATURE:FORGOTTEN_BEAST_44:SPLEEN -"CREATURE:FORGOTTEN_BEAST_44:KIDNEY -"CREATURE:FORGOTTEN_BEAST_45:MUSCLE -CREATURE:FORGOTTEN_BEAST_45:EYE -!CREATURE:FORGOTTEN_BEAST_45:BRAIN - CREATURE:FORGOTTEN_BEAST_45:LUNG -!CREATURE:FORGOTTEN_BEAST_45:HEART -!CREATURE:FORGOTTEN_BEAST_45:LIVER -CREATURE:FORGOTTEN_BEAST_45:GUT -#CREATURE:FORGOTTEN_BEAST_45:STOMACH -#CREATURE:FORGOTTEN_BEAST_45:GIZZARD -$CREATURE:FORGOTTEN_BEAST_45:PANCREAS -"CREATURE:FORGOTTEN_BEAST_45:SPLEEN -"CREATURE:FORGOTTEN_BEAST_45:KIDNEY -"CREATURE:FORGOTTEN_BEAST_47:MUSCLE -CREATURE:FORGOTTEN_BEAST_47:EYE -!CREATURE:FORGOTTEN_BEAST_47:BRAIN - CREATURE:FORGOTTEN_BEAST_47:LUNG -!CREATURE:FORGOTTEN_BEAST_47:HEART -!CREATURE:FORGOTTEN_BEAST_47:LIVER -CREATURE:FORGOTTEN_BEAST_47:GUT -#CREATURE:FORGOTTEN_BEAST_47:STOMACH -#CREATURE:FORGOTTEN_BEAST_47:GIZZARD -$CREATURE:FORGOTTEN_BEAST_47:PANCREAS -"CREATURE:FORGOTTEN_BEAST_47:SPLEEN -"CREATURE:FORGOTTEN_BEAST_47:KIDNEY -"CREATURE:FORGOTTEN_BEAST_50:MUSCLE -CREATURE:FORGOTTEN_BEAST_50:EYE -!CREATURE:FORGOTTEN_BEAST_50:BRAIN - CREATURE:FORGOTTEN_BEAST_50:LUNG -!CREATURE:FORGOTTEN_BEAST_50:HEART -!CREATURE:FORGOTTEN_BEAST_50:LIVER -CREATURE:FORGOTTEN_BEAST_50:GUT -#CREATURE:FORGOTTEN_BEAST_50:STOMACH -#CREATURE:FORGOTTEN_BEAST_50:GIZZARD -$CREATURE:FORGOTTEN_BEAST_50:PANCREAS -"CREATURE:FORGOTTEN_BEAST_50:SPLEEN -"CREATURE:FORGOTTEN_BEAST_50:KIDNEY -"CREATURE:FORGOTTEN_BEAST_52:MUSCLE -CREATURE:FORGOTTEN_BEAST_52:EYE -!CREATURE:FORGOTTEN_BEAST_52:BRAIN - CREATURE:FORGOTTEN_BEAST_52:LUNG -!CREATURE:FORGOTTEN_BEAST_52:HEART -!CREATURE:FORGOTTEN_BEAST_52:LIVER -CREATURE:FORGOTTEN_BEAST_52:GUT -#CREATURE:FORGOTTEN_BEAST_52:STOMACH -#CREATURE:FORGOTTEN_BEAST_52:GIZZARD -$CREATURE:FORGOTTEN_BEAST_52:PANCREAS -"CREATURE:FORGOTTEN_BEAST_52:SPLEEN -"CREATURE:FORGOTTEN_BEAST_52:KIDNEY -"CREATURE:FORGOTTEN_BEAST_53:MUSCLE -CREATURE:FORGOTTEN_BEAST_53:EYE -!CREATURE:FORGOTTEN_BEAST_53:BRAIN - CREATURE:FORGOTTEN_BEAST_53:LUNG -!CREATURE:FORGOTTEN_BEAST_53:HEART -!CREATURE:FORGOTTEN_BEAST_53:LIVER -CREATURE:FORGOTTEN_BEAST_53:GUT -#CREATURE:FORGOTTEN_BEAST_53:STOMACH -#CREATURE:FORGOTTEN_BEAST_53:GIZZARD -$CREATURE:FORGOTTEN_BEAST_53:PANCREAS -"CREATURE:FORGOTTEN_BEAST_53:SPLEEN -"CREATURE:FORGOTTEN_BEAST_53:KIDNEY -"CREATURE:FORGOTTEN_BEAST_55:MUSCLE -CREATURE:FORGOTTEN_BEAST_55:EYE -!CREATURE:FORGOTTEN_BEAST_55:BRAIN - CREATURE:FORGOTTEN_BEAST_55:LUNG -!CREATURE:FORGOTTEN_BEAST_55:HEART -!CREATURE:FORGOTTEN_BEAST_55:LIVER -CREATURE:FORGOTTEN_BEAST_55:GUT -#CREATURE:FORGOTTEN_BEAST_55:STOMACH -#CREATURE:FORGOTTEN_BEAST_55:GIZZARD -$CREATURE:FORGOTTEN_BEAST_55:PANCREAS -"CREATURE:FORGOTTEN_BEAST_55:SPLEEN -"CREATURE:FORGOTTEN_BEAST_55:KIDNEY -"CREATURE:FORGOTTEN_BEAST_56:MUSCLE -CREATURE:FORGOTTEN_BEAST_56:EYE -!CREATURE:FORGOTTEN_BEAST_56:BRAIN - CREATURE:FORGOTTEN_BEAST_56:LUNG -!CREATURE:FORGOTTEN_BEAST_56:HEART -!CREATURE:FORGOTTEN_BEAST_56:LIVER -CREATURE:FORGOTTEN_BEAST_56:GUT -#CREATURE:FORGOTTEN_BEAST_56:STOMACH -#CREATURE:FORGOTTEN_BEAST_56:GIZZARD -$CREATURE:FORGOTTEN_BEAST_56:PANCREAS -"CREATURE:FORGOTTEN_BEAST_56:SPLEEN -"CREATURE:FORGOTTEN_BEAST_56:KIDNEY -"CREATURE:FORGOTTEN_BEAST_58:MUSCLE -CREATURE:FORGOTTEN_BEAST_58:EYE -!CREATURE:FORGOTTEN_BEAST_58:BRAIN - CREATURE:FORGOTTEN_BEAST_58:LUNG -!CREATURE:FORGOTTEN_BEAST_58:HEART -!CREATURE:FORGOTTEN_BEAST_58:LIVER -CREATURE:FORGOTTEN_BEAST_58:GUT -#CREATURE:FORGOTTEN_BEAST_58:STOMACH -#CREATURE:FORGOTTEN_BEAST_58:GIZZARD -$CREATURE:FORGOTTEN_BEAST_58:PANCREAS -"CREATURE:FORGOTTEN_BEAST_58:SPLEEN -"CREATURE:FORGOTTEN_BEAST_58:KIDNEY -"CREATURE:FORGOTTEN_BEAST_59:MUSCLE -CREATURE:FORGOTTEN_BEAST_59:EYE -!CREATURE:FORGOTTEN_BEAST_59:BRAIN - CREATURE:FORGOTTEN_BEAST_59:LUNG -!CREATURE:FORGOTTEN_BEAST_59:HEART -!CREATURE:FORGOTTEN_BEAST_59:LIVER -CREATURE:FORGOTTEN_BEAST_59:GUT -#CREATURE:FORGOTTEN_BEAST_59:STOMACH -#CREATURE:FORGOTTEN_BEAST_59:GIZZARD -$CREATURE:FORGOTTEN_BEAST_59:PANCREAS -"CREATURE:FORGOTTEN_BEAST_59:SPLEEN -"CREATURE:FORGOTTEN_BEAST_59:KIDNEY -"CREATURE:FORGOTTEN_BEAST_60:MUSCLE -CREATURE:FORGOTTEN_BEAST_60:EYE -!CREATURE:FORGOTTEN_BEAST_60:BRAIN - CREATURE:FORGOTTEN_BEAST_60:LUNG -!CREATURE:FORGOTTEN_BEAST_60:HEART -!CREATURE:FORGOTTEN_BEAST_60:LIVER -CREATURE:FORGOTTEN_BEAST_60:GUT -#CREATURE:FORGOTTEN_BEAST_60:STOMACH -#CREATURE:FORGOTTEN_BEAST_60:GIZZARD -$CREATURE:FORGOTTEN_BEAST_60:PANCREAS -"CREATURE:FORGOTTEN_BEAST_60:SPLEEN -"CREATURE:FORGOTTEN_BEAST_60:KIDNEY -"CREATURE:FORGOTTEN_BEAST_61:MUSCLE -CREATURE:FORGOTTEN_BEAST_61:EYE -!CREATURE:FORGOTTEN_BEAST_61:BRAIN - CREATURE:FORGOTTEN_BEAST_61:LUNG -!CREATURE:FORGOTTEN_BEAST_61:HEART -!CREATURE:FORGOTTEN_BEAST_61:LIVER -CREATURE:FORGOTTEN_BEAST_61:GUT -#CREATURE:FORGOTTEN_BEAST_61:STOMACH -#CREATURE:FORGOTTEN_BEAST_61:GIZZARD -$CREATURE:FORGOTTEN_BEAST_61:PANCREAS -"CREATURE:FORGOTTEN_BEAST_61:SPLEEN -"CREATURE:FORGOTTEN_BEAST_61:KIDNEY -"CREATURE:FORGOTTEN_BEAST_64:MUSCLE -CREATURE:FORGOTTEN_BEAST_64:EYE -!CREATURE:FORGOTTEN_BEAST_64:BRAIN - CREATURE:FORGOTTEN_BEAST_64:LUNG -!CREATURE:FORGOTTEN_BEAST_64:HEART -!CREATURE:FORGOTTEN_BEAST_64:LIVER -CREATURE:FORGOTTEN_BEAST_64:GUT -#CREATURE:FORGOTTEN_BEAST_64:STOMACH -#CREATURE:FORGOTTEN_BEAST_64:GIZZARD -$CREATURE:FORGOTTEN_BEAST_64:PANCREAS -"CREATURE:FORGOTTEN_BEAST_64:SPLEEN -"CREATURE:FORGOTTEN_BEAST_64:KIDNEY -"CREATURE:FORGOTTEN_BEAST_66:MUSCLE -CREATURE:FORGOTTEN_BEAST_66:EYE -!CREATURE:FORGOTTEN_BEAST_66:BRAIN - CREATURE:FORGOTTEN_BEAST_66:LUNG -!CREATURE:FORGOTTEN_BEAST_66:HEART -!CREATURE:FORGOTTEN_BEAST_66:LIVER -CREATURE:FORGOTTEN_BEAST_66:GUT -#CREATURE:FORGOTTEN_BEAST_66:STOMACH -#CREATURE:FORGOTTEN_BEAST_66:GIZZARD -$CREATURE:FORGOTTEN_BEAST_66:PANCREAS -"CREATURE:FORGOTTEN_BEAST_66:SPLEEN -"CREATURE:FORGOTTEN_BEAST_66:KIDNEY -"CREATURE:FORGOTTEN_BEAST_67:MUSCLE -CREATURE:FORGOTTEN_BEAST_67:EYE -!CREATURE:FORGOTTEN_BEAST_67:BRAIN - CREATURE:FORGOTTEN_BEAST_67:LUNG -!CREATURE:FORGOTTEN_BEAST_67:HEART -!CREATURE:FORGOTTEN_BEAST_67:LIVER -CREATURE:FORGOTTEN_BEAST_67:GUT -#CREATURE:FORGOTTEN_BEAST_67:STOMACH -#CREATURE:FORGOTTEN_BEAST_67:GIZZARD -$CREATURE:FORGOTTEN_BEAST_67:PANCREAS -"CREATURE:FORGOTTEN_BEAST_67:SPLEEN -"CREATURE:FORGOTTEN_BEAST_67:KIDNEY -"CREATURE:FORGOTTEN_BEAST_69:MUSCLE -CREATURE:FORGOTTEN_BEAST_69:EYE -!CREATURE:FORGOTTEN_BEAST_69:BRAIN - CREATURE:FORGOTTEN_BEAST_69:LUNG -!CREATURE:FORGOTTEN_BEAST_69:HEART -!CREATURE:FORGOTTEN_BEAST_69:LIVER -CREATURE:FORGOTTEN_BEAST_69:GUT -#CREATURE:FORGOTTEN_BEAST_69:STOMACH -#CREATURE:FORGOTTEN_BEAST_69:GIZZARD -$CREATURE:FORGOTTEN_BEAST_69:PANCREAS -"CREATURE:FORGOTTEN_BEAST_69:SPLEEN -"CREATURE:FORGOTTEN_BEAST_69:KIDNEY -"CREATURE:FORGOTTEN_BEAST_71:MUSCLE -CREATURE:FORGOTTEN_BEAST_71:EYE -!CREATURE:FORGOTTEN_BEAST_71:BRAIN - CREATURE:FORGOTTEN_BEAST_71:LUNG -!CREATURE:FORGOTTEN_BEAST_71:HEART -!CREATURE:FORGOTTEN_BEAST_71:LIVER -CREATURE:FORGOTTEN_BEAST_71:GUT -#CREATURE:FORGOTTEN_BEAST_71:STOMACH -#CREATURE:FORGOTTEN_BEAST_71:GIZZARD -$CREATURE:FORGOTTEN_BEAST_71:PANCREAS -"CREATURE:FORGOTTEN_BEAST_71:SPLEEN -"CREATURE:FORGOTTEN_BEAST_71:KIDNEY -"CREATURE:FORGOTTEN_BEAST_72:MUSCLE -CREATURE:FORGOTTEN_BEAST_72:EYE -!CREATURE:FORGOTTEN_BEAST_72:BRAIN - CREATURE:FORGOTTEN_BEAST_72:LUNG -!CREATURE:FORGOTTEN_BEAST_72:HEART -!CREATURE:FORGOTTEN_BEAST_72:LIVER -CREATURE:FORGOTTEN_BEAST_72:GUT -#CREATURE:FORGOTTEN_BEAST_72:STOMACH -#CREATURE:FORGOTTEN_BEAST_72:GIZZARD -$CREATURE:FORGOTTEN_BEAST_72:PANCREAS -"CREATURE:FORGOTTEN_BEAST_72:SPLEEN -"CREATURE:FORGOTTEN_BEAST_72:KIDNEY -"CREATURE:FORGOTTEN_BEAST_73:MUSCLE -CREATURE:FORGOTTEN_BEAST_73:EYE -!CREATURE:FORGOTTEN_BEAST_73:BRAIN - CREATURE:FORGOTTEN_BEAST_73:LUNG -!CREATURE:FORGOTTEN_BEAST_73:HEART -!CREATURE:FORGOTTEN_BEAST_73:LIVER -CREATURE:FORGOTTEN_BEAST_73:GUT -#CREATURE:FORGOTTEN_BEAST_73:STOMACH -#CREATURE:FORGOTTEN_BEAST_73:GIZZARD -$CREATURE:FORGOTTEN_BEAST_73:PANCREAS -"CREATURE:FORGOTTEN_BEAST_73:SPLEEN -"CREATURE:FORGOTTEN_BEAST_73:KIDNEY -"CREATURE:FORGOTTEN_BEAST_74:MUSCLE -CREATURE:FORGOTTEN_BEAST_74:EYE -!CREATURE:FORGOTTEN_BEAST_74:BRAIN - CREATURE:FORGOTTEN_BEAST_74:LUNG -!CREATURE:FORGOTTEN_BEAST_74:HEART -!CREATURE:FORGOTTEN_BEAST_74:LIVER -CREATURE:FORGOTTEN_BEAST_74:GUT -#CREATURE:FORGOTTEN_BEAST_74:STOMACH -#CREATURE:FORGOTTEN_BEAST_74:GIZZARD -$CREATURE:FORGOTTEN_BEAST_74:PANCREAS -"CREATURE:FORGOTTEN_BEAST_74:SPLEEN -"CREATURE:FORGOTTEN_BEAST_74:KIDNEY -"CREATURE:FORGOTTEN_BEAST_75:MUSCLE -CREATURE:FORGOTTEN_BEAST_75:EYE -!CREATURE:FORGOTTEN_BEAST_75:BRAIN - CREATURE:FORGOTTEN_BEAST_75:LUNG -!CREATURE:FORGOTTEN_BEAST_75:HEART -!CREATURE:FORGOTTEN_BEAST_75:LIVER -CREATURE:FORGOTTEN_BEAST_75:GUT -#CREATURE:FORGOTTEN_BEAST_75:STOMACH -#CREATURE:FORGOTTEN_BEAST_75:GIZZARD -$CREATURE:FORGOTTEN_BEAST_75:PANCREAS -"CREATURE:FORGOTTEN_BEAST_75:SPLEEN -"CREATURE:FORGOTTEN_BEAST_75:KIDNEY -"CREATURE:FORGOTTEN_BEAST_78:MUSCLE -CREATURE:FORGOTTEN_BEAST_78:EYE -!CREATURE:FORGOTTEN_BEAST_78:BRAIN - CREATURE:FORGOTTEN_BEAST_78:LUNG -!CREATURE:FORGOTTEN_BEAST_78:HEART -!CREATURE:FORGOTTEN_BEAST_78:LIVER -CREATURE:FORGOTTEN_BEAST_78:GUT -#CREATURE:FORGOTTEN_BEAST_78:STOMACH -#CREATURE:FORGOTTEN_BEAST_78:GIZZARD -$CREATURE:FORGOTTEN_BEAST_78:PANCREAS -"CREATURE:FORGOTTEN_BEAST_78:SPLEEN -"CREATURE:FORGOTTEN_BEAST_78:KIDNEY -"CREATURE:FORGOTTEN_BEAST_80:MUSCLE -CREATURE:FORGOTTEN_BEAST_80:EYE -!CREATURE:FORGOTTEN_BEAST_80:BRAIN - CREATURE:FORGOTTEN_BEAST_80:LUNG -!CREATURE:FORGOTTEN_BEAST_80:HEART -!CREATURE:FORGOTTEN_BEAST_80:LIVER -CREATURE:FORGOTTEN_BEAST_80:GUT -#CREATURE:FORGOTTEN_BEAST_80:STOMACH -#CREATURE:FORGOTTEN_BEAST_80:GIZZARD -$CREATURE:FORGOTTEN_BEAST_80:PANCREAS -"CREATURE:FORGOTTEN_BEAST_80:SPLEEN -"CREATURE:FORGOTTEN_BEAST_80:KIDNEY -"CREATURE:FORGOTTEN_BEAST_81:MUSCLE -CREATURE:FORGOTTEN_BEAST_81:EYE -!CREATURE:FORGOTTEN_BEAST_81:BRAIN - CREATURE:FORGOTTEN_BEAST_81:LUNG -!CREATURE:FORGOTTEN_BEAST_81:HEART -!CREATURE:FORGOTTEN_BEAST_81:LIVER -CREATURE:FORGOTTEN_BEAST_81:GUT -#CREATURE:FORGOTTEN_BEAST_81:STOMACH -#CREATURE:FORGOTTEN_BEAST_81:GIZZARD -$CREATURE:FORGOTTEN_BEAST_81:PANCREAS -"CREATURE:FORGOTTEN_BEAST_81:SPLEEN -"CREATURE:FORGOTTEN_BEAST_81:KIDNEY -"CREATURE:FORGOTTEN_BEAST_82:MUSCLE -CREATURE:FORGOTTEN_BEAST_82:EYE -!CREATURE:FORGOTTEN_BEAST_82:BRAIN - CREATURE:FORGOTTEN_BEAST_82:LUNG -!CREATURE:FORGOTTEN_BEAST_82:HEART -!CREATURE:FORGOTTEN_BEAST_82:LIVER -CREATURE:FORGOTTEN_BEAST_82:GUT -#CREATURE:FORGOTTEN_BEAST_82:STOMACH -#CREATURE:FORGOTTEN_BEAST_82:GIZZARD -$CREATURE:FORGOTTEN_BEAST_82:PANCREAS -"CREATURE:FORGOTTEN_BEAST_82:SPLEEN -"CREATURE:FORGOTTEN_BEAST_82:KIDNEY -"CREATURE:FORGOTTEN_BEAST_83:MUSCLE -CREATURE:FORGOTTEN_BEAST_83:EYE -!CREATURE:FORGOTTEN_BEAST_83:BRAIN - CREATURE:FORGOTTEN_BEAST_83:LUNG -!CREATURE:FORGOTTEN_BEAST_83:HEART -!CREATURE:FORGOTTEN_BEAST_83:LIVER -CREATURE:FORGOTTEN_BEAST_83:GUT -#CREATURE:FORGOTTEN_BEAST_83:STOMACH -#CREATURE:FORGOTTEN_BEAST_83:GIZZARD -$CREATURE:FORGOTTEN_BEAST_83:PANCREAS -"CREATURE:FORGOTTEN_BEAST_83:SPLEEN -"CREATURE:FORGOTTEN_BEAST_83:KIDNEY -"CREATURE:FORGOTTEN_BEAST_84:MUSCLE -CREATURE:FORGOTTEN_BEAST_84:EYE -!CREATURE:FORGOTTEN_BEAST_84:BRAIN - CREATURE:FORGOTTEN_BEAST_84:LUNG -!CREATURE:FORGOTTEN_BEAST_84:HEART -!CREATURE:FORGOTTEN_BEAST_84:LIVER -CREATURE:FORGOTTEN_BEAST_84:GUT -#CREATURE:FORGOTTEN_BEAST_84:STOMACH -#CREATURE:FORGOTTEN_BEAST_84:GIZZARD -$CREATURE:FORGOTTEN_BEAST_84:PANCREAS -"CREATURE:FORGOTTEN_BEAST_84:SPLEEN -"CREATURE:FORGOTTEN_BEAST_84:KIDNEY -"CREATURE:FORGOTTEN_BEAST_86:MUSCLE -CREATURE:FORGOTTEN_BEAST_86:EYE -!CREATURE:FORGOTTEN_BEAST_86:BRAIN - CREATURE:FORGOTTEN_BEAST_86:LUNG -!CREATURE:FORGOTTEN_BEAST_86:HEART -!CREATURE:FORGOTTEN_BEAST_86:LIVER -CREATURE:FORGOTTEN_BEAST_86:GUT -#CREATURE:FORGOTTEN_BEAST_86:STOMACH -#CREATURE:FORGOTTEN_BEAST_86:GIZZARD -$CREATURE:FORGOTTEN_BEAST_86:PANCREAS -"CREATURE:FORGOTTEN_BEAST_86:SPLEEN -"CREATURE:FORGOTTEN_BEAST_86:KIDNEY -"CREATURE:FORGOTTEN_BEAST_87:MUSCLE -CREATURE:FORGOTTEN_BEAST_87:EYE -!CREATURE:FORGOTTEN_BEAST_87:BRAIN - CREATURE:FORGOTTEN_BEAST_87:LUNG -!CREATURE:FORGOTTEN_BEAST_87:HEART -!CREATURE:FORGOTTEN_BEAST_87:LIVER -CREATURE:FORGOTTEN_BEAST_87:GUT -#CREATURE:FORGOTTEN_BEAST_87:STOMACH -#CREATURE:FORGOTTEN_BEAST_87:GIZZARD -$CREATURE:FORGOTTEN_BEAST_87:PANCREAS -"CREATURE:FORGOTTEN_BEAST_87:SPLEEN -"CREATURE:FORGOTTEN_BEAST_87:KIDNEY -"CREATURE:FORGOTTEN_BEAST_89:MUSCLE -CREATURE:FORGOTTEN_BEAST_89:EYE -!CREATURE:FORGOTTEN_BEAST_89:BRAIN - CREATURE:FORGOTTEN_BEAST_89:LUNG -!CREATURE:FORGOTTEN_BEAST_89:HEART -!CREATURE:FORGOTTEN_BEAST_89:LIVER -CREATURE:FORGOTTEN_BEAST_89:GUT -#CREATURE:FORGOTTEN_BEAST_89:STOMACH -#CREATURE:FORGOTTEN_BEAST_89:GIZZARD -$CREATURE:FORGOTTEN_BEAST_89:PANCREAS -"CREATURE:FORGOTTEN_BEAST_89:SPLEEN -"CREATURE:FORGOTTEN_BEAST_89:KIDNEY -"CREATURE:FORGOTTEN_BEAST_90:MUSCLE -CREATURE:FORGOTTEN_BEAST_90:EYE -!CREATURE:FORGOTTEN_BEAST_90:BRAIN - CREATURE:FORGOTTEN_BEAST_90:LUNG -!CREATURE:FORGOTTEN_BEAST_90:HEART -!CREATURE:FORGOTTEN_BEAST_90:LIVER -CREATURE:FORGOTTEN_BEAST_90:GUT -#CREATURE:FORGOTTEN_BEAST_90:STOMACH -#CREATURE:FORGOTTEN_BEAST_90:GIZZARD -$CREATURE:FORGOTTEN_BEAST_90:PANCREAS -"CREATURE:FORGOTTEN_BEAST_90:SPLEEN -"CREATURE:FORGOTTEN_BEAST_90:KIDNEY -"CREATURE:FORGOTTEN_BEAST_92:MUSCLE -CREATURE:FORGOTTEN_BEAST_92:EYE -!CREATURE:FORGOTTEN_BEAST_92:BRAIN - CREATURE:FORGOTTEN_BEAST_92:LUNG -!CREATURE:FORGOTTEN_BEAST_92:HEART -!CREATURE:FORGOTTEN_BEAST_92:LIVER -CREATURE:FORGOTTEN_BEAST_92:GUT -#CREATURE:FORGOTTEN_BEAST_92:STOMACH -#CREATURE:FORGOTTEN_BEAST_92:GIZZARD -$CREATURE:FORGOTTEN_BEAST_92:PANCREAS -"CREATURE:FORGOTTEN_BEAST_92:SPLEEN -"CREATURE:FORGOTTEN_BEAST_92:KIDNEY -"CREATURE:FORGOTTEN_BEAST_94:MUSCLE -CREATURE:FORGOTTEN_BEAST_94:EYE -!CREATURE:FORGOTTEN_BEAST_94:BRAIN - CREATURE:FORGOTTEN_BEAST_94:LUNG -!CREATURE:FORGOTTEN_BEAST_94:HEART -!CREATURE:FORGOTTEN_BEAST_94:LIVER -CREATURE:FORGOTTEN_BEAST_94:GUT -#CREATURE:FORGOTTEN_BEAST_94:STOMACH -#CREATURE:FORGOTTEN_BEAST_94:GIZZARD -$CREATURE:FORGOTTEN_BEAST_94:PANCREAS -"CREATURE:FORGOTTEN_BEAST_94:SPLEEN -"CREATURE:FORGOTTEN_BEAST_94:KIDNEY -"CREATURE:FORGOTTEN_BEAST_95:MUSCLE -CREATURE:FORGOTTEN_BEAST_95:EYE -!CREATURE:FORGOTTEN_BEAST_95:BRAIN - CREATURE:FORGOTTEN_BEAST_95:LUNG -!CREATURE:FORGOTTEN_BEAST_95:HEART -!CREATURE:FORGOTTEN_BEAST_95:LIVER -CREATURE:FORGOTTEN_BEAST_95:GUT -#CREATURE:FORGOTTEN_BEAST_95:STOMACH -#CREATURE:FORGOTTEN_BEAST_95:GIZZARD -$CREATURE:FORGOTTEN_BEAST_95:PANCREAS -"CREATURE:FORGOTTEN_BEAST_95:SPLEEN -"CREATURE:FORGOTTEN_BEAST_95:KIDNEY -"CREATURE:FORGOTTEN_BEAST_96:MUSCLE -CREATURE:FORGOTTEN_BEAST_96:EYE -!CREATURE:FORGOTTEN_BEAST_96:BRAIN - CREATURE:FORGOTTEN_BEAST_96:LUNG -!CREATURE:FORGOTTEN_BEAST_96:HEART -!CREATURE:FORGOTTEN_BEAST_96:LIVER -CREATURE:FORGOTTEN_BEAST_96:GUT -#CREATURE:FORGOTTEN_BEAST_96:STOMACH -#CREATURE:FORGOTTEN_BEAST_96:GIZZARD -$CREATURE:FORGOTTEN_BEAST_96:PANCREAS -"CREATURE:FORGOTTEN_BEAST_96:SPLEEN -"CREATURE:FORGOTTEN_BEAST_96:KIDNEY -"CREATURE:FORGOTTEN_BEAST_97:MUSCLE -CREATURE:FORGOTTEN_BEAST_97:EYE -!CREATURE:FORGOTTEN_BEAST_97:BRAIN - CREATURE:FORGOTTEN_BEAST_97:LUNG -!CREATURE:FORGOTTEN_BEAST_97:HEART -!CREATURE:FORGOTTEN_BEAST_97:LIVER -CREATURE:FORGOTTEN_BEAST_97:GUT -#CREATURE:FORGOTTEN_BEAST_97:STOMACH -#CREATURE:FORGOTTEN_BEAST_97:GIZZARD -$CREATURE:FORGOTTEN_BEAST_97:PANCREAS -"CREATURE:FORGOTTEN_BEAST_97:SPLEEN -"CREATURE:FORGOTTEN_BEAST_97:KIDNEY -"CREATURE:FORGOTTEN_BEAST_98:MUSCLE -CREATURE:FORGOTTEN_BEAST_98:EYE -!CREATURE:FORGOTTEN_BEAST_98:BRAIN - CREATURE:FORGOTTEN_BEAST_98:LUNG -!CREATURE:FORGOTTEN_BEAST_98:HEART -!CREATURE:FORGOTTEN_BEAST_98:LIVER -CREATURE:FORGOTTEN_BEAST_98:GUT -#CREATURE:FORGOTTEN_BEAST_98:STOMACH -#CREATURE:FORGOTTEN_BEAST_98:GIZZARD -$CREATURE:FORGOTTEN_BEAST_98:PANCREAS -"CREATURE:FORGOTTEN_BEAST_98:SPLEEN -"CREATURE:FORGOTTEN_BEAST_98:KIDNEY -#CREATURE:FORGOTTEN_BEAST_100:MUSCLE - CREATURE:FORGOTTEN_BEAST_100:EYE -"CREATURE:FORGOTTEN_BEAST_100:BRAIN -!CREATURE:FORGOTTEN_BEAST_100:LUNG -"CREATURE:FORGOTTEN_BEAST_100:HEART -"CREATURE:FORGOTTEN_BEAST_100:LIVER - CREATURE:FORGOTTEN_BEAST_100:GUT -$CREATURE:FORGOTTEN_BEAST_100:STOMACH -$CREATURE:FORGOTTEN_BEAST_100:GIZZARD -%CREATURE:FORGOTTEN_BEAST_100:PANCREAS -#CREATURE:FORGOTTEN_BEAST_100:SPLEEN -#CREATURE:FORGOTTEN_BEAST_100:KIDNEY -#CREATURE:FORGOTTEN_BEAST_105:MUSCLE - CREATURE:FORGOTTEN_BEAST_105:EYE -"CREATURE:FORGOTTEN_BEAST_105:BRAIN -!CREATURE:FORGOTTEN_BEAST_105:LUNG -"CREATURE:FORGOTTEN_BEAST_105:HEART -"CREATURE:FORGOTTEN_BEAST_105:LIVER - CREATURE:FORGOTTEN_BEAST_105:GUT -$CREATURE:FORGOTTEN_BEAST_105:STOMACH -$CREATURE:FORGOTTEN_BEAST_105:GIZZARD -%CREATURE:FORGOTTEN_BEAST_105:PANCREAS -#CREATURE:FORGOTTEN_BEAST_105:SPLEEN -#CREATURE:FORGOTTEN_BEAST_105:KIDNEY -#CREATURE:FORGOTTEN_BEAST_106:MUSCLE - CREATURE:FORGOTTEN_BEAST_106:EYE -"CREATURE:FORGOTTEN_BEAST_106:BRAIN -!CREATURE:FORGOTTEN_BEAST_106:LUNG -"CREATURE:FORGOTTEN_BEAST_106:HEART -"CREATURE:FORGOTTEN_BEAST_106:LIVER - CREATURE:FORGOTTEN_BEAST_106:GUT -$CREATURE:FORGOTTEN_BEAST_106:STOMACH -$CREATURE:FORGOTTEN_BEAST_106:GIZZARD -%CREATURE:FORGOTTEN_BEAST_106:PANCREAS -#CREATURE:FORGOTTEN_BEAST_106:SPLEEN -#CREATURE:FORGOTTEN_BEAST_106:KIDNEY -#CREATURE:FORGOTTEN_BEAST_107:MUSCLE - CREATURE:FORGOTTEN_BEAST_107:EYE -"CREATURE:FORGOTTEN_BEAST_107:BRAIN -!CREATURE:FORGOTTEN_BEAST_107:LUNG -"CREATURE:FORGOTTEN_BEAST_107:HEART -"CREATURE:FORGOTTEN_BEAST_107:LIVER - CREATURE:FORGOTTEN_BEAST_107:GUT -$CREATURE:FORGOTTEN_BEAST_107:STOMACH -$CREATURE:FORGOTTEN_BEAST_107:GIZZARD -%CREATURE:FORGOTTEN_BEAST_107:PANCREAS -#CREATURE:FORGOTTEN_BEAST_107:SPLEEN -#CREATURE:FORGOTTEN_BEAST_107:KIDNEY -#CREATURE:FORGOTTEN_BEAST_108:MUSCLE - CREATURE:FORGOTTEN_BEAST_108:EYE -"CREATURE:FORGOTTEN_BEAST_108:BRAIN -!CREATURE:FORGOTTEN_BEAST_108:LUNG -"CREATURE:FORGOTTEN_BEAST_108:HEART -"CREATURE:FORGOTTEN_BEAST_108:LIVER - CREATURE:FORGOTTEN_BEAST_108:GUT -$CREATURE:FORGOTTEN_BEAST_108:STOMACH -$CREATURE:FORGOTTEN_BEAST_108:GIZZARD -%CREATURE:FORGOTTEN_BEAST_108:PANCREAS -#CREATURE:FORGOTTEN_BEAST_108:SPLEEN -#CREATURE:FORGOTTEN_BEAST_108:KIDNEY -#CREATURE:FORGOTTEN_BEAST_109:MUSCLE - CREATURE:FORGOTTEN_BEAST_109:EYE -"CREATURE:FORGOTTEN_BEAST_109:BRAIN -!CREATURE:FORGOTTEN_BEAST_109:LUNG -"CREATURE:FORGOTTEN_BEAST_109:HEART -"CREATURE:FORGOTTEN_BEAST_109:LIVER - CREATURE:FORGOTTEN_BEAST_109:GUT -$CREATURE:FORGOTTEN_BEAST_109:STOMACH -$CREATURE:FORGOTTEN_BEAST_109:GIZZARD -%CREATURE:FORGOTTEN_BEAST_109:PANCREAS -#CREATURE:FORGOTTEN_BEAST_109:SPLEEN -#CREATURE:FORGOTTEN_BEAST_109:KIDNEY -#CREATURE:FORGOTTEN_BEAST_111:MUSCLE - CREATURE:FORGOTTEN_BEAST_111:EYE -"CREATURE:FORGOTTEN_BEAST_111:BRAIN -!CREATURE:FORGOTTEN_BEAST_111:LUNG -"CREATURE:FORGOTTEN_BEAST_111:HEART -"CREATURE:FORGOTTEN_BEAST_111:LIVER - CREATURE:FORGOTTEN_BEAST_111:GUT -$CREATURE:FORGOTTEN_BEAST_111:STOMACH -$CREATURE:FORGOTTEN_BEAST_111:GIZZARD -%CREATURE:FORGOTTEN_BEAST_111:PANCREAS -#CREATURE:FORGOTTEN_BEAST_111:SPLEEN -#CREATURE:FORGOTTEN_BEAST_111:KIDNEY -#CREATURE:FORGOTTEN_BEAST_112:MUSCLE - CREATURE:FORGOTTEN_BEAST_112:EYE -"CREATURE:FORGOTTEN_BEAST_112:BRAIN -!CREATURE:FORGOTTEN_BEAST_112:LUNG -"CREATURE:FORGOTTEN_BEAST_112:HEART -"CREATURE:FORGOTTEN_BEAST_112:LIVER - CREATURE:FORGOTTEN_BEAST_112:GUT -$CREATURE:FORGOTTEN_BEAST_112:STOMACH -$CREATURE:FORGOTTEN_BEAST_112:GIZZARD -%CREATURE:FORGOTTEN_BEAST_112:PANCREAS -#CREATURE:FORGOTTEN_BEAST_112:SPLEEN -#CREATURE:FORGOTTEN_BEAST_112:KIDNEY -#CREATURE:FORGOTTEN_BEAST_113:MUSCLE - CREATURE:FORGOTTEN_BEAST_113:EYE -"CREATURE:FORGOTTEN_BEAST_113:BRAIN -!CREATURE:FORGOTTEN_BEAST_113:LUNG -"CREATURE:FORGOTTEN_BEAST_113:HEART -"CREATURE:FORGOTTEN_BEAST_113:LIVER - CREATURE:FORGOTTEN_BEAST_113:GUT -$CREATURE:FORGOTTEN_BEAST_113:STOMACH -$CREATURE:FORGOTTEN_BEAST_113:GIZZARD -%CREATURE:FORGOTTEN_BEAST_113:PANCREAS -#CREATURE:FORGOTTEN_BEAST_113:SPLEEN -#CREATURE:FORGOTTEN_BEAST_113:KIDNEY -#CREATURE:FORGOTTEN_BEAST_114:MUSCLE - CREATURE:FORGOTTEN_BEAST_114:EYE -"CREATURE:FORGOTTEN_BEAST_114:BRAIN -!CREATURE:FORGOTTEN_BEAST_114:LUNG -"CREATURE:FORGOTTEN_BEAST_114:HEART -"CREATURE:FORGOTTEN_BEAST_114:LIVER - CREATURE:FORGOTTEN_BEAST_114:GUT -$CREATURE:FORGOTTEN_BEAST_114:STOMACH -$CREATURE:FORGOTTEN_BEAST_114:GIZZARD -%CREATURE:FORGOTTEN_BEAST_114:PANCREAS -#CREATURE:FORGOTTEN_BEAST_114:SPLEEN -#CREATURE:FORGOTTEN_BEAST_114:KIDNEY -#CREATURE:FORGOTTEN_BEAST_115:MUSCLE - CREATURE:FORGOTTEN_BEAST_115:EYE -"CREATURE:FORGOTTEN_BEAST_115:BRAIN -!CREATURE:FORGOTTEN_BEAST_115:LUNG -"CREATURE:FORGOTTEN_BEAST_115:HEART -"CREATURE:FORGOTTEN_BEAST_115:LIVER - CREATURE:FORGOTTEN_BEAST_115:GUT -$CREATURE:FORGOTTEN_BEAST_115:STOMACH -$CREATURE:FORGOTTEN_BEAST_115:GIZZARD -%CREATURE:FORGOTTEN_BEAST_115:PANCREAS -#CREATURE:FORGOTTEN_BEAST_115:SPLEEN -#CREATURE:FORGOTTEN_BEAST_115:KIDNEY -#CREATURE:FORGOTTEN_BEAST_116:MUSCLE - CREATURE:FORGOTTEN_BEAST_116:EYE -"CREATURE:FORGOTTEN_BEAST_116:BRAIN -!CREATURE:FORGOTTEN_BEAST_116:LUNG -"CREATURE:FORGOTTEN_BEAST_116:HEART -"CREATURE:FORGOTTEN_BEAST_116:LIVER - CREATURE:FORGOTTEN_BEAST_116:GUT -$CREATURE:FORGOTTEN_BEAST_116:STOMACH -$CREATURE:FORGOTTEN_BEAST_116:GIZZARD -%CREATURE:FORGOTTEN_BEAST_116:PANCREAS -#CREATURE:FORGOTTEN_BEAST_116:SPLEEN -#CREATURE:FORGOTTEN_BEAST_116:KIDNEY -#CREATURE:FORGOTTEN_BEAST_117:MUSCLE - CREATURE:FORGOTTEN_BEAST_117:EYE -"CREATURE:FORGOTTEN_BEAST_117:BRAIN -!CREATURE:FORGOTTEN_BEAST_117:LUNG -"CREATURE:FORGOTTEN_BEAST_117:HEART -"CREATURE:FORGOTTEN_BEAST_117:LIVER - CREATURE:FORGOTTEN_BEAST_117:GUT -$CREATURE:FORGOTTEN_BEAST_117:STOMACH -$CREATURE:FORGOTTEN_BEAST_117:GIZZARD -%CREATURE:FORGOTTEN_BEAST_117:PANCREAS -#CREATURE:FORGOTTEN_BEAST_117:SPLEEN -#CREATURE:FORGOTTEN_BEAST_117:KIDNEY -#CREATURE:FORGOTTEN_BEAST_118:MUSCLE - CREATURE:FORGOTTEN_BEAST_118:EYE -"CREATURE:FORGOTTEN_BEAST_118:BRAIN -!CREATURE:FORGOTTEN_BEAST_118:LUNG -"CREATURE:FORGOTTEN_BEAST_118:HEART -"CREATURE:FORGOTTEN_BEAST_118:LIVER - CREATURE:FORGOTTEN_BEAST_118:GUT -$CREATURE:FORGOTTEN_BEAST_118:STOMACH -$CREATURE:FORGOTTEN_BEAST_118:GIZZARD -%CREATURE:FORGOTTEN_BEAST_118:PANCREAS -#CREATURE:FORGOTTEN_BEAST_118:SPLEEN -#CREATURE:FORGOTTEN_BEAST_118:KIDNEY -#CREATURE:FORGOTTEN_BEAST_119:MUSCLE - CREATURE:FORGOTTEN_BEAST_119:EYE -"CREATURE:FORGOTTEN_BEAST_119:BRAIN -!CREATURE:FORGOTTEN_BEAST_119:LUNG -"CREATURE:FORGOTTEN_BEAST_119:HEART -"CREATURE:FORGOTTEN_BEAST_119:LIVER - CREATURE:FORGOTTEN_BEAST_119:GUT -$CREATURE:FORGOTTEN_BEAST_119:STOMACH -$CREATURE:FORGOTTEN_BEAST_119:GIZZARD -%CREATURE:FORGOTTEN_BEAST_119:PANCREAS -#CREATURE:FORGOTTEN_BEAST_119:SPLEEN -#CREATURE:FORGOTTEN_BEAST_119:KIDNEY -#CREATURE:FORGOTTEN_BEAST_120:MUSCLE - CREATURE:FORGOTTEN_BEAST_120:EYE -"CREATURE:FORGOTTEN_BEAST_120:BRAIN -!CREATURE:FORGOTTEN_BEAST_120:LUNG -"CREATURE:FORGOTTEN_BEAST_120:HEART -"CREATURE:FORGOTTEN_BEAST_120:LIVER - CREATURE:FORGOTTEN_BEAST_120:GUT -$CREATURE:FORGOTTEN_BEAST_120:STOMACH -$CREATURE:FORGOTTEN_BEAST_120:GIZZARD -%CREATURE:FORGOTTEN_BEAST_120:PANCREAS -#CREATURE:FORGOTTEN_BEAST_120:SPLEEN -#CREATURE:FORGOTTEN_BEAST_120:KIDNEY -#CREATURE:FORGOTTEN_BEAST_122:MUSCLE - CREATURE:FORGOTTEN_BEAST_122:EYE -"CREATURE:FORGOTTEN_BEAST_122:BRAIN -!CREATURE:FORGOTTEN_BEAST_122:LUNG -"CREATURE:FORGOTTEN_BEAST_122:HEART -"CREATURE:FORGOTTEN_BEAST_122:LIVER - CREATURE:FORGOTTEN_BEAST_122:GUT -$CREATURE:FORGOTTEN_BEAST_122:STOMACH -$CREATURE:FORGOTTEN_BEAST_122:GIZZARD -%CREATURE:FORGOTTEN_BEAST_122:PANCREAS -#CREATURE:FORGOTTEN_BEAST_122:SPLEEN -#CREATURE:FORGOTTEN_BEAST_122:KIDNEY -#CREATURE:FORGOTTEN_BEAST_123:MUSCLE - CREATURE:FORGOTTEN_BEAST_123:EYE -"CREATURE:FORGOTTEN_BEAST_123:BRAIN -!CREATURE:FORGOTTEN_BEAST_123:LUNG -"CREATURE:FORGOTTEN_BEAST_123:HEART -"CREATURE:FORGOTTEN_BEAST_123:LIVER - CREATURE:FORGOTTEN_BEAST_123:GUT -$CREATURE:FORGOTTEN_BEAST_123:STOMACH -$CREATURE:FORGOTTEN_BEAST_123:GIZZARD -%CREATURE:FORGOTTEN_BEAST_123:PANCREAS -#CREATURE:FORGOTTEN_BEAST_123:SPLEEN -#CREATURE:FORGOTTEN_BEAST_123:KIDNEY -#CREATURE:FORGOTTEN_BEAST_124:MUSCLE - CREATURE:FORGOTTEN_BEAST_124:EYE -"CREATURE:FORGOTTEN_BEAST_124:BRAIN -!CREATURE:FORGOTTEN_BEAST_124:LUNG -"CREATURE:FORGOTTEN_BEAST_124:HEART -"CREATURE:FORGOTTEN_BEAST_124:LIVER - CREATURE:FORGOTTEN_BEAST_124:GUT -$CREATURE:FORGOTTEN_BEAST_124:STOMACH -$CREATURE:FORGOTTEN_BEAST_124:GIZZARD -%CREATURE:FORGOTTEN_BEAST_124:PANCREAS -#CREATURE:FORGOTTEN_BEAST_124:SPLEEN -#CREATURE:FORGOTTEN_BEAST_124:KIDNEY -#CREATURE:FORGOTTEN_BEAST_125:MUSCLE - CREATURE:FORGOTTEN_BEAST_125:EYE -"CREATURE:FORGOTTEN_BEAST_125:BRAIN -!CREATURE:FORGOTTEN_BEAST_125:LUNG -"CREATURE:FORGOTTEN_BEAST_125:HEART -"CREATURE:FORGOTTEN_BEAST_125:LIVER - CREATURE:FORGOTTEN_BEAST_125:GUT -$CREATURE:FORGOTTEN_BEAST_125:STOMACH -$CREATURE:FORGOTTEN_BEAST_125:GIZZARD -%CREATURE:FORGOTTEN_BEAST_125:PANCREAS -#CREATURE:FORGOTTEN_BEAST_125:SPLEEN -#CREATURE:FORGOTTEN_BEAST_125:KIDNEY -#CREATURE:FORGOTTEN_BEAST_127:MUSCLE - CREATURE:FORGOTTEN_BEAST_127:EYE -"CREATURE:FORGOTTEN_BEAST_127:BRAIN -!CREATURE:FORGOTTEN_BEAST_127:LUNG -"CREATURE:FORGOTTEN_BEAST_127:HEART -"CREATURE:FORGOTTEN_BEAST_127:LIVER - CREATURE:FORGOTTEN_BEAST_127:GUT -$CREATURE:FORGOTTEN_BEAST_127:STOMACH -$CREATURE:FORGOTTEN_BEAST_127:GIZZARD -%CREATURE:FORGOTTEN_BEAST_127:PANCREAS -#CREATURE:FORGOTTEN_BEAST_127:SPLEEN -#CREATURE:FORGOTTEN_BEAST_127:KIDNEY -#CREATURE:FORGOTTEN_BEAST_128:MUSCLE - CREATURE:FORGOTTEN_BEAST_128:EYE -"CREATURE:FORGOTTEN_BEAST_128:BRAIN -!CREATURE:FORGOTTEN_BEAST_128:LUNG -"CREATURE:FORGOTTEN_BEAST_128:HEART -"CREATURE:FORGOTTEN_BEAST_128:LIVER - CREATURE:FORGOTTEN_BEAST_128:GUT -$CREATURE:FORGOTTEN_BEAST_128:STOMACH -$CREATURE:FORGOTTEN_BEAST_128:GIZZARD -%CREATURE:FORGOTTEN_BEAST_128:PANCREAS -#CREATURE:FORGOTTEN_BEAST_128:SPLEEN -#CREATURE:FORGOTTEN_BEAST_128:KIDNEY -#CREATURE:FORGOTTEN_BEAST_130:MUSCLE - CREATURE:FORGOTTEN_BEAST_130:EYE -"CREATURE:FORGOTTEN_BEAST_130:BRAIN -!CREATURE:FORGOTTEN_BEAST_130:LUNG -"CREATURE:FORGOTTEN_BEAST_130:HEART -"CREATURE:FORGOTTEN_BEAST_130:LIVER - CREATURE:FORGOTTEN_BEAST_130:GUT -$CREATURE:FORGOTTEN_BEAST_130:STOMACH -$CREATURE:FORGOTTEN_BEAST_130:GIZZARD -%CREATURE:FORGOTTEN_BEAST_130:PANCREAS -#CREATURE:FORGOTTEN_BEAST_130:SPLEEN -#CREATURE:FORGOTTEN_BEAST_130:KIDNEY -#CREATURE:FORGOTTEN_BEAST_131:MUSCLE - CREATURE:FORGOTTEN_BEAST_131:EYE -"CREATURE:FORGOTTEN_BEAST_131:BRAIN -!CREATURE:FORGOTTEN_BEAST_131:LUNG -"CREATURE:FORGOTTEN_BEAST_131:HEART -"CREATURE:FORGOTTEN_BEAST_131:LIVER - CREATURE:FORGOTTEN_BEAST_131:GUT -$CREATURE:FORGOTTEN_BEAST_131:STOMACH -$CREATURE:FORGOTTEN_BEAST_131:GIZZARD -%CREATURE:FORGOTTEN_BEAST_131:PANCREAS -#CREATURE:FORGOTTEN_BEAST_131:SPLEEN -#CREATURE:FORGOTTEN_BEAST_131:KIDNEY -#CREATURE:FORGOTTEN_BEAST_132:MUSCLE - CREATURE:FORGOTTEN_BEAST_132:EYE -"CREATURE:FORGOTTEN_BEAST_132:BRAIN -!CREATURE:FORGOTTEN_BEAST_132:LUNG -"CREATURE:FORGOTTEN_BEAST_132:HEART -"CREATURE:FORGOTTEN_BEAST_132:LIVER - CREATURE:FORGOTTEN_BEAST_132:GUT -$CREATURE:FORGOTTEN_BEAST_132:STOMACH -$CREATURE:FORGOTTEN_BEAST_132:GIZZARD -%CREATURE:FORGOTTEN_BEAST_132:PANCREAS -#CREATURE:FORGOTTEN_BEAST_132:SPLEEN -#CREATURE:FORGOTTEN_BEAST_132:KIDNEY -#CREATURE:FORGOTTEN_BEAST_133:MUSCLE - CREATURE:FORGOTTEN_BEAST_133:EYE -"CREATURE:FORGOTTEN_BEAST_133:BRAIN -!CREATURE:FORGOTTEN_BEAST_133:LUNG -"CREATURE:FORGOTTEN_BEAST_133:HEART -"CREATURE:FORGOTTEN_BEAST_133:LIVER - CREATURE:FORGOTTEN_BEAST_133:GUT -$CREATURE:FORGOTTEN_BEAST_133:STOMACH -$CREATURE:FORGOTTEN_BEAST_133:GIZZARD -%CREATURE:FORGOTTEN_BEAST_133:PANCREAS -#CREATURE:FORGOTTEN_BEAST_133:SPLEEN -#CREATURE:FORGOTTEN_BEAST_133:KIDNEY -#CREATURE:FORGOTTEN_BEAST_134:MUSCLE - CREATURE:FORGOTTEN_BEAST_134:EYE -"CREATURE:FORGOTTEN_BEAST_134:BRAIN -!CREATURE:FORGOTTEN_BEAST_134:LUNG -"CREATURE:FORGOTTEN_BEAST_134:HEART -"CREATURE:FORGOTTEN_BEAST_134:LIVER - CREATURE:FORGOTTEN_BEAST_134:GUT -$CREATURE:FORGOTTEN_BEAST_134:STOMACH -$CREATURE:FORGOTTEN_BEAST_134:GIZZARD -%CREATURE:FORGOTTEN_BEAST_134:PANCREAS -#CREATURE:FORGOTTEN_BEAST_134:SPLEEN -#CREATURE:FORGOTTEN_BEAST_134:KIDNEY -#CREATURE:FORGOTTEN_BEAST_135:MUSCLE - CREATURE:FORGOTTEN_BEAST_135:EYE -"CREATURE:FORGOTTEN_BEAST_135:BRAIN -!CREATURE:FORGOTTEN_BEAST_135:LUNG -"CREATURE:FORGOTTEN_BEAST_135:HEART -"CREATURE:FORGOTTEN_BEAST_135:LIVER - CREATURE:FORGOTTEN_BEAST_135:GUT -$CREATURE:FORGOTTEN_BEAST_135:STOMACH -$CREATURE:FORGOTTEN_BEAST_135:GIZZARD -%CREATURE:FORGOTTEN_BEAST_135:PANCREAS -#CREATURE:FORGOTTEN_BEAST_135:SPLEEN -#CREATURE:FORGOTTEN_BEAST_135:KIDNEY -#CREATURE:FORGOTTEN_BEAST_137:MUSCLE - CREATURE:FORGOTTEN_BEAST_137:EYE -"CREATURE:FORGOTTEN_BEAST_137:BRAIN -!CREATURE:FORGOTTEN_BEAST_137:LUNG -"CREATURE:FORGOTTEN_BEAST_137:HEART -"CREATURE:FORGOTTEN_BEAST_137:LIVER - CREATURE:FORGOTTEN_BEAST_137:GUT -$CREATURE:FORGOTTEN_BEAST_137:STOMACH -$CREATURE:FORGOTTEN_BEAST_137:GIZZARD -%CREATURE:FORGOTTEN_BEAST_137:PANCREAS -#CREATURE:FORGOTTEN_BEAST_137:SPLEEN -#CREATURE:FORGOTTEN_BEAST_137:KIDNEY -#CREATURE:FORGOTTEN_BEAST_138:MUSCLE - CREATURE:FORGOTTEN_BEAST_138:EYE -"CREATURE:FORGOTTEN_BEAST_138:BRAIN -!CREATURE:FORGOTTEN_BEAST_138:LUNG -"CREATURE:FORGOTTEN_BEAST_138:HEART -"CREATURE:FORGOTTEN_BEAST_138:LIVER - CREATURE:FORGOTTEN_BEAST_138:GUT -$CREATURE:FORGOTTEN_BEAST_138:STOMACH -$CREATURE:FORGOTTEN_BEAST_138:GIZZARD -%CREATURE:FORGOTTEN_BEAST_138:PANCREAS -#CREATURE:FORGOTTEN_BEAST_138:SPLEEN -#CREATURE:FORGOTTEN_BEAST_138:KIDNEY -#CREATURE:FORGOTTEN_BEAST_139:MUSCLE - CREATURE:FORGOTTEN_BEAST_139:EYE -"CREATURE:FORGOTTEN_BEAST_139:BRAIN -!CREATURE:FORGOTTEN_BEAST_139:LUNG -"CREATURE:FORGOTTEN_BEAST_139:HEART -"CREATURE:FORGOTTEN_BEAST_139:LIVER - CREATURE:FORGOTTEN_BEAST_139:GUT -$CREATURE:FORGOTTEN_BEAST_139:STOMACH -$CREATURE:FORGOTTEN_BEAST_139:GIZZARD -%CREATURE:FORGOTTEN_BEAST_139:PANCREAS -#CREATURE:FORGOTTEN_BEAST_139:SPLEEN -#CREATURE:FORGOTTEN_BEAST_139:KIDNEY -#CREATURE:FORGOTTEN_BEAST_141:MUSCLE - CREATURE:FORGOTTEN_BEAST_141:EYE -"CREATURE:FORGOTTEN_BEAST_141:BRAIN -!CREATURE:FORGOTTEN_BEAST_141:LUNG -"CREATURE:FORGOTTEN_BEAST_141:HEART -"CREATURE:FORGOTTEN_BEAST_141:LIVER - CREATURE:FORGOTTEN_BEAST_141:GUT -$CREATURE:FORGOTTEN_BEAST_141:STOMACH -$CREATURE:FORGOTTEN_BEAST_141:GIZZARD -%CREATURE:FORGOTTEN_BEAST_141:PANCREAS -#CREATURE:FORGOTTEN_BEAST_141:SPLEEN -#CREATURE:FORGOTTEN_BEAST_141:KIDNEY -#CREATURE:FORGOTTEN_BEAST_142:MUSCLE - CREATURE:FORGOTTEN_BEAST_142:EYE -"CREATURE:FORGOTTEN_BEAST_142:BRAIN -!CREATURE:FORGOTTEN_BEAST_142:LUNG -"CREATURE:FORGOTTEN_BEAST_142:HEART -"CREATURE:FORGOTTEN_BEAST_142:LIVER - CREATURE:FORGOTTEN_BEAST_142:GUT -$CREATURE:FORGOTTEN_BEAST_142:STOMACH -$CREATURE:FORGOTTEN_BEAST_142:GIZZARD -%CREATURE:FORGOTTEN_BEAST_142:PANCREAS -#CREATURE:FORGOTTEN_BEAST_142:SPLEEN -#CREATURE:FORGOTTEN_BEAST_142:KIDNEY -#CREATURE:FORGOTTEN_BEAST_144:MUSCLE - CREATURE:FORGOTTEN_BEAST_144:EYE -"CREATURE:FORGOTTEN_BEAST_144:BRAIN -!CREATURE:FORGOTTEN_BEAST_144:LUNG -"CREATURE:FORGOTTEN_BEAST_144:HEART -"CREATURE:FORGOTTEN_BEAST_144:LIVER - CREATURE:FORGOTTEN_BEAST_144:GUT -$CREATURE:FORGOTTEN_BEAST_144:STOMACH -$CREATURE:FORGOTTEN_BEAST_144:GIZZARD -%CREATURE:FORGOTTEN_BEAST_144:PANCREAS -#CREATURE:FORGOTTEN_BEAST_144:SPLEEN -#CREATURE:FORGOTTEN_BEAST_144:KIDNEY -#CREATURE:FORGOTTEN_BEAST_146:MUSCLE - CREATURE:FORGOTTEN_BEAST_146:EYE -"CREATURE:FORGOTTEN_BEAST_146:BRAIN -!CREATURE:FORGOTTEN_BEAST_146:LUNG -"CREATURE:FORGOTTEN_BEAST_146:HEART -"CREATURE:FORGOTTEN_BEAST_146:LIVER - CREATURE:FORGOTTEN_BEAST_146:GUT -$CREATURE:FORGOTTEN_BEAST_146:STOMACH -$CREATURE:FORGOTTEN_BEAST_146:GIZZARD -%CREATURE:FORGOTTEN_BEAST_146:PANCREAS -#CREATURE:FORGOTTEN_BEAST_146:SPLEEN -#CREATURE:FORGOTTEN_BEAST_146:KIDNEY -#CREATURE:FORGOTTEN_BEAST_148:MUSCLE - CREATURE:FORGOTTEN_BEAST_148:EYE -"CREATURE:FORGOTTEN_BEAST_148:BRAIN -!CREATURE:FORGOTTEN_BEAST_148:LUNG -"CREATURE:FORGOTTEN_BEAST_148:HEART -"CREATURE:FORGOTTEN_BEAST_148:LIVER - CREATURE:FORGOTTEN_BEAST_148:GUT -$CREATURE:FORGOTTEN_BEAST_148:STOMACH -$CREATURE:FORGOTTEN_BEAST_148:GIZZARD -%CREATURE:FORGOTTEN_BEAST_148:PANCREAS -#CREATURE:FORGOTTEN_BEAST_148:SPLEEN -#CREATURE:FORGOTTEN_BEAST_148:KIDNEY -#CREATURE:FORGOTTEN_BEAST_149:MUSCLE - CREATURE:FORGOTTEN_BEAST_149:EYE -"CREATURE:FORGOTTEN_BEAST_149:BRAIN -!CREATURE:FORGOTTEN_BEAST_149:LUNG -"CREATURE:FORGOTTEN_BEAST_149:HEART -"CREATURE:FORGOTTEN_BEAST_149:LIVER - CREATURE:FORGOTTEN_BEAST_149:GUT -$CREATURE:FORGOTTEN_BEAST_149:STOMACH -$CREATURE:FORGOTTEN_BEAST_149:GIZZARD -%CREATURE:FORGOTTEN_BEAST_149:PANCREAS -#CREATURE:FORGOTTEN_BEAST_149:SPLEEN -#CREATURE:FORGOTTEN_BEAST_149:KIDNEY -#CREATURE:FORGOTTEN_BEAST_150:MUSCLE - CREATURE:FORGOTTEN_BEAST_150:EYE -"CREATURE:FORGOTTEN_BEAST_150:BRAIN -!CREATURE:FORGOTTEN_BEAST_150:LUNG -"CREATURE:FORGOTTEN_BEAST_150:HEART -"CREATURE:FORGOTTEN_BEAST_150:LIVER - CREATURE:FORGOTTEN_BEAST_150:GUT -$CREATURE:FORGOTTEN_BEAST_150:STOMACH -$CREATURE:FORGOTTEN_BEAST_150:GIZZARD -%CREATURE:FORGOTTEN_BEAST_150:PANCREAS -#CREATURE:FORGOTTEN_BEAST_150:SPLEEN -#CREATURE:FORGOTTEN_BEAST_150:KIDNEY -#CREATURE:FORGOTTEN_BEAST_152:MUSCLE - CREATURE:FORGOTTEN_BEAST_152:EYE -"CREATURE:FORGOTTEN_BEAST_152:BRAIN -!CREATURE:FORGOTTEN_BEAST_152:LUNG -"CREATURE:FORGOTTEN_BEAST_152:HEART -"CREATURE:FORGOTTEN_BEAST_152:LIVER - CREATURE:FORGOTTEN_BEAST_152:GUT -$CREATURE:FORGOTTEN_BEAST_152:STOMACH -$CREATURE:FORGOTTEN_BEAST_152:GIZZARD -%CREATURE:FORGOTTEN_BEAST_152:PANCREAS -#CREATURE:FORGOTTEN_BEAST_152:SPLEEN -#CREATURE:FORGOTTEN_BEAST_152:KIDNEY -#CREATURE:FORGOTTEN_BEAST_154:MUSCLE - CREATURE:FORGOTTEN_BEAST_154:EYE -"CREATURE:FORGOTTEN_BEAST_154:BRAIN -!CREATURE:FORGOTTEN_BEAST_154:LUNG -"CREATURE:FORGOTTEN_BEAST_154:HEART -"CREATURE:FORGOTTEN_BEAST_154:LIVER - CREATURE:FORGOTTEN_BEAST_154:GUT -$CREATURE:FORGOTTEN_BEAST_154:STOMACH -$CREATURE:FORGOTTEN_BEAST_154:GIZZARD -%CREATURE:FORGOTTEN_BEAST_154:PANCREAS -#CREATURE:FORGOTTEN_BEAST_154:SPLEEN -#CREATURE:FORGOTTEN_BEAST_154:KIDNEY -#CREATURE:FORGOTTEN_BEAST_156:MUSCLE - CREATURE:FORGOTTEN_BEAST_156:EYE -"CREATURE:FORGOTTEN_BEAST_156:BRAIN -!CREATURE:FORGOTTEN_BEAST_156:LUNG -"CREATURE:FORGOTTEN_BEAST_156:HEART -"CREATURE:FORGOTTEN_BEAST_156:LIVER - CREATURE:FORGOTTEN_BEAST_156:GUT -$CREATURE:FORGOTTEN_BEAST_156:STOMACH -$CREATURE:FORGOTTEN_BEAST_156:GIZZARD -%CREATURE:FORGOTTEN_BEAST_156:PANCREAS -#CREATURE:FORGOTTEN_BEAST_156:SPLEEN -#CREATURE:FORGOTTEN_BEAST_156:KIDNEY -#CREATURE:FORGOTTEN_BEAST_157:MUSCLE - CREATURE:FORGOTTEN_BEAST_157:EYE -"CREATURE:FORGOTTEN_BEAST_157:BRAIN -!CREATURE:FORGOTTEN_BEAST_157:LUNG -"CREATURE:FORGOTTEN_BEAST_157:HEART -"CREATURE:FORGOTTEN_BEAST_157:LIVER - CREATURE:FORGOTTEN_BEAST_157:GUT -$CREATURE:FORGOTTEN_BEAST_157:STOMACH -$CREATURE:FORGOTTEN_BEAST_157:GIZZARD -%CREATURE:FORGOTTEN_BEAST_157:PANCREAS -#CREATURE:FORGOTTEN_BEAST_157:SPLEEN -#CREATURE:FORGOTTEN_BEAST_157:KIDNEY -#CREATURE:FORGOTTEN_BEAST_158:MUSCLE - CREATURE:FORGOTTEN_BEAST_158:EYE -"CREATURE:FORGOTTEN_BEAST_158:BRAIN -!CREATURE:FORGOTTEN_BEAST_158:LUNG -"CREATURE:FORGOTTEN_BEAST_158:HEART -"CREATURE:FORGOTTEN_BEAST_158:LIVER - CREATURE:FORGOTTEN_BEAST_158:GUT -$CREATURE:FORGOTTEN_BEAST_158:STOMACH -$CREATURE:FORGOTTEN_BEAST_158:GIZZARD -%CREATURE:FORGOTTEN_BEAST_158:PANCREAS -#CREATURE:FORGOTTEN_BEAST_158:SPLEEN -#CREATURE:FORGOTTEN_BEAST_158:KIDNEY -#CREATURE:FORGOTTEN_BEAST_159:MUSCLE - CREATURE:FORGOTTEN_BEAST_159:EYE -"CREATURE:FORGOTTEN_BEAST_159:BRAIN -!CREATURE:FORGOTTEN_BEAST_159:LUNG -"CREATURE:FORGOTTEN_BEAST_159:HEART -"CREATURE:FORGOTTEN_BEAST_159:LIVER - CREATURE:FORGOTTEN_BEAST_159:GUT -$CREATURE:FORGOTTEN_BEAST_159:STOMACH -$CREATURE:FORGOTTEN_BEAST_159:GIZZARD -%CREATURE:FORGOTTEN_BEAST_159:PANCREAS -#CREATURE:FORGOTTEN_BEAST_159:SPLEEN -#CREATURE:FORGOTTEN_BEAST_159:KIDNEY -#CREATURE:FORGOTTEN_BEAST_161:MUSCLE - CREATURE:FORGOTTEN_BEAST_161:EYE -"CREATURE:FORGOTTEN_BEAST_161:BRAIN -!CREATURE:FORGOTTEN_BEAST_161:LUNG -"CREATURE:FORGOTTEN_BEAST_161:HEART -"CREATURE:FORGOTTEN_BEAST_161:LIVER - CREATURE:FORGOTTEN_BEAST_161:GUT -$CREATURE:FORGOTTEN_BEAST_161:STOMACH -$CREATURE:FORGOTTEN_BEAST_161:GIZZARD -%CREATURE:FORGOTTEN_BEAST_161:PANCREAS -#CREATURE:FORGOTTEN_BEAST_161:SPLEEN -#CREATURE:FORGOTTEN_BEAST_161:KIDNEY -#CREATURE:FORGOTTEN_BEAST_162:MUSCLE - CREATURE:FORGOTTEN_BEAST_162:EYE -"CREATURE:FORGOTTEN_BEAST_162:BRAIN -!CREATURE:FORGOTTEN_BEAST_162:LUNG -"CREATURE:FORGOTTEN_BEAST_162:HEART -"CREATURE:FORGOTTEN_BEAST_162:LIVER - CREATURE:FORGOTTEN_BEAST_162:GUT -$CREATURE:FORGOTTEN_BEAST_162:STOMACH -$CREATURE:FORGOTTEN_BEAST_162:GIZZARD -%CREATURE:FORGOTTEN_BEAST_162:PANCREAS -#CREATURE:FORGOTTEN_BEAST_162:SPLEEN -#CREATURE:FORGOTTEN_BEAST_162:KIDNEY -#CREATURE:FORGOTTEN_BEAST_163:MUSCLE - CREATURE:FORGOTTEN_BEAST_163:EYE -"CREATURE:FORGOTTEN_BEAST_163:BRAIN -!CREATURE:FORGOTTEN_BEAST_163:LUNG -"CREATURE:FORGOTTEN_BEAST_163:HEART -"CREATURE:FORGOTTEN_BEAST_163:LIVER - CREATURE:FORGOTTEN_BEAST_163:GUT -$CREATURE:FORGOTTEN_BEAST_163:STOMACH -$CREATURE:FORGOTTEN_BEAST_163:GIZZARD -%CREATURE:FORGOTTEN_BEAST_163:PANCREAS -#CREATURE:FORGOTTEN_BEAST_163:SPLEEN -#CREATURE:FORGOTTEN_BEAST_163:KIDNEY -#CREATURE:FORGOTTEN_BEAST_165:MUSCLE - CREATURE:FORGOTTEN_BEAST_165:EYE -"CREATURE:FORGOTTEN_BEAST_165:BRAIN -!CREATURE:FORGOTTEN_BEAST_165:LUNG -"CREATURE:FORGOTTEN_BEAST_165:HEART -"CREATURE:FORGOTTEN_BEAST_165:LIVER - CREATURE:FORGOTTEN_BEAST_165:GUT -$CREATURE:FORGOTTEN_BEAST_165:STOMACH -$CREATURE:FORGOTTEN_BEAST_165:GIZZARD -%CREATURE:FORGOTTEN_BEAST_165:PANCREAS -#CREATURE:FORGOTTEN_BEAST_165:SPLEEN -#CREATURE:FORGOTTEN_BEAST_165:KIDNEY -#CREATURE:FORGOTTEN_BEAST_167:MUSCLE - CREATURE:FORGOTTEN_BEAST_167:EYE -"CREATURE:FORGOTTEN_BEAST_167:BRAIN -!CREATURE:FORGOTTEN_BEAST_167:LUNG -"CREATURE:FORGOTTEN_BEAST_167:HEART -"CREATURE:FORGOTTEN_BEAST_167:LIVER - CREATURE:FORGOTTEN_BEAST_167:GUT -$CREATURE:FORGOTTEN_BEAST_167:STOMACH -$CREATURE:FORGOTTEN_BEAST_167:GIZZARD -%CREATURE:FORGOTTEN_BEAST_167:PANCREAS -#CREATURE:FORGOTTEN_BEAST_167:SPLEEN -#CREATURE:FORGOTTEN_BEAST_167:KIDNEY -#CREATURE:FORGOTTEN_BEAST_168:MUSCLE - CREATURE:FORGOTTEN_BEAST_168:EYE -"CREATURE:FORGOTTEN_BEAST_168:BRAIN -!CREATURE:FORGOTTEN_BEAST_168:LUNG -"CREATURE:FORGOTTEN_BEAST_168:HEART -"CREATURE:FORGOTTEN_BEAST_168:LIVER - CREATURE:FORGOTTEN_BEAST_168:GUT -$CREATURE:FORGOTTEN_BEAST_168:STOMACH -$CREATURE:FORGOTTEN_BEAST_168:GIZZARD -%CREATURE:FORGOTTEN_BEAST_168:PANCREAS -#CREATURE:FORGOTTEN_BEAST_168:SPLEEN -#CREATURE:FORGOTTEN_BEAST_168:KIDNEY -#CREATURE:FORGOTTEN_BEAST_169:MUSCLE - CREATURE:FORGOTTEN_BEAST_169:EYE -"CREATURE:FORGOTTEN_BEAST_169:BRAIN -!CREATURE:FORGOTTEN_BEAST_169:LUNG -"CREATURE:FORGOTTEN_BEAST_169:HEART -"CREATURE:FORGOTTEN_BEAST_169:LIVER - CREATURE:FORGOTTEN_BEAST_169:GUT -$CREATURE:FORGOTTEN_BEAST_169:STOMACH -$CREATURE:FORGOTTEN_BEAST_169:GIZZARD -%CREATURE:FORGOTTEN_BEAST_169:PANCREAS -#CREATURE:FORGOTTEN_BEAST_169:SPLEEN -#CREATURE:FORGOTTEN_BEAST_169:KIDNEY -#CREATURE:FORGOTTEN_BEAST_170:MUSCLE - CREATURE:FORGOTTEN_BEAST_170:EYE -"CREATURE:FORGOTTEN_BEAST_170:BRAIN -!CREATURE:FORGOTTEN_BEAST_170:LUNG -"CREATURE:FORGOTTEN_BEAST_170:HEART -"CREATURE:FORGOTTEN_BEAST_170:LIVER - CREATURE:FORGOTTEN_BEAST_170:GUT -$CREATURE:FORGOTTEN_BEAST_170:STOMACH -$CREATURE:FORGOTTEN_BEAST_170:GIZZARD -%CREATURE:FORGOTTEN_BEAST_170:PANCREAS -#CREATURE:FORGOTTEN_BEAST_170:SPLEEN -#CREATURE:FORGOTTEN_BEAST_170:KIDNEY -#CREATURE:FORGOTTEN_BEAST_171:MUSCLE - CREATURE:FORGOTTEN_BEAST_171:EYE -"CREATURE:FORGOTTEN_BEAST_171:BRAIN -!CREATURE:FORGOTTEN_BEAST_171:LUNG -"CREATURE:FORGOTTEN_BEAST_171:HEART -"CREATURE:FORGOTTEN_BEAST_171:LIVER - CREATURE:FORGOTTEN_BEAST_171:GUT -$CREATURE:FORGOTTEN_BEAST_171:STOMACH -$CREATURE:FORGOTTEN_BEAST_171:GIZZARD -%CREATURE:FORGOTTEN_BEAST_171:PANCREAS -#CREATURE:FORGOTTEN_BEAST_171:SPLEEN -#CREATURE:FORGOTTEN_BEAST_171:KIDNEY -#CREATURE:FORGOTTEN_BEAST_172:MUSCLE - CREATURE:FORGOTTEN_BEAST_172:EYE -"CREATURE:FORGOTTEN_BEAST_172:BRAIN -!CREATURE:FORGOTTEN_BEAST_172:LUNG -"CREATURE:FORGOTTEN_BEAST_172:HEART -"CREATURE:FORGOTTEN_BEAST_172:LIVER - CREATURE:FORGOTTEN_BEAST_172:GUT -$CREATURE:FORGOTTEN_BEAST_172:STOMACH -$CREATURE:FORGOTTEN_BEAST_172:GIZZARD -%CREATURE:FORGOTTEN_BEAST_172:PANCREAS -#CREATURE:FORGOTTEN_BEAST_172:SPLEEN -#CREATURE:FORGOTTEN_BEAST_172:KIDNEY -#CREATURE:FORGOTTEN_BEAST_173:MUSCLE - CREATURE:FORGOTTEN_BEAST_173:EYE -"CREATURE:FORGOTTEN_BEAST_173:BRAIN -!CREATURE:FORGOTTEN_BEAST_173:LUNG -"CREATURE:FORGOTTEN_BEAST_173:HEART -"CREATURE:FORGOTTEN_BEAST_173:LIVER - CREATURE:FORGOTTEN_BEAST_173:GUT -$CREATURE:FORGOTTEN_BEAST_173:STOMACH -$CREATURE:FORGOTTEN_BEAST_173:GIZZARD -%CREATURE:FORGOTTEN_BEAST_173:PANCREAS -#CREATURE:FORGOTTEN_BEAST_173:SPLEEN -#CREATURE:FORGOTTEN_BEAST_173:KIDNEY -#CREATURE:FORGOTTEN_BEAST_176:MUSCLE - CREATURE:FORGOTTEN_BEAST_176:EYE -"CREATURE:FORGOTTEN_BEAST_176:BRAIN -!CREATURE:FORGOTTEN_BEAST_176:LUNG -"CREATURE:FORGOTTEN_BEAST_176:HEART -"CREATURE:FORGOTTEN_BEAST_176:LIVER - CREATURE:FORGOTTEN_BEAST_176:GUT -$CREATURE:FORGOTTEN_BEAST_176:STOMACH -$CREATURE:FORGOTTEN_BEAST_176:GIZZARD -%CREATURE:FORGOTTEN_BEAST_176:PANCREAS -#CREATURE:FORGOTTEN_BEAST_176:SPLEEN -#CREATURE:FORGOTTEN_BEAST_176:KIDNEY -#CREATURE:FORGOTTEN_BEAST_177:MUSCLE - CREATURE:FORGOTTEN_BEAST_177:EYE -"CREATURE:FORGOTTEN_BEAST_177:BRAIN -!CREATURE:FORGOTTEN_BEAST_177:LUNG -"CREATURE:FORGOTTEN_BEAST_177:HEART -"CREATURE:FORGOTTEN_BEAST_177:LIVER - CREATURE:FORGOTTEN_BEAST_177:GUT -$CREATURE:FORGOTTEN_BEAST_177:STOMACH -$CREATURE:FORGOTTEN_BEAST_177:GIZZARD -%CREATURE:FORGOTTEN_BEAST_177:PANCREAS -#CREATURE:FORGOTTEN_BEAST_177:SPLEEN -#CREATURE:FORGOTTEN_BEAST_177:KIDNEY -#CREATURE:FORGOTTEN_BEAST_178:MUSCLE - CREATURE:FORGOTTEN_BEAST_178:EYE -"CREATURE:FORGOTTEN_BEAST_178:BRAIN -!CREATURE:FORGOTTEN_BEAST_178:LUNG -"CREATURE:FORGOTTEN_BEAST_178:HEART -"CREATURE:FORGOTTEN_BEAST_178:LIVER - CREATURE:FORGOTTEN_BEAST_178:GUT -$CREATURE:FORGOTTEN_BEAST_178:STOMACH -$CREATURE:FORGOTTEN_BEAST_178:GIZZARD -%CREATURE:FORGOTTEN_BEAST_178:PANCREAS -#CREATURE:FORGOTTEN_BEAST_178:SPLEEN -#CREATURE:FORGOTTEN_BEAST_178:KIDNEY -#CREATURE:FORGOTTEN_BEAST_179:MUSCLE - CREATURE:FORGOTTEN_BEAST_179:EYE -"CREATURE:FORGOTTEN_BEAST_179:BRAIN -!CREATURE:FORGOTTEN_BEAST_179:LUNG -"CREATURE:FORGOTTEN_BEAST_179:HEART -"CREATURE:FORGOTTEN_BEAST_179:LIVER - CREATURE:FORGOTTEN_BEAST_179:GUT -$CREATURE:FORGOTTEN_BEAST_179:STOMACH -$CREATURE:FORGOTTEN_BEAST_179:GIZZARD -%CREATURE:FORGOTTEN_BEAST_179:PANCREAS -#CREATURE:FORGOTTEN_BEAST_179:SPLEEN -#CREATURE:FORGOTTEN_BEAST_179:KIDNEY -#CREATURE:FORGOTTEN_BEAST_180:MUSCLE - CREATURE:FORGOTTEN_BEAST_180:EYE -"CREATURE:FORGOTTEN_BEAST_180:BRAIN -!CREATURE:FORGOTTEN_BEAST_180:LUNG -"CREATURE:FORGOTTEN_BEAST_180:HEART -"CREATURE:FORGOTTEN_BEAST_180:LIVER - CREATURE:FORGOTTEN_BEAST_180:GUT -$CREATURE:FORGOTTEN_BEAST_180:STOMACH -$CREATURE:FORGOTTEN_BEAST_180:GIZZARD -%CREATURE:FORGOTTEN_BEAST_180:PANCREAS -#CREATURE:FORGOTTEN_BEAST_180:SPLEEN -#CREATURE:FORGOTTEN_BEAST_180:KIDNEY -#CREATURE:FORGOTTEN_BEAST_181:MUSCLE - CREATURE:FORGOTTEN_BEAST_181:EYE -"CREATURE:FORGOTTEN_BEAST_181:BRAIN -!CREATURE:FORGOTTEN_BEAST_181:LUNG -"CREATURE:FORGOTTEN_BEAST_181:HEART -"CREATURE:FORGOTTEN_BEAST_181:LIVER - CREATURE:FORGOTTEN_BEAST_181:GUT -$CREATURE:FORGOTTEN_BEAST_181:STOMACH -$CREATURE:FORGOTTEN_BEAST_181:GIZZARD -%CREATURE:FORGOTTEN_BEAST_181:PANCREAS -#CREATURE:FORGOTTEN_BEAST_181:SPLEEN -#CREATURE:FORGOTTEN_BEAST_181:KIDNEY -#CREATURE:FORGOTTEN_BEAST_182:MUSCLE - CREATURE:FORGOTTEN_BEAST_182:EYE -"CREATURE:FORGOTTEN_BEAST_182:BRAIN -!CREATURE:FORGOTTEN_BEAST_182:LUNG -"CREATURE:FORGOTTEN_BEAST_182:HEART -"CREATURE:FORGOTTEN_BEAST_182:LIVER - CREATURE:FORGOTTEN_BEAST_182:GUT -$CREATURE:FORGOTTEN_BEAST_182:STOMACH -$CREATURE:FORGOTTEN_BEAST_182:GIZZARD -%CREATURE:FORGOTTEN_BEAST_182:PANCREAS -#CREATURE:FORGOTTEN_BEAST_182:SPLEEN -#CREATURE:FORGOTTEN_BEAST_182:KIDNEY -#CREATURE:FORGOTTEN_BEAST_183:MUSCLE - CREATURE:FORGOTTEN_BEAST_183:EYE -"CREATURE:FORGOTTEN_BEAST_183:BRAIN -!CREATURE:FORGOTTEN_BEAST_183:LUNG -"CREATURE:FORGOTTEN_BEAST_183:HEART -"CREATURE:FORGOTTEN_BEAST_183:LIVER - CREATURE:FORGOTTEN_BEAST_183:GUT -$CREATURE:FORGOTTEN_BEAST_183:STOMACH -$CREATURE:FORGOTTEN_BEAST_183:GIZZARD -%CREATURE:FORGOTTEN_BEAST_183:PANCREAS -#CREATURE:FORGOTTEN_BEAST_183:SPLEEN -#CREATURE:FORGOTTEN_BEAST_183:KIDNEY -#CREATURE:FORGOTTEN_BEAST_184:MUSCLE - CREATURE:FORGOTTEN_BEAST_184:EYE -"CREATURE:FORGOTTEN_BEAST_184:BRAIN -!CREATURE:FORGOTTEN_BEAST_184:LUNG -"CREATURE:FORGOTTEN_BEAST_184:HEART -"CREATURE:FORGOTTEN_BEAST_184:LIVER - CREATURE:FORGOTTEN_BEAST_184:GUT -$CREATURE:FORGOTTEN_BEAST_184:STOMACH -$CREATURE:FORGOTTEN_BEAST_184:GIZZARD -%CREATURE:FORGOTTEN_BEAST_184:PANCREAS -#CREATURE:FORGOTTEN_BEAST_184:SPLEEN -#CREATURE:FORGOTTEN_BEAST_184:KIDNEY -#CREATURE:FORGOTTEN_BEAST_185:MUSCLE - CREATURE:FORGOTTEN_BEAST_185:EYE -"CREATURE:FORGOTTEN_BEAST_185:BRAIN -!CREATURE:FORGOTTEN_BEAST_185:LUNG -"CREATURE:FORGOTTEN_BEAST_185:HEART -"CREATURE:FORGOTTEN_BEAST_185:LIVER - CREATURE:FORGOTTEN_BEAST_185:GUT -$CREATURE:FORGOTTEN_BEAST_185:STOMACH -$CREATURE:FORGOTTEN_BEAST_185:GIZZARD -%CREATURE:FORGOTTEN_BEAST_185:PANCREAS -#CREATURE:FORGOTTEN_BEAST_185:SPLEEN -#CREATURE:FORGOTTEN_BEAST_185:KIDNEY -#CREATURE:FORGOTTEN_BEAST_186:MUSCLE - CREATURE:FORGOTTEN_BEAST_186:EYE -"CREATURE:FORGOTTEN_BEAST_186:BRAIN -!CREATURE:FORGOTTEN_BEAST_186:LUNG -"CREATURE:FORGOTTEN_BEAST_186:HEART -"CREATURE:FORGOTTEN_BEAST_186:LIVER - CREATURE:FORGOTTEN_BEAST_186:GUT -$CREATURE:FORGOTTEN_BEAST_186:STOMACH -$CREATURE:FORGOTTEN_BEAST_186:GIZZARD -%CREATURE:FORGOTTEN_BEAST_186:PANCREAS -#CREATURE:FORGOTTEN_BEAST_186:SPLEEN -#CREATURE:FORGOTTEN_BEAST_186:KIDNEY -#CREATURE:FORGOTTEN_BEAST_188:MUSCLE - CREATURE:FORGOTTEN_BEAST_188:EYE -"CREATURE:FORGOTTEN_BEAST_188:BRAIN -!CREATURE:FORGOTTEN_BEAST_188:LUNG -"CREATURE:FORGOTTEN_BEAST_188:HEART -"CREATURE:FORGOTTEN_BEAST_188:LIVER - CREATURE:FORGOTTEN_BEAST_188:GUT -$CREATURE:FORGOTTEN_BEAST_188:STOMACH -$CREATURE:FORGOTTEN_BEAST_188:GIZZARD -%CREATURE:FORGOTTEN_BEAST_188:PANCREAS -#CREATURE:FORGOTTEN_BEAST_188:SPLEEN -#CREATURE:FORGOTTEN_BEAST_188:KIDNEY -#CREATURE:FORGOTTEN_BEAST_189:MUSCLE - CREATURE:FORGOTTEN_BEAST_189:EYE -"CREATURE:FORGOTTEN_BEAST_189:BRAIN -!CREATURE:FORGOTTEN_BEAST_189:LUNG -"CREATURE:FORGOTTEN_BEAST_189:HEART -"CREATURE:FORGOTTEN_BEAST_189:LIVER - CREATURE:FORGOTTEN_BEAST_189:GUT -$CREATURE:FORGOTTEN_BEAST_189:STOMACH -$CREATURE:FORGOTTEN_BEAST_189:GIZZARD -%CREATURE:FORGOTTEN_BEAST_189:PANCREAS -#CREATURE:FORGOTTEN_BEAST_189:SPLEEN -#CREATURE:FORGOTTEN_BEAST_189:KIDNEY -#CREATURE:FORGOTTEN_BEAST_190:MUSCLE - CREATURE:FORGOTTEN_BEAST_190:EYE -"CREATURE:FORGOTTEN_BEAST_190:BRAIN -!CREATURE:FORGOTTEN_BEAST_190:LUNG -"CREATURE:FORGOTTEN_BEAST_190:HEART -"CREATURE:FORGOTTEN_BEAST_190:LIVER - CREATURE:FORGOTTEN_BEAST_190:GUT -$CREATURE:FORGOTTEN_BEAST_190:STOMACH -$CREATURE:FORGOTTEN_BEAST_190:GIZZARD -%CREATURE:FORGOTTEN_BEAST_190:PANCREAS -#CREATURE:FORGOTTEN_BEAST_190:SPLEEN -#CREATURE:FORGOTTEN_BEAST_190:KIDNEY -#CREATURE:FORGOTTEN_BEAST_191:MUSCLE - CREATURE:FORGOTTEN_BEAST_191:EYE -"CREATURE:FORGOTTEN_BEAST_191:BRAIN -!CREATURE:FORGOTTEN_BEAST_191:LUNG -"CREATURE:FORGOTTEN_BEAST_191:HEART -"CREATURE:FORGOTTEN_BEAST_191:LIVER - CREATURE:FORGOTTEN_BEAST_191:GUT -$CREATURE:FORGOTTEN_BEAST_191:STOMACH -$CREATURE:FORGOTTEN_BEAST_191:GIZZARD -%CREATURE:FORGOTTEN_BEAST_191:PANCREAS -#CREATURE:FORGOTTEN_BEAST_191:SPLEEN -#CREATURE:FORGOTTEN_BEAST_191:KIDNEY -#CREATURE:FORGOTTEN_BEAST_193:MUSCLE - CREATURE:FORGOTTEN_BEAST_193:EYE -"CREATURE:FORGOTTEN_BEAST_193:BRAIN -!CREATURE:FORGOTTEN_BEAST_193:LUNG -"CREATURE:FORGOTTEN_BEAST_193:HEART -"CREATURE:FORGOTTEN_BEAST_193:LIVER - CREATURE:FORGOTTEN_BEAST_193:GUT -$CREATURE:FORGOTTEN_BEAST_193:STOMACH -$CREATURE:FORGOTTEN_BEAST_193:GIZZARD -%CREATURE:FORGOTTEN_BEAST_193:PANCREAS -#CREATURE:FORGOTTEN_BEAST_193:SPLEEN -#CREATURE:FORGOTTEN_BEAST_193:KIDNEY -#CREATURE:FORGOTTEN_BEAST_194:MUSCLE - CREATURE:FORGOTTEN_BEAST_194:EYE -"CREATURE:FORGOTTEN_BEAST_194:BRAIN -!CREATURE:FORGOTTEN_BEAST_194:LUNG -"CREATURE:FORGOTTEN_BEAST_194:HEART -"CREATURE:FORGOTTEN_BEAST_194:LIVER - CREATURE:FORGOTTEN_BEAST_194:GUT -$CREATURE:FORGOTTEN_BEAST_194:STOMACH -$CREATURE:FORGOTTEN_BEAST_194:GIZZARD -%CREATURE:FORGOTTEN_BEAST_194:PANCREAS -#CREATURE:FORGOTTEN_BEAST_194:SPLEEN -#CREATURE:FORGOTTEN_BEAST_194:KIDNEY -#CREATURE:FORGOTTEN_BEAST_195:MUSCLE - CREATURE:FORGOTTEN_BEAST_195:EYE -"CREATURE:FORGOTTEN_BEAST_195:BRAIN -!CREATURE:FORGOTTEN_BEAST_195:LUNG -"CREATURE:FORGOTTEN_BEAST_195:HEART -"CREATURE:FORGOTTEN_BEAST_195:LIVER - CREATURE:FORGOTTEN_BEAST_195:GUT -$CREATURE:FORGOTTEN_BEAST_195:STOMACH -$CREATURE:FORGOTTEN_BEAST_195:GIZZARD -%CREATURE:FORGOTTEN_BEAST_195:PANCREAS -#CREATURE:FORGOTTEN_BEAST_195:SPLEEN -#CREATURE:FORGOTTEN_BEAST_195:KIDNEY -#CREATURE:FORGOTTEN_BEAST_196:MUSCLE - CREATURE:FORGOTTEN_BEAST_196:EYE -"CREATURE:FORGOTTEN_BEAST_196:BRAIN -!CREATURE:FORGOTTEN_BEAST_196:LUNG -"CREATURE:FORGOTTEN_BEAST_196:HEART -"CREATURE:FORGOTTEN_BEAST_196:LIVER - CREATURE:FORGOTTEN_BEAST_196:GUT -$CREATURE:FORGOTTEN_BEAST_196:STOMACH -$CREATURE:FORGOTTEN_BEAST_196:GIZZARD -%CREATURE:FORGOTTEN_BEAST_196:PANCREAS -#CREATURE:FORGOTTEN_BEAST_196:SPLEEN -#CREATURE:FORGOTTEN_BEAST_196:KIDNEY -#CREATURE:FORGOTTEN_BEAST_197:MUSCLE - CREATURE:FORGOTTEN_BEAST_197:EYE -"CREATURE:FORGOTTEN_BEAST_197:BRAIN -!CREATURE:FORGOTTEN_BEAST_197:LUNG -"CREATURE:FORGOTTEN_BEAST_197:HEART -"CREATURE:FORGOTTEN_BEAST_197:LIVER - CREATURE:FORGOTTEN_BEAST_197:GUT -$CREATURE:FORGOTTEN_BEAST_197:STOMACH -$CREATURE:FORGOTTEN_BEAST_197:GIZZARD -%CREATURE:FORGOTTEN_BEAST_197:PANCREAS -#CREATURE:FORGOTTEN_BEAST_197:SPLEEN -#CREATURE:FORGOTTEN_BEAST_197:KIDNEY -#CREATURE:FORGOTTEN_BEAST_199:MUSCLE - CREATURE:FORGOTTEN_BEAST_199:EYE -"CREATURE:FORGOTTEN_BEAST_199:BRAIN -!CREATURE:FORGOTTEN_BEAST_199:LUNG -"CREATURE:FORGOTTEN_BEAST_199:HEART -"CREATURE:FORGOTTEN_BEAST_199:LIVER - CREATURE:FORGOTTEN_BEAST_199:GUT -$CREATURE:FORGOTTEN_BEAST_199:STOMACH -$CREATURE:FORGOTTEN_BEAST_199:GIZZARD -%CREATURE:FORGOTTEN_BEAST_199:PANCREAS -#CREATURE:FORGOTTEN_BEAST_199:SPLEEN -#CREATURE:FORGOTTEN_BEAST_199:KIDNEY -#CREATURE:FORGOTTEN_BEAST_200:MUSCLE - CREATURE:FORGOTTEN_BEAST_200:EYE -"CREATURE:FORGOTTEN_BEAST_200:BRAIN -!CREATURE:FORGOTTEN_BEAST_200:LUNG -"CREATURE:FORGOTTEN_BEAST_200:HEART -"CREATURE:FORGOTTEN_BEAST_200:LIVER - CREATURE:FORGOTTEN_BEAST_200:GUT -$CREATURE:FORGOTTEN_BEAST_200:STOMACH -$CREATURE:FORGOTTEN_BEAST_200:GIZZARD -%CREATURE:FORGOTTEN_BEAST_200:PANCREAS -#CREATURE:FORGOTTEN_BEAST_200:SPLEEN -#CREATURE:FORGOTTEN_BEAST_200:KIDNEY -#CREATURE:FORGOTTEN_BEAST_201:MUSCLE - CREATURE:FORGOTTEN_BEAST_201:EYE -"CREATURE:FORGOTTEN_BEAST_201:BRAIN -!CREATURE:FORGOTTEN_BEAST_201:LUNG -"CREATURE:FORGOTTEN_BEAST_201:HEART -"CREATURE:FORGOTTEN_BEAST_201:LIVER - CREATURE:FORGOTTEN_BEAST_201:GUT -$CREATURE:FORGOTTEN_BEAST_201:STOMACH -$CREATURE:FORGOTTEN_BEAST_201:GIZZARD -%CREATURE:FORGOTTEN_BEAST_201:PANCREAS -#CREATURE:FORGOTTEN_BEAST_201:SPLEEN -#CREATURE:FORGOTTEN_BEAST_201:KIDNEY -#CREATURE:FORGOTTEN_BEAST_204:MUSCLE - CREATURE:FORGOTTEN_BEAST_204:EYE -"CREATURE:FORGOTTEN_BEAST_204:BRAIN -!CREATURE:FORGOTTEN_BEAST_204:LUNG -"CREATURE:FORGOTTEN_BEAST_204:HEART -"CREATURE:FORGOTTEN_BEAST_204:LIVER - CREATURE:FORGOTTEN_BEAST_204:GUT -$CREATURE:FORGOTTEN_BEAST_204:STOMACH -$CREATURE:FORGOTTEN_BEAST_204:GIZZARD -%CREATURE:FORGOTTEN_BEAST_204:PANCREAS -#CREATURE:FORGOTTEN_BEAST_204:SPLEEN -#CREATURE:FORGOTTEN_BEAST_204:KIDNEY -#CREATURE:FORGOTTEN_BEAST_205:MUSCLE - CREATURE:FORGOTTEN_BEAST_205:EYE -"CREATURE:FORGOTTEN_BEAST_205:BRAIN -!CREATURE:FORGOTTEN_BEAST_205:LUNG -"CREATURE:FORGOTTEN_BEAST_205:HEART -"CREATURE:FORGOTTEN_BEAST_205:LIVER - CREATURE:FORGOTTEN_BEAST_205:GUT -$CREATURE:FORGOTTEN_BEAST_205:STOMACH -$CREATURE:FORGOTTEN_BEAST_205:GIZZARD -%CREATURE:FORGOTTEN_BEAST_205:PANCREAS -#CREATURE:FORGOTTEN_BEAST_205:SPLEEN -#CREATURE:FORGOTTEN_BEAST_205:KIDNEY -#CREATURE:FORGOTTEN_BEAST_206:MUSCLE - CREATURE:FORGOTTEN_BEAST_206:EYE -"CREATURE:FORGOTTEN_BEAST_206:BRAIN -!CREATURE:FORGOTTEN_BEAST_206:LUNG -"CREATURE:FORGOTTEN_BEAST_206:HEART -"CREATURE:FORGOTTEN_BEAST_206:LIVER - CREATURE:FORGOTTEN_BEAST_206:GUT -$CREATURE:FORGOTTEN_BEAST_206:STOMACH -$CREATURE:FORGOTTEN_BEAST_206:GIZZARD -%CREATURE:FORGOTTEN_BEAST_206:PANCREAS -#CREATURE:FORGOTTEN_BEAST_206:SPLEEN -#CREATURE:FORGOTTEN_BEAST_206:KIDNEY -#CREATURE:FORGOTTEN_BEAST_207:MUSCLE - CREATURE:FORGOTTEN_BEAST_207:EYE -"CREATURE:FORGOTTEN_BEAST_207:BRAIN -!CREATURE:FORGOTTEN_BEAST_207:LUNG -"CREATURE:FORGOTTEN_BEAST_207:HEART -"CREATURE:FORGOTTEN_BEAST_207:LIVER - CREATURE:FORGOTTEN_BEAST_207:GUT -$CREATURE:FORGOTTEN_BEAST_207:STOMACH -$CREATURE:FORGOTTEN_BEAST_207:GIZZARD -%CREATURE:FORGOTTEN_BEAST_207:PANCREAS -#CREATURE:FORGOTTEN_BEAST_207:SPLEEN -#CREATURE:FORGOTTEN_BEAST_207:KIDNEY -#CREATURE:FORGOTTEN_BEAST_208:MUSCLE - CREATURE:FORGOTTEN_BEAST_208:EYE -"CREATURE:FORGOTTEN_BEAST_208:BRAIN -!CREATURE:FORGOTTEN_BEAST_208:LUNG -"CREATURE:FORGOTTEN_BEAST_208:HEART -"CREATURE:FORGOTTEN_BEAST_208:LIVER - CREATURE:FORGOTTEN_BEAST_208:GUT -$CREATURE:FORGOTTEN_BEAST_208:STOMACH -$CREATURE:FORGOTTEN_BEAST_208:GIZZARD -%CREATURE:FORGOTTEN_BEAST_208:PANCREAS -#CREATURE:FORGOTTEN_BEAST_208:SPLEEN -#CREATURE:FORGOTTEN_BEAST_208:KIDNEY -#CREATURE:FORGOTTEN_BEAST_209:MUSCLE - CREATURE:FORGOTTEN_BEAST_209:EYE -"CREATURE:FORGOTTEN_BEAST_209:BRAIN -!CREATURE:FORGOTTEN_BEAST_209:LUNG -"CREATURE:FORGOTTEN_BEAST_209:HEART -"CREATURE:FORGOTTEN_BEAST_209:LIVER - CREATURE:FORGOTTEN_BEAST_209:GUT -$CREATURE:FORGOTTEN_BEAST_209:STOMACH -$CREATURE:FORGOTTEN_BEAST_209:GIZZARD -%CREATURE:FORGOTTEN_BEAST_209:PANCREAS -#CREATURE:FORGOTTEN_BEAST_209:SPLEEN -#CREATURE:FORGOTTEN_BEAST_209:KIDNEY -#CREATURE:FORGOTTEN_BEAST_210:MUSCLE - CREATURE:FORGOTTEN_BEAST_210:EYE -"CREATURE:FORGOTTEN_BEAST_210:BRAIN -!CREATURE:FORGOTTEN_BEAST_210:LUNG -"CREATURE:FORGOTTEN_BEAST_210:HEART -"CREATURE:FORGOTTEN_BEAST_210:LIVER - CREATURE:FORGOTTEN_BEAST_210:GUT -$CREATURE:FORGOTTEN_BEAST_210:STOMACH -$CREATURE:FORGOTTEN_BEAST_210:GIZZARD -%CREATURE:FORGOTTEN_BEAST_210:PANCREAS -#CREATURE:FORGOTTEN_BEAST_210:SPLEEN -#CREATURE:FORGOTTEN_BEAST_210:KIDNEY -#CREATURE:FORGOTTEN_BEAST_211:MUSCLE - CREATURE:FORGOTTEN_BEAST_211:EYE -"CREATURE:FORGOTTEN_BEAST_211:BRAIN -!CREATURE:FORGOTTEN_BEAST_211:LUNG -"CREATURE:FORGOTTEN_BEAST_211:HEART -"CREATURE:FORGOTTEN_BEAST_211:LIVER - CREATURE:FORGOTTEN_BEAST_211:GUT -$CREATURE:FORGOTTEN_BEAST_211:STOMACH -$CREATURE:FORGOTTEN_BEAST_211:GIZZARD -%CREATURE:FORGOTTEN_BEAST_211:PANCREAS -#CREATURE:FORGOTTEN_BEAST_211:SPLEEN -#CREATURE:FORGOTTEN_BEAST_211:KIDNEY -#CREATURE:FORGOTTEN_BEAST_212:MUSCLE - CREATURE:FORGOTTEN_BEAST_212:EYE -"CREATURE:FORGOTTEN_BEAST_212:BRAIN -!CREATURE:FORGOTTEN_BEAST_212:LUNG -"CREATURE:FORGOTTEN_BEAST_212:HEART -"CREATURE:FORGOTTEN_BEAST_212:LIVER - CREATURE:FORGOTTEN_BEAST_212:GUT -$CREATURE:FORGOTTEN_BEAST_212:STOMACH -$CREATURE:FORGOTTEN_BEAST_212:GIZZARD -%CREATURE:FORGOTTEN_BEAST_212:PANCREAS -#CREATURE:FORGOTTEN_BEAST_212:SPLEEN -#CREATURE:FORGOTTEN_BEAST_212:KIDNEY -#CREATURE:FORGOTTEN_BEAST_213:MUSCLE - CREATURE:FORGOTTEN_BEAST_213:EYE -"CREATURE:FORGOTTEN_BEAST_213:BRAIN -!CREATURE:FORGOTTEN_BEAST_213:LUNG -"CREATURE:FORGOTTEN_BEAST_213:HEART -"CREATURE:FORGOTTEN_BEAST_213:LIVER - CREATURE:FORGOTTEN_BEAST_213:GUT -$CREATURE:FORGOTTEN_BEAST_213:STOMACH -$CREATURE:FORGOTTEN_BEAST_213:GIZZARD -%CREATURE:FORGOTTEN_BEAST_213:PANCREAS -#CREATURE:FORGOTTEN_BEAST_213:SPLEEN -#CREATURE:FORGOTTEN_BEAST_213:KIDNEY -#CREATURE:FORGOTTEN_BEAST_214:MUSCLE - CREATURE:FORGOTTEN_BEAST_214:EYE -"CREATURE:FORGOTTEN_BEAST_214:BRAIN -!CREATURE:FORGOTTEN_BEAST_214:LUNG -"CREATURE:FORGOTTEN_BEAST_214:HEART -"CREATURE:FORGOTTEN_BEAST_214:LIVER - CREATURE:FORGOTTEN_BEAST_214:GUT -$CREATURE:FORGOTTEN_BEAST_214:STOMACH -$CREATURE:FORGOTTEN_BEAST_214:GIZZARD -%CREATURE:FORGOTTEN_BEAST_214:PANCREAS -#CREATURE:FORGOTTEN_BEAST_214:SPLEEN -#CREATURE:FORGOTTEN_BEAST_214:KIDNEY -#CREATURE:FORGOTTEN_BEAST_215:MUSCLE - CREATURE:FORGOTTEN_BEAST_215:EYE -"CREATURE:FORGOTTEN_BEAST_215:BRAIN -!CREATURE:FORGOTTEN_BEAST_215:LUNG -"CREATURE:FORGOTTEN_BEAST_215:HEART -"CREATURE:FORGOTTEN_BEAST_215:LIVER - CREATURE:FORGOTTEN_BEAST_215:GUT -$CREATURE:FORGOTTEN_BEAST_215:STOMACH -$CREATURE:FORGOTTEN_BEAST_215:GIZZARD -%CREATURE:FORGOTTEN_BEAST_215:PANCREAS -#CREATURE:FORGOTTEN_BEAST_215:SPLEEN -#CREATURE:FORGOTTEN_BEAST_215:KIDNEY -#CREATURE:FORGOTTEN_BEAST_216:MUSCLE - CREATURE:FORGOTTEN_BEAST_216:EYE -"CREATURE:FORGOTTEN_BEAST_216:BRAIN -!CREATURE:FORGOTTEN_BEAST_216:LUNG -"CREATURE:FORGOTTEN_BEAST_216:HEART -"CREATURE:FORGOTTEN_BEAST_216:LIVER - CREATURE:FORGOTTEN_BEAST_216:GUT -$CREATURE:FORGOTTEN_BEAST_216:STOMACH -$CREATURE:FORGOTTEN_BEAST_216:GIZZARD -%CREATURE:FORGOTTEN_BEAST_216:PANCREAS -#CREATURE:FORGOTTEN_BEAST_216:SPLEEN -#CREATURE:FORGOTTEN_BEAST_216:KIDNEY -#CREATURE:FORGOTTEN_BEAST_217:MUSCLE - CREATURE:FORGOTTEN_BEAST_217:EYE -"CREATURE:FORGOTTEN_BEAST_217:BRAIN -!CREATURE:FORGOTTEN_BEAST_217:LUNG -"CREATURE:FORGOTTEN_BEAST_217:HEART -"CREATURE:FORGOTTEN_BEAST_217:LIVER - CREATURE:FORGOTTEN_BEAST_217:GUT -$CREATURE:FORGOTTEN_BEAST_217:STOMACH -$CREATURE:FORGOTTEN_BEAST_217:GIZZARD -%CREATURE:FORGOTTEN_BEAST_217:PANCREAS -#CREATURE:FORGOTTEN_BEAST_217:SPLEEN -#CREATURE:FORGOTTEN_BEAST_217:KIDNEY -#CREATURE:FORGOTTEN_BEAST_218:MUSCLE - CREATURE:FORGOTTEN_BEAST_218:EYE -"CREATURE:FORGOTTEN_BEAST_218:BRAIN -!CREATURE:FORGOTTEN_BEAST_218:LUNG -"CREATURE:FORGOTTEN_BEAST_218:HEART -"CREATURE:FORGOTTEN_BEAST_218:LIVER - CREATURE:FORGOTTEN_BEAST_218:GUT -$CREATURE:FORGOTTEN_BEAST_218:STOMACH -$CREATURE:FORGOTTEN_BEAST_218:GIZZARD -%CREATURE:FORGOTTEN_BEAST_218:PANCREAS -#CREATURE:FORGOTTEN_BEAST_218:SPLEEN -#CREATURE:FORGOTTEN_BEAST_218:KIDNEY -#CREATURE:FORGOTTEN_BEAST_220:MUSCLE - CREATURE:FORGOTTEN_BEAST_220:EYE -"CREATURE:FORGOTTEN_BEAST_220:BRAIN -!CREATURE:FORGOTTEN_BEAST_220:LUNG -"CREATURE:FORGOTTEN_BEAST_220:HEART -"CREATURE:FORGOTTEN_BEAST_220:LIVER - CREATURE:FORGOTTEN_BEAST_220:GUT -$CREATURE:FORGOTTEN_BEAST_220:STOMACH -$CREATURE:FORGOTTEN_BEAST_220:GIZZARD -%CREATURE:FORGOTTEN_BEAST_220:PANCREAS -#CREATURE:FORGOTTEN_BEAST_220:SPLEEN -#CREATURE:FORGOTTEN_BEAST_220:KIDNEY -#CREATURE:FORGOTTEN_BEAST_221:MUSCLE - CREATURE:FORGOTTEN_BEAST_221:EYE -"CREATURE:FORGOTTEN_BEAST_221:BRAIN -!CREATURE:FORGOTTEN_BEAST_221:LUNG -"CREATURE:FORGOTTEN_BEAST_221:HEART -"CREATURE:FORGOTTEN_BEAST_221:LIVER - CREATURE:FORGOTTEN_BEAST_221:GUT -$CREATURE:FORGOTTEN_BEAST_221:STOMACH -$CREATURE:FORGOTTEN_BEAST_221:GIZZARD -%CREATURE:FORGOTTEN_BEAST_221:PANCREAS -#CREATURE:FORGOTTEN_BEAST_221:SPLEEN -#CREATURE:FORGOTTEN_BEAST_221:KIDNEY -#CREATURE:FORGOTTEN_BEAST_224:MUSCLE - CREATURE:FORGOTTEN_BEAST_224:EYE -"CREATURE:FORGOTTEN_BEAST_224:BRAIN -!CREATURE:FORGOTTEN_BEAST_224:LUNG -"CREATURE:FORGOTTEN_BEAST_224:HEART -"CREATURE:FORGOTTEN_BEAST_224:LIVER - CREATURE:FORGOTTEN_BEAST_224:GUT -$CREATURE:FORGOTTEN_BEAST_224:STOMACH -$CREATURE:FORGOTTEN_BEAST_224:GIZZARD -%CREATURE:FORGOTTEN_BEAST_224:PANCREAS -#CREATURE:FORGOTTEN_BEAST_224:SPLEEN -#CREATURE:FORGOTTEN_BEAST_224:KIDNEY -#CREATURE:FORGOTTEN_BEAST_225:MUSCLE - CREATURE:FORGOTTEN_BEAST_225:EYE -"CREATURE:FORGOTTEN_BEAST_225:BRAIN -!CREATURE:FORGOTTEN_BEAST_225:LUNG -"CREATURE:FORGOTTEN_BEAST_225:HEART -"CREATURE:FORGOTTEN_BEAST_225:LIVER - CREATURE:FORGOTTEN_BEAST_225:GUT -$CREATURE:FORGOTTEN_BEAST_225:STOMACH -$CREATURE:FORGOTTEN_BEAST_225:GIZZARD -%CREATURE:FORGOTTEN_BEAST_225:PANCREAS -#CREATURE:FORGOTTEN_BEAST_225:SPLEEN -#CREATURE:FORGOTTEN_BEAST_225:KIDNEY -#CREATURE:FORGOTTEN_BEAST_228:MUSCLE - CREATURE:FORGOTTEN_BEAST_228:EYE -"CREATURE:FORGOTTEN_BEAST_228:BRAIN -!CREATURE:FORGOTTEN_BEAST_228:LUNG -"CREATURE:FORGOTTEN_BEAST_228:HEART -"CREATURE:FORGOTTEN_BEAST_228:LIVER - CREATURE:FORGOTTEN_BEAST_228:GUT -$CREATURE:FORGOTTEN_BEAST_228:STOMACH -$CREATURE:FORGOTTEN_BEAST_228:GIZZARD -%CREATURE:FORGOTTEN_BEAST_228:PANCREAS -#CREATURE:FORGOTTEN_BEAST_228:SPLEEN -#CREATURE:FORGOTTEN_BEAST_228:KIDNEY -#CREATURE:FORGOTTEN_BEAST_231:MUSCLE - CREATURE:FORGOTTEN_BEAST_231:EYE -"CREATURE:FORGOTTEN_BEAST_231:BRAIN -!CREATURE:FORGOTTEN_BEAST_231:LUNG -"CREATURE:FORGOTTEN_BEAST_231:HEART -"CREATURE:FORGOTTEN_BEAST_231:LIVER - CREATURE:FORGOTTEN_BEAST_231:GUT -$CREATURE:FORGOTTEN_BEAST_231:STOMACH -$CREATURE:FORGOTTEN_BEAST_231:GIZZARD -%CREATURE:FORGOTTEN_BEAST_231:PANCREAS -#CREATURE:FORGOTTEN_BEAST_231:SPLEEN -#CREATURE:FORGOTTEN_BEAST_231:KIDNEY -#CREATURE:FORGOTTEN_BEAST_232:MUSCLE - CREATURE:FORGOTTEN_BEAST_232:EYE -"CREATURE:FORGOTTEN_BEAST_232:BRAIN -!CREATURE:FORGOTTEN_BEAST_232:LUNG -"CREATURE:FORGOTTEN_BEAST_232:HEART -"CREATURE:FORGOTTEN_BEAST_232:LIVER - CREATURE:FORGOTTEN_BEAST_232:GUT -$CREATURE:FORGOTTEN_BEAST_232:STOMACH -$CREATURE:FORGOTTEN_BEAST_232:GIZZARD -%CREATURE:FORGOTTEN_BEAST_232:PANCREAS -#CREATURE:FORGOTTEN_BEAST_232:SPLEEN -#CREATURE:FORGOTTEN_BEAST_232:KIDNEY -#CREATURE:FORGOTTEN_BEAST_235:MUSCLE - CREATURE:FORGOTTEN_BEAST_235:EYE -"CREATURE:FORGOTTEN_BEAST_235:BRAIN -!CREATURE:FORGOTTEN_BEAST_235:LUNG -"CREATURE:FORGOTTEN_BEAST_235:HEART -"CREATURE:FORGOTTEN_BEAST_235:LIVER - CREATURE:FORGOTTEN_BEAST_235:GUT -$CREATURE:FORGOTTEN_BEAST_235:STOMACH -$CREATURE:FORGOTTEN_BEAST_235:GIZZARD -%CREATURE:FORGOTTEN_BEAST_235:PANCREAS -#CREATURE:FORGOTTEN_BEAST_235:SPLEEN -#CREATURE:FORGOTTEN_BEAST_235:KIDNEY -#CREATURE:FORGOTTEN_BEAST_236:MUSCLE - CREATURE:FORGOTTEN_BEAST_236:EYE -"CREATURE:FORGOTTEN_BEAST_236:BRAIN -!CREATURE:FORGOTTEN_BEAST_236:LUNG -"CREATURE:FORGOTTEN_BEAST_236:HEART -"CREATURE:FORGOTTEN_BEAST_236:LIVER - CREATURE:FORGOTTEN_BEAST_236:GUT -$CREATURE:FORGOTTEN_BEAST_236:STOMACH -$CREATURE:FORGOTTEN_BEAST_236:GIZZARD -%CREATURE:FORGOTTEN_BEAST_236:PANCREAS -#CREATURE:FORGOTTEN_BEAST_236:SPLEEN -#CREATURE:FORGOTTEN_BEAST_236:KIDNEY -#CREATURE:FORGOTTEN_BEAST_237:MUSCLE - CREATURE:FORGOTTEN_BEAST_237:EYE -"CREATURE:FORGOTTEN_BEAST_237:BRAIN -!CREATURE:FORGOTTEN_BEAST_237:LUNG -"CREATURE:FORGOTTEN_BEAST_237:HEART -"CREATURE:FORGOTTEN_BEAST_237:LIVER - CREATURE:FORGOTTEN_BEAST_237:GUT -$CREATURE:FORGOTTEN_BEAST_237:STOMACH -$CREATURE:FORGOTTEN_BEAST_237:GIZZARD -%CREATURE:FORGOTTEN_BEAST_237:PANCREAS -#CREATURE:FORGOTTEN_BEAST_237:SPLEEN -#CREATURE:FORGOTTEN_BEAST_237:KIDNEY -#CREATURE:FORGOTTEN_BEAST_239:MUSCLE - CREATURE:FORGOTTEN_BEAST_239:EYE -"CREATURE:FORGOTTEN_BEAST_239:BRAIN -!CREATURE:FORGOTTEN_BEAST_239:LUNG -"CREATURE:FORGOTTEN_BEAST_239:HEART -"CREATURE:FORGOTTEN_BEAST_239:LIVER - CREATURE:FORGOTTEN_BEAST_239:GUT -$CREATURE:FORGOTTEN_BEAST_239:STOMACH -$CREATURE:FORGOTTEN_BEAST_239:GIZZARD -%CREATURE:FORGOTTEN_BEAST_239:PANCREAS -#CREATURE:FORGOTTEN_BEAST_239:SPLEEN -#CREATURE:FORGOTTEN_BEAST_239:KIDNEY -#CREATURE:FORGOTTEN_BEAST_240:MUSCLE - CREATURE:FORGOTTEN_BEAST_240:EYE -"CREATURE:FORGOTTEN_BEAST_240:BRAIN -!CREATURE:FORGOTTEN_BEAST_240:LUNG -"CREATURE:FORGOTTEN_BEAST_240:HEART -"CREATURE:FORGOTTEN_BEAST_240:LIVER - CREATURE:FORGOTTEN_BEAST_240:GUT -$CREATURE:FORGOTTEN_BEAST_240:STOMACH -$CREATURE:FORGOTTEN_BEAST_240:GIZZARD -%CREATURE:FORGOTTEN_BEAST_240:PANCREAS -#CREATURE:FORGOTTEN_BEAST_240:SPLEEN -#CREATURE:FORGOTTEN_BEAST_240:KIDNEY -#CREATURE:FORGOTTEN_BEAST_242:MUSCLE - CREATURE:FORGOTTEN_BEAST_242:EYE -"CREATURE:FORGOTTEN_BEAST_242:BRAIN -!CREATURE:FORGOTTEN_BEAST_242:LUNG -"CREATURE:FORGOTTEN_BEAST_242:HEART -"CREATURE:FORGOTTEN_BEAST_242:LIVER - CREATURE:FORGOTTEN_BEAST_242:GUT -$CREATURE:FORGOTTEN_BEAST_242:STOMACH -$CREATURE:FORGOTTEN_BEAST_242:GIZZARD -%CREATURE:FORGOTTEN_BEAST_242:PANCREAS -#CREATURE:FORGOTTEN_BEAST_242:SPLEEN -#CREATURE:FORGOTTEN_BEAST_242:KIDNEY -#CREATURE:FORGOTTEN_BEAST_243:MUSCLE - CREATURE:FORGOTTEN_BEAST_243:EYE -"CREATURE:FORGOTTEN_BEAST_243:BRAIN -!CREATURE:FORGOTTEN_BEAST_243:LUNG -"CREATURE:FORGOTTEN_BEAST_243:HEART -"CREATURE:FORGOTTEN_BEAST_243:LIVER - CREATURE:FORGOTTEN_BEAST_243:GUT -$CREATURE:FORGOTTEN_BEAST_243:STOMACH -$CREATURE:FORGOTTEN_BEAST_243:GIZZARD -%CREATURE:FORGOTTEN_BEAST_243:PANCREAS -#CREATURE:FORGOTTEN_BEAST_243:SPLEEN -#CREATURE:FORGOTTEN_BEAST_243:KIDNEY -#CREATURE:FORGOTTEN_BEAST_244:MUSCLE - CREATURE:FORGOTTEN_BEAST_244:EYE -"CREATURE:FORGOTTEN_BEAST_244:BRAIN -!CREATURE:FORGOTTEN_BEAST_244:LUNG -"CREATURE:FORGOTTEN_BEAST_244:HEART -"CREATURE:FORGOTTEN_BEAST_244:LIVER - CREATURE:FORGOTTEN_BEAST_244:GUT -$CREATURE:FORGOTTEN_BEAST_244:STOMACH -$CREATURE:FORGOTTEN_BEAST_244:GIZZARD -%CREATURE:FORGOTTEN_BEAST_244:PANCREAS -#CREATURE:FORGOTTEN_BEAST_244:SPLEEN -#CREATURE:FORGOTTEN_BEAST_244:KIDNEY -#CREATURE:FORGOTTEN_BEAST_245:MUSCLE - CREATURE:FORGOTTEN_BEAST_245:EYE -"CREATURE:FORGOTTEN_BEAST_245:BRAIN -!CREATURE:FORGOTTEN_BEAST_245:LUNG -"CREATURE:FORGOTTEN_BEAST_245:HEART -"CREATURE:FORGOTTEN_BEAST_245:LIVER - CREATURE:FORGOTTEN_BEAST_245:GUT -$CREATURE:FORGOTTEN_BEAST_245:STOMACH -$CREATURE:FORGOTTEN_BEAST_245:GIZZARD -%CREATURE:FORGOTTEN_BEAST_245:PANCREAS -#CREATURE:FORGOTTEN_BEAST_245:SPLEEN -#CREATURE:FORGOTTEN_BEAST_245:KIDNEY -#CREATURE:FORGOTTEN_BEAST_246:MUSCLE - CREATURE:FORGOTTEN_BEAST_246:EYE -"CREATURE:FORGOTTEN_BEAST_246:BRAIN -!CREATURE:FORGOTTEN_BEAST_246:LUNG -"CREATURE:FORGOTTEN_BEAST_246:HEART -"CREATURE:FORGOTTEN_BEAST_246:LIVER - CREATURE:FORGOTTEN_BEAST_246:GUT -$CREATURE:FORGOTTEN_BEAST_246:STOMACH -$CREATURE:FORGOTTEN_BEAST_246:GIZZARD -%CREATURE:FORGOTTEN_BEAST_246:PANCREAS -#CREATURE:FORGOTTEN_BEAST_246:SPLEEN -#CREATURE:FORGOTTEN_BEAST_246:KIDNEY -#CREATURE:FORGOTTEN_BEAST_247:MUSCLE - CREATURE:FORGOTTEN_BEAST_247:EYE -"CREATURE:FORGOTTEN_BEAST_247:BRAIN -!CREATURE:FORGOTTEN_BEAST_247:LUNG -"CREATURE:FORGOTTEN_BEAST_247:HEART -"CREATURE:FORGOTTEN_BEAST_247:LIVER - CREATURE:FORGOTTEN_BEAST_247:GUT -$CREATURE:FORGOTTEN_BEAST_247:STOMACH -$CREATURE:FORGOTTEN_BEAST_247:GIZZARD -%CREATURE:FORGOTTEN_BEAST_247:PANCREAS -#CREATURE:FORGOTTEN_BEAST_247:SPLEEN -#CREATURE:FORGOTTEN_BEAST_247:KIDNEY -#CREATURE:FORGOTTEN_BEAST_248:MUSCLE - CREATURE:FORGOTTEN_BEAST_248:EYE -"CREATURE:FORGOTTEN_BEAST_248:BRAIN -!CREATURE:FORGOTTEN_BEAST_248:LUNG -"CREATURE:FORGOTTEN_BEAST_248:HEART -"CREATURE:FORGOTTEN_BEAST_248:LIVER - CREATURE:FORGOTTEN_BEAST_248:GUT -$CREATURE:FORGOTTEN_BEAST_248:STOMACH -$CREATURE:FORGOTTEN_BEAST_248:GIZZARD -%CREATURE:FORGOTTEN_BEAST_248:PANCREAS -#CREATURE:FORGOTTEN_BEAST_248:SPLEEN -#CREATURE:FORGOTTEN_BEAST_248:KIDNEY -#CREATURE:FORGOTTEN_BEAST_249:MUSCLE - CREATURE:FORGOTTEN_BEAST_249:EYE -"CREATURE:FORGOTTEN_BEAST_249:BRAIN -!CREATURE:FORGOTTEN_BEAST_249:LUNG -"CREATURE:FORGOTTEN_BEAST_249:HEART -"CREATURE:FORGOTTEN_BEAST_249:LIVER - CREATURE:FORGOTTEN_BEAST_249:GUT -$CREATURE:FORGOTTEN_BEAST_249:STOMACH -$CREATURE:FORGOTTEN_BEAST_249:GIZZARD -%CREATURE:FORGOTTEN_BEAST_249:PANCREAS -#CREATURE:FORGOTTEN_BEAST_249:SPLEEN -#CREATURE:FORGOTTEN_BEAST_249:KIDNEY -#CREATURE:FORGOTTEN_BEAST_253:MUSCLE - CREATURE:FORGOTTEN_BEAST_253:EYE -"CREATURE:FORGOTTEN_BEAST_253:BRAIN -!CREATURE:FORGOTTEN_BEAST_253:LUNG -"CREATURE:FORGOTTEN_BEAST_253:HEART -"CREATURE:FORGOTTEN_BEAST_253:LIVER - CREATURE:FORGOTTEN_BEAST_253:GUT -$CREATURE:FORGOTTEN_BEAST_253:STOMACH -$CREATURE:FORGOTTEN_BEAST_253:GIZZARD -%CREATURE:FORGOTTEN_BEAST_253:PANCREAS -#CREATURE:FORGOTTEN_BEAST_253:SPLEEN -#CREATURE:FORGOTTEN_BEAST_253:KIDNEY -#CREATURE:FORGOTTEN_BEAST_255:MUSCLE - CREATURE:FORGOTTEN_BEAST_255:EYE -"CREATURE:FORGOTTEN_BEAST_255:BRAIN -!CREATURE:FORGOTTEN_BEAST_255:LUNG -"CREATURE:FORGOTTEN_BEAST_255:HEART -"CREATURE:FORGOTTEN_BEAST_255:LIVER - CREATURE:FORGOTTEN_BEAST_255:GUT -$CREATURE:FORGOTTEN_BEAST_255:STOMACH -$CREATURE:FORGOTTEN_BEAST_255:GIZZARD -%CREATURE:FORGOTTEN_BEAST_255:PANCREAS -#CREATURE:FORGOTTEN_BEAST_255:SPLEEN -#CREATURE:FORGOTTEN_BEAST_255:KIDNEY -#CREATURE:FORGOTTEN_BEAST_256:MUSCLE - CREATURE:FORGOTTEN_BEAST_256:EYE -"CREATURE:FORGOTTEN_BEAST_256:BRAIN -!CREATURE:FORGOTTEN_BEAST_256:LUNG -"CREATURE:FORGOTTEN_BEAST_256:HEART -"CREATURE:FORGOTTEN_BEAST_256:LIVER - CREATURE:FORGOTTEN_BEAST_256:GUT -$CREATURE:FORGOTTEN_BEAST_256:STOMACH -$CREATURE:FORGOTTEN_BEAST_256:GIZZARD -%CREATURE:FORGOTTEN_BEAST_256:PANCREAS -#CREATURE:FORGOTTEN_BEAST_256:SPLEEN -#CREATURE:FORGOTTEN_BEAST_256:KIDNEY -#CREATURE:FORGOTTEN_BEAST_259:MUSCLE - CREATURE:FORGOTTEN_BEAST_259:EYE -"CREATURE:FORGOTTEN_BEAST_259:BRAIN -!CREATURE:FORGOTTEN_BEAST_259:LUNG -"CREATURE:FORGOTTEN_BEAST_259:HEART -"CREATURE:FORGOTTEN_BEAST_259:LIVER - CREATURE:FORGOTTEN_BEAST_259:GUT -$CREATURE:FORGOTTEN_BEAST_259:STOMACH -$CREATURE:FORGOTTEN_BEAST_259:GIZZARD -%CREATURE:FORGOTTEN_BEAST_259:PANCREAS -#CREATURE:FORGOTTEN_BEAST_259:SPLEEN -#CREATURE:FORGOTTEN_BEAST_259:KIDNEY -#CREATURE:FORGOTTEN_BEAST_260:MUSCLE - CREATURE:FORGOTTEN_BEAST_260:EYE -"CREATURE:FORGOTTEN_BEAST_260:BRAIN -!CREATURE:FORGOTTEN_BEAST_260:LUNG -"CREATURE:FORGOTTEN_BEAST_260:HEART -"CREATURE:FORGOTTEN_BEAST_260:LIVER - CREATURE:FORGOTTEN_BEAST_260:GUT -$CREATURE:FORGOTTEN_BEAST_260:STOMACH -$CREATURE:FORGOTTEN_BEAST_260:GIZZARD -%CREATURE:FORGOTTEN_BEAST_260:PANCREAS -#CREATURE:FORGOTTEN_BEAST_260:SPLEEN -#CREATURE:FORGOTTEN_BEAST_260:KIDNEY -#CREATURE:FORGOTTEN_BEAST_263:MUSCLE - CREATURE:FORGOTTEN_BEAST_263:EYE -"CREATURE:FORGOTTEN_BEAST_263:BRAIN -!CREATURE:FORGOTTEN_BEAST_263:LUNG -"CREATURE:FORGOTTEN_BEAST_263:HEART -"CREATURE:FORGOTTEN_BEAST_263:LIVER - CREATURE:FORGOTTEN_BEAST_263:GUT -$CREATURE:FORGOTTEN_BEAST_263:STOMACH -$CREATURE:FORGOTTEN_BEAST_263:GIZZARD -%CREATURE:FORGOTTEN_BEAST_263:PANCREAS -#CREATURE:FORGOTTEN_BEAST_263:SPLEEN -#CREATURE:FORGOTTEN_BEAST_263:KIDNEY -#CREATURE:FORGOTTEN_BEAST_264:MUSCLE - CREATURE:FORGOTTEN_BEAST_264:EYE -"CREATURE:FORGOTTEN_BEAST_264:BRAIN -!CREATURE:FORGOTTEN_BEAST_264:LUNG -"CREATURE:FORGOTTEN_BEAST_264:HEART -"CREATURE:FORGOTTEN_BEAST_264:LIVER - CREATURE:FORGOTTEN_BEAST_264:GUT -$CREATURE:FORGOTTEN_BEAST_264:STOMACH -$CREATURE:FORGOTTEN_BEAST_264:GIZZARD -%CREATURE:FORGOTTEN_BEAST_264:PANCREAS -#CREATURE:FORGOTTEN_BEAST_264:SPLEEN -#CREATURE:FORGOTTEN_BEAST_264:KIDNEY -#CREATURE:FORGOTTEN_BEAST_265:MUSCLE - CREATURE:FORGOTTEN_BEAST_265:EYE -"CREATURE:FORGOTTEN_BEAST_265:BRAIN -!CREATURE:FORGOTTEN_BEAST_265:LUNG -"CREATURE:FORGOTTEN_BEAST_265:HEART -"CREATURE:FORGOTTEN_BEAST_265:LIVER - CREATURE:FORGOTTEN_BEAST_265:GUT -$CREATURE:FORGOTTEN_BEAST_265:STOMACH -$CREATURE:FORGOTTEN_BEAST_265:GIZZARD -%CREATURE:FORGOTTEN_BEAST_265:PANCREAS -#CREATURE:FORGOTTEN_BEAST_265:SPLEEN -#CREATURE:FORGOTTEN_BEAST_265:KIDNEY -#CREATURE:FORGOTTEN_BEAST_266:MUSCLE - CREATURE:FORGOTTEN_BEAST_266:EYE -"CREATURE:FORGOTTEN_BEAST_266:BRAIN -!CREATURE:FORGOTTEN_BEAST_266:LUNG -"CREATURE:FORGOTTEN_BEAST_266:HEART -"CREATURE:FORGOTTEN_BEAST_266:LIVER - CREATURE:FORGOTTEN_BEAST_266:GUT -$CREATURE:FORGOTTEN_BEAST_266:STOMACH -$CREATURE:FORGOTTEN_BEAST_266:GIZZARD -%CREATURE:FORGOTTEN_BEAST_266:PANCREAS -#CREATURE:FORGOTTEN_BEAST_266:SPLEEN -#CREATURE:FORGOTTEN_BEAST_266:KIDNEY -#CREATURE:FORGOTTEN_BEAST_268:MUSCLE - CREATURE:FORGOTTEN_BEAST_268:EYE -"CREATURE:FORGOTTEN_BEAST_268:BRAIN -!CREATURE:FORGOTTEN_BEAST_268:LUNG -"CREATURE:FORGOTTEN_BEAST_268:HEART -"CREATURE:FORGOTTEN_BEAST_268:LIVER - CREATURE:FORGOTTEN_BEAST_268:GUT -$CREATURE:FORGOTTEN_BEAST_268:STOMACH -$CREATURE:FORGOTTEN_BEAST_268:GIZZARD -%CREATURE:FORGOTTEN_BEAST_268:PANCREAS -#CREATURE:FORGOTTEN_BEAST_268:SPLEEN -#CREATURE:FORGOTTEN_BEAST_268:KIDNEY -#CREATURE:FORGOTTEN_BEAST_269:MUSCLE - CREATURE:FORGOTTEN_BEAST_269:EYE -"CREATURE:FORGOTTEN_BEAST_269:BRAIN -!CREATURE:FORGOTTEN_BEAST_269:LUNG -"CREATURE:FORGOTTEN_BEAST_269:HEART -"CREATURE:FORGOTTEN_BEAST_269:LIVER - CREATURE:FORGOTTEN_BEAST_269:GUT -$CREATURE:FORGOTTEN_BEAST_269:STOMACH -$CREATURE:FORGOTTEN_BEAST_269:GIZZARD -%CREATURE:FORGOTTEN_BEAST_269:PANCREAS -#CREATURE:FORGOTTEN_BEAST_269:SPLEEN -#CREATURE:FORGOTTEN_BEAST_269:KIDNEY -#CREATURE:FORGOTTEN_BEAST_270:MUSCLE - CREATURE:FORGOTTEN_BEAST_270:EYE -"CREATURE:FORGOTTEN_BEAST_270:BRAIN -!CREATURE:FORGOTTEN_BEAST_270:LUNG -"CREATURE:FORGOTTEN_BEAST_270:HEART -"CREATURE:FORGOTTEN_BEAST_270:LIVER - CREATURE:FORGOTTEN_BEAST_270:GUT -$CREATURE:FORGOTTEN_BEAST_270:STOMACH -$CREATURE:FORGOTTEN_BEAST_270:GIZZARD -%CREATURE:FORGOTTEN_BEAST_270:PANCREAS -#CREATURE:FORGOTTEN_BEAST_270:SPLEEN -#CREATURE:FORGOTTEN_BEAST_270:KIDNEY -#CREATURE:FORGOTTEN_BEAST_271:MUSCLE - CREATURE:FORGOTTEN_BEAST_271:EYE -"CREATURE:FORGOTTEN_BEAST_271:BRAIN -!CREATURE:FORGOTTEN_BEAST_271:LUNG -"CREATURE:FORGOTTEN_BEAST_271:HEART -"CREATURE:FORGOTTEN_BEAST_271:LIVER - CREATURE:FORGOTTEN_BEAST_271:GUT -$CREATURE:FORGOTTEN_BEAST_271:STOMACH -$CREATURE:FORGOTTEN_BEAST_271:GIZZARD -%CREATURE:FORGOTTEN_BEAST_271:PANCREAS -#CREATURE:FORGOTTEN_BEAST_271:SPLEEN -#CREATURE:FORGOTTEN_BEAST_271:KIDNEY -#CREATURE:FORGOTTEN_BEAST_272:MUSCLE - CREATURE:FORGOTTEN_BEAST_272:EYE -"CREATURE:FORGOTTEN_BEAST_272:BRAIN -!CREATURE:FORGOTTEN_BEAST_272:LUNG -"CREATURE:FORGOTTEN_BEAST_272:HEART -"CREATURE:FORGOTTEN_BEAST_272:LIVER - CREATURE:FORGOTTEN_BEAST_272:GUT -$CREATURE:FORGOTTEN_BEAST_272:STOMACH -$CREATURE:FORGOTTEN_BEAST_272:GIZZARD -%CREATURE:FORGOTTEN_BEAST_272:PANCREAS -#CREATURE:FORGOTTEN_BEAST_272:SPLEEN -#CREATURE:FORGOTTEN_BEAST_272:KIDNEY -#CREATURE:FORGOTTEN_BEAST_273:MUSCLE - CREATURE:FORGOTTEN_BEAST_273:EYE -"CREATURE:FORGOTTEN_BEAST_273:BRAIN -!CREATURE:FORGOTTEN_BEAST_273:LUNG -"CREATURE:FORGOTTEN_BEAST_273:HEART -"CREATURE:FORGOTTEN_BEAST_273:LIVER - CREATURE:FORGOTTEN_BEAST_273:GUT -$CREATURE:FORGOTTEN_BEAST_273:STOMACH -$CREATURE:FORGOTTEN_BEAST_273:GIZZARD -%CREATURE:FORGOTTEN_BEAST_273:PANCREAS -#CREATURE:FORGOTTEN_BEAST_273:SPLEEN -#CREATURE:FORGOTTEN_BEAST_273:KIDNEY -#CREATURE:FORGOTTEN_BEAST_274:MUSCLE - CREATURE:FORGOTTEN_BEAST_274:EYE -"CREATURE:FORGOTTEN_BEAST_274:BRAIN -!CREATURE:FORGOTTEN_BEAST_274:LUNG -"CREATURE:FORGOTTEN_BEAST_274:HEART -"CREATURE:FORGOTTEN_BEAST_274:LIVER - CREATURE:FORGOTTEN_BEAST_274:GUT -$CREATURE:FORGOTTEN_BEAST_274:STOMACH -$CREATURE:FORGOTTEN_BEAST_274:GIZZARD -%CREATURE:FORGOTTEN_BEAST_274:PANCREAS -#CREATURE:FORGOTTEN_BEAST_274:SPLEEN -#CREATURE:FORGOTTEN_BEAST_274:KIDNEY -#CREATURE:FORGOTTEN_BEAST_275:MUSCLE - CREATURE:FORGOTTEN_BEAST_275:EYE -"CREATURE:FORGOTTEN_BEAST_275:BRAIN -!CREATURE:FORGOTTEN_BEAST_275:LUNG -"CREATURE:FORGOTTEN_BEAST_275:HEART -"CREATURE:FORGOTTEN_BEAST_275:LIVER - CREATURE:FORGOTTEN_BEAST_275:GUT -$CREATURE:FORGOTTEN_BEAST_275:STOMACH -$CREATURE:FORGOTTEN_BEAST_275:GIZZARD -%CREATURE:FORGOTTEN_BEAST_275:PANCREAS -#CREATURE:FORGOTTEN_BEAST_275:SPLEEN -#CREATURE:FORGOTTEN_BEAST_275:KIDNEY -#CREATURE:FORGOTTEN_BEAST_276:MUSCLE - CREATURE:FORGOTTEN_BEAST_276:EYE -"CREATURE:FORGOTTEN_BEAST_276:BRAIN -!CREATURE:FORGOTTEN_BEAST_276:LUNG -"CREATURE:FORGOTTEN_BEAST_276:HEART -"CREATURE:FORGOTTEN_BEAST_276:LIVER - CREATURE:FORGOTTEN_BEAST_276:GUT -$CREATURE:FORGOTTEN_BEAST_276:STOMACH -$CREATURE:FORGOTTEN_BEAST_276:GIZZARD -%CREATURE:FORGOTTEN_BEAST_276:PANCREAS -#CREATURE:FORGOTTEN_BEAST_276:SPLEEN -#CREATURE:FORGOTTEN_BEAST_276:KIDNEY -#CREATURE:FORGOTTEN_BEAST_277:MUSCLE - CREATURE:FORGOTTEN_BEAST_277:EYE -"CREATURE:FORGOTTEN_BEAST_277:BRAIN -!CREATURE:FORGOTTEN_BEAST_277:LUNG -"CREATURE:FORGOTTEN_BEAST_277:HEART -"CREATURE:FORGOTTEN_BEAST_277:LIVER - CREATURE:FORGOTTEN_BEAST_277:GUT -$CREATURE:FORGOTTEN_BEAST_277:STOMACH -$CREATURE:FORGOTTEN_BEAST_277:GIZZARD -%CREATURE:FORGOTTEN_BEAST_277:PANCREAS -#CREATURE:FORGOTTEN_BEAST_277:SPLEEN -#CREATURE:FORGOTTEN_BEAST_277:KIDNEY -#CREATURE:FORGOTTEN_BEAST_279:MUSCLE - CREATURE:FORGOTTEN_BEAST_279:EYE -"CREATURE:FORGOTTEN_BEAST_279:BRAIN -!CREATURE:FORGOTTEN_BEAST_279:LUNG -"CREATURE:FORGOTTEN_BEAST_279:HEART -"CREATURE:FORGOTTEN_BEAST_279:LIVER - CREATURE:FORGOTTEN_BEAST_279:GUT -$CREATURE:FORGOTTEN_BEAST_279:STOMACH -$CREATURE:FORGOTTEN_BEAST_279:GIZZARD -%CREATURE:FORGOTTEN_BEAST_279:PANCREAS -#CREATURE:FORGOTTEN_BEAST_279:SPLEEN -#CREATURE:FORGOTTEN_BEAST_279:KIDNEY -#CREATURE:FORGOTTEN_BEAST_280:MUSCLE - CREATURE:FORGOTTEN_BEAST_280:EYE -"CREATURE:FORGOTTEN_BEAST_280:BRAIN -!CREATURE:FORGOTTEN_BEAST_280:LUNG -"CREATURE:FORGOTTEN_BEAST_280:HEART -"CREATURE:FORGOTTEN_BEAST_280:LIVER - CREATURE:FORGOTTEN_BEAST_280:GUT -$CREATURE:FORGOTTEN_BEAST_280:STOMACH -$CREATURE:FORGOTTEN_BEAST_280:GIZZARD -%CREATURE:FORGOTTEN_BEAST_280:PANCREAS -#CREATURE:FORGOTTEN_BEAST_280:SPLEEN -#CREATURE:FORGOTTEN_BEAST_280:KIDNEY -#CREATURE:FORGOTTEN_BEAST_281:MUSCLE - CREATURE:FORGOTTEN_BEAST_281:EYE -"CREATURE:FORGOTTEN_BEAST_281:BRAIN -!CREATURE:FORGOTTEN_BEAST_281:LUNG -"CREATURE:FORGOTTEN_BEAST_281:HEART -"CREATURE:FORGOTTEN_BEAST_281:LIVER - CREATURE:FORGOTTEN_BEAST_281:GUT -$CREATURE:FORGOTTEN_BEAST_281:STOMACH -$CREATURE:FORGOTTEN_BEAST_281:GIZZARD -%CREATURE:FORGOTTEN_BEAST_281:PANCREAS -#CREATURE:FORGOTTEN_BEAST_281:SPLEEN -#CREATURE:FORGOTTEN_BEAST_281:KIDNEY -#CREATURE:FORGOTTEN_BEAST_282:MUSCLE - CREATURE:FORGOTTEN_BEAST_282:EYE -"CREATURE:FORGOTTEN_BEAST_282:BRAIN -!CREATURE:FORGOTTEN_BEAST_282:LUNG -"CREATURE:FORGOTTEN_BEAST_282:HEART -"CREATURE:FORGOTTEN_BEAST_282:LIVER - CREATURE:FORGOTTEN_BEAST_282:GUT -$CREATURE:FORGOTTEN_BEAST_282:STOMACH -$CREATURE:FORGOTTEN_BEAST_282:GIZZARD -%CREATURE:FORGOTTEN_BEAST_282:PANCREAS -#CREATURE:FORGOTTEN_BEAST_282:SPLEEN -#CREATURE:FORGOTTEN_BEAST_282:KIDNEY -#CREATURE:FORGOTTEN_BEAST_283:MUSCLE - CREATURE:FORGOTTEN_BEAST_283:EYE -"CREATURE:FORGOTTEN_BEAST_283:BRAIN -!CREATURE:FORGOTTEN_BEAST_283:LUNG -"CREATURE:FORGOTTEN_BEAST_283:HEART -"CREATURE:FORGOTTEN_BEAST_283:LIVER - CREATURE:FORGOTTEN_BEAST_283:GUT -$CREATURE:FORGOTTEN_BEAST_283:STOMACH -$CREATURE:FORGOTTEN_BEAST_283:GIZZARD -%CREATURE:FORGOTTEN_BEAST_283:PANCREAS -#CREATURE:FORGOTTEN_BEAST_283:SPLEEN -#CREATURE:FORGOTTEN_BEAST_283:KIDNEY -#CREATURE:FORGOTTEN_BEAST_285:MUSCLE - CREATURE:FORGOTTEN_BEAST_285:EYE -"CREATURE:FORGOTTEN_BEAST_285:BRAIN -!CREATURE:FORGOTTEN_BEAST_285:LUNG -"CREATURE:FORGOTTEN_BEAST_285:HEART -"CREATURE:FORGOTTEN_BEAST_285:LIVER - CREATURE:FORGOTTEN_BEAST_285:GUT -$CREATURE:FORGOTTEN_BEAST_285:STOMACH -$CREATURE:FORGOTTEN_BEAST_285:GIZZARD -%CREATURE:FORGOTTEN_BEAST_285:PANCREAS -#CREATURE:FORGOTTEN_BEAST_285:SPLEEN -#CREATURE:FORGOTTEN_BEAST_285:KIDNEY -#CREATURE:FORGOTTEN_BEAST_286:MUSCLE - CREATURE:FORGOTTEN_BEAST_286:EYE -"CREATURE:FORGOTTEN_BEAST_286:BRAIN -!CREATURE:FORGOTTEN_BEAST_286:LUNG -"CREATURE:FORGOTTEN_BEAST_286:HEART -"CREATURE:FORGOTTEN_BEAST_286:LIVER - CREATURE:FORGOTTEN_BEAST_286:GUT -$CREATURE:FORGOTTEN_BEAST_286:STOMACH -$CREATURE:FORGOTTEN_BEAST_286:GIZZARD -%CREATURE:FORGOTTEN_BEAST_286:PANCREAS -#CREATURE:FORGOTTEN_BEAST_286:SPLEEN -#CREATURE:FORGOTTEN_BEAST_286:KIDNEY -#CREATURE:FORGOTTEN_BEAST_287:MUSCLE - CREATURE:FORGOTTEN_BEAST_287:EYE -"CREATURE:FORGOTTEN_BEAST_287:BRAIN -!CREATURE:FORGOTTEN_BEAST_287:LUNG -"CREATURE:FORGOTTEN_BEAST_287:HEART -"CREATURE:FORGOTTEN_BEAST_287:LIVER - CREATURE:FORGOTTEN_BEAST_287:GUT -$CREATURE:FORGOTTEN_BEAST_287:STOMACH -$CREATURE:FORGOTTEN_BEAST_287:GIZZARD -%CREATURE:FORGOTTEN_BEAST_287:PANCREAS -#CREATURE:FORGOTTEN_BEAST_287:SPLEEN -#CREATURE:FORGOTTEN_BEAST_287:KIDNEY -#CREATURE:FORGOTTEN_BEAST_288:MUSCLE - CREATURE:FORGOTTEN_BEAST_288:EYE -"CREATURE:FORGOTTEN_BEAST_288:BRAIN -!CREATURE:FORGOTTEN_BEAST_288:LUNG -"CREATURE:FORGOTTEN_BEAST_288:HEART -"CREATURE:FORGOTTEN_BEAST_288:LIVER - CREATURE:FORGOTTEN_BEAST_288:GUT -$CREATURE:FORGOTTEN_BEAST_288:STOMACH -$CREATURE:FORGOTTEN_BEAST_288:GIZZARD -%CREATURE:FORGOTTEN_BEAST_288:PANCREAS -#CREATURE:FORGOTTEN_BEAST_288:SPLEEN -#CREATURE:FORGOTTEN_BEAST_288:KIDNEY -#CREATURE:FORGOTTEN_BEAST_289:MUSCLE - CREATURE:FORGOTTEN_BEAST_289:EYE -"CREATURE:FORGOTTEN_BEAST_289:BRAIN -!CREATURE:FORGOTTEN_BEAST_289:LUNG -"CREATURE:FORGOTTEN_BEAST_289:HEART -"CREATURE:FORGOTTEN_BEAST_289:LIVER - CREATURE:FORGOTTEN_BEAST_289:GUT -$CREATURE:FORGOTTEN_BEAST_289:STOMACH -$CREATURE:FORGOTTEN_BEAST_289:GIZZARD -%CREATURE:FORGOTTEN_BEAST_289:PANCREAS -#CREATURE:FORGOTTEN_BEAST_289:SPLEEN -#CREATURE:FORGOTTEN_BEAST_289:KIDNEY -#CREATURE:FORGOTTEN_BEAST_290:MUSCLE - CREATURE:FORGOTTEN_BEAST_290:EYE -"CREATURE:FORGOTTEN_BEAST_290:BRAIN -!CREATURE:FORGOTTEN_BEAST_290:LUNG -"CREATURE:FORGOTTEN_BEAST_290:HEART -"CREATURE:FORGOTTEN_BEAST_290:LIVER - CREATURE:FORGOTTEN_BEAST_290:GUT -$CREATURE:FORGOTTEN_BEAST_290:STOMACH -$CREATURE:FORGOTTEN_BEAST_290:GIZZARD -%CREATURE:FORGOTTEN_BEAST_290:PANCREAS -#CREATURE:FORGOTTEN_BEAST_290:SPLEEN -#CREATURE:FORGOTTEN_BEAST_290:KIDNEY -#CREATURE:FORGOTTEN_BEAST_293:MUSCLE - CREATURE:FORGOTTEN_BEAST_293:EYE -"CREATURE:FORGOTTEN_BEAST_293:BRAIN -!CREATURE:FORGOTTEN_BEAST_293:LUNG -"CREATURE:FORGOTTEN_BEAST_293:HEART -"CREATURE:FORGOTTEN_BEAST_293:LIVER - CREATURE:FORGOTTEN_BEAST_293:GUT -$CREATURE:FORGOTTEN_BEAST_293:STOMACH -$CREATURE:FORGOTTEN_BEAST_293:GIZZARD -%CREATURE:FORGOTTEN_BEAST_293:PANCREAS -#CREATURE:FORGOTTEN_BEAST_293:SPLEEN -#CREATURE:FORGOTTEN_BEAST_293:KIDNEY -#CREATURE:FORGOTTEN_BEAST_295:MUSCLE - CREATURE:FORGOTTEN_BEAST_295:EYE -"CREATURE:FORGOTTEN_BEAST_295:BRAIN -!CREATURE:FORGOTTEN_BEAST_295:LUNG -"CREATURE:FORGOTTEN_BEAST_295:HEART -"CREATURE:FORGOTTEN_BEAST_295:LIVER - CREATURE:FORGOTTEN_BEAST_295:GUT -$CREATURE:FORGOTTEN_BEAST_295:STOMACH -$CREATURE:FORGOTTEN_BEAST_295:GIZZARD -%CREATURE:FORGOTTEN_BEAST_295:PANCREAS -#CREATURE:FORGOTTEN_BEAST_295:SPLEEN -#CREATURE:FORGOTTEN_BEAST_295:KIDNEY -#CREATURE:FORGOTTEN_BEAST_297:MUSCLE - CREATURE:FORGOTTEN_BEAST_297:EYE -"CREATURE:FORGOTTEN_BEAST_297:BRAIN -!CREATURE:FORGOTTEN_BEAST_297:LUNG -"CREATURE:FORGOTTEN_BEAST_297:HEART -"CREATURE:FORGOTTEN_BEAST_297:LIVER - CREATURE:FORGOTTEN_BEAST_297:GUT -$CREATURE:FORGOTTEN_BEAST_297:STOMACH -$CREATURE:FORGOTTEN_BEAST_297:GIZZARD -%CREATURE:FORGOTTEN_BEAST_297:PANCREAS -#CREATURE:FORGOTTEN_BEAST_297:SPLEEN -#CREATURE:FORGOTTEN_BEAST_297:KIDNEY -#CREATURE:FORGOTTEN_BEAST_300:MUSCLE - CREATURE:FORGOTTEN_BEAST_300:EYE -"CREATURE:FORGOTTEN_BEAST_300:BRAIN -!CREATURE:FORGOTTEN_BEAST_300:LUNG -"CREATURE:FORGOTTEN_BEAST_300:HEART -"CREATURE:FORGOTTEN_BEAST_300:LIVER - CREATURE:FORGOTTEN_BEAST_300:GUT -$CREATURE:FORGOTTEN_BEAST_300:STOMACH -$CREATURE:FORGOTTEN_BEAST_300:GIZZARD -%CREATURE:FORGOTTEN_BEAST_300:PANCREAS -#CREATURE:FORGOTTEN_BEAST_300:SPLEEN -#CREATURE:FORGOTTEN_BEAST_300:KIDNEY -#CREATURE:FORGOTTEN_BEAST_302:MUSCLE - CREATURE:FORGOTTEN_BEAST_302:EYE -"CREATURE:FORGOTTEN_BEAST_302:BRAIN -!CREATURE:FORGOTTEN_BEAST_302:LUNG -"CREATURE:FORGOTTEN_BEAST_302:HEART -"CREATURE:FORGOTTEN_BEAST_302:LIVER - CREATURE:FORGOTTEN_BEAST_302:GUT -$CREATURE:FORGOTTEN_BEAST_302:STOMACH -$CREATURE:FORGOTTEN_BEAST_302:GIZZARD -%CREATURE:FORGOTTEN_BEAST_302:PANCREAS -#CREATURE:FORGOTTEN_BEAST_302:SPLEEN -#CREATURE:FORGOTTEN_BEAST_302:KIDNEY -#CREATURE:FORGOTTEN_BEAST_306:MUSCLE - CREATURE:FORGOTTEN_BEAST_306:EYE -"CREATURE:FORGOTTEN_BEAST_306:BRAIN -!CREATURE:FORGOTTEN_BEAST_306:LUNG -"CREATURE:FORGOTTEN_BEAST_306:HEART -"CREATURE:FORGOTTEN_BEAST_306:LIVER - CREATURE:FORGOTTEN_BEAST_306:GUT -$CREATURE:FORGOTTEN_BEAST_306:STOMACH -$CREATURE:FORGOTTEN_BEAST_306:GIZZARD -%CREATURE:FORGOTTEN_BEAST_306:PANCREAS -#CREATURE:FORGOTTEN_BEAST_306:SPLEEN -#CREATURE:FORGOTTEN_BEAST_306:KIDNEY -#CREATURE:FORGOTTEN_BEAST_307:MUSCLE - CREATURE:FORGOTTEN_BEAST_307:EYE -"CREATURE:FORGOTTEN_BEAST_307:BRAIN -!CREATURE:FORGOTTEN_BEAST_307:LUNG -"CREATURE:FORGOTTEN_BEAST_307:HEART -"CREATURE:FORGOTTEN_BEAST_307:LIVER - CREATURE:FORGOTTEN_BEAST_307:GUT -$CREATURE:FORGOTTEN_BEAST_307:STOMACH -$CREATURE:FORGOTTEN_BEAST_307:GIZZARD -%CREATURE:FORGOTTEN_BEAST_307:PANCREAS -#CREATURE:FORGOTTEN_BEAST_307:SPLEEN -#CREATURE:FORGOTTEN_BEAST_307:KIDNEY -#CREATURE:FORGOTTEN_BEAST_310:MUSCLE - CREATURE:FORGOTTEN_BEAST_310:EYE -"CREATURE:FORGOTTEN_BEAST_310:BRAIN -!CREATURE:FORGOTTEN_BEAST_310:LUNG -"CREATURE:FORGOTTEN_BEAST_310:HEART -"CREATURE:FORGOTTEN_BEAST_310:LIVER - CREATURE:FORGOTTEN_BEAST_310:GUT -$CREATURE:FORGOTTEN_BEAST_310:STOMACH -$CREATURE:FORGOTTEN_BEAST_310:GIZZARD -%CREATURE:FORGOTTEN_BEAST_310:PANCREAS -#CREATURE:FORGOTTEN_BEAST_310:SPLEEN -#CREATURE:FORGOTTEN_BEAST_310:KIDNEY -#CREATURE:FORGOTTEN_BEAST_311:MUSCLE - CREATURE:FORGOTTEN_BEAST_311:EYE -"CREATURE:FORGOTTEN_BEAST_311:BRAIN -!CREATURE:FORGOTTEN_BEAST_311:LUNG -"CREATURE:FORGOTTEN_BEAST_311:HEART -"CREATURE:FORGOTTEN_BEAST_311:LIVER - CREATURE:FORGOTTEN_BEAST_311:GUT -$CREATURE:FORGOTTEN_BEAST_311:STOMACH -$CREATURE:FORGOTTEN_BEAST_311:GIZZARD -%CREATURE:FORGOTTEN_BEAST_311:PANCREAS -#CREATURE:FORGOTTEN_BEAST_311:SPLEEN -#CREATURE:FORGOTTEN_BEAST_311:KIDNEY -#CREATURE:FORGOTTEN_BEAST_312:MUSCLE - CREATURE:FORGOTTEN_BEAST_312:EYE -"CREATURE:FORGOTTEN_BEAST_312:BRAIN -!CREATURE:FORGOTTEN_BEAST_312:LUNG -"CREATURE:FORGOTTEN_BEAST_312:HEART -"CREATURE:FORGOTTEN_BEAST_312:LIVER - CREATURE:FORGOTTEN_BEAST_312:GUT -$CREATURE:FORGOTTEN_BEAST_312:STOMACH -$CREATURE:FORGOTTEN_BEAST_312:GIZZARD -%CREATURE:FORGOTTEN_BEAST_312:PANCREAS -#CREATURE:FORGOTTEN_BEAST_312:SPLEEN -#CREATURE:FORGOTTEN_BEAST_312:KIDNEY -#CREATURE:FORGOTTEN_BEAST_314:MUSCLE - CREATURE:FORGOTTEN_BEAST_314:EYE -"CREATURE:FORGOTTEN_BEAST_314:BRAIN -!CREATURE:FORGOTTEN_BEAST_314:LUNG -"CREATURE:FORGOTTEN_BEAST_314:HEART -"CREATURE:FORGOTTEN_BEAST_314:LIVER - CREATURE:FORGOTTEN_BEAST_314:GUT -$CREATURE:FORGOTTEN_BEAST_314:STOMACH -$CREATURE:FORGOTTEN_BEAST_314:GIZZARD -%CREATURE:FORGOTTEN_BEAST_314:PANCREAS -#CREATURE:FORGOTTEN_BEAST_314:SPLEEN -#CREATURE:FORGOTTEN_BEAST_314:KIDNEY -#CREATURE:FORGOTTEN_BEAST_316:MUSCLE - CREATURE:FORGOTTEN_BEAST_316:EYE -"CREATURE:FORGOTTEN_BEAST_316:BRAIN -!CREATURE:FORGOTTEN_BEAST_316:LUNG -"CREATURE:FORGOTTEN_BEAST_316:HEART -"CREATURE:FORGOTTEN_BEAST_316:LIVER - CREATURE:FORGOTTEN_BEAST_316:GUT -$CREATURE:FORGOTTEN_BEAST_316:STOMACH -$CREATURE:FORGOTTEN_BEAST_316:GIZZARD -%CREATURE:FORGOTTEN_BEAST_316:PANCREAS -#CREATURE:FORGOTTEN_BEAST_316:SPLEEN -#CREATURE:FORGOTTEN_BEAST_316:KIDNEY -#CREATURE:FORGOTTEN_BEAST_317:MUSCLE - CREATURE:FORGOTTEN_BEAST_317:EYE -"CREATURE:FORGOTTEN_BEAST_317:BRAIN -!CREATURE:FORGOTTEN_BEAST_317:LUNG -"CREATURE:FORGOTTEN_BEAST_317:HEART -"CREATURE:FORGOTTEN_BEAST_317:LIVER - CREATURE:FORGOTTEN_BEAST_317:GUT -$CREATURE:FORGOTTEN_BEAST_317:STOMACH -$CREATURE:FORGOTTEN_BEAST_317:GIZZARD -%CREATURE:FORGOTTEN_BEAST_317:PANCREAS -#CREATURE:FORGOTTEN_BEAST_317:SPLEEN -#CREATURE:FORGOTTEN_BEAST_317:KIDNEY -#CREATURE:FORGOTTEN_BEAST_318:MUSCLE - CREATURE:FORGOTTEN_BEAST_318:EYE -"CREATURE:FORGOTTEN_BEAST_318:BRAIN -!CREATURE:FORGOTTEN_BEAST_318:LUNG -"CREATURE:FORGOTTEN_BEAST_318:HEART -"CREATURE:FORGOTTEN_BEAST_318:LIVER - CREATURE:FORGOTTEN_BEAST_318:GUT -$CREATURE:FORGOTTEN_BEAST_318:STOMACH -$CREATURE:FORGOTTEN_BEAST_318:GIZZARD -%CREATURE:FORGOTTEN_BEAST_318:PANCREAS -#CREATURE:FORGOTTEN_BEAST_318:SPLEEN -#CREATURE:FORGOTTEN_BEAST_318:KIDNEY -#CREATURE:FORGOTTEN_BEAST_320:MUSCLE - CREATURE:FORGOTTEN_BEAST_320:EYE -"CREATURE:FORGOTTEN_BEAST_320:BRAIN -!CREATURE:FORGOTTEN_BEAST_320:LUNG -"CREATURE:FORGOTTEN_BEAST_320:HEART -"CREATURE:FORGOTTEN_BEAST_320:LIVER - CREATURE:FORGOTTEN_BEAST_320:GUT -$CREATURE:FORGOTTEN_BEAST_320:STOMACH -$CREATURE:FORGOTTEN_BEAST_320:GIZZARD -%CREATURE:FORGOTTEN_BEAST_320:PANCREAS -#CREATURE:FORGOTTEN_BEAST_320:SPLEEN -#CREATURE:FORGOTTEN_BEAST_320:KIDNEY -#CREATURE:FORGOTTEN_BEAST_321:MUSCLE - CREATURE:FORGOTTEN_BEAST_321:EYE -"CREATURE:FORGOTTEN_BEAST_321:BRAIN -!CREATURE:FORGOTTEN_BEAST_321:LUNG -"CREATURE:FORGOTTEN_BEAST_321:HEART -"CREATURE:FORGOTTEN_BEAST_321:LIVER - CREATURE:FORGOTTEN_BEAST_321:GUT -$CREATURE:FORGOTTEN_BEAST_321:STOMACH -$CREATURE:FORGOTTEN_BEAST_321:GIZZARD -%CREATURE:FORGOTTEN_BEAST_321:PANCREAS -#CREATURE:FORGOTTEN_BEAST_321:SPLEEN -#CREATURE:FORGOTTEN_BEAST_321:KIDNEY -#CREATURE:FORGOTTEN_BEAST_322:MUSCLE - CREATURE:FORGOTTEN_BEAST_322:EYE -"CREATURE:FORGOTTEN_BEAST_322:BRAIN -!CREATURE:FORGOTTEN_BEAST_322:LUNG -"CREATURE:FORGOTTEN_BEAST_322:HEART -"CREATURE:FORGOTTEN_BEAST_322:LIVER - CREATURE:FORGOTTEN_BEAST_322:GUT -$CREATURE:FORGOTTEN_BEAST_322:STOMACH -$CREATURE:FORGOTTEN_BEAST_322:GIZZARD -%CREATURE:FORGOTTEN_BEAST_322:PANCREAS -#CREATURE:FORGOTTEN_BEAST_322:SPLEEN -#CREATURE:FORGOTTEN_BEAST_322:KIDNEY -#CREATURE:FORGOTTEN_BEAST_323:MUSCLE - CREATURE:FORGOTTEN_BEAST_323:EYE -"CREATURE:FORGOTTEN_BEAST_323:BRAIN -!CREATURE:FORGOTTEN_BEAST_323:LUNG -"CREATURE:FORGOTTEN_BEAST_323:HEART -"CREATURE:FORGOTTEN_BEAST_323:LIVER - CREATURE:FORGOTTEN_BEAST_323:GUT -$CREATURE:FORGOTTEN_BEAST_323:STOMACH -$CREATURE:FORGOTTEN_BEAST_323:GIZZARD -%CREATURE:FORGOTTEN_BEAST_323:PANCREAS -#CREATURE:FORGOTTEN_BEAST_323:SPLEEN -#CREATURE:FORGOTTEN_BEAST_323:KIDNEY -#CREATURE:FORGOTTEN_BEAST_324:MUSCLE - CREATURE:FORGOTTEN_BEAST_324:EYE -"CREATURE:FORGOTTEN_BEAST_324:BRAIN -!CREATURE:FORGOTTEN_BEAST_324:LUNG -"CREATURE:FORGOTTEN_BEAST_324:HEART -"CREATURE:FORGOTTEN_BEAST_324:LIVER - CREATURE:FORGOTTEN_BEAST_324:GUT -$CREATURE:FORGOTTEN_BEAST_324:STOMACH -$CREATURE:FORGOTTEN_BEAST_324:GIZZARD -%CREATURE:FORGOTTEN_BEAST_324:PANCREAS -#CREATURE:FORGOTTEN_BEAST_324:SPLEEN -#CREATURE:FORGOTTEN_BEAST_324:KIDNEY -#CREATURE:FORGOTTEN_BEAST_325:MUSCLE - CREATURE:FORGOTTEN_BEAST_325:EYE -"CREATURE:FORGOTTEN_BEAST_325:BRAIN -!CREATURE:FORGOTTEN_BEAST_325:LUNG -"CREATURE:FORGOTTEN_BEAST_325:HEART -"CREATURE:FORGOTTEN_BEAST_325:LIVER - CREATURE:FORGOTTEN_BEAST_325:GUT -$CREATURE:FORGOTTEN_BEAST_325:STOMACH -$CREATURE:FORGOTTEN_BEAST_325:GIZZARD -%CREATURE:FORGOTTEN_BEAST_325:PANCREAS -#CREATURE:FORGOTTEN_BEAST_325:SPLEEN -#CREATURE:FORGOTTEN_BEAST_325:KIDNEY -#CREATURE:FORGOTTEN_BEAST_326:MUSCLE - CREATURE:FORGOTTEN_BEAST_326:EYE -"CREATURE:FORGOTTEN_BEAST_326:BRAIN -!CREATURE:FORGOTTEN_BEAST_326:LUNG -"CREATURE:FORGOTTEN_BEAST_326:HEART -"CREATURE:FORGOTTEN_BEAST_326:LIVER - CREATURE:FORGOTTEN_BEAST_326:GUT -$CREATURE:FORGOTTEN_BEAST_326:STOMACH -$CREATURE:FORGOTTEN_BEAST_326:GIZZARD -%CREATURE:FORGOTTEN_BEAST_326:PANCREAS -#CREATURE:FORGOTTEN_BEAST_326:SPLEEN -#CREATURE:FORGOTTEN_BEAST_326:KIDNEY -#CREATURE:FORGOTTEN_BEAST_327:MUSCLE - CREATURE:FORGOTTEN_BEAST_327:EYE -"CREATURE:FORGOTTEN_BEAST_327:BRAIN -!CREATURE:FORGOTTEN_BEAST_327:LUNG -"CREATURE:FORGOTTEN_BEAST_327:HEART -"CREATURE:FORGOTTEN_BEAST_327:LIVER - CREATURE:FORGOTTEN_BEAST_327:GUT -$CREATURE:FORGOTTEN_BEAST_327:STOMACH -$CREATURE:FORGOTTEN_BEAST_327:GIZZARD -%CREATURE:FORGOTTEN_BEAST_327:PANCREAS -#CREATURE:FORGOTTEN_BEAST_327:SPLEEN -#CREATURE:FORGOTTEN_BEAST_327:KIDNEY -#CREATURE:FORGOTTEN_BEAST_328:MUSCLE - CREATURE:FORGOTTEN_BEAST_328:EYE -"CREATURE:FORGOTTEN_BEAST_328:BRAIN -!CREATURE:FORGOTTEN_BEAST_328:LUNG -"CREATURE:FORGOTTEN_BEAST_328:HEART -"CREATURE:FORGOTTEN_BEAST_328:LIVER - CREATURE:FORGOTTEN_BEAST_328:GUT -$CREATURE:FORGOTTEN_BEAST_328:STOMACH -$CREATURE:FORGOTTEN_BEAST_328:GIZZARD -%CREATURE:FORGOTTEN_BEAST_328:PANCREAS -#CREATURE:FORGOTTEN_BEAST_328:SPLEEN -#CREATURE:FORGOTTEN_BEAST_328:KIDNEY -#CREATURE:FORGOTTEN_BEAST_329:MUSCLE - CREATURE:FORGOTTEN_BEAST_329:EYE -"CREATURE:FORGOTTEN_BEAST_329:BRAIN -!CREATURE:FORGOTTEN_BEAST_329:LUNG -"CREATURE:FORGOTTEN_BEAST_329:HEART -"CREATURE:FORGOTTEN_BEAST_329:LIVER - CREATURE:FORGOTTEN_BEAST_329:GUT -$CREATURE:FORGOTTEN_BEAST_329:STOMACH -$CREATURE:FORGOTTEN_BEAST_329:GIZZARD -%CREATURE:FORGOTTEN_BEAST_329:PANCREAS -#CREATURE:FORGOTTEN_BEAST_329:SPLEEN -#CREATURE:FORGOTTEN_BEAST_329:KIDNEY -#CREATURE:FORGOTTEN_BEAST_330:MUSCLE - CREATURE:FORGOTTEN_BEAST_330:EYE -"CREATURE:FORGOTTEN_BEAST_330:BRAIN -!CREATURE:FORGOTTEN_BEAST_330:LUNG -"CREATURE:FORGOTTEN_BEAST_330:HEART -"CREATURE:FORGOTTEN_BEAST_330:LIVER - CREATURE:FORGOTTEN_BEAST_330:GUT -$CREATURE:FORGOTTEN_BEAST_330:STOMACH -$CREATURE:FORGOTTEN_BEAST_330:GIZZARD -%CREATURE:FORGOTTEN_BEAST_330:PANCREAS -#CREATURE:FORGOTTEN_BEAST_330:SPLEEN -#CREATURE:FORGOTTEN_BEAST_330:KIDNEY -#CREATURE:FORGOTTEN_BEAST_332:MUSCLE - CREATURE:FORGOTTEN_BEAST_332:EYE -"CREATURE:FORGOTTEN_BEAST_332:BRAIN -!CREATURE:FORGOTTEN_BEAST_332:LUNG -"CREATURE:FORGOTTEN_BEAST_332:HEART -"CREATURE:FORGOTTEN_BEAST_332:LIVER - CREATURE:FORGOTTEN_BEAST_332:GUT -$CREATURE:FORGOTTEN_BEAST_332:STOMACH -$CREATURE:FORGOTTEN_BEAST_332:GIZZARD -%CREATURE:FORGOTTEN_BEAST_332:PANCREAS -#CREATURE:FORGOTTEN_BEAST_332:SPLEEN -#CREATURE:FORGOTTEN_BEAST_332:KIDNEY -#CREATURE:FORGOTTEN_BEAST_333:MUSCLE - CREATURE:FORGOTTEN_BEAST_333:EYE -"CREATURE:FORGOTTEN_BEAST_333:BRAIN -!CREATURE:FORGOTTEN_BEAST_333:LUNG -"CREATURE:FORGOTTEN_BEAST_333:HEART -"CREATURE:FORGOTTEN_BEAST_333:LIVER - CREATURE:FORGOTTEN_BEAST_333:GUT -$CREATURE:FORGOTTEN_BEAST_333:STOMACH -$CREATURE:FORGOTTEN_BEAST_333:GIZZARD -%CREATURE:FORGOTTEN_BEAST_333:PANCREAS -#CREATURE:FORGOTTEN_BEAST_333:SPLEEN -#CREATURE:FORGOTTEN_BEAST_333:KIDNEY -#CREATURE:FORGOTTEN_BEAST_335:MUSCLE - CREATURE:FORGOTTEN_BEAST_335:EYE -"CREATURE:FORGOTTEN_BEAST_335:BRAIN -!CREATURE:FORGOTTEN_BEAST_335:LUNG -"CREATURE:FORGOTTEN_BEAST_335:HEART -"CREATURE:FORGOTTEN_BEAST_335:LIVER - CREATURE:FORGOTTEN_BEAST_335:GUT -$CREATURE:FORGOTTEN_BEAST_335:STOMACH -$CREATURE:FORGOTTEN_BEAST_335:GIZZARD -%CREATURE:FORGOTTEN_BEAST_335:PANCREAS -#CREATURE:FORGOTTEN_BEAST_335:SPLEEN -#CREATURE:FORGOTTEN_BEAST_335:KIDNEY -#CREATURE:FORGOTTEN_BEAST_336:MUSCLE - CREATURE:FORGOTTEN_BEAST_336:EYE -"CREATURE:FORGOTTEN_BEAST_336:BRAIN -!CREATURE:FORGOTTEN_BEAST_336:LUNG -"CREATURE:FORGOTTEN_BEAST_336:HEART -"CREATURE:FORGOTTEN_BEAST_336:LIVER - CREATURE:FORGOTTEN_BEAST_336:GUT -$CREATURE:FORGOTTEN_BEAST_336:STOMACH -$CREATURE:FORGOTTEN_BEAST_336:GIZZARD -%CREATURE:FORGOTTEN_BEAST_336:PANCREAS -#CREATURE:FORGOTTEN_BEAST_336:SPLEEN -#CREATURE:FORGOTTEN_BEAST_336:KIDNEY -#CREATURE:FORGOTTEN_BEAST_337:MUSCLE - CREATURE:FORGOTTEN_BEAST_337:EYE -"CREATURE:FORGOTTEN_BEAST_337:BRAIN -!CREATURE:FORGOTTEN_BEAST_337:LUNG -"CREATURE:FORGOTTEN_BEAST_337:HEART -"CREATURE:FORGOTTEN_BEAST_337:LIVER - CREATURE:FORGOTTEN_BEAST_337:GUT -$CREATURE:FORGOTTEN_BEAST_337:STOMACH -$CREATURE:FORGOTTEN_BEAST_337:GIZZARD -%CREATURE:FORGOTTEN_BEAST_337:PANCREAS -#CREATURE:FORGOTTEN_BEAST_337:SPLEEN -#CREATURE:FORGOTTEN_BEAST_337:KIDNEY -#CREATURE:FORGOTTEN_BEAST_338:MUSCLE - CREATURE:FORGOTTEN_BEAST_338:EYE -"CREATURE:FORGOTTEN_BEAST_338:BRAIN -!CREATURE:FORGOTTEN_BEAST_338:LUNG -"CREATURE:FORGOTTEN_BEAST_338:HEART -"CREATURE:FORGOTTEN_BEAST_338:LIVER - CREATURE:FORGOTTEN_BEAST_338:GUT -$CREATURE:FORGOTTEN_BEAST_338:STOMACH -$CREATURE:FORGOTTEN_BEAST_338:GIZZARD -%CREATURE:FORGOTTEN_BEAST_338:PANCREAS -#CREATURE:FORGOTTEN_BEAST_338:SPLEEN -#CREATURE:FORGOTTEN_BEAST_338:KIDNEY -#CREATURE:FORGOTTEN_BEAST_339:MUSCLE - CREATURE:FORGOTTEN_BEAST_339:EYE -"CREATURE:FORGOTTEN_BEAST_339:BRAIN -!CREATURE:FORGOTTEN_BEAST_339:LUNG -"CREATURE:FORGOTTEN_BEAST_339:HEART -"CREATURE:FORGOTTEN_BEAST_339:LIVER - CREATURE:FORGOTTEN_BEAST_339:GUT -$CREATURE:FORGOTTEN_BEAST_339:STOMACH -$CREATURE:FORGOTTEN_BEAST_339:GIZZARD -%CREATURE:FORGOTTEN_BEAST_339:PANCREAS -#CREATURE:FORGOTTEN_BEAST_339:SPLEEN -#CREATURE:FORGOTTEN_BEAST_339:KIDNEY -#CREATURE:FORGOTTEN_BEAST_341:MUSCLE - CREATURE:FORGOTTEN_BEAST_341:EYE -"CREATURE:FORGOTTEN_BEAST_341:BRAIN -!CREATURE:FORGOTTEN_BEAST_341:LUNG -"CREATURE:FORGOTTEN_BEAST_341:HEART -"CREATURE:FORGOTTEN_BEAST_341:LIVER - CREATURE:FORGOTTEN_BEAST_341:GUT -$CREATURE:FORGOTTEN_BEAST_341:STOMACH -$CREATURE:FORGOTTEN_BEAST_341:GIZZARD -%CREATURE:FORGOTTEN_BEAST_341:PANCREAS -#CREATURE:FORGOTTEN_BEAST_341:SPLEEN -#CREATURE:FORGOTTEN_BEAST_341:KIDNEY -#CREATURE:FORGOTTEN_BEAST_342:MUSCLE - CREATURE:FORGOTTEN_BEAST_342:EYE -"CREATURE:FORGOTTEN_BEAST_342:BRAIN -!CREATURE:FORGOTTEN_BEAST_342:LUNG -"CREATURE:FORGOTTEN_BEAST_342:HEART -"CREATURE:FORGOTTEN_BEAST_342:LIVER - CREATURE:FORGOTTEN_BEAST_342:GUT -$CREATURE:FORGOTTEN_BEAST_342:STOMACH -$CREATURE:FORGOTTEN_BEAST_342:GIZZARD -%CREATURE:FORGOTTEN_BEAST_342:PANCREAS -#CREATURE:FORGOTTEN_BEAST_342:SPLEEN -#CREATURE:FORGOTTEN_BEAST_342:KIDNEY -#CREATURE:FORGOTTEN_BEAST_343:MUSCLE - CREATURE:FORGOTTEN_BEAST_343:EYE -"CREATURE:FORGOTTEN_BEAST_343:BRAIN -!CREATURE:FORGOTTEN_BEAST_343:LUNG -"CREATURE:FORGOTTEN_BEAST_343:HEART -"CREATURE:FORGOTTEN_BEAST_343:LIVER - CREATURE:FORGOTTEN_BEAST_343:GUT -$CREATURE:FORGOTTEN_BEAST_343:STOMACH -$CREATURE:FORGOTTEN_BEAST_343:GIZZARD -%CREATURE:FORGOTTEN_BEAST_343:PANCREAS -#CREATURE:FORGOTTEN_BEAST_343:SPLEEN -#CREATURE:FORGOTTEN_BEAST_343:KIDNEY -#CREATURE:FORGOTTEN_BEAST_344:MUSCLE - CREATURE:FORGOTTEN_BEAST_344:EYE -"CREATURE:FORGOTTEN_BEAST_344:BRAIN -!CREATURE:FORGOTTEN_BEAST_344:LUNG -"CREATURE:FORGOTTEN_BEAST_344:HEART -"CREATURE:FORGOTTEN_BEAST_344:LIVER - CREATURE:FORGOTTEN_BEAST_344:GUT -$CREATURE:FORGOTTEN_BEAST_344:STOMACH -$CREATURE:FORGOTTEN_BEAST_344:GIZZARD -%CREATURE:FORGOTTEN_BEAST_344:PANCREAS -#CREATURE:FORGOTTEN_BEAST_344:SPLEEN -#CREATURE:FORGOTTEN_BEAST_344:KIDNEY -#CREATURE:FORGOTTEN_BEAST_347:MUSCLE - CREATURE:FORGOTTEN_BEAST_347:EYE -"CREATURE:FORGOTTEN_BEAST_347:BRAIN -!CREATURE:FORGOTTEN_BEAST_347:LUNG -"CREATURE:FORGOTTEN_BEAST_347:HEART -"CREATURE:FORGOTTEN_BEAST_347:LIVER - CREATURE:FORGOTTEN_BEAST_347:GUT -$CREATURE:FORGOTTEN_BEAST_347:STOMACH -$CREATURE:FORGOTTEN_BEAST_347:GIZZARD -%CREATURE:FORGOTTEN_BEAST_347:PANCREAS -#CREATURE:FORGOTTEN_BEAST_347:SPLEEN -#CREATURE:FORGOTTEN_BEAST_347:KIDNEY -#CREATURE:FORGOTTEN_BEAST_348:MUSCLE - CREATURE:FORGOTTEN_BEAST_348:EYE -"CREATURE:FORGOTTEN_BEAST_348:BRAIN -!CREATURE:FORGOTTEN_BEAST_348:LUNG -"CREATURE:FORGOTTEN_BEAST_348:HEART -"CREATURE:FORGOTTEN_BEAST_348:LIVER - CREATURE:FORGOTTEN_BEAST_348:GUT -$CREATURE:FORGOTTEN_BEAST_348:STOMACH -$CREATURE:FORGOTTEN_BEAST_348:GIZZARD -%CREATURE:FORGOTTEN_BEAST_348:PANCREAS -#CREATURE:FORGOTTEN_BEAST_348:SPLEEN -#CREATURE:FORGOTTEN_BEAST_348:KIDNEY -#CREATURE:FORGOTTEN_BEAST_349:MUSCLE - CREATURE:FORGOTTEN_BEAST_349:EYE -"CREATURE:FORGOTTEN_BEAST_349:BRAIN -!CREATURE:FORGOTTEN_BEAST_349:LUNG -"CREATURE:FORGOTTEN_BEAST_349:HEART -"CREATURE:FORGOTTEN_BEAST_349:LIVER - CREATURE:FORGOTTEN_BEAST_349:GUT -$CREATURE:FORGOTTEN_BEAST_349:STOMACH -$CREATURE:FORGOTTEN_BEAST_349:GIZZARD -%CREATURE:FORGOTTEN_BEAST_349:PANCREAS -#CREATURE:FORGOTTEN_BEAST_349:SPLEEN -#CREATURE:FORGOTTEN_BEAST_349:KIDNEY -#CREATURE:FORGOTTEN_BEAST_351:MUSCLE - CREATURE:FORGOTTEN_BEAST_351:EYE -"CREATURE:FORGOTTEN_BEAST_351:BRAIN -!CREATURE:FORGOTTEN_BEAST_351:LUNG -"CREATURE:FORGOTTEN_BEAST_351:HEART -"CREATURE:FORGOTTEN_BEAST_351:LIVER - CREATURE:FORGOTTEN_BEAST_351:GUT -$CREATURE:FORGOTTEN_BEAST_351:STOMACH -$CREATURE:FORGOTTEN_BEAST_351:GIZZARD -%CREATURE:FORGOTTEN_BEAST_351:PANCREAS -#CREATURE:FORGOTTEN_BEAST_351:SPLEEN -#CREATURE:FORGOTTEN_BEAST_351:KIDNEY -#CREATURE:FORGOTTEN_BEAST_352:MUSCLE - CREATURE:FORGOTTEN_BEAST_352:EYE -"CREATURE:FORGOTTEN_BEAST_352:BRAIN -!CREATURE:FORGOTTEN_BEAST_352:LUNG -"CREATURE:FORGOTTEN_BEAST_352:HEART -"CREATURE:FORGOTTEN_BEAST_352:LIVER - CREATURE:FORGOTTEN_BEAST_352:GUT -$CREATURE:FORGOTTEN_BEAST_352:STOMACH -$CREATURE:FORGOTTEN_BEAST_352:GIZZARD -%CREATURE:FORGOTTEN_BEAST_352:PANCREAS -#CREATURE:FORGOTTEN_BEAST_352:SPLEEN -#CREATURE:FORGOTTEN_BEAST_352:KIDNEY -#CREATURE:FORGOTTEN_BEAST_353:MUSCLE - CREATURE:FORGOTTEN_BEAST_353:EYE -"CREATURE:FORGOTTEN_BEAST_353:BRAIN -!CREATURE:FORGOTTEN_BEAST_353:LUNG -"CREATURE:FORGOTTEN_BEAST_353:HEART -"CREATURE:FORGOTTEN_BEAST_353:LIVER - CREATURE:FORGOTTEN_BEAST_353:GUT -$CREATURE:FORGOTTEN_BEAST_353:STOMACH -$CREATURE:FORGOTTEN_BEAST_353:GIZZARD -%CREATURE:FORGOTTEN_BEAST_353:PANCREAS -#CREATURE:FORGOTTEN_BEAST_353:SPLEEN -#CREATURE:FORGOTTEN_BEAST_353:KIDNEY -#CREATURE:FORGOTTEN_BEAST_354:MUSCLE - CREATURE:FORGOTTEN_BEAST_354:EYE -"CREATURE:FORGOTTEN_BEAST_354:BRAIN -!CREATURE:FORGOTTEN_BEAST_354:LUNG -"CREATURE:FORGOTTEN_BEAST_354:HEART -"CREATURE:FORGOTTEN_BEAST_354:LIVER - CREATURE:FORGOTTEN_BEAST_354:GUT -$CREATURE:FORGOTTEN_BEAST_354:STOMACH -$CREATURE:FORGOTTEN_BEAST_354:GIZZARD -%CREATURE:FORGOTTEN_BEAST_354:PANCREAS -#CREATURE:FORGOTTEN_BEAST_354:SPLEEN -#CREATURE:FORGOTTEN_BEAST_354:KIDNEY -#CREATURE:FORGOTTEN_BEAST_355:MUSCLE - CREATURE:FORGOTTEN_BEAST_355:EYE -"CREATURE:FORGOTTEN_BEAST_355:BRAIN -!CREATURE:FORGOTTEN_BEAST_355:LUNG -"CREATURE:FORGOTTEN_BEAST_355:HEART -"CREATURE:FORGOTTEN_BEAST_355:LIVER - CREATURE:FORGOTTEN_BEAST_355:GUT -$CREATURE:FORGOTTEN_BEAST_355:STOMACH -$CREATURE:FORGOTTEN_BEAST_355:GIZZARD -%CREATURE:FORGOTTEN_BEAST_355:PANCREAS -#CREATURE:FORGOTTEN_BEAST_355:SPLEEN -#CREATURE:FORGOTTEN_BEAST_355:KIDNEY -#CREATURE:FORGOTTEN_BEAST_356:MUSCLE - CREATURE:FORGOTTEN_BEAST_356:EYE -"CREATURE:FORGOTTEN_BEAST_356:BRAIN -!CREATURE:FORGOTTEN_BEAST_356:LUNG -"CREATURE:FORGOTTEN_BEAST_356:HEART -"CREATURE:FORGOTTEN_BEAST_356:LIVER - CREATURE:FORGOTTEN_BEAST_356:GUT -$CREATURE:FORGOTTEN_BEAST_356:STOMACH -$CREATURE:FORGOTTEN_BEAST_356:GIZZARD -%CREATURE:FORGOTTEN_BEAST_356:PANCREAS -#CREATURE:FORGOTTEN_BEAST_356:SPLEEN -#CREATURE:FORGOTTEN_BEAST_356:KIDNEY -#CREATURE:FORGOTTEN_BEAST_357:MUSCLE - CREATURE:FORGOTTEN_BEAST_357:EYE -"CREATURE:FORGOTTEN_BEAST_357:BRAIN -!CREATURE:FORGOTTEN_BEAST_357:LUNG -"CREATURE:FORGOTTEN_BEAST_357:HEART -"CREATURE:FORGOTTEN_BEAST_357:LIVER - CREATURE:FORGOTTEN_BEAST_357:GUT -$CREATURE:FORGOTTEN_BEAST_357:STOMACH -$CREATURE:FORGOTTEN_BEAST_357:GIZZARD -%CREATURE:FORGOTTEN_BEAST_357:PANCREAS -#CREATURE:FORGOTTEN_BEAST_357:SPLEEN -#CREATURE:FORGOTTEN_BEAST_357:KIDNEY -#CREATURE:FORGOTTEN_BEAST_358:MUSCLE - CREATURE:FORGOTTEN_BEAST_358:EYE -"CREATURE:FORGOTTEN_BEAST_358:BRAIN -!CREATURE:FORGOTTEN_BEAST_358:LUNG -"CREATURE:FORGOTTEN_BEAST_358:HEART -"CREATURE:FORGOTTEN_BEAST_358:LIVER - CREATURE:FORGOTTEN_BEAST_358:GUT -$CREATURE:FORGOTTEN_BEAST_358:STOMACH -$CREATURE:FORGOTTEN_BEAST_358:GIZZARD -%CREATURE:FORGOTTEN_BEAST_358:PANCREAS -#CREATURE:FORGOTTEN_BEAST_358:SPLEEN -#CREATURE:FORGOTTEN_BEAST_358:KIDNEY -#CREATURE:FORGOTTEN_BEAST_359:MUSCLE - CREATURE:FORGOTTEN_BEAST_359:EYE -"CREATURE:FORGOTTEN_BEAST_359:BRAIN -!CREATURE:FORGOTTEN_BEAST_359:LUNG -"CREATURE:FORGOTTEN_BEAST_359:HEART -"CREATURE:FORGOTTEN_BEAST_359:LIVER - CREATURE:FORGOTTEN_BEAST_359:GUT -$CREATURE:FORGOTTEN_BEAST_359:STOMACH -$CREATURE:FORGOTTEN_BEAST_359:GIZZARD -%CREATURE:FORGOTTEN_BEAST_359:PANCREAS -#CREATURE:FORGOTTEN_BEAST_359:SPLEEN -#CREATURE:FORGOTTEN_BEAST_359:KIDNEY -#CREATURE:FORGOTTEN_BEAST_361:MUSCLE - CREATURE:FORGOTTEN_BEAST_361:EYE -"CREATURE:FORGOTTEN_BEAST_361:BRAIN -!CREATURE:FORGOTTEN_BEAST_361:LUNG -"CREATURE:FORGOTTEN_BEAST_361:HEART -"CREATURE:FORGOTTEN_BEAST_361:LIVER - CREATURE:FORGOTTEN_BEAST_361:GUT -$CREATURE:FORGOTTEN_BEAST_361:STOMACH -$CREATURE:FORGOTTEN_BEAST_361:GIZZARD -%CREATURE:FORGOTTEN_BEAST_361:PANCREAS -#CREATURE:FORGOTTEN_BEAST_361:SPLEEN -#CREATURE:FORGOTTEN_BEAST_361:KIDNEY -#CREATURE:FORGOTTEN_BEAST_363:MUSCLE - CREATURE:FORGOTTEN_BEAST_363:EYE -"CREATURE:FORGOTTEN_BEAST_363:BRAIN -!CREATURE:FORGOTTEN_BEAST_363:LUNG -"CREATURE:FORGOTTEN_BEAST_363:HEART -"CREATURE:FORGOTTEN_BEAST_363:LIVER - CREATURE:FORGOTTEN_BEAST_363:GUT -$CREATURE:FORGOTTEN_BEAST_363:STOMACH -$CREATURE:FORGOTTEN_BEAST_363:GIZZARD -%CREATURE:FORGOTTEN_BEAST_363:PANCREAS -#CREATURE:FORGOTTEN_BEAST_363:SPLEEN -#CREATURE:FORGOTTEN_BEAST_363:KIDNEY -#CREATURE:FORGOTTEN_BEAST_364:MUSCLE - CREATURE:FORGOTTEN_BEAST_364:EYE -"CREATURE:FORGOTTEN_BEAST_364:BRAIN -!CREATURE:FORGOTTEN_BEAST_364:LUNG -"CREATURE:FORGOTTEN_BEAST_364:HEART -"CREATURE:FORGOTTEN_BEAST_364:LIVER - CREATURE:FORGOTTEN_BEAST_364:GUT -$CREATURE:FORGOTTEN_BEAST_364:STOMACH -$CREATURE:FORGOTTEN_BEAST_364:GIZZARD -%CREATURE:FORGOTTEN_BEAST_364:PANCREAS -#CREATURE:FORGOTTEN_BEAST_364:SPLEEN -#CREATURE:FORGOTTEN_BEAST_364:KIDNEY -#CREATURE:FORGOTTEN_BEAST_365:MUSCLE - CREATURE:FORGOTTEN_BEAST_365:EYE -"CREATURE:FORGOTTEN_BEAST_365:BRAIN -!CREATURE:FORGOTTEN_BEAST_365:LUNG -"CREATURE:FORGOTTEN_BEAST_365:HEART -"CREATURE:FORGOTTEN_BEAST_365:LIVER - CREATURE:FORGOTTEN_BEAST_365:GUT -$CREATURE:FORGOTTEN_BEAST_365:STOMACH -$CREATURE:FORGOTTEN_BEAST_365:GIZZARD -%CREATURE:FORGOTTEN_BEAST_365:PANCREAS -#CREATURE:FORGOTTEN_BEAST_365:SPLEEN -#CREATURE:FORGOTTEN_BEAST_365:KIDNEY -#CREATURE:FORGOTTEN_BEAST_366:MUSCLE - CREATURE:FORGOTTEN_BEAST_366:EYE -"CREATURE:FORGOTTEN_BEAST_366:BRAIN -!CREATURE:FORGOTTEN_BEAST_366:LUNG -"CREATURE:FORGOTTEN_BEAST_366:HEART -"CREATURE:FORGOTTEN_BEAST_366:LIVER - CREATURE:FORGOTTEN_BEAST_366:GUT -$CREATURE:FORGOTTEN_BEAST_366:STOMACH -$CREATURE:FORGOTTEN_BEAST_366:GIZZARD -%CREATURE:FORGOTTEN_BEAST_366:PANCREAS -#CREATURE:FORGOTTEN_BEAST_366:SPLEEN -#CREATURE:FORGOTTEN_BEAST_366:KIDNEY -#CREATURE:FORGOTTEN_BEAST_367:MUSCLE - CREATURE:FORGOTTEN_BEAST_367:EYE -"CREATURE:FORGOTTEN_BEAST_367:BRAIN -!CREATURE:FORGOTTEN_BEAST_367:LUNG -"CREATURE:FORGOTTEN_BEAST_367:HEART -"CREATURE:FORGOTTEN_BEAST_367:LIVER - CREATURE:FORGOTTEN_BEAST_367:GUT -$CREATURE:FORGOTTEN_BEAST_367:STOMACH -$CREATURE:FORGOTTEN_BEAST_367:GIZZARD -%CREATURE:FORGOTTEN_BEAST_367:PANCREAS -#CREATURE:FORGOTTEN_BEAST_367:SPLEEN -#CREATURE:FORGOTTEN_BEAST_367:KIDNEY -#CREATURE:FORGOTTEN_BEAST_368:MUSCLE - CREATURE:FORGOTTEN_BEAST_368:EYE -"CREATURE:FORGOTTEN_BEAST_368:BRAIN -!CREATURE:FORGOTTEN_BEAST_368:LUNG -"CREATURE:FORGOTTEN_BEAST_368:HEART -"CREATURE:FORGOTTEN_BEAST_368:LIVER - CREATURE:FORGOTTEN_BEAST_368:GUT -$CREATURE:FORGOTTEN_BEAST_368:STOMACH -$CREATURE:FORGOTTEN_BEAST_368:GIZZARD -%CREATURE:FORGOTTEN_BEAST_368:PANCREAS -#CREATURE:FORGOTTEN_BEAST_368:SPLEEN -#CREATURE:FORGOTTEN_BEAST_368:KIDNEY -#CREATURE:FORGOTTEN_BEAST_370:MUSCLE - CREATURE:FORGOTTEN_BEAST_370:EYE -"CREATURE:FORGOTTEN_BEAST_370:BRAIN -!CREATURE:FORGOTTEN_BEAST_370:LUNG -"CREATURE:FORGOTTEN_BEAST_370:HEART -"CREATURE:FORGOTTEN_BEAST_370:LIVER - CREATURE:FORGOTTEN_BEAST_370:GUT -$CREATURE:FORGOTTEN_BEAST_370:STOMACH -$CREATURE:FORGOTTEN_BEAST_370:GIZZARD -%CREATURE:FORGOTTEN_BEAST_370:PANCREAS -#CREATURE:FORGOTTEN_BEAST_370:SPLEEN -#CREATURE:FORGOTTEN_BEAST_370:KIDNEY -#CREATURE:FORGOTTEN_BEAST_372:MUSCLE - CREATURE:FORGOTTEN_BEAST_372:EYE -"CREATURE:FORGOTTEN_BEAST_372:BRAIN -!CREATURE:FORGOTTEN_BEAST_372:LUNG -"CREATURE:FORGOTTEN_BEAST_372:HEART -"CREATURE:FORGOTTEN_BEAST_372:LIVER - CREATURE:FORGOTTEN_BEAST_372:GUT -$CREATURE:FORGOTTEN_BEAST_372:STOMACH -$CREATURE:FORGOTTEN_BEAST_372:GIZZARD -%CREATURE:FORGOTTEN_BEAST_372:PANCREAS -#CREATURE:FORGOTTEN_BEAST_372:SPLEEN -#CREATURE:FORGOTTEN_BEAST_372:KIDNEY -#CREATURE:FORGOTTEN_BEAST_374:MUSCLE - CREATURE:FORGOTTEN_BEAST_374:EYE -"CREATURE:FORGOTTEN_BEAST_374:BRAIN -!CREATURE:FORGOTTEN_BEAST_374:LUNG -"CREATURE:FORGOTTEN_BEAST_374:HEART -"CREATURE:FORGOTTEN_BEAST_374:LIVER - CREATURE:FORGOTTEN_BEAST_374:GUT -$CREATURE:FORGOTTEN_BEAST_374:STOMACH -$CREATURE:FORGOTTEN_BEAST_374:GIZZARD -%CREATURE:FORGOTTEN_BEAST_374:PANCREAS -#CREATURE:FORGOTTEN_BEAST_374:SPLEEN -#CREATURE:FORGOTTEN_BEAST_374:KIDNEY -#CREATURE:FORGOTTEN_BEAST_375:MUSCLE - CREATURE:FORGOTTEN_BEAST_375:EYE -"CREATURE:FORGOTTEN_BEAST_375:BRAIN -!CREATURE:FORGOTTEN_BEAST_375:LUNG -"CREATURE:FORGOTTEN_BEAST_375:HEART -"CREATURE:FORGOTTEN_BEAST_375:LIVER - CREATURE:FORGOTTEN_BEAST_375:GUT -$CREATURE:FORGOTTEN_BEAST_375:STOMACH -$CREATURE:FORGOTTEN_BEAST_375:GIZZARD -%CREATURE:FORGOTTEN_BEAST_375:PANCREAS -#CREATURE:FORGOTTEN_BEAST_375:SPLEEN -#CREATURE:FORGOTTEN_BEAST_375:KIDNEY -#CREATURE:FORGOTTEN_BEAST_377:MUSCLE - CREATURE:FORGOTTEN_BEAST_377:EYE -"CREATURE:FORGOTTEN_BEAST_377:BRAIN -!CREATURE:FORGOTTEN_BEAST_377:LUNG -"CREATURE:FORGOTTEN_BEAST_377:HEART -"CREATURE:FORGOTTEN_BEAST_377:LIVER - CREATURE:FORGOTTEN_BEAST_377:GUT -$CREATURE:FORGOTTEN_BEAST_377:STOMACH -$CREATURE:FORGOTTEN_BEAST_377:GIZZARD -%CREATURE:FORGOTTEN_BEAST_377:PANCREAS -#CREATURE:FORGOTTEN_BEAST_377:SPLEEN -#CREATURE:FORGOTTEN_BEAST_377:KIDNEY -#CREATURE:FORGOTTEN_BEAST_378:MUSCLE - CREATURE:FORGOTTEN_BEAST_378:EYE -"CREATURE:FORGOTTEN_BEAST_378:BRAIN -!CREATURE:FORGOTTEN_BEAST_378:LUNG -"CREATURE:FORGOTTEN_BEAST_378:HEART -"CREATURE:FORGOTTEN_BEAST_378:LIVER - CREATURE:FORGOTTEN_BEAST_378:GUT -$CREATURE:FORGOTTEN_BEAST_378:STOMACH -$CREATURE:FORGOTTEN_BEAST_378:GIZZARD -%CREATURE:FORGOTTEN_BEAST_378:PANCREAS -#CREATURE:FORGOTTEN_BEAST_378:SPLEEN -#CREATURE:FORGOTTEN_BEAST_378:KIDNEY -#CREATURE:FORGOTTEN_BEAST_379:MUSCLE - CREATURE:FORGOTTEN_BEAST_379:EYE -"CREATURE:FORGOTTEN_BEAST_379:BRAIN -!CREATURE:FORGOTTEN_BEAST_379:LUNG -"CREATURE:FORGOTTEN_BEAST_379:HEART -"CREATURE:FORGOTTEN_BEAST_379:LIVER - CREATURE:FORGOTTEN_BEAST_379:GUT -$CREATURE:FORGOTTEN_BEAST_379:STOMACH -$CREATURE:FORGOTTEN_BEAST_379:GIZZARD -%CREATURE:FORGOTTEN_BEAST_379:PANCREAS -#CREATURE:FORGOTTEN_BEAST_379:SPLEEN -#CREATURE:FORGOTTEN_BEAST_379:KIDNEY -#CREATURE:FORGOTTEN_BEAST_380:MUSCLE - CREATURE:FORGOTTEN_BEAST_380:EYE -"CREATURE:FORGOTTEN_BEAST_380:BRAIN -!CREATURE:FORGOTTEN_BEAST_380:LUNG -"CREATURE:FORGOTTEN_BEAST_380:HEART -"CREATURE:FORGOTTEN_BEAST_380:LIVER - CREATURE:FORGOTTEN_BEAST_380:GUT -$CREATURE:FORGOTTEN_BEAST_380:STOMACH -$CREATURE:FORGOTTEN_BEAST_380:GIZZARD -%CREATURE:FORGOTTEN_BEAST_380:PANCREAS -#CREATURE:FORGOTTEN_BEAST_380:SPLEEN -#CREATURE:FORGOTTEN_BEAST_380:KIDNEY -#CREATURE:FORGOTTEN_BEAST_381:MUSCLE - CREATURE:FORGOTTEN_BEAST_381:EYE -"CREATURE:FORGOTTEN_BEAST_381:BRAIN -!CREATURE:FORGOTTEN_BEAST_381:LUNG -"CREATURE:FORGOTTEN_BEAST_381:HEART -"CREATURE:FORGOTTEN_BEAST_381:LIVER - CREATURE:FORGOTTEN_BEAST_381:GUT -$CREATURE:FORGOTTEN_BEAST_381:STOMACH -$CREATURE:FORGOTTEN_BEAST_381:GIZZARD -%CREATURE:FORGOTTEN_BEAST_381:PANCREAS -#CREATURE:FORGOTTEN_BEAST_381:SPLEEN -#CREATURE:FORGOTTEN_BEAST_381:KIDNEY -#CREATURE:FORGOTTEN_BEAST_382:MUSCLE - CREATURE:FORGOTTEN_BEAST_382:EYE -"CREATURE:FORGOTTEN_BEAST_382:BRAIN -!CREATURE:FORGOTTEN_BEAST_382:LUNG -"CREATURE:FORGOTTEN_BEAST_382:HEART -"CREATURE:FORGOTTEN_BEAST_382:LIVER - CREATURE:FORGOTTEN_BEAST_382:GUT -$CREATURE:FORGOTTEN_BEAST_382:STOMACH -$CREATURE:FORGOTTEN_BEAST_382:GIZZARD -%CREATURE:FORGOTTEN_BEAST_382:PANCREAS -#CREATURE:FORGOTTEN_BEAST_382:SPLEEN -#CREATURE:FORGOTTEN_BEAST_382:KIDNEY -#CREATURE:FORGOTTEN_BEAST_383:MUSCLE - CREATURE:FORGOTTEN_BEAST_383:EYE -"CREATURE:FORGOTTEN_BEAST_383:BRAIN -!CREATURE:FORGOTTEN_BEAST_383:LUNG -"CREATURE:FORGOTTEN_BEAST_383:HEART -"CREATURE:FORGOTTEN_BEAST_383:LIVER - CREATURE:FORGOTTEN_BEAST_383:GUT -$CREATURE:FORGOTTEN_BEAST_383:STOMACH -$CREATURE:FORGOTTEN_BEAST_383:GIZZARD -%CREATURE:FORGOTTEN_BEAST_383:PANCREAS -#CREATURE:FORGOTTEN_BEAST_383:SPLEEN -#CREATURE:FORGOTTEN_BEAST_383:KIDNEY -#CREATURE:FORGOTTEN_BEAST_384:MUSCLE - CREATURE:FORGOTTEN_BEAST_384:EYE -"CREATURE:FORGOTTEN_BEAST_384:BRAIN -!CREATURE:FORGOTTEN_BEAST_384:LUNG -"CREATURE:FORGOTTEN_BEAST_384:HEART -"CREATURE:FORGOTTEN_BEAST_384:LIVER - CREATURE:FORGOTTEN_BEAST_384:GUT -$CREATURE:FORGOTTEN_BEAST_384:STOMACH -$CREATURE:FORGOTTEN_BEAST_384:GIZZARD -%CREATURE:FORGOTTEN_BEAST_384:PANCREAS -#CREATURE:FORGOTTEN_BEAST_384:SPLEEN -#CREATURE:FORGOTTEN_BEAST_384:KIDNEY -#CREATURE:FORGOTTEN_BEAST_385:MUSCLE - CREATURE:FORGOTTEN_BEAST_385:EYE -"CREATURE:FORGOTTEN_BEAST_385:BRAIN -!CREATURE:FORGOTTEN_BEAST_385:LUNG -"CREATURE:FORGOTTEN_BEAST_385:HEART -"CREATURE:FORGOTTEN_BEAST_385:LIVER - CREATURE:FORGOTTEN_BEAST_385:GUT -$CREATURE:FORGOTTEN_BEAST_385:STOMACH -$CREATURE:FORGOTTEN_BEAST_385:GIZZARD -%CREATURE:FORGOTTEN_BEAST_385:PANCREAS -#CREATURE:FORGOTTEN_BEAST_385:SPLEEN -#CREATURE:FORGOTTEN_BEAST_385:KIDNEY -#CREATURE:FORGOTTEN_BEAST_386:MUSCLE - CREATURE:FORGOTTEN_BEAST_386:EYE -"CREATURE:FORGOTTEN_BEAST_386:BRAIN -!CREATURE:FORGOTTEN_BEAST_386:LUNG -"CREATURE:FORGOTTEN_BEAST_386:HEART -"CREATURE:FORGOTTEN_BEAST_386:LIVER - CREATURE:FORGOTTEN_BEAST_386:GUT -$CREATURE:FORGOTTEN_BEAST_386:STOMACH -$CREATURE:FORGOTTEN_BEAST_386:GIZZARD -%CREATURE:FORGOTTEN_BEAST_386:PANCREAS -#CREATURE:FORGOTTEN_BEAST_386:SPLEEN -#CREATURE:FORGOTTEN_BEAST_386:KIDNEY -#CREATURE:FORGOTTEN_BEAST_387:MUSCLE - CREATURE:FORGOTTEN_BEAST_387:EYE -"CREATURE:FORGOTTEN_BEAST_387:BRAIN -!CREATURE:FORGOTTEN_BEAST_387:LUNG -"CREATURE:FORGOTTEN_BEAST_387:HEART -"CREATURE:FORGOTTEN_BEAST_387:LIVER - CREATURE:FORGOTTEN_BEAST_387:GUT -$CREATURE:FORGOTTEN_BEAST_387:STOMACH -$CREATURE:FORGOTTEN_BEAST_387:GIZZARD -%CREATURE:FORGOTTEN_BEAST_387:PANCREAS -#CREATURE:FORGOTTEN_BEAST_387:SPLEEN -#CREATURE:FORGOTTEN_BEAST_387:KIDNEY -#CREATURE:FORGOTTEN_BEAST_388:MUSCLE - CREATURE:FORGOTTEN_BEAST_388:EYE -"CREATURE:FORGOTTEN_BEAST_388:BRAIN -!CREATURE:FORGOTTEN_BEAST_388:LUNG -"CREATURE:FORGOTTEN_BEAST_388:HEART -"CREATURE:FORGOTTEN_BEAST_388:LIVER - CREATURE:FORGOTTEN_BEAST_388:GUT -$CREATURE:FORGOTTEN_BEAST_388:STOMACH -$CREATURE:FORGOTTEN_BEAST_388:GIZZARD -%CREATURE:FORGOTTEN_BEAST_388:PANCREAS -#CREATURE:FORGOTTEN_BEAST_388:SPLEEN -#CREATURE:FORGOTTEN_BEAST_388:KIDNEY -#CREATURE:FORGOTTEN_BEAST_389:MUSCLE - CREATURE:FORGOTTEN_BEAST_389:EYE -"CREATURE:FORGOTTEN_BEAST_389:BRAIN -!CREATURE:FORGOTTEN_BEAST_389:LUNG -"CREATURE:FORGOTTEN_BEAST_389:HEART -"CREATURE:FORGOTTEN_BEAST_389:LIVER - CREATURE:FORGOTTEN_BEAST_389:GUT -$CREATURE:FORGOTTEN_BEAST_389:STOMACH -$CREATURE:FORGOTTEN_BEAST_389:GIZZARD -%CREATURE:FORGOTTEN_BEAST_389:PANCREAS -#CREATURE:FORGOTTEN_BEAST_389:SPLEEN -#CREATURE:FORGOTTEN_BEAST_389:KIDNEY -#CREATURE:FORGOTTEN_BEAST_390:MUSCLE - CREATURE:FORGOTTEN_BEAST_390:EYE -"CREATURE:FORGOTTEN_BEAST_390:BRAIN -!CREATURE:FORGOTTEN_BEAST_390:LUNG -"CREATURE:FORGOTTEN_BEAST_390:HEART -"CREATURE:FORGOTTEN_BEAST_390:LIVER - CREATURE:FORGOTTEN_BEAST_390:GUT -$CREATURE:FORGOTTEN_BEAST_390:STOMACH -$CREATURE:FORGOTTEN_BEAST_390:GIZZARD -%CREATURE:FORGOTTEN_BEAST_390:PANCREAS -#CREATURE:FORGOTTEN_BEAST_390:SPLEEN -#CREATURE:FORGOTTEN_BEAST_390:KIDNEY -#CREATURE:FORGOTTEN_BEAST_391:MUSCLE - CREATURE:FORGOTTEN_BEAST_391:EYE -"CREATURE:FORGOTTEN_BEAST_391:BRAIN -!CREATURE:FORGOTTEN_BEAST_391:LUNG -"CREATURE:FORGOTTEN_BEAST_391:HEART -"CREATURE:FORGOTTEN_BEAST_391:LIVER - CREATURE:FORGOTTEN_BEAST_391:GUT -$CREATURE:FORGOTTEN_BEAST_391:STOMACH -$CREATURE:FORGOTTEN_BEAST_391:GIZZARD -%CREATURE:FORGOTTEN_BEAST_391:PANCREAS -#CREATURE:FORGOTTEN_BEAST_391:SPLEEN -#CREATURE:FORGOTTEN_BEAST_391:KIDNEY -#CREATURE:FORGOTTEN_BEAST_392:MUSCLE - CREATURE:FORGOTTEN_BEAST_392:EYE -"CREATURE:FORGOTTEN_BEAST_392:BRAIN -!CREATURE:FORGOTTEN_BEAST_392:LUNG -"CREATURE:FORGOTTEN_BEAST_392:HEART -"CREATURE:FORGOTTEN_BEAST_392:LIVER - CREATURE:FORGOTTEN_BEAST_392:GUT -$CREATURE:FORGOTTEN_BEAST_392:STOMACH -$CREATURE:FORGOTTEN_BEAST_392:GIZZARD -%CREATURE:FORGOTTEN_BEAST_392:PANCREAS -#CREATURE:FORGOTTEN_BEAST_392:SPLEEN -#CREATURE:FORGOTTEN_BEAST_392:KIDNEY -#CREATURE:FORGOTTEN_BEAST_393:MUSCLE - CREATURE:FORGOTTEN_BEAST_393:EYE -"CREATURE:FORGOTTEN_BEAST_393:BRAIN -!CREATURE:FORGOTTEN_BEAST_393:LUNG -"CREATURE:FORGOTTEN_BEAST_393:HEART -"CREATURE:FORGOTTEN_BEAST_393:LIVER - CREATURE:FORGOTTEN_BEAST_393:GUT -$CREATURE:FORGOTTEN_BEAST_393:STOMACH -$CREATURE:FORGOTTEN_BEAST_393:GIZZARD -%CREATURE:FORGOTTEN_BEAST_393:PANCREAS -#CREATURE:FORGOTTEN_BEAST_393:SPLEEN -#CREATURE:FORGOTTEN_BEAST_393:KIDNEY -#CREATURE:FORGOTTEN_BEAST_396:MUSCLE - CREATURE:FORGOTTEN_BEAST_396:EYE -"CREATURE:FORGOTTEN_BEAST_396:BRAIN -!CREATURE:FORGOTTEN_BEAST_396:LUNG -"CREATURE:FORGOTTEN_BEAST_396:HEART -"CREATURE:FORGOTTEN_BEAST_396:LIVER - CREATURE:FORGOTTEN_BEAST_396:GUT -$CREATURE:FORGOTTEN_BEAST_396:STOMACH -$CREATURE:FORGOTTEN_BEAST_396:GIZZARD -%CREATURE:FORGOTTEN_BEAST_396:PANCREAS -#CREATURE:FORGOTTEN_BEAST_396:SPLEEN -#CREATURE:FORGOTTEN_BEAST_396:KIDNEY -#CREATURE:FORGOTTEN_BEAST_397:MUSCLE - CREATURE:FORGOTTEN_BEAST_397:EYE -"CREATURE:FORGOTTEN_BEAST_397:BRAIN -!CREATURE:FORGOTTEN_BEAST_397:LUNG -"CREATURE:FORGOTTEN_BEAST_397:HEART -"CREATURE:FORGOTTEN_BEAST_397:LIVER - CREATURE:FORGOTTEN_BEAST_397:GUT -$CREATURE:FORGOTTEN_BEAST_397:STOMACH -$CREATURE:FORGOTTEN_BEAST_397:GIZZARD -%CREATURE:FORGOTTEN_BEAST_397:PANCREAS -#CREATURE:FORGOTTEN_BEAST_397:SPLEEN -#CREATURE:FORGOTTEN_BEAST_397:KIDNEY -#CREATURE:FORGOTTEN_BEAST_398:MUSCLE - CREATURE:FORGOTTEN_BEAST_398:EYE -"CREATURE:FORGOTTEN_BEAST_398:BRAIN -!CREATURE:FORGOTTEN_BEAST_398:LUNG -"CREATURE:FORGOTTEN_BEAST_398:HEART -"CREATURE:FORGOTTEN_BEAST_398:LIVER - CREATURE:FORGOTTEN_BEAST_398:GUT -$CREATURE:FORGOTTEN_BEAST_398:STOMACH -$CREATURE:FORGOTTEN_BEAST_398:GIZZARD -%CREATURE:FORGOTTEN_BEAST_398:PANCREAS -#CREATURE:FORGOTTEN_BEAST_398:SPLEEN -#CREATURE:FORGOTTEN_BEAST_398:KIDNEY -#CREATURE:FORGOTTEN_BEAST_400:MUSCLE - CREATURE:FORGOTTEN_BEAST_400:EYE -"CREATURE:FORGOTTEN_BEAST_400:BRAIN -!CREATURE:FORGOTTEN_BEAST_400:LUNG -"CREATURE:FORGOTTEN_BEAST_400:HEART -"CREATURE:FORGOTTEN_BEAST_400:LIVER - CREATURE:FORGOTTEN_BEAST_400:GUT -$CREATURE:FORGOTTEN_BEAST_400:STOMACH -$CREATURE:FORGOTTEN_BEAST_400:GIZZARD -%CREATURE:FORGOTTEN_BEAST_400:PANCREAS -#CREATURE:FORGOTTEN_BEAST_400:SPLEEN -#CREATURE:FORGOTTEN_BEAST_400:KIDNEY -#CREATURE:FORGOTTEN_BEAST_403:MUSCLE - CREATURE:FORGOTTEN_BEAST_403:EYE -"CREATURE:FORGOTTEN_BEAST_403:BRAIN -!CREATURE:FORGOTTEN_BEAST_403:LUNG -"CREATURE:FORGOTTEN_BEAST_403:HEART -"CREATURE:FORGOTTEN_BEAST_403:LIVER - CREATURE:FORGOTTEN_BEAST_403:GUT -$CREATURE:FORGOTTEN_BEAST_403:STOMACH -$CREATURE:FORGOTTEN_BEAST_403:GIZZARD -%CREATURE:FORGOTTEN_BEAST_403:PANCREAS -#CREATURE:FORGOTTEN_BEAST_403:SPLEEN -#CREATURE:FORGOTTEN_BEAST_403:KIDNEY -#CREATURE:FORGOTTEN_BEAST_404:MUSCLE - CREATURE:FORGOTTEN_BEAST_404:EYE -"CREATURE:FORGOTTEN_BEAST_404:BRAIN -!CREATURE:FORGOTTEN_BEAST_404:LUNG -"CREATURE:FORGOTTEN_BEAST_404:HEART -"CREATURE:FORGOTTEN_BEAST_404:LIVER - CREATURE:FORGOTTEN_BEAST_404:GUT -$CREATURE:FORGOTTEN_BEAST_404:STOMACH -$CREATURE:FORGOTTEN_BEAST_404:GIZZARD -%CREATURE:FORGOTTEN_BEAST_404:PANCREAS -#CREATURE:FORGOTTEN_BEAST_404:SPLEEN -#CREATURE:FORGOTTEN_BEAST_404:KIDNEY -#CREATURE:FORGOTTEN_BEAST_405:MUSCLE - CREATURE:FORGOTTEN_BEAST_405:EYE -"CREATURE:FORGOTTEN_BEAST_405:BRAIN -!CREATURE:FORGOTTEN_BEAST_405:LUNG -"CREATURE:FORGOTTEN_BEAST_405:HEART -"CREATURE:FORGOTTEN_BEAST_405:LIVER - CREATURE:FORGOTTEN_BEAST_405:GUT -$CREATURE:FORGOTTEN_BEAST_405:STOMACH -$CREATURE:FORGOTTEN_BEAST_405:GIZZARD -%CREATURE:FORGOTTEN_BEAST_405:PANCREAS -#CREATURE:FORGOTTEN_BEAST_405:SPLEEN -#CREATURE:FORGOTTEN_BEAST_405:KIDNEY -#CREATURE:FORGOTTEN_BEAST_406:MUSCLE - CREATURE:FORGOTTEN_BEAST_406:EYE -"CREATURE:FORGOTTEN_BEAST_406:BRAIN -!CREATURE:FORGOTTEN_BEAST_406:LUNG -"CREATURE:FORGOTTEN_BEAST_406:HEART -"CREATURE:FORGOTTEN_BEAST_406:LIVER - CREATURE:FORGOTTEN_BEAST_406:GUT -$CREATURE:FORGOTTEN_BEAST_406:STOMACH -$CREATURE:FORGOTTEN_BEAST_406:GIZZARD -%CREATURE:FORGOTTEN_BEAST_406:PANCREAS -#CREATURE:FORGOTTEN_BEAST_406:SPLEEN -#CREATURE:FORGOTTEN_BEAST_406:KIDNEY -#CREATURE:FORGOTTEN_BEAST_407:MUSCLE - CREATURE:FORGOTTEN_BEAST_407:EYE -"CREATURE:FORGOTTEN_BEAST_407:BRAIN -!CREATURE:FORGOTTEN_BEAST_407:LUNG -"CREATURE:FORGOTTEN_BEAST_407:HEART -"CREATURE:FORGOTTEN_BEAST_407:LIVER - CREATURE:FORGOTTEN_BEAST_407:GUT -$CREATURE:FORGOTTEN_BEAST_407:STOMACH -$CREATURE:FORGOTTEN_BEAST_407:GIZZARD -%CREATURE:FORGOTTEN_BEAST_407:PANCREAS -#CREATURE:FORGOTTEN_BEAST_407:SPLEEN -#CREATURE:FORGOTTEN_BEAST_407:KIDNEY -#CREATURE:FORGOTTEN_BEAST_408:MUSCLE - CREATURE:FORGOTTEN_BEAST_408:EYE -"CREATURE:FORGOTTEN_BEAST_408:BRAIN -!CREATURE:FORGOTTEN_BEAST_408:LUNG -"CREATURE:FORGOTTEN_BEAST_408:HEART -"CREATURE:FORGOTTEN_BEAST_408:LIVER - CREATURE:FORGOTTEN_BEAST_408:GUT -$CREATURE:FORGOTTEN_BEAST_408:STOMACH -$CREATURE:FORGOTTEN_BEAST_408:GIZZARD -%CREATURE:FORGOTTEN_BEAST_408:PANCREAS -#CREATURE:FORGOTTEN_BEAST_408:SPLEEN -#CREATURE:FORGOTTEN_BEAST_408:KIDNEY -#CREATURE:FORGOTTEN_BEAST_409:MUSCLE - CREATURE:FORGOTTEN_BEAST_409:EYE -"CREATURE:FORGOTTEN_BEAST_409:BRAIN -!CREATURE:FORGOTTEN_BEAST_409:LUNG -"CREATURE:FORGOTTEN_BEAST_409:HEART -"CREATURE:FORGOTTEN_BEAST_409:LIVER - CREATURE:FORGOTTEN_BEAST_409:GUT -$CREATURE:FORGOTTEN_BEAST_409:STOMACH -$CREATURE:FORGOTTEN_BEAST_409:GIZZARD -%CREATURE:FORGOTTEN_BEAST_409:PANCREAS -#CREATURE:FORGOTTEN_BEAST_409:SPLEEN -#CREATURE:FORGOTTEN_BEAST_409:KIDNEY -#CREATURE:FORGOTTEN_BEAST_410:MUSCLE - CREATURE:FORGOTTEN_BEAST_410:EYE -"CREATURE:FORGOTTEN_BEAST_410:BRAIN -!CREATURE:FORGOTTEN_BEAST_410:LUNG -"CREATURE:FORGOTTEN_BEAST_410:HEART -"CREATURE:FORGOTTEN_BEAST_410:LIVER - CREATURE:FORGOTTEN_BEAST_410:GUT -$CREATURE:FORGOTTEN_BEAST_410:STOMACH -$CREATURE:FORGOTTEN_BEAST_410:GIZZARD -%CREATURE:FORGOTTEN_BEAST_410:PANCREAS -#CREATURE:FORGOTTEN_BEAST_410:SPLEEN -#CREATURE:FORGOTTEN_BEAST_410:KIDNEY -#CREATURE:FORGOTTEN_BEAST_411:MUSCLE - CREATURE:FORGOTTEN_BEAST_411:EYE -"CREATURE:FORGOTTEN_BEAST_411:BRAIN -!CREATURE:FORGOTTEN_BEAST_411:LUNG -"CREATURE:FORGOTTEN_BEAST_411:HEART -"CREATURE:FORGOTTEN_BEAST_411:LIVER - CREATURE:FORGOTTEN_BEAST_411:GUT -$CREATURE:FORGOTTEN_BEAST_411:STOMACH -$CREATURE:FORGOTTEN_BEAST_411:GIZZARD -%CREATURE:FORGOTTEN_BEAST_411:PANCREAS -#CREATURE:FORGOTTEN_BEAST_411:SPLEEN -#CREATURE:FORGOTTEN_BEAST_411:KIDNEY -#CREATURE:FORGOTTEN_BEAST_412:MUSCLE - CREATURE:FORGOTTEN_BEAST_412:EYE -"CREATURE:FORGOTTEN_BEAST_412:BRAIN -!CREATURE:FORGOTTEN_BEAST_412:LUNG -"CREATURE:FORGOTTEN_BEAST_412:HEART -"CREATURE:FORGOTTEN_BEAST_412:LIVER - CREATURE:FORGOTTEN_BEAST_412:GUT -$CREATURE:FORGOTTEN_BEAST_412:STOMACH -$CREATURE:FORGOTTEN_BEAST_412:GIZZARD -%CREATURE:FORGOTTEN_BEAST_412:PANCREAS -#CREATURE:FORGOTTEN_BEAST_412:SPLEEN -#CREATURE:FORGOTTEN_BEAST_412:KIDNEY -#CREATURE:FORGOTTEN_BEAST_413:MUSCLE - CREATURE:FORGOTTEN_BEAST_413:EYE -"CREATURE:FORGOTTEN_BEAST_413:BRAIN -!CREATURE:FORGOTTEN_BEAST_413:LUNG -"CREATURE:FORGOTTEN_BEAST_413:HEART -"CREATURE:FORGOTTEN_BEAST_413:LIVER - CREATURE:FORGOTTEN_BEAST_413:GUT -$CREATURE:FORGOTTEN_BEAST_413:STOMACH -$CREATURE:FORGOTTEN_BEAST_413:GIZZARD -%CREATURE:FORGOTTEN_BEAST_413:PANCREAS -#CREATURE:FORGOTTEN_BEAST_413:SPLEEN -#CREATURE:FORGOTTEN_BEAST_413:KIDNEY -#CREATURE:FORGOTTEN_BEAST_414:MUSCLE - CREATURE:FORGOTTEN_BEAST_414:EYE -"CREATURE:FORGOTTEN_BEAST_414:BRAIN -!CREATURE:FORGOTTEN_BEAST_414:LUNG -"CREATURE:FORGOTTEN_BEAST_414:HEART -"CREATURE:FORGOTTEN_BEAST_414:LIVER - CREATURE:FORGOTTEN_BEAST_414:GUT -$CREATURE:FORGOTTEN_BEAST_414:STOMACH -$CREATURE:FORGOTTEN_BEAST_414:GIZZARD -%CREATURE:FORGOTTEN_BEAST_414:PANCREAS -#CREATURE:FORGOTTEN_BEAST_414:SPLEEN -#CREATURE:FORGOTTEN_BEAST_414:KIDNEY -#CREATURE:FORGOTTEN_BEAST_416:MUSCLE - CREATURE:FORGOTTEN_BEAST_416:EYE -"CREATURE:FORGOTTEN_BEAST_416:BRAIN -!CREATURE:FORGOTTEN_BEAST_416:LUNG -"CREATURE:FORGOTTEN_BEAST_416:HEART -"CREATURE:FORGOTTEN_BEAST_416:LIVER - CREATURE:FORGOTTEN_BEAST_416:GUT -$CREATURE:FORGOTTEN_BEAST_416:STOMACH -$CREATURE:FORGOTTEN_BEAST_416:GIZZARD -%CREATURE:FORGOTTEN_BEAST_416:PANCREAS -#CREATURE:FORGOTTEN_BEAST_416:SPLEEN -#CREATURE:FORGOTTEN_BEAST_416:KIDNEY -#CREATURE:FORGOTTEN_BEAST_417:MUSCLE - CREATURE:FORGOTTEN_BEAST_417:EYE -"CREATURE:FORGOTTEN_BEAST_417:BRAIN -!CREATURE:FORGOTTEN_BEAST_417:LUNG -"CREATURE:FORGOTTEN_BEAST_417:HEART -"CREATURE:FORGOTTEN_BEAST_417:LIVER - CREATURE:FORGOTTEN_BEAST_417:GUT -$CREATURE:FORGOTTEN_BEAST_417:STOMACH -$CREATURE:FORGOTTEN_BEAST_417:GIZZARD -%CREATURE:FORGOTTEN_BEAST_417:PANCREAS -#CREATURE:FORGOTTEN_BEAST_417:SPLEEN -#CREATURE:FORGOTTEN_BEAST_417:KIDNEY -#CREATURE:FORGOTTEN_BEAST_418:MUSCLE - CREATURE:FORGOTTEN_BEAST_418:EYE -"CREATURE:FORGOTTEN_BEAST_418:BRAIN -!CREATURE:FORGOTTEN_BEAST_418:LUNG -"CREATURE:FORGOTTEN_BEAST_418:HEART -"CREATURE:FORGOTTEN_BEAST_418:LIVER - CREATURE:FORGOTTEN_BEAST_418:GUT -$CREATURE:FORGOTTEN_BEAST_418:STOMACH -$CREATURE:FORGOTTEN_BEAST_418:GIZZARD -%CREATURE:FORGOTTEN_BEAST_418:PANCREAS -#CREATURE:FORGOTTEN_BEAST_418:SPLEEN -#CREATURE:FORGOTTEN_BEAST_418:KIDNEY -#CREATURE:FORGOTTEN_BEAST_420:MUSCLE - CREATURE:FORGOTTEN_BEAST_420:EYE -"CREATURE:FORGOTTEN_BEAST_420:BRAIN -!CREATURE:FORGOTTEN_BEAST_420:LUNG -"CREATURE:FORGOTTEN_BEAST_420:HEART -"CREATURE:FORGOTTEN_BEAST_420:LIVER - CREATURE:FORGOTTEN_BEAST_420:GUT -$CREATURE:FORGOTTEN_BEAST_420:STOMACH -$CREATURE:FORGOTTEN_BEAST_420:GIZZARD -%CREATURE:FORGOTTEN_BEAST_420:PANCREAS -#CREATURE:FORGOTTEN_BEAST_420:SPLEEN -#CREATURE:FORGOTTEN_BEAST_420:KIDNEY -#CREATURE:FORGOTTEN_BEAST_421:MUSCLE - CREATURE:FORGOTTEN_BEAST_421:EYE -"CREATURE:FORGOTTEN_BEAST_421:BRAIN -!CREATURE:FORGOTTEN_BEAST_421:LUNG -"CREATURE:FORGOTTEN_BEAST_421:HEART -"CREATURE:FORGOTTEN_BEAST_421:LIVER - CREATURE:FORGOTTEN_BEAST_421:GUT -$CREATURE:FORGOTTEN_BEAST_421:STOMACH -$CREATURE:FORGOTTEN_BEAST_421:GIZZARD -%CREATURE:FORGOTTEN_BEAST_421:PANCREAS -#CREATURE:FORGOTTEN_BEAST_421:SPLEEN -#CREATURE:FORGOTTEN_BEAST_421:KIDNEY -#CREATURE:FORGOTTEN_BEAST_422:MUSCLE - CREATURE:FORGOTTEN_BEAST_422:EYE -"CREATURE:FORGOTTEN_BEAST_422:BRAIN -!CREATURE:FORGOTTEN_BEAST_422:LUNG -"CREATURE:FORGOTTEN_BEAST_422:HEART -"CREATURE:FORGOTTEN_BEAST_422:LIVER - CREATURE:FORGOTTEN_BEAST_422:GUT -$CREATURE:FORGOTTEN_BEAST_422:STOMACH -$CREATURE:FORGOTTEN_BEAST_422:GIZZARD -%CREATURE:FORGOTTEN_BEAST_422:PANCREAS -#CREATURE:FORGOTTEN_BEAST_422:SPLEEN -#CREATURE:FORGOTTEN_BEAST_422:KIDNEY -#CREATURE:FORGOTTEN_BEAST_423:MUSCLE - CREATURE:FORGOTTEN_BEAST_423:EYE -"CREATURE:FORGOTTEN_BEAST_423:BRAIN -!CREATURE:FORGOTTEN_BEAST_423:LUNG -"CREATURE:FORGOTTEN_BEAST_423:HEART -"CREATURE:FORGOTTEN_BEAST_423:LIVER - CREATURE:FORGOTTEN_BEAST_423:GUT -$CREATURE:FORGOTTEN_BEAST_423:STOMACH -$CREATURE:FORGOTTEN_BEAST_423:GIZZARD -%CREATURE:FORGOTTEN_BEAST_423:PANCREAS -#CREATURE:FORGOTTEN_BEAST_423:SPLEEN -#CREATURE:FORGOTTEN_BEAST_423:KIDNEY -#CREATURE:FORGOTTEN_BEAST_424:MUSCLE - CREATURE:FORGOTTEN_BEAST_424:EYE -"CREATURE:FORGOTTEN_BEAST_424:BRAIN -!CREATURE:FORGOTTEN_BEAST_424:LUNG -"CREATURE:FORGOTTEN_BEAST_424:HEART -"CREATURE:FORGOTTEN_BEAST_424:LIVER - CREATURE:FORGOTTEN_BEAST_424:GUT -$CREATURE:FORGOTTEN_BEAST_424:STOMACH -$CREATURE:FORGOTTEN_BEAST_424:GIZZARD -%CREATURE:FORGOTTEN_BEAST_424:PANCREAS -#CREATURE:FORGOTTEN_BEAST_424:SPLEEN -#CREATURE:FORGOTTEN_BEAST_424:KIDNEY -#CREATURE:FORGOTTEN_BEAST_427:MUSCLE - CREATURE:FORGOTTEN_BEAST_427:EYE -"CREATURE:FORGOTTEN_BEAST_427:BRAIN -!CREATURE:FORGOTTEN_BEAST_427:LUNG -"CREATURE:FORGOTTEN_BEAST_427:HEART -"CREATURE:FORGOTTEN_BEAST_427:LIVER - CREATURE:FORGOTTEN_BEAST_427:GUT -$CREATURE:FORGOTTEN_BEAST_427:STOMACH -$CREATURE:FORGOTTEN_BEAST_427:GIZZARD -%CREATURE:FORGOTTEN_BEAST_427:PANCREAS -#CREATURE:FORGOTTEN_BEAST_427:SPLEEN -#CREATURE:FORGOTTEN_BEAST_427:KIDNEY -#CREATURE:FORGOTTEN_BEAST_429:MUSCLE - CREATURE:FORGOTTEN_BEAST_429:EYE -"CREATURE:FORGOTTEN_BEAST_429:BRAIN -!CREATURE:FORGOTTEN_BEAST_429:LUNG -"CREATURE:FORGOTTEN_BEAST_429:HEART -"CREATURE:FORGOTTEN_BEAST_429:LIVER - CREATURE:FORGOTTEN_BEAST_429:GUT -$CREATURE:FORGOTTEN_BEAST_429:STOMACH -$CREATURE:FORGOTTEN_BEAST_429:GIZZARD -%CREATURE:FORGOTTEN_BEAST_429:PANCREAS -#CREATURE:FORGOTTEN_BEAST_429:SPLEEN -#CREATURE:FORGOTTEN_BEAST_429:KIDNEY -#CREATURE:FORGOTTEN_BEAST_430:MUSCLE - CREATURE:FORGOTTEN_BEAST_430:EYE -"CREATURE:FORGOTTEN_BEAST_430:BRAIN -!CREATURE:FORGOTTEN_BEAST_430:LUNG -"CREATURE:FORGOTTEN_BEAST_430:HEART -"CREATURE:FORGOTTEN_BEAST_430:LIVER - CREATURE:FORGOTTEN_BEAST_430:GUT -$CREATURE:FORGOTTEN_BEAST_430:STOMACH -$CREATURE:FORGOTTEN_BEAST_430:GIZZARD -%CREATURE:FORGOTTEN_BEAST_430:PANCREAS -#CREATURE:FORGOTTEN_BEAST_430:SPLEEN -#CREATURE:FORGOTTEN_BEAST_430:KIDNEY -#CREATURE:FORGOTTEN_BEAST_432:MUSCLE - CREATURE:FORGOTTEN_BEAST_432:EYE -"CREATURE:FORGOTTEN_BEAST_432:BRAIN -!CREATURE:FORGOTTEN_BEAST_432:LUNG -"CREATURE:FORGOTTEN_BEAST_432:HEART -"CREATURE:FORGOTTEN_BEAST_432:LIVER - CREATURE:FORGOTTEN_BEAST_432:GUT -$CREATURE:FORGOTTEN_BEAST_432:STOMACH -$CREATURE:FORGOTTEN_BEAST_432:GIZZARD -%CREATURE:FORGOTTEN_BEAST_432:PANCREAS -#CREATURE:FORGOTTEN_BEAST_432:SPLEEN -#CREATURE:FORGOTTEN_BEAST_432:KIDNEY -#CREATURE:FORGOTTEN_BEAST_433:MUSCLE - CREATURE:FORGOTTEN_BEAST_433:EYE -"CREATURE:FORGOTTEN_BEAST_433:BRAIN -!CREATURE:FORGOTTEN_BEAST_433:LUNG -"CREATURE:FORGOTTEN_BEAST_433:HEART -"CREATURE:FORGOTTEN_BEAST_433:LIVER - CREATURE:FORGOTTEN_BEAST_433:GUT -$CREATURE:FORGOTTEN_BEAST_433:STOMACH -$CREATURE:FORGOTTEN_BEAST_433:GIZZARD -%CREATURE:FORGOTTEN_BEAST_433:PANCREAS -#CREATURE:FORGOTTEN_BEAST_433:SPLEEN -#CREATURE:FORGOTTEN_BEAST_433:KIDNEY -#CREATURE:FORGOTTEN_BEAST_434:MUSCLE - CREATURE:FORGOTTEN_BEAST_434:EYE -"CREATURE:FORGOTTEN_BEAST_434:BRAIN -!CREATURE:FORGOTTEN_BEAST_434:LUNG -"CREATURE:FORGOTTEN_BEAST_434:HEART -"CREATURE:FORGOTTEN_BEAST_434:LIVER - CREATURE:FORGOTTEN_BEAST_434:GUT -$CREATURE:FORGOTTEN_BEAST_434:STOMACH -$CREATURE:FORGOTTEN_BEAST_434:GIZZARD -%CREATURE:FORGOTTEN_BEAST_434:PANCREAS -#CREATURE:FORGOTTEN_BEAST_434:SPLEEN -#CREATURE:FORGOTTEN_BEAST_434:KIDNEY -#CREATURE:FORGOTTEN_BEAST_435:MUSCLE - CREATURE:FORGOTTEN_BEAST_435:EYE -"CREATURE:FORGOTTEN_BEAST_435:BRAIN -!CREATURE:FORGOTTEN_BEAST_435:LUNG -"CREATURE:FORGOTTEN_BEAST_435:HEART -"CREATURE:FORGOTTEN_BEAST_435:LIVER - CREATURE:FORGOTTEN_BEAST_435:GUT -$CREATURE:FORGOTTEN_BEAST_435:STOMACH -$CREATURE:FORGOTTEN_BEAST_435:GIZZARD -%CREATURE:FORGOTTEN_BEAST_435:PANCREAS -#CREATURE:FORGOTTEN_BEAST_435:SPLEEN -#CREATURE:FORGOTTEN_BEAST_435:KIDNEY -#CREATURE:FORGOTTEN_BEAST_436:MUSCLE - CREATURE:FORGOTTEN_BEAST_436:EYE -"CREATURE:FORGOTTEN_BEAST_436:BRAIN -!CREATURE:FORGOTTEN_BEAST_436:LUNG -"CREATURE:FORGOTTEN_BEAST_436:HEART -"CREATURE:FORGOTTEN_BEAST_436:LIVER - CREATURE:FORGOTTEN_BEAST_436:GUT -$CREATURE:FORGOTTEN_BEAST_436:STOMACH -$CREATURE:FORGOTTEN_BEAST_436:GIZZARD -%CREATURE:FORGOTTEN_BEAST_436:PANCREAS -#CREATURE:FORGOTTEN_BEAST_436:SPLEEN -#CREATURE:FORGOTTEN_BEAST_436:KIDNEY -#CREATURE:FORGOTTEN_BEAST_437:MUSCLE - CREATURE:FORGOTTEN_BEAST_437:EYE -"CREATURE:FORGOTTEN_BEAST_437:BRAIN -!CREATURE:FORGOTTEN_BEAST_437:LUNG -"CREATURE:FORGOTTEN_BEAST_437:HEART -"CREATURE:FORGOTTEN_BEAST_437:LIVER - CREATURE:FORGOTTEN_BEAST_437:GUT -$CREATURE:FORGOTTEN_BEAST_437:STOMACH -$CREATURE:FORGOTTEN_BEAST_437:GIZZARD -%CREATURE:FORGOTTEN_BEAST_437:PANCREAS -#CREATURE:FORGOTTEN_BEAST_437:SPLEEN -#CREATURE:FORGOTTEN_BEAST_437:KIDNEY -#CREATURE:FORGOTTEN_BEAST_438:MUSCLE - CREATURE:FORGOTTEN_BEAST_438:EYE -"CREATURE:FORGOTTEN_BEAST_438:BRAIN -!CREATURE:FORGOTTEN_BEAST_438:LUNG -"CREATURE:FORGOTTEN_BEAST_438:HEART -"CREATURE:FORGOTTEN_BEAST_438:LIVER - CREATURE:FORGOTTEN_BEAST_438:GUT -$CREATURE:FORGOTTEN_BEAST_438:STOMACH -$CREATURE:FORGOTTEN_BEAST_438:GIZZARD -%CREATURE:FORGOTTEN_BEAST_438:PANCREAS -#CREATURE:FORGOTTEN_BEAST_438:SPLEEN -#CREATURE:FORGOTTEN_BEAST_438:KIDNEY -#CREATURE:FORGOTTEN_BEAST_440:MUSCLE - CREATURE:FORGOTTEN_BEAST_440:EYE -"CREATURE:FORGOTTEN_BEAST_440:BRAIN -!CREATURE:FORGOTTEN_BEAST_440:LUNG -"CREATURE:FORGOTTEN_BEAST_440:HEART -"CREATURE:FORGOTTEN_BEAST_440:LIVER - CREATURE:FORGOTTEN_BEAST_440:GUT -$CREATURE:FORGOTTEN_BEAST_440:STOMACH -$CREATURE:FORGOTTEN_BEAST_440:GIZZARD -%CREATURE:FORGOTTEN_BEAST_440:PANCREAS -#CREATURE:FORGOTTEN_BEAST_440:SPLEEN -#CREATURE:FORGOTTEN_BEAST_440:KIDNEY -#CREATURE:FORGOTTEN_BEAST_441:MUSCLE - CREATURE:FORGOTTEN_BEAST_441:EYE -"CREATURE:FORGOTTEN_BEAST_441:BRAIN -!CREATURE:FORGOTTEN_BEAST_441:LUNG -"CREATURE:FORGOTTEN_BEAST_441:HEART -"CREATURE:FORGOTTEN_BEAST_441:LIVER - CREATURE:FORGOTTEN_BEAST_441:GUT -$CREATURE:FORGOTTEN_BEAST_441:STOMACH -$CREATURE:FORGOTTEN_BEAST_441:GIZZARD -%CREATURE:FORGOTTEN_BEAST_441:PANCREAS -#CREATURE:FORGOTTEN_BEAST_441:SPLEEN -#CREATURE:FORGOTTEN_BEAST_441:KIDNEY -#CREATURE:FORGOTTEN_BEAST_442:MUSCLE - CREATURE:FORGOTTEN_BEAST_442:EYE -"CREATURE:FORGOTTEN_BEAST_442:BRAIN -!CREATURE:FORGOTTEN_BEAST_442:LUNG -"CREATURE:FORGOTTEN_BEAST_442:HEART -"CREATURE:FORGOTTEN_BEAST_442:LIVER - CREATURE:FORGOTTEN_BEAST_442:GUT -$CREATURE:FORGOTTEN_BEAST_442:STOMACH -$CREATURE:FORGOTTEN_BEAST_442:GIZZARD -%CREATURE:FORGOTTEN_BEAST_442:PANCREAS -#CREATURE:FORGOTTEN_BEAST_442:SPLEEN -#CREATURE:FORGOTTEN_BEAST_442:KIDNEY -#CREATURE:FORGOTTEN_BEAST_444:MUSCLE - CREATURE:FORGOTTEN_BEAST_444:EYE -"CREATURE:FORGOTTEN_BEAST_444:BRAIN -!CREATURE:FORGOTTEN_BEAST_444:LUNG -"CREATURE:FORGOTTEN_BEAST_444:HEART -"CREATURE:FORGOTTEN_BEAST_444:LIVER - CREATURE:FORGOTTEN_BEAST_444:GUT -$CREATURE:FORGOTTEN_BEAST_444:STOMACH -$CREATURE:FORGOTTEN_BEAST_444:GIZZARD -%CREATURE:FORGOTTEN_BEAST_444:PANCREAS -#CREATURE:FORGOTTEN_BEAST_444:SPLEEN -#CREATURE:FORGOTTEN_BEAST_444:KIDNEY -#CREATURE:FORGOTTEN_BEAST_446:MUSCLE - CREATURE:FORGOTTEN_BEAST_446:EYE -"CREATURE:FORGOTTEN_BEAST_446:BRAIN -!CREATURE:FORGOTTEN_BEAST_446:LUNG -"CREATURE:FORGOTTEN_BEAST_446:HEART -"CREATURE:FORGOTTEN_BEAST_446:LIVER - CREATURE:FORGOTTEN_BEAST_446:GUT -$CREATURE:FORGOTTEN_BEAST_446:STOMACH -$CREATURE:FORGOTTEN_BEAST_446:GIZZARD -%CREATURE:FORGOTTEN_BEAST_446:PANCREAS -#CREATURE:FORGOTTEN_BEAST_446:SPLEEN -#CREATURE:FORGOTTEN_BEAST_446:KIDNEY -#CREATURE:FORGOTTEN_BEAST_447:MUSCLE - CREATURE:FORGOTTEN_BEAST_447:EYE -"CREATURE:FORGOTTEN_BEAST_447:BRAIN -!CREATURE:FORGOTTEN_BEAST_447:LUNG -"CREATURE:FORGOTTEN_BEAST_447:HEART -"CREATURE:FORGOTTEN_BEAST_447:LIVER - CREATURE:FORGOTTEN_BEAST_447:GUT -$CREATURE:FORGOTTEN_BEAST_447:STOMACH -$CREATURE:FORGOTTEN_BEAST_447:GIZZARD -%CREATURE:FORGOTTEN_BEAST_447:PANCREAS -#CREATURE:FORGOTTEN_BEAST_447:SPLEEN -#CREATURE:FORGOTTEN_BEAST_447:KIDNEY -#CREATURE:FORGOTTEN_BEAST_448:MUSCLE - CREATURE:FORGOTTEN_BEAST_448:EYE -"CREATURE:FORGOTTEN_BEAST_448:BRAIN -!CREATURE:FORGOTTEN_BEAST_448:LUNG -"CREATURE:FORGOTTEN_BEAST_448:HEART -"CREATURE:FORGOTTEN_BEAST_448:LIVER - CREATURE:FORGOTTEN_BEAST_448:GUT -$CREATURE:FORGOTTEN_BEAST_448:STOMACH -$CREATURE:FORGOTTEN_BEAST_448:GIZZARD -%CREATURE:FORGOTTEN_BEAST_448:PANCREAS -#CREATURE:FORGOTTEN_BEAST_448:SPLEEN -#CREATURE:FORGOTTEN_BEAST_448:KIDNEY -#CREATURE:FORGOTTEN_BEAST_449:MUSCLE - CREATURE:FORGOTTEN_BEAST_449:EYE -"CREATURE:FORGOTTEN_BEAST_449:BRAIN -!CREATURE:FORGOTTEN_BEAST_449:LUNG -"CREATURE:FORGOTTEN_BEAST_449:HEART -"CREATURE:FORGOTTEN_BEAST_449:LIVER - CREATURE:FORGOTTEN_BEAST_449:GUT -$CREATURE:FORGOTTEN_BEAST_449:STOMACH -$CREATURE:FORGOTTEN_BEAST_449:GIZZARD -%CREATURE:FORGOTTEN_BEAST_449:PANCREAS -#CREATURE:FORGOTTEN_BEAST_449:SPLEEN -#CREATURE:FORGOTTEN_BEAST_449:KIDNEY -#CREATURE:FORGOTTEN_BEAST_450:MUSCLE - CREATURE:FORGOTTEN_BEAST_450:EYE -"CREATURE:FORGOTTEN_BEAST_450:BRAIN -!CREATURE:FORGOTTEN_BEAST_450:LUNG -"CREATURE:FORGOTTEN_BEAST_450:HEART -"CREATURE:FORGOTTEN_BEAST_450:LIVER - CREATURE:FORGOTTEN_BEAST_450:GUT -$CREATURE:FORGOTTEN_BEAST_450:STOMACH -$CREATURE:FORGOTTEN_BEAST_450:GIZZARD -%CREATURE:FORGOTTEN_BEAST_450:PANCREAS -#CREATURE:FORGOTTEN_BEAST_450:SPLEEN -#CREATURE:FORGOTTEN_BEAST_450:KIDNEY -#CREATURE:FORGOTTEN_BEAST_451:MUSCLE - CREATURE:FORGOTTEN_BEAST_451:EYE -"CREATURE:FORGOTTEN_BEAST_451:BRAIN -!CREATURE:FORGOTTEN_BEAST_451:LUNG -"CREATURE:FORGOTTEN_BEAST_451:HEART -"CREATURE:FORGOTTEN_BEAST_451:LIVER - CREATURE:FORGOTTEN_BEAST_451:GUT -$CREATURE:FORGOTTEN_BEAST_451:STOMACH -$CREATURE:FORGOTTEN_BEAST_451:GIZZARD -%CREATURE:FORGOTTEN_BEAST_451:PANCREAS -#CREATURE:FORGOTTEN_BEAST_451:SPLEEN -#CREATURE:FORGOTTEN_BEAST_451:KIDNEY -#CREATURE:FORGOTTEN_BEAST_453:MUSCLE - CREATURE:FORGOTTEN_BEAST_453:EYE -"CREATURE:FORGOTTEN_BEAST_453:BRAIN -!CREATURE:FORGOTTEN_BEAST_453:LUNG -"CREATURE:FORGOTTEN_BEAST_453:HEART -"CREATURE:FORGOTTEN_BEAST_453:LIVER - CREATURE:FORGOTTEN_BEAST_453:GUT -$CREATURE:FORGOTTEN_BEAST_453:STOMACH -$CREATURE:FORGOTTEN_BEAST_453:GIZZARD -%CREATURE:FORGOTTEN_BEAST_453:PANCREAS -#CREATURE:FORGOTTEN_BEAST_453:SPLEEN -#CREATURE:FORGOTTEN_BEAST_453:KIDNEY -#CREATURE:FORGOTTEN_BEAST_454:MUSCLE - CREATURE:FORGOTTEN_BEAST_454:EYE -"CREATURE:FORGOTTEN_BEAST_454:BRAIN -!CREATURE:FORGOTTEN_BEAST_454:LUNG -"CREATURE:FORGOTTEN_BEAST_454:HEART -"CREATURE:FORGOTTEN_BEAST_454:LIVER - CREATURE:FORGOTTEN_BEAST_454:GUT -$CREATURE:FORGOTTEN_BEAST_454:STOMACH -$CREATURE:FORGOTTEN_BEAST_454:GIZZARD -%CREATURE:FORGOTTEN_BEAST_454:PANCREAS -#CREATURE:FORGOTTEN_BEAST_454:SPLEEN -#CREATURE:FORGOTTEN_BEAST_454:KIDNEY -#CREATURE:FORGOTTEN_BEAST_455:MUSCLE - CREATURE:FORGOTTEN_BEAST_455:EYE -"CREATURE:FORGOTTEN_BEAST_455:BRAIN -!CREATURE:FORGOTTEN_BEAST_455:LUNG -"CREATURE:FORGOTTEN_BEAST_455:HEART -"CREATURE:FORGOTTEN_BEAST_455:LIVER - CREATURE:FORGOTTEN_BEAST_455:GUT -$CREATURE:FORGOTTEN_BEAST_455:STOMACH -$CREATURE:FORGOTTEN_BEAST_455:GIZZARD -%CREATURE:FORGOTTEN_BEAST_455:PANCREAS -#CREATURE:FORGOTTEN_BEAST_455:SPLEEN -#CREATURE:FORGOTTEN_BEAST_455:KIDNEY -#CREATURE:FORGOTTEN_BEAST_457:MUSCLE - CREATURE:FORGOTTEN_BEAST_457:EYE -"CREATURE:FORGOTTEN_BEAST_457:BRAIN -!CREATURE:FORGOTTEN_BEAST_457:LUNG -"CREATURE:FORGOTTEN_BEAST_457:HEART -"CREATURE:FORGOTTEN_BEAST_457:LIVER - CREATURE:FORGOTTEN_BEAST_457:GUT -$CREATURE:FORGOTTEN_BEAST_457:STOMACH -$CREATURE:FORGOTTEN_BEAST_457:GIZZARD -%CREATURE:FORGOTTEN_BEAST_457:PANCREAS -#CREATURE:FORGOTTEN_BEAST_457:SPLEEN -#CREATURE:FORGOTTEN_BEAST_457:KIDNEY -#CREATURE:FORGOTTEN_BEAST_459:MUSCLE - CREATURE:FORGOTTEN_BEAST_459:EYE -"CREATURE:FORGOTTEN_BEAST_459:BRAIN -!CREATURE:FORGOTTEN_BEAST_459:LUNG -"CREATURE:FORGOTTEN_BEAST_459:HEART -"CREATURE:FORGOTTEN_BEAST_459:LIVER - CREATURE:FORGOTTEN_BEAST_459:GUT -$CREATURE:FORGOTTEN_BEAST_459:STOMACH -$CREATURE:FORGOTTEN_BEAST_459:GIZZARD -%CREATURE:FORGOTTEN_BEAST_459:PANCREAS -#CREATURE:FORGOTTEN_BEAST_459:SPLEEN -#CREATURE:FORGOTTEN_BEAST_459:KIDNEY -#CREATURE:FORGOTTEN_BEAST_461:MUSCLE - CREATURE:FORGOTTEN_BEAST_461:EYE -"CREATURE:FORGOTTEN_BEAST_461:BRAIN -!CREATURE:FORGOTTEN_BEAST_461:LUNG -"CREATURE:FORGOTTEN_BEAST_461:HEART -"CREATURE:FORGOTTEN_BEAST_461:LIVER - CREATURE:FORGOTTEN_BEAST_461:GUT -$CREATURE:FORGOTTEN_BEAST_461:STOMACH -$CREATURE:FORGOTTEN_BEAST_461:GIZZARD -%CREATURE:FORGOTTEN_BEAST_461:PANCREAS -#CREATURE:FORGOTTEN_BEAST_461:SPLEEN -#CREATURE:FORGOTTEN_BEAST_461:KIDNEY -#CREATURE:FORGOTTEN_BEAST_462:MUSCLE - CREATURE:FORGOTTEN_BEAST_462:EYE -"CREATURE:FORGOTTEN_BEAST_462:BRAIN -!CREATURE:FORGOTTEN_BEAST_462:LUNG -"CREATURE:FORGOTTEN_BEAST_462:HEART -"CREATURE:FORGOTTEN_BEAST_462:LIVER - CREATURE:FORGOTTEN_BEAST_462:GUT -$CREATURE:FORGOTTEN_BEAST_462:STOMACH -$CREATURE:FORGOTTEN_BEAST_462:GIZZARD -%CREATURE:FORGOTTEN_BEAST_462:PANCREAS -#CREATURE:FORGOTTEN_BEAST_462:SPLEEN -#CREATURE:FORGOTTEN_BEAST_462:KIDNEY -#CREATURE:FORGOTTEN_BEAST_463:MUSCLE - CREATURE:FORGOTTEN_BEAST_463:EYE -"CREATURE:FORGOTTEN_BEAST_463:BRAIN -!CREATURE:FORGOTTEN_BEAST_463:LUNG -"CREATURE:FORGOTTEN_BEAST_463:HEART -"CREATURE:FORGOTTEN_BEAST_463:LIVER - CREATURE:FORGOTTEN_BEAST_463:GUT -$CREATURE:FORGOTTEN_BEAST_463:STOMACH -$CREATURE:FORGOTTEN_BEAST_463:GIZZARD -%CREATURE:FORGOTTEN_BEAST_463:PANCREAS -#CREATURE:FORGOTTEN_BEAST_463:SPLEEN -#CREATURE:FORGOTTEN_BEAST_463:KIDNEY -#CREATURE:FORGOTTEN_BEAST_465:MUSCLE - CREATURE:FORGOTTEN_BEAST_465:EYE -"CREATURE:FORGOTTEN_BEAST_465:BRAIN -!CREATURE:FORGOTTEN_BEAST_465:LUNG -"CREATURE:FORGOTTEN_BEAST_465:HEART -"CREATURE:FORGOTTEN_BEAST_465:LIVER - CREATURE:FORGOTTEN_BEAST_465:GUT -$CREATURE:FORGOTTEN_BEAST_465:STOMACH -$CREATURE:FORGOTTEN_BEAST_465:GIZZARD -%CREATURE:FORGOTTEN_BEAST_465:PANCREAS -#CREATURE:FORGOTTEN_BEAST_465:SPLEEN -#CREATURE:FORGOTTEN_BEAST_465:KIDNEY -#CREATURE:FORGOTTEN_BEAST_466:MUSCLE - CREATURE:FORGOTTEN_BEAST_466:EYE -"CREATURE:FORGOTTEN_BEAST_466:BRAIN -!CREATURE:FORGOTTEN_BEAST_466:LUNG -"CREATURE:FORGOTTEN_BEAST_466:HEART -"CREATURE:FORGOTTEN_BEAST_466:LIVER - CREATURE:FORGOTTEN_BEAST_466:GUT -$CREATURE:FORGOTTEN_BEAST_466:STOMACH -$CREATURE:FORGOTTEN_BEAST_466:GIZZARD -%CREATURE:FORGOTTEN_BEAST_466:PANCREAS -#CREATURE:FORGOTTEN_BEAST_466:SPLEEN -#CREATURE:FORGOTTEN_BEAST_466:KIDNEY -#CREATURE:FORGOTTEN_BEAST_468:MUSCLE - CREATURE:FORGOTTEN_BEAST_468:EYE -"CREATURE:FORGOTTEN_BEAST_468:BRAIN -!CREATURE:FORGOTTEN_BEAST_468:LUNG -"CREATURE:FORGOTTEN_BEAST_468:HEART -"CREATURE:FORGOTTEN_BEAST_468:LIVER - CREATURE:FORGOTTEN_BEAST_468:GUT -$CREATURE:FORGOTTEN_BEAST_468:STOMACH -$CREATURE:FORGOTTEN_BEAST_468:GIZZARD -%CREATURE:FORGOTTEN_BEAST_468:PANCREAS -#CREATURE:FORGOTTEN_BEAST_468:SPLEEN -#CREATURE:FORGOTTEN_BEAST_468:KIDNEY -#CREATURE:FORGOTTEN_BEAST_469:MUSCLE - CREATURE:FORGOTTEN_BEAST_469:EYE -"CREATURE:FORGOTTEN_BEAST_469:BRAIN -!CREATURE:FORGOTTEN_BEAST_469:LUNG -"CREATURE:FORGOTTEN_BEAST_469:HEART -"CREATURE:FORGOTTEN_BEAST_469:LIVER - CREATURE:FORGOTTEN_BEAST_469:GUT -$CREATURE:FORGOTTEN_BEAST_469:STOMACH -$CREATURE:FORGOTTEN_BEAST_469:GIZZARD -%CREATURE:FORGOTTEN_BEAST_469:PANCREAS -#CREATURE:FORGOTTEN_BEAST_469:SPLEEN -#CREATURE:FORGOTTEN_BEAST_469:KIDNEY -#CREATURE:FORGOTTEN_BEAST_470:MUSCLE - CREATURE:FORGOTTEN_BEAST_470:EYE -"CREATURE:FORGOTTEN_BEAST_470:BRAIN -!CREATURE:FORGOTTEN_BEAST_470:LUNG -"CREATURE:FORGOTTEN_BEAST_470:HEART -"CREATURE:FORGOTTEN_BEAST_470:LIVER - CREATURE:FORGOTTEN_BEAST_470:GUT -$CREATURE:FORGOTTEN_BEAST_470:STOMACH -$CREATURE:FORGOTTEN_BEAST_470:GIZZARD -%CREATURE:FORGOTTEN_BEAST_470:PANCREAS -#CREATURE:FORGOTTEN_BEAST_470:SPLEEN -#CREATURE:FORGOTTEN_BEAST_470:KIDNEY -#CREATURE:FORGOTTEN_BEAST_471:MUSCLE - CREATURE:FORGOTTEN_BEAST_471:EYE -"CREATURE:FORGOTTEN_BEAST_471:BRAIN -!CREATURE:FORGOTTEN_BEAST_471:LUNG -"CREATURE:FORGOTTEN_BEAST_471:HEART -"CREATURE:FORGOTTEN_BEAST_471:LIVER - CREATURE:FORGOTTEN_BEAST_471:GUT -$CREATURE:FORGOTTEN_BEAST_471:STOMACH -$CREATURE:FORGOTTEN_BEAST_471:GIZZARD -%CREATURE:FORGOTTEN_BEAST_471:PANCREAS -#CREATURE:FORGOTTEN_BEAST_471:SPLEEN -#CREATURE:FORGOTTEN_BEAST_471:KIDNEY -#CREATURE:FORGOTTEN_BEAST_472:MUSCLE - CREATURE:FORGOTTEN_BEAST_472:EYE -"CREATURE:FORGOTTEN_BEAST_472:BRAIN -!CREATURE:FORGOTTEN_BEAST_472:LUNG -"CREATURE:FORGOTTEN_BEAST_472:HEART -"CREATURE:FORGOTTEN_BEAST_472:LIVER - CREATURE:FORGOTTEN_BEAST_472:GUT -$CREATURE:FORGOTTEN_BEAST_472:STOMACH -$CREATURE:FORGOTTEN_BEAST_472:GIZZARD -%CREATURE:FORGOTTEN_BEAST_472:PANCREAS -#CREATURE:FORGOTTEN_BEAST_472:SPLEEN -#CREATURE:FORGOTTEN_BEAST_472:KIDNEY -#CREATURE:FORGOTTEN_BEAST_474:MUSCLE - CREATURE:FORGOTTEN_BEAST_474:EYE -"CREATURE:FORGOTTEN_BEAST_474:BRAIN -!CREATURE:FORGOTTEN_BEAST_474:LUNG -"CREATURE:FORGOTTEN_BEAST_474:HEART -"CREATURE:FORGOTTEN_BEAST_474:LIVER - CREATURE:FORGOTTEN_BEAST_474:GUT -$CREATURE:FORGOTTEN_BEAST_474:STOMACH -$CREATURE:FORGOTTEN_BEAST_474:GIZZARD -%CREATURE:FORGOTTEN_BEAST_474:PANCREAS -#CREATURE:FORGOTTEN_BEAST_474:SPLEEN -#CREATURE:FORGOTTEN_BEAST_474:KIDNEY -#CREATURE:FORGOTTEN_BEAST_475:MUSCLE - CREATURE:FORGOTTEN_BEAST_475:EYE -"CREATURE:FORGOTTEN_BEAST_475:BRAIN -!CREATURE:FORGOTTEN_BEAST_475:LUNG -"CREATURE:FORGOTTEN_BEAST_475:HEART -"CREATURE:FORGOTTEN_BEAST_475:LIVER - CREATURE:FORGOTTEN_BEAST_475:GUT -$CREATURE:FORGOTTEN_BEAST_475:STOMACH -$CREATURE:FORGOTTEN_BEAST_475:GIZZARD -%CREATURE:FORGOTTEN_BEAST_475:PANCREAS -#CREATURE:FORGOTTEN_BEAST_475:SPLEEN -#CREATURE:FORGOTTEN_BEAST_475:KIDNEY -#CREATURE:FORGOTTEN_BEAST_476:MUSCLE - CREATURE:FORGOTTEN_BEAST_476:EYE -"CREATURE:FORGOTTEN_BEAST_476:BRAIN -!CREATURE:FORGOTTEN_BEAST_476:LUNG -"CREATURE:FORGOTTEN_BEAST_476:HEART -"CREATURE:FORGOTTEN_BEAST_476:LIVER - CREATURE:FORGOTTEN_BEAST_476:GUT -$CREATURE:FORGOTTEN_BEAST_476:STOMACH -$CREATURE:FORGOTTEN_BEAST_476:GIZZARD -%CREATURE:FORGOTTEN_BEAST_476:PANCREAS -#CREATURE:FORGOTTEN_BEAST_476:SPLEEN -#CREATURE:FORGOTTEN_BEAST_476:KIDNEY -#CREATURE:FORGOTTEN_BEAST_478:MUSCLE - CREATURE:FORGOTTEN_BEAST_478:EYE -"CREATURE:FORGOTTEN_BEAST_478:BRAIN -!CREATURE:FORGOTTEN_BEAST_478:LUNG -"CREATURE:FORGOTTEN_BEAST_478:HEART -"CREATURE:FORGOTTEN_BEAST_478:LIVER - CREATURE:FORGOTTEN_BEAST_478:GUT -$CREATURE:FORGOTTEN_BEAST_478:STOMACH -$CREATURE:FORGOTTEN_BEAST_478:GIZZARD -%CREATURE:FORGOTTEN_BEAST_478:PANCREAS -#CREATURE:FORGOTTEN_BEAST_478:SPLEEN -#CREATURE:FORGOTTEN_BEAST_478:KIDNEY -#CREATURE:FORGOTTEN_BEAST_479:MUSCLE - CREATURE:FORGOTTEN_BEAST_479:EYE -"CREATURE:FORGOTTEN_BEAST_479:BRAIN -!CREATURE:FORGOTTEN_BEAST_479:LUNG -"CREATURE:FORGOTTEN_BEAST_479:HEART -"CREATURE:FORGOTTEN_BEAST_479:LIVER - CREATURE:FORGOTTEN_BEAST_479:GUT -$CREATURE:FORGOTTEN_BEAST_479:STOMACH -$CREATURE:FORGOTTEN_BEAST_479:GIZZARD -%CREATURE:FORGOTTEN_BEAST_479:PANCREAS -#CREATURE:FORGOTTEN_BEAST_479:SPLEEN -#CREATURE:FORGOTTEN_BEAST_479:KIDNEY -#CREATURE:FORGOTTEN_BEAST_480:MUSCLE - CREATURE:FORGOTTEN_BEAST_480:EYE -"CREATURE:FORGOTTEN_BEAST_480:BRAIN -!CREATURE:FORGOTTEN_BEAST_480:LUNG -"CREATURE:FORGOTTEN_BEAST_480:HEART -"CREATURE:FORGOTTEN_BEAST_480:LIVER - CREATURE:FORGOTTEN_BEAST_480:GUT -$CREATURE:FORGOTTEN_BEAST_480:STOMACH -$CREATURE:FORGOTTEN_BEAST_480:GIZZARD -%CREATURE:FORGOTTEN_BEAST_480:PANCREAS -#CREATURE:FORGOTTEN_BEAST_480:SPLEEN -#CREATURE:FORGOTTEN_BEAST_480:KIDNEY -#CREATURE:FORGOTTEN_BEAST_481:MUSCLE - CREATURE:FORGOTTEN_BEAST_481:EYE -"CREATURE:FORGOTTEN_BEAST_481:BRAIN -!CREATURE:FORGOTTEN_BEAST_481:LUNG -"CREATURE:FORGOTTEN_BEAST_481:HEART -"CREATURE:FORGOTTEN_BEAST_481:LIVER - CREATURE:FORGOTTEN_BEAST_481:GUT -$CREATURE:FORGOTTEN_BEAST_481:STOMACH -$CREATURE:FORGOTTEN_BEAST_481:GIZZARD -%CREATURE:FORGOTTEN_BEAST_481:PANCREAS -#CREATURE:FORGOTTEN_BEAST_481:SPLEEN -#CREATURE:FORGOTTEN_BEAST_481:KIDNEY -#CREATURE:FORGOTTEN_BEAST_483:MUSCLE - CREATURE:FORGOTTEN_BEAST_483:EYE -"CREATURE:FORGOTTEN_BEAST_483:BRAIN -!CREATURE:FORGOTTEN_BEAST_483:LUNG -"CREATURE:FORGOTTEN_BEAST_483:HEART -"CREATURE:FORGOTTEN_BEAST_483:LIVER - CREATURE:FORGOTTEN_BEAST_483:GUT -$CREATURE:FORGOTTEN_BEAST_483:STOMACH -$CREATURE:FORGOTTEN_BEAST_483:GIZZARD -%CREATURE:FORGOTTEN_BEAST_483:PANCREAS -#CREATURE:FORGOTTEN_BEAST_483:SPLEEN -#CREATURE:FORGOTTEN_BEAST_483:KIDNEY -#CREATURE:FORGOTTEN_BEAST_486:MUSCLE - CREATURE:FORGOTTEN_BEAST_486:EYE -"CREATURE:FORGOTTEN_BEAST_486:BRAIN -!CREATURE:FORGOTTEN_BEAST_486:LUNG -"CREATURE:FORGOTTEN_BEAST_486:HEART -"CREATURE:FORGOTTEN_BEAST_486:LIVER - CREATURE:FORGOTTEN_BEAST_486:GUT -$CREATURE:FORGOTTEN_BEAST_486:STOMACH -$CREATURE:FORGOTTEN_BEAST_486:GIZZARD -%CREATURE:FORGOTTEN_BEAST_486:PANCREAS -#CREATURE:FORGOTTEN_BEAST_486:SPLEEN -#CREATURE:FORGOTTEN_BEAST_486:KIDNEY -#CREATURE:FORGOTTEN_BEAST_487:MUSCLE - CREATURE:FORGOTTEN_BEAST_487:EYE -"CREATURE:FORGOTTEN_BEAST_487:BRAIN -!CREATURE:FORGOTTEN_BEAST_487:LUNG -"CREATURE:FORGOTTEN_BEAST_487:HEART -"CREATURE:FORGOTTEN_BEAST_487:LIVER - CREATURE:FORGOTTEN_BEAST_487:GUT -$CREATURE:FORGOTTEN_BEAST_487:STOMACH -$CREATURE:FORGOTTEN_BEAST_487:GIZZARD -%CREATURE:FORGOTTEN_BEAST_487:PANCREAS -#CREATURE:FORGOTTEN_BEAST_487:SPLEEN -#CREATURE:FORGOTTEN_BEAST_487:KIDNEY -#CREATURE:FORGOTTEN_BEAST_489:MUSCLE - CREATURE:FORGOTTEN_BEAST_489:EYE -"CREATURE:FORGOTTEN_BEAST_489:BRAIN -!CREATURE:FORGOTTEN_BEAST_489:LUNG -"CREATURE:FORGOTTEN_BEAST_489:HEART -"CREATURE:FORGOTTEN_BEAST_489:LIVER - CREATURE:FORGOTTEN_BEAST_489:GUT -$CREATURE:FORGOTTEN_BEAST_489:STOMACH -$CREATURE:FORGOTTEN_BEAST_489:GIZZARD -%CREATURE:FORGOTTEN_BEAST_489:PANCREAS -#CREATURE:FORGOTTEN_BEAST_489:SPLEEN -#CREATURE:FORGOTTEN_BEAST_489:KIDNEY -#CREATURE:FORGOTTEN_BEAST_492:MUSCLE - CREATURE:FORGOTTEN_BEAST_492:EYE -"CREATURE:FORGOTTEN_BEAST_492:BRAIN -!CREATURE:FORGOTTEN_BEAST_492:LUNG -"CREATURE:FORGOTTEN_BEAST_492:HEART -"CREATURE:FORGOTTEN_BEAST_492:LIVER - CREATURE:FORGOTTEN_BEAST_492:GUT -$CREATURE:FORGOTTEN_BEAST_492:STOMACH -$CREATURE:FORGOTTEN_BEAST_492:GIZZARD -%CREATURE:FORGOTTEN_BEAST_492:PANCREAS -#CREATURE:FORGOTTEN_BEAST_492:SPLEEN -#CREATURE:FORGOTTEN_BEAST_492:KIDNEY -#CREATURE:FORGOTTEN_BEAST_494:MUSCLE - CREATURE:FORGOTTEN_BEAST_494:EYE -"CREATURE:FORGOTTEN_BEAST_494:BRAIN -!CREATURE:FORGOTTEN_BEAST_494:LUNG -"CREATURE:FORGOTTEN_BEAST_494:HEART -"CREATURE:FORGOTTEN_BEAST_494:LIVER - CREATURE:FORGOTTEN_BEAST_494:GUT -$CREATURE:FORGOTTEN_BEAST_494:STOMACH -$CREATURE:FORGOTTEN_BEAST_494:GIZZARD -%CREATURE:FORGOTTEN_BEAST_494:PANCREAS -#CREATURE:FORGOTTEN_BEAST_494:SPLEEN -#CREATURE:FORGOTTEN_BEAST_494:KIDNEY -#CREATURE:FORGOTTEN_BEAST_495:MUSCLE - CREATURE:FORGOTTEN_BEAST_495:EYE -"CREATURE:FORGOTTEN_BEAST_495:BRAIN -!CREATURE:FORGOTTEN_BEAST_495:LUNG -"CREATURE:FORGOTTEN_BEAST_495:HEART -"CREATURE:FORGOTTEN_BEAST_495:LIVER - CREATURE:FORGOTTEN_BEAST_495:GUT -$CREATURE:FORGOTTEN_BEAST_495:STOMACH -$CREATURE:FORGOTTEN_BEAST_495:GIZZARD -%CREATURE:FORGOTTEN_BEAST_495:PANCREAS -#CREATURE:FORGOTTEN_BEAST_495:SPLEEN -#CREATURE:FORGOTTEN_BEAST_495:KIDNEY -#CREATURE:FORGOTTEN_BEAST_496:MUSCLE - CREATURE:FORGOTTEN_BEAST_496:EYE -"CREATURE:FORGOTTEN_BEAST_496:BRAIN -!CREATURE:FORGOTTEN_BEAST_496:LUNG -"CREATURE:FORGOTTEN_BEAST_496:HEART -"CREATURE:FORGOTTEN_BEAST_496:LIVER - CREATURE:FORGOTTEN_BEAST_496:GUT -$CREATURE:FORGOTTEN_BEAST_496:STOMACH -$CREATURE:FORGOTTEN_BEAST_496:GIZZARD -%CREATURE:FORGOTTEN_BEAST_496:PANCREAS -#CREATURE:FORGOTTEN_BEAST_496:SPLEEN -#CREATURE:FORGOTTEN_BEAST_496:KIDNEY -#CREATURE:FORGOTTEN_BEAST_497:MUSCLE - CREATURE:FORGOTTEN_BEAST_497:EYE -"CREATURE:FORGOTTEN_BEAST_497:BRAIN -!CREATURE:FORGOTTEN_BEAST_497:LUNG -"CREATURE:FORGOTTEN_BEAST_497:HEART -"CREATURE:FORGOTTEN_BEAST_497:LIVER - CREATURE:FORGOTTEN_BEAST_497:GUT -$CREATURE:FORGOTTEN_BEAST_497:STOMACH -$CREATURE:FORGOTTEN_BEAST_497:GIZZARD -%CREATURE:FORGOTTEN_BEAST_497:PANCREAS -#CREATURE:FORGOTTEN_BEAST_497:SPLEEN -#CREATURE:FORGOTTEN_BEAST_497:KIDNEY -#CREATURE:FORGOTTEN_BEAST_498:MUSCLE - CREATURE:FORGOTTEN_BEAST_498:EYE -"CREATURE:FORGOTTEN_BEAST_498:BRAIN -!CREATURE:FORGOTTEN_BEAST_498:LUNG -"CREATURE:FORGOTTEN_BEAST_498:HEART -"CREATURE:FORGOTTEN_BEAST_498:LIVER - CREATURE:FORGOTTEN_BEAST_498:GUT -$CREATURE:FORGOTTEN_BEAST_498:STOMACH -$CREATURE:FORGOTTEN_BEAST_498:GIZZARD -%CREATURE:FORGOTTEN_BEAST_498:PANCREAS -#CREATURE:FORGOTTEN_BEAST_498:SPLEEN -#CREATURE:FORGOTTEN_BEAST_498:KIDNEY -#CREATURE:FORGOTTEN_BEAST_499:MUSCLE - CREATURE:FORGOTTEN_BEAST_499:EYE -"CREATURE:FORGOTTEN_BEAST_499:BRAIN -!CREATURE:FORGOTTEN_BEAST_499:LUNG -"CREATURE:FORGOTTEN_BEAST_499:HEART -"CREATURE:FORGOTTEN_BEAST_499:LIVER - CREATURE:FORGOTTEN_BEAST_499:GUT -$CREATURE:FORGOTTEN_BEAST_499:STOMACH -$CREATURE:FORGOTTEN_BEAST_499:GIZZARD -%CREATURE:FORGOTTEN_BEAST_499:PANCREAS -#CREATURE:FORGOTTEN_BEAST_499:SPLEEN -#CREATURE:FORGOTTEN_BEAST_499:KIDNEY -#CREATURE:FORGOTTEN_BEAST_501:MUSCLE - CREATURE:FORGOTTEN_BEAST_501:EYE -"CREATURE:FORGOTTEN_BEAST_501:BRAIN -!CREATURE:FORGOTTEN_BEAST_501:LUNG -"CREATURE:FORGOTTEN_BEAST_501:HEART -"CREATURE:FORGOTTEN_BEAST_501:LIVER - CREATURE:FORGOTTEN_BEAST_501:GUT -$CREATURE:FORGOTTEN_BEAST_501:STOMACH -$CREATURE:FORGOTTEN_BEAST_501:GIZZARD -%CREATURE:FORGOTTEN_BEAST_501:PANCREAS -#CREATURE:FORGOTTEN_BEAST_501:SPLEEN -#CREATURE:FORGOTTEN_BEAST_501:KIDNEY -#CREATURE:FORGOTTEN_BEAST_503:MUSCLE - CREATURE:FORGOTTEN_BEAST_503:EYE -"CREATURE:FORGOTTEN_BEAST_503:BRAIN -!CREATURE:FORGOTTEN_BEAST_503:LUNG -"CREATURE:FORGOTTEN_BEAST_503:HEART -"CREATURE:FORGOTTEN_BEAST_503:LIVER - CREATURE:FORGOTTEN_BEAST_503:GUT -$CREATURE:FORGOTTEN_BEAST_503:STOMACH -$CREATURE:FORGOTTEN_BEAST_503:GIZZARD -%CREATURE:FORGOTTEN_BEAST_503:PANCREAS -#CREATURE:FORGOTTEN_BEAST_503:SPLEEN -#CREATURE:FORGOTTEN_BEAST_503:KIDNEY -#CREATURE:FORGOTTEN_BEAST_504:MUSCLE - CREATURE:FORGOTTEN_BEAST_504:EYE -"CREATURE:FORGOTTEN_BEAST_504:BRAIN -!CREATURE:FORGOTTEN_BEAST_504:LUNG -"CREATURE:FORGOTTEN_BEAST_504:HEART -"CREATURE:FORGOTTEN_BEAST_504:LIVER - CREATURE:FORGOTTEN_BEAST_504:GUT -$CREATURE:FORGOTTEN_BEAST_504:STOMACH -$CREATURE:FORGOTTEN_BEAST_504:GIZZARD -%CREATURE:FORGOTTEN_BEAST_504:PANCREAS -#CREATURE:FORGOTTEN_BEAST_504:SPLEEN -#CREATURE:FORGOTTEN_BEAST_504:KIDNEY -#CREATURE:FORGOTTEN_BEAST_505:MUSCLE - CREATURE:FORGOTTEN_BEAST_505:EYE -"CREATURE:FORGOTTEN_BEAST_505:BRAIN -!CREATURE:FORGOTTEN_BEAST_505:LUNG -"CREATURE:FORGOTTEN_BEAST_505:HEART -"CREATURE:FORGOTTEN_BEAST_505:LIVER - CREATURE:FORGOTTEN_BEAST_505:GUT -$CREATURE:FORGOTTEN_BEAST_505:STOMACH -$CREATURE:FORGOTTEN_BEAST_505:GIZZARD -%CREATURE:FORGOTTEN_BEAST_505:PANCREAS -#CREATURE:FORGOTTEN_BEAST_505:SPLEEN -#CREATURE:FORGOTTEN_BEAST_505:KIDNEY -#CREATURE:FORGOTTEN_BEAST_507:MUSCLE - CREATURE:FORGOTTEN_BEAST_507:EYE -"CREATURE:FORGOTTEN_BEAST_507:BRAIN -!CREATURE:FORGOTTEN_BEAST_507:LUNG -"CREATURE:FORGOTTEN_BEAST_507:HEART -"CREATURE:FORGOTTEN_BEAST_507:LIVER - CREATURE:FORGOTTEN_BEAST_507:GUT -$CREATURE:FORGOTTEN_BEAST_507:STOMACH -$CREATURE:FORGOTTEN_BEAST_507:GIZZARD -%CREATURE:FORGOTTEN_BEAST_507:PANCREAS -#CREATURE:FORGOTTEN_BEAST_507:SPLEEN -#CREATURE:FORGOTTEN_BEAST_507:KIDNEY -#CREATURE:FORGOTTEN_BEAST_508:MUSCLE - CREATURE:FORGOTTEN_BEAST_508:EYE -"CREATURE:FORGOTTEN_BEAST_508:BRAIN -!CREATURE:FORGOTTEN_BEAST_508:LUNG -"CREATURE:FORGOTTEN_BEAST_508:HEART -"CREATURE:FORGOTTEN_BEAST_508:LIVER - CREATURE:FORGOTTEN_BEAST_508:GUT -$CREATURE:FORGOTTEN_BEAST_508:STOMACH -$CREATURE:FORGOTTEN_BEAST_508:GIZZARD -%CREATURE:FORGOTTEN_BEAST_508:PANCREAS -#CREATURE:FORGOTTEN_BEAST_508:SPLEEN -#CREATURE:FORGOTTEN_BEAST_508:KIDNEY -#CREATURE:FORGOTTEN_BEAST_510:MUSCLE - CREATURE:FORGOTTEN_BEAST_510:EYE -"CREATURE:FORGOTTEN_BEAST_510:BRAIN -!CREATURE:FORGOTTEN_BEAST_510:LUNG -"CREATURE:FORGOTTEN_BEAST_510:HEART -"CREATURE:FORGOTTEN_BEAST_510:LIVER - CREATURE:FORGOTTEN_BEAST_510:GUT -$CREATURE:FORGOTTEN_BEAST_510:STOMACH -$CREATURE:FORGOTTEN_BEAST_510:GIZZARD -%CREATURE:FORGOTTEN_BEAST_510:PANCREAS -#CREATURE:FORGOTTEN_BEAST_510:SPLEEN -#CREATURE:FORGOTTEN_BEAST_510:KIDNEY -#CREATURE:FORGOTTEN_BEAST_512:MUSCLE - CREATURE:FORGOTTEN_BEAST_512:EYE -"CREATURE:FORGOTTEN_BEAST_512:BRAIN -!CREATURE:FORGOTTEN_BEAST_512:LUNG -"CREATURE:FORGOTTEN_BEAST_512:HEART -"CREATURE:FORGOTTEN_BEAST_512:LIVER - CREATURE:FORGOTTEN_BEAST_512:GUT -$CREATURE:FORGOTTEN_BEAST_512:STOMACH -$CREATURE:FORGOTTEN_BEAST_512:GIZZARD -%CREATURE:FORGOTTEN_BEAST_512:PANCREAS -#CREATURE:FORGOTTEN_BEAST_512:SPLEEN -#CREATURE:FORGOTTEN_BEAST_512:KIDNEY -#CREATURE:FORGOTTEN_BEAST_513:MUSCLE - CREATURE:FORGOTTEN_BEAST_513:EYE -"CREATURE:FORGOTTEN_BEAST_513:BRAIN -!CREATURE:FORGOTTEN_BEAST_513:LUNG -"CREATURE:FORGOTTEN_BEAST_513:HEART -"CREATURE:FORGOTTEN_BEAST_513:LIVER - CREATURE:FORGOTTEN_BEAST_513:GUT -$CREATURE:FORGOTTEN_BEAST_513:STOMACH -$CREATURE:FORGOTTEN_BEAST_513:GIZZARD -%CREATURE:FORGOTTEN_BEAST_513:PANCREAS -#CREATURE:FORGOTTEN_BEAST_513:SPLEEN -#CREATURE:FORGOTTEN_BEAST_513:KIDNEY -#CREATURE:FORGOTTEN_BEAST_514:MUSCLE - CREATURE:FORGOTTEN_BEAST_514:EYE -"CREATURE:FORGOTTEN_BEAST_514:BRAIN -!CREATURE:FORGOTTEN_BEAST_514:LUNG -"CREATURE:FORGOTTEN_BEAST_514:HEART -"CREATURE:FORGOTTEN_BEAST_514:LIVER - CREATURE:FORGOTTEN_BEAST_514:GUT -$CREATURE:FORGOTTEN_BEAST_514:STOMACH -$CREATURE:FORGOTTEN_BEAST_514:GIZZARD -%CREATURE:FORGOTTEN_BEAST_514:PANCREAS -#CREATURE:FORGOTTEN_BEAST_514:SPLEEN -#CREATURE:FORGOTTEN_BEAST_514:KIDNEY -#CREATURE:FORGOTTEN_BEAST_515:MUSCLE - CREATURE:FORGOTTEN_BEAST_515:EYE -"CREATURE:FORGOTTEN_BEAST_515:BRAIN -!CREATURE:FORGOTTEN_BEAST_515:LUNG -"CREATURE:FORGOTTEN_BEAST_515:HEART -"CREATURE:FORGOTTEN_BEAST_515:LIVER - CREATURE:FORGOTTEN_BEAST_515:GUT -$CREATURE:FORGOTTEN_BEAST_515:STOMACH -$CREATURE:FORGOTTEN_BEAST_515:GIZZARD -%CREATURE:FORGOTTEN_BEAST_515:PANCREAS -#CREATURE:FORGOTTEN_BEAST_515:SPLEEN -#CREATURE:FORGOTTEN_BEAST_515:KIDNEY -#CREATURE:FORGOTTEN_BEAST_516:MUSCLE - CREATURE:FORGOTTEN_BEAST_516:EYE -"CREATURE:FORGOTTEN_BEAST_516:BRAIN -!CREATURE:FORGOTTEN_BEAST_516:LUNG -"CREATURE:FORGOTTEN_BEAST_516:HEART -"CREATURE:FORGOTTEN_BEAST_516:LIVER - CREATURE:FORGOTTEN_BEAST_516:GUT -$CREATURE:FORGOTTEN_BEAST_516:STOMACH -$CREATURE:FORGOTTEN_BEAST_516:GIZZARD -%CREATURE:FORGOTTEN_BEAST_516:PANCREAS -#CREATURE:FORGOTTEN_BEAST_516:SPLEEN -#CREATURE:FORGOTTEN_BEAST_516:KIDNEY -#CREATURE:FORGOTTEN_BEAST_517:MUSCLE - CREATURE:FORGOTTEN_BEAST_517:EYE -"CREATURE:FORGOTTEN_BEAST_517:BRAIN -!CREATURE:FORGOTTEN_BEAST_517:LUNG -"CREATURE:FORGOTTEN_BEAST_517:HEART -"CREATURE:FORGOTTEN_BEAST_517:LIVER - CREATURE:FORGOTTEN_BEAST_517:GUT -$CREATURE:FORGOTTEN_BEAST_517:STOMACH -$CREATURE:FORGOTTEN_BEAST_517:GIZZARD -%CREATURE:FORGOTTEN_BEAST_517:PANCREAS -#CREATURE:FORGOTTEN_BEAST_517:SPLEEN -#CREATURE:FORGOTTEN_BEAST_517:KIDNEY -#CREATURE:FORGOTTEN_BEAST_518:MUSCLE - CREATURE:FORGOTTEN_BEAST_518:EYE -"CREATURE:FORGOTTEN_BEAST_518:BRAIN -!CREATURE:FORGOTTEN_BEAST_518:LUNG -"CREATURE:FORGOTTEN_BEAST_518:HEART -"CREATURE:FORGOTTEN_BEAST_518:LIVER - CREATURE:FORGOTTEN_BEAST_518:GUT -$CREATURE:FORGOTTEN_BEAST_518:STOMACH -$CREATURE:FORGOTTEN_BEAST_518:GIZZARD -%CREATURE:FORGOTTEN_BEAST_518:PANCREAS -#CREATURE:FORGOTTEN_BEAST_518:SPLEEN -#CREATURE:FORGOTTEN_BEAST_518:KIDNEY -#CREATURE:FORGOTTEN_BEAST_519:MUSCLE - CREATURE:FORGOTTEN_BEAST_519:EYE -"CREATURE:FORGOTTEN_BEAST_519:BRAIN -!CREATURE:FORGOTTEN_BEAST_519:LUNG -"CREATURE:FORGOTTEN_BEAST_519:HEART -"CREATURE:FORGOTTEN_BEAST_519:LIVER - CREATURE:FORGOTTEN_BEAST_519:GUT -$CREATURE:FORGOTTEN_BEAST_519:STOMACH -$CREATURE:FORGOTTEN_BEAST_519:GIZZARD -%CREATURE:FORGOTTEN_BEAST_519:PANCREAS -#CREATURE:FORGOTTEN_BEAST_519:SPLEEN -#CREATURE:FORGOTTEN_BEAST_519:KIDNEY -#CREATURE:FORGOTTEN_BEAST_520:MUSCLE - CREATURE:FORGOTTEN_BEAST_520:EYE -"CREATURE:FORGOTTEN_BEAST_520:BRAIN -!CREATURE:FORGOTTEN_BEAST_520:LUNG -"CREATURE:FORGOTTEN_BEAST_520:HEART -"CREATURE:FORGOTTEN_BEAST_520:LIVER - CREATURE:FORGOTTEN_BEAST_520:GUT -$CREATURE:FORGOTTEN_BEAST_520:STOMACH -$CREATURE:FORGOTTEN_BEAST_520:GIZZARD -%CREATURE:FORGOTTEN_BEAST_520:PANCREAS -#CREATURE:FORGOTTEN_BEAST_520:SPLEEN -#CREATURE:FORGOTTEN_BEAST_520:KIDNEY -#CREATURE:FORGOTTEN_BEAST_521:MUSCLE - CREATURE:FORGOTTEN_BEAST_521:EYE -"CREATURE:FORGOTTEN_BEAST_521:BRAIN -!CREATURE:FORGOTTEN_BEAST_521:LUNG -"CREATURE:FORGOTTEN_BEAST_521:HEART -"CREATURE:FORGOTTEN_BEAST_521:LIVER - CREATURE:FORGOTTEN_BEAST_521:GUT -$CREATURE:FORGOTTEN_BEAST_521:STOMACH -$CREATURE:FORGOTTEN_BEAST_521:GIZZARD -%CREATURE:FORGOTTEN_BEAST_521:PANCREAS -#CREATURE:FORGOTTEN_BEAST_521:SPLEEN -#CREATURE:FORGOTTEN_BEAST_521:KIDNEY -#CREATURE:FORGOTTEN_BEAST_522:MUSCLE - CREATURE:FORGOTTEN_BEAST_522:EYE -"CREATURE:FORGOTTEN_BEAST_522:BRAIN -!CREATURE:FORGOTTEN_BEAST_522:LUNG -"CREATURE:FORGOTTEN_BEAST_522:HEART -"CREATURE:FORGOTTEN_BEAST_522:LIVER - CREATURE:FORGOTTEN_BEAST_522:GUT -$CREATURE:FORGOTTEN_BEAST_522:STOMACH -$CREATURE:FORGOTTEN_BEAST_522:GIZZARD -%CREATURE:FORGOTTEN_BEAST_522:PANCREAS -#CREATURE:FORGOTTEN_BEAST_522:SPLEEN -#CREATURE:FORGOTTEN_BEAST_522:KIDNEY -#CREATURE:FORGOTTEN_BEAST_523:MUSCLE - CREATURE:FORGOTTEN_BEAST_523:EYE -"CREATURE:FORGOTTEN_BEAST_523:BRAIN -!CREATURE:FORGOTTEN_BEAST_523:LUNG -"CREATURE:FORGOTTEN_BEAST_523:HEART -"CREATURE:FORGOTTEN_BEAST_523:LIVER - CREATURE:FORGOTTEN_BEAST_523:GUT -$CREATURE:FORGOTTEN_BEAST_523:STOMACH -$CREATURE:FORGOTTEN_BEAST_523:GIZZARD -%CREATURE:FORGOTTEN_BEAST_523:PANCREAS -#CREATURE:FORGOTTEN_BEAST_523:SPLEEN -#CREATURE:FORGOTTEN_BEAST_523:KIDNEY -#CREATURE:FORGOTTEN_BEAST_525:MUSCLE - CREATURE:FORGOTTEN_BEAST_525:EYE -"CREATURE:FORGOTTEN_BEAST_525:BRAIN -!CREATURE:FORGOTTEN_BEAST_525:LUNG -"CREATURE:FORGOTTEN_BEAST_525:HEART -"CREATURE:FORGOTTEN_BEAST_525:LIVER - CREATURE:FORGOTTEN_BEAST_525:GUT -$CREATURE:FORGOTTEN_BEAST_525:STOMACH -$CREATURE:FORGOTTEN_BEAST_525:GIZZARD -%CREATURE:FORGOTTEN_BEAST_525:PANCREAS -#CREATURE:FORGOTTEN_BEAST_525:SPLEEN -#CREATURE:FORGOTTEN_BEAST_525:KIDNEY -#CREATURE:FORGOTTEN_BEAST_526:MUSCLE - CREATURE:FORGOTTEN_BEAST_526:EYE -"CREATURE:FORGOTTEN_BEAST_526:BRAIN -!CREATURE:FORGOTTEN_BEAST_526:LUNG -"CREATURE:FORGOTTEN_BEAST_526:HEART -"CREATURE:FORGOTTEN_BEAST_526:LIVER - CREATURE:FORGOTTEN_BEAST_526:GUT -$CREATURE:FORGOTTEN_BEAST_526:STOMACH -$CREATURE:FORGOTTEN_BEAST_526:GIZZARD -%CREATURE:FORGOTTEN_BEAST_526:PANCREAS -#CREATURE:FORGOTTEN_BEAST_526:SPLEEN -#CREATURE:FORGOTTEN_BEAST_526:KIDNEY -#CREATURE:FORGOTTEN_BEAST_527:MUSCLE - CREATURE:FORGOTTEN_BEAST_527:EYE -"CREATURE:FORGOTTEN_BEAST_527:BRAIN -!CREATURE:FORGOTTEN_BEAST_527:LUNG -"CREATURE:FORGOTTEN_BEAST_527:HEART -"CREATURE:FORGOTTEN_BEAST_527:LIVER - CREATURE:FORGOTTEN_BEAST_527:GUT -$CREATURE:FORGOTTEN_BEAST_527:STOMACH -$CREATURE:FORGOTTEN_BEAST_527:GIZZARD -%CREATURE:FORGOTTEN_BEAST_527:PANCREAS -#CREATURE:FORGOTTEN_BEAST_527:SPLEEN -#CREATURE:FORGOTTEN_BEAST_527:KIDNEY -#CREATURE:FORGOTTEN_BEAST_528:MUSCLE - CREATURE:FORGOTTEN_BEAST_528:EYE -"CREATURE:FORGOTTEN_BEAST_528:BRAIN -!CREATURE:FORGOTTEN_BEAST_528:LUNG -"CREATURE:FORGOTTEN_BEAST_528:HEART -"CREATURE:FORGOTTEN_BEAST_528:LIVER - CREATURE:FORGOTTEN_BEAST_528:GUT -$CREATURE:FORGOTTEN_BEAST_528:STOMACH -$CREATURE:FORGOTTEN_BEAST_528:GIZZARD -%CREATURE:FORGOTTEN_BEAST_528:PANCREAS -#CREATURE:FORGOTTEN_BEAST_528:SPLEEN -#CREATURE:FORGOTTEN_BEAST_528:KIDNEY -#CREATURE:FORGOTTEN_BEAST_529:MUSCLE - CREATURE:FORGOTTEN_BEAST_529:EYE -"CREATURE:FORGOTTEN_BEAST_529:BRAIN -!CREATURE:FORGOTTEN_BEAST_529:LUNG -"CREATURE:FORGOTTEN_BEAST_529:HEART -"CREATURE:FORGOTTEN_BEAST_529:LIVER - CREATURE:FORGOTTEN_BEAST_529:GUT -$CREATURE:FORGOTTEN_BEAST_529:STOMACH -$CREATURE:FORGOTTEN_BEAST_529:GIZZARD -%CREATURE:FORGOTTEN_BEAST_529:PANCREAS -#CREATURE:FORGOTTEN_BEAST_529:SPLEEN -#CREATURE:FORGOTTEN_BEAST_529:KIDNEY -#CREATURE:FORGOTTEN_BEAST_530:MUSCLE - CREATURE:FORGOTTEN_BEAST_530:EYE -"CREATURE:FORGOTTEN_BEAST_530:BRAIN -!CREATURE:FORGOTTEN_BEAST_530:LUNG -"CREATURE:FORGOTTEN_BEAST_530:HEART -"CREATURE:FORGOTTEN_BEAST_530:LIVER - CREATURE:FORGOTTEN_BEAST_530:GUT -$CREATURE:FORGOTTEN_BEAST_530:STOMACH -$CREATURE:FORGOTTEN_BEAST_530:GIZZARD -%CREATURE:FORGOTTEN_BEAST_530:PANCREAS -#CREATURE:FORGOTTEN_BEAST_530:SPLEEN -#CREATURE:FORGOTTEN_BEAST_530:KIDNEY -#CREATURE:FORGOTTEN_BEAST_531:MUSCLE - CREATURE:FORGOTTEN_BEAST_531:EYE -"CREATURE:FORGOTTEN_BEAST_531:BRAIN -!CREATURE:FORGOTTEN_BEAST_531:LUNG -"CREATURE:FORGOTTEN_BEAST_531:HEART -"CREATURE:FORGOTTEN_BEAST_531:LIVER - CREATURE:FORGOTTEN_BEAST_531:GUT -$CREATURE:FORGOTTEN_BEAST_531:STOMACH -$CREATURE:FORGOTTEN_BEAST_531:GIZZARD -%CREATURE:FORGOTTEN_BEAST_531:PANCREAS -#CREATURE:FORGOTTEN_BEAST_531:SPLEEN -#CREATURE:FORGOTTEN_BEAST_531:KIDNEY -#CREATURE:FORGOTTEN_BEAST_532:MUSCLE - CREATURE:FORGOTTEN_BEAST_532:EYE -"CREATURE:FORGOTTEN_BEAST_532:BRAIN -!CREATURE:FORGOTTEN_BEAST_532:LUNG -"CREATURE:FORGOTTEN_BEAST_532:HEART -"CREATURE:FORGOTTEN_BEAST_532:LIVER - CREATURE:FORGOTTEN_BEAST_532:GUT -$CREATURE:FORGOTTEN_BEAST_532:STOMACH -$CREATURE:FORGOTTEN_BEAST_532:GIZZARD -%CREATURE:FORGOTTEN_BEAST_532:PANCREAS -#CREATURE:FORGOTTEN_BEAST_532:SPLEEN -#CREATURE:FORGOTTEN_BEAST_532:KIDNEY -#CREATURE:FORGOTTEN_BEAST_533:MUSCLE - CREATURE:FORGOTTEN_BEAST_533:EYE -"CREATURE:FORGOTTEN_BEAST_533:BRAIN -!CREATURE:FORGOTTEN_BEAST_533:LUNG -"CREATURE:FORGOTTEN_BEAST_533:HEART -"CREATURE:FORGOTTEN_BEAST_533:LIVER - CREATURE:FORGOTTEN_BEAST_533:GUT -$CREATURE:FORGOTTEN_BEAST_533:STOMACH -$CREATURE:FORGOTTEN_BEAST_533:GIZZARD -%CREATURE:FORGOTTEN_BEAST_533:PANCREAS -#CREATURE:FORGOTTEN_BEAST_533:SPLEEN -#CREATURE:FORGOTTEN_BEAST_533:KIDNEY -#CREATURE:FORGOTTEN_BEAST_534:MUSCLE - CREATURE:FORGOTTEN_BEAST_534:EYE -"CREATURE:FORGOTTEN_BEAST_534:BRAIN -!CREATURE:FORGOTTEN_BEAST_534:LUNG -"CREATURE:FORGOTTEN_BEAST_534:HEART -"CREATURE:FORGOTTEN_BEAST_534:LIVER - CREATURE:FORGOTTEN_BEAST_534:GUT -$CREATURE:FORGOTTEN_BEAST_534:STOMACH -$CREATURE:FORGOTTEN_BEAST_534:GIZZARD -%CREATURE:FORGOTTEN_BEAST_534:PANCREAS -#CREATURE:FORGOTTEN_BEAST_534:SPLEEN -#CREATURE:FORGOTTEN_BEAST_534:KIDNEY -#CREATURE:FORGOTTEN_BEAST_535:MUSCLE - CREATURE:FORGOTTEN_BEAST_535:EYE -"CREATURE:FORGOTTEN_BEAST_535:BRAIN -!CREATURE:FORGOTTEN_BEAST_535:LUNG -"CREATURE:FORGOTTEN_BEAST_535:HEART -"CREATURE:FORGOTTEN_BEAST_535:LIVER - CREATURE:FORGOTTEN_BEAST_535:GUT -$CREATURE:FORGOTTEN_BEAST_535:STOMACH -$CREATURE:FORGOTTEN_BEAST_535:GIZZARD -%CREATURE:FORGOTTEN_BEAST_535:PANCREAS -#CREATURE:FORGOTTEN_BEAST_535:SPLEEN -#CREATURE:FORGOTTEN_BEAST_535:KIDNEY -#CREATURE:FORGOTTEN_BEAST_536:MUSCLE - CREATURE:FORGOTTEN_BEAST_536:EYE -"CREATURE:FORGOTTEN_BEAST_536:BRAIN -!CREATURE:FORGOTTEN_BEAST_536:LUNG -"CREATURE:FORGOTTEN_BEAST_536:HEART -"CREATURE:FORGOTTEN_BEAST_536:LIVER - CREATURE:FORGOTTEN_BEAST_536:GUT -$CREATURE:FORGOTTEN_BEAST_536:STOMACH -$CREATURE:FORGOTTEN_BEAST_536:GIZZARD -%CREATURE:FORGOTTEN_BEAST_536:PANCREAS -#CREATURE:FORGOTTEN_BEAST_536:SPLEEN -#CREATURE:FORGOTTEN_BEAST_536:KIDNEY -#CREATURE:FORGOTTEN_BEAST_539:MUSCLE - CREATURE:FORGOTTEN_BEAST_539:EYE -"CREATURE:FORGOTTEN_BEAST_539:BRAIN -!CREATURE:FORGOTTEN_BEAST_539:LUNG -"CREATURE:FORGOTTEN_BEAST_539:HEART -"CREATURE:FORGOTTEN_BEAST_539:LIVER - CREATURE:FORGOTTEN_BEAST_539:GUT -$CREATURE:FORGOTTEN_BEAST_539:STOMACH -$CREATURE:FORGOTTEN_BEAST_539:GIZZARD -%CREATURE:FORGOTTEN_BEAST_539:PANCREAS -#CREATURE:FORGOTTEN_BEAST_539:SPLEEN -#CREATURE:FORGOTTEN_BEAST_539:KIDNEY -#CREATURE:FORGOTTEN_BEAST_540:MUSCLE - CREATURE:FORGOTTEN_BEAST_540:EYE -"CREATURE:FORGOTTEN_BEAST_540:BRAIN -!CREATURE:FORGOTTEN_BEAST_540:LUNG -"CREATURE:FORGOTTEN_BEAST_540:HEART -"CREATURE:FORGOTTEN_BEAST_540:LIVER - CREATURE:FORGOTTEN_BEAST_540:GUT -$CREATURE:FORGOTTEN_BEAST_540:STOMACH -$CREATURE:FORGOTTEN_BEAST_540:GIZZARD -%CREATURE:FORGOTTEN_BEAST_540:PANCREAS -#CREATURE:FORGOTTEN_BEAST_540:SPLEEN -#CREATURE:FORGOTTEN_BEAST_540:KIDNEY -#CREATURE:FORGOTTEN_BEAST_541:MUSCLE - CREATURE:FORGOTTEN_BEAST_541:EYE -"CREATURE:FORGOTTEN_BEAST_541:BRAIN -!CREATURE:FORGOTTEN_BEAST_541:LUNG -"CREATURE:FORGOTTEN_BEAST_541:HEART -"CREATURE:FORGOTTEN_BEAST_541:LIVER - CREATURE:FORGOTTEN_BEAST_541:GUT -$CREATURE:FORGOTTEN_BEAST_541:STOMACH -$CREATURE:FORGOTTEN_BEAST_541:GIZZARD -%CREATURE:FORGOTTEN_BEAST_541:PANCREAS -#CREATURE:FORGOTTEN_BEAST_541:SPLEEN -#CREATURE:FORGOTTEN_BEAST_541:KIDNEY -#CREATURE:FORGOTTEN_BEAST_543:MUSCLE - CREATURE:FORGOTTEN_BEAST_543:EYE -"CREATURE:FORGOTTEN_BEAST_543:BRAIN -!CREATURE:FORGOTTEN_BEAST_543:LUNG -"CREATURE:FORGOTTEN_BEAST_543:HEART -"CREATURE:FORGOTTEN_BEAST_543:LIVER - CREATURE:FORGOTTEN_BEAST_543:GUT -$CREATURE:FORGOTTEN_BEAST_543:STOMACH -$CREATURE:FORGOTTEN_BEAST_543:GIZZARD -%CREATURE:FORGOTTEN_BEAST_543:PANCREAS -#CREATURE:FORGOTTEN_BEAST_543:SPLEEN -#CREATURE:FORGOTTEN_BEAST_543:KIDNEY -#CREATURE:FORGOTTEN_BEAST_545:MUSCLE - CREATURE:FORGOTTEN_BEAST_545:EYE -"CREATURE:FORGOTTEN_BEAST_545:BRAIN -!CREATURE:FORGOTTEN_BEAST_545:LUNG -"CREATURE:FORGOTTEN_BEAST_545:HEART -"CREATURE:FORGOTTEN_BEAST_545:LIVER - CREATURE:FORGOTTEN_BEAST_545:GUT -$CREATURE:FORGOTTEN_BEAST_545:STOMACH -$CREATURE:FORGOTTEN_BEAST_545:GIZZARD -%CREATURE:FORGOTTEN_BEAST_545:PANCREAS -#CREATURE:FORGOTTEN_BEAST_545:SPLEEN -#CREATURE:FORGOTTEN_BEAST_545:KIDNEY -#CREATURE:FORGOTTEN_BEAST_546:MUSCLE - CREATURE:FORGOTTEN_BEAST_546:EYE -"CREATURE:FORGOTTEN_BEAST_546:BRAIN -!CREATURE:FORGOTTEN_BEAST_546:LUNG -"CREATURE:FORGOTTEN_BEAST_546:HEART -"CREATURE:FORGOTTEN_BEAST_546:LIVER - CREATURE:FORGOTTEN_BEAST_546:GUT -$CREATURE:FORGOTTEN_BEAST_546:STOMACH -$CREATURE:FORGOTTEN_BEAST_546:GIZZARD -%CREATURE:FORGOTTEN_BEAST_546:PANCREAS -#CREATURE:FORGOTTEN_BEAST_546:SPLEEN -#CREATURE:FORGOTTEN_BEAST_546:KIDNEY -#CREATURE:FORGOTTEN_BEAST_547:MUSCLE - CREATURE:FORGOTTEN_BEAST_547:EYE -"CREATURE:FORGOTTEN_BEAST_547:BRAIN -!CREATURE:FORGOTTEN_BEAST_547:LUNG -"CREATURE:FORGOTTEN_BEAST_547:HEART -"CREATURE:FORGOTTEN_BEAST_547:LIVER - CREATURE:FORGOTTEN_BEAST_547:GUT -$CREATURE:FORGOTTEN_BEAST_547:STOMACH -$CREATURE:FORGOTTEN_BEAST_547:GIZZARD -%CREATURE:FORGOTTEN_BEAST_547:PANCREAS -#CREATURE:FORGOTTEN_BEAST_547:SPLEEN -#CREATURE:FORGOTTEN_BEAST_547:KIDNEY -#CREATURE:FORGOTTEN_BEAST_548:MUSCLE - CREATURE:FORGOTTEN_BEAST_548:EYE -"CREATURE:FORGOTTEN_BEAST_548:BRAIN -!CREATURE:FORGOTTEN_BEAST_548:LUNG -"CREATURE:FORGOTTEN_BEAST_548:HEART -"CREATURE:FORGOTTEN_BEAST_548:LIVER - CREATURE:FORGOTTEN_BEAST_548:GUT -$CREATURE:FORGOTTEN_BEAST_548:STOMACH -$CREATURE:FORGOTTEN_BEAST_548:GIZZARD -%CREATURE:FORGOTTEN_BEAST_548:PANCREAS -#CREATURE:FORGOTTEN_BEAST_548:SPLEEN -#CREATURE:FORGOTTEN_BEAST_548:KIDNEY -#CREATURE:FORGOTTEN_BEAST_549:MUSCLE - CREATURE:FORGOTTEN_BEAST_549:EYE -"CREATURE:FORGOTTEN_BEAST_549:BRAIN -!CREATURE:FORGOTTEN_BEAST_549:LUNG -"CREATURE:FORGOTTEN_BEAST_549:HEART -"CREATURE:FORGOTTEN_BEAST_549:LIVER - CREATURE:FORGOTTEN_BEAST_549:GUT -$CREATURE:FORGOTTEN_BEAST_549:STOMACH -$CREATURE:FORGOTTEN_BEAST_549:GIZZARD -%CREATURE:FORGOTTEN_BEAST_549:PANCREAS -#CREATURE:FORGOTTEN_BEAST_549:SPLEEN -#CREATURE:FORGOTTEN_BEAST_549:KIDNEY -#CREATURE:FORGOTTEN_BEAST_550:MUSCLE - CREATURE:FORGOTTEN_BEAST_550:EYE -"CREATURE:FORGOTTEN_BEAST_550:BRAIN -!CREATURE:FORGOTTEN_BEAST_550:LUNG -"CREATURE:FORGOTTEN_BEAST_550:HEART -"CREATURE:FORGOTTEN_BEAST_550:LIVER - CREATURE:FORGOTTEN_BEAST_550:GUT -$CREATURE:FORGOTTEN_BEAST_550:STOMACH -$CREATURE:FORGOTTEN_BEAST_550:GIZZARD -%CREATURE:FORGOTTEN_BEAST_550:PANCREAS -#CREATURE:FORGOTTEN_BEAST_550:SPLEEN -#CREATURE:FORGOTTEN_BEAST_550:KIDNEY -#CREATURE:FORGOTTEN_BEAST_551:MUSCLE - CREATURE:FORGOTTEN_BEAST_551:EYE -"CREATURE:FORGOTTEN_BEAST_551:BRAIN -!CREATURE:FORGOTTEN_BEAST_551:LUNG -"CREATURE:FORGOTTEN_BEAST_551:HEART -"CREATURE:FORGOTTEN_BEAST_551:LIVER - CREATURE:FORGOTTEN_BEAST_551:GUT -$CREATURE:FORGOTTEN_BEAST_551:STOMACH -$CREATURE:FORGOTTEN_BEAST_551:GIZZARD -%CREATURE:FORGOTTEN_BEAST_551:PANCREAS -#CREATURE:FORGOTTEN_BEAST_551:SPLEEN -#CREATURE:FORGOTTEN_BEAST_551:KIDNEY -#CREATURE:FORGOTTEN_BEAST_554:MUSCLE - CREATURE:FORGOTTEN_BEAST_554:EYE -"CREATURE:FORGOTTEN_BEAST_554:BRAIN -!CREATURE:FORGOTTEN_BEAST_554:LUNG -"CREATURE:FORGOTTEN_BEAST_554:HEART -"CREATURE:FORGOTTEN_BEAST_554:LIVER - CREATURE:FORGOTTEN_BEAST_554:GUT -$CREATURE:FORGOTTEN_BEAST_554:STOMACH -$CREATURE:FORGOTTEN_BEAST_554:GIZZARD -%CREATURE:FORGOTTEN_BEAST_554:PANCREAS -#CREATURE:FORGOTTEN_BEAST_554:SPLEEN -#CREATURE:FORGOTTEN_BEAST_554:KIDNEY -#CREATURE:FORGOTTEN_BEAST_555:MUSCLE - CREATURE:FORGOTTEN_BEAST_555:EYE -"CREATURE:FORGOTTEN_BEAST_555:BRAIN -!CREATURE:FORGOTTEN_BEAST_555:LUNG -"CREATURE:FORGOTTEN_BEAST_555:HEART -"CREATURE:FORGOTTEN_BEAST_555:LIVER - CREATURE:FORGOTTEN_BEAST_555:GUT -$CREATURE:FORGOTTEN_BEAST_555:STOMACH -$CREATURE:FORGOTTEN_BEAST_555:GIZZARD -%CREATURE:FORGOTTEN_BEAST_555:PANCREAS -#CREATURE:FORGOTTEN_BEAST_555:SPLEEN -#CREATURE:FORGOTTEN_BEAST_555:KIDNEY -#CREATURE:FORGOTTEN_BEAST_556:MUSCLE - CREATURE:FORGOTTEN_BEAST_556:EYE -"CREATURE:FORGOTTEN_BEAST_556:BRAIN -!CREATURE:FORGOTTEN_BEAST_556:LUNG -"CREATURE:FORGOTTEN_BEAST_556:HEART -"CREATURE:FORGOTTEN_BEAST_556:LIVER - CREATURE:FORGOTTEN_BEAST_556:GUT -$CREATURE:FORGOTTEN_BEAST_556:STOMACH -$CREATURE:FORGOTTEN_BEAST_556:GIZZARD -%CREATURE:FORGOTTEN_BEAST_556:PANCREAS -#CREATURE:FORGOTTEN_BEAST_556:SPLEEN -#CREATURE:FORGOTTEN_BEAST_556:KIDNEY -#CREATURE:FORGOTTEN_BEAST_557:MUSCLE - CREATURE:FORGOTTEN_BEAST_557:EYE -"CREATURE:FORGOTTEN_BEAST_557:BRAIN -!CREATURE:FORGOTTEN_BEAST_557:LUNG -"CREATURE:FORGOTTEN_BEAST_557:HEART -"CREATURE:FORGOTTEN_BEAST_557:LIVER - CREATURE:FORGOTTEN_BEAST_557:GUT -$CREATURE:FORGOTTEN_BEAST_557:STOMACH -$CREATURE:FORGOTTEN_BEAST_557:GIZZARD -%CREATURE:FORGOTTEN_BEAST_557:PANCREAS -#CREATURE:FORGOTTEN_BEAST_557:SPLEEN -#CREATURE:FORGOTTEN_BEAST_557:KIDNEY -#CREATURE:FORGOTTEN_BEAST_561:MUSCLE - CREATURE:FORGOTTEN_BEAST_561:EYE -"CREATURE:FORGOTTEN_BEAST_561:BRAIN -!CREATURE:FORGOTTEN_BEAST_561:LUNG -"CREATURE:FORGOTTEN_BEAST_561:HEART -"CREATURE:FORGOTTEN_BEAST_561:LIVER - CREATURE:FORGOTTEN_BEAST_561:GUT -$CREATURE:FORGOTTEN_BEAST_561:STOMACH -$CREATURE:FORGOTTEN_BEAST_561:GIZZARD -%CREATURE:FORGOTTEN_BEAST_561:PANCREAS -#CREATURE:FORGOTTEN_BEAST_561:SPLEEN -#CREATURE:FORGOTTEN_BEAST_561:KIDNEY -#CREATURE:FORGOTTEN_BEAST_562:MUSCLE - CREATURE:FORGOTTEN_BEAST_562:EYE -"CREATURE:FORGOTTEN_BEAST_562:BRAIN -!CREATURE:FORGOTTEN_BEAST_562:LUNG -"CREATURE:FORGOTTEN_BEAST_562:HEART -"CREATURE:FORGOTTEN_BEAST_562:LIVER - CREATURE:FORGOTTEN_BEAST_562:GUT -$CREATURE:FORGOTTEN_BEAST_562:STOMACH -$CREATURE:FORGOTTEN_BEAST_562:GIZZARD -%CREATURE:FORGOTTEN_BEAST_562:PANCREAS -#CREATURE:FORGOTTEN_BEAST_562:SPLEEN -#CREATURE:FORGOTTEN_BEAST_562:KIDNEY -#CREATURE:FORGOTTEN_BEAST_564:MUSCLE - CREATURE:FORGOTTEN_BEAST_564:EYE -"CREATURE:FORGOTTEN_BEAST_564:BRAIN -!CREATURE:FORGOTTEN_BEAST_564:LUNG -"CREATURE:FORGOTTEN_BEAST_564:HEART -"CREATURE:FORGOTTEN_BEAST_564:LIVER - CREATURE:FORGOTTEN_BEAST_564:GUT -$CREATURE:FORGOTTEN_BEAST_564:STOMACH -$CREATURE:FORGOTTEN_BEAST_564:GIZZARD -%CREATURE:FORGOTTEN_BEAST_564:PANCREAS -#CREATURE:FORGOTTEN_BEAST_564:SPLEEN -#CREATURE:FORGOTTEN_BEAST_564:KIDNEY -#CREATURE:FORGOTTEN_BEAST_569:MUSCLE - CREATURE:FORGOTTEN_BEAST_569:EYE -"CREATURE:FORGOTTEN_BEAST_569:BRAIN -!CREATURE:FORGOTTEN_BEAST_569:LUNG -"CREATURE:FORGOTTEN_BEAST_569:HEART -"CREATURE:FORGOTTEN_BEAST_569:LIVER - CREATURE:FORGOTTEN_BEAST_569:GUT -$CREATURE:FORGOTTEN_BEAST_569:STOMACH -$CREATURE:FORGOTTEN_BEAST_569:GIZZARD -%CREATURE:FORGOTTEN_BEAST_569:PANCREAS -#CREATURE:FORGOTTEN_BEAST_569:SPLEEN -#CREATURE:FORGOTTEN_BEAST_569:KIDNEY -#CREATURE:FORGOTTEN_BEAST_570:MUSCLE - CREATURE:FORGOTTEN_BEAST_570:EYE -"CREATURE:FORGOTTEN_BEAST_570:BRAIN -!CREATURE:FORGOTTEN_BEAST_570:LUNG -"CREATURE:FORGOTTEN_BEAST_570:HEART -"CREATURE:FORGOTTEN_BEAST_570:LIVER - CREATURE:FORGOTTEN_BEAST_570:GUT -$CREATURE:FORGOTTEN_BEAST_570:STOMACH -$CREATURE:FORGOTTEN_BEAST_570:GIZZARD -%CREATURE:FORGOTTEN_BEAST_570:PANCREAS -#CREATURE:FORGOTTEN_BEAST_570:SPLEEN -#CREATURE:FORGOTTEN_BEAST_570:KIDNEY -#CREATURE:FORGOTTEN_BEAST_571:MUSCLE - CREATURE:FORGOTTEN_BEAST_571:EYE -"CREATURE:FORGOTTEN_BEAST_571:BRAIN -!CREATURE:FORGOTTEN_BEAST_571:LUNG -"CREATURE:FORGOTTEN_BEAST_571:HEART -"CREATURE:FORGOTTEN_BEAST_571:LIVER - CREATURE:FORGOTTEN_BEAST_571:GUT -$CREATURE:FORGOTTEN_BEAST_571:STOMACH -$CREATURE:FORGOTTEN_BEAST_571:GIZZARD -%CREATURE:FORGOTTEN_BEAST_571:PANCREAS -#CREATURE:FORGOTTEN_BEAST_571:SPLEEN -#CREATURE:FORGOTTEN_BEAST_571:KIDNEY -#CREATURE:FORGOTTEN_BEAST_572:MUSCLE - CREATURE:FORGOTTEN_BEAST_572:EYE -"CREATURE:FORGOTTEN_BEAST_572:BRAIN -!CREATURE:FORGOTTEN_BEAST_572:LUNG -"CREATURE:FORGOTTEN_BEAST_572:HEART -"CREATURE:FORGOTTEN_BEAST_572:LIVER - CREATURE:FORGOTTEN_BEAST_572:GUT -$CREATURE:FORGOTTEN_BEAST_572:STOMACH -$CREATURE:FORGOTTEN_BEAST_572:GIZZARD -%CREATURE:FORGOTTEN_BEAST_572:PANCREAS -#CREATURE:FORGOTTEN_BEAST_572:SPLEEN -#CREATURE:FORGOTTEN_BEAST_572:KIDNEY -#CREATURE:FORGOTTEN_BEAST_574:MUSCLE - CREATURE:FORGOTTEN_BEAST_574:EYE -"CREATURE:FORGOTTEN_BEAST_574:BRAIN -!CREATURE:FORGOTTEN_BEAST_574:LUNG -"CREATURE:FORGOTTEN_BEAST_574:HEART -"CREATURE:FORGOTTEN_BEAST_574:LIVER - CREATURE:FORGOTTEN_BEAST_574:GUT -$CREATURE:FORGOTTEN_BEAST_574:STOMACH -$CREATURE:FORGOTTEN_BEAST_574:GIZZARD -%CREATURE:FORGOTTEN_BEAST_574:PANCREAS -#CREATURE:FORGOTTEN_BEAST_574:SPLEEN -#CREATURE:FORGOTTEN_BEAST_574:KIDNEY -#CREATURE:FORGOTTEN_BEAST_576:MUSCLE - CREATURE:FORGOTTEN_BEAST_576:EYE -"CREATURE:FORGOTTEN_BEAST_576:BRAIN -!CREATURE:FORGOTTEN_BEAST_576:LUNG -"CREATURE:FORGOTTEN_BEAST_576:HEART -"CREATURE:FORGOTTEN_BEAST_576:LIVER - CREATURE:FORGOTTEN_BEAST_576:GUT -$CREATURE:FORGOTTEN_BEAST_576:STOMACH -$CREATURE:FORGOTTEN_BEAST_576:GIZZARD -%CREATURE:FORGOTTEN_BEAST_576:PANCREAS -#CREATURE:FORGOTTEN_BEAST_576:SPLEEN -#CREATURE:FORGOTTEN_BEAST_576:KIDNEY -#CREATURE:FORGOTTEN_BEAST_578:MUSCLE - CREATURE:FORGOTTEN_BEAST_578:EYE -"CREATURE:FORGOTTEN_BEAST_578:BRAIN -!CREATURE:FORGOTTEN_BEAST_578:LUNG -"CREATURE:FORGOTTEN_BEAST_578:HEART -"CREATURE:FORGOTTEN_BEAST_578:LIVER - CREATURE:FORGOTTEN_BEAST_578:GUT -$CREATURE:FORGOTTEN_BEAST_578:STOMACH -$CREATURE:FORGOTTEN_BEAST_578:GIZZARD -%CREATURE:FORGOTTEN_BEAST_578:PANCREAS -#CREATURE:FORGOTTEN_BEAST_578:SPLEEN -#CREATURE:FORGOTTEN_BEAST_578:KIDNEY -#CREATURE:FORGOTTEN_BEAST_579:MUSCLE - CREATURE:FORGOTTEN_BEAST_579:EYE -"CREATURE:FORGOTTEN_BEAST_579:BRAIN -!CREATURE:FORGOTTEN_BEAST_579:LUNG -"CREATURE:FORGOTTEN_BEAST_579:HEART -"CREATURE:FORGOTTEN_BEAST_579:LIVER - CREATURE:FORGOTTEN_BEAST_579:GUT -$CREATURE:FORGOTTEN_BEAST_579:STOMACH -$CREATURE:FORGOTTEN_BEAST_579:GIZZARD -%CREATURE:FORGOTTEN_BEAST_579:PANCREAS -#CREATURE:FORGOTTEN_BEAST_579:SPLEEN -#CREATURE:FORGOTTEN_BEAST_579:KIDNEY -#CREATURE:FORGOTTEN_BEAST_580:MUSCLE - CREATURE:FORGOTTEN_BEAST_580:EYE -"CREATURE:FORGOTTEN_BEAST_580:BRAIN -!CREATURE:FORGOTTEN_BEAST_580:LUNG -"CREATURE:FORGOTTEN_BEAST_580:HEART -"CREATURE:FORGOTTEN_BEAST_580:LIVER - CREATURE:FORGOTTEN_BEAST_580:GUT -$CREATURE:FORGOTTEN_BEAST_580:STOMACH -$CREATURE:FORGOTTEN_BEAST_580:GIZZARD -%CREATURE:FORGOTTEN_BEAST_580:PANCREAS -#CREATURE:FORGOTTEN_BEAST_580:SPLEEN -#CREATURE:FORGOTTEN_BEAST_580:KIDNEY -#CREATURE:FORGOTTEN_BEAST_581:MUSCLE - CREATURE:FORGOTTEN_BEAST_581:EYE -"CREATURE:FORGOTTEN_BEAST_581:BRAIN -!CREATURE:FORGOTTEN_BEAST_581:LUNG -"CREATURE:FORGOTTEN_BEAST_581:HEART -"CREATURE:FORGOTTEN_BEAST_581:LIVER - CREATURE:FORGOTTEN_BEAST_581:GUT -$CREATURE:FORGOTTEN_BEAST_581:STOMACH -$CREATURE:FORGOTTEN_BEAST_581:GIZZARD -%CREATURE:FORGOTTEN_BEAST_581:PANCREAS -#CREATURE:FORGOTTEN_BEAST_581:SPLEEN -#CREATURE:FORGOTTEN_BEAST_581:KIDNEY -#CREATURE:FORGOTTEN_BEAST_583:MUSCLE - CREATURE:FORGOTTEN_BEAST_583:EYE -"CREATURE:FORGOTTEN_BEAST_583:BRAIN -!CREATURE:FORGOTTEN_BEAST_583:LUNG -"CREATURE:FORGOTTEN_BEAST_583:HEART -"CREATURE:FORGOTTEN_BEAST_583:LIVER - CREATURE:FORGOTTEN_BEAST_583:GUT -$CREATURE:FORGOTTEN_BEAST_583:STOMACH -$CREATURE:FORGOTTEN_BEAST_583:GIZZARD -%CREATURE:FORGOTTEN_BEAST_583:PANCREAS -#CREATURE:FORGOTTEN_BEAST_583:SPLEEN -#CREATURE:FORGOTTEN_BEAST_583:KIDNEY -#CREATURE:FORGOTTEN_BEAST_584:MUSCLE - CREATURE:FORGOTTEN_BEAST_584:EYE -"CREATURE:FORGOTTEN_BEAST_584:BRAIN -!CREATURE:FORGOTTEN_BEAST_584:LUNG -"CREATURE:FORGOTTEN_BEAST_584:HEART -"CREATURE:FORGOTTEN_BEAST_584:LIVER - CREATURE:FORGOTTEN_BEAST_584:GUT -$CREATURE:FORGOTTEN_BEAST_584:STOMACH -$CREATURE:FORGOTTEN_BEAST_584:GIZZARD -%CREATURE:FORGOTTEN_BEAST_584:PANCREAS -#CREATURE:FORGOTTEN_BEAST_584:SPLEEN -#CREATURE:FORGOTTEN_BEAST_584:KIDNEY -#CREATURE:FORGOTTEN_BEAST_586:MUSCLE - CREATURE:FORGOTTEN_BEAST_586:EYE -"CREATURE:FORGOTTEN_BEAST_586:BRAIN -!CREATURE:FORGOTTEN_BEAST_586:LUNG -"CREATURE:FORGOTTEN_BEAST_586:HEART -"CREATURE:FORGOTTEN_BEAST_586:LIVER - CREATURE:FORGOTTEN_BEAST_586:GUT -$CREATURE:FORGOTTEN_BEAST_586:STOMACH -$CREATURE:FORGOTTEN_BEAST_586:GIZZARD -%CREATURE:FORGOTTEN_BEAST_586:PANCREAS -#CREATURE:FORGOTTEN_BEAST_586:SPLEEN -#CREATURE:FORGOTTEN_BEAST_586:KIDNEY -#CREATURE:FORGOTTEN_BEAST_588:MUSCLE - CREATURE:FORGOTTEN_BEAST_588:EYE -"CREATURE:FORGOTTEN_BEAST_588:BRAIN -!CREATURE:FORGOTTEN_BEAST_588:LUNG -"CREATURE:FORGOTTEN_BEAST_588:HEART -"CREATURE:FORGOTTEN_BEAST_588:LIVER - CREATURE:FORGOTTEN_BEAST_588:GUT -$CREATURE:FORGOTTEN_BEAST_588:STOMACH -$CREATURE:FORGOTTEN_BEAST_588:GIZZARD -%CREATURE:FORGOTTEN_BEAST_588:PANCREAS -#CREATURE:FORGOTTEN_BEAST_588:SPLEEN -#CREATURE:FORGOTTEN_BEAST_588:KIDNEY -#CREATURE:FORGOTTEN_BEAST_589:MUSCLE - CREATURE:FORGOTTEN_BEAST_589:EYE -"CREATURE:FORGOTTEN_BEAST_589:BRAIN -!CREATURE:FORGOTTEN_BEAST_589:LUNG -"CREATURE:FORGOTTEN_BEAST_589:HEART -"CREATURE:FORGOTTEN_BEAST_589:LIVER - CREATURE:FORGOTTEN_BEAST_589:GUT -$CREATURE:FORGOTTEN_BEAST_589:STOMACH -$CREATURE:FORGOTTEN_BEAST_589:GIZZARD -%CREATURE:FORGOTTEN_BEAST_589:PANCREAS -#CREATURE:FORGOTTEN_BEAST_589:SPLEEN -#CREATURE:FORGOTTEN_BEAST_589:KIDNEY -#CREATURE:FORGOTTEN_BEAST_590:MUSCLE - CREATURE:FORGOTTEN_BEAST_590:EYE -"CREATURE:FORGOTTEN_BEAST_590:BRAIN -!CREATURE:FORGOTTEN_BEAST_590:LUNG -"CREATURE:FORGOTTEN_BEAST_590:HEART -"CREATURE:FORGOTTEN_BEAST_590:LIVER - CREATURE:FORGOTTEN_BEAST_590:GUT -$CREATURE:FORGOTTEN_BEAST_590:STOMACH -$CREATURE:FORGOTTEN_BEAST_590:GIZZARD -%CREATURE:FORGOTTEN_BEAST_590:PANCREAS -#CREATURE:FORGOTTEN_BEAST_590:SPLEEN -#CREATURE:FORGOTTEN_BEAST_590:KIDNEY -#CREATURE:FORGOTTEN_BEAST_592:MUSCLE - CREATURE:FORGOTTEN_BEAST_592:EYE -"CREATURE:FORGOTTEN_BEAST_592:BRAIN -!CREATURE:FORGOTTEN_BEAST_592:LUNG -"CREATURE:FORGOTTEN_BEAST_592:HEART -"CREATURE:FORGOTTEN_BEAST_592:LIVER - CREATURE:FORGOTTEN_BEAST_592:GUT -$CREATURE:FORGOTTEN_BEAST_592:STOMACH -$CREATURE:FORGOTTEN_BEAST_592:GIZZARD -%CREATURE:FORGOTTEN_BEAST_592:PANCREAS -#CREATURE:FORGOTTEN_BEAST_592:SPLEEN -#CREATURE:FORGOTTEN_BEAST_592:KIDNEY -#CREATURE:FORGOTTEN_BEAST_593:MUSCLE - CREATURE:FORGOTTEN_BEAST_593:EYE -"CREATURE:FORGOTTEN_BEAST_593:BRAIN -!CREATURE:FORGOTTEN_BEAST_593:LUNG -"CREATURE:FORGOTTEN_BEAST_593:HEART -"CREATURE:FORGOTTEN_BEAST_593:LIVER - CREATURE:FORGOTTEN_BEAST_593:GUT -$CREATURE:FORGOTTEN_BEAST_593:STOMACH -$CREATURE:FORGOTTEN_BEAST_593:GIZZARD -%CREATURE:FORGOTTEN_BEAST_593:PANCREAS -#CREATURE:FORGOTTEN_BEAST_593:SPLEEN -#CREATURE:FORGOTTEN_BEAST_593:KIDNEY -#CREATURE:FORGOTTEN_BEAST_594:MUSCLE - CREATURE:FORGOTTEN_BEAST_594:EYE -"CREATURE:FORGOTTEN_BEAST_594:BRAIN -!CREATURE:FORGOTTEN_BEAST_594:LUNG -"CREATURE:FORGOTTEN_BEAST_594:HEART -"CREATURE:FORGOTTEN_BEAST_594:LIVER - CREATURE:FORGOTTEN_BEAST_594:GUT -$CREATURE:FORGOTTEN_BEAST_594:STOMACH -$CREATURE:FORGOTTEN_BEAST_594:GIZZARD -%CREATURE:FORGOTTEN_BEAST_594:PANCREAS -#CREATURE:FORGOTTEN_BEAST_594:SPLEEN -#CREATURE:FORGOTTEN_BEAST_594:KIDNEY -#CREATURE:FORGOTTEN_BEAST_595:MUSCLE - CREATURE:FORGOTTEN_BEAST_595:EYE -"CREATURE:FORGOTTEN_BEAST_595:BRAIN -!CREATURE:FORGOTTEN_BEAST_595:LUNG -"CREATURE:FORGOTTEN_BEAST_595:HEART -"CREATURE:FORGOTTEN_BEAST_595:LIVER - CREATURE:FORGOTTEN_BEAST_595:GUT -$CREATURE:FORGOTTEN_BEAST_595:STOMACH -$CREATURE:FORGOTTEN_BEAST_595:GIZZARD -%CREATURE:FORGOTTEN_BEAST_595:PANCREAS -#CREATURE:FORGOTTEN_BEAST_595:SPLEEN -#CREATURE:FORGOTTEN_BEAST_595:KIDNEY -#CREATURE:FORGOTTEN_BEAST_596:MUSCLE - CREATURE:FORGOTTEN_BEAST_596:EYE -"CREATURE:FORGOTTEN_BEAST_596:BRAIN -!CREATURE:FORGOTTEN_BEAST_596:LUNG -"CREATURE:FORGOTTEN_BEAST_596:HEART -"CREATURE:FORGOTTEN_BEAST_596:LIVER - CREATURE:FORGOTTEN_BEAST_596:GUT -$CREATURE:FORGOTTEN_BEAST_596:STOMACH -$CREATURE:FORGOTTEN_BEAST_596:GIZZARD -%CREATURE:FORGOTTEN_BEAST_596:PANCREAS -#CREATURE:FORGOTTEN_BEAST_596:SPLEEN -#CREATURE:FORGOTTEN_BEAST_596:KIDNEY -#CREATURE:FORGOTTEN_BEAST_597:MUSCLE - CREATURE:FORGOTTEN_BEAST_597:EYE -"CREATURE:FORGOTTEN_BEAST_597:BRAIN -!CREATURE:FORGOTTEN_BEAST_597:LUNG -"CREATURE:FORGOTTEN_BEAST_597:HEART -"CREATURE:FORGOTTEN_BEAST_597:LIVER - CREATURE:FORGOTTEN_BEAST_597:GUT -$CREATURE:FORGOTTEN_BEAST_597:STOMACH -$CREATURE:FORGOTTEN_BEAST_597:GIZZARD -%CREATURE:FORGOTTEN_BEAST_597:PANCREAS -#CREATURE:FORGOTTEN_BEAST_597:SPLEEN -#CREATURE:FORGOTTEN_BEAST_597:KIDNEY -#CREATURE:FORGOTTEN_BEAST_599:MUSCLE - CREATURE:FORGOTTEN_BEAST_599:EYE -"CREATURE:FORGOTTEN_BEAST_599:BRAIN -!CREATURE:FORGOTTEN_BEAST_599:LUNG -"CREATURE:FORGOTTEN_BEAST_599:HEART -"CREATURE:FORGOTTEN_BEAST_599:LIVER - CREATURE:FORGOTTEN_BEAST_599:GUT -$CREATURE:FORGOTTEN_BEAST_599:STOMACH -$CREATURE:FORGOTTEN_BEAST_599:GIZZARD -%CREATURE:FORGOTTEN_BEAST_599:PANCREAS -#CREATURE:FORGOTTEN_BEAST_599:SPLEEN -#CREATURE:FORGOTTEN_BEAST_599:KIDNEY -#CREATURE:FORGOTTEN_BEAST_600:MUSCLE - CREATURE:FORGOTTEN_BEAST_600:EYE -"CREATURE:FORGOTTEN_BEAST_600:BRAIN -!CREATURE:FORGOTTEN_BEAST_600:LUNG -"CREATURE:FORGOTTEN_BEAST_600:HEART -"CREATURE:FORGOTTEN_BEAST_600:LIVER - CREATURE:FORGOTTEN_BEAST_600:GUT -$CREATURE:FORGOTTEN_BEAST_600:STOMACH -$CREATURE:FORGOTTEN_BEAST_600:GIZZARD -%CREATURE:FORGOTTEN_BEAST_600:PANCREAS -#CREATURE:FORGOTTEN_BEAST_600:SPLEEN -#CREATURE:FORGOTTEN_BEAST_600:KIDNEY -#CREATURE:FORGOTTEN_BEAST_601:MUSCLE - CREATURE:FORGOTTEN_BEAST_601:EYE -"CREATURE:FORGOTTEN_BEAST_601:BRAIN -!CREATURE:FORGOTTEN_BEAST_601:LUNG -"CREATURE:FORGOTTEN_BEAST_601:HEART -"CREATURE:FORGOTTEN_BEAST_601:LIVER - CREATURE:FORGOTTEN_BEAST_601:GUT -$CREATURE:FORGOTTEN_BEAST_601:STOMACH -$CREATURE:FORGOTTEN_BEAST_601:GIZZARD -%CREATURE:FORGOTTEN_BEAST_601:PANCREAS -#CREATURE:FORGOTTEN_BEAST_601:SPLEEN -#CREATURE:FORGOTTEN_BEAST_601:KIDNEY -#CREATURE:FORGOTTEN_BEAST_603:MUSCLE - CREATURE:FORGOTTEN_BEAST_603:EYE -"CREATURE:FORGOTTEN_BEAST_603:BRAIN -!CREATURE:FORGOTTEN_BEAST_603:LUNG -"CREATURE:FORGOTTEN_BEAST_603:HEART -"CREATURE:FORGOTTEN_BEAST_603:LIVER - CREATURE:FORGOTTEN_BEAST_603:GUT -$CREATURE:FORGOTTEN_BEAST_603:STOMACH -$CREATURE:FORGOTTEN_BEAST_603:GIZZARD -%CREATURE:FORGOTTEN_BEAST_603:PANCREAS -#CREATURE:FORGOTTEN_BEAST_603:SPLEEN -#CREATURE:FORGOTTEN_BEAST_603:KIDNEY -#CREATURE:FORGOTTEN_BEAST_605:MUSCLE - CREATURE:FORGOTTEN_BEAST_605:EYE -"CREATURE:FORGOTTEN_BEAST_605:BRAIN -!CREATURE:FORGOTTEN_BEAST_605:LUNG -"CREATURE:FORGOTTEN_BEAST_605:HEART -"CREATURE:FORGOTTEN_BEAST_605:LIVER - CREATURE:FORGOTTEN_BEAST_605:GUT -$CREATURE:FORGOTTEN_BEAST_605:STOMACH -$CREATURE:FORGOTTEN_BEAST_605:GIZZARD -%CREATURE:FORGOTTEN_BEAST_605:PANCREAS -#CREATURE:FORGOTTEN_BEAST_605:SPLEEN -#CREATURE:FORGOTTEN_BEAST_605:KIDNEY -#CREATURE:FORGOTTEN_BEAST_607:MUSCLE - CREATURE:FORGOTTEN_BEAST_607:EYE -"CREATURE:FORGOTTEN_BEAST_607:BRAIN -!CREATURE:FORGOTTEN_BEAST_607:LUNG -"CREATURE:FORGOTTEN_BEAST_607:HEART -"CREATURE:FORGOTTEN_BEAST_607:LIVER - CREATURE:FORGOTTEN_BEAST_607:GUT -$CREATURE:FORGOTTEN_BEAST_607:STOMACH -$CREATURE:FORGOTTEN_BEAST_607:GIZZARD -%CREATURE:FORGOTTEN_BEAST_607:PANCREAS -#CREATURE:FORGOTTEN_BEAST_607:SPLEEN -#CREATURE:FORGOTTEN_BEAST_607:KIDNEY -#CREATURE:FORGOTTEN_BEAST_608:MUSCLE - CREATURE:FORGOTTEN_BEAST_608:EYE -"CREATURE:FORGOTTEN_BEAST_608:BRAIN -!CREATURE:FORGOTTEN_BEAST_608:LUNG -"CREATURE:FORGOTTEN_BEAST_608:HEART -"CREATURE:FORGOTTEN_BEAST_608:LIVER - CREATURE:FORGOTTEN_BEAST_608:GUT -$CREATURE:FORGOTTEN_BEAST_608:STOMACH -$CREATURE:FORGOTTEN_BEAST_608:GIZZARD -%CREATURE:FORGOTTEN_BEAST_608:PANCREAS -#CREATURE:FORGOTTEN_BEAST_608:SPLEEN -#CREATURE:FORGOTTEN_BEAST_608:KIDNEY -#CREATURE:FORGOTTEN_BEAST_609:MUSCLE - CREATURE:FORGOTTEN_BEAST_609:EYE -"CREATURE:FORGOTTEN_BEAST_609:BRAIN -!CREATURE:FORGOTTEN_BEAST_609:LUNG -"CREATURE:FORGOTTEN_BEAST_609:HEART -"CREATURE:FORGOTTEN_BEAST_609:LIVER - CREATURE:FORGOTTEN_BEAST_609:GUT -$CREATURE:FORGOTTEN_BEAST_609:STOMACH -$CREATURE:FORGOTTEN_BEAST_609:GIZZARD -%CREATURE:FORGOTTEN_BEAST_609:PANCREAS -#CREATURE:FORGOTTEN_BEAST_609:SPLEEN -#CREATURE:FORGOTTEN_BEAST_609:KIDNEY -#CREATURE:FORGOTTEN_BEAST_610:MUSCLE - CREATURE:FORGOTTEN_BEAST_610:EYE -"CREATURE:FORGOTTEN_BEAST_610:BRAIN -!CREATURE:FORGOTTEN_BEAST_610:LUNG -"CREATURE:FORGOTTEN_BEAST_610:HEART -"CREATURE:FORGOTTEN_BEAST_610:LIVER - CREATURE:FORGOTTEN_BEAST_610:GUT -$CREATURE:FORGOTTEN_BEAST_610:STOMACH -$CREATURE:FORGOTTEN_BEAST_610:GIZZARD -%CREATURE:FORGOTTEN_BEAST_610:PANCREAS -#CREATURE:FORGOTTEN_BEAST_610:SPLEEN -#CREATURE:FORGOTTEN_BEAST_610:KIDNEY -#CREATURE:FORGOTTEN_BEAST_611:MUSCLE - CREATURE:FORGOTTEN_BEAST_611:EYE -"CREATURE:FORGOTTEN_BEAST_611:BRAIN -!CREATURE:FORGOTTEN_BEAST_611:LUNG -"CREATURE:FORGOTTEN_BEAST_611:HEART -"CREATURE:FORGOTTEN_BEAST_611:LIVER - CREATURE:FORGOTTEN_BEAST_611:GUT -$CREATURE:FORGOTTEN_BEAST_611:STOMACH -$CREATURE:FORGOTTEN_BEAST_611:GIZZARD -%CREATURE:FORGOTTEN_BEAST_611:PANCREAS -#CREATURE:FORGOTTEN_BEAST_611:SPLEEN -#CREATURE:FORGOTTEN_BEAST_611:KIDNEY -#CREATURE:FORGOTTEN_BEAST_612:MUSCLE - CREATURE:FORGOTTEN_BEAST_612:EYE -"CREATURE:FORGOTTEN_BEAST_612:BRAIN -!CREATURE:FORGOTTEN_BEAST_612:LUNG -"CREATURE:FORGOTTEN_BEAST_612:HEART -"CREATURE:FORGOTTEN_BEAST_612:LIVER - CREATURE:FORGOTTEN_BEAST_612:GUT -$CREATURE:FORGOTTEN_BEAST_612:STOMACH -$CREATURE:FORGOTTEN_BEAST_612:GIZZARD -%CREATURE:FORGOTTEN_BEAST_612:PANCREAS -#CREATURE:FORGOTTEN_BEAST_612:SPLEEN -#CREATURE:FORGOTTEN_BEAST_612:KIDNEY -#CREATURE:FORGOTTEN_BEAST_613:MUSCLE - CREATURE:FORGOTTEN_BEAST_613:EYE -"CREATURE:FORGOTTEN_BEAST_613:BRAIN -!CREATURE:FORGOTTEN_BEAST_613:LUNG -"CREATURE:FORGOTTEN_BEAST_613:HEART -"CREATURE:FORGOTTEN_BEAST_613:LIVER - CREATURE:FORGOTTEN_BEAST_613:GUT -$CREATURE:FORGOTTEN_BEAST_613:STOMACH -$CREATURE:FORGOTTEN_BEAST_613:GIZZARD -%CREATURE:FORGOTTEN_BEAST_613:PANCREAS -#CREATURE:FORGOTTEN_BEAST_613:SPLEEN -#CREATURE:FORGOTTEN_BEAST_613:KIDNEY -#CREATURE:FORGOTTEN_BEAST_614:MUSCLE - CREATURE:FORGOTTEN_BEAST_614:EYE -"CREATURE:FORGOTTEN_BEAST_614:BRAIN -!CREATURE:FORGOTTEN_BEAST_614:LUNG -"CREATURE:FORGOTTEN_BEAST_614:HEART -"CREATURE:FORGOTTEN_BEAST_614:LIVER - CREATURE:FORGOTTEN_BEAST_614:GUT -$CREATURE:FORGOTTEN_BEAST_614:STOMACH -$CREATURE:FORGOTTEN_BEAST_614:GIZZARD -%CREATURE:FORGOTTEN_BEAST_614:PANCREAS -#CREATURE:FORGOTTEN_BEAST_614:SPLEEN -#CREATURE:FORGOTTEN_BEAST_614:KIDNEY -#CREATURE:FORGOTTEN_BEAST_616:MUSCLE - CREATURE:FORGOTTEN_BEAST_616:EYE -"CREATURE:FORGOTTEN_BEAST_616:BRAIN -!CREATURE:FORGOTTEN_BEAST_616:LUNG -"CREATURE:FORGOTTEN_BEAST_616:HEART -"CREATURE:FORGOTTEN_BEAST_616:LIVER - CREATURE:FORGOTTEN_BEAST_616:GUT -$CREATURE:FORGOTTEN_BEAST_616:STOMACH -$CREATURE:FORGOTTEN_BEAST_616:GIZZARD -%CREATURE:FORGOTTEN_BEAST_616:PANCREAS -#CREATURE:FORGOTTEN_BEAST_616:SPLEEN -#CREATURE:FORGOTTEN_BEAST_616:KIDNEY -#CREATURE:FORGOTTEN_BEAST_619:MUSCLE - CREATURE:FORGOTTEN_BEAST_619:EYE -"CREATURE:FORGOTTEN_BEAST_619:BRAIN -!CREATURE:FORGOTTEN_BEAST_619:LUNG -"CREATURE:FORGOTTEN_BEAST_619:HEART -"CREATURE:FORGOTTEN_BEAST_619:LIVER - CREATURE:FORGOTTEN_BEAST_619:GUT -$CREATURE:FORGOTTEN_BEAST_619:STOMACH -$CREATURE:FORGOTTEN_BEAST_619:GIZZARD -%CREATURE:FORGOTTEN_BEAST_619:PANCREAS -#CREATURE:FORGOTTEN_BEAST_619:SPLEEN -#CREATURE:FORGOTTEN_BEAST_619:KIDNEY -#CREATURE:FORGOTTEN_BEAST_620:MUSCLE - CREATURE:FORGOTTEN_BEAST_620:EYE -"CREATURE:FORGOTTEN_BEAST_620:BRAIN -!CREATURE:FORGOTTEN_BEAST_620:LUNG -"CREATURE:FORGOTTEN_BEAST_620:HEART -"CREATURE:FORGOTTEN_BEAST_620:LIVER - CREATURE:FORGOTTEN_BEAST_620:GUT -$CREATURE:FORGOTTEN_BEAST_620:STOMACH -$CREATURE:FORGOTTEN_BEAST_620:GIZZARD -%CREATURE:FORGOTTEN_BEAST_620:PANCREAS -#CREATURE:FORGOTTEN_BEAST_620:SPLEEN -#CREATURE:FORGOTTEN_BEAST_620:KIDNEY -#CREATURE:FORGOTTEN_BEAST_621:MUSCLE - CREATURE:FORGOTTEN_BEAST_621:EYE -"CREATURE:FORGOTTEN_BEAST_621:BRAIN -!CREATURE:FORGOTTEN_BEAST_621:LUNG -"CREATURE:FORGOTTEN_BEAST_621:HEART -"CREATURE:FORGOTTEN_BEAST_621:LIVER - CREATURE:FORGOTTEN_BEAST_621:GUT -$CREATURE:FORGOTTEN_BEAST_621:STOMACH -$CREATURE:FORGOTTEN_BEAST_621:GIZZARD -%CREATURE:FORGOTTEN_BEAST_621:PANCREAS -#CREATURE:FORGOTTEN_BEAST_621:SPLEEN -#CREATURE:FORGOTTEN_BEAST_621:KIDNEY -#CREATURE:FORGOTTEN_BEAST_623:MUSCLE - CREATURE:FORGOTTEN_BEAST_623:EYE -"CREATURE:FORGOTTEN_BEAST_623:BRAIN -!CREATURE:FORGOTTEN_BEAST_623:LUNG -"CREATURE:FORGOTTEN_BEAST_623:HEART -"CREATURE:FORGOTTEN_BEAST_623:LIVER - CREATURE:FORGOTTEN_BEAST_623:GUT -$CREATURE:FORGOTTEN_BEAST_623:STOMACH -$CREATURE:FORGOTTEN_BEAST_623:GIZZARD -%CREATURE:FORGOTTEN_BEAST_623:PANCREAS -#CREATURE:FORGOTTEN_BEAST_623:SPLEEN -#CREATURE:FORGOTTEN_BEAST_623:KIDNEY -#CREATURE:FORGOTTEN_BEAST_624:MUSCLE - CREATURE:FORGOTTEN_BEAST_624:EYE -"CREATURE:FORGOTTEN_BEAST_624:BRAIN -!CREATURE:FORGOTTEN_BEAST_624:LUNG -"CREATURE:FORGOTTEN_BEAST_624:HEART -"CREATURE:FORGOTTEN_BEAST_624:LIVER - CREATURE:FORGOTTEN_BEAST_624:GUT -$CREATURE:FORGOTTEN_BEAST_624:STOMACH -$CREATURE:FORGOTTEN_BEAST_624:GIZZARD -%CREATURE:FORGOTTEN_BEAST_624:PANCREAS -#CREATURE:FORGOTTEN_BEAST_624:SPLEEN -#CREATURE:FORGOTTEN_BEAST_624:KIDNEY -#CREATURE:FORGOTTEN_BEAST_625:MUSCLE - CREATURE:FORGOTTEN_BEAST_625:EYE -"CREATURE:FORGOTTEN_BEAST_625:BRAIN -!CREATURE:FORGOTTEN_BEAST_625:LUNG -"CREATURE:FORGOTTEN_BEAST_625:HEART -"CREATURE:FORGOTTEN_BEAST_625:LIVER - CREATURE:FORGOTTEN_BEAST_625:GUT -$CREATURE:FORGOTTEN_BEAST_625:STOMACH -$CREATURE:FORGOTTEN_BEAST_625:GIZZARD -%CREATURE:FORGOTTEN_BEAST_625:PANCREAS -#CREATURE:FORGOTTEN_BEAST_625:SPLEEN -#CREATURE:FORGOTTEN_BEAST_625:KIDNEY -#CREATURE:FORGOTTEN_BEAST_626:MUSCLE - CREATURE:FORGOTTEN_BEAST_626:EYE -"CREATURE:FORGOTTEN_BEAST_626:BRAIN -!CREATURE:FORGOTTEN_BEAST_626:LUNG -"CREATURE:FORGOTTEN_BEAST_626:HEART -"CREATURE:FORGOTTEN_BEAST_626:LIVER - CREATURE:FORGOTTEN_BEAST_626:GUT -$CREATURE:FORGOTTEN_BEAST_626:STOMACH -$CREATURE:FORGOTTEN_BEAST_626:GIZZARD -%CREATURE:FORGOTTEN_BEAST_626:PANCREAS -#CREATURE:FORGOTTEN_BEAST_626:SPLEEN -#CREATURE:FORGOTTEN_BEAST_626:KIDNEY -#CREATURE:FORGOTTEN_BEAST_627:MUSCLE - CREATURE:FORGOTTEN_BEAST_627:EYE -"CREATURE:FORGOTTEN_BEAST_627:BRAIN -!CREATURE:FORGOTTEN_BEAST_627:LUNG -"CREATURE:FORGOTTEN_BEAST_627:HEART -"CREATURE:FORGOTTEN_BEAST_627:LIVER - CREATURE:FORGOTTEN_BEAST_627:GUT -$CREATURE:FORGOTTEN_BEAST_627:STOMACH -$CREATURE:FORGOTTEN_BEAST_627:GIZZARD -%CREATURE:FORGOTTEN_BEAST_627:PANCREAS -#CREATURE:FORGOTTEN_BEAST_627:SPLEEN -#CREATURE:FORGOTTEN_BEAST_627:KIDNEY -#CREATURE:FORGOTTEN_BEAST_628:MUSCLE - CREATURE:FORGOTTEN_BEAST_628:EYE -"CREATURE:FORGOTTEN_BEAST_628:BRAIN -!CREATURE:FORGOTTEN_BEAST_628:LUNG -"CREATURE:FORGOTTEN_BEAST_628:HEART -"CREATURE:FORGOTTEN_BEAST_628:LIVER - CREATURE:FORGOTTEN_BEAST_628:GUT -$CREATURE:FORGOTTEN_BEAST_628:STOMACH -$CREATURE:FORGOTTEN_BEAST_628:GIZZARD -%CREATURE:FORGOTTEN_BEAST_628:PANCREAS -#CREATURE:FORGOTTEN_BEAST_628:SPLEEN -#CREATURE:FORGOTTEN_BEAST_628:KIDNEY -#CREATURE:FORGOTTEN_BEAST_629:MUSCLE - CREATURE:FORGOTTEN_BEAST_629:EYE -"CREATURE:FORGOTTEN_BEAST_629:BRAIN -!CREATURE:FORGOTTEN_BEAST_629:LUNG -"CREATURE:FORGOTTEN_BEAST_629:HEART -"CREATURE:FORGOTTEN_BEAST_629:LIVER - CREATURE:FORGOTTEN_BEAST_629:GUT -$CREATURE:FORGOTTEN_BEAST_629:STOMACH -$CREATURE:FORGOTTEN_BEAST_629:GIZZARD -%CREATURE:FORGOTTEN_BEAST_629:PANCREAS -#CREATURE:FORGOTTEN_BEAST_629:SPLEEN -#CREATURE:FORGOTTEN_BEAST_629:KIDNEY -#CREATURE:FORGOTTEN_BEAST_630:MUSCLE - CREATURE:FORGOTTEN_BEAST_630:EYE -"CREATURE:FORGOTTEN_BEAST_630:BRAIN -!CREATURE:FORGOTTEN_BEAST_630:LUNG -"CREATURE:FORGOTTEN_BEAST_630:HEART -"CREATURE:FORGOTTEN_BEAST_630:LIVER - CREATURE:FORGOTTEN_BEAST_630:GUT -$CREATURE:FORGOTTEN_BEAST_630:STOMACH -$CREATURE:FORGOTTEN_BEAST_630:GIZZARD -%CREATURE:FORGOTTEN_BEAST_630:PANCREAS -#CREATURE:FORGOTTEN_BEAST_630:SPLEEN -#CREATURE:FORGOTTEN_BEAST_630:KIDNEY -#CREATURE:FORGOTTEN_BEAST_631:MUSCLE - CREATURE:FORGOTTEN_BEAST_631:EYE -"CREATURE:FORGOTTEN_BEAST_631:BRAIN -!CREATURE:FORGOTTEN_BEAST_631:LUNG -"CREATURE:FORGOTTEN_BEAST_631:HEART -"CREATURE:FORGOTTEN_BEAST_631:LIVER - CREATURE:FORGOTTEN_BEAST_631:GUT -$CREATURE:FORGOTTEN_BEAST_631:STOMACH -$CREATURE:FORGOTTEN_BEAST_631:GIZZARD -%CREATURE:FORGOTTEN_BEAST_631:PANCREAS -#CREATURE:FORGOTTEN_BEAST_631:SPLEEN -#CREATURE:FORGOTTEN_BEAST_631:KIDNEY -#CREATURE:FORGOTTEN_BEAST_632:MUSCLE - CREATURE:FORGOTTEN_BEAST_632:EYE -"CREATURE:FORGOTTEN_BEAST_632:BRAIN -!CREATURE:FORGOTTEN_BEAST_632:LUNG -"CREATURE:FORGOTTEN_BEAST_632:HEART -"CREATURE:FORGOTTEN_BEAST_632:LIVER - CREATURE:FORGOTTEN_BEAST_632:GUT -$CREATURE:FORGOTTEN_BEAST_632:STOMACH -$CREATURE:FORGOTTEN_BEAST_632:GIZZARD -%CREATURE:FORGOTTEN_BEAST_632:PANCREAS -#CREATURE:FORGOTTEN_BEAST_632:SPLEEN -#CREATURE:FORGOTTEN_BEAST_632:KIDNEY -#CREATURE:FORGOTTEN_BEAST_633:MUSCLE - CREATURE:FORGOTTEN_BEAST_633:EYE -"CREATURE:FORGOTTEN_BEAST_633:BRAIN -!CREATURE:FORGOTTEN_BEAST_633:LUNG -"CREATURE:FORGOTTEN_BEAST_633:HEART -"CREATURE:FORGOTTEN_BEAST_633:LIVER - CREATURE:FORGOTTEN_BEAST_633:GUT -$CREATURE:FORGOTTEN_BEAST_633:STOMACH -$CREATURE:FORGOTTEN_BEAST_633:GIZZARD -%CREATURE:FORGOTTEN_BEAST_633:PANCREAS -#CREATURE:FORGOTTEN_BEAST_633:SPLEEN -#CREATURE:FORGOTTEN_BEAST_633:KIDNEY -#CREATURE:FORGOTTEN_BEAST_634:MUSCLE - CREATURE:FORGOTTEN_BEAST_634:EYE -"CREATURE:FORGOTTEN_BEAST_634:BRAIN -!CREATURE:FORGOTTEN_BEAST_634:LUNG -"CREATURE:FORGOTTEN_BEAST_634:HEART -"CREATURE:FORGOTTEN_BEAST_634:LIVER - CREATURE:FORGOTTEN_BEAST_634:GUT -$CREATURE:FORGOTTEN_BEAST_634:STOMACH -$CREATURE:FORGOTTEN_BEAST_634:GIZZARD -%CREATURE:FORGOTTEN_BEAST_634:PANCREAS -#CREATURE:FORGOTTEN_BEAST_634:SPLEEN -#CREATURE:FORGOTTEN_BEAST_634:KIDNEY -#CREATURE:FORGOTTEN_BEAST_635:MUSCLE - CREATURE:FORGOTTEN_BEAST_635:EYE -"CREATURE:FORGOTTEN_BEAST_635:BRAIN -!CREATURE:FORGOTTEN_BEAST_635:LUNG -"CREATURE:FORGOTTEN_BEAST_635:HEART -"CREATURE:FORGOTTEN_BEAST_635:LIVER - CREATURE:FORGOTTEN_BEAST_635:GUT -$CREATURE:FORGOTTEN_BEAST_635:STOMACH -$CREATURE:FORGOTTEN_BEAST_635:GIZZARD -%CREATURE:FORGOTTEN_BEAST_635:PANCREAS -#CREATURE:FORGOTTEN_BEAST_635:SPLEEN -#CREATURE:FORGOTTEN_BEAST_635:KIDNEY -#CREATURE:FORGOTTEN_BEAST_636:MUSCLE - CREATURE:FORGOTTEN_BEAST_636:EYE -"CREATURE:FORGOTTEN_BEAST_636:BRAIN -!CREATURE:FORGOTTEN_BEAST_636:LUNG -"CREATURE:FORGOTTEN_BEAST_636:HEART -"CREATURE:FORGOTTEN_BEAST_636:LIVER - CREATURE:FORGOTTEN_BEAST_636:GUT -$CREATURE:FORGOTTEN_BEAST_636:STOMACH -$CREATURE:FORGOTTEN_BEAST_636:GIZZARD -%CREATURE:FORGOTTEN_BEAST_636:PANCREAS -#CREATURE:FORGOTTEN_BEAST_636:SPLEEN -#CREATURE:FORGOTTEN_BEAST_636:KIDNEY -#CREATURE:FORGOTTEN_BEAST_637:MUSCLE - CREATURE:FORGOTTEN_BEAST_637:EYE -"CREATURE:FORGOTTEN_BEAST_637:BRAIN -!CREATURE:FORGOTTEN_BEAST_637:LUNG -"CREATURE:FORGOTTEN_BEAST_637:HEART -"CREATURE:FORGOTTEN_BEAST_637:LIVER - CREATURE:FORGOTTEN_BEAST_637:GUT -$CREATURE:FORGOTTEN_BEAST_637:STOMACH -$CREATURE:FORGOTTEN_BEAST_637:GIZZARD -%CREATURE:FORGOTTEN_BEAST_637:PANCREAS -#CREATURE:FORGOTTEN_BEAST_637:SPLEEN -#CREATURE:FORGOTTEN_BEAST_637:KIDNEY -#CREATURE:FORGOTTEN_BEAST_639:MUSCLE - CREATURE:FORGOTTEN_BEAST_639:EYE -"CREATURE:FORGOTTEN_BEAST_639:BRAIN -!CREATURE:FORGOTTEN_BEAST_639:LUNG -"CREATURE:FORGOTTEN_BEAST_639:HEART -"CREATURE:FORGOTTEN_BEAST_639:LIVER - CREATURE:FORGOTTEN_BEAST_639:GUT -$CREATURE:FORGOTTEN_BEAST_639:STOMACH -$CREATURE:FORGOTTEN_BEAST_639:GIZZARD -%CREATURE:FORGOTTEN_BEAST_639:PANCREAS -#CREATURE:FORGOTTEN_BEAST_639:SPLEEN -#CREATURE:FORGOTTEN_BEAST_639:KIDNEY -#CREATURE:FORGOTTEN_BEAST_640:MUSCLE - CREATURE:FORGOTTEN_BEAST_640:EYE -"CREATURE:FORGOTTEN_BEAST_640:BRAIN -!CREATURE:FORGOTTEN_BEAST_640:LUNG -"CREATURE:FORGOTTEN_BEAST_640:HEART -"CREATURE:FORGOTTEN_BEAST_640:LIVER - CREATURE:FORGOTTEN_BEAST_640:GUT -$CREATURE:FORGOTTEN_BEAST_640:STOMACH -$CREATURE:FORGOTTEN_BEAST_640:GIZZARD -%CREATURE:FORGOTTEN_BEAST_640:PANCREAS -#CREATURE:FORGOTTEN_BEAST_640:SPLEEN -#CREATURE:FORGOTTEN_BEAST_640:KIDNEY -#CREATURE:FORGOTTEN_BEAST_643:MUSCLE - CREATURE:FORGOTTEN_BEAST_643:EYE -"CREATURE:FORGOTTEN_BEAST_643:BRAIN -!CREATURE:FORGOTTEN_BEAST_643:LUNG -"CREATURE:FORGOTTEN_BEAST_643:HEART -"CREATURE:FORGOTTEN_BEAST_643:LIVER - CREATURE:FORGOTTEN_BEAST_643:GUT -$CREATURE:FORGOTTEN_BEAST_643:STOMACH -$CREATURE:FORGOTTEN_BEAST_643:GIZZARD -%CREATURE:FORGOTTEN_BEAST_643:PANCREAS -#CREATURE:FORGOTTEN_BEAST_643:SPLEEN -#CREATURE:FORGOTTEN_BEAST_643:KIDNEY -#CREATURE:FORGOTTEN_BEAST_644:MUSCLE - CREATURE:FORGOTTEN_BEAST_644:EYE -"CREATURE:FORGOTTEN_BEAST_644:BRAIN -!CREATURE:FORGOTTEN_BEAST_644:LUNG -"CREATURE:FORGOTTEN_BEAST_644:HEART -"CREATURE:FORGOTTEN_BEAST_644:LIVER - CREATURE:FORGOTTEN_BEAST_644:GUT -$CREATURE:FORGOTTEN_BEAST_644:STOMACH -$CREATURE:FORGOTTEN_BEAST_644:GIZZARD -%CREATURE:FORGOTTEN_BEAST_644:PANCREAS -#CREATURE:FORGOTTEN_BEAST_644:SPLEEN -#CREATURE:FORGOTTEN_BEAST_644:KIDNEY -#CREATURE:FORGOTTEN_BEAST_645:MUSCLE - CREATURE:FORGOTTEN_BEAST_645:EYE -"CREATURE:FORGOTTEN_BEAST_645:BRAIN -!CREATURE:FORGOTTEN_BEAST_645:LUNG -"CREATURE:FORGOTTEN_BEAST_645:HEART -"CREATURE:FORGOTTEN_BEAST_645:LIVER - CREATURE:FORGOTTEN_BEAST_645:GUT -$CREATURE:FORGOTTEN_BEAST_645:STOMACH -$CREATURE:FORGOTTEN_BEAST_645:GIZZARD -%CREATURE:FORGOTTEN_BEAST_645:PANCREAS -#CREATURE:FORGOTTEN_BEAST_645:SPLEEN -#CREATURE:FORGOTTEN_BEAST_645:KIDNEY -#CREATURE:FORGOTTEN_BEAST_646:MUSCLE - CREATURE:FORGOTTEN_BEAST_646:EYE -"CREATURE:FORGOTTEN_BEAST_646:BRAIN -!CREATURE:FORGOTTEN_BEAST_646:LUNG -"CREATURE:FORGOTTEN_BEAST_646:HEART -"CREATURE:FORGOTTEN_BEAST_646:LIVER - CREATURE:FORGOTTEN_BEAST_646:GUT -$CREATURE:FORGOTTEN_BEAST_646:STOMACH -$CREATURE:FORGOTTEN_BEAST_646:GIZZARD -%CREATURE:FORGOTTEN_BEAST_646:PANCREAS -#CREATURE:FORGOTTEN_BEAST_646:SPLEEN -#CREATURE:FORGOTTEN_BEAST_646:KIDNEY -#CREATURE:FORGOTTEN_BEAST_647:MUSCLE - CREATURE:FORGOTTEN_BEAST_647:EYE -"CREATURE:FORGOTTEN_BEAST_647:BRAIN -!CREATURE:FORGOTTEN_BEAST_647:LUNG -"CREATURE:FORGOTTEN_BEAST_647:HEART -"CREATURE:FORGOTTEN_BEAST_647:LIVER - CREATURE:FORGOTTEN_BEAST_647:GUT -$CREATURE:FORGOTTEN_BEAST_647:STOMACH -$CREATURE:FORGOTTEN_BEAST_647:GIZZARD -%CREATURE:FORGOTTEN_BEAST_647:PANCREAS -#CREATURE:FORGOTTEN_BEAST_647:SPLEEN -#CREATURE:FORGOTTEN_BEAST_647:KIDNEY -#CREATURE:FORGOTTEN_BEAST_649:MUSCLE - CREATURE:FORGOTTEN_BEAST_649:EYE -"CREATURE:FORGOTTEN_BEAST_649:BRAIN -!CREATURE:FORGOTTEN_BEAST_649:LUNG -"CREATURE:FORGOTTEN_BEAST_649:HEART -"CREATURE:FORGOTTEN_BEAST_649:LIVER - CREATURE:FORGOTTEN_BEAST_649:GUT -$CREATURE:FORGOTTEN_BEAST_649:STOMACH -$CREATURE:FORGOTTEN_BEAST_649:GIZZARD -%CREATURE:FORGOTTEN_BEAST_649:PANCREAS -#CREATURE:FORGOTTEN_BEAST_649:SPLEEN -#CREATURE:FORGOTTEN_BEAST_649:KIDNEY -#CREATURE:FORGOTTEN_BEAST_650:MUSCLE - CREATURE:FORGOTTEN_BEAST_650:EYE -"CREATURE:FORGOTTEN_BEAST_650:BRAIN -!CREATURE:FORGOTTEN_BEAST_650:LUNG -"CREATURE:FORGOTTEN_BEAST_650:HEART -"CREATURE:FORGOTTEN_BEAST_650:LIVER - CREATURE:FORGOTTEN_BEAST_650:GUT -$CREATURE:FORGOTTEN_BEAST_650:STOMACH -$CREATURE:FORGOTTEN_BEAST_650:GIZZARD -%CREATURE:FORGOTTEN_BEAST_650:PANCREAS -#CREATURE:FORGOTTEN_BEAST_650:SPLEEN -#CREATURE:FORGOTTEN_BEAST_650:KIDNEY -#CREATURE:FORGOTTEN_BEAST_651:MUSCLE - CREATURE:FORGOTTEN_BEAST_651:EYE -"CREATURE:FORGOTTEN_BEAST_651:BRAIN -!CREATURE:FORGOTTEN_BEAST_651:LUNG -"CREATURE:FORGOTTEN_BEAST_651:HEART -"CREATURE:FORGOTTEN_BEAST_651:LIVER - CREATURE:FORGOTTEN_BEAST_651:GUT -$CREATURE:FORGOTTEN_BEAST_651:STOMACH -$CREATURE:FORGOTTEN_BEAST_651:GIZZARD -%CREATURE:FORGOTTEN_BEAST_651:PANCREAS -#CREATURE:FORGOTTEN_BEAST_651:SPLEEN -#CREATURE:FORGOTTEN_BEAST_651:KIDNEY -#CREATURE:FORGOTTEN_BEAST_652:MUSCLE - CREATURE:FORGOTTEN_BEAST_652:EYE -"CREATURE:FORGOTTEN_BEAST_652:BRAIN -!CREATURE:FORGOTTEN_BEAST_652:LUNG -"CREATURE:FORGOTTEN_BEAST_652:HEART -"CREATURE:FORGOTTEN_BEAST_652:LIVER - CREATURE:FORGOTTEN_BEAST_652:GUT -$CREATURE:FORGOTTEN_BEAST_652:STOMACH -$CREATURE:FORGOTTEN_BEAST_652:GIZZARD -%CREATURE:FORGOTTEN_BEAST_652:PANCREAS -#CREATURE:FORGOTTEN_BEAST_652:SPLEEN -#CREATURE:FORGOTTEN_BEAST_652:KIDNEY -#CREATURE:FORGOTTEN_BEAST_656:MUSCLE - CREATURE:FORGOTTEN_BEAST_656:EYE -"CREATURE:FORGOTTEN_BEAST_656:BRAIN -!CREATURE:FORGOTTEN_BEAST_656:LUNG -"CREATURE:FORGOTTEN_BEAST_656:HEART -"CREATURE:FORGOTTEN_BEAST_656:LIVER - CREATURE:FORGOTTEN_BEAST_656:GUT -$CREATURE:FORGOTTEN_BEAST_656:STOMACH -$CREATURE:FORGOTTEN_BEAST_656:GIZZARD -%CREATURE:FORGOTTEN_BEAST_656:PANCREAS -#CREATURE:FORGOTTEN_BEAST_656:SPLEEN -#CREATURE:FORGOTTEN_BEAST_656:KIDNEY -#CREATURE:FORGOTTEN_BEAST_658:MUSCLE - CREATURE:FORGOTTEN_BEAST_658:EYE -"CREATURE:FORGOTTEN_BEAST_658:BRAIN -!CREATURE:FORGOTTEN_BEAST_658:LUNG -"CREATURE:FORGOTTEN_BEAST_658:HEART -"CREATURE:FORGOTTEN_BEAST_658:LIVER - CREATURE:FORGOTTEN_BEAST_658:GUT -$CREATURE:FORGOTTEN_BEAST_658:STOMACH -$CREATURE:FORGOTTEN_BEAST_658:GIZZARD -%CREATURE:FORGOTTEN_BEAST_658:PANCREAS -#CREATURE:FORGOTTEN_BEAST_658:SPLEEN -#CREATURE:FORGOTTEN_BEAST_658:KIDNEY -#CREATURE:FORGOTTEN_BEAST_659:MUSCLE - CREATURE:FORGOTTEN_BEAST_659:EYE -"CREATURE:FORGOTTEN_BEAST_659:BRAIN -!CREATURE:FORGOTTEN_BEAST_659:LUNG -"CREATURE:FORGOTTEN_BEAST_659:HEART -"CREATURE:FORGOTTEN_BEAST_659:LIVER - CREATURE:FORGOTTEN_BEAST_659:GUT -$CREATURE:FORGOTTEN_BEAST_659:STOMACH -$CREATURE:FORGOTTEN_BEAST_659:GIZZARD -%CREATURE:FORGOTTEN_BEAST_659:PANCREAS -#CREATURE:FORGOTTEN_BEAST_659:SPLEEN -#CREATURE:FORGOTTEN_BEAST_659:KIDNEY -#CREATURE:FORGOTTEN_BEAST_661:MUSCLE - CREATURE:FORGOTTEN_BEAST_661:EYE -"CREATURE:FORGOTTEN_BEAST_661:BRAIN -!CREATURE:FORGOTTEN_BEAST_661:LUNG -"CREATURE:FORGOTTEN_BEAST_661:HEART -"CREATURE:FORGOTTEN_BEAST_661:LIVER - CREATURE:FORGOTTEN_BEAST_661:GUT -$CREATURE:FORGOTTEN_BEAST_661:STOMACH -$CREATURE:FORGOTTEN_BEAST_661:GIZZARD -%CREATURE:FORGOTTEN_BEAST_661:PANCREAS -#CREATURE:FORGOTTEN_BEAST_661:SPLEEN -#CREATURE:FORGOTTEN_BEAST_661:KIDNEY -#CREATURE:FORGOTTEN_BEAST_663:MUSCLE - CREATURE:FORGOTTEN_BEAST_663:EYE -"CREATURE:FORGOTTEN_BEAST_663:BRAIN -!CREATURE:FORGOTTEN_BEAST_663:LUNG -"CREATURE:FORGOTTEN_BEAST_663:HEART -"CREATURE:FORGOTTEN_BEAST_663:LIVER - CREATURE:FORGOTTEN_BEAST_663:GUT -$CREATURE:FORGOTTEN_BEAST_663:STOMACH -$CREATURE:FORGOTTEN_BEAST_663:GIZZARD -%CREATURE:FORGOTTEN_BEAST_663:PANCREAS -#CREATURE:FORGOTTEN_BEAST_663:SPLEEN -#CREATURE:FORGOTTEN_BEAST_663:KIDNEY -#CREATURE:FORGOTTEN_BEAST_664:MUSCLE - CREATURE:FORGOTTEN_BEAST_664:EYE -"CREATURE:FORGOTTEN_BEAST_664:BRAIN -!CREATURE:FORGOTTEN_BEAST_664:LUNG -"CREATURE:FORGOTTEN_BEAST_664:HEART -"CREATURE:FORGOTTEN_BEAST_664:LIVER - CREATURE:FORGOTTEN_BEAST_664:GUT -$CREATURE:FORGOTTEN_BEAST_664:STOMACH -$CREATURE:FORGOTTEN_BEAST_664:GIZZARD -%CREATURE:FORGOTTEN_BEAST_664:PANCREAS -#CREATURE:FORGOTTEN_BEAST_664:SPLEEN -#CREATURE:FORGOTTEN_BEAST_664:KIDNEY -#CREATURE:FORGOTTEN_BEAST_666:MUSCLE - CREATURE:FORGOTTEN_BEAST_666:EYE -"CREATURE:FORGOTTEN_BEAST_666:BRAIN -!CREATURE:FORGOTTEN_BEAST_666:LUNG -"CREATURE:FORGOTTEN_BEAST_666:HEART -"CREATURE:FORGOTTEN_BEAST_666:LIVER - CREATURE:FORGOTTEN_BEAST_666:GUT -$CREATURE:FORGOTTEN_BEAST_666:STOMACH -$CREATURE:FORGOTTEN_BEAST_666:GIZZARD -%CREATURE:FORGOTTEN_BEAST_666:PANCREAS -#CREATURE:FORGOTTEN_BEAST_666:SPLEEN -#CREATURE:FORGOTTEN_BEAST_666:KIDNEY -#CREATURE:FORGOTTEN_BEAST_667:MUSCLE - CREATURE:FORGOTTEN_BEAST_667:EYE -"CREATURE:FORGOTTEN_BEAST_667:BRAIN -!CREATURE:FORGOTTEN_BEAST_667:LUNG -"CREATURE:FORGOTTEN_BEAST_667:HEART -"CREATURE:FORGOTTEN_BEAST_667:LIVER - CREATURE:FORGOTTEN_BEAST_667:GUT -$CREATURE:FORGOTTEN_BEAST_667:STOMACH -$CREATURE:FORGOTTEN_BEAST_667:GIZZARD -%CREATURE:FORGOTTEN_BEAST_667:PANCREAS -#CREATURE:FORGOTTEN_BEAST_667:SPLEEN -#CREATURE:FORGOTTEN_BEAST_667:KIDNEY -#CREATURE:FORGOTTEN_BEAST_669:MUSCLE - CREATURE:FORGOTTEN_BEAST_669:EYE -"CREATURE:FORGOTTEN_BEAST_669:BRAIN -!CREATURE:FORGOTTEN_BEAST_669:LUNG -"CREATURE:FORGOTTEN_BEAST_669:HEART -"CREATURE:FORGOTTEN_BEAST_669:LIVER - CREATURE:FORGOTTEN_BEAST_669:GUT -$CREATURE:FORGOTTEN_BEAST_669:STOMACH -$CREATURE:FORGOTTEN_BEAST_669:GIZZARD -%CREATURE:FORGOTTEN_BEAST_669:PANCREAS -#CREATURE:FORGOTTEN_BEAST_669:SPLEEN -#CREATURE:FORGOTTEN_BEAST_669:KIDNEY -#CREATURE:FORGOTTEN_BEAST_670:MUSCLE - CREATURE:FORGOTTEN_BEAST_670:EYE -"CREATURE:FORGOTTEN_BEAST_670:BRAIN -!CREATURE:FORGOTTEN_BEAST_670:LUNG -"CREATURE:FORGOTTEN_BEAST_670:HEART -"CREATURE:FORGOTTEN_BEAST_670:LIVER - CREATURE:FORGOTTEN_BEAST_670:GUT -$CREATURE:FORGOTTEN_BEAST_670:STOMACH -$CREATURE:FORGOTTEN_BEAST_670:GIZZARD -%CREATURE:FORGOTTEN_BEAST_670:PANCREAS -#CREATURE:FORGOTTEN_BEAST_670:SPLEEN -#CREATURE:FORGOTTEN_BEAST_670:KIDNEY -#CREATURE:FORGOTTEN_BEAST_671:MUSCLE - CREATURE:FORGOTTEN_BEAST_671:EYE -"CREATURE:FORGOTTEN_BEAST_671:BRAIN -!CREATURE:FORGOTTEN_BEAST_671:LUNG -"CREATURE:FORGOTTEN_BEAST_671:HEART -"CREATURE:FORGOTTEN_BEAST_671:LIVER - CREATURE:FORGOTTEN_BEAST_671:GUT -$CREATURE:FORGOTTEN_BEAST_671:STOMACH -$CREATURE:FORGOTTEN_BEAST_671:GIZZARD -%CREATURE:FORGOTTEN_BEAST_671:PANCREAS -#CREATURE:FORGOTTEN_BEAST_671:SPLEEN -#CREATURE:FORGOTTEN_BEAST_671:KIDNEY -#CREATURE:FORGOTTEN_BEAST_674:MUSCLE - CREATURE:FORGOTTEN_BEAST_674:EYE -"CREATURE:FORGOTTEN_BEAST_674:BRAIN -!CREATURE:FORGOTTEN_BEAST_674:LUNG -"CREATURE:FORGOTTEN_BEAST_674:HEART -"CREATURE:FORGOTTEN_BEAST_674:LIVER - CREATURE:FORGOTTEN_BEAST_674:GUT -$CREATURE:FORGOTTEN_BEAST_674:STOMACH -$CREATURE:FORGOTTEN_BEAST_674:GIZZARD -%CREATURE:FORGOTTEN_BEAST_674:PANCREAS -#CREATURE:FORGOTTEN_BEAST_674:SPLEEN -#CREATURE:FORGOTTEN_BEAST_674:KIDNEY -#CREATURE:FORGOTTEN_BEAST_675:MUSCLE - CREATURE:FORGOTTEN_BEAST_675:EYE -"CREATURE:FORGOTTEN_BEAST_675:BRAIN -!CREATURE:FORGOTTEN_BEAST_675:LUNG -"CREATURE:FORGOTTEN_BEAST_675:HEART -"CREATURE:FORGOTTEN_BEAST_675:LIVER - CREATURE:FORGOTTEN_BEAST_675:GUT -$CREATURE:FORGOTTEN_BEAST_675:STOMACH -$CREATURE:FORGOTTEN_BEAST_675:GIZZARD -%CREATURE:FORGOTTEN_BEAST_675:PANCREAS -#CREATURE:FORGOTTEN_BEAST_675:SPLEEN -#CREATURE:FORGOTTEN_BEAST_675:KIDNEY -#CREATURE:FORGOTTEN_BEAST_678:MUSCLE - CREATURE:FORGOTTEN_BEAST_678:EYE -"CREATURE:FORGOTTEN_BEAST_678:BRAIN -!CREATURE:FORGOTTEN_BEAST_678:LUNG -"CREATURE:FORGOTTEN_BEAST_678:HEART -"CREATURE:FORGOTTEN_BEAST_678:LIVER - CREATURE:FORGOTTEN_BEAST_678:GUT -$CREATURE:FORGOTTEN_BEAST_678:STOMACH -$CREATURE:FORGOTTEN_BEAST_678:GIZZARD -%CREATURE:FORGOTTEN_BEAST_678:PANCREAS -#CREATURE:FORGOTTEN_BEAST_678:SPLEEN -#CREATURE:FORGOTTEN_BEAST_678:KIDNEY -#CREATURE:FORGOTTEN_BEAST_680:MUSCLE - CREATURE:FORGOTTEN_BEAST_680:EYE -"CREATURE:FORGOTTEN_BEAST_680:BRAIN -!CREATURE:FORGOTTEN_BEAST_680:LUNG -"CREATURE:FORGOTTEN_BEAST_680:HEART -"CREATURE:FORGOTTEN_BEAST_680:LIVER - CREATURE:FORGOTTEN_BEAST_680:GUT -$CREATURE:FORGOTTEN_BEAST_680:STOMACH -$CREATURE:FORGOTTEN_BEAST_680:GIZZARD -%CREATURE:FORGOTTEN_BEAST_680:PANCREAS -#CREATURE:FORGOTTEN_BEAST_680:SPLEEN -#CREATURE:FORGOTTEN_BEAST_680:KIDNEY -#CREATURE:FORGOTTEN_BEAST_681:MUSCLE - CREATURE:FORGOTTEN_BEAST_681:EYE -"CREATURE:FORGOTTEN_BEAST_681:BRAIN -!CREATURE:FORGOTTEN_BEAST_681:LUNG -"CREATURE:FORGOTTEN_BEAST_681:HEART -"CREATURE:FORGOTTEN_BEAST_681:LIVER - CREATURE:FORGOTTEN_BEAST_681:GUT -$CREATURE:FORGOTTEN_BEAST_681:STOMACH -$CREATURE:FORGOTTEN_BEAST_681:GIZZARD -%CREATURE:FORGOTTEN_BEAST_681:PANCREAS -#CREATURE:FORGOTTEN_BEAST_681:SPLEEN -#CREATURE:FORGOTTEN_BEAST_681:KIDNEY -#CREATURE:FORGOTTEN_BEAST_682:MUSCLE - CREATURE:FORGOTTEN_BEAST_682:EYE -"CREATURE:FORGOTTEN_BEAST_682:BRAIN -!CREATURE:FORGOTTEN_BEAST_682:LUNG -"CREATURE:FORGOTTEN_BEAST_682:HEART -"CREATURE:FORGOTTEN_BEAST_682:LIVER - CREATURE:FORGOTTEN_BEAST_682:GUT -$CREATURE:FORGOTTEN_BEAST_682:STOMACH -$CREATURE:FORGOTTEN_BEAST_682:GIZZARD -%CREATURE:FORGOTTEN_BEAST_682:PANCREAS -#CREATURE:FORGOTTEN_BEAST_682:SPLEEN -#CREATURE:FORGOTTEN_BEAST_682:KIDNEY -#CREATURE:FORGOTTEN_BEAST_684:MUSCLE - CREATURE:FORGOTTEN_BEAST_684:EYE -"CREATURE:FORGOTTEN_BEAST_684:BRAIN -!CREATURE:FORGOTTEN_BEAST_684:LUNG -"CREATURE:FORGOTTEN_BEAST_684:HEART -"CREATURE:FORGOTTEN_BEAST_684:LIVER - CREATURE:FORGOTTEN_BEAST_684:GUT -$CREATURE:FORGOTTEN_BEAST_684:STOMACH -$CREATURE:FORGOTTEN_BEAST_684:GIZZARD -%CREATURE:FORGOTTEN_BEAST_684:PANCREAS -#CREATURE:FORGOTTEN_BEAST_684:SPLEEN -#CREATURE:FORGOTTEN_BEAST_684:KIDNEY -#CREATURE:FORGOTTEN_BEAST_685:MUSCLE - CREATURE:FORGOTTEN_BEAST_685:EYE -"CREATURE:FORGOTTEN_BEAST_685:BRAIN -!CREATURE:FORGOTTEN_BEAST_685:LUNG -"CREATURE:FORGOTTEN_BEAST_685:HEART -"CREATURE:FORGOTTEN_BEAST_685:LIVER - CREATURE:FORGOTTEN_BEAST_685:GUT -$CREATURE:FORGOTTEN_BEAST_685:STOMACH -$CREATURE:FORGOTTEN_BEAST_685:GIZZARD -%CREATURE:FORGOTTEN_BEAST_685:PANCREAS -#CREATURE:FORGOTTEN_BEAST_685:SPLEEN -#CREATURE:FORGOTTEN_BEAST_685:KIDNEY -#CREATURE:FORGOTTEN_BEAST_686:MUSCLE - CREATURE:FORGOTTEN_BEAST_686:EYE -"CREATURE:FORGOTTEN_BEAST_686:BRAIN -!CREATURE:FORGOTTEN_BEAST_686:LUNG -"CREATURE:FORGOTTEN_BEAST_686:HEART -"CREATURE:FORGOTTEN_BEAST_686:LIVER - CREATURE:FORGOTTEN_BEAST_686:GUT -$CREATURE:FORGOTTEN_BEAST_686:STOMACH -$CREATURE:FORGOTTEN_BEAST_686:GIZZARD -%CREATURE:FORGOTTEN_BEAST_686:PANCREAS -#CREATURE:FORGOTTEN_BEAST_686:SPLEEN -#CREATURE:FORGOTTEN_BEAST_686:KIDNEY -#CREATURE:FORGOTTEN_BEAST_687:MUSCLE - CREATURE:FORGOTTEN_BEAST_687:EYE -"CREATURE:FORGOTTEN_BEAST_687:BRAIN -!CREATURE:FORGOTTEN_BEAST_687:LUNG -"CREATURE:FORGOTTEN_BEAST_687:HEART -"CREATURE:FORGOTTEN_BEAST_687:LIVER - CREATURE:FORGOTTEN_BEAST_687:GUT -$CREATURE:FORGOTTEN_BEAST_687:STOMACH -$CREATURE:FORGOTTEN_BEAST_687:GIZZARD -%CREATURE:FORGOTTEN_BEAST_687:PANCREAS -#CREATURE:FORGOTTEN_BEAST_687:SPLEEN -#CREATURE:FORGOTTEN_BEAST_687:KIDNEY -#CREATURE:FORGOTTEN_BEAST_688:MUSCLE - CREATURE:FORGOTTEN_BEAST_688:EYE -"CREATURE:FORGOTTEN_BEAST_688:BRAIN -!CREATURE:FORGOTTEN_BEAST_688:LUNG -"CREATURE:FORGOTTEN_BEAST_688:HEART -"CREATURE:FORGOTTEN_BEAST_688:LIVER - CREATURE:FORGOTTEN_BEAST_688:GUT -$CREATURE:FORGOTTEN_BEAST_688:STOMACH -$CREATURE:FORGOTTEN_BEAST_688:GIZZARD -%CREATURE:FORGOTTEN_BEAST_688:PANCREAS -#CREATURE:FORGOTTEN_BEAST_688:SPLEEN -#CREATURE:FORGOTTEN_BEAST_688:KIDNEY -#CREATURE:FORGOTTEN_BEAST_689:MUSCLE - CREATURE:FORGOTTEN_BEAST_689:EYE -"CREATURE:FORGOTTEN_BEAST_689:BRAIN -!CREATURE:FORGOTTEN_BEAST_689:LUNG -"CREATURE:FORGOTTEN_BEAST_689:HEART -"CREATURE:FORGOTTEN_BEAST_689:LIVER - CREATURE:FORGOTTEN_BEAST_689:GUT -$CREATURE:FORGOTTEN_BEAST_689:STOMACH -$CREATURE:FORGOTTEN_BEAST_689:GIZZARD -%CREATURE:FORGOTTEN_BEAST_689:PANCREAS -#CREATURE:FORGOTTEN_BEAST_689:SPLEEN -#CREATURE:FORGOTTEN_BEAST_689:KIDNEY -#CREATURE:FORGOTTEN_BEAST_691:MUSCLE - CREATURE:FORGOTTEN_BEAST_691:EYE -"CREATURE:FORGOTTEN_BEAST_691:BRAIN -!CREATURE:FORGOTTEN_BEAST_691:LUNG -"CREATURE:FORGOTTEN_BEAST_691:HEART -"CREATURE:FORGOTTEN_BEAST_691:LIVER - CREATURE:FORGOTTEN_BEAST_691:GUT -$CREATURE:FORGOTTEN_BEAST_691:STOMACH -$CREATURE:FORGOTTEN_BEAST_691:GIZZARD -%CREATURE:FORGOTTEN_BEAST_691:PANCREAS -#CREATURE:FORGOTTEN_BEAST_691:SPLEEN -#CREATURE:FORGOTTEN_BEAST_691:KIDNEY -#CREATURE:FORGOTTEN_BEAST_692:MUSCLE - CREATURE:FORGOTTEN_BEAST_692:EYE -"CREATURE:FORGOTTEN_BEAST_692:BRAIN -!CREATURE:FORGOTTEN_BEAST_692:LUNG -"CREATURE:FORGOTTEN_BEAST_692:HEART -"CREATURE:FORGOTTEN_BEAST_692:LIVER - CREATURE:FORGOTTEN_BEAST_692:GUT -$CREATURE:FORGOTTEN_BEAST_692:STOMACH -$CREATURE:FORGOTTEN_BEAST_692:GIZZARD -%CREATURE:FORGOTTEN_BEAST_692:PANCREAS -#CREATURE:FORGOTTEN_BEAST_692:SPLEEN -#CREATURE:FORGOTTEN_BEAST_692:KIDNEY -#CREATURE:FORGOTTEN_BEAST_695:MUSCLE - CREATURE:FORGOTTEN_BEAST_695:EYE -"CREATURE:FORGOTTEN_BEAST_695:BRAIN -!CREATURE:FORGOTTEN_BEAST_695:LUNG -"CREATURE:FORGOTTEN_BEAST_695:HEART -"CREATURE:FORGOTTEN_BEAST_695:LIVER - CREATURE:FORGOTTEN_BEAST_695:GUT -$CREATURE:FORGOTTEN_BEAST_695:STOMACH -$CREATURE:FORGOTTEN_BEAST_695:GIZZARD -%CREATURE:FORGOTTEN_BEAST_695:PANCREAS -#CREATURE:FORGOTTEN_BEAST_695:SPLEEN -#CREATURE:FORGOTTEN_BEAST_695:KIDNEY -#CREATURE:FORGOTTEN_BEAST_696:MUSCLE - CREATURE:FORGOTTEN_BEAST_696:EYE -"CREATURE:FORGOTTEN_BEAST_696:BRAIN -!CREATURE:FORGOTTEN_BEAST_696:LUNG -"CREATURE:FORGOTTEN_BEAST_696:HEART -"CREATURE:FORGOTTEN_BEAST_696:LIVER - CREATURE:FORGOTTEN_BEAST_696:GUT -$CREATURE:FORGOTTEN_BEAST_696:STOMACH -$CREATURE:FORGOTTEN_BEAST_696:GIZZARD -%CREATURE:FORGOTTEN_BEAST_696:PANCREAS -#CREATURE:FORGOTTEN_BEAST_696:SPLEEN -#CREATURE:FORGOTTEN_BEAST_696:KIDNEY -#CREATURE:FORGOTTEN_BEAST_697:MUSCLE - CREATURE:FORGOTTEN_BEAST_697:EYE -"CREATURE:FORGOTTEN_BEAST_697:BRAIN -!CREATURE:FORGOTTEN_BEAST_697:LUNG -"CREATURE:FORGOTTEN_BEAST_697:HEART -"CREATURE:FORGOTTEN_BEAST_697:LIVER - CREATURE:FORGOTTEN_BEAST_697:GUT -$CREATURE:FORGOTTEN_BEAST_697:STOMACH -$CREATURE:FORGOTTEN_BEAST_697:GIZZARD -%CREATURE:FORGOTTEN_BEAST_697:PANCREAS -#CREATURE:FORGOTTEN_BEAST_697:SPLEEN -#CREATURE:FORGOTTEN_BEAST_697:KIDNEY -#CREATURE:FORGOTTEN_BEAST_698:MUSCLE - CREATURE:FORGOTTEN_BEAST_698:EYE -"CREATURE:FORGOTTEN_BEAST_698:BRAIN -!CREATURE:FORGOTTEN_BEAST_698:LUNG -"CREATURE:FORGOTTEN_BEAST_698:HEART -"CREATURE:FORGOTTEN_BEAST_698:LIVER - CREATURE:FORGOTTEN_BEAST_698:GUT -$CREATURE:FORGOTTEN_BEAST_698:STOMACH -$CREATURE:FORGOTTEN_BEAST_698:GIZZARD -%CREATURE:FORGOTTEN_BEAST_698:PANCREAS -#CREATURE:FORGOTTEN_BEAST_698:SPLEEN -#CREATURE:FORGOTTEN_BEAST_698:KIDNEY -#CREATURE:FORGOTTEN_BEAST_699:MUSCLE - CREATURE:FORGOTTEN_BEAST_699:EYE -"CREATURE:FORGOTTEN_BEAST_699:BRAIN -!CREATURE:FORGOTTEN_BEAST_699:LUNG -"CREATURE:FORGOTTEN_BEAST_699:HEART -"CREATURE:FORGOTTEN_BEAST_699:LIVER - CREATURE:FORGOTTEN_BEAST_699:GUT -$CREATURE:FORGOTTEN_BEAST_699:STOMACH -$CREATURE:FORGOTTEN_BEAST_699:GIZZARD -%CREATURE:FORGOTTEN_BEAST_699:PANCREAS -#CREATURE:FORGOTTEN_BEAST_699:SPLEEN -#CREATURE:FORGOTTEN_BEAST_699:KIDNEY -#CREATURE:FORGOTTEN_BEAST_700:MUSCLE - CREATURE:FORGOTTEN_BEAST_700:EYE -"CREATURE:FORGOTTEN_BEAST_700:BRAIN -!CREATURE:FORGOTTEN_BEAST_700:LUNG -"CREATURE:FORGOTTEN_BEAST_700:HEART -"CREATURE:FORGOTTEN_BEAST_700:LIVER - CREATURE:FORGOTTEN_BEAST_700:GUT -$CREATURE:FORGOTTEN_BEAST_700:STOMACH -$CREATURE:FORGOTTEN_BEAST_700:GIZZARD -%CREATURE:FORGOTTEN_BEAST_700:PANCREAS -#CREATURE:FORGOTTEN_BEAST_700:SPLEEN -#CREATURE:FORGOTTEN_BEAST_700:KIDNEY -#CREATURE:FORGOTTEN_BEAST_701:MUSCLE - CREATURE:FORGOTTEN_BEAST_701:EYE -"CREATURE:FORGOTTEN_BEAST_701:BRAIN -!CREATURE:FORGOTTEN_BEAST_701:LUNG -"CREATURE:FORGOTTEN_BEAST_701:HEART -"CREATURE:FORGOTTEN_BEAST_701:LIVER - CREATURE:FORGOTTEN_BEAST_701:GUT -$CREATURE:FORGOTTEN_BEAST_701:STOMACH -$CREATURE:FORGOTTEN_BEAST_701:GIZZARD -%CREATURE:FORGOTTEN_BEAST_701:PANCREAS -#CREATURE:FORGOTTEN_BEAST_701:SPLEEN -#CREATURE:FORGOTTEN_BEAST_701:KIDNEY -#CREATURE:FORGOTTEN_BEAST_702:MUSCLE - CREATURE:FORGOTTEN_BEAST_702:EYE -"CREATURE:FORGOTTEN_BEAST_702:BRAIN -!CREATURE:FORGOTTEN_BEAST_702:LUNG -"CREATURE:FORGOTTEN_BEAST_702:HEART -"CREATURE:FORGOTTEN_BEAST_702:LIVER - CREATURE:FORGOTTEN_BEAST_702:GUT -$CREATURE:FORGOTTEN_BEAST_702:STOMACH -$CREATURE:FORGOTTEN_BEAST_702:GIZZARD -%CREATURE:FORGOTTEN_BEAST_702:PANCREAS -#CREATURE:FORGOTTEN_BEAST_702:SPLEEN -#CREATURE:FORGOTTEN_BEAST_702:KIDNEY -#CREATURE:FORGOTTEN_BEAST_704:MUSCLE - CREATURE:FORGOTTEN_BEAST_704:EYE -"CREATURE:FORGOTTEN_BEAST_704:BRAIN -!CREATURE:FORGOTTEN_BEAST_704:LUNG -"CREATURE:FORGOTTEN_BEAST_704:HEART -"CREATURE:FORGOTTEN_BEAST_704:LIVER - CREATURE:FORGOTTEN_BEAST_704:GUT -$CREATURE:FORGOTTEN_BEAST_704:STOMACH -$CREATURE:FORGOTTEN_BEAST_704:GIZZARD -%CREATURE:FORGOTTEN_BEAST_704:PANCREAS -#CREATURE:FORGOTTEN_BEAST_704:SPLEEN -#CREATURE:FORGOTTEN_BEAST_704:KIDNEY -#CREATURE:FORGOTTEN_BEAST_706:MUSCLE - CREATURE:FORGOTTEN_BEAST_706:EYE -"CREATURE:FORGOTTEN_BEAST_706:BRAIN -!CREATURE:FORGOTTEN_BEAST_706:LUNG -"CREATURE:FORGOTTEN_BEAST_706:HEART -"CREATURE:FORGOTTEN_BEAST_706:LIVER - CREATURE:FORGOTTEN_BEAST_706:GUT -$CREATURE:FORGOTTEN_BEAST_706:STOMACH -$CREATURE:FORGOTTEN_BEAST_706:GIZZARD -%CREATURE:FORGOTTEN_BEAST_706:PANCREAS -#CREATURE:FORGOTTEN_BEAST_706:SPLEEN -#CREATURE:FORGOTTEN_BEAST_706:KIDNEY -#CREATURE:FORGOTTEN_BEAST_708:MUSCLE - CREATURE:FORGOTTEN_BEAST_708:EYE -"CREATURE:FORGOTTEN_BEAST_708:BRAIN -!CREATURE:FORGOTTEN_BEAST_708:LUNG -"CREATURE:FORGOTTEN_BEAST_708:HEART -"CREATURE:FORGOTTEN_BEAST_708:LIVER - CREATURE:FORGOTTEN_BEAST_708:GUT -$CREATURE:FORGOTTEN_BEAST_708:STOMACH -$CREATURE:FORGOTTEN_BEAST_708:GIZZARD -%CREATURE:FORGOTTEN_BEAST_708:PANCREAS -#CREATURE:FORGOTTEN_BEAST_708:SPLEEN -#CREATURE:FORGOTTEN_BEAST_708:KIDNEY -#CREATURE:FORGOTTEN_BEAST_709:MUSCLE - CREATURE:FORGOTTEN_BEAST_709:EYE -"CREATURE:FORGOTTEN_BEAST_709:BRAIN -!CREATURE:FORGOTTEN_BEAST_709:LUNG -"CREATURE:FORGOTTEN_BEAST_709:HEART -"CREATURE:FORGOTTEN_BEAST_709:LIVER - CREATURE:FORGOTTEN_BEAST_709:GUT -$CREATURE:FORGOTTEN_BEAST_709:STOMACH -$CREATURE:FORGOTTEN_BEAST_709:GIZZARD -%CREATURE:FORGOTTEN_BEAST_709:PANCREAS -#CREATURE:FORGOTTEN_BEAST_709:SPLEEN -#CREATURE:FORGOTTEN_BEAST_709:KIDNEY -#CREATURE:FORGOTTEN_BEAST_711:MUSCLE - CREATURE:FORGOTTEN_BEAST_711:EYE -"CREATURE:FORGOTTEN_BEAST_711:BRAIN -!CREATURE:FORGOTTEN_BEAST_711:LUNG -"CREATURE:FORGOTTEN_BEAST_711:HEART -"CREATURE:FORGOTTEN_BEAST_711:LIVER - CREATURE:FORGOTTEN_BEAST_711:GUT -$CREATURE:FORGOTTEN_BEAST_711:STOMACH -$CREATURE:FORGOTTEN_BEAST_711:GIZZARD -%CREATURE:FORGOTTEN_BEAST_711:PANCREAS -#CREATURE:FORGOTTEN_BEAST_711:SPLEEN -#CREATURE:FORGOTTEN_BEAST_711:KIDNEY -#CREATURE:FORGOTTEN_BEAST_712:MUSCLE - CREATURE:FORGOTTEN_BEAST_712:EYE -"CREATURE:FORGOTTEN_BEAST_712:BRAIN -!CREATURE:FORGOTTEN_BEAST_712:LUNG -"CREATURE:FORGOTTEN_BEAST_712:HEART -"CREATURE:FORGOTTEN_BEAST_712:LIVER - CREATURE:FORGOTTEN_BEAST_712:GUT -$CREATURE:FORGOTTEN_BEAST_712:STOMACH -$CREATURE:FORGOTTEN_BEAST_712:GIZZARD -%CREATURE:FORGOTTEN_BEAST_712:PANCREAS -#CREATURE:FORGOTTEN_BEAST_712:SPLEEN -#CREATURE:FORGOTTEN_BEAST_712:KIDNEY -#CREATURE:FORGOTTEN_BEAST_713:MUSCLE - CREATURE:FORGOTTEN_BEAST_713:EYE -"CREATURE:FORGOTTEN_BEAST_713:BRAIN -!CREATURE:FORGOTTEN_BEAST_713:LUNG -"CREATURE:FORGOTTEN_BEAST_713:HEART -"CREATURE:FORGOTTEN_BEAST_713:LIVER - CREATURE:FORGOTTEN_BEAST_713:GUT -$CREATURE:FORGOTTEN_BEAST_713:STOMACH -$CREATURE:FORGOTTEN_BEAST_713:GIZZARD -%CREATURE:FORGOTTEN_BEAST_713:PANCREAS -#CREATURE:FORGOTTEN_BEAST_713:SPLEEN -#CREATURE:FORGOTTEN_BEAST_713:KIDNEY -#CREATURE:FORGOTTEN_BEAST_714:MUSCLE - CREATURE:FORGOTTEN_BEAST_714:EYE -"CREATURE:FORGOTTEN_BEAST_714:BRAIN -!CREATURE:FORGOTTEN_BEAST_714:LUNG -"CREATURE:FORGOTTEN_BEAST_714:HEART -"CREATURE:FORGOTTEN_BEAST_714:LIVER - CREATURE:FORGOTTEN_BEAST_714:GUT -$CREATURE:FORGOTTEN_BEAST_714:STOMACH -$CREATURE:FORGOTTEN_BEAST_714:GIZZARD -%CREATURE:FORGOTTEN_BEAST_714:PANCREAS -#CREATURE:FORGOTTEN_BEAST_714:SPLEEN -#CREATURE:FORGOTTEN_BEAST_714:KIDNEY -#CREATURE:FORGOTTEN_BEAST_715:MUSCLE - CREATURE:FORGOTTEN_BEAST_715:EYE -"CREATURE:FORGOTTEN_BEAST_715:BRAIN -!CREATURE:FORGOTTEN_BEAST_715:LUNG -"CREATURE:FORGOTTEN_BEAST_715:HEART -"CREATURE:FORGOTTEN_BEAST_715:LIVER - CREATURE:FORGOTTEN_BEAST_715:GUT -$CREATURE:FORGOTTEN_BEAST_715:STOMACH -$CREATURE:FORGOTTEN_BEAST_715:GIZZARD -%CREATURE:FORGOTTEN_BEAST_715:PANCREAS -#CREATURE:FORGOTTEN_BEAST_715:SPLEEN -#CREATURE:FORGOTTEN_BEAST_715:KIDNEY -#CREATURE:FORGOTTEN_BEAST_717:MUSCLE - CREATURE:FORGOTTEN_BEAST_717:EYE -"CREATURE:FORGOTTEN_BEAST_717:BRAIN -!CREATURE:FORGOTTEN_BEAST_717:LUNG -"CREATURE:FORGOTTEN_BEAST_717:HEART -"CREATURE:FORGOTTEN_BEAST_717:LIVER - CREATURE:FORGOTTEN_BEAST_717:GUT -$CREATURE:FORGOTTEN_BEAST_717:STOMACH -$CREATURE:FORGOTTEN_BEAST_717:GIZZARD -%CREATURE:FORGOTTEN_BEAST_717:PANCREAS -#CREATURE:FORGOTTEN_BEAST_717:SPLEEN -#CREATURE:FORGOTTEN_BEAST_717:KIDNEY -#CREATURE:FORGOTTEN_BEAST_718:MUSCLE - CREATURE:FORGOTTEN_BEAST_718:EYE -"CREATURE:FORGOTTEN_BEAST_718:BRAIN -!CREATURE:FORGOTTEN_BEAST_718:LUNG -"CREATURE:FORGOTTEN_BEAST_718:HEART -"CREATURE:FORGOTTEN_BEAST_718:LIVER - CREATURE:FORGOTTEN_BEAST_718:GUT -$CREATURE:FORGOTTEN_BEAST_718:STOMACH -$CREATURE:FORGOTTEN_BEAST_718:GIZZARD -%CREATURE:FORGOTTEN_BEAST_718:PANCREAS -#CREATURE:FORGOTTEN_BEAST_718:SPLEEN -#CREATURE:FORGOTTEN_BEAST_718:KIDNEY -#CREATURE:FORGOTTEN_BEAST_719:MUSCLE - CREATURE:FORGOTTEN_BEAST_719:EYE -"CREATURE:FORGOTTEN_BEAST_719:BRAIN -!CREATURE:FORGOTTEN_BEAST_719:LUNG -"CREATURE:FORGOTTEN_BEAST_719:HEART -"CREATURE:FORGOTTEN_BEAST_719:LIVER - CREATURE:FORGOTTEN_BEAST_719:GUT -$CREATURE:FORGOTTEN_BEAST_719:STOMACH -$CREATURE:FORGOTTEN_BEAST_719:GIZZARD -%CREATURE:FORGOTTEN_BEAST_719:PANCREAS -#CREATURE:FORGOTTEN_BEAST_719:SPLEEN -#CREATURE:FORGOTTEN_BEAST_719:KIDNEY -#CREATURE:FORGOTTEN_BEAST_720:MUSCLE - CREATURE:FORGOTTEN_BEAST_720:EYE -"CREATURE:FORGOTTEN_BEAST_720:BRAIN -!CREATURE:FORGOTTEN_BEAST_720:LUNG -"CREATURE:FORGOTTEN_BEAST_720:HEART -"CREATURE:FORGOTTEN_BEAST_720:LIVER - CREATURE:FORGOTTEN_BEAST_720:GUT -$CREATURE:FORGOTTEN_BEAST_720:STOMACH -$CREATURE:FORGOTTEN_BEAST_720:GIZZARD -%CREATURE:FORGOTTEN_BEAST_720:PANCREAS -#CREATURE:FORGOTTEN_BEAST_720:SPLEEN -#CREATURE:FORGOTTEN_BEAST_720:KIDNEY -#CREATURE:FORGOTTEN_BEAST_721:MUSCLE - CREATURE:FORGOTTEN_BEAST_721:EYE -"CREATURE:FORGOTTEN_BEAST_721:BRAIN -!CREATURE:FORGOTTEN_BEAST_721:LUNG -"CREATURE:FORGOTTEN_BEAST_721:HEART -"CREATURE:FORGOTTEN_BEAST_721:LIVER - CREATURE:FORGOTTEN_BEAST_721:GUT -$CREATURE:FORGOTTEN_BEAST_721:STOMACH -$CREATURE:FORGOTTEN_BEAST_721:GIZZARD -%CREATURE:FORGOTTEN_BEAST_721:PANCREAS -#CREATURE:FORGOTTEN_BEAST_721:SPLEEN -#CREATURE:FORGOTTEN_BEAST_721:KIDNEY -#CREATURE:FORGOTTEN_BEAST_722:MUSCLE - CREATURE:FORGOTTEN_BEAST_722:EYE -"CREATURE:FORGOTTEN_BEAST_722:BRAIN -!CREATURE:FORGOTTEN_BEAST_722:LUNG -"CREATURE:FORGOTTEN_BEAST_722:HEART -"CREATURE:FORGOTTEN_BEAST_722:LIVER - CREATURE:FORGOTTEN_BEAST_722:GUT -$CREATURE:FORGOTTEN_BEAST_722:STOMACH -$CREATURE:FORGOTTEN_BEAST_722:GIZZARD -%CREATURE:FORGOTTEN_BEAST_722:PANCREAS -#CREATURE:FORGOTTEN_BEAST_722:SPLEEN -#CREATURE:FORGOTTEN_BEAST_722:KIDNEY -#CREATURE:FORGOTTEN_BEAST_723:MUSCLE - CREATURE:FORGOTTEN_BEAST_723:EYE -"CREATURE:FORGOTTEN_BEAST_723:BRAIN -!CREATURE:FORGOTTEN_BEAST_723:LUNG -"CREATURE:FORGOTTEN_BEAST_723:HEART -"CREATURE:FORGOTTEN_BEAST_723:LIVER - CREATURE:FORGOTTEN_BEAST_723:GUT -$CREATURE:FORGOTTEN_BEAST_723:STOMACH -$CREATURE:FORGOTTEN_BEAST_723:GIZZARD -%CREATURE:FORGOTTEN_BEAST_723:PANCREAS -#CREATURE:FORGOTTEN_BEAST_723:SPLEEN -#CREATURE:FORGOTTEN_BEAST_723:KIDNEY -#CREATURE:FORGOTTEN_BEAST_724:MUSCLE - CREATURE:FORGOTTEN_BEAST_724:EYE -"CREATURE:FORGOTTEN_BEAST_724:BRAIN -!CREATURE:FORGOTTEN_BEAST_724:LUNG -"CREATURE:FORGOTTEN_BEAST_724:HEART -"CREATURE:FORGOTTEN_BEAST_724:LIVER - CREATURE:FORGOTTEN_BEAST_724:GUT -$CREATURE:FORGOTTEN_BEAST_724:STOMACH -$CREATURE:FORGOTTEN_BEAST_724:GIZZARD -%CREATURE:FORGOTTEN_BEAST_724:PANCREAS -#CREATURE:FORGOTTEN_BEAST_724:SPLEEN -#CREATURE:FORGOTTEN_BEAST_724:KIDNEY -#CREATURE:FORGOTTEN_BEAST_726:MUSCLE - CREATURE:FORGOTTEN_BEAST_726:EYE -"CREATURE:FORGOTTEN_BEAST_726:BRAIN -!CREATURE:FORGOTTEN_BEAST_726:LUNG -"CREATURE:FORGOTTEN_BEAST_726:HEART -"CREATURE:FORGOTTEN_BEAST_726:LIVER - CREATURE:FORGOTTEN_BEAST_726:GUT -$CREATURE:FORGOTTEN_BEAST_726:STOMACH -$CREATURE:FORGOTTEN_BEAST_726:GIZZARD -%CREATURE:FORGOTTEN_BEAST_726:PANCREAS -#CREATURE:FORGOTTEN_BEAST_726:SPLEEN -#CREATURE:FORGOTTEN_BEAST_726:KIDNEY -#CREATURE:FORGOTTEN_BEAST_730:MUSCLE - CREATURE:FORGOTTEN_BEAST_730:EYE -"CREATURE:FORGOTTEN_BEAST_730:BRAIN -!CREATURE:FORGOTTEN_BEAST_730:LUNG -"CREATURE:FORGOTTEN_BEAST_730:HEART -"CREATURE:FORGOTTEN_BEAST_730:LIVER - CREATURE:FORGOTTEN_BEAST_730:GUT -$CREATURE:FORGOTTEN_BEAST_730:STOMACH -$CREATURE:FORGOTTEN_BEAST_730:GIZZARD -%CREATURE:FORGOTTEN_BEAST_730:PANCREAS -#CREATURE:FORGOTTEN_BEAST_730:SPLEEN -#CREATURE:FORGOTTEN_BEAST_730:KIDNEY -#CREATURE:FORGOTTEN_BEAST_731:MUSCLE - CREATURE:FORGOTTEN_BEAST_731:EYE -"CREATURE:FORGOTTEN_BEAST_731:BRAIN -!CREATURE:FORGOTTEN_BEAST_731:LUNG -"CREATURE:FORGOTTEN_BEAST_731:HEART -"CREATURE:FORGOTTEN_BEAST_731:LIVER - CREATURE:FORGOTTEN_BEAST_731:GUT -$CREATURE:FORGOTTEN_BEAST_731:STOMACH -$CREATURE:FORGOTTEN_BEAST_731:GIZZARD -%CREATURE:FORGOTTEN_BEAST_731:PANCREAS -#CREATURE:FORGOTTEN_BEAST_731:SPLEEN -#CREATURE:FORGOTTEN_BEAST_731:KIDNEY -#CREATURE:FORGOTTEN_BEAST_734:MUSCLE - CREATURE:FORGOTTEN_BEAST_734:EYE -"CREATURE:FORGOTTEN_BEAST_734:BRAIN -!CREATURE:FORGOTTEN_BEAST_734:LUNG -"CREATURE:FORGOTTEN_BEAST_734:HEART -"CREATURE:FORGOTTEN_BEAST_734:LIVER - CREATURE:FORGOTTEN_BEAST_734:GUT -$CREATURE:FORGOTTEN_BEAST_734:STOMACH -$CREATURE:FORGOTTEN_BEAST_734:GIZZARD -%CREATURE:FORGOTTEN_BEAST_734:PANCREAS -#CREATURE:FORGOTTEN_BEAST_734:SPLEEN -#CREATURE:FORGOTTEN_BEAST_734:KIDNEY -#CREATURE:FORGOTTEN_BEAST_735:MUSCLE - CREATURE:FORGOTTEN_BEAST_735:EYE -"CREATURE:FORGOTTEN_BEAST_735:BRAIN -!CREATURE:FORGOTTEN_BEAST_735:LUNG -"CREATURE:FORGOTTEN_BEAST_735:HEART -"CREATURE:FORGOTTEN_BEAST_735:LIVER - CREATURE:FORGOTTEN_BEAST_735:GUT -$CREATURE:FORGOTTEN_BEAST_735:STOMACH -$CREATURE:FORGOTTEN_BEAST_735:GIZZARD -%CREATURE:FORGOTTEN_BEAST_735:PANCREAS -#CREATURE:FORGOTTEN_BEAST_735:SPLEEN -#CREATURE:FORGOTTEN_BEAST_735:KIDNEY -#CREATURE:FORGOTTEN_BEAST_737:MUSCLE - CREATURE:FORGOTTEN_BEAST_737:EYE -"CREATURE:FORGOTTEN_BEAST_737:BRAIN -!CREATURE:FORGOTTEN_BEAST_737:LUNG -"CREATURE:FORGOTTEN_BEAST_737:HEART -"CREATURE:FORGOTTEN_BEAST_737:LIVER - CREATURE:FORGOTTEN_BEAST_737:GUT -$CREATURE:FORGOTTEN_BEAST_737:STOMACH -$CREATURE:FORGOTTEN_BEAST_737:GIZZARD -%CREATURE:FORGOTTEN_BEAST_737:PANCREAS -#CREATURE:FORGOTTEN_BEAST_737:SPLEEN -#CREATURE:FORGOTTEN_BEAST_737:KIDNEY -#CREATURE:FORGOTTEN_BEAST_738:MUSCLE - CREATURE:FORGOTTEN_BEAST_738:EYE -"CREATURE:FORGOTTEN_BEAST_738:BRAIN -!CREATURE:FORGOTTEN_BEAST_738:LUNG -"CREATURE:FORGOTTEN_BEAST_738:HEART -"CREATURE:FORGOTTEN_BEAST_738:LIVER - CREATURE:FORGOTTEN_BEAST_738:GUT -$CREATURE:FORGOTTEN_BEAST_738:STOMACH -$CREATURE:FORGOTTEN_BEAST_738:GIZZARD -%CREATURE:FORGOTTEN_BEAST_738:PANCREAS -#CREATURE:FORGOTTEN_BEAST_738:SPLEEN -#CREATURE:FORGOTTEN_BEAST_738:KIDNEY -#CREATURE:FORGOTTEN_BEAST_739:MUSCLE - CREATURE:FORGOTTEN_BEAST_739:EYE -"CREATURE:FORGOTTEN_BEAST_739:BRAIN -!CREATURE:FORGOTTEN_BEAST_739:LUNG -"CREATURE:FORGOTTEN_BEAST_739:HEART -"CREATURE:FORGOTTEN_BEAST_739:LIVER - CREATURE:FORGOTTEN_BEAST_739:GUT -$CREATURE:FORGOTTEN_BEAST_739:STOMACH -$CREATURE:FORGOTTEN_BEAST_739:GIZZARD -%CREATURE:FORGOTTEN_BEAST_739:PANCREAS -#CREATURE:FORGOTTEN_BEAST_739:SPLEEN -#CREATURE:FORGOTTEN_BEAST_739:KIDNEY -#CREATURE:FORGOTTEN_BEAST_740:MUSCLE - CREATURE:FORGOTTEN_BEAST_740:EYE -"CREATURE:FORGOTTEN_BEAST_740:BRAIN -!CREATURE:FORGOTTEN_BEAST_740:LUNG -"CREATURE:FORGOTTEN_BEAST_740:HEART -"CREATURE:FORGOTTEN_BEAST_740:LIVER - CREATURE:FORGOTTEN_BEAST_740:GUT -$CREATURE:FORGOTTEN_BEAST_740:STOMACH -$CREATURE:FORGOTTEN_BEAST_740:GIZZARD -%CREATURE:FORGOTTEN_BEAST_740:PANCREAS -#CREATURE:FORGOTTEN_BEAST_740:SPLEEN -#CREATURE:FORGOTTEN_BEAST_740:KIDNEY -#CREATURE:FORGOTTEN_BEAST_741:MUSCLE - CREATURE:FORGOTTEN_BEAST_741:EYE -"CREATURE:FORGOTTEN_BEAST_741:BRAIN -!CREATURE:FORGOTTEN_BEAST_741:LUNG -"CREATURE:FORGOTTEN_BEAST_741:HEART -"CREATURE:FORGOTTEN_BEAST_741:LIVER - CREATURE:FORGOTTEN_BEAST_741:GUT -$CREATURE:FORGOTTEN_BEAST_741:STOMACH -$CREATURE:FORGOTTEN_BEAST_741:GIZZARD -%CREATURE:FORGOTTEN_BEAST_741:PANCREAS -#CREATURE:FORGOTTEN_BEAST_741:SPLEEN -#CREATURE:FORGOTTEN_BEAST_741:KIDNEY -#CREATURE:FORGOTTEN_BEAST_742:MUSCLE - CREATURE:FORGOTTEN_BEAST_742:EYE -"CREATURE:FORGOTTEN_BEAST_742:BRAIN -!CREATURE:FORGOTTEN_BEAST_742:LUNG -"CREATURE:FORGOTTEN_BEAST_742:HEART -"CREATURE:FORGOTTEN_BEAST_742:LIVER - CREATURE:FORGOTTEN_BEAST_742:GUT -$CREATURE:FORGOTTEN_BEAST_742:STOMACH -$CREATURE:FORGOTTEN_BEAST_742:GIZZARD -%CREATURE:FORGOTTEN_BEAST_742:PANCREAS -#CREATURE:FORGOTTEN_BEAST_742:SPLEEN -#CREATURE:FORGOTTEN_BEAST_742:KIDNEY -#CREATURE:FORGOTTEN_BEAST_743:MUSCLE - CREATURE:FORGOTTEN_BEAST_743:EYE -"CREATURE:FORGOTTEN_BEAST_743:BRAIN -!CREATURE:FORGOTTEN_BEAST_743:LUNG -"CREATURE:FORGOTTEN_BEAST_743:HEART -"CREATURE:FORGOTTEN_BEAST_743:LIVER - CREATURE:FORGOTTEN_BEAST_743:GUT -$CREATURE:FORGOTTEN_BEAST_743:STOMACH -$CREATURE:FORGOTTEN_BEAST_743:GIZZARD -%CREATURE:FORGOTTEN_BEAST_743:PANCREAS -#CREATURE:FORGOTTEN_BEAST_743:SPLEEN -#CREATURE:FORGOTTEN_BEAST_743:KIDNEY -#CREATURE:FORGOTTEN_BEAST_744:MUSCLE - CREATURE:FORGOTTEN_BEAST_744:EYE -"CREATURE:FORGOTTEN_BEAST_744:BRAIN -!CREATURE:FORGOTTEN_BEAST_744:LUNG -"CREATURE:FORGOTTEN_BEAST_744:HEART -"CREATURE:FORGOTTEN_BEAST_744:LIVER - CREATURE:FORGOTTEN_BEAST_744:GUT -$CREATURE:FORGOTTEN_BEAST_744:STOMACH -$CREATURE:FORGOTTEN_BEAST_744:GIZZARD -%CREATURE:FORGOTTEN_BEAST_744:PANCREAS -#CREATURE:FORGOTTEN_BEAST_744:SPLEEN -#CREATURE:FORGOTTEN_BEAST_744:KIDNEY -#CREATURE:FORGOTTEN_BEAST_746:MUSCLE - CREATURE:FORGOTTEN_BEAST_746:EYE -"CREATURE:FORGOTTEN_BEAST_746:BRAIN -!CREATURE:FORGOTTEN_BEAST_746:LUNG -"CREATURE:FORGOTTEN_BEAST_746:HEART -"CREATURE:FORGOTTEN_BEAST_746:LIVER - CREATURE:FORGOTTEN_BEAST_746:GUT -$CREATURE:FORGOTTEN_BEAST_746:STOMACH -$CREATURE:FORGOTTEN_BEAST_746:GIZZARD -%CREATURE:FORGOTTEN_BEAST_746:PANCREAS -#CREATURE:FORGOTTEN_BEAST_746:SPLEEN -#CREATURE:FORGOTTEN_BEAST_746:KIDNEY -#CREATURE:FORGOTTEN_BEAST_747:MUSCLE - CREATURE:FORGOTTEN_BEAST_747:EYE -"CREATURE:FORGOTTEN_BEAST_747:BRAIN -!CREATURE:FORGOTTEN_BEAST_747:LUNG -"CREATURE:FORGOTTEN_BEAST_747:HEART -"CREATURE:FORGOTTEN_BEAST_747:LIVER - CREATURE:FORGOTTEN_BEAST_747:GUT -$CREATURE:FORGOTTEN_BEAST_747:STOMACH -$CREATURE:FORGOTTEN_BEAST_747:GIZZARD -%CREATURE:FORGOTTEN_BEAST_747:PANCREAS -#CREATURE:FORGOTTEN_BEAST_747:SPLEEN -#CREATURE:FORGOTTEN_BEAST_747:KIDNEY -#CREATURE:FORGOTTEN_BEAST_749:MUSCLE - CREATURE:FORGOTTEN_BEAST_749:EYE -"CREATURE:FORGOTTEN_BEAST_749:BRAIN -!CREATURE:FORGOTTEN_BEAST_749:LUNG -"CREATURE:FORGOTTEN_BEAST_749:HEART -"CREATURE:FORGOTTEN_BEAST_749:LIVER - CREATURE:FORGOTTEN_BEAST_749:GUT -$CREATURE:FORGOTTEN_BEAST_749:STOMACH -$CREATURE:FORGOTTEN_BEAST_749:GIZZARD -%CREATURE:FORGOTTEN_BEAST_749:PANCREAS -#CREATURE:FORGOTTEN_BEAST_749:SPLEEN -#CREATURE:FORGOTTEN_BEAST_749:KIDNEY -#CREATURE:FORGOTTEN_BEAST_750:MUSCLE - CREATURE:FORGOTTEN_BEAST_750:EYE -"CREATURE:FORGOTTEN_BEAST_750:BRAIN -!CREATURE:FORGOTTEN_BEAST_750:LUNG -"CREATURE:FORGOTTEN_BEAST_750:HEART -"CREATURE:FORGOTTEN_BEAST_750:LIVER - CREATURE:FORGOTTEN_BEAST_750:GUT -$CREATURE:FORGOTTEN_BEAST_750:STOMACH -$CREATURE:FORGOTTEN_BEAST_750:GIZZARD -%CREATURE:FORGOTTEN_BEAST_750:PANCREAS -#CREATURE:FORGOTTEN_BEAST_750:SPLEEN -#CREATURE:FORGOTTEN_BEAST_750:KIDNEY -#CREATURE:FORGOTTEN_BEAST_751:MUSCLE - CREATURE:FORGOTTEN_BEAST_751:EYE -"CREATURE:FORGOTTEN_BEAST_751:BRAIN -!CREATURE:FORGOTTEN_BEAST_751:LUNG -"CREATURE:FORGOTTEN_BEAST_751:HEART -"CREATURE:FORGOTTEN_BEAST_751:LIVER - CREATURE:FORGOTTEN_BEAST_751:GUT -$CREATURE:FORGOTTEN_BEAST_751:STOMACH -$CREATURE:FORGOTTEN_BEAST_751:GIZZARD -%CREATURE:FORGOTTEN_BEAST_751:PANCREAS -#CREATURE:FORGOTTEN_BEAST_751:SPLEEN -#CREATURE:FORGOTTEN_BEAST_751:KIDNEY -#CREATURE:FORGOTTEN_BEAST_752:MUSCLE - CREATURE:FORGOTTEN_BEAST_752:EYE -"CREATURE:FORGOTTEN_BEAST_752:BRAIN -!CREATURE:FORGOTTEN_BEAST_752:LUNG -"CREATURE:FORGOTTEN_BEAST_752:HEART -"CREATURE:FORGOTTEN_BEAST_752:LIVER - CREATURE:FORGOTTEN_BEAST_752:GUT -$CREATURE:FORGOTTEN_BEAST_752:STOMACH -$CREATURE:FORGOTTEN_BEAST_752:GIZZARD -%CREATURE:FORGOTTEN_BEAST_752:PANCREAS -#CREATURE:FORGOTTEN_BEAST_752:SPLEEN -#CREATURE:FORGOTTEN_BEAST_752:KIDNEY -#CREATURE:FORGOTTEN_BEAST_753:MUSCLE - CREATURE:FORGOTTEN_BEAST_753:EYE -"CREATURE:FORGOTTEN_BEAST_753:BRAIN -!CREATURE:FORGOTTEN_BEAST_753:LUNG -"CREATURE:FORGOTTEN_BEAST_753:HEART -"CREATURE:FORGOTTEN_BEAST_753:LIVER - CREATURE:FORGOTTEN_BEAST_753:GUT -$CREATURE:FORGOTTEN_BEAST_753:STOMACH -$CREATURE:FORGOTTEN_BEAST_753:GIZZARD -%CREATURE:FORGOTTEN_BEAST_753:PANCREAS -#CREATURE:FORGOTTEN_BEAST_753:SPLEEN -#CREATURE:FORGOTTEN_BEAST_753:KIDNEY -#CREATURE:FORGOTTEN_BEAST_754:MUSCLE - CREATURE:FORGOTTEN_BEAST_754:EYE -"CREATURE:FORGOTTEN_BEAST_754:BRAIN -!CREATURE:FORGOTTEN_BEAST_754:LUNG -"CREATURE:FORGOTTEN_BEAST_754:HEART -"CREATURE:FORGOTTEN_BEAST_754:LIVER - CREATURE:FORGOTTEN_BEAST_754:GUT -$CREATURE:FORGOTTEN_BEAST_754:STOMACH -$CREATURE:FORGOTTEN_BEAST_754:GIZZARD -%CREATURE:FORGOTTEN_BEAST_754:PANCREAS -#CREATURE:FORGOTTEN_BEAST_754:SPLEEN -#CREATURE:FORGOTTEN_BEAST_754:KIDNEY -#CREATURE:FORGOTTEN_BEAST_755:MUSCLE - CREATURE:FORGOTTEN_BEAST_755:EYE -"CREATURE:FORGOTTEN_BEAST_755:BRAIN -!CREATURE:FORGOTTEN_BEAST_755:LUNG -"CREATURE:FORGOTTEN_BEAST_755:HEART -"CREATURE:FORGOTTEN_BEAST_755:LIVER - CREATURE:FORGOTTEN_BEAST_755:GUT -$CREATURE:FORGOTTEN_BEAST_755:STOMACH -$CREATURE:FORGOTTEN_BEAST_755:GIZZARD -%CREATURE:FORGOTTEN_BEAST_755:PANCREAS -#CREATURE:FORGOTTEN_BEAST_755:SPLEEN -#CREATURE:FORGOTTEN_BEAST_755:KIDNEY -#CREATURE:FORGOTTEN_BEAST_756:MUSCLE - CREATURE:FORGOTTEN_BEAST_756:EYE -"CREATURE:FORGOTTEN_BEAST_756:BRAIN -!CREATURE:FORGOTTEN_BEAST_756:LUNG -"CREATURE:FORGOTTEN_BEAST_756:HEART -"CREATURE:FORGOTTEN_BEAST_756:LIVER - CREATURE:FORGOTTEN_BEAST_756:GUT -$CREATURE:FORGOTTEN_BEAST_756:STOMACH -$CREATURE:FORGOTTEN_BEAST_756:GIZZARD -%CREATURE:FORGOTTEN_BEAST_756:PANCREAS -#CREATURE:FORGOTTEN_BEAST_756:SPLEEN -#CREATURE:FORGOTTEN_BEAST_756:KIDNEY -#CREATURE:FORGOTTEN_BEAST_757:MUSCLE - CREATURE:FORGOTTEN_BEAST_757:EYE -"CREATURE:FORGOTTEN_BEAST_757:BRAIN -!CREATURE:FORGOTTEN_BEAST_757:LUNG -"CREATURE:FORGOTTEN_BEAST_757:HEART -"CREATURE:FORGOTTEN_BEAST_757:LIVER - CREATURE:FORGOTTEN_BEAST_757:GUT -$CREATURE:FORGOTTEN_BEAST_757:STOMACH -$CREATURE:FORGOTTEN_BEAST_757:GIZZARD -%CREATURE:FORGOTTEN_BEAST_757:PANCREAS -#CREATURE:FORGOTTEN_BEAST_757:SPLEEN -#CREATURE:FORGOTTEN_BEAST_757:KIDNEY -#CREATURE:FORGOTTEN_BEAST_758:MUSCLE - CREATURE:FORGOTTEN_BEAST_758:EYE -"CREATURE:FORGOTTEN_BEAST_758:BRAIN -!CREATURE:FORGOTTEN_BEAST_758:LUNG -"CREATURE:FORGOTTEN_BEAST_758:HEART -"CREATURE:FORGOTTEN_BEAST_758:LIVER - CREATURE:FORGOTTEN_BEAST_758:GUT -$CREATURE:FORGOTTEN_BEAST_758:STOMACH -$CREATURE:FORGOTTEN_BEAST_758:GIZZARD -%CREATURE:FORGOTTEN_BEAST_758:PANCREAS -#CREATURE:FORGOTTEN_BEAST_758:SPLEEN -#CREATURE:FORGOTTEN_BEAST_758:KIDNEY -#CREATURE:FORGOTTEN_BEAST_759:MUSCLE - CREATURE:FORGOTTEN_BEAST_759:EYE -"CREATURE:FORGOTTEN_BEAST_759:BRAIN -!CREATURE:FORGOTTEN_BEAST_759:LUNG -"CREATURE:FORGOTTEN_BEAST_759:HEART -"CREATURE:FORGOTTEN_BEAST_759:LIVER - CREATURE:FORGOTTEN_BEAST_759:GUT -$CREATURE:FORGOTTEN_BEAST_759:STOMACH -$CREATURE:FORGOTTEN_BEAST_759:GIZZARD -%CREATURE:FORGOTTEN_BEAST_759:PANCREAS -#CREATURE:FORGOTTEN_BEAST_759:SPLEEN -#CREATURE:FORGOTTEN_BEAST_759:KIDNEY -#CREATURE:FORGOTTEN_BEAST_760:MUSCLE - CREATURE:FORGOTTEN_BEAST_760:EYE -"CREATURE:FORGOTTEN_BEAST_760:BRAIN -!CREATURE:FORGOTTEN_BEAST_760:LUNG -"CREATURE:FORGOTTEN_BEAST_760:HEART -"CREATURE:FORGOTTEN_BEAST_760:LIVER - CREATURE:FORGOTTEN_BEAST_760:GUT -$CREATURE:FORGOTTEN_BEAST_760:STOMACH -$CREATURE:FORGOTTEN_BEAST_760:GIZZARD -%CREATURE:FORGOTTEN_BEAST_760:PANCREAS -#CREATURE:FORGOTTEN_BEAST_760:SPLEEN -#CREATURE:FORGOTTEN_BEAST_760:KIDNEY -#CREATURE:FORGOTTEN_BEAST_761:MUSCLE - CREATURE:FORGOTTEN_BEAST_761:EYE -"CREATURE:FORGOTTEN_BEAST_761:BRAIN -!CREATURE:FORGOTTEN_BEAST_761:LUNG -"CREATURE:FORGOTTEN_BEAST_761:HEART -"CREATURE:FORGOTTEN_BEAST_761:LIVER - CREATURE:FORGOTTEN_BEAST_761:GUT -$CREATURE:FORGOTTEN_BEAST_761:STOMACH -$CREATURE:FORGOTTEN_BEAST_761:GIZZARD -%CREATURE:FORGOTTEN_BEAST_761:PANCREAS -#CREATURE:FORGOTTEN_BEAST_761:SPLEEN -#CREATURE:FORGOTTEN_BEAST_761:KIDNEY -#CREATURE:FORGOTTEN_BEAST_762:MUSCLE - CREATURE:FORGOTTEN_BEAST_762:EYE -"CREATURE:FORGOTTEN_BEAST_762:BRAIN -!CREATURE:FORGOTTEN_BEAST_762:LUNG -"CREATURE:FORGOTTEN_BEAST_762:HEART -"CREATURE:FORGOTTEN_BEAST_762:LIVER - CREATURE:FORGOTTEN_BEAST_762:GUT -$CREATURE:FORGOTTEN_BEAST_762:STOMACH -$CREATURE:FORGOTTEN_BEAST_762:GIZZARD -%CREATURE:FORGOTTEN_BEAST_762:PANCREAS -#CREATURE:FORGOTTEN_BEAST_762:SPLEEN -#CREATURE:FORGOTTEN_BEAST_762:KIDNEY -#CREATURE:FORGOTTEN_BEAST_764:MUSCLE - CREATURE:FORGOTTEN_BEAST_764:EYE -"CREATURE:FORGOTTEN_BEAST_764:BRAIN -!CREATURE:FORGOTTEN_BEAST_764:LUNG -"CREATURE:FORGOTTEN_BEAST_764:HEART -"CREATURE:FORGOTTEN_BEAST_764:LIVER - CREATURE:FORGOTTEN_BEAST_764:GUT -$CREATURE:FORGOTTEN_BEAST_764:STOMACH -$CREATURE:FORGOTTEN_BEAST_764:GIZZARD -%CREATURE:FORGOTTEN_BEAST_764:PANCREAS -#CREATURE:FORGOTTEN_BEAST_764:SPLEEN -#CREATURE:FORGOTTEN_BEAST_764:KIDNEY -#CREATURE:FORGOTTEN_BEAST_767:MUSCLE - CREATURE:FORGOTTEN_BEAST_767:EYE -"CREATURE:FORGOTTEN_BEAST_767:BRAIN -!CREATURE:FORGOTTEN_BEAST_767:LUNG -"CREATURE:FORGOTTEN_BEAST_767:HEART -"CREATURE:FORGOTTEN_BEAST_767:LIVER - CREATURE:FORGOTTEN_BEAST_767:GUT -$CREATURE:FORGOTTEN_BEAST_767:STOMACH -$CREATURE:FORGOTTEN_BEAST_767:GIZZARD -%CREATURE:FORGOTTEN_BEAST_767:PANCREAS -#CREATURE:FORGOTTEN_BEAST_767:SPLEEN -#CREATURE:FORGOTTEN_BEAST_767:KIDNEY -#CREATURE:FORGOTTEN_BEAST_768:MUSCLE - CREATURE:FORGOTTEN_BEAST_768:EYE -"CREATURE:FORGOTTEN_BEAST_768:BRAIN -!CREATURE:FORGOTTEN_BEAST_768:LUNG -"CREATURE:FORGOTTEN_BEAST_768:HEART -"CREATURE:FORGOTTEN_BEAST_768:LIVER - CREATURE:FORGOTTEN_BEAST_768:GUT -$CREATURE:FORGOTTEN_BEAST_768:STOMACH -$CREATURE:FORGOTTEN_BEAST_768:GIZZARD -%CREATURE:FORGOTTEN_BEAST_768:PANCREAS -#CREATURE:FORGOTTEN_BEAST_768:SPLEEN -#CREATURE:FORGOTTEN_BEAST_768:KIDNEY -#CREATURE:FORGOTTEN_BEAST_769:MUSCLE - CREATURE:FORGOTTEN_BEAST_769:EYE -"CREATURE:FORGOTTEN_BEAST_769:BRAIN -!CREATURE:FORGOTTEN_BEAST_769:LUNG -"CREATURE:FORGOTTEN_BEAST_769:HEART -"CREATURE:FORGOTTEN_BEAST_769:LIVER - CREATURE:FORGOTTEN_BEAST_769:GUT -$CREATURE:FORGOTTEN_BEAST_769:STOMACH -$CREATURE:FORGOTTEN_BEAST_769:GIZZARD -%CREATURE:FORGOTTEN_BEAST_769:PANCREAS -#CREATURE:FORGOTTEN_BEAST_769:SPLEEN -#CREATURE:FORGOTTEN_BEAST_769:KIDNEY -#CREATURE:FORGOTTEN_BEAST_770:MUSCLE - CREATURE:FORGOTTEN_BEAST_770:EYE -"CREATURE:FORGOTTEN_BEAST_770:BRAIN -!CREATURE:FORGOTTEN_BEAST_770:LUNG -"CREATURE:FORGOTTEN_BEAST_770:HEART -"CREATURE:FORGOTTEN_BEAST_770:LIVER - CREATURE:FORGOTTEN_BEAST_770:GUT -$CREATURE:FORGOTTEN_BEAST_770:STOMACH -$CREATURE:FORGOTTEN_BEAST_770:GIZZARD -%CREATURE:FORGOTTEN_BEAST_770:PANCREAS -#CREATURE:FORGOTTEN_BEAST_770:SPLEEN -#CREATURE:FORGOTTEN_BEAST_770:KIDNEY -#CREATURE:FORGOTTEN_BEAST_773:MUSCLE - CREATURE:FORGOTTEN_BEAST_773:EYE -"CREATURE:FORGOTTEN_BEAST_773:BRAIN -!CREATURE:FORGOTTEN_BEAST_773:LUNG -"CREATURE:FORGOTTEN_BEAST_773:HEART -"CREATURE:FORGOTTEN_BEAST_773:LIVER - CREATURE:FORGOTTEN_BEAST_773:GUT -$CREATURE:FORGOTTEN_BEAST_773:STOMACH -$CREATURE:FORGOTTEN_BEAST_773:GIZZARD -%CREATURE:FORGOTTEN_BEAST_773:PANCREAS -#CREATURE:FORGOTTEN_BEAST_773:SPLEEN -#CREATURE:FORGOTTEN_BEAST_773:KIDNEY -#CREATURE:FORGOTTEN_BEAST_774:MUSCLE - CREATURE:FORGOTTEN_BEAST_774:EYE -"CREATURE:FORGOTTEN_BEAST_774:BRAIN -!CREATURE:FORGOTTEN_BEAST_774:LUNG -"CREATURE:FORGOTTEN_BEAST_774:HEART -"CREATURE:FORGOTTEN_BEAST_774:LIVER - CREATURE:FORGOTTEN_BEAST_774:GUT -$CREATURE:FORGOTTEN_BEAST_774:STOMACH -$CREATURE:FORGOTTEN_BEAST_774:GIZZARD -%CREATURE:FORGOTTEN_BEAST_774:PANCREAS -#CREATURE:FORGOTTEN_BEAST_774:SPLEEN -#CREATURE:FORGOTTEN_BEAST_774:KIDNEY -#CREATURE:FORGOTTEN_BEAST_776:MUSCLE - CREATURE:FORGOTTEN_BEAST_776:EYE -"CREATURE:FORGOTTEN_BEAST_776:BRAIN -!CREATURE:FORGOTTEN_BEAST_776:LUNG -"CREATURE:FORGOTTEN_BEAST_776:HEART -"CREATURE:FORGOTTEN_BEAST_776:LIVER - CREATURE:FORGOTTEN_BEAST_776:GUT -$CREATURE:FORGOTTEN_BEAST_776:STOMACH -$CREATURE:FORGOTTEN_BEAST_776:GIZZARD -%CREATURE:FORGOTTEN_BEAST_776:PANCREAS -#CREATURE:FORGOTTEN_BEAST_776:SPLEEN -#CREATURE:FORGOTTEN_BEAST_776:KIDNEY -#CREATURE:FORGOTTEN_BEAST_777:MUSCLE - CREATURE:FORGOTTEN_BEAST_777:EYE -"CREATURE:FORGOTTEN_BEAST_777:BRAIN -!CREATURE:FORGOTTEN_BEAST_777:LUNG -"CREATURE:FORGOTTEN_BEAST_777:HEART -"CREATURE:FORGOTTEN_BEAST_777:LIVER - CREATURE:FORGOTTEN_BEAST_777:GUT -$CREATURE:FORGOTTEN_BEAST_777:STOMACH -$CREATURE:FORGOTTEN_BEAST_777:GIZZARD -%CREATURE:FORGOTTEN_BEAST_777:PANCREAS -#CREATURE:FORGOTTEN_BEAST_777:SPLEEN -#CREATURE:FORGOTTEN_BEAST_777:KIDNEY -#CREATURE:FORGOTTEN_BEAST_778:MUSCLE - CREATURE:FORGOTTEN_BEAST_778:EYE -"CREATURE:FORGOTTEN_BEAST_778:BRAIN -!CREATURE:FORGOTTEN_BEAST_778:LUNG -"CREATURE:FORGOTTEN_BEAST_778:HEART -"CREATURE:FORGOTTEN_BEAST_778:LIVER - CREATURE:FORGOTTEN_BEAST_778:GUT -$CREATURE:FORGOTTEN_BEAST_778:STOMACH -$CREATURE:FORGOTTEN_BEAST_778:GIZZARD -%CREATURE:FORGOTTEN_BEAST_778:PANCREAS -#CREATURE:FORGOTTEN_BEAST_778:SPLEEN -#CREATURE:FORGOTTEN_BEAST_778:KIDNEY -#CREATURE:FORGOTTEN_BEAST_779:MUSCLE - CREATURE:FORGOTTEN_BEAST_779:EYE -"CREATURE:FORGOTTEN_BEAST_779:BRAIN -!CREATURE:FORGOTTEN_BEAST_779:LUNG -"CREATURE:FORGOTTEN_BEAST_779:HEART -"CREATURE:FORGOTTEN_BEAST_779:LIVER - CREATURE:FORGOTTEN_BEAST_779:GUT -$CREATURE:FORGOTTEN_BEAST_779:STOMACH -$CREATURE:FORGOTTEN_BEAST_779:GIZZARD -%CREATURE:FORGOTTEN_BEAST_779:PANCREAS -#CREATURE:FORGOTTEN_BEAST_779:SPLEEN -#CREATURE:FORGOTTEN_BEAST_779:KIDNEY -#CREATURE:FORGOTTEN_BEAST_780:MUSCLE - CREATURE:FORGOTTEN_BEAST_780:EYE -"CREATURE:FORGOTTEN_BEAST_780:BRAIN -!CREATURE:FORGOTTEN_BEAST_780:LUNG -"CREATURE:FORGOTTEN_BEAST_780:HEART -"CREATURE:FORGOTTEN_BEAST_780:LIVER - CREATURE:FORGOTTEN_BEAST_780:GUT -$CREATURE:FORGOTTEN_BEAST_780:STOMACH -$CREATURE:FORGOTTEN_BEAST_780:GIZZARD -%CREATURE:FORGOTTEN_BEAST_780:PANCREAS -#CREATURE:FORGOTTEN_BEAST_780:SPLEEN -#CREATURE:FORGOTTEN_BEAST_780:KIDNEY -#CREATURE:FORGOTTEN_BEAST_781:MUSCLE - CREATURE:FORGOTTEN_BEAST_781:EYE -"CREATURE:FORGOTTEN_BEAST_781:BRAIN -!CREATURE:FORGOTTEN_BEAST_781:LUNG -"CREATURE:FORGOTTEN_BEAST_781:HEART -"CREATURE:FORGOTTEN_BEAST_781:LIVER - CREATURE:FORGOTTEN_BEAST_781:GUT -$CREATURE:FORGOTTEN_BEAST_781:STOMACH -$CREATURE:FORGOTTEN_BEAST_781:GIZZARD -%CREATURE:FORGOTTEN_BEAST_781:PANCREAS -#CREATURE:FORGOTTEN_BEAST_781:SPLEEN -#CREATURE:FORGOTTEN_BEAST_781:KIDNEY -#CREATURE:FORGOTTEN_BEAST_782:MUSCLE - CREATURE:FORGOTTEN_BEAST_782:EYE -"CREATURE:FORGOTTEN_BEAST_782:BRAIN -!CREATURE:FORGOTTEN_BEAST_782:LUNG -"CREATURE:FORGOTTEN_BEAST_782:HEART -"CREATURE:FORGOTTEN_BEAST_782:LIVER - CREATURE:FORGOTTEN_BEAST_782:GUT -$CREATURE:FORGOTTEN_BEAST_782:STOMACH -$CREATURE:FORGOTTEN_BEAST_782:GIZZARD -%CREATURE:FORGOTTEN_BEAST_782:PANCREAS -#CREATURE:FORGOTTEN_BEAST_782:SPLEEN -#CREATURE:FORGOTTEN_BEAST_782:KIDNEY -#CREATURE:FORGOTTEN_BEAST_783:MUSCLE - CREATURE:FORGOTTEN_BEAST_783:EYE -"CREATURE:FORGOTTEN_BEAST_783:BRAIN -!CREATURE:FORGOTTEN_BEAST_783:LUNG -"CREATURE:FORGOTTEN_BEAST_783:HEART -"CREATURE:FORGOTTEN_BEAST_783:LIVER - CREATURE:FORGOTTEN_BEAST_783:GUT -$CREATURE:FORGOTTEN_BEAST_783:STOMACH -$CREATURE:FORGOTTEN_BEAST_783:GIZZARD -%CREATURE:FORGOTTEN_BEAST_783:PANCREAS -#CREATURE:FORGOTTEN_BEAST_783:SPLEEN -#CREATURE:FORGOTTEN_BEAST_783:KIDNEY -#CREATURE:FORGOTTEN_BEAST_784:MUSCLE - CREATURE:FORGOTTEN_BEAST_784:EYE -"CREATURE:FORGOTTEN_BEAST_784:BRAIN -!CREATURE:FORGOTTEN_BEAST_784:LUNG -"CREATURE:FORGOTTEN_BEAST_784:HEART -"CREATURE:FORGOTTEN_BEAST_784:LIVER - CREATURE:FORGOTTEN_BEAST_784:GUT -$CREATURE:FORGOTTEN_BEAST_784:STOMACH -$CREATURE:FORGOTTEN_BEAST_784:GIZZARD -%CREATURE:FORGOTTEN_BEAST_784:PANCREAS -#CREATURE:FORGOTTEN_BEAST_784:SPLEEN -#CREATURE:FORGOTTEN_BEAST_784:KIDNEY -#CREATURE:FORGOTTEN_BEAST_785:MUSCLE - CREATURE:FORGOTTEN_BEAST_785:EYE -"CREATURE:FORGOTTEN_BEAST_785:BRAIN -!CREATURE:FORGOTTEN_BEAST_785:LUNG -"CREATURE:FORGOTTEN_BEAST_785:HEART -"CREATURE:FORGOTTEN_BEAST_785:LIVER - CREATURE:FORGOTTEN_BEAST_785:GUT -$CREATURE:FORGOTTEN_BEAST_785:STOMACH -$CREATURE:FORGOTTEN_BEAST_785:GIZZARD -%CREATURE:FORGOTTEN_BEAST_785:PANCREAS -#CREATURE:FORGOTTEN_BEAST_785:SPLEEN -#CREATURE:FORGOTTEN_BEAST_785:KIDNEY -#CREATURE:FORGOTTEN_BEAST_786:MUSCLE - CREATURE:FORGOTTEN_BEAST_786:EYE -"CREATURE:FORGOTTEN_BEAST_786:BRAIN -!CREATURE:FORGOTTEN_BEAST_786:LUNG -"CREATURE:FORGOTTEN_BEAST_786:HEART -"CREATURE:FORGOTTEN_BEAST_786:LIVER - CREATURE:FORGOTTEN_BEAST_786:GUT -$CREATURE:FORGOTTEN_BEAST_786:STOMACH -$CREATURE:FORGOTTEN_BEAST_786:GIZZARD -%CREATURE:FORGOTTEN_BEAST_786:PANCREAS -#CREATURE:FORGOTTEN_BEAST_786:SPLEEN -#CREATURE:FORGOTTEN_BEAST_786:KIDNEY -#CREATURE:FORGOTTEN_BEAST_787:MUSCLE - CREATURE:FORGOTTEN_BEAST_787:EYE -"CREATURE:FORGOTTEN_BEAST_787:BRAIN -!CREATURE:FORGOTTEN_BEAST_787:LUNG -"CREATURE:FORGOTTEN_BEAST_787:HEART -"CREATURE:FORGOTTEN_BEAST_787:LIVER - CREATURE:FORGOTTEN_BEAST_787:GUT -$CREATURE:FORGOTTEN_BEAST_787:STOMACH -$CREATURE:FORGOTTEN_BEAST_787:GIZZARD -%CREATURE:FORGOTTEN_BEAST_787:PANCREAS -#CREATURE:FORGOTTEN_BEAST_787:SPLEEN -#CREATURE:FORGOTTEN_BEAST_787:KIDNEY -#CREATURE:FORGOTTEN_BEAST_789:MUSCLE - CREATURE:FORGOTTEN_BEAST_789:EYE -"CREATURE:FORGOTTEN_BEAST_789:BRAIN -!CREATURE:FORGOTTEN_BEAST_789:LUNG -"CREATURE:FORGOTTEN_BEAST_789:HEART -"CREATURE:FORGOTTEN_BEAST_789:LIVER - CREATURE:FORGOTTEN_BEAST_789:GUT -$CREATURE:FORGOTTEN_BEAST_789:STOMACH -$CREATURE:FORGOTTEN_BEAST_789:GIZZARD -%CREATURE:FORGOTTEN_BEAST_789:PANCREAS -#CREATURE:FORGOTTEN_BEAST_789:SPLEEN -#CREATURE:FORGOTTEN_BEAST_789:KIDNEY -#CREATURE:FORGOTTEN_BEAST_792:MUSCLE - CREATURE:FORGOTTEN_BEAST_792:EYE -"CREATURE:FORGOTTEN_BEAST_792:BRAIN -!CREATURE:FORGOTTEN_BEAST_792:LUNG -"CREATURE:FORGOTTEN_BEAST_792:HEART -"CREATURE:FORGOTTEN_BEAST_792:LIVER - CREATURE:FORGOTTEN_BEAST_792:GUT -$CREATURE:FORGOTTEN_BEAST_792:STOMACH -$CREATURE:FORGOTTEN_BEAST_792:GIZZARD -%CREATURE:FORGOTTEN_BEAST_792:PANCREAS -#CREATURE:FORGOTTEN_BEAST_792:SPLEEN -#CREATURE:FORGOTTEN_BEAST_792:KIDNEY -#CREATURE:FORGOTTEN_BEAST_793:MUSCLE - CREATURE:FORGOTTEN_BEAST_793:EYE -"CREATURE:FORGOTTEN_BEAST_793:BRAIN -!CREATURE:FORGOTTEN_BEAST_793:LUNG -"CREATURE:FORGOTTEN_BEAST_793:HEART -"CREATURE:FORGOTTEN_BEAST_793:LIVER - CREATURE:FORGOTTEN_BEAST_793:GUT -$CREATURE:FORGOTTEN_BEAST_793:STOMACH -$CREATURE:FORGOTTEN_BEAST_793:GIZZARD -%CREATURE:FORGOTTEN_BEAST_793:PANCREAS -#CREATURE:FORGOTTEN_BEAST_793:SPLEEN -#CREATURE:FORGOTTEN_BEAST_793:KIDNEY -#CREATURE:FORGOTTEN_BEAST_794:MUSCLE - CREATURE:FORGOTTEN_BEAST_794:EYE -"CREATURE:FORGOTTEN_BEAST_794:BRAIN -!CREATURE:FORGOTTEN_BEAST_794:LUNG -"CREATURE:FORGOTTEN_BEAST_794:HEART -"CREATURE:FORGOTTEN_BEAST_794:LIVER - CREATURE:FORGOTTEN_BEAST_794:GUT -$CREATURE:FORGOTTEN_BEAST_794:STOMACH -$CREATURE:FORGOTTEN_BEAST_794:GIZZARD -%CREATURE:FORGOTTEN_BEAST_794:PANCREAS -#CREATURE:FORGOTTEN_BEAST_794:SPLEEN -#CREATURE:FORGOTTEN_BEAST_794:KIDNEY -#CREATURE:FORGOTTEN_BEAST_795:MUSCLE - CREATURE:FORGOTTEN_BEAST_795:EYE -"CREATURE:FORGOTTEN_BEAST_795:BRAIN -!CREATURE:FORGOTTEN_BEAST_795:LUNG -"CREATURE:FORGOTTEN_BEAST_795:HEART -"CREATURE:FORGOTTEN_BEAST_795:LIVER - CREATURE:FORGOTTEN_BEAST_795:GUT -$CREATURE:FORGOTTEN_BEAST_795:STOMACH -$CREATURE:FORGOTTEN_BEAST_795:GIZZARD -%CREATURE:FORGOTTEN_BEAST_795:PANCREAS -#CREATURE:FORGOTTEN_BEAST_795:SPLEEN -#CREATURE:FORGOTTEN_BEAST_795:KIDNEY -#CREATURE:FORGOTTEN_BEAST_796:MUSCLE - CREATURE:FORGOTTEN_BEAST_796:EYE -"CREATURE:FORGOTTEN_BEAST_796:BRAIN -!CREATURE:FORGOTTEN_BEAST_796:LUNG -"CREATURE:FORGOTTEN_BEAST_796:HEART -"CREATURE:FORGOTTEN_BEAST_796:LIVER - CREATURE:FORGOTTEN_BEAST_796:GUT -$CREATURE:FORGOTTEN_BEAST_796:STOMACH -$CREATURE:FORGOTTEN_BEAST_796:GIZZARD -%CREATURE:FORGOTTEN_BEAST_796:PANCREAS -#CREATURE:FORGOTTEN_BEAST_796:SPLEEN -#CREATURE:FORGOTTEN_BEAST_796:KIDNEY -#CREATURE:FORGOTTEN_BEAST_799:MUSCLE - CREATURE:FORGOTTEN_BEAST_799:EYE -"CREATURE:FORGOTTEN_BEAST_799:BRAIN -!CREATURE:FORGOTTEN_BEAST_799:LUNG -"CREATURE:FORGOTTEN_BEAST_799:HEART -"CREATURE:FORGOTTEN_BEAST_799:LIVER - CREATURE:FORGOTTEN_BEAST_799:GUT -$CREATURE:FORGOTTEN_BEAST_799:STOMACH -$CREATURE:FORGOTTEN_BEAST_799:GIZZARD -%CREATURE:FORGOTTEN_BEAST_799:PANCREAS -#CREATURE:FORGOTTEN_BEAST_799:SPLEEN -#CREATURE:FORGOTTEN_BEAST_799:KIDNEY -#CREATURE:FORGOTTEN_BEAST_800:MUSCLE - CREATURE:FORGOTTEN_BEAST_800:EYE -"CREATURE:FORGOTTEN_BEAST_800:BRAIN -!CREATURE:FORGOTTEN_BEAST_800:LUNG -"CREATURE:FORGOTTEN_BEAST_800:HEART -"CREATURE:FORGOTTEN_BEAST_800:LIVER - CREATURE:FORGOTTEN_BEAST_800:GUT -$CREATURE:FORGOTTEN_BEAST_800:STOMACH -$CREATURE:FORGOTTEN_BEAST_800:GIZZARD -%CREATURE:FORGOTTEN_BEAST_800:PANCREAS -#CREATURE:FORGOTTEN_BEAST_800:SPLEEN -#CREATURE:FORGOTTEN_BEAST_800:KIDNEY -#CREATURE:FORGOTTEN_BEAST_801:MUSCLE - CREATURE:FORGOTTEN_BEAST_801:EYE -"CREATURE:FORGOTTEN_BEAST_801:BRAIN -!CREATURE:FORGOTTEN_BEAST_801:LUNG -"CREATURE:FORGOTTEN_BEAST_801:HEART -"CREATURE:FORGOTTEN_BEAST_801:LIVER - CREATURE:FORGOTTEN_BEAST_801:GUT -$CREATURE:FORGOTTEN_BEAST_801:STOMACH -$CREATURE:FORGOTTEN_BEAST_801:GIZZARD -%CREATURE:FORGOTTEN_BEAST_801:PANCREAS -#CREATURE:FORGOTTEN_BEAST_801:SPLEEN -#CREATURE:FORGOTTEN_BEAST_801:KIDNEY -#CREATURE:FORGOTTEN_BEAST_802:MUSCLE - CREATURE:FORGOTTEN_BEAST_802:EYE -"CREATURE:FORGOTTEN_BEAST_802:BRAIN -!CREATURE:FORGOTTEN_BEAST_802:LUNG -"CREATURE:FORGOTTEN_BEAST_802:HEART -"CREATURE:FORGOTTEN_BEAST_802:LIVER - CREATURE:FORGOTTEN_BEAST_802:GUT -$CREATURE:FORGOTTEN_BEAST_802:STOMACH -$CREATURE:FORGOTTEN_BEAST_802:GIZZARD -%CREATURE:FORGOTTEN_BEAST_802:PANCREAS -#CREATURE:FORGOTTEN_BEAST_802:SPLEEN -#CREATURE:FORGOTTEN_BEAST_802:KIDNEY -#CREATURE:FORGOTTEN_BEAST_803:MUSCLE - CREATURE:FORGOTTEN_BEAST_803:EYE -"CREATURE:FORGOTTEN_BEAST_803:BRAIN -!CREATURE:FORGOTTEN_BEAST_803:LUNG -"CREATURE:FORGOTTEN_BEAST_803:HEART -"CREATURE:FORGOTTEN_BEAST_803:LIVER - CREATURE:FORGOTTEN_BEAST_803:GUT -$CREATURE:FORGOTTEN_BEAST_803:STOMACH -$CREATURE:FORGOTTEN_BEAST_803:GIZZARD -%CREATURE:FORGOTTEN_BEAST_803:PANCREAS -#CREATURE:FORGOTTEN_BEAST_803:SPLEEN -#CREATURE:FORGOTTEN_BEAST_803:KIDNEY -#CREATURE:FORGOTTEN_BEAST_804:MUSCLE - CREATURE:FORGOTTEN_BEAST_804:EYE -"CREATURE:FORGOTTEN_BEAST_804:BRAIN -!CREATURE:FORGOTTEN_BEAST_804:LUNG -"CREATURE:FORGOTTEN_BEAST_804:HEART -"CREATURE:FORGOTTEN_BEAST_804:LIVER - CREATURE:FORGOTTEN_BEAST_804:GUT -$CREATURE:FORGOTTEN_BEAST_804:STOMACH -$CREATURE:FORGOTTEN_BEAST_804:GIZZARD -%CREATURE:FORGOTTEN_BEAST_804:PANCREAS -#CREATURE:FORGOTTEN_BEAST_804:SPLEEN -#CREATURE:FORGOTTEN_BEAST_804:KIDNEY -#CREATURE:FORGOTTEN_BEAST_806:MUSCLE - CREATURE:FORGOTTEN_BEAST_806:EYE -"CREATURE:FORGOTTEN_BEAST_806:BRAIN -!CREATURE:FORGOTTEN_BEAST_806:LUNG -"CREATURE:FORGOTTEN_BEAST_806:HEART -"CREATURE:FORGOTTEN_BEAST_806:LIVER - CREATURE:FORGOTTEN_BEAST_806:GUT -$CREATURE:FORGOTTEN_BEAST_806:STOMACH -$CREATURE:FORGOTTEN_BEAST_806:GIZZARD -%CREATURE:FORGOTTEN_BEAST_806:PANCREAS -#CREATURE:FORGOTTEN_BEAST_806:SPLEEN -#CREATURE:FORGOTTEN_BEAST_806:KIDNEY -#CREATURE:FORGOTTEN_BEAST_807:MUSCLE - CREATURE:FORGOTTEN_BEAST_807:EYE -"CREATURE:FORGOTTEN_BEAST_807:BRAIN -!CREATURE:FORGOTTEN_BEAST_807:LUNG -"CREATURE:FORGOTTEN_BEAST_807:HEART -"CREATURE:FORGOTTEN_BEAST_807:LIVER - CREATURE:FORGOTTEN_BEAST_807:GUT -$CREATURE:FORGOTTEN_BEAST_807:STOMACH -$CREATURE:FORGOTTEN_BEAST_807:GIZZARD -%CREATURE:FORGOTTEN_BEAST_807:PANCREAS -#CREATURE:FORGOTTEN_BEAST_807:SPLEEN -#CREATURE:FORGOTTEN_BEAST_807:KIDNEY -#CREATURE:FORGOTTEN_BEAST_809:MUSCLE - CREATURE:FORGOTTEN_BEAST_809:EYE -"CREATURE:FORGOTTEN_BEAST_809:BRAIN -!CREATURE:FORGOTTEN_BEAST_809:LUNG -"CREATURE:FORGOTTEN_BEAST_809:HEART -"CREATURE:FORGOTTEN_BEAST_809:LIVER - CREATURE:FORGOTTEN_BEAST_809:GUT -$CREATURE:FORGOTTEN_BEAST_809:STOMACH -$CREATURE:FORGOTTEN_BEAST_809:GIZZARD -%CREATURE:FORGOTTEN_BEAST_809:PANCREAS -#CREATURE:FORGOTTEN_BEAST_809:SPLEEN -#CREATURE:FORGOTTEN_BEAST_809:KIDNEY -#CREATURE:FORGOTTEN_BEAST_810:MUSCLE - CREATURE:FORGOTTEN_BEAST_810:EYE -"CREATURE:FORGOTTEN_BEAST_810:BRAIN -!CREATURE:FORGOTTEN_BEAST_810:LUNG -"CREATURE:FORGOTTEN_BEAST_810:HEART -"CREATURE:FORGOTTEN_BEAST_810:LIVER - CREATURE:FORGOTTEN_BEAST_810:GUT -$CREATURE:FORGOTTEN_BEAST_810:STOMACH -$CREATURE:FORGOTTEN_BEAST_810:GIZZARD -%CREATURE:FORGOTTEN_BEAST_810:PANCREAS -#CREATURE:FORGOTTEN_BEAST_810:SPLEEN -#CREATURE:FORGOTTEN_BEAST_810:KIDNEY -#CREATURE:FORGOTTEN_BEAST_811:MUSCLE - CREATURE:FORGOTTEN_BEAST_811:EYE -"CREATURE:FORGOTTEN_BEAST_811:BRAIN -!CREATURE:FORGOTTEN_BEAST_811:LUNG -"CREATURE:FORGOTTEN_BEAST_811:HEART -"CREATURE:FORGOTTEN_BEAST_811:LIVER - CREATURE:FORGOTTEN_BEAST_811:GUT -$CREATURE:FORGOTTEN_BEAST_811:STOMACH -$CREATURE:FORGOTTEN_BEAST_811:GIZZARD -%CREATURE:FORGOTTEN_BEAST_811:PANCREAS -#CREATURE:FORGOTTEN_BEAST_811:SPLEEN -#CREATURE:FORGOTTEN_BEAST_811:KIDNEY -#CREATURE:FORGOTTEN_BEAST_812:MUSCLE - CREATURE:FORGOTTEN_BEAST_812:EYE -"CREATURE:FORGOTTEN_BEAST_812:BRAIN -!CREATURE:FORGOTTEN_BEAST_812:LUNG -"CREATURE:FORGOTTEN_BEAST_812:HEART -"CREATURE:FORGOTTEN_BEAST_812:LIVER - CREATURE:FORGOTTEN_BEAST_812:GUT -$CREATURE:FORGOTTEN_BEAST_812:STOMACH -$CREATURE:FORGOTTEN_BEAST_812:GIZZARD -%CREATURE:FORGOTTEN_BEAST_812:PANCREAS -#CREATURE:FORGOTTEN_BEAST_812:SPLEEN -#CREATURE:FORGOTTEN_BEAST_812:KIDNEY -#CREATURE:FORGOTTEN_BEAST_815:MUSCLE - CREATURE:FORGOTTEN_BEAST_815:EYE -"CREATURE:FORGOTTEN_BEAST_815:BRAIN -!CREATURE:FORGOTTEN_BEAST_815:LUNG -"CREATURE:FORGOTTEN_BEAST_815:HEART -"CREATURE:FORGOTTEN_BEAST_815:LIVER - CREATURE:FORGOTTEN_BEAST_815:GUT -$CREATURE:FORGOTTEN_BEAST_815:STOMACH -$CREATURE:FORGOTTEN_BEAST_815:GIZZARD -%CREATURE:FORGOTTEN_BEAST_815:PANCREAS -#CREATURE:FORGOTTEN_BEAST_815:SPLEEN -#CREATURE:FORGOTTEN_BEAST_815:KIDNEY -#CREATURE:FORGOTTEN_BEAST_817:MUSCLE - CREATURE:FORGOTTEN_BEAST_817:EYE -"CREATURE:FORGOTTEN_BEAST_817:BRAIN -!CREATURE:FORGOTTEN_BEAST_817:LUNG -"CREATURE:FORGOTTEN_BEAST_817:HEART -"CREATURE:FORGOTTEN_BEAST_817:LIVER - CREATURE:FORGOTTEN_BEAST_817:GUT -$CREATURE:FORGOTTEN_BEAST_817:STOMACH -$CREATURE:FORGOTTEN_BEAST_817:GIZZARD -%CREATURE:FORGOTTEN_BEAST_817:PANCREAS -#CREATURE:FORGOTTEN_BEAST_817:SPLEEN -#CREATURE:FORGOTTEN_BEAST_817:KIDNEY -#CREATURE:FORGOTTEN_BEAST_818:MUSCLE - CREATURE:FORGOTTEN_BEAST_818:EYE -"CREATURE:FORGOTTEN_BEAST_818:BRAIN -!CREATURE:FORGOTTEN_BEAST_818:LUNG -"CREATURE:FORGOTTEN_BEAST_818:HEART -"CREATURE:FORGOTTEN_BEAST_818:LIVER - CREATURE:FORGOTTEN_BEAST_818:GUT -$CREATURE:FORGOTTEN_BEAST_818:STOMACH -$CREATURE:FORGOTTEN_BEAST_818:GIZZARD -%CREATURE:FORGOTTEN_BEAST_818:PANCREAS -#CREATURE:FORGOTTEN_BEAST_818:SPLEEN -#CREATURE:FORGOTTEN_BEAST_818:KIDNEY -#CREATURE:FORGOTTEN_BEAST_819:MUSCLE - CREATURE:FORGOTTEN_BEAST_819:EYE -"CREATURE:FORGOTTEN_BEAST_819:BRAIN -!CREATURE:FORGOTTEN_BEAST_819:LUNG -"CREATURE:FORGOTTEN_BEAST_819:HEART -"CREATURE:FORGOTTEN_BEAST_819:LIVER - CREATURE:FORGOTTEN_BEAST_819:GUT -$CREATURE:FORGOTTEN_BEAST_819:STOMACH -$CREATURE:FORGOTTEN_BEAST_819:GIZZARD -%CREATURE:FORGOTTEN_BEAST_819:PANCREAS -#CREATURE:FORGOTTEN_BEAST_819:SPLEEN -#CREATURE:FORGOTTEN_BEAST_819:KIDNEY -#CREATURE:FORGOTTEN_BEAST_820:MUSCLE - CREATURE:FORGOTTEN_BEAST_820:EYE -"CREATURE:FORGOTTEN_BEAST_820:BRAIN -!CREATURE:FORGOTTEN_BEAST_820:LUNG -"CREATURE:FORGOTTEN_BEAST_820:HEART -"CREATURE:FORGOTTEN_BEAST_820:LIVER - CREATURE:FORGOTTEN_BEAST_820:GUT -$CREATURE:FORGOTTEN_BEAST_820:STOMACH -$CREATURE:FORGOTTEN_BEAST_820:GIZZARD -%CREATURE:FORGOTTEN_BEAST_820:PANCREAS -#CREATURE:FORGOTTEN_BEAST_820:SPLEEN -#CREATURE:FORGOTTEN_BEAST_820:KIDNEY -#CREATURE:FORGOTTEN_BEAST_821:MUSCLE - CREATURE:FORGOTTEN_BEAST_821:EYE -"CREATURE:FORGOTTEN_BEAST_821:BRAIN -!CREATURE:FORGOTTEN_BEAST_821:LUNG -"CREATURE:FORGOTTEN_BEAST_821:HEART -"CREATURE:FORGOTTEN_BEAST_821:LIVER - CREATURE:FORGOTTEN_BEAST_821:GUT -$CREATURE:FORGOTTEN_BEAST_821:STOMACH -$CREATURE:FORGOTTEN_BEAST_821:GIZZARD -%CREATURE:FORGOTTEN_BEAST_821:PANCREAS -#CREATURE:FORGOTTEN_BEAST_821:SPLEEN -#CREATURE:FORGOTTEN_BEAST_821:KIDNEY -#CREATURE:FORGOTTEN_BEAST_822:MUSCLE - CREATURE:FORGOTTEN_BEAST_822:EYE -"CREATURE:FORGOTTEN_BEAST_822:BRAIN -!CREATURE:FORGOTTEN_BEAST_822:LUNG -"CREATURE:FORGOTTEN_BEAST_822:HEART -"CREATURE:FORGOTTEN_BEAST_822:LIVER - CREATURE:FORGOTTEN_BEAST_822:GUT -$CREATURE:FORGOTTEN_BEAST_822:STOMACH -$CREATURE:FORGOTTEN_BEAST_822:GIZZARD -%CREATURE:FORGOTTEN_BEAST_822:PANCREAS -#CREATURE:FORGOTTEN_BEAST_822:SPLEEN -#CREATURE:FORGOTTEN_BEAST_822:KIDNEY -#CREATURE:FORGOTTEN_BEAST_824:MUSCLE - CREATURE:FORGOTTEN_BEAST_824:EYE -"CREATURE:FORGOTTEN_BEAST_824:BRAIN -!CREATURE:FORGOTTEN_BEAST_824:LUNG -"CREATURE:FORGOTTEN_BEAST_824:HEART -"CREATURE:FORGOTTEN_BEAST_824:LIVER - CREATURE:FORGOTTEN_BEAST_824:GUT -$CREATURE:FORGOTTEN_BEAST_824:STOMACH -$CREATURE:FORGOTTEN_BEAST_824:GIZZARD -%CREATURE:FORGOTTEN_BEAST_824:PANCREAS -#CREATURE:FORGOTTEN_BEAST_824:SPLEEN -#CREATURE:FORGOTTEN_BEAST_824:KIDNEY -#CREATURE:FORGOTTEN_BEAST_825:MUSCLE - CREATURE:FORGOTTEN_BEAST_825:EYE -"CREATURE:FORGOTTEN_BEAST_825:BRAIN -!CREATURE:FORGOTTEN_BEAST_825:LUNG -"CREATURE:FORGOTTEN_BEAST_825:HEART -"CREATURE:FORGOTTEN_BEAST_825:LIVER - CREATURE:FORGOTTEN_BEAST_825:GUT -$CREATURE:FORGOTTEN_BEAST_825:STOMACH -$CREATURE:FORGOTTEN_BEAST_825:GIZZARD -%CREATURE:FORGOTTEN_BEAST_825:PANCREAS -#CREATURE:FORGOTTEN_BEAST_825:SPLEEN -#CREATURE:FORGOTTEN_BEAST_825:KIDNEY -#CREATURE:FORGOTTEN_BEAST_826:MUSCLE - CREATURE:FORGOTTEN_BEAST_826:EYE -"CREATURE:FORGOTTEN_BEAST_826:BRAIN -!CREATURE:FORGOTTEN_BEAST_826:LUNG -"CREATURE:FORGOTTEN_BEAST_826:HEART -"CREATURE:FORGOTTEN_BEAST_826:LIVER - CREATURE:FORGOTTEN_BEAST_826:GUT -$CREATURE:FORGOTTEN_BEAST_826:STOMACH -$CREATURE:FORGOTTEN_BEAST_826:GIZZARD -%CREATURE:FORGOTTEN_BEAST_826:PANCREAS -#CREATURE:FORGOTTEN_BEAST_826:SPLEEN -#CREATURE:FORGOTTEN_BEAST_826:KIDNEY -#CREATURE:FORGOTTEN_BEAST_827:MUSCLE - CREATURE:FORGOTTEN_BEAST_827:EYE -"CREATURE:FORGOTTEN_BEAST_827:BRAIN -!CREATURE:FORGOTTEN_BEAST_827:LUNG -"CREATURE:FORGOTTEN_BEAST_827:HEART -"CREATURE:FORGOTTEN_BEAST_827:LIVER - CREATURE:FORGOTTEN_BEAST_827:GUT -$CREATURE:FORGOTTEN_BEAST_827:STOMACH -$CREATURE:FORGOTTEN_BEAST_827:GIZZARD -%CREATURE:FORGOTTEN_BEAST_827:PANCREAS -#CREATURE:FORGOTTEN_BEAST_827:SPLEEN -#CREATURE:FORGOTTEN_BEAST_827:KIDNEY -#CREATURE:FORGOTTEN_BEAST_828:MUSCLE - CREATURE:FORGOTTEN_BEAST_828:EYE -"CREATURE:FORGOTTEN_BEAST_828:BRAIN -!CREATURE:FORGOTTEN_BEAST_828:LUNG -"CREATURE:FORGOTTEN_BEAST_828:HEART -"CREATURE:FORGOTTEN_BEAST_828:LIVER - CREATURE:FORGOTTEN_BEAST_828:GUT -$CREATURE:FORGOTTEN_BEAST_828:STOMACH -$CREATURE:FORGOTTEN_BEAST_828:GIZZARD -%CREATURE:FORGOTTEN_BEAST_828:PANCREAS -#CREATURE:FORGOTTEN_BEAST_828:SPLEEN -#CREATURE:FORGOTTEN_BEAST_828:KIDNEY -#CREATURE:FORGOTTEN_BEAST_831:MUSCLE - CREATURE:FORGOTTEN_BEAST_831:EYE -"CREATURE:FORGOTTEN_BEAST_831:BRAIN -!CREATURE:FORGOTTEN_BEAST_831:LUNG -"CREATURE:FORGOTTEN_BEAST_831:HEART -"CREATURE:FORGOTTEN_BEAST_831:LIVER - CREATURE:FORGOTTEN_BEAST_831:GUT -$CREATURE:FORGOTTEN_BEAST_831:STOMACH -$CREATURE:FORGOTTEN_BEAST_831:GIZZARD -%CREATURE:FORGOTTEN_BEAST_831:PANCREAS -#CREATURE:FORGOTTEN_BEAST_831:SPLEEN -#CREATURE:FORGOTTEN_BEAST_831:KIDNEY -#CREATURE:FORGOTTEN_BEAST_833:MUSCLE - CREATURE:FORGOTTEN_BEAST_833:EYE -"CREATURE:FORGOTTEN_BEAST_833:BRAIN -!CREATURE:FORGOTTEN_BEAST_833:LUNG -"CREATURE:FORGOTTEN_BEAST_833:HEART -"CREATURE:FORGOTTEN_BEAST_833:LIVER - CREATURE:FORGOTTEN_BEAST_833:GUT -$CREATURE:FORGOTTEN_BEAST_833:STOMACH -$CREATURE:FORGOTTEN_BEAST_833:GIZZARD -%CREATURE:FORGOTTEN_BEAST_833:PANCREAS -#CREATURE:FORGOTTEN_BEAST_833:SPLEEN -#CREATURE:FORGOTTEN_BEAST_833:KIDNEY -#CREATURE:FORGOTTEN_BEAST_835:MUSCLE - CREATURE:FORGOTTEN_BEAST_835:EYE -"CREATURE:FORGOTTEN_BEAST_835:BRAIN -!CREATURE:FORGOTTEN_BEAST_835:LUNG -"CREATURE:FORGOTTEN_BEAST_835:HEART -"CREATURE:FORGOTTEN_BEAST_835:LIVER - CREATURE:FORGOTTEN_BEAST_835:GUT -$CREATURE:FORGOTTEN_BEAST_835:STOMACH -$CREATURE:FORGOTTEN_BEAST_835:GIZZARD -%CREATURE:FORGOTTEN_BEAST_835:PANCREAS -#CREATURE:FORGOTTEN_BEAST_835:SPLEEN -#CREATURE:FORGOTTEN_BEAST_835:KIDNEY -#CREATURE:FORGOTTEN_BEAST_837:MUSCLE - CREATURE:FORGOTTEN_BEAST_837:EYE -"CREATURE:FORGOTTEN_BEAST_837:BRAIN -!CREATURE:FORGOTTEN_BEAST_837:LUNG -"CREATURE:FORGOTTEN_BEAST_837:HEART -"CREATURE:FORGOTTEN_BEAST_837:LIVER - CREATURE:FORGOTTEN_BEAST_837:GUT -$CREATURE:FORGOTTEN_BEAST_837:STOMACH -$CREATURE:FORGOTTEN_BEAST_837:GIZZARD -%CREATURE:FORGOTTEN_BEAST_837:PANCREAS -#CREATURE:FORGOTTEN_BEAST_837:SPLEEN -#CREATURE:FORGOTTEN_BEAST_837:KIDNEY -#CREATURE:FORGOTTEN_BEAST_838:MUSCLE - CREATURE:FORGOTTEN_BEAST_838:EYE -"CREATURE:FORGOTTEN_BEAST_838:BRAIN -!CREATURE:FORGOTTEN_BEAST_838:LUNG -"CREATURE:FORGOTTEN_BEAST_838:HEART -"CREATURE:FORGOTTEN_BEAST_838:LIVER - CREATURE:FORGOTTEN_BEAST_838:GUT -$CREATURE:FORGOTTEN_BEAST_838:STOMACH -$CREATURE:FORGOTTEN_BEAST_838:GIZZARD -%CREATURE:FORGOTTEN_BEAST_838:PANCREAS -#CREATURE:FORGOTTEN_BEAST_838:SPLEEN -#CREATURE:FORGOTTEN_BEAST_838:KIDNEY -#CREATURE:FORGOTTEN_BEAST_842:MUSCLE - CREATURE:FORGOTTEN_BEAST_842:EYE -"CREATURE:FORGOTTEN_BEAST_842:BRAIN -!CREATURE:FORGOTTEN_BEAST_842:LUNG -"CREATURE:FORGOTTEN_BEAST_842:HEART -"CREATURE:FORGOTTEN_BEAST_842:LIVER - CREATURE:FORGOTTEN_BEAST_842:GUT -$CREATURE:FORGOTTEN_BEAST_842:STOMACH -$CREATURE:FORGOTTEN_BEAST_842:GIZZARD -%CREATURE:FORGOTTEN_BEAST_842:PANCREAS -#CREATURE:FORGOTTEN_BEAST_842:SPLEEN -#CREATURE:FORGOTTEN_BEAST_842:KIDNEY -#CREATURE:FORGOTTEN_BEAST_843:MUSCLE - CREATURE:FORGOTTEN_BEAST_843:EYE -"CREATURE:FORGOTTEN_BEAST_843:BRAIN -!CREATURE:FORGOTTEN_BEAST_843:LUNG -"CREATURE:FORGOTTEN_BEAST_843:HEART -"CREATURE:FORGOTTEN_BEAST_843:LIVER - CREATURE:FORGOTTEN_BEAST_843:GUT -$CREATURE:FORGOTTEN_BEAST_843:STOMACH -$CREATURE:FORGOTTEN_BEAST_843:GIZZARD -%CREATURE:FORGOTTEN_BEAST_843:PANCREAS -#CREATURE:FORGOTTEN_BEAST_843:SPLEEN -#CREATURE:FORGOTTEN_BEAST_843:KIDNEY -#CREATURE:FORGOTTEN_BEAST_844:MUSCLE - CREATURE:FORGOTTEN_BEAST_844:EYE -"CREATURE:FORGOTTEN_BEAST_844:BRAIN -!CREATURE:FORGOTTEN_BEAST_844:LUNG -"CREATURE:FORGOTTEN_BEAST_844:HEART -"CREATURE:FORGOTTEN_BEAST_844:LIVER - CREATURE:FORGOTTEN_BEAST_844:GUT -$CREATURE:FORGOTTEN_BEAST_844:STOMACH -$CREATURE:FORGOTTEN_BEAST_844:GIZZARD -%CREATURE:FORGOTTEN_BEAST_844:PANCREAS -#CREATURE:FORGOTTEN_BEAST_844:SPLEEN -#CREATURE:FORGOTTEN_BEAST_844:KIDNEY -#CREATURE:FORGOTTEN_BEAST_845:MUSCLE - CREATURE:FORGOTTEN_BEAST_845:EYE -"CREATURE:FORGOTTEN_BEAST_845:BRAIN -!CREATURE:FORGOTTEN_BEAST_845:LUNG -"CREATURE:FORGOTTEN_BEAST_845:HEART -"CREATURE:FORGOTTEN_BEAST_845:LIVER - CREATURE:FORGOTTEN_BEAST_845:GUT -$CREATURE:FORGOTTEN_BEAST_845:STOMACH -$CREATURE:FORGOTTEN_BEAST_845:GIZZARD -%CREATURE:FORGOTTEN_BEAST_845:PANCREAS -#CREATURE:FORGOTTEN_BEAST_845:SPLEEN -#CREATURE:FORGOTTEN_BEAST_845:KIDNEY -#CREATURE:FORGOTTEN_BEAST_846:MUSCLE - CREATURE:FORGOTTEN_BEAST_846:EYE -"CREATURE:FORGOTTEN_BEAST_846:BRAIN -!CREATURE:FORGOTTEN_BEAST_846:LUNG -"CREATURE:FORGOTTEN_BEAST_846:HEART -"CREATURE:FORGOTTEN_BEAST_846:LIVER - CREATURE:FORGOTTEN_BEAST_846:GUT -$CREATURE:FORGOTTEN_BEAST_846:STOMACH -$CREATURE:FORGOTTEN_BEAST_846:GIZZARD -%CREATURE:FORGOTTEN_BEAST_846:PANCREAS -#CREATURE:FORGOTTEN_BEAST_846:SPLEEN -#CREATURE:FORGOTTEN_BEAST_846:KIDNEY -#CREATURE:FORGOTTEN_BEAST_847:MUSCLE - CREATURE:FORGOTTEN_BEAST_847:EYE -"CREATURE:FORGOTTEN_BEAST_847:BRAIN -!CREATURE:FORGOTTEN_BEAST_847:LUNG -"CREATURE:FORGOTTEN_BEAST_847:HEART -"CREATURE:FORGOTTEN_BEAST_847:LIVER - CREATURE:FORGOTTEN_BEAST_847:GUT -$CREATURE:FORGOTTEN_BEAST_847:STOMACH -$CREATURE:FORGOTTEN_BEAST_847:GIZZARD -%CREATURE:FORGOTTEN_BEAST_847:PANCREAS -#CREATURE:FORGOTTEN_BEAST_847:SPLEEN -#CREATURE:FORGOTTEN_BEAST_847:KIDNEY -#CREATURE:FORGOTTEN_BEAST_848:MUSCLE - CREATURE:FORGOTTEN_BEAST_848:EYE -"CREATURE:FORGOTTEN_BEAST_848:BRAIN -!CREATURE:FORGOTTEN_BEAST_848:LUNG -"CREATURE:FORGOTTEN_BEAST_848:HEART -"CREATURE:FORGOTTEN_BEAST_848:LIVER - CREATURE:FORGOTTEN_BEAST_848:GUT -$CREATURE:FORGOTTEN_BEAST_848:STOMACH -$CREATURE:FORGOTTEN_BEAST_848:GIZZARD -%CREATURE:FORGOTTEN_BEAST_848:PANCREAS -#CREATURE:FORGOTTEN_BEAST_848:SPLEEN -#CREATURE:FORGOTTEN_BEAST_848:KIDNEY -#CREATURE:FORGOTTEN_BEAST_849:MUSCLE - CREATURE:FORGOTTEN_BEAST_849:EYE -"CREATURE:FORGOTTEN_BEAST_849:BRAIN -!CREATURE:FORGOTTEN_BEAST_849:LUNG -"CREATURE:FORGOTTEN_BEAST_849:HEART -"CREATURE:FORGOTTEN_BEAST_849:LIVER - CREATURE:FORGOTTEN_BEAST_849:GUT -$CREATURE:FORGOTTEN_BEAST_849:STOMACH -$CREATURE:FORGOTTEN_BEAST_849:GIZZARD -%CREATURE:FORGOTTEN_BEAST_849:PANCREAS -#CREATURE:FORGOTTEN_BEAST_849:SPLEEN -#CREATURE:FORGOTTEN_BEAST_849:KIDNEY -#CREATURE:FORGOTTEN_BEAST_851:MUSCLE - CREATURE:FORGOTTEN_BEAST_851:EYE -"CREATURE:FORGOTTEN_BEAST_851:BRAIN -!CREATURE:FORGOTTEN_BEAST_851:LUNG -"CREATURE:FORGOTTEN_BEAST_851:HEART -"CREATURE:FORGOTTEN_BEAST_851:LIVER - CREATURE:FORGOTTEN_BEAST_851:GUT -$CREATURE:FORGOTTEN_BEAST_851:STOMACH -$CREATURE:FORGOTTEN_BEAST_851:GIZZARD -%CREATURE:FORGOTTEN_BEAST_851:PANCREAS -#CREATURE:FORGOTTEN_BEAST_851:SPLEEN -#CREATURE:FORGOTTEN_BEAST_851:KIDNEY -#CREATURE:FORGOTTEN_BEAST_853:MUSCLE - CREATURE:FORGOTTEN_BEAST_853:EYE -"CREATURE:FORGOTTEN_BEAST_853:BRAIN -!CREATURE:FORGOTTEN_BEAST_853:LUNG -"CREATURE:FORGOTTEN_BEAST_853:HEART -"CREATURE:FORGOTTEN_BEAST_853:LIVER - CREATURE:FORGOTTEN_BEAST_853:GUT -$CREATURE:FORGOTTEN_BEAST_853:STOMACH -$CREATURE:FORGOTTEN_BEAST_853:GIZZARD -%CREATURE:FORGOTTEN_BEAST_853:PANCREAS -#CREATURE:FORGOTTEN_BEAST_853:SPLEEN -#CREATURE:FORGOTTEN_BEAST_853:KIDNEY -#CREATURE:FORGOTTEN_BEAST_854:MUSCLE - CREATURE:FORGOTTEN_BEAST_854:EYE -"CREATURE:FORGOTTEN_BEAST_854:BRAIN -!CREATURE:FORGOTTEN_BEAST_854:LUNG -"CREATURE:FORGOTTEN_BEAST_854:HEART -"CREATURE:FORGOTTEN_BEAST_854:LIVER - CREATURE:FORGOTTEN_BEAST_854:GUT -$CREATURE:FORGOTTEN_BEAST_854:STOMACH -$CREATURE:FORGOTTEN_BEAST_854:GIZZARD -%CREATURE:FORGOTTEN_BEAST_854:PANCREAS -#CREATURE:FORGOTTEN_BEAST_854:SPLEEN -#CREATURE:FORGOTTEN_BEAST_854:KIDNEY -#CREATURE:FORGOTTEN_BEAST_855:MUSCLE - CREATURE:FORGOTTEN_BEAST_855:EYE -"CREATURE:FORGOTTEN_BEAST_855:BRAIN -!CREATURE:FORGOTTEN_BEAST_855:LUNG -"CREATURE:FORGOTTEN_BEAST_855:HEART -"CREATURE:FORGOTTEN_BEAST_855:LIVER - CREATURE:FORGOTTEN_BEAST_855:GUT -$CREATURE:FORGOTTEN_BEAST_855:STOMACH -$CREATURE:FORGOTTEN_BEAST_855:GIZZARD -%CREATURE:FORGOTTEN_BEAST_855:PANCREAS -#CREATURE:FORGOTTEN_BEAST_855:SPLEEN -#CREATURE:FORGOTTEN_BEAST_855:KIDNEY -#CREATURE:FORGOTTEN_BEAST_857:MUSCLE - CREATURE:FORGOTTEN_BEAST_857:EYE -"CREATURE:FORGOTTEN_BEAST_857:BRAIN -!CREATURE:FORGOTTEN_BEAST_857:LUNG -"CREATURE:FORGOTTEN_BEAST_857:HEART -"CREATURE:FORGOTTEN_BEAST_857:LIVER - CREATURE:FORGOTTEN_BEAST_857:GUT -$CREATURE:FORGOTTEN_BEAST_857:STOMACH -$CREATURE:FORGOTTEN_BEAST_857:GIZZARD -%CREATURE:FORGOTTEN_BEAST_857:PANCREAS -#CREATURE:FORGOTTEN_BEAST_857:SPLEEN -#CREATURE:FORGOTTEN_BEAST_857:KIDNEY -#CREATURE:FORGOTTEN_BEAST_858:MUSCLE - CREATURE:FORGOTTEN_BEAST_858:EYE -"CREATURE:FORGOTTEN_BEAST_858:BRAIN -!CREATURE:FORGOTTEN_BEAST_858:LUNG -"CREATURE:FORGOTTEN_BEAST_858:HEART -"CREATURE:FORGOTTEN_BEAST_858:LIVER - CREATURE:FORGOTTEN_BEAST_858:GUT -$CREATURE:FORGOTTEN_BEAST_858:STOMACH -$CREATURE:FORGOTTEN_BEAST_858:GIZZARD -%CREATURE:FORGOTTEN_BEAST_858:PANCREAS -#CREATURE:FORGOTTEN_BEAST_858:SPLEEN -#CREATURE:FORGOTTEN_BEAST_858:KIDNEY -#CREATURE:FORGOTTEN_BEAST_859:MUSCLE - CREATURE:FORGOTTEN_BEAST_859:EYE -"CREATURE:FORGOTTEN_BEAST_859:BRAIN -!CREATURE:FORGOTTEN_BEAST_859:LUNG -"CREATURE:FORGOTTEN_BEAST_859:HEART -"CREATURE:FORGOTTEN_BEAST_859:LIVER - CREATURE:FORGOTTEN_BEAST_859:GUT -$CREATURE:FORGOTTEN_BEAST_859:STOMACH -$CREATURE:FORGOTTEN_BEAST_859:GIZZARD -%CREATURE:FORGOTTEN_BEAST_859:PANCREAS -#CREATURE:FORGOTTEN_BEAST_859:SPLEEN -#CREATURE:FORGOTTEN_BEAST_859:KIDNEY -#CREATURE:FORGOTTEN_BEAST_860:MUSCLE - CREATURE:FORGOTTEN_BEAST_860:EYE -"CREATURE:FORGOTTEN_BEAST_860:BRAIN -!CREATURE:FORGOTTEN_BEAST_860:LUNG -"CREATURE:FORGOTTEN_BEAST_860:HEART -"CREATURE:FORGOTTEN_BEAST_860:LIVER - CREATURE:FORGOTTEN_BEAST_860:GUT -$CREATURE:FORGOTTEN_BEAST_860:STOMACH -$CREATURE:FORGOTTEN_BEAST_860:GIZZARD -%CREATURE:FORGOTTEN_BEAST_860:PANCREAS -#CREATURE:FORGOTTEN_BEAST_860:SPLEEN -#CREATURE:FORGOTTEN_BEAST_860:KIDNEY -#CREATURE:FORGOTTEN_BEAST_861:MUSCLE - CREATURE:FORGOTTEN_BEAST_861:EYE -"CREATURE:FORGOTTEN_BEAST_861:BRAIN -!CREATURE:FORGOTTEN_BEAST_861:LUNG -"CREATURE:FORGOTTEN_BEAST_861:HEART -"CREATURE:FORGOTTEN_BEAST_861:LIVER - CREATURE:FORGOTTEN_BEAST_861:GUT -$CREATURE:FORGOTTEN_BEAST_861:STOMACH -$CREATURE:FORGOTTEN_BEAST_861:GIZZARD -%CREATURE:FORGOTTEN_BEAST_861:PANCREAS -#CREATURE:FORGOTTEN_BEAST_861:SPLEEN -#CREATURE:FORGOTTEN_BEAST_861:KIDNEY -#CREATURE:FORGOTTEN_BEAST_862:MUSCLE - CREATURE:FORGOTTEN_BEAST_862:EYE -"CREATURE:FORGOTTEN_BEAST_862:BRAIN -!CREATURE:FORGOTTEN_BEAST_862:LUNG -"CREATURE:FORGOTTEN_BEAST_862:HEART -"CREATURE:FORGOTTEN_BEAST_862:LIVER - CREATURE:FORGOTTEN_BEAST_862:GUT -$CREATURE:FORGOTTEN_BEAST_862:STOMACH -$CREATURE:FORGOTTEN_BEAST_862:GIZZARD -%CREATURE:FORGOTTEN_BEAST_862:PANCREAS -#CREATURE:FORGOTTEN_BEAST_862:SPLEEN -#CREATURE:FORGOTTEN_BEAST_862:KIDNEY -#CREATURE:FORGOTTEN_BEAST_865:MUSCLE - CREATURE:FORGOTTEN_BEAST_865:EYE -"CREATURE:FORGOTTEN_BEAST_865:BRAIN -!CREATURE:FORGOTTEN_BEAST_865:LUNG -"CREATURE:FORGOTTEN_BEAST_865:HEART -"CREATURE:FORGOTTEN_BEAST_865:LIVER - CREATURE:FORGOTTEN_BEAST_865:GUT -$CREATURE:FORGOTTEN_BEAST_865:STOMACH -$CREATURE:FORGOTTEN_BEAST_865:GIZZARD -%CREATURE:FORGOTTEN_BEAST_865:PANCREAS -#CREATURE:FORGOTTEN_BEAST_865:SPLEEN -#CREATURE:FORGOTTEN_BEAST_865:KIDNEY -#CREATURE:FORGOTTEN_BEAST_866:MUSCLE - CREATURE:FORGOTTEN_BEAST_866:EYE -"CREATURE:FORGOTTEN_BEAST_866:BRAIN -!CREATURE:FORGOTTEN_BEAST_866:LUNG -"CREATURE:FORGOTTEN_BEAST_866:HEART -"CREATURE:FORGOTTEN_BEAST_866:LIVER - CREATURE:FORGOTTEN_BEAST_866:GUT -$CREATURE:FORGOTTEN_BEAST_866:STOMACH -$CREATURE:FORGOTTEN_BEAST_866:GIZZARD -%CREATURE:FORGOTTEN_BEAST_866:PANCREAS -#CREATURE:FORGOTTEN_BEAST_866:SPLEEN -#CREATURE:FORGOTTEN_BEAST_866:KIDNEY -#CREATURE:FORGOTTEN_BEAST_867:MUSCLE - CREATURE:FORGOTTEN_BEAST_867:EYE -"CREATURE:FORGOTTEN_BEAST_867:BRAIN -!CREATURE:FORGOTTEN_BEAST_867:LUNG -"CREATURE:FORGOTTEN_BEAST_867:HEART -"CREATURE:FORGOTTEN_BEAST_867:LIVER - CREATURE:FORGOTTEN_BEAST_867:GUT -$CREATURE:FORGOTTEN_BEAST_867:STOMACH -$CREATURE:FORGOTTEN_BEAST_867:GIZZARD -%CREATURE:FORGOTTEN_BEAST_867:PANCREAS -#CREATURE:FORGOTTEN_BEAST_867:SPLEEN -#CREATURE:FORGOTTEN_BEAST_867:KIDNEY -CREATURE:TITAN_1:MUSCLE -CREATURE:TITAN_1:EYE -CREATURE:TITAN_1:BRAIN -CREATURE:TITAN_1:LUNG -CREATURE:TITAN_1:HEART -CREATURE:TITAN_1:LIVER -CREATURE:TITAN_1:GUT -CREATURE:TITAN_1:STOMACH -CREATURE:TITAN_1:GIZZARD -CREATURE:TITAN_1:PANCREAS -CREATURE:TITAN_1:SPLEEN -CREATURE:TITAN_1:KIDNEY -CREATURE:TITAN_3:MUSCLE -CREATURE:TITAN_3:EYE -CREATURE:TITAN_3:BRAIN -CREATURE:TITAN_3:LUNG -CREATURE:TITAN_3:HEART -CREATURE:TITAN_3:LIVER -CREATURE:TITAN_3:GUT -CREATURE:TITAN_3:STOMACH -CREATURE:TITAN_3:GIZZARD -CREATURE:TITAN_3:PANCREAS -CREATURE:TITAN_3:SPLEEN -CREATURE:TITAN_3:KIDNEY -CREATURE:TITAN_4:MUSCLE -CREATURE:TITAN_4:EYE -CREATURE:TITAN_4:BRAIN -CREATURE:TITAN_4:LUNG -CREATURE:TITAN_4:HEART -CREATURE:TITAN_4:LIVER -CREATURE:TITAN_4:GUT -CREATURE:TITAN_4:STOMACH -CREATURE:TITAN_4:GIZZARD -CREATURE:TITAN_4:PANCREAS -CREATURE:TITAN_4:SPLEEN -CREATURE:TITAN_4:KIDNEY -CREATURE:TITAN_6:MUSCLE -CREATURE:TITAN_6:EYE -CREATURE:TITAN_6:BRAIN -CREATURE:TITAN_6:LUNG -CREATURE:TITAN_6:HEART -CREATURE:TITAN_6:LIVER -CREATURE:TITAN_6:GUT -CREATURE:TITAN_6:STOMACH -CREATURE:TITAN_6:GIZZARD -CREATURE:TITAN_6:PANCREAS -CREATURE:TITAN_6:SPLEEN -CREATURE:TITAN_6:KIDNEY -CREATURE:TITAN_7:MUSCLE -CREATURE:TITAN_7:EYE -CREATURE:TITAN_7:BRAIN -CREATURE:TITAN_7:LUNG -CREATURE:TITAN_7:HEART -CREATURE:TITAN_7:LIVER -CREATURE:TITAN_7:GUT -CREATURE:TITAN_7:STOMACH -CREATURE:TITAN_7:GIZZARD -CREATURE:TITAN_7:PANCREAS -CREATURE:TITAN_7:SPLEEN -CREATURE:TITAN_7:KIDNEY -CREATURE:TITAN_8:MUSCLE -CREATURE:TITAN_8:EYE -CREATURE:TITAN_8:BRAIN -CREATURE:TITAN_8:LUNG -CREATURE:TITAN_8:HEART -CREATURE:TITAN_8:LIVER -CREATURE:TITAN_8:GUT -CREATURE:TITAN_8:STOMACH -CREATURE:TITAN_8:GIZZARD -CREATURE:TITAN_8:PANCREAS -CREATURE:TITAN_8:SPLEEN -CREATURE:TITAN_8:KIDNEY -CREATURE:TITAN_9:MUSCLE -CREATURE:TITAN_9:EYE -CREATURE:TITAN_9:BRAIN -CREATURE:TITAN_9:LUNG -CREATURE:TITAN_9:HEART -CREATURE:TITAN_9:LIVER -CREATURE:TITAN_9:GUT -CREATURE:TITAN_9:STOMACH -CREATURE:TITAN_9:GIZZARD -CREATURE:TITAN_9:PANCREAS -CREATURE:TITAN_9:SPLEEN -CREATURE:TITAN_9:KIDNEY -CREATURE:TITAN_10:MUSCLE -CREATURE:TITAN_10:EYE -CREATURE:TITAN_10:BRAIN -CREATURE:TITAN_10:LUNG -CREATURE:TITAN_10:HEART -CREATURE:TITAN_10:LIVER -CREATURE:TITAN_10:GUT -CREATURE:TITAN_10:STOMACH -CREATURE:TITAN_10:GIZZARD -CREATURE:TITAN_10:PANCREAS -CREATURE:TITAN_10:SPLEEN -CREATURE:TITAN_10:KIDNEY -CREATURE:TITAN_11:MUSCLE -CREATURE:TITAN_11:EYE -CREATURE:TITAN_11:BRAIN -CREATURE:TITAN_11:LUNG -CREATURE:TITAN_11:HEART -CREATURE:TITAN_11:LIVER -CREATURE:TITAN_11:GUT -CREATURE:TITAN_11:STOMACH -CREATURE:TITAN_11:GIZZARD -CREATURE:TITAN_11:PANCREAS -CREATURE:TITAN_11:SPLEEN -CREATURE:TITAN_11:KIDNEY -CREATURE:TITAN_12:MUSCLE -CREATURE:TITAN_12:EYE -CREATURE:TITAN_12:BRAIN -CREATURE:TITAN_12:LUNG -CREATURE:TITAN_12:HEART -CREATURE:TITAN_12:LIVER -CREATURE:TITAN_12:GUT -CREATURE:TITAN_12:STOMACH -CREATURE:TITAN_12:GIZZARD -CREATURE:TITAN_12:PANCREAS -CREATURE:TITAN_12:SPLEEN -CREATURE:TITAN_12:KIDNEY -CREATURE:TITAN_13:MUSCLE -CREATURE:TITAN_13:EYE -CREATURE:TITAN_13:BRAIN -CREATURE:TITAN_13:LUNG -CREATURE:TITAN_13:HEART -CREATURE:TITAN_13:LIVER -CREATURE:TITAN_13:GUT -CREATURE:TITAN_13:STOMACH -CREATURE:TITAN_13:GIZZARD -CREATURE:TITAN_13:PANCREAS -CREATURE:TITAN_13:SPLEEN -CREATURE:TITAN_13:KIDNEY -CREATURE:TITAN_14:MUSCLE -CREATURE:TITAN_14:EYE -CREATURE:TITAN_14:BRAIN -CREATURE:TITAN_14:LUNG -CREATURE:TITAN_14:HEART -CREATURE:TITAN_14:LIVER -CREATURE:TITAN_14:GUT -CREATURE:TITAN_14:STOMACH -CREATURE:TITAN_14:GIZZARD -CREATURE:TITAN_14:PANCREAS -CREATURE:TITAN_14:SPLEEN -CREATURE:TITAN_14:KIDNEY -CREATURE:TITAN_15:MUSCLE -CREATURE:TITAN_15:EYE -CREATURE:TITAN_15:BRAIN -CREATURE:TITAN_15:LUNG -CREATURE:TITAN_15:HEART -CREATURE:TITAN_15:LIVER -CREATURE:TITAN_15:GUT -CREATURE:TITAN_15:STOMACH -CREATURE:TITAN_15:GIZZARD -CREATURE:TITAN_15:PANCREAS -CREATURE:TITAN_15:SPLEEN -CREATURE:TITAN_15:KIDNEY -CREATURE:TITAN_18:MUSCLE -CREATURE:TITAN_18:EYE -CREATURE:TITAN_18:BRAIN -CREATURE:TITAN_18:LUNG -CREATURE:TITAN_18:HEART -CREATURE:TITAN_18:LIVER -CREATURE:TITAN_18:GUT -CREATURE:TITAN_18:STOMACH -CREATURE:TITAN_18:GIZZARD -CREATURE:TITAN_18:PANCREAS -CREATURE:TITAN_18:SPLEEN -CREATURE:TITAN_18:KIDNEY -CREATURE:TITAN_19:MUSCLE -CREATURE:TITAN_19:EYE -CREATURE:TITAN_19:BRAIN -CREATURE:TITAN_19:LUNG -CREATURE:TITAN_19:HEART -CREATURE:TITAN_19:LIVER -CREATURE:TITAN_19:GUT -CREATURE:TITAN_19:STOMACH -CREATURE:TITAN_19:GIZZARD -CREATURE:TITAN_19:PANCREAS -CREATURE:TITAN_19:SPLEEN -CREATURE:TITAN_19:KIDNEY -CREATURE:TITAN_21:MUSCLE -CREATURE:TITAN_21:EYE -CREATURE:TITAN_21:BRAIN -CREATURE:TITAN_21:LUNG -CREATURE:TITAN_21:HEART -CREATURE:TITAN_21:LIVER -CREATURE:TITAN_21:GUT -CREATURE:TITAN_21:STOMACH -CREATURE:TITAN_21:GIZZARD -CREATURE:TITAN_21:PANCREAS -CREATURE:TITAN_21:SPLEEN -CREATURE:TITAN_21:KIDNEY -CREATURE:TITAN_23:MUSCLE -CREATURE:TITAN_23:EYE -CREATURE:TITAN_23:BRAIN -CREATURE:TITAN_23:LUNG -CREATURE:TITAN_23:HEART -CREATURE:TITAN_23:LIVER -CREATURE:TITAN_23:GUT -CREATURE:TITAN_23:STOMACH -CREATURE:TITAN_23:GIZZARD -CREATURE:TITAN_23:PANCREAS -CREATURE:TITAN_23:SPLEEN -CREATURE:TITAN_23:KIDNEY -CREATURE:TITAN_24:MUSCLE -CREATURE:TITAN_24:EYE -CREATURE:TITAN_24:BRAIN -CREATURE:TITAN_24:LUNG -CREATURE:TITAN_24:HEART -CREATURE:TITAN_24:LIVER -CREATURE:TITAN_24:GUT -CREATURE:TITAN_24:STOMACH -CREATURE:TITAN_24:GIZZARD -CREATURE:TITAN_24:PANCREAS -CREATURE:TITAN_24:SPLEEN -CREATURE:TITAN_24:KIDNEY -CREATURE:TITAN_25:MUSCLE -CREATURE:TITAN_25:EYE -CREATURE:TITAN_25:BRAIN -CREATURE:TITAN_25:LUNG -CREATURE:TITAN_25:HEART -CREATURE:TITAN_25:LIVER -CREATURE:TITAN_25:GUT -CREATURE:TITAN_25:STOMACH -CREATURE:TITAN_25:GIZZARD -CREATURE:TITAN_25:PANCREAS -CREATURE:TITAN_25:SPLEEN -CREATURE:TITAN_25:KIDNEY -CREATURE:TITAN_26:MUSCLE -CREATURE:TITAN_26:EYE -CREATURE:TITAN_26:BRAIN -CREATURE:TITAN_26:LUNG -CREATURE:TITAN_26:HEART -CREATURE:TITAN_26:LIVER -CREATURE:TITAN_26:GUT -CREATURE:TITAN_26:STOMACH -CREATURE:TITAN_26:GIZZARD -CREATURE:TITAN_26:PANCREAS -CREATURE:TITAN_26:SPLEEN -CREATURE:TITAN_26:KIDNEY -CREATURE:TITAN_27:MUSCLE -CREATURE:TITAN_27:EYE -CREATURE:TITAN_27:BRAIN -CREATURE:TITAN_27:LUNG -CREATURE:TITAN_27:HEART -CREATURE:TITAN_27:LIVER -CREATURE:TITAN_27:GUT -CREATURE:TITAN_27:STOMACH -CREATURE:TITAN_27:GIZZARD -CREATURE:TITAN_27:PANCREAS -CREATURE:TITAN_27:SPLEEN -CREATURE:TITAN_27:KIDNEY -CREATURE:TITAN_28:MUSCLE -CREATURE:TITAN_28:EYE -CREATURE:TITAN_28:BRAIN -CREATURE:TITAN_28:LUNG -CREATURE:TITAN_28:HEART -CREATURE:TITAN_28:LIVER -CREATURE:TITAN_28:GUT -CREATURE:TITAN_28:STOMACH -CREATURE:TITAN_28:GIZZARD -CREATURE:TITAN_28:PANCREAS -CREATURE:TITAN_28:SPLEEN -CREATURE:TITAN_28:KIDNEY -CREATURE:TITAN_29:MUSCLE -CREATURE:TITAN_29:EYE -CREATURE:TITAN_29:BRAIN -CREATURE:TITAN_29:LUNG -CREATURE:TITAN_29:HEART -CREATURE:TITAN_29:LIVER -CREATURE:TITAN_29:GUT -CREATURE:TITAN_29:STOMACH -CREATURE:TITAN_29:GIZZARD -CREATURE:TITAN_29:PANCREAS -CREATURE:TITAN_29:SPLEEN -CREATURE:TITAN_29:KIDNEY -CREATURE:TITAN_30:MUSCLE -CREATURE:TITAN_30:EYE -CREATURE:TITAN_30:BRAIN -CREATURE:TITAN_30:LUNG -CREATURE:TITAN_30:HEART -CREATURE:TITAN_30:LIVER -CREATURE:TITAN_30:GUT -CREATURE:TITAN_30:STOMACH -CREATURE:TITAN_30:GIZZARD -CREATURE:TITAN_30:PANCREAS -CREATURE:TITAN_30:SPLEEN -CREATURE:TITAN_30:KIDNEY -CREATURE:TITAN_32:MUSCLE -CREATURE:TITAN_32:EYE -CREATURE:TITAN_32:BRAIN -CREATURE:TITAN_32:LUNG -CREATURE:TITAN_32:HEART -CREATURE:TITAN_32:LIVER -CREATURE:TITAN_32:GUT -CREATURE:TITAN_32:STOMACH -CREATURE:TITAN_32:GIZZARD -CREATURE:TITAN_32:PANCREAS -CREATURE:TITAN_32:SPLEEN -CREATURE:TITAN_32:KIDNEY -CREATURE:TITAN_33:MUSCLE -CREATURE:TITAN_33:EYE -CREATURE:TITAN_33:BRAIN -CREATURE:TITAN_33:LUNG -CREATURE:TITAN_33:HEART -CREATURE:TITAN_33:LIVER -CREATURE:TITAN_33:GUT -CREATURE:TITAN_33:STOMACH -CREATURE:TITAN_33:GIZZARD -CREATURE:TITAN_33:PANCREAS -CREATURE:TITAN_33:SPLEEN -CREATURE:TITAN_33:KIDNEY -CREATURE:DEMON_7:MUSCLE -CREATURE:DEMON_7:EYE -CREATURE:DEMON_7:BRAIN -CREATURE:DEMON_7:LUNG -CREATURE:DEMON_7:HEART -CREATURE:DEMON_7:LIVER -CREATURE:DEMON_7:GUT -CREATURE:DEMON_7:STOMACH -CREATURE:DEMON_7:GIZZARD -CREATURE:DEMON_7:PANCREAS -CREATURE:DEMON_7:SPLEEN -CREATURE:DEMON_7:KIDNEY -CREATURE:DEMON_8:MUSCLE -CREATURE:DEMON_8:EYE -CREATURE:DEMON_8:BRAIN -CREATURE:DEMON_8:LUNG -CREATURE:DEMON_8:HEART -CREATURE:DEMON_8:LIVER -CREATURE:DEMON_8:GUT -CREATURE:DEMON_8:STOMACH -CREATURE:DEMON_8:GIZZARD -CREATURE:DEMON_8:PANCREAS -CREATURE:DEMON_8:SPLEEN -CREATURE:DEMON_8:KIDNEY -CREATURE:DEMON_9:MUSCLE -CREATURE:DEMON_9:EYE -CREATURE:DEMON_9:BRAIN -CREATURE:DEMON_9:LUNG -CREATURE:DEMON_9:HEART -CREATURE:DEMON_9:LIVER -CREATURE:DEMON_9:GUT -CREATURE:DEMON_9:STOMACH -CREATURE:DEMON_9:GIZZARD -CREATURE:DEMON_9:PANCREAS -CREATURE:DEMON_9:SPLEEN -CREATURE:DEMON_9:KIDNEY -CREATURE:DEMON_10:MUSCLE -CREATURE:DEMON_10:EYE -CREATURE:DEMON_10:BRAIN -CREATURE:DEMON_10:LUNG -CREATURE:DEMON_10:HEART -CREATURE:DEMON_10:LIVER -CREATURE:DEMON_10:GUT -CREATURE:DEMON_10:STOMACH -CREATURE:DEMON_10:GIZZARD -CREATURE:DEMON_10:PANCREAS -CREATURE:DEMON_10:SPLEEN -CREATURE:DEMON_10:KIDNEY -CREATURE:DEMON_11:MUSCLE -CREATURE:DEMON_11:EYE -CREATURE:DEMON_11:BRAIN -CREATURE:DEMON_11:LUNG -CREATURE:DEMON_11:HEART -CREATURE:DEMON_11:LIVER -CREATURE:DEMON_11:GUT -CREATURE:DEMON_11:STOMACH -CREATURE:DEMON_11:GIZZARD -CREATURE:DEMON_11:PANCREAS -CREATURE:DEMON_11:SPLEEN -CREATURE:DEMON_11:KIDNEY -CREATURE:DEMON_12:MUSCLE -CREATURE:DEMON_12:EYE -CREATURE:DEMON_12:BRAIN -CREATURE:DEMON_12:LUNG -CREATURE:DEMON_12:HEART -CREATURE:DEMON_12:LIVER -CREATURE:DEMON_12:GUT -CREATURE:DEMON_12:STOMACH -CREATURE:DEMON_12:GIZZARD -CREATURE:DEMON_12:PANCREAS -CREATURE:DEMON_12:SPLEEN -CREATURE:DEMON_12:KIDNEY -CREATURE:DEMON_13:MUSCLE -CREATURE:DEMON_13:EYE -CREATURE:DEMON_13:BRAIN -CREATURE:DEMON_13:LUNG -CREATURE:DEMON_13:HEART -CREATURE:DEMON_13:LIVER -CREATURE:DEMON_13:GUT -CREATURE:DEMON_13:STOMACH -CREATURE:DEMON_13:GIZZARD -CREATURE:DEMON_13:PANCREAS -CREATURE:DEMON_13:SPLEEN -CREATURE:DEMON_13:KIDNEY -CREATURE:DEMON_14:MUSCLE -CREATURE:DEMON_14:EYE -CREATURE:DEMON_14:BRAIN -CREATURE:DEMON_14:LUNG -CREATURE:DEMON_14:HEART -CREATURE:DEMON_14:LIVER -CREATURE:DEMON_14:GUT -CREATURE:DEMON_14:STOMACH -CREATURE:DEMON_14:GIZZARD -CREATURE:DEMON_14:PANCREAS -CREATURE:DEMON_14:SPLEEN -CREATURE:DEMON_14:KIDNEY -CREATURE:DEMON_15:MUSCLE -CREATURE:DEMON_15:EYE -CREATURE:DEMON_15:BRAIN -CREATURE:DEMON_15:LUNG -CREATURE:DEMON_15:HEART -CREATURE:DEMON_15:LIVER -CREATURE:DEMON_15:GUT -CREATURE:DEMON_15:STOMACH -CREATURE:DEMON_15:GIZZARD -CREATURE:DEMON_15:PANCREAS -CREATURE:DEMON_15:SPLEEN -CREATURE:DEMON_15:KIDNEY -CREATURE:DEMON_16:MUSCLE -CREATURE:DEMON_16:EYE -CREATURE:DEMON_16:BRAIN -CREATURE:DEMON_16:LUNG -CREATURE:DEMON_16:HEART -CREATURE:DEMON_16:LIVER -CREATURE:DEMON_16:GUT -CREATURE:DEMON_16:STOMACH -CREATURE:DEMON_16:GIZZARD -CREATURE:DEMON_16:PANCREAS -CREATURE:DEMON_16:SPLEEN -CREATURE:DEMON_16:KIDNEY -CREATURE:DEMON_17:MUSCLE -CREATURE:DEMON_17:EYE -CREATURE:DEMON_17:BRAIN -CREATURE:DEMON_17:LUNG -CREATURE:DEMON_17:HEART -CREATURE:DEMON_17:LIVER -CREATURE:DEMON_17:GUT -CREATURE:DEMON_17:STOMACH -CREATURE:DEMON_17:GIZZARD -CREATURE:DEMON_17:PANCREAS -CREATURE:DEMON_17:SPLEEN -CREATURE:DEMON_17:KIDNEY -CREATURE:DEMON_18:MUSCLE -CREATURE:DEMON_18:EYE -CREATURE:DEMON_18:BRAIN -CREATURE:DEMON_18:LUNG -CREATURE:DEMON_18:HEART -CREATURE:DEMON_18:LIVER -CREATURE:DEMON_18:GUT -CREATURE:DEMON_18:STOMACH -CREATURE:DEMON_18:GIZZARD -CREATURE:DEMON_18:PANCREAS -CREATURE:DEMON_18:SPLEEN -CREATURE:DEMON_18:KIDNEY -CREATURE:DEMON_19:MUSCLE -CREATURE:DEMON_19:EYE -CREATURE:DEMON_19:BRAIN -CREATURE:DEMON_19:LUNG -CREATURE:DEMON_19:HEART -CREATURE:DEMON_19:LIVER -CREATURE:DEMON_19:GUT -CREATURE:DEMON_19:STOMACH -CREATURE:DEMON_19:GIZZARD -CREATURE:DEMON_19:PANCREAS -CREATURE:DEMON_19:SPLEEN -CREATURE:DEMON_19:KIDNEY -CREATURE:DEMON_20:MUSCLE -CREATURE:DEMON_20:EYE -CREATURE:DEMON_20:BRAIN -CREATURE:DEMON_20:LUNG -CREATURE:DEMON_20:HEART -CREATURE:DEMON_20:LIVER -CREATURE:DEMON_20:GUT -CREATURE:DEMON_20:STOMACH -CREATURE:DEMON_20:GIZZARD -CREATURE:DEMON_20:PANCREAS -CREATURE:DEMON_20:SPLEEN -CREATURE:DEMON_20:KIDNEY -CREATURE:DEMON_21:MUSCLE -CREATURE:DEMON_21:EYE -CREATURE:DEMON_21:BRAIN -CREATURE:DEMON_21:LUNG -CREATURE:DEMON_21:HEART -CREATURE:DEMON_21:LIVER -CREATURE:DEMON_21:GUT -CREATURE:DEMON_21:STOMACH -CREATURE:DEMON_21:GIZZARD -CREATURE:DEMON_21:PANCREAS -CREATURE:DEMON_21:SPLEEN -CREATURE:DEMON_21:KIDNEY -CREATURE:DEMON_22:MUSCLE -CREATURE:DEMON_22:EYE -CREATURE:DEMON_22:BRAIN -CREATURE:DEMON_22:LUNG -CREATURE:DEMON_22:HEART -CREATURE:DEMON_22:LIVER -CREATURE:DEMON_22:GUT -CREATURE:DEMON_22:STOMACH -CREATURE:DEMON_22:GIZZARD -CREATURE:DEMON_22:PANCREAS -CREATURE:DEMON_22:SPLEEN -CREATURE:DEMON_22:KIDNEY -CREATURE:DEMON_23:MUSCLE -CREATURE:DEMON_23:EYE -CREATURE:DEMON_23:BRAIN -CREATURE:DEMON_23:LUNG -CREATURE:DEMON_23:HEART -CREATURE:DEMON_23:LIVER -CREATURE:DEMON_23:GUT -CREATURE:DEMON_23:STOMACH -CREATURE:DEMON_23:GIZZARD -CREATURE:DEMON_23:PANCREAS -CREATURE:DEMON_23:SPLEEN -CREATURE:DEMON_23:KIDNEY -CREATURE:DEMON_24:MUSCLE -CREATURE:DEMON_24:EYE -CREATURE:DEMON_24:BRAIN -CREATURE:DEMON_24:LUNG -CREATURE:DEMON_24:HEART -CREATURE:DEMON_24:LIVER -CREATURE:DEMON_24:GUT -CREATURE:DEMON_24:STOMACH -CREATURE:DEMON_24:GIZZARD -CREATURE:DEMON_24:PANCREAS -CREATURE:DEMON_24:SPLEEN -CREATURE:DEMON_24:KIDNEY -CREATURE:DEMON_25:MUSCLE -CREATURE:DEMON_25:EYE -CREATURE:DEMON_25:BRAIN -CREATURE:DEMON_25:LUNG -CREATURE:DEMON_25:HEART -CREATURE:DEMON_25:LIVER -CREATURE:DEMON_25:GUT -CREATURE:DEMON_25:STOMACH -CREATURE:DEMON_25:GIZZARD -CREATURE:DEMON_25:PANCREAS -CREATURE:DEMON_25:SPLEEN -CREATURE:DEMON_25:KIDNEY -CREATURE:DEMON_26:MUSCLE -CREATURE:DEMON_26:EYE -CREATURE:DEMON_26:BRAIN -CREATURE:DEMON_26:LUNG -CREATURE:DEMON_26:HEART -CREATURE:DEMON_26:LIVER -CREATURE:DEMON_26:GUT -CREATURE:DEMON_26:STOMACH -CREATURE:DEMON_26:GIZZARD -CREATURE:DEMON_26:PANCREAS -CREATURE:DEMON_26:SPLEEN -CREATURE:DEMON_26:KIDNEY -CREATURE:DEMON_27:MUSCLE -CREATURE:DEMON_27:EYE -CREATURE:DEMON_27:BRAIN -CREATURE:DEMON_27:LUNG -CREATURE:DEMON_27:HEART -CREATURE:DEMON_27:LIVER -CREATURE:DEMON_27:GUT -CREATURE:DEMON_27:STOMACH -CREATURE:DEMON_27:GIZZARD -CREATURE:DEMON_27:PANCREAS -CREATURE:DEMON_27:SPLEEN -CREATURE:DEMON_27:KIDNEY -CREATURE:DEMON_28:MUSCLE -CREATURE:DEMON_28:EYE -CREATURE:DEMON_28:BRAIN -CREATURE:DEMON_28:LUNG -CREATURE:DEMON_28:HEART -CREATURE:DEMON_28:LIVER -CREATURE:DEMON_28:GUT -CREATURE:DEMON_28:STOMACH -CREATURE:DEMON_28:GIZZARD -CREATURE:DEMON_28:PANCREAS -CREATURE:DEMON_28:SPLEEN -CREATURE:DEMON_28:KIDNEY -CREATURE:DEMON_29:MUSCLE -CREATURE:DEMON_29:EYE -CREATURE:DEMON_29:BRAIN -CREATURE:DEMON_29:LUNG -CREATURE:DEMON_29:HEART -CREATURE:DEMON_29:LIVER -CREATURE:DEMON_29:GUT -CREATURE:DEMON_29:STOMACH -CREATURE:DEMON_29:GIZZARD -CREATURE:DEMON_29:PANCREAS -CREATURE:DEMON_29:SPLEEN -CREATURE:DEMON_29:KIDNEY -CREATURE:DEMON_31:MUSCLE -CREATURE:DEMON_31:EYE -CREATURE:DEMON_31:BRAIN -CREATURE:DEMON_31:LUNG -CREATURE:DEMON_31:HEART -CREATURE:DEMON_31:LIVER -CREATURE:DEMON_31:GUT -CREATURE:DEMON_31:STOMACH -CREATURE:DEMON_31:GIZZARD -CREATURE:DEMON_31:PANCREAS -CREATURE:DEMON_31:SPLEEN -CREATURE:DEMON_31:KIDNEY -CREATURE:DEMON_32:MUSCLE -CREATURE:DEMON_32:EYE -CREATURE:DEMON_32:BRAIN -CREATURE:DEMON_32:LUNG -CREATURE:DEMON_32:HEART -CREATURE:DEMON_32:LIVER -CREATURE:DEMON_32:GUT -CREATURE:DEMON_32:STOMACH -CREATURE:DEMON_32:GIZZARD -CREATURE:DEMON_32:PANCREAS -CREATURE:DEMON_32:SPLEEN -CREATURE:DEMON_32:KIDNEY -CREATURE:DEMON_38:MUSCLE -CREATURE:DEMON_38:EYE -CREATURE:DEMON_38:BRAIN -CREATURE:DEMON_38:LUNG -CREATURE:DEMON_38:HEART -CREATURE:DEMON_38:LIVER -CREATURE:DEMON_38:GUT -CREATURE:DEMON_38:STOMACH -CREATURE:DEMON_38:GIZZARD -CREATURE:DEMON_38:PANCREAS -CREATURE:DEMON_38:SPLEEN -CREATURE:DEMON_38:KIDNEY -CREATURE:DEMON_39:MUSCLE -CREATURE:DEMON_39:EYE -CREATURE:DEMON_39:BRAIN -CREATURE:DEMON_39:LUNG -CREATURE:DEMON_39:HEART -CREATURE:DEMON_39:LIVER -CREATURE:DEMON_39:GUT -CREATURE:DEMON_39:STOMACH -CREATURE:DEMON_39:GIZZARD -CREATURE:DEMON_39:PANCREAS -CREATURE:DEMON_39:SPLEEN -CREATURE:DEMON_39:KIDNEY -CREATURE:DEMON_40:MUSCLE -CREATURE:DEMON_40:EYE -CREATURE:DEMON_40:BRAIN -CREATURE:DEMON_40:LUNG -CREATURE:DEMON_40:HEART -CREATURE:DEMON_40:LIVER -CREATURE:DEMON_40:GUT -CREATURE:DEMON_40:STOMACH -CREATURE:DEMON_40:GIZZARD -CREATURE:DEMON_40:PANCREAS -CREATURE:DEMON_40:SPLEEN -CREATURE:DEMON_40:KIDNEY -CREATURE:DEMON_41:MUSCLE -CREATURE:DEMON_41:EYE -CREATURE:DEMON_41:BRAIN -CREATURE:DEMON_41:LUNG -CREATURE:DEMON_41:HEART -CREATURE:DEMON_41:LIVER -CREATURE:DEMON_41:GUT -CREATURE:DEMON_41:STOMACH -CREATURE:DEMON_41:GIZZARD -CREATURE:DEMON_41:PANCREAS -CREATURE:DEMON_41:SPLEEN -CREATURE:DEMON_41:KIDNEY -CREATURE:DEMON_42:MUSCLE -CREATURE:DEMON_42:EYE -CREATURE:DEMON_42:BRAIN -CREATURE:DEMON_42:LUNG -CREATURE:DEMON_42:HEART -CREATURE:DEMON_42:LIVER -CREATURE:DEMON_42:GUT -CREATURE:DEMON_42:STOMACH -CREATURE:DEMON_42:GIZZARD -CREATURE:DEMON_42:PANCREAS -CREATURE:DEMON_42:SPLEEN -CREATURE:DEMON_42:KIDNEY -CREATURE:DEMON_43:MUSCLE -CREATURE:DEMON_43:EYE -CREATURE:DEMON_43:BRAIN -CREATURE:DEMON_43:LUNG -CREATURE:DEMON_43:HEART -CREATURE:DEMON_43:LIVER -CREATURE:DEMON_43:GUT -CREATURE:DEMON_43:STOMACH -CREATURE:DEMON_43:GIZZARD -CREATURE:DEMON_43:PANCREAS -CREATURE:DEMON_43:SPLEEN -CREATURE:DEMON_43:KIDNEY -CREATURE:DEMON_44:MUSCLE -CREATURE:DEMON_44:EYE -CREATURE:DEMON_44:BRAIN -CREATURE:DEMON_44:LUNG -CREATURE:DEMON_44:HEART -CREATURE:DEMON_44:LIVER -CREATURE:DEMON_44:GUT -CREATURE:DEMON_44:STOMACH -CREATURE:DEMON_44:GIZZARD -CREATURE:DEMON_44:PANCREAS -CREATURE:DEMON_44:SPLEEN -CREATURE:DEMON_44:KIDNEY -CREATURE:DEMON_45:MUSCLE -CREATURE:DEMON_45:EYE -CREATURE:DEMON_45:BRAIN -CREATURE:DEMON_45:LUNG -CREATURE:DEMON_45:HEART -CREATURE:DEMON_45:LIVER -CREATURE:DEMON_45:GUT -CREATURE:DEMON_45:STOMACH -CREATURE:DEMON_45:GIZZARD -CREATURE:DEMON_45:PANCREAS -CREATURE:DEMON_45:SPLEEN -CREATURE:DEMON_45:KIDNEY -CREATURE:DEMON_47:MUSCLE -CREATURE:DEMON_47:EYE -CREATURE:DEMON_47:BRAIN -CREATURE:DEMON_47:LUNG -CREATURE:DEMON_47:HEART -CREATURE:DEMON_47:LIVER -CREATURE:DEMON_47:GUT -CREATURE:DEMON_47:STOMACH -CREATURE:DEMON_47:GIZZARD -CREATURE:DEMON_47:PANCREAS -CREATURE:DEMON_47:SPLEEN -CREATURE:DEMON_47:KIDNEY -CREATURE:DEMON_48:MUSCLE -CREATURE:DEMON_48:EYE -CREATURE:DEMON_48:BRAIN -CREATURE:DEMON_48:LUNG -CREATURE:DEMON_48:HEART -CREATURE:DEMON_48:LIVER -CREATURE:DEMON_48:GUT -CREATURE:DEMON_48:STOMACH -CREATURE:DEMON_48:GIZZARD -CREATURE:DEMON_48:PANCREAS -CREATURE:DEMON_48:SPLEEN -CREATURE:DEMON_48:KIDNEY -CREATURE:DEMON_49:MUSCLE -CREATURE:DEMON_49:EYE -CREATURE:DEMON_49:BRAIN -CREATURE:DEMON_49:LUNG -CREATURE:DEMON_49:HEART -CREATURE:DEMON_49:LIVER -CREATURE:DEMON_49:GUT -CREATURE:DEMON_49:STOMACH -CREATURE:DEMON_49:GIZZARD -CREATURE:DEMON_49:PANCREAS -CREATURE:DEMON_49:SPLEEN -CREATURE:DEMON_49:KIDNEY -CREATURE:DEMON_52:MUSCLE -CREATURE:DEMON_52:EYE -CREATURE:DEMON_52:BRAIN -CREATURE:DEMON_52:LUNG -CREATURE:DEMON_52:HEART -CREATURE:DEMON_52:LIVER -CREATURE:DEMON_52:GUT -CREATURE:DEMON_52:STOMACH -CREATURE:DEMON_52:GIZZARD -CREATURE:DEMON_52:PANCREAS -CREATURE:DEMON_52:SPLEEN -CREATURE:DEMON_52:KIDNEY - CREATURE:NIGHT_CREATURE_1:MUSCLE -CREATURE:NIGHT_CREATURE_1:EYE -CREATURE:NIGHT_CREATURE_1:BRAIN -CREATURE:NIGHT_CREATURE_1:LUNG -CREATURE:NIGHT_CREATURE_1:HEART -CREATURE:NIGHT_CREATURE_1:LIVER -CREATURE:NIGHT_CREATURE_1:GUT -!CREATURE:NIGHT_CREATURE_1:STOMACH -!CREATURE:NIGHT_CREATURE_1:GIZZARD -"CREATURE:NIGHT_CREATURE_1:PANCREAS - CREATURE:NIGHT_CREATURE_1:SPLEEN - CREATURE:NIGHT_CREATURE_1:KIDNEY - CREATURE:NIGHT_CREATURE_2:MUSCLE -CREATURE:NIGHT_CREATURE_2:EYE -CREATURE:NIGHT_CREATURE_2:BRAIN -CREATURE:NIGHT_CREATURE_2:LUNG -CREATURE:NIGHT_CREATURE_2:HEART -CREATURE:NIGHT_CREATURE_2:LIVER -CREATURE:NIGHT_CREATURE_2:GUT -!CREATURE:NIGHT_CREATURE_2:STOMACH -!CREATURE:NIGHT_CREATURE_2:GIZZARD -"CREATURE:NIGHT_CREATURE_2:PANCREAS - CREATURE:NIGHT_CREATURE_2:SPLEEN - CREATURE:NIGHT_CREATURE_2:KIDNEY - CREATURE:NIGHT_CREATURE_3:MUSCLE -CREATURE:NIGHT_CREATURE_3:EYE -CREATURE:NIGHT_CREATURE_3:BRAIN -CREATURE:NIGHT_CREATURE_3:LUNG -CREATURE:NIGHT_CREATURE_3:HEART -CREATURE:NIGHT_CREATURE_3:LIVER -CREATURE:NIGHT_CREATURE_3:GUT -!CREATURE:NIGHT_CREATURE_3:STOMACH -!CREATURE:NIGHT_CREATURE_3:GIZZARD -"CREATURE:NIGHT_CREATURE_3:PANCREAS - CREATURE:NIGHT_CREATURE_3:SPLEEN - CREATURE:NIGHT_CREATURE_3:KIDNEY - CREATURE:NIGHT_CREATURE_4:MUSCLE -CREATURE:NIGHT_CREATURE_4:EYE -CREATURE:NIGHT_CREATURE_4:BRAIN -CREATURE:NIGHT_CREATURE_4:LUNG -CREATURE:NIGHT_CREATURE_4:HEART -CREATURE:NIGHT_CREATURE_4:LIVER -CREATURE:NIGHT_CREATURE_4:GUT -!CREATURE:NIGHT_CREATURE_4:STOMACH -!CREATURE:NIGHT_CREATURE_4:GIZZARD -"CREATURE:NIGHT_CREATURE_4:PANCREAS - CREATURE:NIGHT_CREATURE_4:SPLEEN - CREATURE:NIGHT_CREATURE_4:KIDNEY - CREATURE:NIGHT_CREATURE_5:MUSCLE -CREATURE:NIGHT_CREATURE_5:EYE -CREATURE:NIGHT_CREATURE_5:BRAIN -CREATURE:NIGHT_CREATURE_5:LUNG -CREATURE:NIGHT_CREATURE_5:HEART -CREATURE:NIGHT_CREATURE_5:LIVER -CREATURE:NIGHT_CREATURE_5:GUT -!CREATURE:NIGHT_CREATURE_5:STOMACH -!CREATURE:NIGHT_CREATURE_5:GIZZARD -"CREATURE:NIGHT_CREATURE_5:PANCREAS - CREATURE:NIGHT_CREATURE_5:SPLEEN - CREATURE:NIGHT_CREATURE_5:KIDNEY - CREATURE:NIGHT_CREATURE_6:MUSCLE -CREATURE:NIGHT_CREATURE_6:EYE -CREATURE:NIGHT_CREATURE_6:BRAIN -CREATURE:NIGHT_CREATURE_6:LUNG -CREATURE:NIGHT_CREATURE_6:HEART -CREATURE:NIGHT_CREATURE_6:LIVER -CREATURE:NIGHT_CREATURE_6:GUT -!CREATURE:NIGHT_CREATURE_6:STOMACH -!CREATURE:NIGHT_CREATURE_6:GIZZARD -"CREATURE:NIGHT_CREATURE_6:PANCREAS - CREATURE:NIGHT_CREATURE_6:SPLEEN - CREATURE:NIGHT_CREATURE_6:KIDNEY - CREATURE:NIGHT_CREATURE_7:MUSCLE -CREATURE:NIGHT_CREATURE_7:EYE -CREATURE:NIGHT_CREATURE_7:BRAIN -CREATURE:NIGHT_CREATURE_7:LUNG -CREATURE:NIGHT_CREATURE_7:HEART -CREATURE:NIGHT_CREATURE_7:LIVER -CREATURE:NIGHT_CREATURE_7:GUT -!CREATURE:NIGHT_CREATURE_7:STOMACH -!CREATURE:NIGHT_CREATURE_7:GIZZARD -"CREATURE:NIGHT_CREATURE_7:PANCREAS - CREATURE:NIGHT_CREATURE_7:SPLEEN - CREATURE:NIGHT_CREATURE_7:KIDNEY - CREATURE:NIGHT_CREATURE_8:MUSCLE -CREATURE:NIGHT_CREATURE_8:EYE -CREATURE:NIGHT_CREATURE_8:BRAIN -CREATURE:NIGHT_CREATURE_8:LUNG -CREATURE:NIGHT_CREATURE_8:HEART -CREATURE:NIGHT_CREATURE_8:LIVER -CREATURE:NIGHT_CREATURE_8:GUT -!CREATURE:NIGHT_CREATURE_8:STOMACH -!CREATURE:NIGHT_CREATURE_8:GIZZARD -"CREATURE:NIGHT_CREATURE_8:PANCREAS - CREATURE:NIGHT_CREATURE_8:SPLEEN - CREATURE:NIGHT_CREATURE_8:KIDNEY - CREATURE:NIGHT_CREATURE_9:MUSCLE -CREATURE:NIGHT_CREATURE_9:EYE -CREATURE:NIGHT_CREATURE_9:BRAIN -CREATURE:NIGHT_CREATURE_9:LUNG -CREATURE:NIGHT_CREATURE_9:HEART -CREATURE:NIGHT_CREATURE_9:LIVER -CREATURE:NIGHT_CREATURE_9:GUT -!CREATURE:NIGHT_CREATURE_9:STOMACH -!CREATURE:NIGHT_CREATURE_9:GIZZARD -"CREATURE:NIGHT_CREATURE_9:PANCREAS - CREATURE:NIGHT_CREATURE_9:SPLEEN - CREATURE:NIGHT_CREATURE_9:KIDNEY -!CREATURE:NIGHT_CREATURE_10:MUSCLE -CREATURE:NIGHT_CREATURE_10:EYE - CREATURE:NIGHT_CREATURE_10:BRAIN -CREATURE:NIGHT_CREATURE_10:LUNG - CREATURE:NIGHT_CREATURE_10:HEART - CREATURE:NIGHT_CREATURE_10:LIVER -CREATURE:NIGHT_CREATURE_10:GUT -"CREATURE:NIGHT_CREATURE_10:STOMACH -"CREATURE:NIGHT_CREATURE_10:GIZZARD -#CREATURE:NIGHT_CREATURE_10:PANCREAS -!CREATURE:NIGHT_CREATURE_10:SPLEEN -!CREATURE:NIGHT_CREATURE_10:KIDNEY -!CREATURE:NIGHT_CREATURE_11:MUSCLE -CREATURE:NIGHT_CREATURE_11:EYE - CREATURE:NIGHT_CREATURE_11:BRAIN -CREATURE:NIGHT_CREATURE_11:LUNG - CREATURE:NIGHT_CREATURE_11:HEART - CREATURE:NIGHT_CREATURE_11:LIVER -CREATURE:NIGHT_CREATURE_11:GUT -"CREATURE:NIGHT_CREATURE_11:STOMACH -"CREATURE:NIGHT_CREATURE_11:GIZZARD -#CREATURE:NIGHT_CREATURE_11:PANCREAS -!CREATURE:NIGHT_CREATURE_11:SPLEEN -!CREATURE:NIGHT_CREATURE_11:KIDNEY -!CREATURE:NIGHT_CREATURE_12:MUSCLE -CREATURE:NIGHT_CREATURE_12:EYE - CREATURE:NIGHT_CREATURE_12:BRAIN -CREATURE:NIGHT_CREATURE_12:LUNG - CREATURE:NIGHT_CREATURE_12:HEART - CREATURE:NIGHT_CREATURE_12:LIVER -CREATURE:NIGHT_CREATURE_12:GUT -"CREATURE:NIGHT_CREATURE_12:STOMACH -"CREATURE:NIGHT_CREATURE_12:GIZZARD -#CREATURE:NIGHT_CREATURE_12:PANCREAS -!CREATURE:NIGHT_CREATURE_12:SPLEEN -!CREATURE:NIGHT_CREATURE_12:KIDNEY -!CREATURE:NIGHT_CREATURE_13:MUSCLE -CREATURE:NIGHT_CREATURE_13:EYE - CREATURE:NIGHT_CREATURE_13:BRAIN -CREATURE:NIGHT_CREATURE_13:LUNG - CREATURE:NIGHT_CREATURE_13:HEART - CREATURE:NIGHT_CREATURE_13:LIVER -CREATURE:NIGHT_CREATURE_13:GUT -"CREATURE:NIGHT_CREATURE_13:STOMACH -"CREATURE:NIGHT_CREATURE_13:GIZZARD -#CREATURE:NIGHT_CREATURE_13:PANCREAS -!CREATURE:NIGHT_CREATURE_13:SPLEEN -!CREATURE:NIGHT_CREATURE_13:KIDNEY -!CREATURE:NIGHT_CREATURE_14:MUSCLE -CREATURE:NIGHT_CREATURE_14:EYE - CREATURE:NIGHT_CREATURE_14:BRAIN -CREATURE:NIGHT_CREATURE_14:LUNG - CREATURE:NIGHT_CREATURE_14:HEART - CREATURE:NIGHT_CREATURE_14:LIVER -CREATURE:NIGHT_CREATURE_14:GUT -"CREATURE:NIGHT_CREATURE_14:STOMACH -"CREATURE:NIGHT_CREATURE_14:GIZZARD -#CREATURE:NIGHT_CREATURE_14:PANCREAS -!CREATURE:NIGHT_CREATURE_14:SPLEEN -!CREATURE:NIGHT_CREATURE_14:KIDNEY -!CREATURE:NIGHT_CREATURE_15:MUSCLE -CREATURE:NIGHT_CREATURE_15:EYE - CREATURE:NIGHT_CREATURE_15:BRAIN -CREATURE:NIGHT_CREATURE_15:LUNG - CREATURE:NIGHT_CREATURE_15:HEART - CREATURE:NIGHT_CREATURE_15:LIVER -CREATURE:NIGHT_CREATURE_15:GUT -"CREATURE:NIGHT_CREATURE_15:STOMACH -"CREATURE:NIGHT_CREATURE_15:GIZZARD -#CREATURE:NIGHT_CREATURE_15:PANCREAS -!CREATURE:NIGHT_CREATURE_15:SPLEEN -!CREATURE:NIGHT_CREATURE_15:KIDNEY -!CREATURE:NIGHT_CREATURE_16:MUSCLE -CREATURE:NIGHT_CREATURE_16:EYE - CREATURE:NIGHT_CREATURE_16:BRAIN -CREATURE:NIGHT_CREATURE_16:LUNG - CREATURE:NIGHT_CREATURE_16:HEART - CREATURE:NIGHT_CREATURE_16:LIVER -CREATURE:NIGHT_CREATURE_16:GUT -"CREATURE:NIGHT_CREATURE_16:STOMACH -"CREATURE:NIGHT_CREATURE_16:GIZZARD -#CREATURE:NIGHT_CREATURE_16:PANCREAS -!CREATURE:NIGHT_CREATURE_16:SPLEEN -!CREATURE:NIGHT_CREATURE_16:KIDNEY -!CREATURE:NIGHT_CREATURE_17:MUSCLE -CREATURE:NIGHT_CREATURE_17:EYE - CREATURE:NIGHT_CREATURE_17:BRAIN -CREATURE:NIGHT_CREATURE_17:LUNG - CREATURE:NIGHT_CREATURE_17:HEART - CREATURE:NIGHT_CREATURE_17:LIVER -CREATURE:NIGHT_CREATURE_17:GUT -"CREATURE:NIGHT_CREATURE_17:STOMACH -"CREATURE:NIGHT_CREATURE_17:GIZZARD -#CREATURE:NIGHT_CREATURE_17:PANCREAS -!CREATURE:NIGHT_CREATURE_17:SPLEEN -!CREATURE:NIGHT_CREATURE_17:KIDNEY -!CREATURE:NIGHT_CREATURE_18:MUSCLE -CREATURE:NIGHT_CREATURE_18:EYE - CREATURE:NIGHT_CREATURE_18:BRAIN -CREATURE:NIGHT_CREATURE_18:LUNG - CREATURE:NIGHT_CREATURE_18:HEART - CREATURE:NIGHT_CREATURE_18:LIVER -CREATURE:NIGHT_CREATURE_18:GUT -"CREATURE:NIGHT_CREATURE_18:STOMACH -"CREATURE:NIGHT_CREATURE_18:GIZZARD -#CREATURE:NIGHT_CREATURE_18:PANCREAS -!CREATURE:NIGHT_CREATURE_18:SPLEEN -!CREATURE:NIGHT_CREATURE_18:KIDNEY -!CREATURE:NIGHT_CREATURE_19:MUSCLE -CREATURE:NIGHT_CREATURE_19:EYE - CREATURE:NIGHT_CREATURE_19:BRAIN -CREATURE:NIGHT_CREATURE_19:LUNG - CREATURE:NIGHT_CREATURE_19:HEART - CREATURE:NIGHT_CREATURE_19:LIVER -CREATURE:NIGHT_CREATURE_19:GUT -"CREATURE:NIGHT_CREATURE_19:STOMACH -"CREATURE:NIGHT_CREATURE_19:GIZZARD -#CREATURE:NIGHT_CREATURE_19:PANCREAS -!CREATURE:NIGHT_CREATURE_19:SPLEEN -!CREATURE:NIGHT_CREATURE_19:KIDNEY -!CREATURE:NIGHT_CREATURE_20:MUSCLE -CREATURE:NIGHT_CREATURE_20:EYE - CREATURE:NIGHT_CREATURE_20:BRAIN -CREATURE:NIGHT_CREATURE_20:LUNG - CREATURE:NIGHT_CREATURE_20:HEART - CREATURE:NIGHT_CREATURE_20:LIVER -CREATURE:NIGHT_CREATURE_20:GUT -"CREATURE:NIGHT_CREATURE_20:STOMACH -"CREATURE:NIGHT_CREATURE_20:GIZZARD -#CREATURE:NIGHT_CREATURE_20:PANCREAS -!CREATURE:NIGHT_CREATURE_20:SPLEEN -!CREATURE:NIGHT_CREATURE_20:KIDNEY -!CREATURE:NIGHT_CREATURE_21:MUSCLE -CREATURE:NIGHT_CREATURE_21:EYE - CREATURE:NIGHT_CREATURE_21:BRAIN -CREATURE:NIGHT_CREATURE_21:LUNG - CREATURE:NIGHT_CREATURE_21:HEART - CREATURE:NIGHT_CREATURE_21:LIVER -CREATURE:NIGHT_CREATURE_21:GUT -"CREATURE:NIGHT_CREATURE_21:STOMACH -"CREATURE:NIGHT_CREATURE_21:GIZZARD -#CREATURE:NIGHT_CREATURE_21:PANCREAS -!CREATURE:NIGHT_CREATURE_21:SPLEEN -!CREATURE:NIGHT_CREATURE_21:KIDNEY -!CREATURE:NIGHT_CREATURE_22:MUSCLE -CREATURE:NIGHT_CREATURE_22:EYE - CREATURE:NIGHT_CREATURE_22:BRAIN -CREATURE:NIGHT_CREATURE_22:LUNG - CREATURE:NIGHT_CREATURE_22:HEART - CREATURE:NIGHT_CREATURE_22:LIVER -CREATURE:NIGHT_CREATURE_22:GUT -"CREATURE:NIGHT_CREATURE_22:STOMACH -"CREATURE:NIGHT_CREATURE_22:GIZZARD -#CREATURE:NIGHT_CREATURE_22:PANCREAS -!CREATURE:NIGHT_CREATURE_22:SPLEEN -!CREATURE:NIGHT_CREATURE_22:KIDNEY -!CREATURE:NIGHT_CREATURE_23:MUSCLE -CREATURE:NIGHT_CREATURE_23:EYE - CREATURE:NIGHT_CREATURE_23:BRAIN -CREATURE:NIGHT_CREATURE_23:LUNG - CREATURE:NIGHT_CREATURE_23:HEART - CREATURE:NIGHT_CREATURE_23:LIVER -CREATURE:NIGHT_CREATURE_23:GUT -"CREATURE:NIGHT_CREATURE_23:STOMACH -"CREATURE:NIGHT_CREATURE_23:GIZZARD -#CREATURE:NIGHT_CREATURE_23:PANCREAS -!CREATURE:NIGHT_CREATURE_23:SPLEEN -!CREATURE:NIGHT_CREATURE_23:KIDNEY -!CREATURE:NIGHT_CREATURE_24:MUSCLE -CREATURE:NIGHT_CREATURE_24:EYE - CREATURE:NIGHT_CREATURE_24:BRAIN -CREATURE:NIGHT_CREATURE_24:LUNG - CREATURE:NIGHT_CREATURE_24:HEART - CREATURE:NIGHT_CREATURE_24:LIVER -CREATURE:NIGHT_CREATURE_24:GUT -"CREATURE:NIGHT_CREATURE_24:STOMACH -"CREATURE:NIGHT_CREATURE_24:GIZZARD -#CREATURE:NIGHT_CREATURE_24:PANCREAS -!CREATURE:NIGHT_CREATURE_24:SPLEEN -!CREATURE:NIGHT_CREATURE_24:KIDNEY -!CREATURE:NIGHT_CREATURE_25:MUSCLE -CREATURE:NIGHT_CREATURE_25:EYE - CREATURE:NIGHT_CREATURE_25:BRAIN -CREATURE:NIGHT_CREATURE_25:LUNG - CREATURE:NIGHT_CREATURE_25:HEART - CREATURE:NIGHT_CREATURE_25:LIVER -CREATURE:NIGHT_CREATURE_25:GUT -"CREATURE:NIGHT_CREATURE_25:STOMACH -"CREATURE:NIGHT_CREATURE_25:GIZZARD -#CREATURE:NIGHT_CREATURE_25:PANCREAS -!CREATURE:NIGHT_CREATURE_25:SPLEEN -!CREATURE:NIGHT_CREATURE_25:KIDNEY -!CREATURE:NIGHT_CREATURE_26:MUSCLE -CREATURE:NIGHT_CREATURE_26:EYE - CREATURE:NIGHT_CREATURE_26:BRAIN -CREATURE:NIGHT_CREATURE_26:LUNG - CREATURE:NIGHT_CREATURE_26:HEART - CREATURE:NIGHT_CREATURE_26:LIVER -CREATURE:NIGHT_CREATURE_26:GUT -"CREATURE:NIGHT_CREATURE_26:STOMACH -"CREATURE:NIGHT_CREATURE_26:GIZZARD -#CREATURE:NIGHT_CREATURE_26:PANCREAS -!CREATURE:NIGHT_CREATURE_26:SPLEEN -!CREATURE:NIGHT_CREATURE_26:KIDNEY -!CREATURE:NIGHT_CREATURE_27:MUSCLE -CREATURE:NIGHT_CREATURE_27:EYE - CREATURE:NIGHT_CREATURE_27:BRAIN -CREATURE:NIGHT_CREATURE_27:LUNG - CREATURE:NIGHT_CREATURE_27:HEART - CREATURE:NIGHT_CREATURE_27:LIVER -CREATURE:NIGHT_CREATURE_27:GUT -"CREATURE:NIGHT_CREATURE_27:STOMACH -"CREATURE:NIGHT_CREATURE_27:GIZZARD -#CREATURE:NIGHT_CREATURE_27:PANCREAS -!CREATURE:NIGHT_CREATURE_27:SPLEEN -!CREATURE:NIGHT_CREATURE_27:KIDNEY -!CREATURE:NIGHT_CREATURE_28:MUSCLE -CREATURE:NIGHT_CREATURE_28:EYE - CREATURE:NIGHT_CREATURE_28:BRAIN -CREATURE:NIGHT_CREATURE_28:LUNG - CREATURE:NIGHT_CREATURE_28:HEART - CREATURE:NIGHT_CREATURE_28:LIVER -CREATURE:NIGHT_CREATURE_28:GUT -"CREATURE:NIGHT_CREATURE_28:STOMACH -"CREATURE:NIGHT_CREATURE_28:GIZZARD -#CREATURE:NIGHT_CREATURE_28:PANCREAS -!CREATURE:NIGHT_CREATURE_28:SPLEEN -!CREATURE:NIGHT_CREATURE_28:KIDNEY -!CREATURE:NIGHT_CREATURE_29:MUSCLE -CREATURE:NIGHT_CREATURE_29:EYE - CREATURE:NIGHT_CREATURE_29:BRAIN -CREATURE:NIGHT_CREATURE_29:LUNG - CREATURE:NIGHT_CREATURE_29:HEART - CREATURE:NIGHT_CREATURE_29:LIVER -CREATURE:NIGHT_CREATURE_29:GUT -"CREATURE:NIGHT_CREATURE_29:STOMACH -"CREATURE:NIGHT_CREATURE_29:GIZZARD -#CREATURE:NIGHT_CREATURE_29:PANCREAS -!CREATURE:NIGHT_CREATURE_29:SPLEEN -!CREATURE:NIGHT_CREATURE_29:KIDNEY -!CREATURE:NIGHT_CREATURE_30:MUSCLE -CREATURE:NIGHT_CREATURE_30:EYE - CREATURE:NIGHT_CREATURE_30:BRAIN -CREATURE:NIGHT_CREATURE_30:LUNG - CREATURE:NIGHT_CREATURE_30:HEART - CREATURE:NIGHT_CREATURE_30:LIVER -CREATURE:NIGHT_CREATURE_30:GUT -"CREATURE:NIGHT_CREATURE_30:STOMACH -"CREATURE:NIGHT_CREATURE_30:GIZZARD -#CREATURE:NIGHT_CREATURE_30:PANCREAS -!CREATURE:NIGHT_CREATURE_30:SPLEEN -!CREATURE:NIGHT_CREATURE_30:KIDNEY -!CREATURE:NIGHT_CREATURE_31:MUSCLE -CREATURE:NIGHT_CREATURE_31:EYE - CREATURE:NIGHT_CREATURE_31:BRAIN -CREATURE:NIGHT_CREATURE_31:LUNG - CREATURE:NIGHT_CREATURE_31:HEART - CREATURE:NIGHT_CREATURE_31:LIVER -CREATURE:NIGHT_CREATURE_31:GUT -"CREATURE:NIGHT_CREATURE_31:STOMACH -"CREATURE:NIGHT_CREATURE_31:GIZZARD -#CREATURE:NIGHT_CREATURE_31:PANCREAS -!CREATURE:NIGHT_CREATURE_31:SPLEEN -!CREATURE:NIGHT_CREATURE_31:KIDNEY -!CREATURE:NIGHT_CREATURE_32:MUSCLE -CREATURE:NIGHT_CREATURE_32:EYE - CREATURE:NIGHT_CREATURE_32:BRAIN -CREATURE:NIGHT_CREATURE_32:LUNG - CREATURE:NIGHT_CREATURE_32:HEART - CREATURE:NIGHT_CREATURE_32:LIVER -CREATURE:NIGHT_CREATURE_32:GUT -"CREATURE:NIGHT_CREATURE_32:STOMACH -"CREATURE:NIGHT_CREATURE_32:GIZZARD -#CREATURE:NIGHT_CREATURE_32:PANCREAS -!CREATURE:NIGHT_CREATURE_32:SPLEEN -!CREATURE:NIGHT_CREATURE_32:KIDNEY -!CREATURE:NIGHT_CREATURE_33:MUSCLE -CREATURE:NIGHT_CREATURE_33:EYE - CREATURE:NIGHT_CREATURE_33:BRAIN -CREATURE:NIGHT_CREATURE_33:LUNG - CREATURE:NIGHT_CREATURE_33:HEART - CREATURE:NIGHT_CREATURE_33:LIVER -CREATURE:NIGHT_CREATURE_33:GUT -"CREATURE:NIGHT_CREATURE_33:STOMACH -"CREATURE:NIGHT_CREATURE_33:GIZZARD -#CREATURE:NIGHT_CREATURE_33:PANCREAS -!CREATURE:NIGHT_CREATURE_33:SPLEEN -!CREATURE:NIGHT_CREATURE_33:KIDNEY -!CREATURE:NIGHT_CREATURE_34:MUSCLE -CREATURE:NIGHT_CREATURE_34:EYE - CREATURE:NIGHT_CREATURE_34:BRAIN -CREATURE:NIGHT_CREATURE_34:LUNG - CREATURE:NIGHT_CREATURE_34:HEART - CREATURE:NIGHT_CREATURE_34:LIVER -CREATURE:NIGHT_CREATURE_34:GUT -"CREATURE:NIGHT_CREATURE_34:STOMACH -"CREATURE:NIGHT_CREATURE_34:GIZZARD -#CREATURE:NIGHT_CREATURE_34:PANCREAS -!CREATURE:NIGHT_CREATURE_34:SPLEEN -!CREATURE:NIGHT_CREATURE_34:KIDNEY -!CREATURE:NIGHT_CREATURE_35:MUSCLE -CREATURE:NIGHT_CREATURE_35:EYE - CREATURE:NIGHT_CREATURE_35:BRAIN -CREATURE:NIGHT_CREATURE_35:LUNG - CREATURE:NIGHT_CREATURE_35:HEART - CREATURE:NIGHT_CREATURE_35:LIVER -CREATURE:NIGHT_CREATURE_35:GUT -"CREATURE:NIGHT_CREATURE_35:STOMACH -"CREATURE:NIGHT_CREATURE_35:GIZZARD -#CREATURE:NIGHT_CREATURE_35:PANCREAS -!CREATURE:NIGHT_CREATURE_35:SPLEEN -!CREATURE:NIGHT_CREATURE_35:KIDNEY -!CREATURE:NIGHT_CREATURE_36:MUSCLE -CREATURE:NIGHT_CREATURE_36:EYE - CREATURE:NIGHT_CREATURE_36:BRAIN -CREATURE:NIGHT_CREATURE_36:LUNG - CREATURE:NIGHT_CREATURE_36:HEART - CREATURE:NIGHT_CREATURE_36:LIVER -CREATURE:NIGHT_CREATURE_36:GUT -"CREATURE:NIGHT_CREATURE_36:STOMACH -"CREATURE:NIGHT_CREATURE_36:GIZZARD -#CREATURE:NIGHT_CREATURE_36:PANCREAS -!CREATURE:NIGHT_CREATURE_36:SPLEEN -!CREATURE:NIGHT_CREATURE_36:KIDNEY -!CREATURE:NIGHT_CREATURE_37:MUSCLE -CREATURE:NIGHT_CREATURE_37:EYE - CREATURE:NIGHT_CREATURE_37:BRAIN -CREATURE:NIGHT_CREATURE_37:LUNG - CREATURE:NIGHT_CREATURE_37:HEART - CREATURE:NIGHT_CREATURE_37:LIVER -CREATURE:NIGHT_CREATURE_37:GUT -"CREATURE:NIGHT_CREATURE_37:STOMACH -"CREATURE:NIGHT_CREATURE_37:GIZZARD -#CREATURE:NIGHT_CREATURE_37:PANCREAS -!CREATURE:NIGHT_CREATURE_37:SPLEEN -!CREATURE:NIGHT_CREATURE_37:KIDNEY -!CREATURE:NIGHT_CREATURE_38:MUSCLE -CREATURE:NIGHT_CREATURE_38:EYE - CREATURE:NIGHT_CREATURE_38:BRAIN -CREATURE:NIGHT_CREATURE_38:LUNG - CREATURE:NIGHT_CREATURE_38:HEART - CREATURE:NIGHT_CREATURE_38:LIVER -CREATURE:NIGHT_CREATURE_38:GUT -"CREATURE:NIGHT_CREATURE_38:STOMACH -"CREATURE:NIGHT_CREATURE_38:GIZZARD -#CREATURE:NIGHT_CREATURE_38:PANCREAS -!CREATURE:NIGHT_CREATURE_38:SPLEEN -!CREATURE:NIGHT_CREATURE_38:KIDNEY -!CREATURE:NIGHT_CREATURE_39:MUSCLE -CREATURE:NIGHT_CREATURE_39:EYE - CREATURE:NIGHT_CREATURE_39:BRAIN -CREATURE:NIGHT_CREATURE_39:LUNG - CREATURE:NIGHT_CREATURE_39:HEART - CREATURE:NIGHT_CREATURE_39:LIVER -CREATURE:NIGHT_CREATURE_39:GUT -"CREATURE:NIGHT_CREATURE_39:STOMACH -"CREATURE:NIGHT_CREATURE_39:GIZZARD -#CREATURE:NIGHT_CREATURE_39:PANCREAS -!CREATURE:NIGHT_CREATURE_39:SPLEEN -!CREATURE:NIGHT_CREATURE_39:KIDNEY -!CREATURE:NIGHT_CREATURE_40:MUSCLE -CREATURE:NIGHT_CREATURE_40:EYE - CREATURE:NIGHT_CREATURE_40:BRAIN -CREATURE:NIGHT_CREATURE_40:LUNG - CREATURE:NIGHT_CREATURE_40:HEART - CREATURE:NIGHT_CREATURE_40:LIVER -CREATURE:NIGHT_CREATURE_40:GUT -"CREATURE:NIGHT_CREATURE_40:STOMACH -"CREATURE:NIGHT_CREATURE_40:GIZZARD -#CREATURE:NIGHT_CREATURE_40:PANCREAS -!CREATURE:NIGHT_CREATURE_40:SPLEEN -!CREATURE:NIGHT_CREATURE_40:KIDNEY -!CREATURE:NIGHT_CREATURE_41:MUSCLE -CREATURE:NIGHT_CREATURE_41:EYE - CREATURE:NIGHT_CREATURE_41:BRAIN -CREATURE:NIGHT_CREATURE_41:LUNG - CREATURE:NIGHT_CREATURE_41:HEART - CREATURE:NIGHT_CREATURE_41:LIVER -CREATURE:NIGHT_CREATURE_41:GUT -"CREATURE:NIGHT_CREATURE_41:STOMACH -"CREATURE:NIGHT_CREATURE_41:GIZZARD -#CREATURE:NIGHT_CREATURE_41:PANCREAS -!CREATURE:NIGHT_CREATURE_41:SPLEEN -!CREATURE:NIGHT_CREATURE_41:KIDNEY -!CREATURE:NIGHT_CREATURE_42:MUSCLE -CREATURE:NIGHT_CREATURE_42:EYE - CREATURE:NIGHT_CREATURE_42:BRAIN -CREATURE:NIGHT_CREATURE_42:LUNG - CREATURE:NIGHT_CREATURE_42:HEART - CREATURE:NIGHT_CREATURE_42:LIVER -CREATURE:NIGHT_CREATURE_42:GUT -"CREATURE:NIGHT_CREATURE_42:STOMACH -"CREATURE:NIGHT_CREATURE_42:GIZZARD -#CREATURE:NIGHT_CREATURE_42:PANCREAS -!CREATURE:NIGHT_CREATURE_42:SPLEEN -!CREATURE:NIGHT_CREATURE_42:KIDNEY -!CREATURE:NIGHT_CREATURE_43:MUSCLE -CREATURE:NIGHT_CREATURE_43:EYE - CREATURE:NIGHT_CREATURE_43:BRAIN -CREATURE:NIGHT_CREATURE_43:LUNG - CREATURE:NIGHT_CREATURE_43:HEART - CREATURE:NIGHT_CREATURE_43:LIVER -CREATURE:NIGHT_CREATURE_43:GUT -"CREATURE:NIGHT_CREATURE_43:STOMACH -"CREATURE:NIGHT_CREATURE_43:GIZZARD -#CREATURE:NIGHT_CREATURE_43:PANCREAS -!CREATURE:NIGHT_CREATURE_43:SPLEEN -!CREATURE:NIGHT_CREATURE_43:KIDNEY -!CREATURE:NIGHT_CREATURE_44:MUSCLE -CREATURE:NIGHT_CREATURE_44:EYE - CREATURE:NIGHT_CREATURE_44:BRAIN -CREATURE:NIGHT_CREATURE_44:LUNG - CREATURE:NIGHT_CREATURE_44:HEART - CREATURE:NIGHT_CREATURE_44:LIVER -CREATURE:NIGHT_CREATURE_44:GUT -"CREATURE:NIGHT_CREATURE_44:STOMACH -"CREATURE:NIGHT_CREATURE_44:GIZZARD -#CREATURE:NIGHT_CREATURE_44:PANCREAS -!CREATURE:NIGHT_CREATURE_44:SPLEEN -!CREATURE:NIGHT_CREATURE_44:KIDNEY -!CREATURE:NIGHT_CREATURE_45:MUSCLE -CREATURE:NIGHT_CREATURE_45:EYE - CREATURE:NIGHT_CREATURE_45:BRAIN -CREATURE:NIGHT_CREATURE_45:LUNG - CREATURE:NIGHT_CREATURE_45:HEART - CREATURE:NIGHT_CREATURE_45:LIVER -CREATURE:NIGHT_CREATURE_45:GUT -"CREATURE:NIGHT_CREATURE_45:STOMACH -"CREATURE:NIGHT_CREATURE_45:GIZZARD -#CREATURE:NIGHT_CREATURE_45:PANCREAS -!CREATURE:NIGHT_CREATURE_45:SPLEEN -!CREATURE:NIGHT_CREATURE_45:KIDNEY -!CREATURE:NIGHT_CREATURE_46:MUSCLE -CREATURE:NIGHT_CREATURE_46:EYE - CREATURE:NIGHT_CREATURE_46:BRAIN -CREATURE:NIGHT_CREATURE_46:LUNG - CREATURE:NIGHT_CREATURE_46:HEART - CREATURE:NIGHT_CREATURE_46:LIVER -CREATURE:NIGHT_CREATURE_46:GUT -"CREATURE:NIGHT_CREATURE_46:STOMACH -"CREATURE:NIGHT_CREATURE_46:GIZZARD -#CREATURE:NIGHT_CREATURE_46:PANCREAS -!CREATURE:NIGHT_CREATURE_46:SPLEEN -!CREATURE:NIGHT_CREATURE_46:KIDNEY -!CREATURE:NIGHT_CREATURE_47:MUSCLE -CREATURE:NIGHT_CREATURE_47:EYE - CREATURE:NIGHT_CREATURE_47:BRAIN -CREATURE:NIGHT_CREATURE_47:LUNG - CREATURE:NIGHT_CREATURE_47:HEART - CREATURE:NIGHT_CREATURE_47:LIVER -CREATURE:NIGHT_CREATURE_47:GUT -"CREATURE:NIGHT_CREATURE_47:STOMACH -"CREATURE:NIGHT_CREATURE_47:GIZZARD -#CREATURE:NIGHT_CREATURE_47:PANCREAS -!CREATURE:NIGHT_CREATURE_47:SPLEEN -!CREATURE:NIGHT_CREATURE_47:KIDNEY -!CREATURE:NIGHT_CREATURE_48:MUSCLE -CREATURE:NIGHT_CREATURE_48:EYE - CREATURE:NIGHT_CREATURE_48:BRAIN -CREATURE:NIGHT_CREATURE_48:LUNG - CREATURE:NIGHT_CREATURE_48:HEART - CREATURE:NIGHT_CREATURE_48:LIVER -CREATURE:NIGHT_CREATURE_48:GUT -"CREATURE:NIGHT_CREATURE_48:STOMACH -"CREATURE:NIGHT_CREATURE_48:GIZZARD -#CREATURE:NIGHT_CREATURE_48:PANCREAS -!CREATURE:NIGHT_CREATURE_48:SPLEEN -!CREATURE:NIGHT_CREATURE_48:KIDNEY -!CREATURE:NIGHT_CREATURE_49:MUSCLE -CREATURE:NIGHT_CREATURE_49:EYE - CREATURE:NIGHT_CREATURE_49:BRAIN -CREATURE:NIGHT_CREATURE_49:LUNG - CREATURE:NIGHT_CREATURE_49:HEART - CREATURE:NIGHT_CREATURE_49:LIVER -CREATURE:NIGHT_CREATURE_49:GUT -"CREATURE:NIGHT_CREATURE_49:STOMACH -"CREATURE:NIGHT_CREATURE_49:GIZZARD -#CREATURE:NIGHT_CREATURE_49:PANCREAS -!CREATURE:NIGHT_CREATURE_49:SPLEEN -!CREATURE:NIGHT_CREATURE_49:KIDNEY -!CREATURE:NIGHT_CREATURE_50:MUSCLE -CREATURE:NIGHT_CREATURE_50:EYE - CREATURE:NIGHT_CREATURE_50:BRAIN -CREATURE:NIGHT_CREATURE_50:LUNG - CREATURE:NIGHT_CREATURE_50:HEART - CREATURE:NIGHT_CREATURE_50:LIVER -CREATURE:NIGHT_CREATURE_50:GUT -"CREATURE:NIGHT_CREATURE_50:STOMACH -"CREATURE:NIGHT_CREATURE_50:GIZZARD -#CREATURE:NIGHT_CREATURE_50:PANCREAS -!CREATURE:NIGHT_CREATURE_50:SPLEEN -!CREATURE:NIGHT_CREATURE_50:KIDNEY -!CREATURE:NIGHT_CREATURE_51:MUSCLE -CREATURE:NIGHT_CREATURE_51:EYE - CREATURE:NIGHT_CREATURE_51:BRAIN -CREATURE:NIGHT_CREATURE_51:LUNG - CREATURE:NIGHT_CREATURE_51:HEART - CREATURE:NIGHT_CREATURE_51:LIVER -CREATURE:NIGHT_CREATURE_51:GUT -"CREATURE:NIGHT_CREATURE_51:STOMACH -"CREATURE:NIGHT_CREATURE_51:GIZZARD -#CREATURE:NIGHT_CREATURE_51:PANCREAS -!CREATURE:NIGHT_CREATURE_51:SPLEEN -!CREATURE:NIGHT_CREATURE_51:KIDNEY -!CREATURE:NIGHT_CREATURE_52:MUSCLE -CREATURE:NIGHT_CREATURE_52:EYE - CREATURE:NIGHT_CREATURE_52:BRAIN -CREATURE:NIGHT_CREATURE_52:LUNG - CREATURE:NIGHT_CREATURE_52:HEART - CREATURE:NIGHT_CREATURE_52:LIVER -CREATURE:NIGHT_CREATURE_52:GUT -"CREATURE:NIGHT_CREATURE_52:STOMACH -"CREATURE:NIGHT_CREATURE_52:GIZZARD -#CREATURE:NIGHT_CREATURE_52:PANCREAS -!CREATURE:NIGHT_CREATURE_52:SPLEEN -!CREATURE:NIGHT_CREATURE_52:KIDNEY -!CREATURE:NIGHT_CREATURE_53:MUSCLE -CREATURE:NIGHT_CREATURE_53:EYE - CREATURE:NIGHT_CREATURE_53:BRAIN -CREATURE:NIGHT_CREATURE_53:LUNG - CREATURE:NIGHT_CREATURE_53:HEART - CREATURE:NIGHT_CREATURE_53:LIVER -CREATURE:NIGHT_CREATURE_53:GUT -"CREATURE:NIGHT_CREATURE_53:STOMACH -"CREATURE:NIGHT_CREATURE_53:GIZZARD -#CREATURE:NIGHT_CREATURE_53:PANCREAS -!CREATURE:NIGHT_CREATURE_53:SPLEEN -!CREATURE:NIGHT_CREATURE_53:KIDNEY -!CREATURE:NIGHT_CREATURE_54:MUSCLE -CREATURE:NIGHT_CREATURE_54:EYE - CREATURE:NIGHT_CREATURE_54:BRAIN -CREATURE:NIGHT_CREATURE_54:LUNG - CREATURE:NIGHT_CREATURE_54:HEART - CREATURE:NIGHT_CREATURE_54:LIVER -CREATURE:NIGHT_CREATURE_54:GUT -"CREATURE:NIGHT_CREATURE_54:STOMACH -"CREATURE:NIGHT_CREATURE_54:GIZZARD -#CREATURE:NIGHT_CREATURE_54:PANCREAS -!CREATURE:NIGHT_CREATURE_54:SPLEEN -!CREATURE:NIGHT_CREATURE_54:KIDNEY -!CREATURE:NIGHT_CREATURE_55:MUSCLE -CREATURE:NIGHT_CREATURE_55:EYE - CREATURE:NIGHT_CREATURE_55:BRAIN -CREATURE:NIGHT_CREATURE_55:LUNG - CREATURE:NIGHT_CREATURE_55:HEART - CREATURE:NIGHT_CREATURE_55:LIVER -CREATURE:NIGHT_CREATURE_55:GUT -"CREATURE:NIGHT_CREATURE_55:STOMACH -"CREATURE:NIGHT_CREATURE_55:GIZZARD -#CREATURE:NIGHT_CREATURE_55:PANCREAS -!CREATURE:NIGHT_CREATURE_55:SPLEEN -!CREATURE:NIGHT_CREATURE_55:KIDNEY -!CREATURE:NIGHT_CREATURE_56:MUSCLE -CREATURE:NIGHT_CREATURE_56:EYE - CREATURE:NIGHT_CREATURE_56:BRAIN -CREATURE:NIGHT_CREATURE_56:LUNG - CREATURE:NIGHT_CREATURE_56:HEART - CREATURE:NIGHT_CREATURE_56:LIVER -CREATURE:NIGHT_CREATURE_56:GUT -"CREATURE:NIGHT_CREATURE_56:STOMACH -"CREATURE:NIGHT_CREATURE_56:GIZZARD -#CREATURE:NIGHT_CREATURE_56:PANCREAS -!CREATURE:NIGHT_CREATURE_56:SPLEEN -!CREATURE:NIGHT_CREATURE_56:KIDNEY -!CREATURE:NIGHT_CREATURE_57:MUSCLE -CREATURE:NIGHT_CREATURE_57:EYE - CREATURE:NIGHT_CREATURE_57:BRAIN -CREATURE:NIGHT_CREATURE_57:LUNG - CREATURE:NIGHT_CREATURE_57:HEART - CREATURE:NIGHT_CREATURE_57:LIVER -CREATURE:NIGHT_CREATURE_57:GUT -"CREATURE:NIGHT_CREATURE_57:STOMACH -"CREATURE:NIGHT_CREATURE_57:GIZZARD -#CREATURE:NIGHT_CREATURE_57:PANCREAS -!CREATURE:NIGHT_CREATURE_57:SPLEEN -!CREATURE:NIGHT_CREATURE_57:KIDNEY -!CREATURE:NIGHT_CREATURE_58:MUSCLE -CREATURE:NIGHT_CREATURE_58:EYE - CREATURE:NIGHT_CREATURE_58:BRAIN -CREATURE:NIGHT_CREATURE_58:LUNG - CREATURE:NIGHT_CREATURE_58:HEART - CREATURE:NIGHT_CREATURE_58:LIVER -CREATURE:NIGHT_CREATURE_58:GUT -"CREATURE:NIGHT_CREATURE_58:STOMACH -"CREATURE:NIGHT_CREATURE_58:GIZZARD -#CREATURE:NIGHT_CREATURE_58:PANCREAS -!CREATURE:NIGHT_CREATURE_58:SPLEEN -!CREATURE:NIGHT_CREATURE_58:KIDNEY -!CREATURE:NIGHT_CREATURE_59:MUSCLE -CREATURE:NIGHT_CREATURE_59:EYE - CREATURE:NIGHT_CREATURE_59:BRAIN -CREATURE:NIGHT_CREATURE_59:LUNG - CREATURE:NIGHT_CREATURE_59:HEART - CREATURE:NIGHT_CREATURE_59:LIVER -CREATURE:NIGHT_CREATURE_59:GUT -"CREATURE:NIGHT_CREATURE_59:STOMACH -"CREATURE:NIGHT_CREATURE_59:GIZZARD -#CREATURE:NIGHT_CREATURE_59:PANCREAS -!CREATURE:NIGHT_CREATURE_59:SPLEEN -!CREATURE:NIGHT_CREATURE_59:KIDNEY -!CREATURE:NIGHT_CREATURE_60:MUSCLE -CREATURE:NIGHT_CREATURE_60:EYE - CREATURE:NIGHT_CREATURE_60:BRAIN -CREATURE:NIGHT_CREATURE_60:LUNG - CREATURE:NIGHT_CREATURE_60:HEART - CREATURE:NIGHT_CREATURE_60:LIVER -CREATURE:NIGHT_CREATURE_60:GUT -"CREATURE:NIGHT_CREATURE_60:STOMACH -"CREATURE:NIGHT_CREATURE_60:GIZZARD -#CREATURE:NIGHT_CREATURE_60:PANCREAS -!CREATURE:NIGHT_CREATURE_60:SPLEEN -!CREATURE:NIGHT_CREATURE_60:KIDNEY -!CREATURE:NIGHT_CREATURE_61:MUSCLE -CREATURE:NIGHT_CREATURE_61:EYE - CREATURE:NIGHT_CREATURE_61:BRAIN -CREATURE:NIGHT_CREATURE_61:LUNG - CREATURE:NIGHT_CREATURE_61:HEART - CREATURE:NIGHT_CREATURE_61:LIVER -CREATURE:NIGHT_CREATURE_61:GUT -"CREATURE:NIGHT_CREATURE_61:STOMACH -"CREATURE:NIGHT_CREATURE_61:GIZZARD -#CREATURE:NIGHT_CREATURE_61:PANCREAS -!CREATURE:NIGHT_CREATURE_61:SPLEEN -!CREATURE:NIGHT_CREATURE_61:KIDNEY -!CREATURE:NIGHT_CREATURE_62:MUSCLE -CREATURE:NIGHT_CREATURE_62:EYE - CREATURE:NIGHT_CREATURE_62:BRAIN -CREATURE:NIGHT_CREATURE_62:LUNG - CREATURE:NIGHT_CREATURE_62:HEART - CREATURE:NIGHT_CREATURE_62:LIVER -CREATURE:NIGHT_CREATURE_62:GUT -"CREATURE:NIGHT_CREATURE_62:STOMACH -"CREATURE:NIGHT_CREATURE_62:GIZZARD -#CREATURE:NIGHT_CREATURE_62:PANCREAS -!CREATURE:NIGHT_CREATURE_62:SPLEEN -!CREATURE:NIGHT_CREATURE_62:KIDNEY -!CREATURE:NIGHT_CREATURE_63:MUSCLE -CREATURE:NIGHT_CREATURE_63:EYE - CREATURE:NIGHT_CREATURE_63:BRAIN -CREATURE:NIGHT_CREATURE_63:LUNG - CREATURE:NIGHT_CREATURE_63:HEART - CREATURE:NIGHT_CREATURE_63:LIVER -CREATURE:NIGHT_CREATURE_63:GUT -"CREATURE:NIGHT_CREATURE_63:STOMACH -"CREATURE:NIGHT_CREATURE_63:GIZZARD -#CREATURE:NIGHT_CREATURE_63:PANCREAS -!CREATURE:NIGHT_CREATURE_63:SPLEEN -!CREATURE:NIGHT_CREATURE_63:KIDNEY -!CREATURE:NIGHT_CREATURE_64:MUSCLE -CREATURE:NIGHT_CREATURE_64:EYE - CREATURE:NIGHT_CREATURE_64:BRAIN -CREATURE:NIGHT_CREATURE_64:LUNG - CREATURE:NIGHT_CREATURE_64:HEART - CREATURE:NIGHT_CREATURE_64:LIVER -CREATURE:NIGHT_CREATURE_64:GUT -"CREATURE:NIGHT_CREATURE_64:STOMACH -"CREATURE:NIGHT_CREATURE_64:GIZZARD -#CREATURE:NIGHT_CREATURE_64:PANCREAS -!CREATURE:NIGHT_CREATURE_64:SPLEEN -!CREATURE:NIGHT_CREATURE_64:KIDNEY -!CREATURE:NIGHT_CREATURE_65:MUSCLE -CREATURE:NIGHT_CREATURE_65:EYE - CREATURE:NIGHT_CREATURE_65:BRAIN -CREATURE:NIGHT_CREATURE_65:LUNG - CREATURE:NIGHT_CREATURE_65:HEART - CREATURE:NIGHT_CREATURE_65:LIVER -CREATURE:NIGHT_CREATURE_65:GUT -"CREATURE:NIGHT_CREATURE_65:STOMACH -"CREATURE:NIGHT_CREATURE_65:GIZZARD -#CREATURE:NIGHT_CREATURE_65:PANCREAS -!CREATURE:NIGHT_CREATURE_65:SPLEEN -!CREATURE:NIGHT_CREATURE_65:KIDNEY -!CREATURE:NIGHT_CREATURE_66:MUSCLE -CREATURE:NIGHT_CREATURE_66:EYE - CREATURE:NIGHT_CREATURE_66:BRAIN -CREATURE:NIGHT_CREATURE_66:LUNG - CREATURE:NIGHT_CREATURE_66:HEART - CREATURE:NIGHT_CREATURE_66:LIVER -CREATURE:NIGHT_CREATURE_66:GUT -"CREATURE:NIGHT_CREATURE_66:STOMACH -"CREATURE:NIGHT_CREATURE_66:GIZZARD -#CREATURE:NIGHT_CREATURE_66:PANCREAS -!CREATURE:NIGHT_CREATURE_66:SPLEEN -!CREATURE:NIGHT_CREATURE_66:KIDNEY -!CREATURE:NIGHT_CREATURE_67:MUSCLE -CREATURE:NIGHT_CREATURE_67:EYE - CREATURE:NIGHT_CREATURE_67:BRAIN -CREATURE:NIGHT_CREATURE_67:LUNG - CREATURE:NIGHT_CREATURE_67:HEART - CREATURE:NIGHT_CREATURE_67:LIVER -CREATURE:NIGHT_CREATURE_67:GUT -"CREATURE:NIGHT_CREATURE_67:STOMACH -"CREATURE:NIGHT_CREATURE_67:GIZZARD -#CREATURE:NIGHT_CREATURE_67:PANCREAS -!CREATURE:NIGHT_CREATURE_67:SPLEEN -!CREATURE:NIGHT_CREATURE_67:KIDNEY -!CREATURE:NIGHT_CREATURE_68:MUSCLE -CREATURE:NIGHT_CREATURE_68:EYE - CREATURE:NIGHT_CREATURE_68:BRAIN -CREATURE:NIGHT_CREATURE_68:LUNG - CREATURE:NIGHT_CREATURE_68:HEART - CREATURE:NIGHT_CREATURE_68:LIVER -CREATURE:NIGHT_CREATURE_68:GUT -"CREATURE:NIGHT_CREATURE_68:STOMACH -"CREATURE:NIGHT_CREATURE_68:GIZZARD -#CREATURE:NIGHT_CREATURE_68:PANCREAS -!CREATURE:NIGHT_CREATURE_68:SPLEEN -!CREATURE:NIGHT_CREATURE_68:KIDNEY -!CREATURE:NIGHT_CREATURE_69:MUSCLE -CREATURE:NIGHT_CREATURE_69:EYE - CREATURE:NIGHT_CREATURE_69:BRAIN -CREATURE:NIGHT_CREATURE_69:LUNG - CREATURE:NIGHT_CREATURE_69:HEART - CREATURE:NIGHT_CREATURE_69:LIVER -CREATURE:NIGHT_CREATURE_69:GUT -"CREATURE:NIGHT_CREATURE_69:STOMACH -"CREATURE:NIGHT_CREATURE_69:GIZZARD -#CREATURE:NIGHT_CREATURE_69:PANCREAS -!CREATURE:NIGHT_CREATURE_69:SPLEEN -!CREATURE:NIGHT_CREATURE_69:KIDNEY -!CREATURE:NIGHT_CREATURE_70:MUSCLE -CREATURE:NIGHT_CREATURE_70:EYE - CREATURE:NIGHT_CREATURE_70:BRAIN -CREATURE:NIGHT_CREATURE_70:LUNG - CREATURE:NIGHT_CREATURE_70:HEART - CREATURE:NIGHT_CREATURE_70:LIVER -CREATURE:NIGHT_CREATURE_70:GUT -"CREATURE:NIGHT_CREATURE_70:STOMACH -"CREATURE:NIGHT_CREATURE_70:GIZZARD -#CREATURE:NIGHT_CREATURE_70:PANCREAS -!CREATURE:NIGHT_CREATURE_70:SPLEEN -!CREATURE:NIGHT_CREATURE_70:KIDNEY -!CREATURE:NIGHT_CREATURE_71:MUSCLE -CREATURE:NIGHT_CREATURE_71:EYE - CREATURE:NIGHT_CREATURE_71:BRAIN -CREATURE:NIGHT_CREATURE_71:LUNG - CREATURE:NIGHT_CREATURE_71:HEART - CREATURE:NIGHT_CREATURE_71:LIVER -CREATURE:NIGHT_CREATURE_71:GUT -"CREATURE:NIGHT_CREATURE_71:STOMACH -"CREATURE:NIGHT_CREATURE_71:GIZZARD -#CREATURE:NIGHT_CREATURE_71:PANCREAS -!CREATURE:NIGHT_CREATURE_71:SPLEEN -!CREATURE:NIGHT_CREATURE_71:KIDNEY -!CREATURE:NIGHT_CREATURE_72:MUSCLE -CREATURE:NIGHT_CREATURE_72:EYE - CREATURE:NIGHT_CREATURE_72:BRAIN -CREATURE:NIGHT_CREATURE_72:LUNG - CREATURE:NIGHT_CREATURE_72:HEART - CREATURE:NIGHT_CREATURE_72:LIVER -CREATURE:NIGHT_CREATURE_72:GUT -"CREATURE:NIGHT_CREATURE_72:STOMACH -"CREATURE:NIGHT_CREATURE_72:GIZZARD -#CREATURE:NIGHT_CREATURE_72:PANCREAS -!CREATURE:NIGHT_CREATURE_72:SPLEEN -!CREATURE:NIGHT_CREATURE_72:KIDNEY -!CREATURE:NIGHT_CREATURE_73:MUSCLE -CREATURE:NIGHT_CREATURE_73:EYE - CREATURE:NIGHT_CREATURE_73:BRAIN -CREATURE:NIGHT_CREATURE_73:LUNG - CREATURE:NIGHT_CREATURE_73:HEART - CREATURE:NIGHT_CREATURE_73:LIVER -CREATURE:NIGHT_CREATURE_73:GUT -"CREATURE:NIGHT_CREATURE_73:STOMACH -"CREATURE:NIGHT_CREATURE_73:GIZZARD -#CREATURE:NIGHT_CREATURE_73:PANCREAS -!CREATURE:NIGHT_CREATURE_73:SPLEEN -!CREATURE:NIGHT_CREATURE_73:KIDNEY -!CREATURE:NIGHT_CREATURE_74:MUSCLE -CREATURE:NIGHT_CREATURE_74:EYE - CREATURE:NIGHT_CREATURE_74:BRAIN -CREATURE:NIGHT_CREATURE_74:LUNG - CREATURE:NIGHT_CREATURE_74:HEART - CREATURE:NIGHT_CREATURE_74:LIVER -CREATURE:NIGHT_CREATURE_74:GUT -"CREATURE:NIGHT_CREATURE_74:STOMACH -"CREATURE:NIGHT_CREATURE_74:GIZZARD -#CREATURE:NIGHT_CREATURE_74:PANCREAS -!CREATURE:NIGHT_CREATURE_74:SPLEEN -!CREATURE:NIGHT_CREATURE_74:KIDNEY -!CREATURE:NIGHT_CREATURE_75:MUSCLE -CREATURE:NIGHT_CREATURE_75:EYE - CREATURE:NIGHT_CREATURE_75:BRAIN -CREATURE:NIGHT_CREATURE_75:LUNG - CREATURE:NIGHT_CREATURE_75:HEART - CREATURE:NIGHT_CREATURE_75:LIVER -CREATURE:NIGHT_CREATURE_75:GUT -"CREATURE:NIGHT_CREATURE_75:STOMACH -"CREATURE:NIGHT_CREATURE_75:GIZZARD -#CREATURE:NIGHT_CREATURE_75:PANCREAS -!CREATURE:NIGHT_CREATURE_75:SPLEEN -!CREATURE:NIGHT_CREATURE_75:KIDNEY -!CREATURE:NIGHT_CREATURE_76:MUSCLE -CREATURE:NIGHT_CREATURE_76:EYE - CREATURE:NIGHT_CREATURE_76:BRAIN -CREATURE:NIGHT_CREATURE_76:LUNG - CREATURE:NIGHT_CREATURE_76:HEART - CREATURE:NIGHT_CREATURE_76:LIVER -CREATURE:NIGHT_CREATURE_76:GUT -"CREATURE:NIGHT_CREATURE_76:STOMACH -"CREATURE:NIGHT_CREATURE_76:GIZZARD -#CREATURE:NIGHT_CREATURE_76:PANCREAS -!CREATURE:NIGHT_CREATURE_76:SPLEEN -!CREATURE:NIGHT_CREATURE_76:KIDNEY -!CREATURE:NIGHT_CREATURE_77:MUSCLE -CREATURE:NIGHT_CREATURE_77:EYE - CREATURE:NIGHT_CREATURE_77:BRAIN -CREATURE:NIGHT_CREATURE_77:LUNG - CREATURE:NIGHT_CREATURE_77:HEART - CREATURE:NIGHT_CREATURE_77:LIVER -CREATURE:NIGHT_CREATURE_77:GUT -"CREATURE:NIGHT_CREATURE_77:STOMACH -"CREATURE:NIGHT_CREATURE_77:GIZZARD -#CREATURE:NIGHT_CREATURE_77:PANCREAS -!CREATURE:NIGHT_CREATURE_77:SPLEEN -!CREATURE:NIGHT_CREATURE_77:KIDNEY -!CREATURE:NIGHT_CREATURE_78:MUSCLE -CREATURE:NIGHT_CREATURE_78:EYE - CREATURE:NIGHT_CREATURE_78:BRAIN -CREATURE:NIGHT_CREATURE_78:LUNG - CREATURE:NIGHT_CREATURE_78:HEART - CREATURE:NIGHT_CREATURE_78:LIVER -CREATURE:NIGHT_CREATURE_78:GUT -"CREATURE:NIGHT_CREATURE_78:STOMACH -"CREATURE:NIGHT_CREATURE_78:GIZZARD -#CREATURE:NIGHT_CREATURE_78:PANCREAS -!CREATURE:NIGHT_CREATURE_78:SPLEEN -!CREATURE:NIGHT_CREATURE_78:KIDNEY -!CREATURE:NIGHT_CREATURE_79:MUSCLE -CREATURE:NIGHT_CREATURE_79:EYE - CREATURE:NIGHT_CREATURE_79:BRAIN -CREATURE:NIGHT_CREATURE_79:LUNG - CREATURE:NIGHT_CREATURE_79:HEART - CREATURE:NIGHT_CREATURE_79:LIVER -CREATURE:NIGHT_CREATURE_79:GUT -"CREATURE:NIGHT_CREATURE_79:STOMACH -"CREATURE:NIGHT_CREATURE_79:GIZZARD -#CREATURE:NIGHT_CREATURE_79:PANCREAS -!CREATURE:NIGHT_CREATURE_79:SPLEEN -!CREATURE:NIGHT_CREATURE_79:KIDNEY -!CREATURE:NIGHT_CREATURE_80:MUSCLE -CREATURE:NIGHT_CREATURE_80:EYE - CREATURE:NIGHT_CREATURE_80:BRAIN -CREATURE:NIGHT_CREATURE_80:LUNG - CREATURE:NIGHT_CREATURE_80:HEART - CREATURE:NIGHT_CREATURE_80:LIVER -CREATURE:NIGHT_CREATURE_80:GUT -"CREATURE:NIGHT_CREATURE_80:STOMACH -"CREATURE:NIGHT_CREATURE_80:GIZZARD -#CREATURE:NIGHT_CREATURE_80:PANCREAS -!CREATURE:NIGHT_CREATURE_80:SPLEEN -!CREATURE:NIGHT_CREATURE_80:KIDNEY -!CREATURE:NIGHT_CREATURE_81:MUSCLE -CREATURE:NIGHT_CREATURE_81:EYE - CREATURE:NIGHT_CREATURE_81:BRAIN -CREATURE:NIGHT_CREATURE_81:LUNG - CREATURE:NIGHT_CREATURE_81:HEART - CREATURE:NIGHT_CREATURE_81:LIVER -CREATURE:NIGHT_CREATURE_81:GUT -"CREATURE:NIGHT_CREATURE_81:STOMACH -"CREATURE:NIGHT_CREATURE_81:GIZZARD -#CREATURE:NIGHT_CREATURE_81:PANCREAS -!CREATURE:NIGHT_CREATURE_81:SPLEEN -!CREATURE:NIGHT_CREATURE_81:KIDNEY -!CREATURE:NIGHT_CREATURE_82:MUSCLE -CREATURE:NIGHT_CREATURE_82:EYE - CREATURE:NIGHT_CREATURE_82:BRAIN -CREATURE:NIGHT_CREATURE_82:LUNG - CREATURE:NIGHT_CREATURE_82:HEART - CREATURE:NIGHT_CREATURE_82:LIVER -CREATURE:NIGHT_CREATURE_82:GUT -"CREATURE:NIGHT_CREATURE_82:STOMACH -"CREATURE:NIGHT_CREATURE_82:GIZZARD -#CREATURE:NIGHT_CREATURE_82:PANCREAS -!CREATURE:NIGHT_CREATURE_82:SPLEEN -!CREATURE:NIGHT_CREATURE_82:KIDNEY -!CREATURE:NIGHT_CREATURE_83:MUSCLE -CREATURE:NIGHT_CREATURE_83:EYE - CREATURE:NIGHT_CREATURE_83:BRAIN -CREATURE:NIGHT_CREATURE_83:LUNG - CREATURE:NIGHT_CREATURE_83:HEART - CREATURE:NIGHT_CREATURE_83:LIVER -CREATURE:NIGHT_CREATURE_83:GUT -"CREATURE:NIGHT_CREATURE_83:STOMACH -"CREATURE:NIGHT_CREATURE_83:GIZZARD -#CREATURE:NIGHT_CREATURE_83:PANCREAS -!CREATURE:NIGHT_CREATURE_83:SPLEEN -!CREATURE:NIGHT_CREATURE_83:KIDNEY -!CREATURE:NIGHT_CREATURE_84:MUSCLE -CREATURE:NIGHT_CREATURE_84:EYE - CREATURE:NIGHT_CREATURE_84:BRAIN -CREATURE:NIGHT_CREATURE_84:LUNG - CREATURE:NIGHT_CREATURE_84:HEART - CREATURE:NIGHT_CREATURE_84:LIVER -CREATURE:NIGHT_CREATURE_84:GUT -"CREATURE:NIGHT_CREATURE_84:STOMACH -"CREATURE:NIGHT_CREATURE_84:GIZZARD -#CREATURE:NIGHT_CREATURE_84:PANCREAS -!CREATURE:NIGHT_CREATURE_84:SPLEEN -!CREATURE:NIGHT_CREATURE_84:KIDNEY -!CREATURE:NIGHT_CREATURE_85:MUSCLE -CREATURE:NIGHT_CREATURE_85:EYE - CREATURE:NIGHT_CREATURE_85:BRAIN -CREATURE:NIGHT_CREATURE_85:LUNG - CREATURE:NIGHT_CREATURE_85:HEART - CREATURE:NIGHT_CREATURE_85:LIVER -CREATURE:NIGHT_CREATURE_85:GUT -"CREATURE:NIGHT_CREATURE_85:STOMACH -"CREATURE:NIGHT_CREATURE_85:GIZZARD -#CREATURE:NIGHT_CREATURE_85:PANCREAS -!CREATURE:NIGHT_CREATURE_85:SPLEEN -!CREATURE:NIGHT_CREATURE_85:KIDNEY -!CREATURE:NIGHT_CREATURE_86:MUSCLE -CREATURE:NIGHT_CREATURE_86:EYE - CREATURE:NIGHT_CREATURE_86:BRAIN -CREATURE:NIGHT_CREATURE_86:LUNG - CREATURE:NIGHT_CREATURE_86:HEART - CREATURE:NIGHT_CREATURE_86:LIVER -CREATURE:NIGHT_CREATURE_86:GUT -"CREATURE:NIGHT_CREATURE_86:STOMACH -"CREATURE:NIGHT_CREATURE_86:GIZZARD -#CREATURE:NIGHT_CREATURE_86:PANCREAS -!CREATURE:NIGHT_CREATURE_86:SPLEEN -!CREATURE:NIGHT_CREATURE_86:KIDNEY -!CREATURE:NIGHT_CREATURE_87:MUSCLE -CREATURE:NIGHT_CREATURE_87:EYE - CREATURE:NIGHT_CREATURE_87:BRAIN -CREATURE:NIGHT_CREATURE_87:LUNG - CREATURE:NIGHT_CREATURE_87:HEART - CREATURE:NIGHT_CREATURE_87:LIVER -CREATURE:NIGHT_CREATURE_87:GUT -"CREATURE:NIGHT_CREATURE_87:STOMACH -"CREATURE:NIGHT_CREATURE_87:GIZZARD -#CREATURE:NIGHT_CREATURE_87:PANCREAS -!CREATURE:NIGHT_CREATURE_87:SPLEEN -!CREATURE:NIGHT_CREATURE_87:KIDNEY -!CREATURE:NIGHT_CREATURE_88:MUSCLE -CREATURE:NIGHT_CREATURE_88:EYE - CREATURE:NIGHT_CREATURE_88:BRAIN -CREATURE:NIGHT_CREATURE_88:LUNG - CREATURE:NIGHT_CREATURE_88:HEART - CREATURE:NIGHT_CREATURE_88:LIVER -CREATURE:NIGHT_CREATURE_88:GUT -"CREATURE:NIGHT_CREATURE_88:STOMACH -"CREATURE:NIGHT_CREATURE_88:GIZZARD -#CREATURE:NIGHT_CREATURE_88:PANCREAS -!CREATURE:NIGHT_CREATURE_88:SPLEEN -!CREATURE:NIGHT_CREATURE_88:KIDNEY -!CREATURE:NIGHT_CREATURE_89:MUSCLE -CREATURE:NIGHT_CREATURE_89:EYE - CREATURE:NIGHT_CREATURE_89:BRAIN -CREATURE:NIGHT_CREATURE_89:LUNG - CREATURE:NIGHT_CREATURE_89:HEART - CREATURE:NIGHT_CREATURE_89:LIVER -CREATURE:NIGHT_CREATURE_89:GUT -"CREATURE:NIGHT_CREATURE_89:STOMACH -"CREATURE:NIGHT_CREATURE_89:GIZZARD -#CREATURE:NIGHT_CREATURE_89:PANCREAS -!CREATURE:NIGHT_CREATURE_89:SPLEEN -!CREATURE:NIGHT_CREATURE_89:KIDNEY -!CREATURE:NIGHT_CREATURE_90:MUSCLE -CREATURE:NIGHT_CREATURE_90:EYE - CREATURE:NIGHT_CREATURE_90:BRAIN -CREATURE:NIGHT_CREATURE_90:LUNG - CREATURE:NIGHT_CREATURE_90:HEART - CREATURE:NIGHT_CREATURE_90:LIVER -CREATURE:NIGHT_CREATURE_90:GUT -"CREATURE:NIGHT_CREATURE_90:STOMACH -"CREATURE:NIGHT_CREATURE_90:GIZZARD -#CREATURE:NIGHT_CREATURE_90:PANCREAS -!CREATURE:NIGHT_CREATURE_90:SPLEEN -!CREATURE:NIGHT_CREATURE_90:KIDNEY -!CREATURE:NIGHT_CREATURE_91:MUSCLE -CREATURE:NIGHT_CREATURE_91:EYE - CREATURE:NIGHT_CREATURE_91:BRAIN -CREATURE:NIGHT_CREATURE_91:LUNG - CREATURE:NIGHT_CREATURE_91:HEART - CREATURE:NIGHT_CREATURE_91:LIVER -CREATURE:NIGHT_CREATURE_91:GUT -"CREATURE:NIGHT_CREATURE_91:STOMACH -"CREATURE:NIGHT_CREATURE_91:GIZZARD -#CREATURE:NIGHT_CREATURE_91:PANCREAS -!CREATURE:NIGHT_CREATURE_91:SPLEEN -!CREATURE:NIGHT_CREATURE_91:KIDNEY -!CREATURE:NIGHT_CREATURE_92:MUSCLE -CREATURE:NIGHT_CREATURE_92:EYE - CREATURE:NIGHT_CREATURE_92:BRAIN -CREATURE:NIGHT_CREATURE_92:LUNG - CREATURE:NIGHT_CREATURE_92:HEART - CREATURE:NIGHT_CREATURE_92:LIVER -CREATURE:NIGHT_CREATURE_92:GUT -"CREATURE:NIGHT_CREATURE_92:STOMACH -"CREATURE:NIGHT_CREATURE_92:GIZZARD -#CREATURE:NIGHT_CREATURE_92:PANCREAS -!CREATURE:NIGHT_CREATURE_92:SPLEEN -!CREATURE:NIGHT_CREATURE_92:KIDNEY -!CREATURE:NIGHT_CREATURE_93:MUSCLE -CREATURE:NIGHT_CREATURE_93:EYE - CREATURE:NIGHT_CREATURE_93:BRAIN -CREATURE:NIGHT_CREATURE_93:LUNG - CREATURE:NIGHT_CREATURE_93:HEART - CREATURE:NIGHT_CREATURE_93:LIVER -CREATURE:NIGHT_CREATURE_93:GUT -"CREATURE:NIGHT_CREATURE_93:STOMACH -"CREATURE:NIGHT_CREATURE_93:GIZZARD -#CREATURE:NIGHT_CREATURE_93:PANCREAS -!CREATURE:NIGHT_CREATURE_93:SPLEEN -!CREATURE:NIGHT_CREATURE_93:KIDNEY -!CREATURE:NIGHT_CREATURE_94:MUSCLE -CREATURE:NIGHT_CREATURE_94:EYE - CREATURE:NIGHT_CREATURE_94:BRAIN -CREATURE:NIGHT_CREATURE_94:LUNG - CREATURE:NIGHT_CREATURE_94:HEART - CREATURE:NIGHT_CREATURE_94:LIVER -CREATURE:NIGHT_CREATURE_94:GUT -"CREATURE:NIGHT_CREATURE_94:STOMACH -"CREATURE:NIGHT_CREATURE_94:GIZZARD -#CREATURE:NIGHT_CREATURE_94:PANCREAS -!CREATURE:NIGHT_CREATURE_94:SPLEEN -!CREATURE:NIGHT_CREATURE_94:KIDNEY -!CREATURE:NIGHT_CREATURE_95:MUSCLE -CREATURE:NIGHT_CREATURE_95:EYE - CREATURE:NIGHT_CREATURE_95:BRAIN -CREATURE:NIGHT_CREATURE_95:LUNG - CREATURE:NIGHT_CREATURE_95:HEART - CREATURE:NIGHT_CREATURE_95:LIVER -CREATURE:NIGHT_CREATURE_95:GUT -"CREATURE:NIGHT_CREATURE_95:STOMACH -"CREATURE:NIGHT_CREATURE_95:GIZZARD -#CREATURE:NIGHT_CREATURE_95:PANCREAS -!CREATURE:NIGHT_CREATURE_95:SPLEEN -!CREATURE:NIGHT_CREATURE_95:KIDNEY -!CREATURE:NIGHT_CREATURE_96:MUSCLE -CREATURE:NIGHT_CREATURE_96:EYE - CREATURE:NIGHT_CREATURE_96:BRAIN -CREATURE:NIGHT_CREATURE_96:LUNG - CREATURE:NIGHT_CREATURE_96:HEART - CREATURE:NIGHT_CREATURE_96:LIVER -CREATURE:NIGHT_CREATURE_96:GUT -"CREATURE:NIGHT_CREATURE_96:STOMACH -"CREATURE:NIGHT_CREATURE_96:GIZZARD -#CREATURE:NIGHT_CREATURE_96:PANCREAS -!CREATURE:NIGHT_CREATURE_96:SPLEEN -!CREATURE:NIGHT_CREATURE_96:KIDNEY -!CREATURE:NIGHT_CREATURE_97:MUSCLE -CREATURE:NIGHT_CREATURE_97:EYE - CREATURE:NIGHT_CREATURE_97:BRAIN -CREATURE:NIGHT_CREATURE_97:LUNG - CREATURE:NIGHT_CREATURE_97:HEART - CREATURE:NIGHT_CREATURE_97:LIVER -CREATURE:NIGHT_CREATURE_97:GUT -"CREATURE:NIGHT_CREATURE_97:STOMACH -"CREATURE:NIGHT_CREATURE_97:GIZZARD -#CREATURE:NIGHT_CREATURE_97:PANCREAS -!CREATURE:NIGHT_CREATURE_97:SPLEEN -!CREATURE:NIGHT_CREATURE_97:KIDNEY -!CREATURE:NIGHT_CREATURE_98:MUSCLE -CREATURE:NIGHT_CREATURE_98:EYE - CREATURE:NIGHT_CREATURE_98:BRAIN -CREATURE:NIGHT_CREATURE_98:LUNG - CREATURE:NIGHT_CREATURE_98:HEART - CREATURE:NIGHT_CREATURE_98:LIVER -CREATURE:NIGHT_CREATURE_98:GUT -"CREATURE:NIGHT_CREATURE_98:STOMACH -"CREATURE:NIGHT_CREATURE_98:GIZZARD -#CREATURE:NIGHT_CREATURE_98:PANCREAS -!CREATURE:NIGHT_CREATURE_98:SPLEEN -!CREATURE:NIGHT_CREATURE_98:KIDNEY -!CREATURE:NIGHT_CREATURE_99:MUSCLE -CREATURE:NIGHT_CREATURE_99:EYE - CREATURE:NIGHT_CREATURE_99:BRAIN -CREATURE:NIGHT_CREATURE_99:LUNG - CREATURE:NIGHT_CREATURE_99:HEART - CREATURE:NIGHT_CREATURE_99:LIVER -CREATURE:NIGHT_CREATURE_99:GUT -"CREATURE:NIGHT_CREATURE_99:STOMACH -"CREATURE:NIGHT_CREATURE_99:GIZZARD -#CREATURE:NIGHT_CREATURE_99:PANCREAS -!CREATURE:NIGHT_CREATURE_99:SPLEEN -!CREATURE:NIGHT_CREATURE_99:KIDNEY -"CREATURE:NIGHT_CREATURE_100:MUSCLE -CREATURE:NIGHT_CREATURE_100:EYE -!CREATURE:NIGHT_CREATURE_100:BRAIN - CREATURE:NIGHT_CREATURE_100:LUNG -!CREATURE:NIGHT_CREATURE_100:HEART -!CREATURE:NIGHT_CREATURE_100:LIVER -CREATURE:NIGHT_CREATURE_100:GUT -#CREATURE:NIGHT_CREATURE_100:STOMACH -#CREATURE:NIGHT_CREATURE_100:GIZZARD -$CREATURE:NIGHT_CREATURE_100:PANCREAS -"CREATURE:NIGHT_CREATURE_100:SPLEEN -"CREATURE:NIGHT_CREATURE_100:KIDNEY -"CREATURE:NIGHT_CREATURE_101:MUSCLE -CREATURE:NIGHT_CREATURE_101:EYE -!CREATURE:NIGHT_CREATURE_101:BRAIN - CREATURE:NIGHT_CREATURE_101:LUNG -!CREATURE:NIGHT_CREATURE_101:HEART -!CREATURE:NIGHT_CREATURE_101:LIVER -CREATURE:NIGHT_CREATURE_101:GUT -#CREATURE:NIGHT_CREATURE_101:STOMACH -#CREATURE:NIGHT_CREATURE_101:GIZZARD -$CREATURE:NIGHT_CREATURE_101:PANCREAS -"CREATURE:NIGHT_CREATURE_101:SPLEEN -"CREATURE:NIGHT_CREATURE_101:KIDNEY -"CREATURE:NIGHT_CREATURE_102:MUSCLE -CREATURE:NIGHT_CREATURE_102:EYE -!CREATURE:NIGHT_CREATURE_102:BRAIN - CREATURE:NIGHT_CREATURE_102:LUNG -!CREATURE:NIGHT_CREATURE_102:HEART -!CREATURE:NIGHT_CREATURE_102:LIVER -CREATURE:NIGHT_CREATURE_102:GUT -#CREATURE:NIGHT_CREATURE_102:STOMACH -#CREATURE:NIGHT_CREATURE_102:GIZZARD -$CREATURE:NIGHT_CREATURE_102:PANCREAS -"CREATURE:NIGHT_CREATURE_102:SPLEEN -"CREATURE:NIGHT_CREATURE_102:KIDNEY -"CREATURE:NIGHT_CREATURE_103:MUSCLE -CREATURE:NIGHT_CREATURE_103:EYE -!CREATURE:NIGHT_CREATURE_103:BRAIN - CREATURE:NIGHT_CREATURE_103:LUNG -!CREATURE:NIGHT_CREATURE_103:HEART -!CREATURE:NIGHT_CREATURE_103:LIVER -CREATURE:NIGHT_CREATURE_103:GUT -#CREATURE:NIGHT_CREATURE_103:STOMACH -#CREATURE:NIGHT_CREATURE_103:GIZZARD -$CREATURE:NIGHT_CREATURE_103:PANCREAS -"CREATURE:NIGHT_CREATURE_103:SPLEEN -"CREATURE:NIGHT_CREATURE_103:KIDNEY -"CREATURE:NIGHT_CREATURE_104:MUSCLE -CREATURE:NIGHT_CREATURE_104:EYE -!CREATURE:NIGHT_CREATURE_104:BRAIN - CREATURE:NIGHT_CREATURE_104:LUNG -!CREATURE:NIGHT_CREATURE_104:HEART -!CREATURE:NIGHT_CREATURE_104:LIVER -CREATURE:NIGHT_CREATURE_104:GUT -#CREATURE:NIGHT_CREATURE_104:STOMACH -#CREATURE:NIGHT_CREATURE_104:GIZZARD -$CREATURE:NIGHT_CREATURE_104:PANCREAS -"CREATURE:NIGHT_CREATURE_104:SPLEEN -"CREATURE:NIGHT_CREATURE_104:KIDNEY -CREATURE:HF1248 DIVINE_1:MUSCLE -CREATURE:HF1248 DIVINE_1:EYE -CREATURE:HF1248 DIVINE_1:BRAIN -CREATURE:HF1248 DIVINE_1:LUNG -CREATURE:HF1248 DIVINE_1:HEART -CREATURE:HF1248 DIVINE_1:LIVER -CREATURE:HF1248 DIVINE_1:GUT - CREATURE:HF1248 DIVINE_1:STOMACH - CREATURE:HF1248 DIVINE_1:GIZZARD -!CREATURE:HF1248 DIVINE_1:PANCREAS -CREATURE:HF1248 DIVINE_1:SPLEEN -CREATURE:HF1248 DIVINE_1:KIDNEY -CREATURE:HF1248 DIVINE_2:MUSCLE -CREATURE:HF1248 DIVINE_2:EYE -CREATURE:HF1248 DIVINE_2:BRAIN -CREATURE:HF1248 DIVINE_2:LUNG -CREATURE:HF1248 DIVINE_2:HEART -CREATURE:HF1248 DIVINE_2:LIVER -CREATURE:HF1248 DIVINE_2:GUT - CREATURE:HF1248 DIVINE_2:STOMACH - CREATURE:HF1248 DIVINE_2:GIZZARD -!CREATURE:HF1248 DIVINE_2:PANCREAS -CREATURE:HF1248 DIVINE_2:SPLEEN -CREATURE:HF1248 DIVINE_2:KIDNEY -CREATURE:HF1248 DIVINE_3:MUSCLE -CREATURE:HF1248 DIVINE_3:EYE -CREATURE:HF1248 DIVINE_3:BRAIN -CREATURE:HF1248 DIVINE_3:LUNG -CREATURE:HF1248 DIVINE_3:HEART -CREATURE:HF1248 DIVINE_3:LIVER -CREATURE:HF1248 DIVINE_3:GUT - CREATURE:HF1248 DIVINE_3:STOMACH - CREATURE:HF1248 DIVINE_3:GIZZARD -!CREATURE:HF1248 DIVINE_3:PANCREAS -CREATURE:HF1248 DIVINE_3:SPLEEN -CREATURE:HF1248 DIVINE_3:KIDNEY -CREATURE:HF1108 DIVINE_2:MUSCLE -CREATURE:HF1108 DIVINE_2:EYE -CREATURE:HF1108 DIVINE_2:BRAIN -CREATURE:HF1108 DIVINE_2:LUNG -CREATURE:HF1108 DIVINE_2:HEART -CREATURE:HF1108 DIVINE_2:LIVER -CREATURE:HF1108 DIVINE_2:GUT - CREATURE:HF1108 DIVINE_2:STOMACH - CREATURE:HF1108 DIVINE_2:GIZZARD -!CREATURE:HF1108 DIVINE_2:PANCREAS -CREATURE:HF1108 DIVINE_2:SPLEEN -CREATURE:HF1108 DIVINE_2:KIDNEY -CREATURE:HF1249 DIVINE_1:MUSCLE -CREATURE:HF1249 DIVINE_1:EYE -CREATURE:HF1249 DIVINE_1:BRAIN -CREATURE:HF1249 DIVINE_1:LUNG -CREATURE:HF1249 DIVINE_1:HEART -CREATURE:HF1249 DIVINE_1:LIVER -CREATURE:HF1249 DIVINE_1:GUT - CREATURE:HF1249 DIVINE_1:STOMACH - CREATURE:HF1249 DIVINE_1:GIZZARD -!CREATURE:HF1249 DIVINE_1:PANCREAS -CREATURE:HF1249 DIVINE_1:SPLEEN -CREATURE:HF1249 DIVINE_1:KIDNEY -CREATURE:HF1249 DIVINE_3:MUSCLE -CREATURE:HF1249 DIVINE_3:EYE -CREATURE:HF1249 DIVINE_3:BRAIN -CREATURE:HF1249 DIVINE_3:LUNG -CREATURE:HF1249 DIVINE_3:HEART -CREATURE:HF1249 DIVINE_3:LIVER -CREATURE:HF1249 DIVINE_3:GUT - CREATURE:HF1249 DIVINE_3:STOMACH - CREATURE:HF1249 DIVINE_3:GIZZARD -!CREATURE:HF1249 DIVINE_3:PANCREAS -CREATURE:HF1249 DIVINE_3:SPLEEN -CREATURE:HF1249 DIVINE_3:KIDNEY -CREATURE:HF1345 DIVINE_3:MUSCLE -CREATURE:HF1345 DIVINE_3:EYE -CREATURE:HF1345 DIVINE_3:BRAIN -CREATURE:HF1345 DIVINE_3:LUNG -CREATURE:HF1345 DIVINE_3:HEART -CREATURE:HF1345 DIVINE_3:LIVER -CREATURE:HF1345 DIVINE_3:GUT - CREATURE:HF1345 DIVINE_3:STOMACH - CREATURE:HF1345 DIVINE_3:GIZZARD -!CREATURE:HF1345 DIVINE_3:PANCREAS -CREATURE:HF1345 DIVINE_3:SPLEEN -CREATURE:HF1345 DIVINE_3:KIDNEYCUTTLEFISH:FEMALECUTTLEFISH:MALENAUTILUS:FEMALE NAUTILUS:MALEMOGHOPPER:FEMALEMOGHOPPER:MALEPOND_TURTLE:FEMALEPOND_TURTLE:MALEMUSSEL:DEFAULTOYSTER:DEFAULTFISH_SALMON:FEMALEFISH_SALMON:MALEFISH_CLOWNFISH:FEMALEFISH_CLOWNFISH:MALEFISH_HAGFISH:FEMALEFISH_HAGFISH:MALEFISH_LAMPREY_BROOK:FEMALEFISH_LAMPREY_BROOK:MALEFISH_RAY_BAT:FEMALEFISH_RAY_BAT:MALEFISH_RAY_THORNBACK:FEMALEFISH_RAY_THORNBACK:MALEFISH_RATFISH_SPOTTED:FEMALEFISH_RATFISH_SPOTTED:MALEFISH_HERRING:FEMALEFISH_HERRING:MALEFISH_SHAD:FEMALEFISH_SHAD:MALEFISH_ANCHOVY:FEMALEFISH_ANCHOVY:MALEFISH_TROUT_STEELHEAD:FEMALEFISH_TROUT_STEELHEAD:MALEFISH_HAKE:FEMALEFISH_HAKE:MALEFISH_SEAHORSE:FEMALEFISH_SEAHORSE:MALEFISH_GLASSEYE:FEMALEFISH_GLASSEYE:MALE FISH_PUFFER_WHITE_SPOTTED:FEMALEFISH_PUFFER_WHITE_SPOTTED:MALEFISH_SOLE:FEMALEFISH_SOLE:MALEFISH_FLOUNDER:FEMALEFISH_FLOUNDER:MALEFISH_MACKEREL:FEMALEFISH_MACKEREL:MALEJELLYFISH_SEA_NETTLE:DEFAULT SQUID:FEMALE -SQUID:MALEFISH_LUNGFISH:FEMALEFISH_LUNGFISH:MALEFISH_LOACH_CLOWN:FEMALEFISH_LOACH_CLOWN:MALEFISH_BULLHEAD_BROWN:FEMALEFISH_BULLHEAD_BROWN:MALEFISH_BULLHEAD_YELLOW:FEMALEFISH_BULLHEAD_YELLOW:MALEFISH_BULLHEAD_BLACK:FEMALEFISH_BULLHEAD_BLACK:MALEFISH_KNIFEFISH_BANDED:FEMALEFISH_KNIFEFISH_BANDED:MALEFISH_CHAR:FEMALEFISH_CHAR:MALEFISH_TROUT_RAINBOW:FEMALEFISH_TROUT_RAINBOW:MALEFISH_MOLLY_SAILFIN:FEMALEFISH_MOLLY_SAILFIN:MALEFISH_GUPPY:FEMALEFISH_GUPPY:MALEFISH_PERCH:FEMALEFISH_PERCH:MALEFISH_CAVE:FEMALEFISH_CAVE:MALELOBSTER_CAVE:FEMALELOBSTER_CAVE:MALEBIRD_BLUEJAY:FEMALEBLUEJAY_MAN:FEMALEGIANT_BLUEJAY:FEMALEBIRD_CARDINAL:FEMALECARDINAL_MAN:FEMALEGIANT_CARDINAL:FEMALEBIRD_GRACKLE:FEMALEGRACKLE_MAN:FEMALEGIANT_GRACKLE:FEMALEBIRD_ORIOLE:FEMALEORIOLE_MAN:FEMALEGIANT_ORIOLE:FEMALEBIRD_RW_BLACKBIRD:FEMALERW_BLACKBIRD_MAN:FEMALEGIANT_RW_BLACKBIRD:FEMALEBIRD_PENGUIN:FEMALEBIRD_PENGUIN_LITTLE:FEMALEBIRD_PENGUIN_EMPEROR:FEMALEPENGUIN MAN:FEMALEBIRD_PENGUIN_GIANT:FEMALEBIRD_FALCON_PEREGRINE:FEMALEPEREGRINE FALCON MAN:FEMALEGIANT PEREGRINE FALCON:FEMALEBIRD_KIWI:FEMALEKIWI MAN:FEMALEBIRD_KIWI_GIANT:FEMALEBIRD_OSTRICH:FEMALEOSTRICH MAN:FEMALEBIRD_OSTRICH_GIANT:FEMALEBIRD_CROW:FEMALECROW_MAN:FEMALEGIANT_CROW:FEMALEBIRD_RAVEN:FEMALERAVEN_MAN:FEMALEGIANT_RAVEN:FEMALEBIRD_CASSOWARY:FEMALECASSOWARY_MAN:FEMALEGIANT_CASSOWARY:FEMALEBIRD_KEA:FEMALEKEA_MAN:FEMALEGIANT_KEA:FEMALEBIRD_OWL_SNOWY:FEMALESNOWY_OWL_MAN:FEMALEGIANT_SNOWY_OWL:FEMALESPARROW:FEMALESPARROW_MAN:FEMALEGIANT_SPARROW:FEMALEBIRD_STORK_WHITE:FEMALEWHITE_STORK_MAN:FEMALEGIANT_WHITE_STORK:FEMALEBIRD_LOON:FEMALELOON_MAN:FEMALEGIANT_LOON:FEMALEBIRD_OWL_BARN:FEMALEBARN_OWL_MAN:FEMALEGIANT_BARN_OWL:FEMALEBIRD_PARAKEET:FEMALEPARAKEET_MAN:FEMALEGIANT_PARAKEET:FEMALEBIRD_KAKAPO:FEMALEKAKAPO_MAN:FEMALEGIANT_KAKAPO:FEMALEBIRD_PARROT_GREY:FEMALEGREY_PARROT_MAN:FEMALEGIANT_GREY_PARROT:FEMALEBIRD_PUFFIN:FEMALEPUFFIN_MAN:FEMALEGIANT_PUFFIN:FEMALEBIRD_SWAN:FEMALESWAN_MAN:FEMALEGIANT_SWAN:FEMALEBIRD_LORIKEET:FEMALELORIKEET_MAN:FEMALEGIANT_LORIKEET:FEMALEBIRD_WREN:FEMALEWREN_MAN:FEMALEGIANT_WREN:FEMALEBIRD_OSPREY:FEMALEOSPREY_MAN:FEMALEGIANT_OSPREY:FEMALEBIRD_EMU:FEMALEEMU_MAN:FEMALEGIANT_EMU:FEMALEBIRD_COCKATIEL:FEMALECOCKATIEL_MAN:FEMALEGIANT_COCKATIEL:FEMALE BIRD_LOVEBIRD_PEACH-FACED:FEMALEPEACH-FACED_LOVEBIRD_MAN:FEMALE!GIANT_PEACH-FACED_LOVEBIRD:FEMALEBIRD_MAGPIE:FEMALEMAGPIE_MAN:FEMALEGIANT_MAGPIE:FEMALEBIRD_KESTREL:FEMALEKESTREL_MAN:FEMALEGIANT_KESTREL:FEMALEBIRD_ALBATROSS:FEMALEALBATROSS_MAN:FEMALEGIANT_ALBATROSS:FEMALEBIRD_OWL_GREAT_HORNED:FEMALEGREAT_HORNED_OWL_MAN:FEMALEGIANT_GREAT_HORNED_OWL:FEMALEBIRD_EAGLE:FEMALEEAGLE_MAN:FEMALEGIANT_EAGLE:FEMALEBIRD_HORNBILL:FEMALEHORNBILL_MAN:FEMALEGIANT_HORNBILL:FEMALEBIRD_LOVEBIRD_MASKED:FEMALEMASKED_LOVEBIRD_MAN:FEMALEGIANT_MASKED_LOVEBIRD:FEMALEBIRD_BUSHTIT:FEMALEBUSHTIT_MAN:FEMALEGIANT_BUSHTIT:FEMALEDESERT TORTOISE:FEMALEDESERT_TORTOISE_MAN:FEMALEGIANT_DESERT_TORTOISE:FEMALEGILA_MONSTER:FEMALEGILA_MONSTER_MAN:FEMALEGIANT_GILA_MONSTER:FEMALEBIRD_CHICKEN:FEMALEBIRD_DUCK:FEMALEBIRD_GOOSE:FEMALEBIRD_GUINEAFOWL:FEMALEBIRD_PEAFOWL_BLUE:FEMALEBIRD_TURKEY:FEMALEPLATYPUS:FEMALEPLATYPUS MAN:FEMALEPLATYPUS, GIANT:FEMALEALLIGATOR:FEMALEALLIGATOR_MAN:FEMALEGIANT_ALLIGATOR:FEMALEBIRD_BUZZARD:FEMALEBUZZARD_MAN:FEMALEGIANT_BUZZARD:FEMALECROCODILE_SALTWATER:FEMALECROCODILE_SALTWATER_MAN:FEMALE GIANT_CROCODILE_SALTWATER:FEMALEBIRD_VULTURE:FEMALEVULTURE_MAN:FEMALEGIANT_VULTURE:FEMALEGIANT TORTOISE:FEMALEGIANT TORTOISE MAN:FEMALEGIGANTIC TORTOISE:FEMALECRUNDLE:FEMALEELK_BIRD:FEMALEHELMET_SNAKE:FEMALEJABBERER:FEMALECAVE_DRAGON:FEMALELIZARD_RHINO_TWO_LEGGED:FEMALE SKINK:FEMALESKINK_MAN:FEMALEGIANT_SKINK:FEMALECHAMELEON:FEMALECHAMELEON_MAN:FEMALEGIANT_CHAMELEON:FEMALE ANOLE:FEMALEANOLE_MAN:FEMALEGIANT_ANOLE:FEMALE IGUANA:FEMALEIGUANA_MAN:FEMALEGIANT_IGUANA:FEMALESNAPPING TURTLE:FEMALE ALLIGATOR SNAPPING TURTLE:FEMALESNAPPING_TURTLE_MAN:FEMALEGIANT_SNAPPING_TURTLE:FEMALEPOND_TURTLE:FEMALEPOND_TURTLE_MAN:FEMALEGIANT_POND_TURTLE:FEMALE KOBOLD:FEMALE DRAGON:FEMALEBEAK_DOG:FEMALESEA_SERPENT:FEMALEBIRD_ROC:FEMALECROCODILE_CAVE:FEMALEBIRD_SWALLOW_CAVE:FEMALECAVE_SWALLOW_MAN:FEMALEBIRD_SWALLOW_CAVE_GIANT:FEMALEREPTILE_MAN:FEMALESERPENT_MAN:FEMALE ADDER:FEMALEADDER_MAN:FEMALEGIANT_ADDER:FEMALEECHIDNA:FEMALEECHIDNA_MAN:FEMALEGIANT_ECHIDNA:FEMALEKINGSNAKE:FEMALEKINGSNAKE_MAN:FEMALEGIANT_KINGSNAKE:FEMALEMONITOR_LIZARD:FEMALEMONITOR_LIZARD_MAN:FEMALEGIANT_MONITOR_LIZARD:FEMALEKING_COBRA:FEMALEKING_COBRA_MAN:FEMALEGIANT_KING_COBRA:FEMALEBLACK_MAMBA:FEMALEBLACK_MAMBA_MAN:FEMALEGIANT_BLACK_MAMBA:FEMALEBUSHMASTER:FEMALEBUSHMASTER_MAN:FEMALEGIANT_BUSHMASTER:FEMALE PYTHON:FEMALEPYTHON_MAN:FEMALEGIANT_PYTHON:FEMALENAGA:FEMALE_TWONAGA:FEMALE_FOURNAGA:FEMALE_SIX"#PLANT:SINGLE-GRAIN_WHEAT:STRUCTURAL" PLANT:TWO-GRAIN_WHEAT:STRUCTURAL"PLANT:SOFT_WHEAT:STRUCTURAL"PLANT:HARD_WHEAT:STRUCTURAL"PLANT:SPELT:STRUCTURAL"PLANT:BARLEY:STRUCTURAL"PLANT:BUCKWHEAT:STRUCTURAL"PLANT:OATS:STRUCTURAL"PLANT:ALFALFA:STRUCTURAL"PLANT:RYE:STRUCTURAL"PLANT:SORGHUM:STRUCTURAL"PLANT:RICE:STRUCTURAL"PLANT:MAIZE:STRUCTURAL"PLANT:QUINOA:STRUCTURAL"PLANT:KANIWA:STRUCTURAL"PLANT:BITTER_VETCH:STRUCTURAL"!PLANT:PENDANT_AMARANTH:STRUCTURAL"PLANT:BLOOD_AMARANTH:STRUCTURAL" PLANT:PURPLE_AMARANTH:STRUCTURAL"PLANT:RED_SPINACH:STRUCTURAL"'PLANT:ELEPHANT-HEAD_AMARANTH:STRUCTURAL"PLANT:PEARL_MILLET:STRUCTURAL"PLANT:WHITE_MILLET:STRUCTURAL"PLANT:FINGER_MILLET:STRUCTURAL"PLANT:FOXTAIL_MILLET:STRUCTURAL"PLANT:FONIO:STRUCTURAL"PLANT:TEFF:STRUCTURAL"PLANT:FLAX:STRUCTURAL"PLANT:JUTE:STRUCTURAL"PLANT:HEMP:STRUCTURAL"PLANT:COTTON:STRUCTURAL"PLANT:RAMIE:STRUCTURAL"PLANT:KENAF:STRUCTURAL"PLANT:PAPYRUS_SEDGE:STRUCTURAL"PLANT:ARTICHOKE:STRUCTURAL"PLANT:ASPARAGUS:STRUCTURAL""PLANT:BAMBARA_GROUNDNUT:STRUCTURAL"PLANT:STRING_BEAN:STRUCTURAL"PLANT:BROAD_BEAN:STRUCTURAL"PLANT:BEET:STRUCTURAL"PLANT:BITTER_MELON:STRUCTURAL"PLANT:CABBAGE:STRUCTURAL"PLANT:CAPER:STRUCTURAL"PLANT:WILD_CARROT:STRUCTURAL"PLANT:CASSAVA:STRUCTURAL"PLANT:CELERY:STRUCTURAL"PLANT:CHICKPEA:STRUCTURAL"PLANT:CHICORY:STRUCTURAL"PLANT:COWPEA:STRUCTURAL"PLANT:CUCUMBER:STRUCTURAL"PLANT:EGGPLANT:STRUCTURAL"PLANT:GARDEN_CRESS:STRUCTURAL"PLANT:GARLIC:STRUCTURAL"PLANT:HORNED_MELON:STRUCTURAL"PLANT:LEEK:STRUCTURAL"PLANT:LENTIL:STRUCTURAL"PLANT:LETTUCE:STRUCTURAL"PLANT:MUNG_BEAN:STRUCTURAL"PLANT:MUSKMELON:STRUCTURAL"PLANT:ONION:STRUCTURAL"PLANT:PARSNIP:STRUCTURAL"PLANT:PEA:STRUCTURAL"PLANT:PEANUT:STRUCTURAL"PLANT:PEPPER:STRUCTURAL"PLANT:POTATO:STRUCTURAL"PLANT:RADISH:STRUCTURAL"PLANT:RED_BEAN:STRUCTURAL"PLANT:RHUBARB:STRUCTURAL"PLANT:SOYBEAN:STRUCTURAL"PLANT:SPINACH:STRUCTURAL"PLANT:SQUASH:STRUCTURAL"PLANT:SWEET_POTATO:STRUCTURAL"PLANT:TARO:STRUCTURAL"PLANT:TOMATO:STRUCTURAL"PLANT:TOMATILLO:STRUCTURAL"PLANT:TURNIP:STRUCTURAL"PLANT:URAD_BEAN:STRUCTURAL"PLANT:WATERMELON:STRUCTURAL"PLANT:WINTER_MELON:STRUCTURAL"PLANT:LESSER_YAM:STRUCTURAL"PLANT:LONG_YAM:STRUCTURAL"PLANT:PURPLE_YAM:STRUCTURAL"PLANT:WHITE_YAM:STRUCTURAL"PLANT:PASSION_FRUIT:STRUCTURAL"PLANT:GRAPE:STRUCTURAL"PLANT:CRANBERRY:STRUCTURAL"PLANT:BILBERRY:STRUCTURAL"PLANT:BLUEBERRY:STRUCTURAL"PLANT:BLACKBERRY:STRUCTURAL"PLANT:RASPBERRY:STRUCTURAL"PLANT:PINEAPPLE:STRUCTURAL"PLANT:MEADOW-GRASS:STRUCTURAL"PLANT:HAIR GRASS:STRUCTURAL"PLANT:BENTGRASS:STRUCTURAL"PLANT:RYEGRASS:STRUCTURAL"PLANT:FESCUE GRASS:STRUCTURAL"PLANT:REEDGRASS:STRUCTURAL"PLANT:KNOTGRASS:STRUCTURAL"PLANT:ZOYSIA:STRUCTURAL""PLANT:DOG'S TOOTH GRASS:STRUCTURAL"PLANT:DALLISGRASS:STRUCTURAL"PLANT:CARPETGRASS:STRUCTURAL"PLANT:SATINTAIL:STRUCTURAL"PLANT:GRAMA:STRUCTURAL"PLANT:DROPSEED GRASS:STRUCTURAL"PLANT:NEEDLE GRASS:STRUCTURAL"$PLANT:BABY TOES SUCCULENT:STRUCTURAL"PLANT:PEBBLE PLANTS:STRUCTURAL"PLANT:BLUE SEDGE:STRUCTURAL"PLANT:FIELD SEDGE:STRUCTURAL""PLANT:PURPLE MOOR GRASS:STRUCTURAL"PLANT:VELVET GRASS:STRUCTURAL"PLANT:MEADOWSWEET:STRUCTURAL"PLANT:RUSH:STRUCTURAL"PLANT:MARSH THISTLE:STRUCTURAL"PLANT:COMMON REED:STRUCTURAL"PLANT:CATTAIL:STRUCTURAL"PLANT:SAWGRASS:STRUCTURAL"PLANT:COTTONGRASS:STRUCTURAL"'PLANT:WHITE MOUNTAIN HEATHER:STRUCTURAL"PLANT:MOUNTAIN AVENS:STRUCTURAL"PLANT:CLOUDBERRY:STRUCTURAL"PLANT:WORMY TENDRILS:STRUCTURAL"PLANT:EYEBALL:STRUCTURAL"PLANT:BUBBLE BULBS:STRUCTURAL"PLANT:DOWNY GRASS:STRUCTURAL"PLANT:CAVE MOSS:STRUCTURAL"PLANT:FLOOR FUNGI:STRUCTURAL"PLANT:UNDERLICHEN:STRUCTURAL"PLANT:BAMBOO, ARROW:STRUCTURAL"PLANT:BAMBOO, GOLDEN:STRUCTURAL"PLANT:BAMBOO, HEDGE:STRUCTURAL"PLANT:ABACA:STRUCTURAL"PLANT:BANANA:STRUCTURAL"PLANT:CARAMBOLA:STRUCTURAL"PLANT:CASHEW:STRUCTURAL"PLANT:COFFEE:STRUCTURAL"PLANT:DURIAN:STRUCTURAL"PLANT:GUAVA:STRUCTURAL"PLANT:PAPAYA:STRUCTURAL"PLANT:PARADISE_NUT:STRUCTURAL"PLANT:RAMBUTAN:STRUCTURAL"PLANT:TEA:STRUCTURAL"PLANT:AVOCADO:STRUCTURAL"PLANT:LIME:STRUCTURAL"PLANT:POMELO:STRUCTURAL"PLANT:CITRON:STRUCTURAL"PLANT:ORANGE:STRUCTURAL"PLANT:BITTER_ORANGE:STRUCTURAL"PLANT:FINGER_LIME:STRUCTURAL"PLANT:ROUND_LIME:STRUCTURAL"PLANT:DESERT_LIME:STRUCTURAL"PLANT:KUMQUAT:STRUCTURAL"PLANT:CUSTARD-APPLE:STRUCTURAL"PLANT:DATE_PALM:STRUCTURAL"PLANT:LYCHEE:STRUCTURAL"PLANT:MACADAMIA:STRUCTURAL"PLANT:OLIVE:STRUCTURAL"PLANT:POMEGRANATE:STRUCTURAL"PLANT:ALMOND:STRUCTURAL"PLANT:APPLE:STRUCTURAL"PLANT:APRICOT:STRUCTURAL"PLANT:BAYBERRY:STRUCTURAL"PLANT:CHERRY:STRUCTURAL"PLANT:GINKGO:STRUCTURAL"PLANT:HAZEL:STRUCTURAL"PLANT:PEACH:STRUCTURAL"PLANT:PEAR:STRUCTURAL"PLANT:PECAN:STRUCTURAL"PLANT:PERSIMMON:STRUCTURAL"PLANT:PLUM:STRUCTURAL"PLANT:SAND_PEAR:STRUCTURAL"PLANT:WALNUT:STRUCTURAL"&PLANT:MUSHROOM_HELMET_PLUMP:STRUCTURAL"PLANT:GRASS_TAIL_PIG:STRUCTURAL"!PLANT:GRASS_WHEAT_CAVE:STRUCTURAL"PLANT:POD_SWEET:STRUCTURAL"PLANT:BUSH_QUARRY:STRUCTURAL"PLANT:ROOT_MUCK:STRUCTURAL"PLANT:TUBER_BLOATED:STRUCTURAL"PLANT:BULB_KOBOLD:STRUCTURAL" PLANT:BERRIES_PRICKLE:STRUCTURAL"PLANT:BERRIES_STRAW:STRUCTURAL"PLANT:GRASS_LONGLAND:STRUCTURAL"PLANT:HERB_VALLEY:STRUCTURAL"PLANT:WEED_RAT:STRUCTURAL"PLANT:BERRIES_FISHER:STRUCTURAL"PLANT:REED_ROPE:STRUCTURAL"$PLANT:MUSHROOM_CUP_DIMPLE:STRUCTURAL"PLANT:WEED_BLADE:STRUCTURAL"PLANT:ROOT_HIDE:STRUCTURAL"PLANT:SLIVER_BARB:STRUCTURAL"PLANT:BERRY_SUN:STRUCTURAL"PLANT:VINE_WHIP:STRUCTURAL"PLANT:MANGROVE:STRUCTURAL"PLANT:SAGUARO:STRUCTURAL"PLANT:PINE:STRUCTURAL"PLANT:CEDAR:STRUCTURAL"PLANT:OAK:STRUCTURAL"PLANT:MAHOGANY:STRUCTURAL"PLANT:ACACIA:STRUCTURAL"PLANT:KAPOK:STRUCTURAL"PLANT:MAPLE:STRUCTURAL"PLANT:WILLOW:STRUCTURAL"PLANT:TOWER_CAP:STRUCTURAL"PLANT:BLACK_CAP:STRUCTURAL"PLANT:NETHER_CAP:STRUCTURAL"PLANT:GOBLIN_CAP:STRUCTURAL"PLANT:FUNGIWOOD:STRUCTURAL"PLANT:TUNNEL_TUBE:STRUCTURAL"PLANT:SPORE_TREE:STRUCTURAL"PLANT:BLOOD_THORN:STRUCTURAL"PLANT:GLUMPRONG:STRUCTURAL"PLANT:FEATHER:STRUCTURAL"PLANT:HIGHWOOD:STRUCTURAL"PLANT:LARCH:STRUCTURAL"PLANT:CHESTNUT:STRUCTURAL"PLANT:ALDER:STRUCTURAL"PLANT:BIRCH:STRUCTURAL"PLANT:ASH:STRUCTURAL"PLANT:CANDLENUT:STRUCTURAL"PLANT:MANGO:STRUCTURAL"PLANT:RUBBER:STRUCTURAL"PLANT:CACAO:STRUCTURAL"PLANT:PALM:STRUCTURAL*PLANT:SINGLE-GRAIN_WHEAT:DRINK*PLANT:TWO-GRAIN_WHEAT:DRINK*PLANT:SOFT_WHEAT:DRINK*PLANT:HARD_WHEAT:DRINK*PLANT:SPELT:DRINK*PLANT:BARLEY:DRINK*PLANT:BUCKWHEAT:DRINK*PLANT:RYE:DRINK*PLANT:SORGHUM:DRINK*PLANT:RICE:DRINK*PLANT:MAIZE:DRINK*PLANT:QUINOA:DRINK*PLANT:KANIWA:DRINK*PLANT:PENDANT_AMARANTH:DRINK*PLANT:BLOOD_AMARANTH:DRINK*PLANT:PURPLE_AMARANTH:DRINK*PLANT:PEARL_MILLET:DRINK*PLANT:WHITE_MILLET:DRINK*PLANT:FINGER_MILLET:DRINK*PLANT:FOXTAIL_MILLET:DRINK*PLANT:FONIO:DRINK*PLANT:TEFF:DRINK*PLANT:ARTICHOKE:DRINK*PLANT:BEET:DRINK*PLANT:WILD_CARROT:DRINK*PLANT:CASSAVA:DRINK*PLANT:PARSNIP:DRINK*PLANT:POTATO:DRINK*PLANT:RADISH:DRINK*PLANT:SWEET_POTATO:DRINK*PLANT:TOMATO:DRINK*PLANT:TOMATILLO:DRINK*PLANT:TURNIP:DRINK*PLANT:PASSION_FRUIT:DRINK*PLANT:GRAPE:DRINK*PLANT:CRANBERRY:DRINK*PLANT:BILBERRY:DRINK*PLANT:BLUEBERRY:DRINK*PLANT:BLACKBERRY:DRINK*PLANT:RASPBERRY:DRINK*PLANT:PINEAPPLE:DRINK*PLANT:BANANA:DRINK*PLANT:CARAMBOLA:DRINK*PLANT:DURIAN:DRINK*PLANT:GUAVA:DRINK*PLANT:PAPAYA:DRINK*PLANT:RAMBUTAN:DRINK*PLANT:CUSTARD-APPLE:DRINK*PLANT:DATE_PALM:DRINK*PLANT:LYCHEE:DRINK*PLANT:POMEGRANATE:DRINK*PLANT:APPLE:DRINK*PLANT:APRICOT:DRINK*PLANT:BAYBERRY:DRINK*PLANT:CHERRY:DRINK*PLANT:PEACH:DRINK*PLANT:PEAR:DRINK*PLANT:PERSIMMON:DRINK*PLANT:PLUM:DRINK*PLANT:SAND_PEAR:DRINK*!PLANT:MUSHROOM_HELMET_PLUMP:DRINK*PLANT:GRASS_TAIL_PIG:DRINK*PLANT:GRASS_WHEAT_CAVE:DRINK*PLANT:POD_SWEET:DRINK*PLANT:ROOT_MUCK:DRINK*PLANT:TUBER_BLOATED:DRINK*PLANT:BERRIES_PRICKLE:DRINK*PLANT:BERRIES_STRAW:DRINK*PLANT:GRASS_LONGLAND:DRINK*PLANT:WEED_RAT:DRINK*PLANT:BERRIES_FISHER:DRINK*PLANT:REED_ROPE:DRINK*PLANT:SLIVER_BARB:DRINK*PLANT:BERRY_SUN:DRINK*PLANT:VINE_WHIP:DRINK*PLANT:MANGO:DRINK2CREATURE:HONEY_BEE:MEAD2CREATURE:BUMBLEBEE:MEADBCREATURE:DONKEY:CHEESEBCREATURE:HORSE:CHEESEBCREATURE:COW:CHEESEBCREATURE:SHEEP:CHEESEBCREATURE:PIG:CHEESEBCREATURE:GOAT:CHEESEBCREATURE:WATER_BUFFALO:CHEESEBCREATURE:REINDEER:CHEESEBCREATURE:YAK:CHEESEBCREATURE:LLAMA:CHEESEBCREATURE:ALPACA:CHEESEBCREATURE:CAMEL_1_HUMP:CHEESEB CREATURE:CAMEL_1_HUMP_MAN:CHEESEB"CREATURE:GIANT_CAMEL_1_HUMP:CHEESEBCREATURE:CAMEL_2_HUMP:CHEESEB CREATURE:CAMEL_2_HUMP_MAN:CHEESEB"CREATURE:GIANT_CAMEL_2_HUMP:CHEESEBCREATURE:MAGGOT_PURRING:CHEESEBCREATURE:KANGAROO:CHEESEBCREATURE:KANGAROO_MAN:CHEESEBCREATURE:GIANT_KANGAROO:CHEESEBCREATURE:TAPIR:CHEESEBCREATURE:TAPIR_MAN:CHEESEBCREATURE:GIANT_TAPIR:CHEESEJPLANT:SINGLE-GRAIN_WHEAT:SEEDJPLANT:TWO-GRAIN_WHEAT:SEEDJPLANT:SOFT_WHEAT:SEEDJPLANT:HARD_WHEAT:SEEDJPLANT:SPELT:SEEDJPLANT:BARLEY:SEEDJPLANT:BUCKWHEAT:SEEDJPLANT:OATS:SEEDJPLANT:ALFALFA:SEEDJPLANT:RYE:SEEDJPLANT:SORGHUM:SEEDJPLANT:RICE:SEEDJPLANT:MAIZE:SEEDJPLANT:QUINOA:SEEDJPLANT:KANIWA:SEEDJPLANT:BITTER_VETCH:SEEDJPLANT:PENDANT_AMARANTH:SEEDJPLANT:BLOOD_AMARANTH:SEEDJPLANT:PURPLE_AMARANTH:SEEDJPLANT:RED_SPINACH:SEEDJ!PLANT:ELEPHANT-HEAD_AMARANTH:SEEDJPLANT:PEARL_MILLET:SEEDJPLANT:WHITE_MILLET:SEEDJPLANT:FINGER_MILLET:SEEDJPLANT:FOXTAIL_MILLET:SEEDJPLANT:FONIO:SEEDJPLANT:TEFF:SEEDJPLANT:FLAX:SEEDJPLANT:JUTE:SEEDJPLANT:HEMP:SEEDJPLANT:COTTON:SEEDJPLANT:RAMIE:SEEDJPLANT:KENAF:SEEDJPLANT:PAPYRUS_SEDGE:SEEDJPLANT:ARTICHOKE:SEEDJPLANT:ASPARAGUS:SEEDJPLANT:BAMBARA_GROUNDNUT:SEEDJPLANT:STRING_BEAN:SEEDJPLANT:BROAD_BEAN:SEEDJPLANT:BEET:SEEDJPLANT:BITTER_MELON:SEEDJPLANT:CABBAGE:SEEDJPLANT:CAPER:SEEDJPLANT:WILD_CARROT:SEEDJPLANT:CASSAVA:SEEDJPLANT:CELERY:SEEDJPLANT:CHICKPEA:SEEDJPLANT:CHICORY:SEEDJPLANT:COWPEA:SEEDJPLANT:CUCUMBER:SEEDJPLANT:EGGPLANT:SEEDJPLANT:GARDEN_CRESS:SEEDJPLANT:GARLIC:SEEDJPLANT:HORNED_MELON:SEEDJPLANT:LEEK:SEEDJPLANT:LENTIL:SEEDJPLANT:LETTUCE:SEEDJPLANT:MUNG_BEAN:SEEDJPLANT:MUSKMELON:SEEDJPLANT:ONION:SEEDJPLANT:PARSNIP:SEEDJPLANT:PEA:SEEDJPLANT:PEANUT:SEEDJPLANT:PEPPER:SEEDJPLANT:POTATO:SEEDJPLANT:RADISH:SEEDJPLANT:RED_BEAN:SEEDJPLANT:RHUBARB:SEEDJPLANT:SOYBEAN:SEEDJPLANT:SPINACH:SEEDJPLANT:SQUASH:SEEDJPLANT:SWEET_POTATO:SEEDJPLANT:TARO:SEEDJPLANT:TOMATO:SEEDJPLANT:TOMATILLO:SEEDJPLANT:TURNIP:SEEDJPLANT:URAD_BEAN:SEEDJPLANT:WATERMELON:SEEDJPLANT:WINTER_MELON:SEEDJPLANT:LESSER_YAM:SEEDJPLANT:LONG_YAM:SEEDJPLANT:PURPLE_YAM:SEEDJPLANT:WHITE_YAM:SEEDJPLANT:PASSION_FRUIT:SEEDJPLANT:GRAPE:SEEDJPLANT:CRANBERRY:SEEDJPLANT:BILBERRY:SEEDJPLANT:BLUEBERRY:SEEDJPLANT:BLACKBERRY:SEEDJPLANT:RASPBERRY:SEEDJPLANT:PINEAPPLE:SEEDJPLANT:ABACA:SEEDJPLANT:BANANA:SEEDJPLANT:CARAMBOLA:SEEDJPLANT:CASHEW:SEEDJPLANT:COFFEE:SEEDJPLANT:DURIAN:SEEDJPLANT:GUAVA:SEEDJPLANT:PAPAYA:SEEDJPLANT:PARADISE_NUT:SEEDJPLANT:RAMBUTAN:SEEDJPLANT:TEA:SEEDJPLANT:AVOCADO:SEEDJPLANT:LIME:SEEDJPLANT:POMELO:SEEDJPLANT:CITRON:SEEDJPLANT:ORANGE:SEEDJPLANT:BITTER_ORANGE:SEEDJPLANT:FINGER_LIME:SEEDJPLANT:ROUND_LIME:SEEDJPLANT:DESERT_LIME:SEEDJPLANT:KUMQUAT:SEEDJPLANT:CUSTARD-APPLE:SEEDJPLANT:DATE_PALM:SEEDJPLANT:LYCHEE:SEEDJPLANT:MACADAMIA:SEEDJPLANT:OLIVE:SEEDJPLANT:POMEGRANATE:SEEDJPLANT:ALMOND:SEEDJPLANT:APPLE:SEEDJPLANT:APRICOT:SEEDJPLANT:BAYBERRY:SEEDJPLANT:CHERRY:SEEDJPLANT:GINKGO:SEEDJPLANT:HAZEL:SEEDJPLANT:PEACH:SEEDJPLANT:PEAR:SEEDJPLANT:PECAN:SEEDJPLANT:PERSIMMON:SEEDJPLANT:PLUM:SEEDJPLANT:SAND_PEAR:SEEDJPLANT:WALNUT:SEEDJ PLANT:MUSHROOM_HELMET_PLUMP:SEEDJPLANT:GRASS_TAIL_PIG:SEEDJPLANT:GRASS_WHEAT_CAVE:SEEDJPLANT:POD_SWEET:SEEDJPLANT:BUSH_QUARRY:SEEDJPLANT:ROOT_MUCK:SEEDJPLANT:TUBER_BLOATED:SEEDJPLANT:BERRIES_PRICKLE:SEEDJPLANT:BERRIES_STRAW:SEEDJPLANT:GRASS_LONGLAND:SEEDJPLANT:WEED_RAT:SEEDJPLANT:BERRIES_FISHER:SEEDJPLANT:REED_ROPE:SEEDJPLANT:MUSHROOM_CUP_DIMPLE:SEEDJPLANT:WEED_BLADE:SEEDJPLANT:ROOT_HIDE:SEEDJPLANT:SLIVER_BARB:SEEDJPLANT:BERRY_SUN:SEEDJPLANT:VINE_WHIP:SEEDJPLANT:OAK:SEEDJPLANT:ACACIA:SEEDJPLANT:CHESTNUT:SEEDJPLANT:CANDLENUT:SEEDJPLANT:MANGO:SEEDJPLANT:CACAO:SEEDRPLANT:BITTER_VETCH:LEAFRPLANT:BLOOD_AMARANTH:LEAFRPLANT:PURPLE_AMARANTH:LEAFRPLANT:RED_SPINACH:LEAFR!PLANT:ELEPHANT-HEAD_AMARANTH:LEAFRPLANT:ARTICHOKE:HEARTRPLANT:BITTER_MELON:LEAFRPLANT:BITTER_MELON:FRUITRPLANT:CAPER:LEAFRPLANT:CAPER:BUDRPLANT:CAPER:FRUITRPLANT:CUCUMBER:FRUITRPLANT:EGGPLANT:FRUITRPLANT:GARDEN_CRESS:LEAFRPLANT:GARLIC:BULBRPLANT:HORNED_MELON:FRUITRPLANT:LETTUCE:LEAFRPLANT:MUSKMELON:FRUITRPLANT:ONION:BULBRPLANT:PEPPER:FRUITRPLANT:SPINACH:LEAFRPLANT:SQUASH:FRUITRPLANT:TOMATO:FRUITRPLANT:TOMATILLO:FRUITRPLANT:WATERMELON:FRUITRPLANT:WINTER_MELON:FRUITRPLANT:PASSION_FRUIT:FRUITRPLANT:GRAPE:FRUITRPLANT:CRANBERRY:FRUITRPLANT:BILBERRY:FRUITRPLANT:BLUEBERRY:FRUITRPLANT:BLACKBERRY:FRUITRPLANT:RASPBERRY:FRUITRPLANT:PINEAPPLE:FRUITRPLANT:BANANA:FRUITRPLANT:CARAMBOLA:FRUITRPLANT:CASHEW:FRUITRPLANT:COFFEE:FRUITRPLANT:DURIAN:FRUITRPLANT:GUAVA:FRUITRPLANT:PAPAYA:FRUITRPLANT:PARADISE_NUT:FRUITRPLANT:RAMBUTAN:FRUITRPLANT:AVOCADO:FRUITRPLANT:LIME:FRUITRPLANT:POMELO:FRUITRPLANT:CITRON:FRUITRPLANT:ORANGE:FRUITRPLANT:BITTER_ORANGE:FRUITRPLANT:FINGER_LIME:FRUITRPLANT:ROUND_LIME:FRUITRPLANT:DESERT_LIME:FRUITRPLANT:KUMQUAT:FRUITRPLANT:CUSTARD-APPLE:FRUITRPLANT:DATE_PALM:FLOWERRPLANT:DATE_PALM:FRUITRPLANT:LYCHEE:FRUITRPLANT:OLIVE:FRUITRPLANT:POMEGRANATE:FRUITRPLANT:APPLE:FRUITRPLANT:APRICOT:FRUITRPLANT:BAYBERRY:FRUITRPLANT:CHERRY:FRUITRPLANT:PEACH:FRUITRPLANT:PEAR:FRUITRPLANT:PERSIMMON:FRUITRPLANT:PLUM:FRUITRPLANT:SAND_PEAR:FRUITRPLANT:BUSH_QUARRY:LEAFRPLANT:BERRIES_STRAW:FRUITRPLANT:SAGUARO:FRUITRPLANT:FEATHER:EGGRPLANT:MANGO:FRUITRPLANT:PALM:NUTZPLANT:SINGLE-GRAIN_WHEAT:MILLZPLANT:TWO-GRAIN_WHEAT:MILLZPLANT:SOFT_WHEAT:MILLZPLANT:HARD_WHEAT:MILLZPLANT:SPELT:MILLZPLANT:BARLEY:MILLZPLANT:BUCKWHEAT:MILLZPLANT:OATS:MILLZPLANT:RYE:MILLZPLANT:SORGHUM:MILLZPLANT:RICE:MILLZPLANT:MAIZE:MILLZPLANT:QUINOA:MILLZPLANT:KANIWA:MILLZPLANT:PENDANT_AMARANTH:MILLZPLANT:BLOOD_AMARANTH:MILLZPLANT:PURPLE_AMARANTH:MILLZPLANT:PEARL_MILLET:MILLZPLANT:WHITE_MILLET:MILLZPLANT:FINGER_MILLET:MILLZPLANT:FOXTAIL_MILLET:MILLZPLANT:FONIO:MILLZPLANT:TEFF:MILLZPLANT:FLAX:MILLZPLANT:HEMP:MILLZPLANT:GRASS_WHEAT_CAVE:MILLZPLANT:POD_SWEET:MILLZPLANT:GRASS_LONGLAND:MILLZPLANT:MUSHROOM_CUP_DIMPLE:MILLZPLANT:WEED_BLADE:MILLZPLANT:ROOT_HIDE:MILLZPLANT:SLIVER_BARB:MILLZPLANT:VINE_WHIP:MILLjCREATURE:TOAD:FATjCREATURE:TOAD:TALLOWjCREATURE:TOAD_MAN:FATjCREATURE:TOAD_MAN:TALLOWjCREATURE:GIANT_TOAD:FATjCREATURE:GIANT_TOAD:TALLOWjCREATURE:WORM:FATjCREATURE:WORM:TALLOWjCREATURE:WORM_MAN:FATjCREATURE:WORM_MAN:TALLOWjCREATURE:BIRD_BLUEJAY:FATjCREATURE:BIRD_BLUEJAY:TALLOWjCREATURE:BLUEJAY_MAN:FATjCREATURE:BLUEJAY_MAN:TALLOWjCREATURE:GIANT_BLUEJAY:FATjCREATURE:GIANT_BLUEJAY:TALLOWjCREATURE:BIRD_CARDINAL:FATjCREATURE:BIRD_CARDINAL:TALLOWjCREATURE:CARDINAL_MAN:FATjCREATURE:CARDINAL_MAN:TALLOWjCREATURE:GIANT_CARDINAL:FATjCREATURE:GIANT_CARDINAL:TALLOWjCREATURE:BIRD_GRACKLE:FATjCREATURE:BIRD_GRACKLE:TALLOWjCREATURE:GRACKLE_MAN:FATjCREATURE:GRACKLE_MAN:TALLOWjCREATURE:GIANT_GRACKLE:FATjCREATURE:GIANT_GRACKLE:TALLOWjCREATURE:BIRD_ORIOLE:FATjCREATURE:BIRD_ORIOLE:TALLOWjCREATURE:ORIOLE_MAN:FATjCREATURE:ORIOLE_MAN:TALLOWjCREATURE:GIANT_ORIOLE:FATjCREATURE:GIANT_ORIOLE:TALLOWjCREATURE:BIRD_RW_BLACKBIRD:FATj!CREATURE:BIRD_RW_BLACKBIRD:TALLOWjCREATURE:RW_BLACKBIRD_MAN:FATj CREATURE:RW_BLACKBIRD_MAN:TALLOWjCREATURE:GIANT_RW_BLACKBIRD:FATj"CREATURE:GIANT_RW_BLACKBIRD:TALLOWjCREATURE:BIRD_PENGUIN:FATjCREATURE:BIRD_PENGUIN:TALLOWj CREATURE:BIRD_PENGUIN_LITTLE:FATj#CREATURE:BIRD_PENGUIN_LITTLE:TALLOWj!CREATURE:BIRD_PENGUIN_EMPEROR:FATj$CREATURE:BIRD_PENGUIN_EMPEROR:TALLOWjCREATURE:PENGUIN MAN:FATjCREATURE:PENGUIN MAN:TALLOWjCREATURE:BIRD_PENGUIN_GIANT:FATj"CREATURE:BIRD_PENGUIN_GIANT:TALLOWj"CREATURE:BIRD_FALCON_PEREGRINE:FATj%CREATURE:BIRD_FALCON_PEREGRINE:TALLOWj!CREATURE:PEREGRINE FALCON MAN:FATj$CREATURE:PEREGRINE FALCON MAN:TALLOWj#CREATURE:GIANT PEREGRINE FALCON:FATj&CREATURE:GIANT PEREGRINE FALCON:TALLOWjCREATURE:BIRD_KIWI:FATjCREATURE:BIRD_KIWI:TALLOWjCREATURE:KIWI MAN:FATjCREATURE:KIWI MAN:TALLOWjCREATURE:BIRD_KIWI_GIANT:FATjCREATURE:BIRD_KIWI_GIANT:TALLOWjCREATURE:BIRD_OSTRICH:FATjCREATURE:BIRD_OSTRICH:TALLOWjCREATURE:OSTRICH MAN:FATjCREATURE:OSTRICH MAN:TALLOWjCREATURE:BIRD_OSTRICH_GIANT:FATj"CREATURE:BIRD_OSTRICH_GIANT:TALLOWjCREATURE:BIRD_CROW:FATjCREATURE:BIRD_CROW:TALLOWjCREATURE:CROW_MAN:FATjCREATURE:CROW_MAN:TALLOWjCREATURE:GIANT_CROW:FATjCREATURE:GIANT_CROW:TALLOWjCREATURE:BIRD_RAVEN:FATjCREATURE:BIRD_RAVEN:TALLOWjCREATURE:RAVEN_MAN:FATjCREATURE:RAVEN_MAN:TALLOWjCREATURE:GIANT_RAVEN:FATjCREATURE:GIANT_RAVEN:TALLOWjCREATURE:BIRD_CASSOWARY:FATjCREATURE:BIRD_CASSOWARY:TALLOWjCREATURE:CASSOWARY_MAN:FATjCREATURE:CASSOWARY_MAN:TALLOWjCREATURE:GIANT_CASSOWARY:FATjCREATURE:GIANT_CASSOWARY:TALLOWjCREATURE:BIRD_KEA:FATjCREATURE:BIRD_KEA:TALLOWjCREATURE:KEA_MAN:FATjCREATURE:KEA_MAN:TALLOWjCREATURE:GIANT_KEA:FATjCREATURE:GIANT_KEA:TALLOWjCREATURE:BIRD_OWL_SNOWY:FATjCREATURE:BIRD_OWL_SNOWY:TALLOWjCREATURE:SNOWY_OWL_MAN:FATjCREATURE:SNOWY_OWL_MAN:TALLOWjCREATURE:GIANT_SNOWY_OWL:FATjCREATURE:GIANT_SNOWY_OWL:TALLOWjCREATURE:SPARROW:FATjCREATURE:SPARROW:TALLOWjCREATURE:SPARROW_MAN:FATjCREATURE:SPARROW_MAN:TALLOWjCREATURE:GIANT_SPARROW:FATjCREATURE:GIANT_SPARROW:TALLOWjCREATURE:BIRD_STORK_WHITE:FATj CREATURE:BIRD_STORK_WHITE:TALLOWjCREATURE:WHITE_STORK_MAN:FATjCREATURE:WHITE_STORK_MAN:TALLOWjCREATURE:GIANT_WHITE_STORK:FATj!CREATURE:GIANT_WHITE_STORK:TALLOWjCREATURE:BIRD_LOON:FATjCREATURE:BIRD_LOON:TALLOWjCREATURE:LOON_MAN:FATjCREATURE:LOON_MAN:TALLOWjCREATURE:GIANT_LOON:FATjCREATURE:GIANT_LOON:TALLOWjCREATURE:BIRD_OWL_BARN:FATjCREATURE:BIRD_OWL_BARN:TALLOWjCREATURE:BARN_OWL_MAN:FATjCREATURE:BARN_OWL_MAN:TALLOWjCREATURE:GIANT_BARN_OWL:FATjCREATURE:GIANT_BARN_OWL:TALLOWjCREATURE:BIRD_PARAKEET:FATjCREATURE:BIRD_PARAKEET:TALLOWjCREATURE:PARAKEET_MAN:FATjCREATURE:PARAKEET_MAN:TALLOWjCREATURE:GIANT_PARAKEET:FATjCREATURE:GIANT_PARAKEET:TALLOWjCREATURE:BIRD_KAKAPO:FATjCREATURE:BIRD_KAKAPO:TALLOWjCREATURE:KAKAPO_MAN:FATjCREATURE:KAKAPO_MAN:TALLOWjCREATURE:GIANT_KAKAPO:FATjCREATURE:GIANT_KAKAPO:TALLOWjCREATURE:BIRD_PARROT_GREY:FATj CREATURE:BIRD_PARROT_GREY:TALLOWjCREATURE:GREY_PARROT_MAN:FATjCREATURE:GREY_PARROT_MAN:TALLOWjCREATURE:GIANT_GREY_PARROT:FATj!CREATURE:GIANT_GREY_PARROT:TALLOWjCREATURE:BIRD_PUFFIN:FATjCREATURE:BIRD_PUFFIN:TALLOWjCREATURE:PUFFIN_MAN:FATjCREATURE:PUFFIN_MAN:TALLOWjCREATURE:GIANT_PUFFIN:FATjCREATURE:GIANT_PUFFIN:TALLOWjCREATURE:BIRD_SWAN:FATjCREATURE:BIRD_SWAN:TALLOWjCREATURE:SWAN_MAN:FATjCREATURE:SWAN_MAN:TALLOWjCREATURE:GIANT_SWAN:FATjCREATURE:GIANT_SWAN:TALLOWjCREATURE:BIRD_LORIKEET:FATjCREATURE:BIRD_LORIKEET:TALLOWjCREATURE:LORIKEET_MAN:FATjCREATURE:LORIKEET_MAN:TALLOWjCREATURE:GIANT_LORIKEET:FATjCREATURE:GIANT_LORIKEET:TALLOWjCREATURE:BIRD_WREN:FATjCREATURE:BIRD_WREN:TALLOWjCREATURE:WREN_MAN:FATjCREATURE:WREN_MAN:TALLOWjCREATURE:GIANT_WREN:FATjCREATURE:GIANT_WREN:TALLOWjCREATURE:BIRD_OSPREY:FATjCREATURE:BIRD_OSPREY:TALLOWjCREATURE:OSPREY_MAN:FATjCREATURE:OSPREY_MAN:TALLOWjCREATURE:GIANT_OSPREY:FATjCREATURE:GIANT_OSPREY:TALLOWjCREATURE:BIRD_EMU:FATjCREATURE:BIRD_EMU:TALLOWjCREATURE:EMU_MAN:FATjCREATURE:EMU_MAN:TALLOWjCREATURE:GIANT_EMU:FATjCREATURE:GIANT_EMU:TALLOWjCREATURE:BIRD_COCKATIEL:FATjCREATURE:BIRD_COCKATIEL:TALLOWjCREATURE:COCKATIEL_MAN:FATjCREATURE:COCKATIEL_MAN:TALLOWjCREATURE:GIANT_COCKATIEL:FATjCREATURE:GIANT_COCKATIEL:TALLOWj&CREATURE:BIRD_LOVEBIRD_PEACH-FACED:FATj)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:TALLOWj%CREATURE:PEACH-FACED_LOVEBIRD_MAN:FATj(CREATURE:PEACH-FACED_LOVEBIRD_MAN:TALLOWj'CREATURE:GIANT_PEACH-FACED_LOVEBIRD:FATj*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:TALLOWjCREATURE:BIRD_MAGPIE:FATjCREATURE:BIRD_MAGPIE:TALLOWjCREATURE:MAGPIE_MAN:FATjCREATURE:MAGPIE_MAN:TALLOWjCREATURE:GIANT_MAGPIE:FATjCREATURE:GIANT_MAGPIE:TALLOWjCREATURE:BIRD_KESTREL:FATjCREATURE:BIRD_KESTREL:TALLOWjCREATURE:KESTREL_MAN:FATjCREATURE:KESTREL_MAN:TALLOWjCREATURE:GIANT_KESTREL:FATjCREATURE:GIANT_KESTREL:TALLOWjCREATURE:BIRD_ALBATROSS:FATjCREATURE:BIRD_ALBATROSS:TALLOWjCREATURE:ALBATROSS_MAN:FATjCREATURE:ALBATROSS_MAN:TALLOWjCREATURE:GIANT_ALBATROSS:FATjCREATURE:GIANT_ALBATROSS:TALLOWj"CREATURE:BIRD_OWL_GREAT_HORNED:FATj%CREATURE:BIRD_OWL_GREAT_HORNED:TALLOWj!CREATURE:GREAT_HORNED_OWL_MAN:FATj$CREATURE:GREAT_HORNED_OWL_MAN:TALLOWj#CREATURE:GIANT_GREAT_HORNED_OWL:FATj&CREATURE:GIANT_GREAT_HORNED_OWL:TALLOWjCREATURE:BIRD_EAGLE:FATjCREATURE:BIRD_EAGLE:TALLOWjCREATURE:EAGLE_MAN:FATjCREATURE:EAGLE_MAN:TALLOWjCREATURE:GIANT_EAGLE:FATjCREATURE:GIANT_EAGLE:TALLOWjCREATURE:BIRD_HORNBILL:FATjCREATURE:BIRD_HORNBILL:TALLOWjCREATURE:HORNBILL_MAN:FATjCREATURE:HORNBILL_MAN:TALLOWjCREATURE:GIANT_HORNBILL:FATjCREATURE:GIANT_HORNBILL:TALLOWj!CREATURE:BIRD_LOVEBIRD_MASKED:FATj$CREATURE:BIRD_LOVEBIRD_MASKED:TALLOWj CREATURE:MASKED_LOVEBIRD_MAN:FATj#CREATURE:MASKED_LOVEBIRD_MAN:TALLOWj"CREATURE:GIANT_MASKED_LOVEBIRD:FATj%CREATURE:GIANT_MASKED_LOVEBIRD:TALLOWjCREATURE:BIRD_BUSHTIT:FATjCREATURE:BIRD_BUSHTIT:TALLOWjCREATURE:BUSHTIT_MAN:FATjCREATURE:BUSHTIT_MAN:TALLOWjCREATURE:GIANT_BUSHTIT:FATjCREATURE:GIANT_BUSHTIT:TALLOWjCREATURE:DAMSELFLY:FATjCREATURE:DAMSELFLY:TALLOWjCREATURE:DAMSELFLY_MAN:FATjCREATURE:DAMSELFLY_MAN:TALLOWjCREATURE:GIANT_DAMSELFLY:FATjCREATURE:GIANT_DAMSELFLY:TALLOWjCREATURE:MOTH:FATjCREATURE:MOTH:TALLOWjCREATURE:MOTH_MAN:FATjCREATURE:MOTH_MAN:TALLOWjCREATURE:GIANT_MOTH:FATjCREATURE:GIANT_MOTH:TALLOWjCREATURE:GRASSHOPPER:FATjCREATURE:GRASSHOPPER:TALLOWjCREATURE:GRASSHOPPER_MAN:FATjCREATURE:GRASSHOPPER_MAN:TALLOWjCREATURE:GIANT_GRASSHOPPER:FATj!CREATURE:GIANT_GRASSHOPPER:TALLOWjCREATURE:BARK_SCORPION:FATjCREATURE:BARK_SCORPION:TALLOWjCREATURE:BARK_SCORPION_MAN:FATj!CREATURE:BARK_SCORPION_MAN:TALLOWj CREATURE:GIANT_BARK_SCORPION:FATj#CREATURE:GIANT_BARK_SCORPION:TALLOWjCREATURE:MANTIS:FATjCREATURE:MANTIS:TALLOWjCREATURE:MANTIS_MAN:FATjCREATURE:MANTIS_MAN:TALLOWjCREATURE:GIANT_MANTIS:FATjCREATURE:GIANT_MANTIS:TALLOWjCREATURE:TICK:FATjCREATURE:TICK:TALLOWjCREATURE:TICK_MAN:FATjCREATURE:TICK_MAN:TALLOWjCREATURE:GIANT_TICK:FATjCREATURE:GIANT_TICK:TALLOWjCREATURE:LOUSE:FATjCREATURE:LOUSE:TALLOWjCREATURE:LOUSE_MAN:FATjCREATURE:LOUSE_MAN:TALLOWjCREATURE:GIANT_LOUSE:FATjCREATURE:GIANT_LOUSE:TALLOWjCREATURE:THRIPS:FATjCREATURE:THRIPS:TALLOWjCREATURE:THRIPS_MAN:FATjCREATURE:THRIPS_MAN:TALLOWjCREATURE:GIANT_THRIPS:FATjCREATURE:GIANT_THRIPS:TALLOWjCREATURE:SLUG:FATjCREATURE:SLUG:TALLOWjCREATURE:SLUG_MAN:FATjCREATURE:SLUG_MAN:TALLOWjCREATURE:GIANT_SLUG:FATjCREATURE:GIANT_SLUG:TALLOWjCREATURE:MOSQUITO:FATjCREATURE:MOSQUITO:TALLOWjCREATURE:MOSQUITO_MAN:FATjCREATURE:MOSQUITO_MAN:TALLOWjCREATURE:GIANT_MOSQUITO:FATjCREATURE:GIANT_MOSQUITO:TALLOWjCREATURE:SPIDER_JUMPING:FATjCREATURE:SPIDER_JUMPING:TALLOWjCREATURE:JUMPING_SPIDER_MAN:FATj"CREATURE:JUMPING_SPIDER_MAN:TALLOWj!CREATURE:GIANT_JUMPING_SPIDER:FATj$CREATURE:GIANT_JUMPING_SPIDER:TALLOWjCREATURE:TERMITE:FATjCREATURE:TERMITE:TALLOWjCREATURE:MOON_SNAIL:FATjCREATURE:MOON_SNAIL:TALLOWjCREATURE:MOON_SNAIL_MAN:FATjCREATURE:MOON_SNAIL_MAN:TALLOWjCREATURE:GIANT_MOON_SNAIL:FATj CREATURE:GIANT_MOON_SNAIL:TALLOWj!CREATURE:SPIDER_BROWN_RECLUSE:FATj$CREATURE:SPIDER_BROWN_RECLUSE:TALLOWj%CREATURE:BROWN_RECLUSE_SPIDER_MAN:FATj(CREATURE:BROWN_RECLUSE_SPIDER_MAN:TALLOWj'CREATURE:GIANT_BROWN_RECLUSE_SPIDER:FATj*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:TALLOWjCREATURE:SNAIL:FATjCREATURE:SNAIL:TALLOWjCREATURE:SNAIL_MAN:FATjCREATURE:SNAIL_MAN:TALLOWjCREATURE:GIANT_SNAIL:FATjCREATURE:GIANT_SNAIL:TALLOWjCREATURE:GECKO_LEOPARD:FATjCREATURE:GECKO_LEOPARD:TALLOWjCREATURE:LEOPARD_GECKO_MAN:FATj!CREATURE:LEOPARD_GECKO_MAN:TALLOWj CREATURE:GIANT_LEOPARD_GECKO:FATj#CREATURE:GIANT_LEOPARD_GECKO:TALLOWjCREATURE:DESERT TORTOISE:FATjCREATURE:DESERT TORTOISE:TALLOWj CREATURE:DESERT_TORTOISE_MAN:FATj#CREATURE:DESERT_TORTOISE_MAN:TALLOWj"CREATURE:GIANT_DESERT_TORTOISE:FATj%CREATURE:GIANT_DESERT_TORTOISE:TALLOWjCREATURE:GILA_MONSTER:FATjCREATURE:GILA_MONSTER:TALLOWjCREATURE:GILA_MONSTER_MAN:FATj CREATURE:GILA_MONSTER_MAN:TALLOWjCREATURE:GIANT_GILA_MONSTER:FATj"CREATURE:GIANT_GILA_MONSTER:TALLOWjCREATURE:DOG:FATjCREATURE:DOG:TALLOWjCREATURE:CAT:FATjCREATURE:CAT:TALLOWjCREATURE:MULE:FATjCREATURE:MULE:TALLOWjCREATURE:DONKEY:FATjCREATURE:DONKEY:TALLOWjCREATURE:HORSE:FATjCREATURE:HORSE:TALLOWjCREATURE:COW:FATjCREATURE:COW:TALLOWjCREATURE:SHEEP:FATjCREATURE:SHEEP:TALLOWjCREATURE:PIG:FATjCREATURE:PIG:TALLOWjCREATURE:GOAT:FATjCREATURE:GOAT:TALLOWjCREATURE:BIRD_CHICKEN:FATjCREATURE:BIRD_CHICKEN:TALLOWjCREATURE:CAVY:FATjCREATURE:CAVY:TALLOWjCREATURE:BIRD_DUCK:FATjCREATURE:BIRD_DUCK:TALLOWjCREATURE:WATER_BUFFALO:FATjCREATURE:WATER_BUFFALO:TALLOWjCREATURE:REINDEER:FATjCREATURE:REINDEER:TALLOWjCREATURE:BIRD_GOOSE:FATjCREATURE:BIRD_GOOSE:TALLOWjCREATURE:YAK:FATjCREATURE:YAK:TALLOWjCREATURE:LLAMA:FATjCREATURE:LLAMA:TALLOWjCREATURE:ALPACA:FATjCREATURE:ALPACA:TALLOWjCREATURE:BIRD_GUINEAFOWL:FATjCREATURE:BIRD_GUINEAFOWL:TALLOWjCREATURE:BIRD_PEAFOWL_BLUE:FATj!CREATURE:BIRD_PEAFOWL_BLUE:TALLOWjCREATURE:BIRD_TURKEY:FATjCREATURE:BIRD_TURKEY:TALLOWjCREATURE:RABBIT:FATjCREATURE:RABBIT:TALLOWjCREATURE:FLY:FATjCREATURE:FLY:TALLOWjCREATURE:FLY_MAN:FATjCREATURE:FLY_MAN:TALLOWjCREATURE:GIANT_FLY:FATjCREATURE:GIANT_FLY:TALLOWjCREATURE:ROACH_LARGE:FATjCREATURE:ROACH_LARGE:TALLOWjCREATURE:ROACH_MAN:FATjCREATURE:ROACH_MAN:TALLOWjCREATURE:GIANT_ROACH:FATjCREATURE:GIANT_ROACH:TALLOWjCREATURE:BEETLE:FATjCREATURE:BEETLE:TALLOWjCREATURE:BEETLE_MAN:FATjCREATURE:BEETLE_MAN:TALLOWjCREATURE:GIANT_BEETLE:FATjCREATURE:GIANT_BEETLE:TALLOWjCREATURE:ANT:FATjCREATURE:ANT:TALLOWjCREATURE:BUTTERFLY_MONARCH:FATj!CREATURE:BUTTERFLY_MONARCH:TALLOWj"CREATURE:BUTTERFLY_MONARCH_MAN:FATj%CREATURE:BUTTERFLY_MONARCH_MAN:TALLOWj$CREATURE:GIANT_BUTTERFLY_MONARCH:FATj'CREATURE:GIANT_BUTTERFLY_MONARCH:TALLOWjCREATURE:FIREFLY:FATjCREATURE:FIREFLY:TALLOWjCREATURE:FIREFLY_MAN:FATjCREATURE:FIREFLY_MAN:TALLOWjCREATURE:GIANT_FIREFLY:FATjCREATURE:GIANT_FIREFLY:TALLOWjCREATURE:DRAGONFLY:FATjCREATURE:DRAGONFLY:TALLOWjCREATURE:DRAGONFLY_MAN:FATjCREATURE:DRAGONFLY_MAN:TALLOWjCREATURE:GIANT_DRAGONFLY:FATjCREATURE:GIANT_DRAGONFLY:TALLOWjCREATURE:HONEY_BEE:WAXjCREATURE:HONEY_BEE:FATjCREATURE:HONEY_BEE:TALLOWjCREATURE:BUMBLEBEE:WAXjCREATURE:BUMBLEBEE:FATjCREATURE:BUMBLEBEE:TALLOWjCREATURE:GOAT_MOUNTAIN:FATjCREATURE:GOAT_MOUNTAIN:TALLOWjCREATURE:GOAT_MOUNTAIN_MAN:FATj!CREATURE:GOAT_MOUNTAIN_MAN:TALLOWj CREATURE:GIANT_GOAT_MOUNTAIN:FATj#CREATURE:GIANT_GOAT_MOUNTAIN:TALLOWjCREATURE:MARMOT_HOARY:FATjCREATURE:MARMOT_HOARY:TALLOWjCREATURE:MARMOT_HOARY_MAN:FATj CREATURE:MARMOT_HOARY_MAN:TALLOWjCREATURE:GIANT_MARMOT_HOARY:FATj"CREATURE:GIANT_MARMOT_HOARY:TALLOWjCREATURE:GNOME_MOUNTAIN:FATjCREATURE:GNOME_MOUNTAIN:TALLOWjCREATURE:GNOME_DARK:FATjCREATURE:GNOME_DARK:TALLOWjCREATURE:WALRUS:FATjCREATURE:WALRUS:TALLOWjCREATURE:WALRUS_MAN:FATjCREATURE:WALRUS_MAN:TALLOWjCREATURE:GIANT_WALRUS:FATjCREATURE:GIANT_WALRUS:TALLOWjCREATURE:FISH_LAMPREY_SEA:FATj CREATURE:FISH_LAMPREY_SEA:TALLOWjCREATURE:SHARK_GREAT_WHITE:FATj!CREATURE:SHARK_GREAT_WHITE:TALLOWjCREATURE:SHARK_FRILL:FATjCREATURE:SHARK_FRILL:TALLOWj CREATURE:SHARK_SPINY_DOGFISH:FATj#CREATURE:SHARK_SPINY_DOGFISH:TALLOWj$CREATURE:SHARK_WOBBEGONG_SPOTTED:FATj'CREATURE:SHARK_WOBBEGONG_SPOTTED:TALLOWjCREATURE:SHARK_WHALE:FATjCREATURE:SHARK_WHALE:TALLOWjCREATURE:SHARK_BASKING:FATjCREATURE:SHARK_BASKING:TALLOWjCREATURE:SHARK_NURSE:FATjCREATURE:SHARK_NURSE:TALLOWj CREATURE:SHARK_MAKO_SHORTFIN:FATj#CREATURE:SHARK_MAKO_SHORTFIN:TALLOWjCREATURE:SHARK_MAKO_LONGFIN:FATj"CREATURE:SHARK_MAKO_LONGFIN:TALLOWjCREATURE:SHARK_TIGER:FATjCREATURE:SHARK_TIGER:TALLOWjCREATURE:SHARK_BULL:FATjCREATURE:SHARK_BULL:TALLOWj CREATURE:SHARK_REEF_BLACKTIP:FATj#CREATURE:SHARK_REEF_BLACKTIP:TALLOWj CREATURE:SHARK_REEF_WHITETIP:FATj#CREATURE:SHARK_REEF_WHITETIP:TALLOWjCREATURE:SHARK_BLUE:FATjCREATURE:SHARK_BLUE:TALLOWjCREATURE:SHARK_HAMMERHEAD:FATj CREATURE:SHARK_HAMMERHEAD:TALLOWjCREATURE:SHARK_ANGEL:FATjCREATURE:SHARK_ANGEL:TALLOWjCREATURE:FISH_SKATE_COMMON:FATj!CREATURE:FISH_SKATE_COMMON:TALLOWjCREATURE:FISH_RAY_MANTA:FATjCREATURE:FISH_RAY_MANTA:TALLOWjCREATURE:FISH_STINGRAY:FATjCREATURE:FISH_STINGRAY:TALLOWjCREATURE:FISH_COELACANTH:FATjCREATURE:FISH_COELACANTH:TALLOWjCREATURE:FISH_STURGEON:FATjCREATURE:FISH_STURGEON:TALLOWjCREATURE:FISH_CONGER_EEL:FATjCREATURE:FISH_CONGER_EEL:TALLOWjCREATURE:FISH_MILKFISH:FATjCREATURE:FISH_MILKFISH:TALLOWjCREATURE:FISH_COD:FATjCREATURE:FISH_COD:TALLOWjCREATURE:FISH_OPAH:FATjCREATURE:FISH_OPAH:TALLOWjCREATURE:FISH_GROUPER_GIANT:FATj"CREATURE:FISH_GROUPER_GIANT:TALLOWjCREATURE:FISH_BLUEFISH:FATjCREATURE:FISH_BLUEFISH:TALLOWjCREATURE:FISH_SUNFISH_OCEAN:FATj"CREATURE:FISH_SUNFISH_OCEAN:TALLOWjCREATURE:FISH_SWORDFISH:FATjCREATURE:FISH_SWORDFISH:TALLOWjCREATURE:FISH_MARLIN:FATjCREATURE:FISH_MARLIN:TALLOWjCREATURE:FISH_HALIBUT:FATjCREATURE:FISH_HALIBUT:TALLOWj!CREATURE:FISH_BARRACUDA_GREAT:FATj$CREATURE:FISH_BARRACUDA_GREAT:TALLOWjCREATURE:FISH_TUNA_BLUEFIN:FATj!CREATURE:FISH_TUNA_BLUEFIN:TALLOWjCREATURE:NARWHAL:FATjCREATURE:NARWHAL:TALLOWjCREATURE:NARWHAL MAN:FATjCREATURE:NARWHAL MAN:TALLOWjCREATURE:NARWHAL, GIANT:FATjCREATURE:NARWHAL, GIANT:TALLOWjCREATURE:HIPPO:FATjCREATURE:HIPPO:TALLOWjCREATURE:HIPPO_MAN:FATjCREATURE:HIPPO_MAN:TALLOWjCREATURE:GIANT_HIPPO:FATjCREATURE:GIANT_HIPPO:TALLOWjCREATURE:FISH_GAR_LONGNOSE:FATj!CREATURE:FISH_GAR_LONGNOSE:TALLOWjCREATURE:FISH_CARP:FATjCREATURE:FISH_CARP:TALLOWjCREATURE:FISH_TIGERFISH:FATjCREATURE:FISH_TIGERFISH:TALLOWjCREATURE:FISH_PIKE:FATjCREATURE:FISH_PIKE:TALLOWjCREATURE:PLATYPUS:FATjCREATURE:PLATYPUS:TALLOWjCREATURE:PLATYPUS MAN:FATjCREATURE:PLATYPUS MAN:TALLOWjCREATURE:PLATYPUS, GIANT:FATjCREATURE:PLATYPUS, GIANT:TALLOWjCREATURE:BEAR_GRIZZLY:FATjCREATURE:BEAR_GRIZZLY:TALLOWjCREATURE:BEAR_GRIZZLY_MAN:FATj CREATURE:BEAR_GRIZZLY_MAN:TALLOWjCREATURE:GIANT_BEAR_GRIZZLY:FATj"CREATURE:GIANT_BEAR_GRIZZLY:TALLOWjCREATURE:BEAR_BLACK:FATjCREATURE:BEAR_BLACK:TALLOWjCREATURE:BEAR_BLACK_MAN:FATjCREATURE:BEAR_BLACK_MAN:TALLOWjCREATURE:GIANT_BEAR_BLACK:FATj CREATURE:GIANT_BEAR_BLACK:TALLOWjCREATURE:DEER:FATjCREATURE:DEER:TALLOWjCREATURE:DEER_MAN:FATjCREATURE:DEER_MAN:TALLOWjCREATURE:GIANT_DEER:FATjCREATURE:GIANT_DEER:TALLOWjCREATURE:FOX:FATjCREATURE:FOX:TALLOWjCREATURE:FOX_MAN:FATjCREATURE:FOX_MAN:TALLOWjCREATURE:GIANT_FOX:FATjCREATURE:GIANT_FOX:TALLOWjCREATURE:RACCOON:FATjCREATURE:RACCOON:TALLOWjCREATURE:RACCOON_MAN:FATjCREATURE:RACCOON_MAN:TALLOWjCREATURE:GIANT_RACCOON:FATjCREATURE:GIANT_RACCOON:TALLOWjCREATURE:MACAQUE_RHESUS:FATjCREATURE:MACAQUE_RHESUS:TALLOWjCREATURE:MACAQUE_RHESUS_MAN:FATj"CREATURE:MACAQUE_RHESUS_MAN:TALLOWj!CREATURE:GIANT_MACAQUE_RHESUS:FATj$CREATURE:GIANT_MACAQUE_RHESUS:TALLOWjCREATURE:COUGAR:FATjCREATURE:COUGAR:TALLOWjCREATURE:COUGAR_MAN:FATjCREATURE:COUGAR_MAN:TALLOWjCREATURE:GIANT_COUGAR:FATjCREATURE:GIANT_COUGAR:TALLOWjCREATURE:WOLF:FATjCREATURE:WOLF:TALLOWjCREATURE:WOLF_MAN:FATjCREATURE:WOLF_MAN:TALLOWjCREATURE:GIANT_WOLF:FATjCREATURE:GIANT_WOLF:TALLOWjCREATURE:GROUNDHOG:FATjCREATURE:GROUNDHOG:TALLOWjCREATURE:GROUNDHOG_MAN:FATjCREATURE:GROUNDHOG_MAN:TALLOWjCREATURE:GIANT_GROUNDHOG:FATjCREATURE:GIANT_GROUNDHOG:TALLOWjCREATURE:ALLIGATOR:FATjCREATURE:ALLIGATOR:TALLOWjCREATURE:ALLIGATOR_MAN:FATjCREATURE:ALLIGATOR_MAN:TALLOWjCREATURE:GIANT_ALLIGATOR:FATjCREATURE:GIANT_ALLIGATOR:TALLOWjCREATURE:BIRD_BUZZARD:FATjCREATURE:BIRD_BUZZARD:TALLOWjCREATURE:BUZZARD_MAN:FATjCREATURE:BUZZARD_MAN:TALLOWjCREATURE:GIANT_BUZZARD:FATjCREATURE:GIANT_BUZZARD:TALLOWjCREATURE:PANDA:FATjCREATURE:PANDA:TALLOWjCREATURE:PANDA, GIGANTIC:FATjCREATURE:PANDA, GIGANTIC:TALLOWjCREATURE:PANDA MAN:FATjCREATURE:PANDA MAN:TALLOWjCREATURE:CAPYBARA:FATjCREATURE:CAPYBARA:TALLOWjCREATURE:CAPYBARA, GIANT:FATjCREATURE:CAPYBARA, GIANT:TALLOWjCREATURE:CAPYBARA MAN:FATjCREATURE:CAPYBARA MAN:TALLOWjCREATURE:BADGER:FATjCREATURE:BADGER:TALLOWjCREATURE:BADGER MAN:FATjCREATURE:BADGER MAN:TALLOWjCREATURE:BADGER, GIANT:FATjCREATURE:BADGER, GIANT:TALLOWjCREATURE:MOOSE:FATjCREATURE:MOOSE:TALLOWjCREATURE:MOOSE MAN:FATjCREATURE:MOOSE MAN:TALLOWjCREATURE:MOOSE, GIANT:FATjCREATURE:MOOSE, GIANT:TALLOWjCREATURE:RED PANDA:FATjCREATURE:RED PANDA:TALLOWjCREATURE:RED PANDA MAN:FATjCREATURE:RED PANDA MAN:TALLOWjCREATURE:RED PANDA, GIANT:FATj CREATURE:RED PANDA, GIANT:TALLOWjCREATURE:ELEPHANT:FATjCREATURE:ELEPHANT:TALLOWjCREATURE:ELEPHANT_MAN:FATjCREATURE:ELEPHANT_MAN:TALLOWjCREATURE:GIANT_ELEPHANT:FATjCREATURE:GIANT_ELEPHANT:TALLOWjCREATURE:WARTHOG:FATjCREATURE:WARTHOG:TALLOWjCREATURE:WARTHOG_MAN:FATjCREATURE:WARTHOG_MAN:TALLOWjCREATURE:GIANT_WARTHOG:FATjCREATURE:GIANT_WARTHOG:TALLOWjCREATURE:LION:FATjCREATURE:LION:TALLOWjCREATURE:LION_MAN:FATjCREATURE:LION_MAN:TALLOWjCREATURE:GIANT_LION:FATjCREATURE:GIANT_LION:TALLOWjCREATURE:LEOPARD:FATjCREATURE:LEOPARD:TALLOWjCREATURE:LEOPARD_MAN:FATjCREATURE:LEOPARD_MAN:TALLOWjCREATURE:GIANT_LEOPARD:FATjCREATURE:GIANT_LEOPARD:TALLOWjCREATURE:JAGUAR:FATjCREATURE:JAGUAR:TALLOWjCREATURE:JAGUAR_MAN:FATjCREATURE:JAGUAR_MAN:TALLOWjCREATURE:GIANT_JAGUAR:FATjCREATURE:GIANT_JAGUAR:TALLOWjCREATURE:TIGER:FATjCREATURE:TIGER:TALLOWjCREATURE:TIGER_MAN:FATjCREATURE:TIGER_MAN:TALLOWjCREATURE:GIANT_TIGER:FATjCREATURE:GIANT_TIGER:TALLOWjCREATURE:CHEETAH:FATjCREATURE:CHEETAH:TALLOWjCREATURE:CHEETAH_MAN:FATjCREATURE:CHEETAH_MAN:TALLOWjCREATURE:GIANT_CHEETAH:FATjCREATURE:GIANT_CHEETAH:TALLOWjCREATURE:GAZELLE:FATjCREATURE:GAZELLE:TALLOWjCREATURE:GAZELLE_MAN:FATjCREATURE:GAZELLE_MAN:TALLOWjCREATURE:GIANT_GAZELLE:FATjCREATURE:GIANT_GAZELLE:TALLOWjCREATURE:MANDRILL:FATjCREATURE:MANDRILL:TALLOWjCREATURE:MANDRILL_MAN:FATjCREATURE:MANDRILL_MAN:TALLOWjCREATURE:GIANT_MANDRILL:FATjCREATURE:GIANT_MANDRILL:TALLOWjCREATURE:CHIMPANZEE:FATjCREATURE:CHIMPANZEE:TALLOWjCREATURE:BONOBO:FATjCREATURE:BONOBO:TALLOWjCREATURE:GORILLA:FATjCREATURE:GORILLA:TALLOWjCREATURE:ORANGUTAN:FATjCREATURE:ORANGUTAN:TALLOWjCREATURE:GIBBON_SIAMANG:FATjCREATURE:GIBBON_SIAMANG:TALLOWj CREATURE:GIBBON_WHITE_HANDED:FATj#CREATURE:GIBBON_WHITE_HANDED:TALLOWj CREATURE:GIBBON_BLACK_HANDED:FATj#CREATURE:GIBBON_BLACK_HANDED:TALLOWjCREATURE:GIBBON_GRAY:FATjCREATURE:GIBBON_GRAY:TALLOWjCREATURE:GIBBON_SILVERY:FATjCREATURE:GIBBON_SILVERY:TALLOWjCREATURE:GIBBON_PILEATED:FATjCREATURE:GIBBON_PILEATED:TALLOWjCREATURE:GIBBON_BILOU:FATjCREATURE:GIBBON_BILOU:TALLOWj CREATURE:GIBBON_WHITE_BROWED:FATj#CREATURE:GIBBON_WHITE_BROWED:TALLOWj!CREATURE:GIBBON_BLACK_CRESTED:FATj$CREATURE:GIBBON_BLACK_CRESTED:TALLOWjCREATURE:CAMEL_1_HUMP:FATjCREATURE:CAMEL_1_HUMP:TALLOWjCREATURE:CAMEL_1_HUMP_MAN:FATj CREATURE:CAMEL_1_HUMP_MAN:TALLOWjCREATURE:GIANT_CAMEL_1_HUMP:FATj"CREATURE:GIANT_CAMEL_1_HUMP:TALLOWjCREATURE:CAMEL_2_HUMP:FATjCREATURE:CAMEL_2_HUMP:TALLOWjCREATURE:CAMEL_2_HUMP_MAN:FATj CREATURE:CAMEL_2_HUMP_MAN:TALLOWjCREATURE:GIANT_CAMEL_2_HUMP:FATj"CREATURE:GIANT_CAMEL_2_HUMP:TALLOWj CREATURE:CROCODILE_SALTWATER:FATj#CREATURE:CROCODILE_SALTWATER:TALLOWj$CREATURE:CROCODILE_SALTWATER_MAN:FATj'CREATURE:CROCODILE_SALTWATER_MAN:TALLOWj&CREATURE:GIANT_CROCODILE_SALTWATER:FATj)CREATURE:GIANT_CROCODILE_SALTWATER:TALLOWjCREATURE:BIRD_VULTURE:FATjCREATURE:BIRD_VULTURE:TALLOWjCREATURE:VULTURE_MAN:FATjCREATURE:VULTURE_MAN:TALLOWjCREATURE:GIANT_VULTURE:FATjCREATURE:GIANT_VULTURE:TALLOWjCREATURE:RHINOCEROS:FATjCREATURE:RHINOCEROS:TALLOWjCREATURE:RHINOCEROS_MAN:FATjCREATURE:RHINOCEROS_MAN:TALLOWjCREATURE:GIANT_RHINOCEROS:FATj CREATURE:GIANT_RHINOCEROS:TALLOWjCREATURE:GIRAFFE:FATjCREATURE:GIRAFFE:TALLOWjCREATURE:GIRAFFE_MAN:FATjCREATURE:GIRAFFE_MAN:TALLOWjCREATURE:GIANT_GIRAFFE:FATjCREATURE:GIANT_GIRAFFE:TALLOWjCREATURE:HONEY BADGER:FATjCREATURE:HONEY BADGER:TALLOWjCREATURE:HONEY BADGER MAN:FATj CREATURE:HONEY BADGER MAN:TALLOWj CREATURE:HONEY BADGER, GIANT:FATj#CREATURE:HONEY BADGER, GIANT:TALLOWjCREATURE:GIANT TORTOISE:FATjCREATURE:GIANT TORTOISE:TALLOWjCREATURE:GIANT TORTOISE MAN:FATj"CREATURE:GIANT TORTOISE MAN:TALLOWjCREATURE:GIGANTIC TORTOISE:FATj!CREATURE:GIGANTIC TORTOISE:TALLOWjCREATURE:ARMADILLO:FATjCREATURE:ARMADILLO:TALLOWjCREATURE:ARMADILLO MAN:FATjCREATURE:ARMADILLO MAN:TALLOWjCREATURE:ARMADILLO, GIANT:FATj CREATURE:ARMADILLO, GIANT:TALLOWjCREATURE:MUSKOX:FATjCREATURE:MUSKOX:TALLOWjCREATURE:MUSKOX_MAN:FATjCREATURE:MUSKOX_MAN:TALLOWjCREATURE:GIANT_MUSKOX:FATjCREATURE:GIANT_MUSKOX:TALLOWjCREATURE:ELK:FATjCREATURE:ELK:TALLOWjCREATURE:ELK_MAN:FATjCREATURE:ELK_MAN:TALLOWjCREATURE:GIANT_ELK:FATjCREATURE:GIANT_ELK:TALLOWjCREATURE:BEAR_POLAR:FATjCREATURE:BEAR_POLAR:TALLOWjCREATURE:BEAR_POLAR_MAN:FATjCREATURE:BEAR_POLAR_MAN:TALLOWjCREATURE:GIANT_BEAR_POLAR:FATj CREATURE:GIANT_BEAR_POLAR:TALLOWjCREATURE:WOLVERINE:FATjCREATURE:WOLVERINE:TALLOWjCREATURE:WOLVERINE_MAN:FATjCREATURE:WOLVERINE_MAN:TALLOWjCREATURE:GIANT_WOLVERINE:FATjCREATURE:GIANT_WOLVERINE:TALLOWjCREATURE:CHINCHILLA:FATjCREATURE:CHINCHILLA:TALLOWjCREATURE:CHINCHILLA_MAN:FATjCREATURE:CHINCHILLA_MAN:TALLOWjCREATURE:GIANT_CHINCHILLA:FATj CREATURE:GIANT_CHINCHILLA:TALLOWjCREATURE:FLOATING_GUTS:FATjCREATURE:FLOATING_GUTS:TALLOWjCREATURE:DRUNIAN:FATjCREATURE:DRUNIAN:TALLOWjCREATURE:CREEPING_EYE:FATjCREATURE:CREEPING_EYE:TALLOWj#CREATURE:VORACIOUS_CAVE_CRAWLER:FATj&CREATURE:VORACIOUS_CAVE_CRAWLER:TALLOWjCREATURE:BLIND_CAVE_OGRE:FATjCREATURE:BLIND_CAVE_OGRE:TALLOWjCREATURE:CAP_HOPPER:FATjCREATURE:CAP_HOPPER:TALLOWjCREATURE:MAGMA_CRAB:FATjCREATURE:MAGMA_CRAB:TALLOWjCREATURE:CRUNDLE:FATjCREATURE:CRUNDLE:TALLOWjCREATURE:HUNGRY_HEAD:FATjCREATURE:HUNGRY_HEAD:TALLOWjCREATURE:ELK_BIRD:FATjCREATURE:ELK_BIRD:TALLOWjCREATURE:HELMET_SNAKE:FATjCREATURE:HELMET_SNAKE:TALLOWjCREATURE:GREEN_DEVOURER:FATjCREATURE:GREEN_DEVOURER:TALLOWjCREATURE:RUTHERER:FATjCREATURE:RUTHERER:TALLOWjCREATURE:CREEPY_CRAWLER:FATjCREATURE:CREEPY_CRAWLER:TALLOWjCREATURE:DRALTHA:FATjCREATURE:DRALTHA:TALLOWjCREATURE:GIANT_EARTHWORM:FATjCREATURE:GIANT_EARTHWORM:TALLOWjCREATURE:BUGBAT:FATjCREATURE:BUGBAT:TALLOWjCREATURE:MANERA:FATjCREATURE:MANERA:TALLOWjCREATURE:MOLEMARIAN:FATjCREATURE:MOLEMARIAN:TALLOWjCREATURE:JABBERER:FATjCREATURE:JABBERER:TALLOWjCREATURE:POND_GRABBER:FATjCREATURE:POND_GRABBER:TALLOWjCREATURE:BLIND_CAVE_BEAR:FATjCREATURE:BLIND_CAVE_BEAR:TALLOWjCREATURE:CAVE_DRAGON:FATjCREATURE:CAVE_DRAGON:TALLOWjCREATURE:REACHER:FATjCREATURE:REACHER:TALLOWjCREATURE:GORLAK:FATjCREATURE:GORLAK:TALLOWjCREATURE:OCTOPUS:FATjCREATURE:OCTOPUS:TALLOWjCREATURE:OCTOPUS_MAN:FATjCREATURE:OCTOPUS_MAN:TALLOWjCREATURE:GIANT_OCTOPUS:FATjCREATURE:GIANT_OCTOPUS:TALLOWjCREATURE:CRAB:FATjCREATURE:CRAB:TALLOWjCREATURE:CRAB_MAN:FATjCREATURE:CRAB_MAN:TALLOWjCREATURE:GIANT_CRAB:FATjCREATURE:GIANT_CRAB:TALLOWjCREATURE:LEOPARD_SEAL:FATjCREATURE:LEOPARD_SEAL:TALLOWjCREATURE:LEOPARD_SEAL_MAN:FATj CREATURE:LEOPARD_SEAL_MAN:TALLOWjCREATURE:GIANT_LEOPARD_SEAL:FATj"CREATURE:GIANT_LEOPARD_SEAL:TALLOWjCREATURE:CUTTLEFISH:FATjCREATURE:CUTTLEFISH:TALLOWjCREATURE:CUTTLEFISH_MAN:FATjCREATURE:CUTTLEFISH_MAN:TALLOWjCREATURE:GIANT_CUTTLEFISH:FATj CREATURE:GIANT_CUTTLEFISH:TALLOWjCREATURE:ORCA:FATjCREATURE:ORCA:TALLOWjCREATURE:ORCA_MAN:FATjCREATURE:ORCA_MAN:TALLOWjCREATURE:GIANT_ORCA:FATjCREATURE:GIANT_ORCA:TALLOWjCREATURE:HORSESHOE_CRAB:FATjCREATURE:HORSESHOE_CRAB:TALLOWjCREATURE:HORSESHOE_CRAB_MAN:FATj"CREATURE:HORSESHOE_CRAB_MAN:TALLOWj!CREATURE:GIANT_HORSESHOE_CRAB:FATj$CREATURE:GIANT_HORSESHOE_CRAB:TALLOWjCREATURE:SPERM_WHALE:FATjCREATURE:SPERM_WHALE:TALLOWjCREATURE:SPERM_WHALE_MAN:FATjCREATURE:SPERM_WHALE_MAN:TALLOWjCREATURE:GIANT_SPERM_WHALE:FATj!CREATURE:GIANT_SPERM_WHALE:TALLOWjCREATURE:ELEPHANT_SEAL:FATjCREATURE:ELEPHANT_SEAL:TALLOWjCREATURE:ELEPHANT_SEAL_MAN:FATj!CREATURE:ELEPHANT_SEAL_MAN:TALLOWj CREATURE:GIANT_ELEPHANT_SEAL:FATj#CREATURE:GIANT_ELEPHANT_SEAL:TALLOWjCREATURE:HARP_SEAL:FATjCREATURE:HARP_SEAL:TALLOWjCREATURE:HARP_SEAL_MAN:FATjCREATURE:HARP_SEAL_MAN:TALLOWjCREATURE:GIANT_HARP_SEAL:FATjCREATURE:GIANT_HARP_SEAL:TALLOWjCREATURE:NAUTILUS:FATjCREATURE:NAUTILUS:TALLOWjCREATURE:NAUTILUS_MAN:FATjCREATURE:NAUTILUS_MAN:TALLOWjCREATURE:GIANT_NAUTILUS:FATjCREATURE:GIANT_NAUTILUS:TALLOWjCREATURE:FOXSQUIRREL:FATjCREATURE:FOXSQUIRREL:TALLOWjCREATURE:MOGHOPPER:FATjCREATURE:MOGHOPPER:TALLOWjCREATURE:RAT_DEMON:FATjCREATURE:RAT_DEMON:TALLOWjCREATURE:WAMBLER_FLUFFY:TALLOWjCREATURE:WAMBLER_FLUFFY:FATj$CREATURE:LIZARD_RHINO_TWO_LEGGED:FATj'CREATURE:LIZARD_RHINO_TWO_LEGGED:TALLOWjCREATURE:WORM_KNUCKLE:FATjCREATURE:WORM_KNUCKLE:TALLOWjCREATURE:SPIDER_PHANTOM:FATjCREATURE:SPIDER_PHANTOM:TALLOWjCREATURE:FLY_ACORN:FATjCREATURE:FLY_ACORN:TALLOWjCREATURE:GNAT_BLOOD:FATjCREATURE:GNAT_BLOOD:TALLOWjCREATURE:LIZARD:FATjCREATURE:LIZARD:TALLOWjCREATURE:LIZARD_MAN:FATjCREATURE:LIZARD_MAN:TALLOWjCREATURE:GIANT_LIZARD:FATjCREATURE:GIANT_LIZARD:TALLOWjCREATURE:SKINK:FATjCREATURE:SKINK:TALLOWjCREATURE:SKINK_MAN:FATjCREATURE:SKINK_MAN:TALLOWjCREATURE:GIANT_SKINK:FATjCREATURE:GIANT_SKINK:TALLOWjCREATURE:CHAMELEON:FATjCREATURE:CHAMELEON:TALLOWjCREATURE:CHAMELEON_MAN:FATjCREATURE:CHAMELEON_MAN:TALLOWjCREATURE:GIANT_CHAMELEON:FATjCREATURE:GIANT_CHAMELEON:TALLOWjCREATURE:ANOLE:FATjCREATURE:ANOLE:TALLOWjCREATURE:ANOLE_MAN:FATjCREATURE:ANOLE_MAN:TALLOWjCREATURE:GIANT_ANOLE:FATjCREATURE:GIANT_ANOLE:TALLOWjCREATURE:IGUANA:FATjCREATURE:IGUANA:TALLOWjCREATURE:IGUANA_MAN:FATjCREATURE:IGUANA_MAN:TALLOWjCREATURE:GIANT_IGUANA:FATjCREATURE:GIANT_IGUANA:TALLOWjCREATURE:RIVER OTTER:FATjCREATURE:RIVER OTTER:TALLOWjCREATURE:SEA OTTER:FATjCREATURE:SEA OTTER:TALLOWjCREATURE:OTTER_MAN:FATjCREATURE:OTTER_MAN:TALLOWjCREATURE:GIANT_OTTER:FATjCREATURE:GIANT_OTTER:TALLOWjCREATURE:SNAPPING TURTLE:FATjCREATURE:SNAPPING TURTLE:TALLOWj&CREATURE:ALLIGATOR SNAPPING TURTLE:FATj)CREATURE:ALLIGATOR SNAPPING TURTLE:TALLOWj CREATURE:SNAPPING_TURTLE_MAN:FATj#CREATURE:SNAPPING_TURTLE_MAN:TALLOWj"CREATURE:GIANT_SNAPPING_TURTLE:FATj%CREATURE:GIANT_SNAPPING_TURTLE:TALLOWjCREATURE:BEAVER:FATjCREATURE:BEAVER:TALLOWjCREATURE:BEAVER_MAN:FATjCREATURE:BEAVER_MAN:TALLOWjCREATURE:GIANT_BEAVER:FATjCREATURE:GIANT_BEAVER:TALLOWjCREATURE:LEECH:FATjCREATURE:LEECH:TALLOWjCREATURE:LEECH_MAN:FATjCREATURE:LEECH_MAN:TALLOWjCREATURE:GIANT_LEECH:FATjCREATURE:GIANT_LEECH:TALLOWjCREATURE:AXOLOTL:FATjCREATURE:AXOLOTL:TALLOWjCREATURE:AXOLOTL_MAN:FATjCREATURE:AXOLOTL_MAN:TALLOWjCREATURE:GIANT_AXOLOTL:FATjCREATURE:GIANT_AXOLOTL:TALLOWjCREATURE:MINK:FATjCREATURE:MINK:TALLOWjCREATURE:MINK_MAN:FATjCREATURE:MINK_MAN:TALLOWjCREATURE:GIANT_MINK:FATjCREATURE:GIANT_MINK:TALLOWjCREATURE:POND_TURTLE:FATjCREATURE:POND_TURTLE:TALLOWjCREATURE:POND_TURTLE_MAN:FATjCREATURE:POND_TURTLE_MAN:TALLOWjCREATURE:GIANT_POND_TURTLE:FATj!CREATURE:GIANT_POND_TURTLE:TALLOWjCREATURE:RAT:FATjCREATURE:RAT:TALLOWjCREATURE:RAT_MAN:FATjCREATURE:RAT_MAN:TALLOWjCREATURE:SQUIRREL_GRAY:FATjCREATURE:SQUIRREL_GRAY:TALLOWjCREATURE:SQUIRREL_GRAY_MAN:FATj!CREATURE:SQUIRREL_GRAY_MAN:TALLOWj CREATURE:GIANT_SQUIRREL_GRAY:FATj#CREATURE:GIANT_SQUIRREL_GRAY:TALLOWjCREATURE:SQUIRREL_RED:FATjCREATURE:SQUIRREL_RED:TALLOWjCREATURE:SQUIRREL_RED_MAN:FATj CREATURE:SQUIRREL_RED_MAN:TALLOWjCREATURE:GIANT_SQUIRREL_RED:FATj"CREATURE:GIANT_SQUIRREL_RED:TALLOWjCREATURE:CHIPMUNK:FATjCREATURE:CHIPMUNK:TALLOWjCREATURE:CHIPMUNK_MAN:FATjCREATURE:CHIPMUNK_MAN:TALLOWjCREATURE:GIANT_CHIPMUNK:FATjCREATURE:GIANT_CHIPMUNK:TALLOWjCREATURE:HAMSTER:FATjCREATURE:HAMSTER:TALLOWjCREATURE:HAMSTER_MAN:FATjCREATURE:HAMSTER_MAN:TALLOWjCREATURE:GIANT_HAMSTER:FATjCREATURE:GIANT_HAMSTER:TALLOWjCREATURE:HEDGEHOG:FATjCREATURE:HEDGEHOG:TALLOWjCREATURE:HEDGEHOG_MAN:FATjCREATURE:HEDGEHOG_MAN:TALLOWjCREATURE:GIANT_HEDGEHOG:FATjCREATURE:GIANT_HEDGEHOG:TALLOWjCREATURE:SQUIRREL_FLYING:FATjCREATURE:SQUIRREL_FLYING:TALLOWj CREATURE:FLYING_SQUIRREL_MAN:FATj#CREATURE:FLYING_SQUIRREL_MAN:TALLOWj"CREATURE:GIANT_FLYING_SQUIRREL:FATj%CREATURE:GIANT_FLYING_SQUIRREL:TALLOWjCREATURE:MUSSEL:FATjCREATURE:MUSSEL:TALLOWjCREATURE:OYSTER:FATjCREATURE:OYSTER:TALLOWjCREATURE:FISH_SALMON:FATjCREATURE:FISH_SALMON:TALLOWjCREATURE:FISH_CLOWNFISH:FATjCREATURE:FISH_CLOWNFISH:TALLOWjCREATURE:FISH_HAGFISH:FATjCREATURE:FISH_HAGFISH:TALLOWjCREATURE:FISH_LAMPREY_BROOK:FATj"CREATURE:FISH_LAMPREY_BROOK:TALLOWjCREATURE:FISH_RAY_BAT:FATjCREATURE:FISH_RAY_BAT:TALLOWjCREATURE:FISH_RAY_THORNBACK:FATj"CREATURE:FISH_RAY_THORNBACK:TALLOWj!CREATURE:FISH_RATFISH_SPOTTED:FATj$CREATURE:FISH_RATFISH_SPOTTED:TALLOWjCREATURE:FISH_HERRING:FATjCREATURE:FISH_HERRING:TALLOWjCREATURE:FISH_SHAD:FATjCREATURE:FISH_SHAD:TALLOWjCREATURE:FISH_ANCHOVY:FATjCREATURE:FISH_ANCHOVY:TALLOWj!CREATURE:FISH_TROUT_STEELHEAD:FATj$CREATURE:FISH_TROUT_STEELHEAD:TALLOWjCREATURE:FISH_HAKE:FATjCREATURE:FISH_HAKE:TALLOWjCREATURE:FISH_SEAHORSE:FATjCREATURE:FISH_SEAHORSE:TALLOWjCREATURE:FISH_GLASSEYE:FATjCREATURE:FISH_GLASSEYE:TALLOWj&CREATURE:FISH_PUFFER_WHITE_SPOTTED:FATj)CREATURE:FISH_PUFFER_WHITE_SPOTTED:TALLOWjCREATURE:FISH_SOLE:FATjCREATURE:FISH_SOLE:TALLOWjCREATURE:FISH_FLOUNDER:FATjCREATURE:FISH_FLOUNDER:TALLOWjCREATURE:FISH_MACKEREL:FATjCREATURE:FISH_MACKEREL:TALLOWj!CREATURE:JELLYFISH_SEA_NETTLE:FATj$CREATURE:JELLYFISH_SEA_NETTLE:TALLOWjCREATURE:SQUID:FATjCREATURE:SQUID:TALLOWjCREATURE:SQUID MAN:FATjCREATURE:SQUID MAN:TALLOWjCREATURE:GIGANTIC SQUID:FATjCREATURE:GIGANTIC SQUID:TALLOWjCREATURE:FISH_LUNGFISH:FATjCREATURE:FISH_LUNGFISH:TALLOWjCREATURE:FISH_LOACH_CLOWN:FATj CREATURE:FISH_LOACH_CLOWN:TALLOWj CREATURE:FISH_BULLHEAD_BROWN:FATj#CREATURE:FISH_BULLHEAD_BROWN:TALLOWj!CREATURE:FISH_BULLHEAD_YELLOW:FATj$CREATURE:FISH_BULLHEAD_YELLOW:TALLOWj CREATURE:FISH_BULLHEAD_BLACK:FATj#CREATURE:FISH_BULLHEAD_BLACK:TALLOWj"CREATURE:FISH_KNIFEFISH_BANDED:FATj%CREATURE:FISH_KNIFEFISH_BANDED:TALLOWjCREATURE:FISH_CHAR:FATjCREATURE:FISH_CHAR:TALLOWjCREATURE:FISH_TROUT_RAINBOW:FATj"CREATURE:FISH_TROUT_RAINBOW:TALLOWjCREATURE:FISH_MOLLY_SAILFIN:FATj"CREATURE:FISH_MOLLY_SAILFIN:TALLOWjCREATURE:FISH_GUPPY:FATjCREATURE:FISH_GUPPY:TALLOWjCREATURE:FISH_PERCH:FATjCREATURE:FISH_PERCH:TALLOWjCREATURE:DWARF:FATjCREATURE:DWARF:TALLOWjCREATURE:HUMAN:FATjCREATURE:HUMAN:TALLOWjCREATURE:ELF:FATjCREATURE:ELF:TALLOWjCREATURE:GOBLIN:FATjCREATURE:GOBLIN:TALLOWjCREATURE:KOBOLD:FATjCREATURE:KOBOLD:TALLOWjCREATURE:GREMLIN:FATjCREATURE:GREMLIN:TALLOWjCREATURE:TROLL:FATjCREATURE:TROLL:TALLOWjCREATURE:OGRE:FATjCREATURE:OGRE:TALLOWjCREATURE:UNICORN:FATjCREATURE:UNICORN:TALLOWjCREATURE:DRAGON:FATjCREATURE:DRAGON:TALLOWjCREATURE:SATYR:FATjCREATURE:SATYR:TALLOWjCREATURE:GIANT:FATjCREATURE:GIANT:TALLOWjCREATURE:CYCLOPS:FATjCREATURE:CYCLOPS:TALLOWjCREATURE:ETTIN:FATjCREATURE:ETTIN:TALLOWjCREATURE:MINOTAUR:FATjCREATURE:MINOTAUR:TALLOWjCREATURE:YETI:FATjCREATURE:YETI:TALLOWjCREATURE:SASQUATCH:FATjCREATURE:SASQUATCH:TALLOWjCREATURE:BLIZZARD_MAN:FATjCREATURE:BLIZZARD_MAN:TALLOWjCREATURE:WOLF_ICE:FATjCREATURE:WOLF_ICE:TALLOWjCREATURE:FAIRY:FATjCREATURE:FAIRY:TALLOWjCREATURE:PIXIE:FATjCREATURE:PIXIE:TALLOWjCREATURE:BEAK_DOG:FATjCREATURE:BEAK_DOG:TALLOWjCREATURE:GRIMELING:FATjCREATURE:GRIMELING:TALLOWjCREATURE:BLENDEC_FOUL:FATjCREATURE:BLENDEC_FOUL:TALLOWjCREATURE:STRANGLER:FATjCREATURE:STRANGLER:TALLOWjCREATURE:NIGHTWING:FATjCREATURE:NIGHTWING:TALLOWjCREATURE:HARPY:FATjCREATURE:HARPY:TALLOWjCREATURE:HYDRA:FATjCREATURE:HYDRA:TALLOWjCREATURE:MERPERSON:FATjCREATURE:MERPERSON:TALLOWjCREATURE:SEA_SERPENT:FATjCREATURE:SEA_SERPENT:TALLOWjCREATURE:SEA_MONSTER:FATjCREATURE:SEA_MONSTER:TALLOWjCREATURE:BIRD_ROC:FATjCREATURE:BIRD_ROC:TALLOWjCREATURE:CROCODILE_CAVE:FATjCREATURE:CROCODILE_CAVE:TALLOWjCREATURE:TOAD_GIANT_CAVE:FATjCREATURE:TOAD_GIANT_CAVE:TALLOWjCREATURE:OLM_GIANT:FATjCREATURE:OLM_GIANT:TALLOWjCREATURE:BAT_GIANT:FATjCREATURE:BAT_GIANT:TALLOWjCREATURE:RAT_GIANT:FATjCREATURE:RAT_GIANT:TALLOWjCREATURE:RAT_LARGE:FATjCREATURE:RAT_LARGE:TALLOWjCREATURE:MOLE_DOG_NAKED:FATjCREATURE:MOLE_DOG_NAKED:TALLOWjCREATURE:TROGLODYTE:FATjCREATURE:TROGLODYTE:TALLOWjCREATURE:MOLE_GIANT:FATjCREATURE:MOLE_GIANT:TALLOWjCREATURE:IMP_FIRE:FATjCREATURE:IMP_FIRE:TALLOWjCREATURE:SPIDER_CAVE_GIANT:FATj!CREATURE:SPIDER_CAVE_GIANT:TALLOWjCREATURE:SPIDER_CAVE:FATjCREATURE:SPIDER_CAVE:TALLOWjCREATURE:FISH_CAVE:FATjCREATURE:FISH_CAVE:TALLOWjCREATURE:CAVE_FISH_MAN:FATjCREATURE:CAVE_FISH_MAN:TALLOWjCREATURE:LOBSTER_CAVE:FATjCREATURE:LOBSTER_CAVE:TALLOWjCREATURE:OLM:FATjCREATURE:OLM:TALLOWjCREATURE:OLM_MAN:FATjCREATURE:OLM_MAN:TALLOWjCREATURE:BAT:FATjCREATURE:BAT:TALLOWjCREATURE:BAT_MAN:FATjCREATURE:BAT_MAN:TALLOWjCREATURE:MAGGOT_PURRING:FATjCREATURE:MAGGOT_PURRING:TALLOWjCREATURE:BIRD_SWALLOW_CAVE:FATj!CREATURE:BIRD_SWALLOW_CAVE:TALLOWjCREATURE:CAVE_SWALLOW_MAN:FATj CREATURE:CAVE_SWALLOW_MAN:TALLOWj$CREATURE:BIRD_SWALLOW_CAVE_GIANT:FATj'CREATURE:BIRD_SWALLOW_CAVE_GIANT:TALLOWjCREATURE:AMPHIBIAN_MAN:FATjCREATURE:AMPHIBIAN_MAN:TALLOWjCREATURE:REPTILE_MAN:FATjCREATURE:REPTILE_MAN:TALLOWjCREATURE:SERPENT_MAN:FATjCREATURE:SERPENT_MAN:TALLOWjCREATURE:ANT_MAN:FATjCREATURE:ANT_MAN:TALLOWjCREATURE:RODENT MAN:FATjCREATURE:RODENT MAN:TALLOWjCREATURE:WILD_BOAR:FATjCREATURE:WILD_BOAR:TALLOWjCREATURE:WILD_BOAR_MAN:FATjCREATURE:WILD_BOAR_MAN:TALLOWjCREATURE:GIANT_WILD_BOAR:FATjCREATURE:GIANT_WILD_BOAR:TALLOWjCREATURE:COYOTE:FATjCREATURE:COYOTE:TALLOWjCREATURE:COYOTE_MAN:FATjCREATURE:COYOTE_MAN:TALLOWjCREATURE:GIANT_COYOTE:FATjCREATURE:GIANT_COYOTE:TALLOWjCREATURE:KANGAROO:FATjCREATURE:KANGAROO:TALLOWjCREATURE:KANGAROO_MAN:FATjCREATURE:KANGAROO_MAN:TALLOWjCREATURE:GIANT_KANGAROO:FATjCREATURE:GIANT_KANGAROO:TALLOWjCREATURE:KOALA:FATjCREATURE:KOALA:TALLOWjCREATURE:KOALA_MAN:FATjCREATURE:KOALA_MAN:TALLOWjCREATURE:GIANT_KOALA:FATjCREATURE:GIANT_KOALA:TALLOWjCREATURE:ADDER:FATjCREATURE:ADDER:TALLOWjCREATURE:ADDER_MAN:FATjCREATURE:ADDER_MAN:TALLOWjCREATURE:GIANT_ADDER:FATjCREATURE:GIANT_ADDER:TALLOWjCREATURE:ECHIDNA:FATjCREATURE:ECHIDNA:TALLOWjCREATURE:ECHIDNA_MAN:FATjCREATURE:ECHIDNA_MAN:TALLOWjCREATURE:GIANT_ECHIDNA:FATjCREATURE:GIANT_ECHIDNA:TALLOWjCREATURE:PORCUPINE:FATjCREATURE:PORCUPINE:TALLOWjCREATURE:PORCUPINE_MAN:FATjCREATURE:PORCUPINE_MAN:TALLOWjCREATURE:GIANT_PORCUPINE:FATjCREATURE:GIANT_PORCUPINE:TALLOWjCREATURE:KINGSNAKE:FATjCREATURE:KINGSNAKE:TALLOWjCREATURE:KINGSNAKE_MAN:FATjCREATURE:KINGSNAKE_MAN:TALLOWjCREATURE:GIANT_KINGSNAKE:FATjCREATURE:GIANT_KINGSNAKE:TALLOWjCREATURE:GRAY_LANGUR:FATjCREATURE:GRAY_LANGUR:TALLOWjCREATURE:GRAY_LANGUR_MAN:FATjCREATURE:GRAY_LANGUR_MAN:TALLOWjCREATURE:GIANT_GRAY_LANGUR:FATj!CREATURE:GIANT_GRAY_LANGUR:TALLOWjCREATURE:BOBCAT:FATjCREATURE:BOBCAT:TALLOWjCREATURE:BOBCAT_MAN:FATjCREATURE:BOBCAT_MAN:TALLOWjCREATURE:GIANT_BOBCAT:FATjCREATURE:GIANT_BOBCAT:TALLOWjCREATURE:SKUNK:FATjCREATURE:SKUNK:TALLOWjCREATURE:SKUNK_MAN:FATjCREATURE:SKUNK_MAN:TALLOWjCREATURE:GIANT_SKUNK:FATjCREATURE:GIANT_SKUNK:TALLOWjCREATURE:GREEN_TREE_FROG:FATjCREATURE:GREEN_TREE_FROG:TALLOWj CREATURE:GREEN_TREE_FROG_MAN:FATj#CREATURE:GREEN_TREE_FROG_MAN:TALLOWj"CREATURE:GIANT_GREEN_TREE_FROG:FATj%CREATURE:GIANT_GREEN_TREE_FROG:TALLOWjCREATURE:HARE:FATjCREATURE:HARE:TALLOWjCREATURE:HARE_MAN:FATjCREATURE:HARE_MAN:TALLOWjCREATURE:GIANT_HARE:FATjCREATURE:GIANT_HARE:TALLOWjCREATURE:RATTLESNAKE:FATjCREATURE:RATTLESNAKE:TALLOWjCREATURE:RATTLESNAKE_MAN:FATjCREATURE:RATTLESNAKE_MAN:TALLOWjCREATURE:GIANT_RATTLESNAKE:FATj!CREATURE:GIANT_RATTLESNAKE:TALLOWjCREATURE:WEASEL:FATjCREATURE:WEASEL:TALLOWjCREATURE:WEASEL_MAN:FATjCREATURE:WEASEL_MAN:TALLOWjCREATURE:GIANT_WEASEL:FATjCREATURE:GIANT_WEASEL:TALLOWjCREATURE:COPPERHEAD_SNAKE:FATj CREATURE:COPPERHEAD_SNAKE:TALLOWj!CREATURE:COPPERHEAD_SNAKE_MAN:FATj$CREATURE:COPPERHEAD_SNAKE_MAN:TALLOWj#CREATURE:GIANT_COPPERHEAD_SNAKE:FATj&CREATURE:GIANT_COPPERHEAD_SNAKE:TALLOWjCREATURE:IBEX:FATjCREATURE:IBEX:TALLOWjCREATURE:IBEX_MAN:FATjCREATURE:IBEX_MAN:TALLOWjCREATURE:GIANT_IBEX:FATjCREATURE:GIANT_IBEX:TALLOWjCREATURE:WOMBAT:FATjCREATURE:WOMBAT:TALLOWjCREATURE:WOMBAT_MAN:FATjCREATURE:WOMBAT_MAN:TALLOWjCREATURE:GIANT_WOMBAT:FATjCREATURE:GIANT_WOMBAT:TALLOWjCREATURE:DINGO:FATjCREATURE:DINGO:TALLOWjCREATURE:DINGO_MAN:FATjCREATURE:DINGO_MAN:TALLOWjCREATURE:GIANT_DINGO:FATjCREATURE:GIANT_DINGO:TALLOWjCREATURE:COATI:FATjCREATURE:COATI:TALLOWjCREATURE:COATI_MAN:FATjCREATURE:COATI_MAN:TALLOWjCREATURE:GIANT_COATI:FATjCREATURE:GIANT_COATI:TALLOWjCREATURE:OPOSSUM:FATjCREATURE:OPOSSUM:TALLOWjCREATURE:OPOSSUM_MAN:FATjCREATURE:OPOSSUM_MAN:TALLOWjCREATURE:GIANT_OPOSSUM:FATjCREATURE:GIANT_OPOSSUM:TALLOWjCREATURE:MONGOOSE:FATjCREATURE:MONGOOSE:TALLOWjCREATURE:MONGOOSE_MAN:FATjCREATURE:MONGOOSE_MAN:TALLOWjCREATURE:GIANT_MONGOOSE:FATjCREATURE:GIANT_MONGOOSE:TALLOWjCREATURE:HYENA:FATjCREATURE:HYENA:TALLOWjCREATURE:HYENA_MAN:FATjCREATURE:HYENA_MAN:TALLOWjCREATURE:GIANT_HYENA:FATjCREATURE:GIANT_HYENA:TALLOWjCREATURE:ANACONDA:FATjCREATURE:ANACONDA:TALLOWjCREATURE:ANACONDA_MAN:FATjCREATURE:ANACONDA_MAN:TALLOWjCREATURE:GIANT_ANACONDA:FATjCREATURE:GIANT_ANACONDA:TALLOWjCREATURE:MONITOR_LIZARD:FATjCREATURE:MONITOR_LIZARD:TALLOWjCREATURE:MONITOR_LIZARD_MAN:FATj"CREATURE:MONITOR_LIZARD_MAN:TALLOWj!CREATURE:GIANT_MONITOR_LIZARD:FATj$CREATURE:GIANT_MONITOR_LIZARD:TALLOWjCREATURE:KING_COBRA:FATjCREATURE:KING_COBRA:TALLOWjCREATURE:KING_COBRA_MAN:FATjCREATURE:KING_COBRA_MAN:TALLOWjCREATURE:GIANT_KING_COBRA:FATj CREATURE:GIANT_KING_COBRA:TALLOWjCREATURE:OCELOT:FATjCREATURE:OCELOT:TALLOWjCREATURE:OCELOT_MAN:FATjCREATURE:OCELOT_MAN:TALLOWjCREATURE:GIANT_OCELOT:FATjCREATURE:GIANT_OCELOT:TALLOWjCREATURE:JACKAL:FATjCREATURE:JACKAL:TALLOWjCREATURE:JACKAL_MAN:FATjCREATURE:JACKAL_MAN:TALLOWjCREATURE:GIANT_JACKAL:FATjCREATURE:GIANT_JACKAL:TALLOWjCREATURE:CAPUCHIN:FATjCREATURE:CAPUCHIN:TALLOWjCREATURE:CAPUCHIN_MAN:FATjCREATURE:CAPUCHIN_MAN:TALLOWjCREATURE:GIANT_CAPUCHIN:FATjCREATURE:GIANT_CAPUCHIN:TALLOWjCREATURE:SLOTH:FATjCREATURE:SLOTH:TALLOWjCREATURE:SLOTH_MAN:FATjCREATURE:SLOTH_MAN:TALLOWjCREATURE:GIANT_SLOTH:FATjCREATURE:GIANT_SLOTH:TALLOWjCREATURE:SPIDER_MONKEY:FATjCREATURE:SPIDER_MONKEY:TALLOWjCREATURE:SPIDER_MONKEY_MAN:FATj!CREATURE:SPIDER_MONKEY_MAN:TALLOWj CREATURE:GIANT_SPIDER_MONKEY:FATj#CREATURE:GIANT_SPIDER_MONKEY:TALLOWjCREATURE:PANGOLIN:FATjCREATURE:PANGOLIN:TALLOWjCREATURE:PANGOLIN_MAN:FATjCREATURE:PANGOLIN_MAN:TALLOWjCREATURE:GIANT_PANGOLIN:FATjCREATURE:GIANT_PANGOLIN:TALLOWjCREATURE:BLACK_MAMBA:FATjCREATURE:BLACK_MAMBA:TALLOWjCREATURE:BLACK_MAMBA_MAN:FATjCREATURE:BLACK_MAMBA_MAN:TALLOWjCREATURE:GIANT_BLACK_MAMBA:FATj!CREATURE:GIANT_BLACK_MAMBA:TALLOWjCREATURE:BEAR_SLOTH:FATjCREATURE:BEAR_SLOTH:TALLOWjCREATURE:SLOTH_BEAR_MAN:FATjCREATURE:SLOTH_BEAR_MAN:TALLOWjCREATURE:GIANT_SLOTH_BEAR:FATj CREATURE:GIANT_SLOTH_BEAR:TALLOWjCREATURE:AYE-AYE:FATjCREATURE:AYE-AYE:TALLOWjCREATURE:AYE-AYE_MAN:FATjCREATURE:AYE-AYE_MAN:TALLOWjCREATURE:GIANT_AYE-AYE:FATjCREATURE:GIANT_AYE-AYE:TALLOWjCREATURE:BUSHMASTER:FATjCREATURE:BUSHMASTER:TALLOWjCREATURE:BUSHMASTER_MAN:FATjCREATURE:BUSHMASTER_MAN:TALLOWjCREATURE:GIANT_BUSHMASTER:FATj CREATURE:GIANT_BUSHMASTER:TALLOWjCREATURE:PYTHON:FATjCREATURE:PYTHON:TALLOWjCREATURE:PYTHON_MAN:FATjCREATURE:PYTHON_MAN:TALLOWjCREATURE:GIANT_PYTHON:FATjCREATURE:GIANT_PYTHON:TALLOWjCREATURE:TAPIR:FATjCREATURE:TAPIR:TALLOWjCREATURE:TAPIR_MAN:FATjCREATURE:TAPIR_MAN:TALLOWjCREATURE:GIANT_TAPIR:FATjCREATURE:GIANT_TAPIR:TALLOWjCREATURE:IMPALA:FATjCREATURE:IMPALA:TALLOWjCREATURE:IMPALA_MAN:FATjCREATURE:IMPALA_MAN:TALLOWjCREATURE:GIANT_IMPALA:FATjCREATURE:GIANT_IMPALA:TALLOWjCREATURE:AARDVARK:FATjCREATURE:AARDVARK:TALLOWjCREATURE:AARDVARK_MAN:FATjCREATURE:AARDVARK_MAN:TALLOWjCREATURE:GIANT_AARDVARK:FATjCREATURE:GIANT_AARDVARK:TALLOWjCREATURE:LION_TAMARIN:FATjCREATURE:LION_TAMARIN:TALLOWjCREATURE:LION_TAMARIN_MAN:FATj CREATURE:LION_TAMARIN_MAN:TALLOWjCREATURE:GIANT_LION_TAMARIN:FATj"CREATURE:GIANT_LION_TAMARIN:TALLOWjCREATURE:STOAT:FATjCREATURE:STOAT:TALLOWjCREATURE:STOAT_MAN:FATjCREATURE:STOAT_MAN:TALLOWjCREATURE:GIANT_STOAT:FATjCREATURE:GIANT_STOAT:TALLOWjCREATURE:LYNX:FATjCREATURE:LYNX:TALLOWjCREATURE:LYNX_MAN:FATjCREATURE:LYNX_MAN:TALLOWjCREATURE:GIANT_LYNX:FATjCREATURE:GIANT_LYNX:TALLOWjCREATURE:GNOLL:FATjCREATURE:GNOLL:TALLOWjCREATURE:NAGA:FATjCREATURE:NAGA:TALLOWjCREATURE:FORGOTTEN_BEAST_2:FATj!CREATURE:FORGOTTEN_BEAST_2:TALLOWjCREATURE:FORGOTTEN_BEAST_4:FATj!CREATURE:FORGOTTEN_BEAST_4:TALLOWjCREATURE:FORGOTTEN_BEAST_5:FATj!CREATURE:FORGOTTEN_BEAST_5:TALLOWjCREATURE:FORGOTTEN_BEAST_6:FATj!CREATURE:FORGOTTEN_BEAST_6:TALLOWjCREATURE:FORGOTTEN_BEAST_7:FATj!CREATURE:FORGOTTEN_BEAST_7:TALLOWjCREATURE:FORGOTTEN_BEAST_10:FATj"CREATURE:FORGOTTEN_BEAST_10:TALLOWjCREATURE:FORGOTTEN_BEAST_12:FATj"CREATURE:FORGOTTEN_BEAST_12:TALLOWjCREATURE:FORGOTTEN_BEAST_13:FATj"CREATURE:FORGOTTEN_BEAST_13:TALLOWjCREATURE:FORGOTTEN_BEAST_16:FATj"CREATURE:FORGOTTEN_BEAST_16:TALLOWjCREATURE:FORGOTTEN_BEAST_17:FATj"CREATURE:FORGOTTEN_BEAST_17:TALLOWjCREATURE:FORGOTTEN_BEAST_18:FATj"CREATURE:FORGOTTEN_BEAST_18:TALLOWjCREATURE:FORGOTTEN_BEAST_19:FATj"CREATURE:FORGOTTEN_BEAST_19:TALLOWjCREATURE:FORGOTTEN_BEAST_20:FATj"CREATURE:FORGOTTEN_BEAST_20:TALLOWjCREATURE:FORGOTTEN_BEAST_22:FATj"CREATURE:FORGOTTEN_BEAST_22:TALLOWjCREATURE:FORGOTTEN_BEAST_23:FATj"CREATURE:FORGOTTEN_BEAST_23:TALLOWjCREATURE:FORGOTTEN_BEAST_24:FATj"CREATURE:FORGOTTEN_BEAST_24:TALLOWjCREATURE:FORGOTTEN_BEAST_25:FATj"CREATURE:FORGOTTEN_BEAST_25:TALLOWjCREATURE:FORGOTTEN_BEAST_26:FATj"CREATURE:FORGOTTEN_BEAST_26:TALLOWjCREATURE:FORGOTTEN_BEAST_27:FATj"CREATURE:FORGOTTEN_BEAST_27:TALLOWjCREATURE:FORGOTTEN_BEAST_28:FATj"CREATURE:FORGOTTEN_BEAST_28:TALLOWjCREATURE:FORGOTTEN_BEAST_29:FATj"CREATURE:FORGOTTEN_BEAST_29:TALLOWjCREATURE:FORGOTTEN_BEAST_32:FATj"CREATURE:FORGOTTEN_BEAST_32:TALLOWjCREATURE:FORGOTTEN_BEAST_33:FATj"CREATURE:FORGOTTEN_BEAST_33:TALLOWjCREATURE:FORGOTTEN_BEAST_34:FATj"CREATURE:FORGOTTEN_BEAST_34:TALLOWjCREATURE:FORGOTTEN_BEAST_35:FATj"CREATURE:FORGOTTEN_BEAST_35:TALLOWjCREATURE:FORGOTTEN_BEAST_36:FATj"CREATURE:FORGOTTEN_BEAST_36:TALLOWjCREATURE:FORGOTTEN_BEAST_39:FATj"CREATURE:FORGOTTEN_BEAST_39:TALLOWjCREATURE:FORGOTTEN_BEAST_41:FATj"CREATURE:FORGOTTEN_BEAST_41:TALLOWjCREATURE:FORGOTTEN_BEAST_42:FATj"CREATURE:FORGOTTEN_BEAST_42:TALLOWjCREATURE:FORGOTTEN_BEAST_43:FATj"CREATURE:FORGOTTEN_BEAST_43:TALLOWjCREATURE:FORGOTTEN_BEAST_44:FATj"CREATURE:FORGOTTEN_BEAST_44:TALLOWjCREATURE:FORGOTTEN_BEAST_45:FATj"CREATURE:FORGOTTEN_BEAST_45:TALLOWjCREATURE:FORGOTTEN_BEAST_47:FATj"CREATURE:FORGOTTEN_BEAST_47:TALLOWjCREATURE:FORGOTTEN_BEAST_50:FATj"CREATURE:FORGOTTEN_BEAST_50:TALLOWjCREATURE:FORGOTTEN_BEAST_52:FATj"CREATURE:FORGOTTEN_BEAST_52:TALLOWjCREATURE:FORGOTTEN_BEAST_53:FATj"CREATURE:FORGOTTEN_BEAST_53:TALLOWjCREATURE:FORGOTTEN_BEAST_55:FATj"CREATURE:FORGOTTEN_BEAST_55:TALLOWjCREATURE:FORGOTTEN_BEAST_56:FATj"CREATURE:FORGOTTEN_BEAST_56:TALLOWjCREATURE:FORGOTTEN_BEAST_58:FATj"CREATURE:FORGOTTEN_BEAST_58:TALLOWjCREATURE:FORGOTTEN_BEAST_59:FATj"CREATURE:FORGOTTEN_BEAST_59:TALLOWjCREATURE:FORGOTTEN_BEAST_60:FATj"CREATURE:FORGOTTEN_BEAST_60:TALLOWjCREATURE:FORGOTTEN_BEAST_61:FATj"CREATURE:FORGOTTEN_BEAST_61:TALLOWjCREATURE:FORGOTTEN_BEAST_64:FATj"CREATURE:FORGOTTEN_BEAST_64:TALLOWjCREATURE:FORGOTTEN_BEAST_66:FATj"CREATURE:FORGOTTEN_BEAST_66:TALLOWjCREATURE:FORGOTTEN_BEAST_67:FATj"CREATURE:FORGOTTEN_BEAST_67:TALLOWjCREATURE:FORGOTTEN_BEAST_69:FATj"CREATURE:FORGOTTEN_BEAST_69:TALLOWjCREATURE:FORGOTTEN_BEAST_71:FATj"CREATURE:FORGOTTEN_BEAST_71:TALLOWjCREATURE:FORGOTTEN_BEAST_72:FATj"CREATURE:FORGOTTEN_BEAST_72:TALLOWjCREATURE:FORGOTTEN_BEAST_73:FATj"CREATURE:FORGOTTEN_BEAST_73:TALLOWjCREATURE:FORGOTTEN_BEAST_74:FATj"CREATURE:FORGOTTEN_BEAST_74:TALLOWjCREATURE:FORGOTTEN_BEAST_75:FATj"CREATURE:FORGOTTEN_BEAST_75:TALLOWjCREATURE:FORGOTTEN_BEAST_78:FATj"CREATURE:FORGOTTEN_BEAST_78:TALLOWjCREATURE:FORGOTTEN_BEAST_80:FATj"CREATURE:FORGOTTEN_BEAST_80:TALLOWjCREATURE:FORGOTTEN_BEAST_81:FATj"CREATURE:FORGOTTEN_BEAST_81:TALLOWjCREATURE:FORGOTTEN_BEAST_82:FATj"CREATURE:FORGOTTEN_BEAST_82:TALLOWjCREATURE:FORGOTTEN_BEAST_83:FATj"CREATURE:FORGOTTEN_BEAST_83:TALLOWjCREATURE:FORGOTTEN_BEAST_84:FATj"CREATURE:FORGOTTEN_BEAST_84:TALLOWjCREATURE:FORGOTTEN_BEAST_86:FATj"CREATURE:FORGOTTEN_BEAST_86:TALLOWjCREATURE:FORGOTTEN_BEAST_87:FATj"CREATURE:FORGOTTEN_BEAST_87:TALLOWjCREATURE:FORGOTTEN_BEAST_89:FATj"CREATURE:FORGOTTEN_BEAST_89:TALLOWjCREATURE:FORGOTTEN_BEAST_90:FATj"CREATURE:FORGOTTEN_BEAST_90:TALLOWjCREATURE:FORGOTTEN_BEAST_92:FATj"CREATURE:FORGOTTEN_BEAST_92:TALLOWjCREATURE:FORGOTTEN_BEAST_94:FATj"CREATURE:FORGOTTEN_BEAST_94:TALLOWjCREATURE:FORGOTTEN_BEAST_95:FATj"CREATURE:FORGOTTEN_BEAST_95:TALLOWjCREATURE:FORGOTTEN_BEAST_96:FATj"CREATURE:FORGOTTEN_BEAST_96:TALLOWjCREATURE:FORGOTTEN_BEAST_97:FATj"CREATURE:FORGOTTEN_BEAST_97:TALLOWjCREATURE:FORGOTTEN_BEAST_98:FATj"CREATURE:FORGOTTEN_BEAST_98:TALLOWj CREATURE:FORGOTTEN_BEAST_100:FATj#CREATURE:FORGOTTEN_BEAST_100:TALLOWj CREATURE:FORGOTTEN_BEAST_105:FATj#CREATURE:FORGOTTEN_BEAST_105:TALLOWj CREATURE:FORGOTTEN_BEAST_106:FATj#CREATURE:FORGOTTEN_BEAST_106:TALLOWj CREATURE:FORGOTTEN_BEAST_107:FATj#CREATURE:FORGOTTEN_BEAST_107:TALLOWj CREATURE:FORGOTTEN_BEAST_108:FATj#CREATURE:FORGOTTEN_BEAST_108:TALLOWj CREATURE:FORGOTTEN_BEAST_109:FATj#CREATURE:FORGOTTEN_BEAST_109:TALLOWj CREATURE:FORGOTTEN_BEAST_111:FATj#CREATURE:FORGOTTEN_BEAST_111:TALLOWj CREATURE:FORGOTTEN_BEAST_112:FATj#CREATURE:FORGOTTEN_BEAST_112:TALLOWj CREATURE:FORGOTTEN_BEAST_113:FATj#CREATURE:FORGOTTEN_BEAST_113:TALLOWj CREATURE:FORGOTTEN_BEAST_114:FATj#CREATURE:FORGOTTEN_BEAST_114:TALLOWj CREATURE:FORGOTTEN_BEAST_115:FATj#CREATURE:FORGOTTEN_BEAST_115:TALLOWj CREATURE:FORGOTTEN_BEAST_116:FATj#CREATURE:FORGOTTEN_BEAST_116:TALLOWj CREATURE:FORGOTTEN_BEAST_117:FATj#CREATURE:FORGOTTEN_BEAST_117:TALLOWj CREATURE:FORGOTTEN_BEAST_118:FATj#CREATURE:FORGOTTEN_BEAST_118:TALLOWj CREATURE:FORGOTTEN_BEAST_119:FATj#CREATURE:FORGOTTEN_BEAST_119:TALLOWj CREATURE:FORGOTTEN_BEAST_120:FATj#CREATURE:FORGOTTEN_BEAST_120:TALLOWj CREATURE:FORGOTTEN_BEAST_122:FATj#CREATURE:FORGOTTEN_BEAST_122:TALLOWj CREATURE:FORGOTTEN_BEAST_123:FATj#CREATURE:FORGOTTEN_BEAST_123:TALLOWj CREATURE:FORGOTTEN_BEAST_124:FATj#CREATURE:FORGOTTEN_BEAST_124:TALLOWj CREATURE:FORGOTTEN_BEAST_125:FATj#CREATURE:FORGOTTEN_BEAST_125:TALLOWj CREATURE:FORGOTTEN_BEAST_127:FATj#CREATURE:FORGOTTEN_BEAST_127:TALLOWj CREATURE:FORGOTTEN_BEAST_128:FATj#CREATURE:FORGOTTEN_BEAST_128:TALLOWj CREATURE:FORGOTTEN_BEAST_130:FATj#CREATURE:FORGOTTEN_BEAST_130:TALLOWj CREATURE:FORGOTTEN_BEAST_131:FATj#CREATURE:FORGOTTEN_BEAST_131:TALLOWj CREATURE:FORGOTTEN_BEAST_132:FATj#CREATURE:FORGOTTEN_BEAST_132:TALLOWj CREATURE:FORGOTTEN_BEAST_133:FATj#CREATURE:FORGOTTEN_BEAST_133:TALLOWj CREATURE:FORGOTTEN_BEAST_134:FATj#CREATURE:FORGOTTEN_BEAST_134:TALLOWj CREATURE:FORGOTTEN_BEAST_135:FATj#CREATURE:FORGOTTEN_BEAST_135:TALLOWj CREATURE:FORGOTTEN_BEAST_137:FATj#CREATURE:FORGOTTEN_BEAST_137:TALLOWj CREATURE:FORGOTTEN_BEAST_138:FATj#CREATURE:FORGOTTEN_BEAST_138:TALLOWj CREATURE:FORGOTTEN_BEAST_139:FATj#CREATURE:FORGOTTEN_BEAST_139:TALLOWj CREATURE:FORGOTTEN_BEAST_141:FATj#CREATURE:FORGOTTEN_BEAST_141:TALLOWj CREATURE:FORGOTTEN_BEAST_142:FATj#CREATURE:FORGOTTEN_BEAST_142:TALLOWj CREATURE:FORGOTTEN_BEAST_144:FATj#CREATURE:FORGOTTEN_BEAST_144:TALLOWj CREATURE:FORGOTTEN_BEAST_146:FATj#CREATURE:FORGOTTEN_BEAST_146:TALLOWj CREATURE:FORGOTTEN_BEAST_148:FATj#CREATURE:FORGOTTEN_BEAST_148:TALLOWj CREATURE:FORGOTTEN_BEAST_149:FATj#CREATURE:FORGOTTEN_BEAST_149:TALLOWj CREATURE:FORGOTTEN_BEAST_150:FATj#CREATURE:FORGOTTEN_BEAST_150:TALLOWj CREATURE:FORGOTTEN_BEAST_152:FATj#CREATURE:FORGOTTEN_BEAST_152:TALLOWj CREATURE:FORGOTTEN_BEAST_154:FATj#CREATURE:FORGOTTEN_BEAST_154:TALLOWj CREATURE:FORGOTTEN_BEAST_156:FATj#CREATURE:FORGOTTEN_BEAST_156:TALLOWj CREATURE:FORGOTTEN_BEAST_157:FATj#CREATURE:FORGOTTEN_BEAST_157:TALLOWj CREATURE:FORGOTTEN_BEAST_158:FATj#CREATURE:FORGOTTEN_BEAST_158:TALLOWj CREATURE:FORGOTTEN_BEAST_159:FATj#CREATURE:FORGOTTEN_BEAST_159:TALLOWj CREATURE:FORGOTTEN_BEAST_161:FATj#CREATURE:FORGOTTEN_BEAST_161:TALLOWj CREATURE:FORGOTTEN_BEAST_162:FATj#CREATURE:FORGOTTEN_BEAST_162:TALLOWj CREATURE:FORGOTTEN_BEAST_163:FATj#CREATURE:FORGOTTEN_BEAST_163:TALLOWj CREATURE:FORGOTTEN_BEAST_165:FATj#CREATURE:FORGOTTEN_BEAST_165:TALLOWj CREATURE:FORGOTTEN_BEAST_167:FATj#CREATURE:FORGOTTEN_BEAST_167:TALLOWj CREATURE:FORGOTTEN_BEAST_168:FATj#CREATURE:FORGOTTEN_BEAST_168:TALLOWj CREATURE:FORGOTTEN_BEAST_169:FATj#CREATURE:FORGOTTEN_BEAST_169:TALLOWj CREATURE:FORGOTTEN_BEAST_170:FATj#CREATURE:FORGOTTEN_BEAST_170:TALLOWj CREATURE:FORGOTTEN_BEAST_171:FATj#CREATURE:FORGOTTEN_BEAST_171:TALLOWj CREATURE:FORGOTTEN_BEAST_172:FATj#CREATURE:FORGOTTEN_BEAST_172:TALLOWj CREATURE:FORGOTTEN_BEAST_173:FATj#CREATURE:FORGOTTEN_BEAST_173:TALLOWj CREATURE:FORGOTTEN_BEAST_176:FATj#CREATURE:FORGOTTEN_BEAST_176:TALLOWj CREATURE:FORGOTTEN_BEAST_177:FATj#CREATURE:FORGOTTEN_BEAST_177:TALLOWj CREATURE:FORGOTTEN_BEAST_178:FATj#CREATURE:FORGOTTEN_BEAST_178:TALLOWj CREATURE:FORGOTTEN_BEAST_179:FATj#CREATURE:FORGOTTEN_BEAST_179:TALLOWj CREATURE:FORGOTTEN_BEAST_180:FATj#CREATURE:FORGOTTEN_BEAST_180:TALLOWj CREATURE:FORGOTTEN_BEAST_181:FATj#CREATURE:FORGOTTEN_BEAST_181:TALLOWj CREATURE:FORGOTTEN_BEAST_182:FATj#CREATURE:FORGOTTEN_BEAST_182:TALLOWj CREATURE:FORGOTTEN_BEAST_183:FATj#CREATURE:FORGOTTEN_BEAST_183:TALLOWj CREATURE:FORGOTTEN_BEAST_184:FATj#CREATURE:FORGOTTEN_BEAST_184:TALLOWj CREATURE:FORGOTTEN_BEAST_185:FATj#CREATURE:FORGOTTEN_BEAST_185:TALLOWj CREATURE:FORGOTTEN_BEAST_186:FATj#CREATURE:FORGOTTEN_BEAST_186:TALLOWj CREATURE:FORGOTTEN_BEAST_188:FATj#CREATURE:FORGOTTEN_BEAST_188:TALLOWj CREATURE:FORGOTTEN_BEAST_189:FATj#CREATURE:FORGOTTEN_BEAST_189:TALLOWj CREATURE:FORGOTTEN_BEAST_190:FATj#CREATURE:FORGOTTEN_BEAST_190:TALLOWj CREATURE:FORGOTTEN_BEAST_191:FATj#CREATURE:FORGOTTEN_BEAST_191:TALLOWj CREATURE:FORGOTTEN_BEAST_193:FATj#CREATURE:FORGOTTEN_BEAST_193:TALLOWj CREATURE:FORGOTTEN_BEAST_194:FATj#CREATURE:FORGOTTEN_BEAST_194:TALLOWj CREATURE:FORGOTTEN_BEAST_195:FATj#CREATURE:FORGOTTEN_BEAST_195:TALLOWj CREATURE:FORGOTTEN_BEAST_196:FATj#CREATURE:FORGOTTEN_BEAST_196:TALLOWj CREATURE:FORGOTTEN_BEAST_197:FATj#CREATURE:FORGOTTEN_BEAST_197:TALLOWj CREATURE:FORGOTTEN_BEAST_199:FATj#CREATURE:FORGOTTEN_BEAST_199:TALLOWj CREATURE:FORGOTTEN_BEAST_200:FATj#CREATURE:FORGOTTEN_BEAST_200:TALLOWj CREATURE:FORGOTTEN_BEAST_201:FATj#CREATURE:FORGOTTEN_BEAST_201:TALLOWj CREATURE:FORGOTTEN_BEAST_204:FATj#CREATURE:FORGOTTEN_BEAST_204:TALLOWj CREATURE:FORGOTTEN_BEAST_205:FATj#CREATURE:FORGOTTEN_BEAST_205:TALLOWj CREATURE:FORGOTTEN_BEAST_206:FATj#CREATURE:FORGOTTEN_BEAST_206:TALLOWj CREATURE:FORGOTTEN_BEAST_207:FATj#CREATURE:FORGOTTEN_BEAST_207:TALLOWj CREATURE:FORGOTTEN_BEAST_208:FATj#CREATURE:FORGOTTEN_BEAST_208:TALLOWj CREATURE:FORGOTTEN_BEAST_209:FATj#CREATURE:FORGOTTEN_BEAST_209:TALLOWj CREATURE:FORGOTTEN_BEAST_210:FATj#CREATURE:FORGOTTEN_BEAST_210:TALLOWj CREATURE:FORGOTTEN_BEAST_211:FATj#CREATURE:FORGOTTEN_BEAST_211:TALLOWj CREATURE:FORGOTTEN_BEAST_212:FATj#CREATURE:FORGOTTEN_BEAST_212:TALLOWj CREATURE:FORGOTTEN_BEAST_213:FATj#CREATURE:FORGOTTEN_BEAST_213:TALLOWj CREATURE:FORGOTTEN_BEAST_214:FATj#CREATURE:FORGOTTEN_BEAST_214:TALLOWj CREATURE:FORGOTTEN_BEAST_215:FATj#CREATURE:FORGOTTEN_BEAST_215:TALLOWj CREATURE:FORGOTTEN_BEAST_216:FATj#CREATURE:FORGOTTEN_BEAST_216:TALLOWj CREATURE:FORGOTTEN_BEAST_217:FATj#CREATURE:FORGOTTEN_BEAST_217:TALLOWj CREATURE:FORGOTTEN_BEAST_218:FATj#CREATURE:FORGOTTEN_BEAST_218:TALLOWj CREATURE:FORGOTTEN_BEAST_220:FATj#CREATURE:FORGOTTEN_BEAST_220:TALLOWj CREATURE:FORGOTTEN_BEAST_221:FATj#CREATURE:FORGOTTEN_BEAST_221:TALLOWj CREATURE:FORGOTTEN_BEAST_224:FATj#CREATURE:FORGOTTEN_BEAST_224:TALLOWj CREATURE:FORGOTTEN_BEAST_225:FATj#CREATURE:FORGOTTEN_BEAST_225:TALLOWj CREATURE:FORGOTTEN_BEAST_228:FATj#CREATURE:FORGOTTEN_BEAST_228:TALLOWj CREATURE:FORGOTTEN_BEAST_231:FATj#CREATURE:FORGOTTEN_BEAST_231:TALLOWj CREATURE:FORGOTTEN_BEAST_232:FATj#CREATURE:FORGOTTEN_BEAST_232:TALLOWj CREATURE:FORGOTTEN_BEAST_235:FATj#CREATURE:FORGOTTEN_BEAST_235:TALLOWj CREATURE:FORGOTTEN_BEAST_236:FATj#CREATURE:FORGOTTEN_BEAST_236:TALLOWj CREATURE:FORGOTTEN_BEAST_237:FATj#CREATURE:FORGOTTEN_BEAST_237:TALLOWj CREATURE:FORGOTTEN_BEAST_239:FATj#CREATURE:FORGOTTEN_BEAST_239:TALLOWj CREATURE:FORGOTTEN_BEAST_240:FATj#CREATURE:FORGOTTEN_BEAST_240:TALLOWj CREATURE:FORGOTTEN_BEAST_242:FATj#CREATURE:FORGOTTEN_BEAST_242:TALLOWj CREATURE:FORGOTTEN_BEAST_243:FATj#CREATURE:FORGOTTEN_BEAST_243:TALLOWj CREATURE:FORGOTTEN_BEAST_244:FATj#CREATURE:FORGOTTEN_BEAST_244:TALLOWj CREATURE:FORGOTTEN_BEAST_245:FATj#CREATURE:FORGOTTEN_BEAST_245:TALLOWj CREATURE:FORGOTTEN_BEAST_246:FATj#CREATURE:FORGOTTEN_BEAST_246:TALLOWj CREATURE:FORGOTTEN_BEAST_247:FATj#CREATURE:FORGOTTEN_BEAST_247:TALLOWj CREATURE:FORGOTTEN_BEAST_248:FATj#CREATURE:FORGOTTEN_BEAST_248:TALLOWj CREATURE:FORGOTTEN_BEAST_249:FATj#CREATURE:FORGOTTEN_BEAST_249:TALLOWj CREATURE:FORGOTTEN_BEAST_253:FATj#CREATURE:FORGOTTEN_BEAST_253:TALLOWj CREATURE:FORGOTTEN_BEAST_255:FATj#CREATURE:FORGOTTEN_BEAST_255:TALLOWj CREATURE:FORGOTTEN_BEAST_256:FATj#CREATURE:FORGOTTEN_BEAST_256:TALLOWj CREATURE:FORGOTTEN_BEAST_259:FATj#CREATURE:FORGOTTEN_BEAST_259:TALLOWj CREATURE:FORGOTTEN_BEAST_260:FATj#CREATURE:FORGOTTEN_BEAST_260:TALLOWj CREATURE:FORGOTTEN_BEAST_263:FATj#CREATURE:FORGOTTEN_BEAST_263:TALLOWj CREATURE:FORGOTTEN_BEAST_264:FATj#CREATURE:FORGOTTEN_BEAST_264:TALLOWj CREATURE:FORGOTTEN_BEAST_265:FATj#CREATURE:FORGOTTEN_BEAST_265:TALLOWj CREATURE:FORGOTTEN_BEAST_266:FATj#CREATURE:FORGOTTEN_BEAST_266:TALLOWj CREATURE:FORGOTTEN_BEAST_268:FATj#CREATURE:FORGOTTEN_BEAST_268:TALLOWj CREATURE:FORGOTTEN_BEAST_269:FATj#CREATURE:FORGOTTEN_BEAST_269:TALLOWj CREATURE:FORGOTTEN_BEAST_270:FATj#CREATURE:FORGOTTEN_BEAST_270:TALLOWj CREATURE:FORGOTTEN_BEAST_271:FATj#CREATURE:FORGOTTEN_BEAST_271:TALLOWj CREATURE:FORGOTTEN_BEAST_272:FATj#CREATURE:FORGOTTEN_BEAST_272:TALLOWj CREATURE:FORGOTTEN_BEAST_273:FATj#CREATURE:FORGOTTEN_BEAST_273:TALLOWj CREATURE:FORGOTTEN_BEAST_274:FATj#CREATURE:FORGOTTEN_BEAST_274:TALLOWj CREATURE:FORGOTTEN_BEAST_275:FATj#CREATURE:FORGOTTEN_BEAST_275:TALLOWj CREATURE:FORGOTTEN_BEAST_276:FATj#CREATURE:FORGOTTEN_BEAST_276:TALLOWj CREATURE:FORGOTTEN_BEAST_277:FATj#CREATURE:FORGOTTEN_BEAST_277:TALLOWj CREATURE:FORGOTTEN_BEAST_279:FATj#CREATURE:FORGOTTEN_BEAST_279:TALLOWj CREATURE:FORGOTTEN_BEAST_280:FATj#CREATURE:FORGOTTEN_BEAST_280:TALLOWj CREATURE:FORGOTTEN_BEAST_281:FATj#CREATURE:FORGOTTEN_BEAST_281:TALLOWj CREATURE:FORGOTTEN_BEAST_282:FATj#CREATURE:FORGOTTEN_BEAST_282:TALLOWj CREATURE:FORGOTTEN_BEAST_283:FATj#CREATURE:FORGOTTEN_BEAST_283:TALLOWj CREATURE:FORGOTTEN_BEAST_285:FATj#CREATURE:FORGOTTEN_BEAST_285:TALLOWj CREATURE:FORGOTTEN_BEAST_286:FATj#CREATURE:FORGOTTEN_BEAST_286:TALLOWj CREATURE:FORGOTTEN_BEAST_287:FATj#CREATURE:FORGOTTEN_BEAST_287:TALLOWj CREATURE:FORGOTTEN_BEAST_288:FATj#CREATURE:FORGOTTEN_BEAST_288:TALLOWj CREATURE:FORGOTTEN_BEAST_289:FATj#CREATURE:FORGOTTEN_BEAST_289:TALLOWj CREATURE:FORGOTTEN_BEAST_290:FATj#CREATURE:FORGOTTEN_BEAST_290:TALLOWj CREATURE:FORGOTTEN_BEAST_293:FATj#CREATURE:FORGOTTEN_BEAST_293:TALLOWj CREATURE:FORGOTTEN_BEAST_295:FATj#CREATURE:FORGOTTEN_BEAST_295:TALLOWj CREATURE:FORGOTTEN_BEAST_297:FATj#CREATURE:FORGOTTEN_BEAST_297:TALLOWj CREATURE:FORGOTTEN_BEAST_300:FATj#CREATURE:FORGOTTEN_BEAST_300:TALLOWj CREATURE:FORGOTTEN_BEAST_302:FATj#CREATURE:FORGOTTEN_BEAST_302:TALLOWj CREATURE:FORGOTTEN_BEAST_306:FATj#CREATURE:FORGOTTEN_BEAST_306:TALLOWj CREATURE:FORGOTTEN_BEAST_307:FATj#CREATURE:FORGOTTEN_BEAST_307:TALLOWj CREATURE:FORGOTTEN_BEAST_310:FATj#CREATURE:FORGOTTEN_BEAST_310:TALLOWj CREATURE:FORGOTTEN_BEAST_311:FATj#CREATURE:FORGOTTEN_BEAST_311:TALLOWj CREATURE:FORGOTTEN_BEAST_312:FATj#CREATURE:FORGOTTEN_BEAST_312:TALLOWj CREATURE:FORGOTTEN_BEAST_314:FATj#CREATURE:FORGOTTEN_BEAST_314:TALLOWj CREATURE:FORGOTTEN_BEAST_316:FATj#CREATURE:FORGOTTEN_BEAST_316:TALLOWj CREATURE:FORGOTTEN_BEAST_317:FATj#CREATURE:FORGOTTEN_BEAST_317:TALLOWj CREATURE:FORGOTTEN_BEAST_318:FATj#CREATURE:FORGOTTEN_BEAST_318:TALLOWj CREATURE:FORGOTTEN_BEAST_320:FATj#CREATURE:FORGOTTEN_BEAST_320:TALLOWj CREATURE:FORGOTTEN_BEAST_321:FATj#CREATURE:FORGOTTEN_BEAST_321:TALLOWj CREATURE:FORGOTTEN_BEAST_322:FATj#CREATURE:FORGOTTEN_BEAST_322:TALLOWj CREATURE:FORGOTTEN_BEAST_323:FATj#CREATURE:FORGOTTEN_BEAST_323:TALLOWj CREATURE:FORGOTTEN_BEAST_324:FATj#CREATURE:FORGOTTEN_BEAST_324:TALLOWj CREATURE:FORGOTTEN_BEAST_325:FATj#CREATURE:FORGOTTEN_BEAST_325:TALLOWj CREATURE:FORGOTTEN_BEAST_326:FATj#CREATURE:FORGOTTEN_BEAST_326:TALLOWj CREATURE:FORGOTTEN_BEAST_327:FATj#CREATURE:FORGOTTEN_BEAST_327:TALLOWj CREATURE:FORGOTTEN_BEAST_328:FATj#CREATURE:FORGOTTEN_BEAST_328:TALLOWj CREATURE:FORGOTTEN_BEAST_329:FATj#CREATURE:FORGOTTEN_BEAST_329:TALLOWj CREATURE:FORGOTTEN_BEAST_330:FATj#CREATURE:FORGOTTEN_BEAST_330:TALLOWj CREATURE:FORGOTTEN_BEAST_332:FATj#CREATURE:FORGOTTEN_BEAST_332:TALLOWj CREATURE:FORGOTTEN_BEAST_333:FATj#CREATURE:FORGOTTEN_BEAST_333:TALLOWj CREATURE:FORGOTTEN_BEAST_335:FATj#CREATURE:FORGOTTEN_BEAST_335:TALLOWj CREATURE:FORGOTTEN_BEAST_336:FATj#CREATURE:FORGOTTEN_BEAST_336:TALLOWj CREATURE:FORGOTTEN_BEAST_337:FATj#CREATURE:FORGOTTEN_BEAST_337:TALLOWj CREATURE:FORGOTTEN_BEAST_338:FATj#CREATURE:FORGOTTEN_BEAST_338:TALLOWj CREATURE:FORGOTTEN_BEAST_339:FATj#CREATURE:FORGOTTEN_BEAST_339:TALLOWj CREATURE:FORGOTTEN_BEAST_341:FATj#CREATURE:FORGOTTEN_BEAST_341:TALLOWj CREATURE:FORGOTTEN_BEAST_342:FATj#CREATURE:FORGOTTEN_BEAST_342:TALLOWj CREATURE:FORGOTTEN_BEAST_343:FATj#CREATURE:FORGOTTEN_BEAST_343:TALLOWj CREATURE:FORGOTTEN_BEAST_344:FATj#CREATURE:FORGOTTEN_BEAST_344:TALLOWj CREATURE:FORGOTTEN_BEAST_347:FATj#CREATURE:FORGOTTEN_BEAST_347:TALLOWj CREATURE:FORGOTTEN_BEAST_348:FATj#CREATURE:FORGOTTEN_BEAST_348:TALLOWj CREATURE:FORGOTTEN_BEAST_349:FATj#CREATURE:FORGOTTEN_BEAST_349:TALLOWj CREATURE:FORGOTTEN_BEAST_351:FATj#CREATURE:FORGOTTEN_BEAST_351:TALLOWj CREATURE:FORGOTTEN_BEAST_352:FATj#CREATURE:FORGOTTEN_BEAST_352:TALLOWj CREATURE:FORGOTTEN_BEAST_353:FATj#CREATURE:FORGOTTEN_BEAST_353:TALLOWj CREATURE:FORGOTTEN_BEAST_354:FATj#CREATURE:FORGOTTEN_BEAST_354:TALLOWj CREATURE:FORGOTTEN_BEAST_355:FATj#CREATURE:FORGOTTEN_BEAST_355:TALLOWj CREATURE:FORGOTTEN_BEAST_356:FATj#CREATURE:FORGOTTEN_BEAST_356:TALLOWj CREATURE:FORGOTTEN_BEAST_357:FATj#CREATURE:FORGOTTEN_BEAST_357:TALLOWj CREATURE:FORGOTTEN_BEAST_358:FATj#CREATURE:FORGOTTEN_BEAST_358:TALLOWj CREATURE:FORGOTTEN_BEAST_359:FATj#CREATURE:FORGOTTEN_BEAST_359:TALLOWj CREATURE:FORGOTTEN_BEAST_361:FATj#CREATURE:FORGOTTEN_BEAST_361:TALLOWj CREATURE:FORGOTTEN_BEAST_363:FATj#CREATURE:FORGOTTEN_BEAST_363:TALLOWj CREATURE:FORGOTTEN_BEAST_364:FATj#CREATURE:FORGOTTEN_BEAST_364:TALLOWj CREATURE:FORGOTTEN_BEAST_365:FATj#CREATURE:FORGOTTEN_BEAST_365:TALLOWj CREATURE:FORGOTTEN_BEAST_366:FATj#CREATURE:FORGOTTEN_BEAST_366:TALLOWj CREATURE:FORGOTTEN_BEAST_367:FATj#CREATURE:FORGOTTEN_BEAST_367:TALLOWj CREATURE:FORGOTTEN_BEAST_368:FATj#CREATURE:FORGOTTEN_BEAST_368:TALLOWj CREATURE:FORGOTTEN_BEAST_370:FATj#CREATURE:FORGOTTEN_BEAST_370:TALLOWj CREATURE:FORGOTTEN_BEAST_372:FATj#CREATURE:FORGOTTEN_BEAST_372:TALLOWj CREATURE:FORGOTTEN_BEAST_374:FATj#CREATURE:FORGOTTEN_BEAST_374:TALLOWj CREATURE:FORGOTTEN_BEAST_375:FATj#CREATURE:FORGOTTEN_BEAST_375:TALLOWj CREATURE:FORGOTTEN_BEAST_377:FATj#CREATURE:FORGOTTEN_BEAST_377:TALLOWj CREATURE:FORGOTTEN_BEAST_378:FATj#CREATURE:FORGOTTEN_BEAST_378:TALLOWj CREATURE:FORGOTTEN_BEAST_379:FATj#CREATURE:FORGOTTEN_BEAST_379:TALLOWj CREATURE:FORGOTTEN_BEAST_380:FATj#CREATURE:FORGOTTEN_BEAST_380:TALLOWj CREATURE:FORGOTTEN_BEAST_381:FATj#CREATURE:FORGOTTEN_BEAST_381:TALLOWj CREATURE:FORGOTTEN_BEAST_382:FATj#CREATURE:FORGOTTEN_BEAST_382:TALLOWj CREATURE:FORGOTTEN_BEAST_383:FATj#CREATURE:FORGOTTEN_BEAST_383:TALLOWj CREATURE:FORGOTTEN_BEAST_384:FATj#CREATURE:FORGOTTEN_BEAST_384:TALLOWj CREATURE:FORGOTTEN_BEAST_385:FATj#CREATURE:FORGOTTEN_BEAST_385:TALLOWj CREATURE:FORGOTTEN_BEAST_386:FATj#CREATURE:FORGOTTEN_BEAST_386:TALLOWj CREATURE:FORGOTTEN_BEAST_387:FATj#CREATURE:FORGOTTEN_BEAST_387:TALLOWj CREATURE:FORGOTTEN_BEAST_388:FATj#CREATURE:FORGOTTEN_BEAST_388:TALLOWj CREATURE:FORGOTTEN_BEAST_389:FATj#CREATURE:FORGOTTEN_BEAST_389:TALLOWj CREATURE:FORGOTTEN_BEAST_390:FATj#CREATURE:FORGOTTEN_BEAST_390:TALLOWj CREATURE:FORGOTTEN_BEAST_391:FATj#CREATURE:FORGOTTEN_BEAST_391:TALLOWj CREATURE:FORGOTTEN_BEAST_392:FATj#CREATURE:FORGOTTEN_BEAST_392:TALLOWj CREATURE:FORGOTTEN_BEAST_393:FATj#CREATURE:FORGOTTEN_BEAST_393:TALLOWj CREATURE:FORGOTTEN_BEAST_396:FATj#CREATURE:FORGOTTEN_BEAST_396:TALLOWj CREATURE:FORGOTTEN_BEAST_397:FATj#CREATURE:FORGOTTEN_BEAST_397:TALLOWj CREATURE:FORGOTTEN_BEAST_398:FATj#CREATURE:FORGOTTEN_BEAST_398:TALLOWj CREATURE:FORGOTTEN_BEAST_400:FATj#CREATURE:FORGOTTEN_BEAST_400:TALLOWj CREATURE:FORGOTTEN_BEAST_403:FATj#CREATURE:FORGOTTEN_BEAST_403:TALLOWj CREATURE:FORGOTTEN_BEAST_404:FATj#CREATURE:FORGOTTEN_BEAST_404:TALLOWj CREATURE:FORGOTTEN_BEAST_405:FATj#CREATURE:FORGOTTEN_BEAST_405:TALLOWj CREATURE:FORGOTTEN_BEAST_406:FATj#CREATURE:FORGOTTEN_BEAST_406:TALLOWj CREATURE:FORGOTTEN_BEAST_407:FATj#CREATURE:FORGOTTEN_BEAST_407:TALLOWj CREATURE:FORGOTTEN_BEAST_408:FATj#CREATURE:FORGOTTEN_BEAST_408:TALLOWj CREATURE:FORGOTTEN_BEAST_409:FATj#CREATURE:FORGOTTEN_BEAST_409:TALLOWj CREATURE:FORGOTTEN_BEAST_410:FATj#CREATURE:FORGOTTEN_BEAST_410:TALLOWj CREATURE:FORGOTTEN_BEAST_411:FATj#CREATURE:FORGOTTEN_BEAST_411:TALLOWj CREATURE:FORGOTTEN_BEAST_412:FATj#CREATURE:FORGOTTEN_BEAST_412:TALLOWj CREATURE:FORGOTTEN_BEAST_413:FATj#CREATURE:FORGOTTEN_BEAST_413:TALLOWj CREATURE:FORGOTTEN_BEAST_414:FATj#CREATURE:FORGOTTEN_BEAST_414:TALLOWj CREATURE:FORGOTTEN_BEAST_416:FATj#CREATURE:FORGOTTEN_BEAST_416:TALLOWj CREATURE:FORGOTTEN_BEAST_417:FATj#CREATURE:FORGOTTEN_BEAST_417:TALLOWj CREATURE:FORGOTTEN_BEAST_418:FATj#CREATURE:FORGOTTEN_BEAST_418:TALLOWj CREATURE:FORGOTTEN_BEAST_420:FATj#CREATURE:FORGOTTEN_BEAST_420:TALLOWj CREATURE:FORGOTTEN_BEAST_421:FATj#CREATURE:FORGOTTEN_BEAST_421:TALLOWj CREATURE:FORGOTTEN_BEAST_422:FATj#CREATURE:FORGOTTEN_BEAST_422:TALLOWj CREATURE:FORGOTTEN_BEAST_423:FATj#CREATURE:FORGOTTEN_BEAST_423:TALLOWj CREATURE:FORGOTTEN_BEAST_424:FATj#CREATURE:FORGOTTEN_BEAST_424:TALLOWj CREATURE:FORGOTTEN_BEAST_427:FATj#CREATURE:FORGOTTEN_BEAST_427:TALLOWj CREATURE:FORGOTTEN_BEAST_429:FATj#CREATURE:FORGOTTEN_BEAST_429:TALLOWj CREATURE:FORGOTTEN_BEAST_430:FATj#CREATURE:FORGOTTEN_BEAST_430:TALLOWj CREATURE:FORGOTTEN_BEAST_432:FATj#CREATURE:FORGOTTEN_BEAST_432:TALLOWj CREATURE:FORGOTTEN_BEAST_433:FATj#CREATURE:FORGOTTEN_BEAST_433:TALLOWj CREATURE:FORGOTTEN_BEAST_434:FATj#CREATURE:FORGOTTEN_BEAST_434:TALLOWj CREATURE:FORGOTTEN_BEAST_435:FATj#CREATURE:FORGOTTEN_BEAST_435:TALLOWj CREATURE:FORGOTTEN_BEAST_436:FATj#CREATURE:FORGOTTEN_BEAST_436:TALLOWj CREATURE:FORGOTTEN_BEAST_437:FATj#CREATURE:FORGOTTEN_BEAST_437:TALLOWj CREATURE:FORGOTTEN_BEAST_438:FATj#CREATURE:FORGOTTEN_BEAST_438:TALLOWj CREATURE:FORGOTTEN_BEAST_440:FATj#CREATURE:FORGOTTEN_BEAST_440:TALLOWj CREATURE:FORGOTTEN_BEAST_441:FATj#CREATURE:FORGOTTEN_BEAST_441:TALLOWj CREATURE:FORGOTTEN_BEAST_442:FATj#CREATURE:FORGOTTEN_BEAST_442:TALLOWj CREATURE:FORGOTTEN_BEAST_444:FATj#CREATURE:FORGOTTEN_BEAST_444:TALLOWj CREATURE:FORGOTTEN_BEAST_446:FATj#CREATURE:FORGOTTEN_BEAST_446:TALLOWj CREATURE:FORGOTTEN_BEAST_447:FATj#CREATURE:FORGOTTEN_BEAST_447:TALLOWj CREATURE:FORGOTTEN_BEAST_448:FATj#CREATURE:FORGOTTEN_BEAST_448:TALLOWj CREATURE:FORGOTTEN_BEAST_449:FATj#CREATURE:FORGOTTEN_BEAST_449:TALLOWj CREATURE:FORGOTTEN_BEAST_450:FATj#CREATURE:FORGOTTEN_BEAST_450:TALLOWj CREATURE:FORGOTTEN_BEAST_451:FATj#CREATURE:FORGOTTEN_BEAST_451:TALLOWj CREATURE:FORGOTTEN_BEAST_453:FATj#CREATURE:FORGOTTEN_BEAST_453:TALLOWj CREATURE:FORGOTTEN_BEAST_454:FATj#CREATURE:FORGOTTEN_BEAST_454:TALLOWj CREATURE:FORGOTTEN_BEAST_455:FATj#CREATURE:FORGOTTEN_BEAST_455:TALLOWj CREATURE:FORGOTTEN_BEAST_457:FATj#CREATURE:FORGOTTEN_BEAST_457:TALLOWj CREATURE:FORGOTTEN_BEAST_459:FATj#CREATURE:FORGOTTEN_BEAST_459:TALLOWj CREATURE:FORGOTTEN_BEAST_461:FATj#CREATURE:FORGOTTEN_BEAST_461:TALLOWj CREATURE:FORGOTTEN_BEAST_462:FATj#CREATURE:FORGOTTEN_BEAST_462:TALLOWj CREATURE:FORGOTTEN_BEAST_463:FATj#CREATURE:FORGOTTEN_BEAST_463:TALLOWj CREATURE:FORGOTTEN_BEAST_465:FATj#CREATURE:FORGOTTEN_BEAST_465:TALLOWj CREATURE:FORGOTTEN_BEAST_466:FATj#CREATURE:FORGOTTEN_BEAST_466:TALLOWj CREATURE:FORGOTTEN_BEAST_468:FATj#CREATURE:FORGOTTEN_BEAST_468:TALLOWj CREATURE:FORGOTTEN_BEAST_469:FATj#CREATURE:FORGOTTEN_BEAST_469:TALLOWj CREATURE:FORGOTTEN_BEAST_470:FATj#CREATURE:FORGOTTEN_BEAST_470:TALLOWj CREATURE:FORGOTTEN_BEAST_471:FATj#CREATURE:FORGOTTEN_BEAST_471:TALLOWj CREATURE:FORGOTTEN_BEAST_472:FATj#CREATURE:FORGOTTEN_BEAST_472:TALLOWj CREATURE:FORGOTTEN_BEAST_474:FATj#CREATURE:FORGOTTEN_BEAST_474:TALLOWj CREATURE:FORGOTTEN_BEAST_475:FATj#CREATURE:FORGOTTEN_BEAST_475:TALLOWj CREATURE:FORGOTTEN_BEAST_476:FATj#CREATURE:FORGOTTEN_BEAST_476:TALLOWj CREATURE:FORGOTTEN_BEAST_478:FATj#CREATURE:FORGOTTEN_BEAST_478:TALLOWj CREATURE:FORGOTTEN_BEAST_479:FATj#CREATURE:FORGOTTEN_BEAST_479:TALLOWj CREATURE:FORGOTTEN_BEAST_480:FATj#CREATURE:FORGOTTEN_BEAST_480:TALLOWj CREATURE:FORGOTTEN_BEAST_481:FATj#CREATURE:FORGOTTEN_BEAST_481:TALLOWj CREATURE:FORGOTTEN_BEAST_483:FATj#CREATURE:FORGOTTEN_BEAST_483:TALLOWj CREATURE:FORGOTTEN_BEAST_486:FATj#CREATURE:FORGOTTEN_BEAST_486:TALLOWj CREATURE:FORGOTTEN_BEAST_487:FATj#CREATURE:FORGOTTEN_BEAST_487:TALLOWj CREATURE:FORGOTTEN_BEAST_489:FATj#CREATURE:FORGOTTEN_BEAST_489:TALLOWj CREATURE:FORGOTTEN_BEAST_492:FATj#CREATURE:FORGOTTEN_BEAST_492:TALLOWj CREATURE:FORGOTTEN_BEAST_494:FATj#CREATURE:FORGOTTEN_BEAST_494:TALLOWj CREATURE:FORGOTTEN_BEAST_495:FATj#CREATURE:FORGOTTEN_BEAST_495:TALLOWj CREATURE:FORGOTTEN_BEAST_496:FATj#CREATURE:FORGOTTEN_BEAST_496:TALLOWj CREATURE:FORGOTTEN_BEAST_497:FATj#CREATURE:FORGOTTEN_BEAST_497:TALLOWj CREATURE:FORGOTTEN_BEAST_498:FATj#CREATURE:FORGOTTEN_BEAST_498:TALLOWj CREATURE:FORGOTTEN_BEAST_499:FATj#CREATURE:FORGOTTEN_BEAST_499:TALLOWj CREATURE:FORGOTTEN_BEAST_501:FATj#CREATURE:FORGOTTEN_BEAST_501:TALLOWj CREATURE:FORGOTTEN_BEAST_503:FATj#CREATURE:FORGOTTEN_BEAST_503:TALLOWj CREATURE:FORGOTTEN_BEAST_504:FATj#CREATURE:FORGOTTEN_BEAST_504:TALLOWj CREATURE:FORGOTTEN_BEAST_505:FATj#CREATURE:FORGOTTEN_BEAST_505:TALLOWj CREATURE:FORGOTTEN_BEAST_507:FATj#CREATURE:FORGOTTEN_BEAST_507:TALLOWj CREATURE:FORGOTTEN_BEAST_508:FATj#CREATURE:FORGOTTEN_BEAST_508:TALLOWj CREATURE:FORGOTTEN_BEAST_510:FATj#CREATURE:FORGOTTEN_BEAST_510:TALLOWj CREATURE:FORGOTTEN_BEAST_512:FATj#CREATURE:FORGOTTEN_BEAST_512:TALLOWj CREATURE:FORGOTTEN_BEAST_513:FATj#CREATURE:FORGOTTEN_BEAST_513:TALLOWj CREATURE:FORGOTTEN_BEAST_514:FATj#CREATURE:FORGOTTEN_BEAST_514:TALLOWj CREATURE:FORGOTTEN_BEAST_515:FATj#CREATURE:FORGOTTEN_BEAST_515:TALLOWj CREATURE:FORGOTTEN_BEAST_516:FATj#CREATURE:FORGOTTEN_BEAST_516:TALLOWj CREATURE:FORGOTTEN_BEAST_517:FATj#CREATURE:FORGOTTEN_BEAST_517:TALLOWj CREATURE:FORGOTTEN_BEAST_518:FATj#CREATURE:FORGOTTEN_BEAST_518:TALLOWj CREATURE:FORGOTTEN_BEAST_519:FATj#CREATURE:FORGOTTEN_BEAST_519:TALLOWj CREATURE:FORGOTTEN_BEAST_520:FATj#CREATURE:FORGOTTEN_BEAST_520:TALLOWj CREATURE:FORGOTTEN_BEAST_521:FATj#CREATURE:FORGOTTEN_BEAST_521:TALLOWj CREATURE:FORGOTTEN_BEAST_522:FATj#CREATURE:FORGOTTEN_BEAST_522:TALLOWj CREATURE:FORGOTTEN_BEAST_523:FATj#CREATURE:FORGOTTEN_BEAST_523:TALLOWj CREATURE:FORGOTTEN_BEAST_525:FATj#CREATURE:FORGOTTEN_BEAST_525:TALLOWj CREATURE:FORGOTTEN_BEAST_526:FATj#CREATURE:FORGOTTEN_BEAST_526:TALLOWj CREATURE:FORGOTTEN_BEAST_527:FATj#CREATURE:FORGOTTEN_BEAST_527:TALLOWj CREATURE:FORGOTTEN_BEAST_528:FATj#CREATURE:FORGOTTEN_BEAST_528:TALLOWj CREATURE:FORGOTTEN_BEAST_529:FATj#CREATURE:FORGOTTEN_BEAST_529:TALLOWj CREATURE:FORGOTTEN_BEAST_530:FATj#CREATURE:FORGOTTEN_BEAST_530:TALLOWj CREATURE:FORGOTTEN_BEAST_531:FATj#CREATURE:FORGOTTEN_BEAST_531:TALLOWj CREATURE:FORGOTTEN_BEAST_532:FATj#CREATURE:FORGOTTEN_BEAST_532:TALLOWj CREATURE:FORGOTTEN_BEAST_533:FATj#CREATURE:FORGOTTEN_BEAST_533:TALLOWj CREATURE:FORGOTTEN_BEAST_534:FATj#CREATURE:FORGOTTEN_BEAST_534:TALLOWj CREATURE:FORGOTTEN_BEAST_535:FATj#CREATURE:FORGOTTEN_BEAST_535:TALLOWj CREATURE:FORGOTTEN_BEAST_536:FATj#CREATURE:FORGOTTEN_BEAST_536:TALLOWj CREATURE:FORGOTTEN_BEAST_539:FATj#CREATURE:FORGOTTEN_BEAST_539:TALLOWj CREATURE:FORGOTTEN_BEAST_540:FATj#CREATURE:FORGOTTEN_BEAST_540:TALLOWj CREATURE:FORGOTTEN_BEAST_541:FATj#CREATURE:FORGOTTEN_BEAST_541:TALLOWj CREATURE:FORGOTTEN_BEAST_543:FATj#CREATURE:FORGOTTEN_BEAST_543:TALLOWj CREATURE:FORGOTTEN_BEAST_545:FATj#CREATURE:FORGOTTEN_BEAST_545:TALLOWj CREATURE:FORGOTTEN_BEAST_546:FATj#CREATURE:FORGOTTEN_BEAST_546:TALLOWj CREATURE:FORGOTTEN_BEAST_547:FATj#CREATURE:FORGOTTEN_BEAST_547:TALLOWj CREATURE:FORGOTTEN_BEAST_548:FATj#CREATURE:FORGOTTEN_BEAST_548:TALLOWj CREATURE:FORGOTTEN_BEAST_549:FATj#CREATURE:FORGOTTEN_BEAST_549:TALLOWj CREATURE:FORGOTTEN_BEAST_550:FATj#CREATURE:FORGOTTEN_BEAST_550:TALLOWj CREATURE:FORGOTTEN_BEAST_551:FATj#CREATURE:FORGOTTEN_BEAST_551:TALLOWj CREATURE:FORGOTTEN_BEAST_554:FATj#CREATURE:FORGOTTEN_BEAST_554:TALLOWj CREATURE:FORGOTTEN_BEAST_555:FATj#CREATURE:FORGOTTEN_BEAST_555:TALLOWj CREATURE:FORGOTTEN_BEAST_556:FATj#CREATURE:FORGOTTEN_BEAST_556:TALLOWj CREATURE:FORGOTTEN_BEAST_557:FATj#CREATURE:FORGOTTEN_BEAST_557:TALLOWj CREATURE:FORGOTTEN_BEAST_561:FATj#CREATURE:FORGOTTEN_BEAST_561:TALLOWj CREATURE:FORGOTTEN_BEAST_562:FATj#CREATURE:FORGOTTEN_BEAST_562:TALLOWj CREATURE:FORGOTTEN_BEAST_564:FATj#CREATURE:FORGOTTEN_BEAST_564:TALLOWj CREATURE:FORGOTTEN_BEAST_569:FATj#CREATURE:FORGOTTEN_BEAST_569:TALLOWj CREATURE:FORGOTTEN_BEAST_570:FATj#CREATURE:FORGOTTEN_BEAST_570:TALLOWj CREATURE:FORGOTTEN_BEAST_571:FATj#CREATURE:FORGOTTEN_BEAST_571:TALLOWj CREATURE:FORGOTTEN_BEAST_572:FATj#CREATURE:FORGOTTEN_BEAST_572:TALLOWj CREATURE:FORGOTTEN_BEAST_574:FATj#CREATURE:FORGOTTEN_BEAST_574:TALLOWj CREATURE:FORGOTTEN_BEAST_576:FATj#CREATURE:FORGOTTEN_BEAST_576:TALLOWj CREATURE:FORGOTTEN_BEAST_578:FATj#CREATURE:FORGOTTEN_BEAST_578:TALLOWj CREATURE:FORGOTTEN_BEAST_579:FATj#CREATURE:FORGOTTEN_BEAST_579:TALLOWj CREATURE:FORGOTTEN_BEAST_580:FATj#CREATURE:FORGOTTEN_BEAST_580:TALLOWj CREATURE:FORGOTTEN_BEAST_581:FATj#CREATURE:FORGOTTEN_BEAST_581:TALLOWj CREATURE:FORGOTTEN_BEAST_583:FATj#CREATURE:FORGOTTEN_BEAST_583:TALLOWj CREATURE:FORGOTTEN_BEAST_584:FATj#CREATURE:FORGOTTEN_BEAST_584:TALLOWj CREATURE:FORGOTTEN_BEAST_586:FATj#CREATURE:FORGOTTEN_BEAST_586:TALLOWj CREATURE:FORGOTTEN_BEAST_588:FATj#CREATURE:FORGOTTEN_BEAST_588:TALLOWj CREATURE:FORGOTTEN_BEAST_589:FATj#CREATURE:FORGOTTEN_BEAST_589:TALLOWj CREATURE:FORGOTTEN_BEAST_590:FATj#CREATURE:FORGOTTEN_BEAST_590:TALLOWj CREATURE:FORGOTTEN_BEAST_592:FATj#CREATURE:FORGOTTEN_BEAST_592:TALLOWj CREATURE:FORGOTTEN_BEAST_593:FATj#CREATURE:FORGOTTEN_BEAST_593:TALLOWj CREATURE:FORGOTTEN_BEAST_594:FATj#CREATURE:FORGOTTEN_BEAST_594:TALLOWj CREATURE:FORGOTTEN_BEAST_595:FATj#CREATURE:FORGOTTEN_BEAST_595:TALLOWj CREATURE:FORGOTTEN_BEAST_596:FATj#CREATURE:FORGOTTEN_BEAST_596:TALLOWj CREATURE:FORGOTTEN_BEAST_597:FATj#CREATURE:FORGOTTEN_BEAST_597:TALLOWj CREATURE:FORGOTTEN_BEAST_599:FATj#CREATURE:FORGOTTEN_BEAST_599:TALLOWj CREATURE:FORGOTTEN_BEAST_600:FATj#CREATURE:FORGOTTEN_BEAST_600:TALLOWj CREATURE:FORGOTTEN_BEAST_601:FATj#CREATURE:FORGOTTEN_BEAST_601:TALLOWj CREATURE:FORGOTTEN_BEAST_603:FATj#CREATURE:FORGOTTEN_BEAST_603:TALLOWj CREATURE:FORGOTTEN_BEAST_605:FATj#CREATURE:FORGOTTEN_BEAST_605:TALLOWj CREATURE:FORGOTTEN_BEAST_607:FATj#CREATURE:FORGOTTEN_BEAST_607:TALLOWj CREATURE:FORGOTTEN_BEAST_608:FATj#CREATURE:FORGOTTEN_BEAST_608:TALLOWj CREATURE:FORGOTTEN_BEAST_609:FATj#CREATURE:FORGOTTEN_BEAST_609:TALLOWj CREATURE:FORGOTTEN_BEAST_610:FATj#CREATURE:FORGOTTEN_BEAST_610:TALLOWj CREATURE:FORGOTTEN_BEAST_611:FATj#CREATURE:FORGOTTEN_BEAST_611:TALLOWj CREATURE:FORGOTTEN_BEAST_612:FATj#CREATURE:FORGOTTEN_BEAST_612:TALLOWj CREATURE:FORGOTTEN_BEAST_613:FATj#CREATURE:FORGOTTEN_BEAST_613:TALLOWj CREATURE:FORGOTTEN_BEAST_614:FATj#CREATURE:FORGOTTEN_BEAST_614:TALLOWj CREATURE:FORGOTTEN_BEAST_616:FATj#CREATURE:FORGOTTEN_BEAST_616:TALLOWj CREATURE:FORGOTTEN_BEAST_619:FATj#CREATURE:FORGOTTEN_BEAST_619:TALLOWj CREATURE:FORGOTTEN_BEAST_620:FATj#CREATURE:FORGOTTEN_BEAST_620:TALLOWj CREATURE:FORGOTTEN_BEAST_621:FATj#CREATURE:FORGOTTEN_BEAST_621:TALLOWj CREATURE:FORGOTTEN_BEAST_623:FATj#CREATURE:FORGOTTEN_BEAST_623:TALLOWj CREATURE:FORGOTTEN_BEAST_624:FATj#CREATURE:FORGOTTEN_BEAST_624:TALLOWj CREATURE:FORGOTTEN_BEAST_625:FATj#CREATURE:FORGOTTEN_BEAST_625:TALLOWj CREATURE:FORGOTTEN_BEAST_626:FATj#CREATURE:FORGOTTEN_BEAST_626:TALLOWj CREATURE:FORGOTTEN_BEAST_627:FATj#CREATURE:FORGOTTEN_BEAST_627:TALLOWj CREATURE:FORGOTTEN_BEAST_628:FATj#CREATURE:FORGOTTEN_BEAST_628:TALLOWj CREATURE:FORGOTTEN_BEAST_629:FATj#CREATURE:FORGOTTEN_BEAST_629:TALLOWj CREATURE:FORGOTTEN_BEAST_630:FATj#CREATURE:FORGOTTEN_BEAST_630:TALLOWj CREATURE:FORGOTTEN_BEAST_631:FATj#CREATURE:FORGOTTEN_BEAST_631:TALLOWj CREATURE:FORGOTTEN_BEAST_632:FATj#CREATURE:FORGOTTEN_BEAST_632:TALLOWj CREATURE:FORGOTTEN_BEAST_633:FATj#CREATURE:FORGOTTEN_BEAST_633:TALLOWj CREATURE:FORGOTTEN_BEAST_634:FATj#CREATURE:FORGOTTEN_BEAST_634:TALLOWj CREATURE:FORGOTTEN_BEAST_635:FATj#CREATURE:FORGOTTEN_BEAST_635:TALLOWj CREATURE:FORGOTTEN_BEAST_636:FATj#CREATURE:FORGOTTEN_BEAST_636:TALLOWj CREATURE:FORGOTTEN_BEAST_637:FATj#CREATURE:FORGOTTEN_BEAST_637:TALLOWj CREATURE:FORGOTTEN_BEAST_639:FATj#CREATURE:FORGOTTEN_BEAST_639:TALLOWj CREATURE:FORGOTTEN_BEAST_640:FATj#CREATURE:FORGOTTEN_BEAST_640:TALLOWj CREATURE:FORGOTTEN_BEAST_643:FATj#CREATURE:FORGOTTEN_BEAST_643:TALLOWj CREATURE:FORGOTTEN_BEAST_644:FATj#CREATURE:FORGOTTEN_BEAST_644:TALLOWj CREATURE:FORGOTTEN_BEAST_645:FATj#CREATURE:FORGOTTEN_BEAST_645:TALLOWj CREATURE:FORGOTTEN_BEAST_646:FATj#CREATURE:FORGOTTEN_BEAST_646:TALLOWj CREATURE:FORGOTTEN_BEAST_647:FATj#CREATURE:FORGOTTEN_BEAST_647:TALLOWj CREATURE:FORGOTTEN_BEAST_649:FATj#CREATURE:FORGOTTEN_BEAST_649:TALLOWj CREATURE:FORGOTTEN_BEAST_650:FATj#CREATURE:FORGOTTEN_BEAST_650:TALLOWj CREATURE:FORGOTTEN_BEAST_651:FATj#CREATURE:FORGOTTEN_BEAST_651:TALLOWj CREATURE:FORGOTTEN_BEAST_652:FATj#CREATURE:FORGOTTEN_BEAST_652:TALLOWj CREATURE:FORGOTTEN_BEAST_656:FATj#CREATURE:FORGOTTEN_BEAST_656:TALLOWj CREATURE:FORGOTTEN_BEAST_658:FATj#CREATURE:FORGOTTEN_BEAST_658:TALLOWj CREATURE:FORGOTTEN_BEAST_659:FATj#CREATURE:FORGOTTEN_BEAST_659:TALLOWj CREATURE:FORGOTTEN_BEAST_661:FATj#CREATURE:FORGOTTEN_BEAST_661:TALLOWj CREATURE:FORGOTTEN_BEAST_663:FATj#CREATURE:FORGOTTEN_BEAST_663:TALLOWj CREATURE:FORGOTTEN_BEAST_664:FATj#CREATURE:FORGOTTEN_BEAST_664:TALLOWj CREATURE:FORGOTTEN_BEAST_666:FATj#CREATURE:FORGOTTEN_BEAST_666:TALLOWj CREATURE:FORGOTTEN_BEAST_667:FATj#CREATURE:FORGOTTEN_BEAST_667:TALLOWj CREATURE:FORGOTTEN_BEAST_669:FATj#CREATURE:FORGOTTEN_BEAST_669:TALLOWj CREATURE:FORGOTTEN_BEAST_670:FATj#CREATURE:FORGOTTEN_BEAST_670:TALLOWj CREATURE:FORGOTTEN_BEAST_671:FATj#CREATURE:FORGOTTEN_BEAST_671:TALLOWj CREATURE:FORGOTTEN_BEAST_674:FATj#CREATURE:FORGOTTEN_BEAST_674:TALLOWj CREATURE:FORGOTTEN_BEAST_675:FATj#CREATURE:FORGOTTEN_BEAST_675:TALLOWj CREATURE:FORGOTTEN_BEAST_678:FATj#CREATURE:FORGOTTEN_BEAST_678:TALLOWj CREATURE:FORGOTTEN_BEAST_680:FATj#CREATURE:FORGOTTEN_BEAST_680:TALLOWj CREATURE:FORGOTTEN_BEAST_681:FATj#CREATURE:FORGOTTEN_BEAST_681:TALLOWj CREATURE:FORGOTTEN_BEAST_682:FATj#CREATURE:FORGOTTEN_BEAST_682:TALLOWj CREATURE:FORGOTTEN_BEAST_684:FATj#CREATURE:FORGOTTEN_BEAST_684:TALLOWj CREATURE:FORGOTTEN_BEAST_685:FATj#CREATURE:FORGOTTEN_BEAST_685:TALLOWj CREATURE:FORGOTTEN_BEAST_686:FATj#CREATURE:FORGOTTEN_BEAST_686:TALLOWj CREATURE:FORGOTTEN_BEAST_687:FATj#CREATURE:FORGOTTEN_BEAST_687:TALLOWj CREATURE:FORGOTTEN_BEAST_688:FATj#CREATURE:FORGOTTEN_BEAST_688:TALLOWj CREATURE:FORGOTTEN_BEAST_689:FATj#CREATURE:FORGOTTEN_BEAST_689:TALLOWj CREATURE:FORGOTTEN_BEAST_691:FATj#CREATURE:FORGOTTEN_BEAST_691:TALLOWj CREATURE:FORGOTTEN_BEAST_692:FATj#CREATURE:FORGOTTEN_BEAST_692:TALLOWj CREATURE:FORGOTTEN_BEAST_695:FATj#CREATURE:FORGOTTEN_BEAST_695:TALLOWj CREATURE:FORGOTTEN_BEAST_696:FATj#CREATURE:FORGOTTEN_BEAST_696:TALLOWj CREATURE:FORGOTTEN_BEAST_697:FATj#CREATURE:FORGOTTEN_BEAST_697:TALLOWj CREATURE:FORGOTTEN_BEAST_698:FATj#CREATURE:FORGOTTEN_BEAST_698:TALLOWj CREATURE:FORGOTTEN_BEAST_699:FATj#CREATURE:FORGOTTEN_BEAST_699:TALLOWj CREATURE:FORGOTTEN_BEAST_700:FATj#CREATURE:FORGOTTEN_BEAST_700:TALLOWj CREATURE:FORGOTTEN_BEAST_701:FATj#CREATURE:FORGOTTEN_BEAST_701:TALLOWj CREATURE:FORGOTTEN_BEAST_702:FATj#CREATURE:FORGOTTEN_BEAST_702:TALLOWj CREATURE:FORGOTTEN_BEAST_704:FATj#CREATURE:FORGOTTEN_BEAST_704:TALLOWj CREATURE:FORGOTTEN_BEAST_706:FATj#CREATURE:FORGOTTEN_BEAST_706:TALLOWj CREATURE:FORGOTTEN_BEAST_708:FATj#CREATURE:FORGOTTEN_BEAST_708:TALLOWj CREATURE:FORGOTTEN_BEAST_709:FATj#CREATURE:FORGOTTEN_BEAST_709:TALLOWj CREATURE:FORGOTTEN_BEAST_711:FATj#CREATURE:FORGOTTEN_BEAST_711:TALLOWj CREATURE:FORGOTTEN_BEAST_712:FATj#CREATURE:FORGOTTEN_BEAST_712:TALLOWj CREATURE:FORGOTTEN_BEAST_713:FATj#CREATURE:FORGOTTEN_BEAST_713:TALLOWj CREATURE:FORGOTTEN_BEAST_714:FATj#CREATURE:FORGOTTEN_BEAST_714:TALLOWj CREATURE:FORGOTTEN_BEAST_715:FATj#CREATURE:FORGOTTEN_BEAST_715:TALLOWj CREATURE:FORGOTTEN_BEAST_717:FATj#CREATURE:FORGOTTEN_BEAST_717:TALLOWj CREATURE:FORGOTTEN_BEAST_718:FATj#CREATURE:FORGOTTEN_BEAST_718:TALLOWj CREATURE:FORGOTTEN_BEAST_719:FATj#CREATURE:FORGOTTEN_BEAST_719:TALLOWj CREATURE:FORGOTTEN_BEAST_720:FATj#CREATURE:FORGOTTEN_BEAST_720:TALLOWj CREATURE:FORGOTTEN_BEAST_721:FATj#CREATURE:FORGOTTEN_BEAST_721:TALLOWj CREATURE:FORGOTTEN_BEAST_722:FATj#CREATURE:FORGOTTEN_BEAST_722:TALLOWj CREATURE:FORGOTTEN_BEAST_723:FATj#CREATURE:FORGOTTEN_BEAST_723:TALLOWj CREATURE:FORGOTTEN_BEAST_724:FATj#CREATURE:FORGOTTEN_BEAST_724:TALLOWj CREATURE:FORGOTTEN_BEAST_726:FATj#CREATURE:FORGOTTEN_BEAST_726:TALLOWj CREATURE:FORGOTTEN_BEAST_730:FATj#CREATURE:FORGOTTEN_BEAST_730:TALLOWj CREATURE:FORGOTTEN_BEAST_731:FATj#CREATURE:FORGOTTEN_BEAST_731:TALLOWj CREATURE:FORGOTTEN_BEAST_734:FATj#CREATURE:FORGOTTEN_BEAST_734:TALLOWj CREATURE:FORGOTTEN_BEAST_735:FATj#CREATURE:FORGOTTEN_BEAST_735:TALLOWj CREATURE:FORGOTTEN_BEAST_737:FATj#CREATURE:FORGOTTEN_BEAST_737:TALLOWj CREATURE:FORGOTTEN_BEAST_738:FATj#CREATURE:FORGOTTEN_BEAST_738:TALLOWj CREATURE:FORGOTTEN_BEAST_739:FATj#CREATURE:FORGOTTEN_BEAST_739:TALLOWj CREATURE:FORGOTTEN_BEAST_740:FATj#CREATURE:FORGOTTEN_BEAST_740:TALLOWj CREATURE:FORGOTTEN_BEAST_741:FATj#CREATURE:FORGOTTEN_BEAST_741:TALLOWj CREATURE:FORGOTTEN_BEAST_742:FATj#CREATURE:FORGOTTEN_BEAST_742:TALLOWj CREATURE:FORGOTTEN_BEAST_743:FATj#CREATURE:FORGOTTEN_BEAST_743:TALLOWj CREATURE:FORGOTTEN_BEAST_744:FATj#CREATURE:FORGOTTEN_BEAST_744:TALLOWj CREATURE:FORGOTTEN_BEAST_746:FATj#CREATURE:FORGOTTEN_BEAST_746:TALLOWj CREATURE:FORGOTTEN_BEAST_747:FATj#CREATURE:FORGOTTEN_BEAST_747:TALLOWj CREATURE:FORGOTTEN_BEAST_749:FATj#CREATURE:FORGOTTEN_BEAST_749:TALLOWj CREATURE:FORGOTTEN_BEAST_750:FATj#CREATURE:FORGOTTEN_BEAST_750:TALLOWj CREATURE:FORGOTTEN_BEAST_751:FATj#CREATURE:FORGOTTEN_BEAST_751:TALLOWj CREATURE:FORGOTTEN_BEAST_752:FATj#CREATURE:FORGOTTEN_BEAST_752:TALLOWj CREATURE:FORGOTTEN_BEAST_753:FATj#CREATURE:FORGOTTEN_BEAST_753:TALLOWj CREATURE:FORGOTTEN_BEAST_754:FATj#CREATURE:FORGOTTEN_BEAST_754:TALLOWj CREATURE:FORGOTTEN_BEAST_755:FATj#CREATURE:FORGOTTEN_BEAST_755:TALLOWj CREATURE:FORGOTTEN_BEAST_756:FATj#CREATURE:FORGOTTEN_BEAST_756:TALLOWj CREATURE:FORGOTTEN_BEAST_757:FATj#CREATURE:FORGOTTEN_BEAST_757:TALLOWj CREATURE:FORGOTTEN_BEAST_758:FATj#CREATURE:FORGOTTEN_BEAST_758:TALLOWj CREATURE:FORGOTTEN_BEAST_759:FATj#CREATURE:FORGOTTEN_BEAST_759:TALLOWj CREATURE:FORGOTTEN_BEAST_760:FATj#CREATURE:FORGOTTEN_BEAST_760:TALLOWj CREATURE:FORGOTTEN_BEAST_761:FATj#CREATURE:FORGOTTEN_BEAST_761:TALLOWj CREATURE:FORGOTTEN_BEAST_762:FATj#CREATURE:FORGOTTEN_BEAST_762:TALLOWj CREATURE:FORGOTTEN_BEAST_764:FATj#CREATURE:FORGOTTEN_BEAST_764:TALLOWj CREATURE:FORGOTTEN_BEAST_767:FATj#CREATURE:FORGOTTEN_BEAST_767:TALLOWj CREATURE:FORGOTTEN_BEAST_768:FATj#CREATURE:FORGOTTEN_BEAST_768:TALLOWj CREATURE:FORGOTTEN_BEAST_769:FATj#CREATURE:FORGOTTEN_BEAST_769:TALLOWj CREATURE:FORGOTTEN_BEAST_770:FATj#CREATURE:FORGOTTEN_BEAST_770:TALLOWj CREATURE:FORGOTTEN_BEAST_773:FATj#CREATURE:FORGOTTEN_BEAST_773:TALLOWj CREATURE:FORGOTTEN_BEAST_774:FATj#CREATURE:FORGOTTEN_BEAST_774:TALLOWj CREATURE:FORGOTTEN_BEAST_776:FATj#CREATURE:FORGOTTEN_BEAST_776:TALLOWj CREATURE:FORGOTTEN_BEAST_777:FATj#CREATURE:FORGOTTEN_BEAST_777:TALLOWj CREATURE:FORGOTTEN_BEAST_778:FATj#CREATURE:FORGOTTEN_BEAST_778:TALLOWj CREATURE:FORGOTTEN_BEAST_779:FATj#CREATURE:FORGOTTEN_BEAST_779:TALLOWj CREATURE:FORGOTTEN_BEAST_780:FATj#CREATURE:FORGOTTEN_BEAST_780:TALLOWj CREATURE:FORGOTTEN_BEAST_781:FATj#CREATURE:FORGOTTEN_BEAST_781:TALLOWj CREATURE:FORGOTTEN_BEAST_782:FATj#CREATURE:FORGOTTEN_BEAST_782:TALLOWj CREATURE:FORGOTTEN_BEAST_783:FATj#CREATURE:FORGOTTEN_BEAST_783:TALLOWj CREATURE:FORGOTTEN_BEAST_784:FATj#CREATURE:FORGOTTEN_BEAST_784:TALLOWj CREATURE:FORGOTTEN_BEAST_785:FATj#CREATURE:FORGOTTEN_BEAST_785:TALLOWj CREATURE:FORGOTTEN_BEAST_786:FATj#CREATURE:FORGOTTEN_BEAST_786:TALLOWj CREATURE:FORGOTTEN_BEAST_787:FATj#CREATURE:FORGOTTEN_BEAST_787:TALLOWj CREATURE:FORGOTTEN_BEAST_789:FATj#CREATURE:FORGOTTEN_BEAST_789:TALLOWj CREATURE:FORGOTTEN_BEAST_792:FATj#CREATURE:FORGOTTEN_BEAST_792:TALLOWj CREATURE:FORGOTTEN_BEAST_793:FATj#CREATURE:FORGOTTEN_BEAST_793:TALLOWj CREATURE:FORGOTTEN_BEAST_794:FATj#CREATURE:FORGOTTEN_BEAST_794:TALLOWj CREATURE:FORGOTTEN_BEAST_795:FATj#CREATURE:FORGOTTEN_BEAST_795:TALLOWj CREATURE:FORGOTTEN_BEAST_796:FATj#CREATURE:FORGOTTEN_BEAST_796:TALLOWj CREATURE:FORGOTTEN_BEAST_799:FATj#CREATURE:FORGOTTEN_BEAST_799:TALLOWj CREATURE:FORGOTTEN_BEAST_800:FATj#CREATURE:FORGOTTEN_BEAST_800:TALLOWj CREATURE:FORGOTTEN_BEAST_801:FATj#CREATURE:FORGOTTEN_BEAST_801:TALLOWj CREATURE:FORGOTTEN_BEAST_802:FATj#CREATURE:FORGOTTEN_BEAST_802:TALLOWj CREATURE:FORGOTTEN_BEAST_803:FATj#CREATURE:FORGOTTEN_BEAST_803:TALLOWj CREATURE:FORGOTTEN_BEAST_804:FATj#CREATURE:FORGOTTEN_BEAST_804:TALLOWj CREATURE:FORGOTTEN_BEAST_806:FATj#CREATURE:FORGOTTEN_BEAST_806:TALLOWj CREATURE:FORGOTTEN_BEAST_807:FATj#CREATURE:FORGOTTEN_BEAST_807:TALLOWj CREATURE:FORGOTTEN_BEAST_809:FATj#CREATURE:FORGOTTEN_BEAST_809:TALLOWj CREATURE:FORGOTTEN_BEAST_810:FATj#CREATURE:FORGOTTEN_BEAST_810:TALLOWj CREATURE:FORGOTTEN_BEAST_811:FATj#CREATURE:FORGOTTEN_BEAST_811:TALLOWj CREATURE:FORGOTTEN_BEAST_812:FATj#CREATURE:FORGOTTEN_BEAST_812:TALLOWj CREATURE:FORGOTTEN_BEAST_815:FATj#CREATURE:FORGOTTEN_BEAST_815:TALLOWj CREATURE:FORGOTTEN_BEAST_817:FATj#CREATURE:FORGOTTEN_BEAST_817:TALLOWj CREATURE:FORGOTTEN_BEAST_818:FATj#CREATURE:FORGOTTEN_BEAST_818:TALLOWj CREATURE:FORGOTTEN_BEAST_819:FATj#CREATURE:FORGOTTEN_BEAST_819:TALLOWj CREATURE:FORGOTTEN_BEAST_820:FATj#CREATURE:FORGOTTEN_BEAST_820:TALLOWj CREATURE:FORGOTTEN_BEAST_821:FATj#CREATURE:FORGOTTEN_BEAST_821:TALLOWj CREATURE:FORGOTTEN_BEAST_822:FATj#CREATURE:FORGOTTEN_BEAST_822:TALLOWj CREATURE:FORGOTTEN_BEAST_824:FATj#CREATURE:FORGOTTEN_BEAST_824:TALLOWj CREATURE:FORGOTTEN_BEAST_825:FATj#CREATURE:FORGOTTEN_BEAST_825:TALLOWj CREATURE:FORGOTTEN_BEAST_826:FATj#CREATURE:FORGOTTEN_BEAST_826:TALLOWj CREATURE:FORGOTTEN_BEAST_827:FATj#CREATURE:FORGOTTEN_BEAST_827:TALLOWj CREATURE:FORGOTTEN_BEAST_828:FATj#CREATURE:FORGOTTEN_BEAST_828:TALLOWj CREATURE:FORGOTTEN_BEAST_831:FATj#CREATURE:FORGOTTEN_BEAST_831:TALLOWj CREATURE:FORGOTTEN_BEAST_833:FATj#CREATURE:FORGOTTEN_BEAST_833:TALLOWj CREATURE:FORGOTTEN_BEAST_835:FATj#CREATURE:FORGOTTEN_BEAST_835:TALLOWj CREATURE:FORGOTTEN_BEAST_837:FATj#CREATURE:FORGOTTEN_BEAST_837:TALLOWj CREATURE:FORGOTTEN_BEAST_838:FATj#CREATURE:FORGOTTEN_BEAST_838:TALLOWj CREATURE:FORGOTTEN_BEAST_842:FATj#CREATURE:FORGOTTEN_BEAST_842:TALLOWj CREATURE:FORGOTTEN_BEAST_843:FATj#CREATURE:FORGOTTEN_BEAST_843:TALLOWj CREATURE:FORGOTTEN_BEAST_844:FATj#CREATURE:FORGOTTEN_BEAST_844:TALLOWj CREATURE:FORGOTTEN_BEAST_845:FATj#CREATURE:FORGOTTEN_BEAST_845:TALLOWj CREATURE:FORGOTTEN_BEAST_846:FATj#CREATURE:FORGOTTEN_BEAST_846:TALLOWj CREATURE:FORGOTTEN_BEAST_847:FATj#CREATURE:FORGOTTEN_BEAST_847:TALLOWj CREATURE:FORGOTTEN_BEAST_848:FATj#CREATURE:FORGOTTEN_BEAST_848:TALLOWj CREATURE:FORGOTTEN_BEAST_849:FATj#CREATURE:FORGOTTEN_BEAST_849:TALLOWj CREATURE:FORGOTTEN_BEAST_851:FATj#CREATURE:FORGOTTEN_BEAST_851:TALLOWj CREATURE:FORGOTTEN_BEAST_853:FATj#CREATURE:FORGOTTEN_BEAST_853:TALLOWj CREATURE:FORGOTTEN_BEAST_854:FATj#CREATURE:FORGOTTEN_BEAST_854:TALLOWj CREATURE:FORGOTTEN_BEAST_855:FATj#CREATURE:FORGOTTEN_BEAST_855:TALLOWj CREATURE:FORGOTTEN_BEAST_857:FATj#CREATURE:FORGOTTEN_BEAST_857:TALLOWj CREATURE:FORGOTTEN_BEAST_858:FATj#CREATURE:FORGOTTEN_BEAST_858:TALLOWj CREATURE:FORGOTTEN_BEAST_859:FATj#CREATURE:FORGOTTEN_BEAST_859:TALLOWj CREATURE:FORGOTTEN_BEAST_860:FATj#CREATURE:FORGOTTEN_BEAST_860:TALLOWj CREATURE:FORGOTTEN_BEAST_861:FATj#CREATURE:FORGOTTEN_BEAST_861:TALLOWj CREATURE:FORGOTTEN_BEAST_862:FATj#CREATURE:FORGOTTEN_BEAST_862:TALLOWj CREATURE:FORGOTTEN_BEAST_865:FATj#CREATURE:FORGOTTEN_BEAST_865:TALLOWj CREATURE:FORGOTTEN_BEAST_866:FATj#CREATURE:FORGOTTEN_BEAST_866:TALLOWj CREATURE:FORGOTTEN_BEAST_867:FATj#CREATURE:FORGOTTEN_BEAST_867:TALLOWjCREATURE:TITAN_1:FATjCREATURE:TITAN_1:TALLOWjCREATURE:TITAN_3:FATjCREATURE:TITAN_3:TALLOWjCREATURE:TITAN_4:FATjCREATURE:TITAN_4:TALLOWjCREATURE:TITAN_6:FATjCREATURE:TITAN_6:TALLOWjCREATURE:TITAN_7:FATjCREATURE:TITAN_7:TALLOWjCREATURE:TITAN_8:FATjCREATURE:TITAN_8:TALLOWjCREATURE:TITAN_9:FATjCREATURE:TITAN_9:TALLOWjCREATURE:TITAN_10:FATjCREATURE:TITAN_10:TALLOWjCREATURE:TITAN_11:FATjCREATURE:TITAN_11:TALLOWjCREATURE:TITAN_12:FATjCREATURE:TITAN_12:TALLOWjCREATURE:TITAN_13:FATjCREATURE:TITAN_13:TALLOWjCREATURE:TITAN_14:FATjCREATURE:TITAN_14:TALLOWjCREATURE:TITAN_15:FATjCREATURE:TITAN_15:TALLOWjCREATURE:TITAN_18:FATjCREATURE:TITAN_18:TALLOWjCREATURE:TITAN_19:FATjCREATURE:TITAN_19:TALLOWjCREATURE:TITAN_21:FATjCREATURE:TITAN_21:TALLOWjCREATURE:TITAN_23:FATjCREATURE:TITAN_23:TALLOWjCREATURE:TITAN_24:FATjCREATURE:TITAN_24:TALLOWjCREATURE:TITAN_25:FATjCREATURE:TITAN_25:TALLOWjCREATURE:TITAN_26:FATjCREATURE:TITAN_26:TALLOWjCREATURE:TITAN_27:FATjCREATURE:TITAN_27:TALLOWjCREATURE:TITAN_28:FATjCREATURE:TITAN_28:TALLOWjCREATURE:TITAN_29:FATjCREATURE:TITAN_29:TALLOWjCREATURE:TITAN_30:FATjCREATURE:TITAN_30:TALLOWjCREATURE:TITAN_32:FATjCREATURE:TITAN_32:TALLOWjCREATURE:TITAN_33:FATjCREATURE:TITAN_33:TALLOWjCREATURE:DEMON_7:FATjCREATURE:DEMON_7:TALLOWjCREATURE:DEMON_8:FATjCREATURE:DEMON_8:TALLOWjCREATURE:DEMON_9:FATjCREATURE:DEMON_9:TALLOWjCREATURE:DEMON_10:FATjCREATURE:DEMON_10:TALLOWjCREATURE:DEMON_11:FATjCREATURE:DEMON_11:TALLOWjCREATURE:DEMON_12:FATjCREATURE:DEMON_12:TALLOWjCREATURE:DEMON_13:FATjCREATURE:DEMON_13:TALLOWjCREATURE:DEMON_14:FATjCREATURE:DEMON_14:TALLOWjCREATURE:DEMON_15:FATjCREATURE:DEMON_15:TALLOWjCREATURE:DEMON_16:FATjCREATURE:DEMON_16:TALLOWjCREATURE:DEMON_17:FATjCREATURE:DEMON_17:TALLOWjCREATURE:DEMON_18:FATjCREATURE:DEMON_18:TALLOWjCREATURE:DEMON_19:FATjCREATURE:DEMON_19:TALLOWjCREATURE:DEMON_20:FATjCREATURE:DEMON_20:TALLOWjCREATURE:DEMON_21:FATjCREATURE:DEMON_21:TALLOWjCREATURE:DEMON_22:FATjCREATURE:DEMON_22:TALLOWjCREATURE:DEMON_23:FATjCREATURE:DEMON_23:TALLOWjCREATURE:DEMON_24:FATjCREATURE:DEMON_24:TALLOWjCREATURE:DEMON_25:FATjCREATURE:DEMON_25:TALLOWjCREATURE:DEMON_26:FATjCREATURE:DEMON_26:TALLOWjCREATURE:DEMON_27:FATjCREATURE:DEMON_27:TALLOWjCREATURE:DEMON_28:FATjCREATURE:DEMON_28:TALLOWjCREATURE:DEMON_29:FATjCREATURE:DEMON_29:TALLOWjCREATURE:DEMON_31:FATjCREATURE:DEMON_31:TALLOWjCREATURE:DEMON_32:FATjCREATURE:DEMON_32:TALLOWjCREATURE:DEMON_38:FATjCREATURE:DEMON_38:TALLOWjCREATURE:DEMON_39:FATjCREATURE:DEMON_39:TALLOWjCREATURE:DEMON_40:FATjCREATURE:DEMON_40:TALLOWjCREATURE:DEMON_41:FATjCREATURE:DEMON_41:TALLOWjCREATURE:DEMON_42:FATjCREATURE:DEMON_42:TALLOWjCREATURE:DEMON_43:FATjCREATURE:DEMON_43:TALLOWjCREATURE:DEMON_44:FATjCREATURE:DEMON_44:TALLOWjCREATURE:DEMON_45:FATjCREATURE:DEMON_45:TALLOWjCREATURE:DEMON_47:FATjCREATURE:DEMON_47:TALLOWjCREATURE:DEMON_48:FATjCREATURE:DEMON_48:TALLOWjCREATURE:DEMON_49:FATjCREATURE:DEMON_49:TALLOWjCREATURE:DEMON_52:FATjCREATURE:DEMON_52:TALLOWjCREATURE:NIGHT_CREATURE_1:FATj CREATURE:NIGHT_CREATURE_1:TALLOWjCREATURE:NIGHT_CREATURE_2:FATj CREATURE:NIGHT_CREATURE_2:TALLOWjCREATURE:NIGHT_CREATURE_3:FATj CREATURE:NIGHT_CREATURE_3:TALLOWjCREATURE:NIGHT_CREATURE_4:FATj CREATURE:NIGHT_CREATURE_4:TALLOWjCREATURE:NIGHT_CREATURE_5:FATj CREATURE:NIGHT_CREATURE_5:TALLOWjCREATURE:NIGHT_CREATURE_6:FATj CREATURE:NIGHT_CREATURE_6:TALLOWjCREATURE:NIGHT_CREATURE_7:FATj CREATURE:NIGHT_CREATURE_7:TALLOWjCREATURE:NIGHT_CREATURE_8:FATj CREATURE:NIGHT_CREATURE_8:TALLOWjCREATURE:NIGHT_CREATURE_9:FATj CREATURE:NIGHT_CREATURE_9:TALLOWjCREATURE:NIGHT_CREATURE_10:FATj!CREATURE:NIGHT_CREATURE_10:TALLOWjCREATURE:NIGHT_CREATURE_11:FATj!CREATURE:NIGHT_CREATURE_11:TALLOWjCREATURE:NIGHT_CREATURE_12:FATj!CREATURE:NIGHT_CREATURE_12:TALLOWjCREATURE:NIGHT_CREATURE_13:FATj!CREATURE:NIGHT_CREATURE_13:TALLOWjCREATURE:NIGHT_CREATURE_14:FATj!CREATURE:NIGHT_CREATURE_14:TALLOWjCREATURE:NIGHT_CREATURE_15:FATj!CREATURE:NIGHT_CREATURE_15:TALLOWjCREATURE:NIGHT_CREATURE_16:FATj!CREATURE:NIGHT_CREATURE_16:TALLOWjCREATURE:NIGHT_CREATURE_17:FATj!CREATURE:NIGHT_CREATURE_17:TALLOWjCREATURE:NIGHT_CREATURE_18:FATj!CREATURE:NIGHT_CREATURE_18:TALLOWjCREATURE:NIGHT_CREATURE_19:FATj!CREATURE:NIGHT_CREATURE_19:TALLOWjCREATURE:NIGHT_CREATURE_20:FATj!CREATURE:NIGHT_CREATURE_20:TALLOWjCREATURE:NIGHT_CREATURE_21:FATj!CREATURE:NIGHT_CREATURE_21:TALLOWjCREATURE:NIGHT_CREATURE_22:FATj!CREATURE:NIGHT_CREATURE_22:TALLOWjCREATURE:NIGHT_CREATURE_23:FATj!CREATURE:NIGHT_CREATURE_23:TALLOWjCREATURE:NIGHT_CREATURE_24:FATj!CREATURE:NIGHT_CREATURE_24:TALLOWjCREATURE:NIGHT_CREATURE_25:FATj!CREATURE:NIGHT_CREATURE_25:TALLOWjCREATURE:NIGHT_CREATURE_26:FATj!CREATURE:NIGHT_CREATURE_26:TALLOWjCREATURE:NIGHT_CREATURE_27:FATj!CREATURE:NIGHT_CREATURE_27:TALLOWjCREATURE:NIGHT_CREATURE_28:FATj!CREATURE:NIGHT_CREATURE_28:TALLOWjCREATURE:NIGHT_CREATURE_29:FATj!CREATURE:NIGHT_CREATURE_29:TALLOWjCREATURE:NIGHT_CREATURE_30:FATj!CREATURE:NIGHT_CREATURE_30:TALLOWjCREATURE:NIGHT_CREATURE_31:FATj!CREATURE:NIGHT_CREATURE_31:TALLOWjCREATURE:NIGHT_CREATURE_32:FATj!CREATURE:NIGHT_CREATURE_32:TALLOWjCREATURE:NIGHT_CREATURE_33:FATj!CREATURE:NIGHT_CREATURE_33:TALLOWjCREATURE:NIGHT_CREATURE_34:FATj!CREATURE:NIGHT_CREATURE_34:TALLOWjCREATURE:NIGHT_CREATURE_35:FATj!CREATURE:NIGHT_CREATURE_35:TALLOWjCREATURE:NIGHT_CREATURE_36:FATj!CREATURE:NIGHT_CREATURE_36:TALLOWjCREATURE:NIGHT_CREATURE_37:FATj!CREATURE:NIGHT_CREATURE_37:TALLOWjCREATURE:NIGHT_CREATURE_38:FATj!CREATURE:NIGHT_CREATURE_38:TALLOWjCREATURE:NIGHT_CREATURE_39:FATj!CREATURE:NIGHT_CREATURE_39:TALLOWjCREATURE:NIGHT_CREATURE_40:FATj!CREATURE:NIGHT_CREATURE_40:TALLOWjCREATURE:NIGHT_CREATURE_41:FATj!CREATURE:NIGHT_CREATURE_41:TALLOWjCREATURE:NIGHT_CREATURE_42:FATj!CREATURE:NIGHT_CREATURE_42:TALLOWjCREATURE:NIGHT_CREATURE_43:FATj!CREATURE:NIGHT_CREATURE_43:TALLOWjCREATURE:NIGHT_CREATURE_44:FATj!CREATURE:NIGHT_CREATURE_44:TALLOWjCREATURE:NIGHT_CREATURE_45:FATj!CREATURE:NIGHT_CREATURE_45:TALLOWjCREATURE:NIGHT_CREATURE_46:FATj!CREATURE:NIGHT_CREATURE_46:TALLOWjCREATURE:NIGHT_CREATURE_47:FATj!CREATURE:NIGHT_CREATURE_47:TALLOWjCREATURE:NIGHT_CREATURE_48:FATj!CREATURE:NIGHT_CREATURE_48:TALLOWjCREATURE:NIGHT_CREATURE_49:FATj!CREATURE:NIGHT_CREATURE_49:TALLOWjCREATURE:NIGHT_CREATURE_50:FATj!CREATURE:NIGHT_CREATURE_50:TALLOWjCREATURE:NIGHT_CREATURE_51:FATj!CREATURE:NIGHT_CREATURE_51:TALLOWjCREATURE:NIGHT_CREATURE_52:FATj!CREATURE:NIGHT_CREATURE_52:TALLOWjCREATURE:NIGHT_CREATURE_53:FATj!CREATURE:NIGHT_CREATURE_53:TALLOWjCREATURE:NIGHT_CREATURE_54:FATj!CREATURE:NIGHT_CREATURE_54:TALLOWjCREATURE:NIGHT_CREATURE_55:FATj!CREATURE:NIGHT_CREATURE_55:TALLOWjCREATURE:NIGHT_CREATURE_56:FATj!CREATURE:NIGHT_CREATURE_56:TALLOWjCREATURE:NIGHT_CREATURE_57:FATj!CREATURE:NIGHT_CREATURE_57:TALLOWjCREATURE:NIGHT_CREATURE_58:FATj!CREATURE:NIGHT_CREATURE_58:TALLOWjCREATURE:NIGHT_CREATURE_59:FATj!CREATURE:NIGHT_CREATURE_59:TALLOWjCREATURE:NIGHT_CREATURE_60:FATj!CREATURE:NIGHT_CREATURE_60:TALLOWjCREATURE:NIGHT_CREATURE_61:FATj!CREATURE:NIGHT_CREATURE_61:TALLOWjCREATURE:NIGHT_CREATURE_62:FATj!CREATURE:NIGHT_CREATURE_62:TALLOWjCREATURE:NIGHT_CREATURE_63:FATj!CREATURE:NIGHT_CREATURE_63:TALLOWjCREATURE:NIGHT_CREATURE_64:FATj!CREATURE:NIGHT_CREATURE_64:TALLOWjCREATURE:NIGHT_CREATURE_65:FATj!CREATURE:NIGHT_CREATURE_65:TALLOWjCREATURE:NIGHT_CREATURE_66:FATj!CREATURE:NIGHT_CREATURE_66:TALLOWjCREATURE:NIGHT_CREATURE_67:FATj!CREATURE:NIGHT_CREATURE_67:TALLOWjCREATURE:NIGHT_CREATURE_68:FATj!CREATURE:NIGHT_CREATURE_68:TALLOWjCREATURE:NIGHT_CREATURE_69:FATj!CREATURE:NIGHT_CREATURE_69:TALLOWjCREATURE:NIGHT_CREATURE_70:FATj!CREATURE:NIGHT_CREATURE_70:TALLOWjCREATURE:NIGHT_CREATURE_71:FATj!CREATURE:NIGHT_CREATURE_71:TALLOWjCREATURE:NIGHT_CREATURE_72:FATj!CREATURE:NIGHT_CREATURE_72:TALLOWjCREATURE:NIGHT_CREATURE_73:FATj!CREATURE:NIGHT_CREATURE_73:TALLOWjCREATURE:NIGHT_CREATURE_74:FATj!CREATURE:NIGHT_CREATURE_74:TALLOWjCREATURE:NIGHT_CREATURE_75:FATj!CREATURE:NIGHT_CREATURE_75:TALLOWjCREATURE:NIGHT_CREATURE_76:FATj!CREATURE:NIGHT_CREATURE_76:TALLOWjCREATURE:NIGHT_CREATURE_77:FATj!CREATURE:NIGHT_CREATURE_77:TALLOWjCREATURE:NIGHT_CREATURE_78:FATj!CREATURE:NIGHT_CREATURE_78:TALLOWjCREATURE:NIGHT_CREATURE_79:FATj!CREATURE:NIGHT_CREATURE_79:TALLOWjCREATURE:NIGHT_CREATURE_80:FATj!CREATURE:NIGHT_CREATURE_80:TALLOWjCREATURE:NIGHT_CREATURE_81:FATj!CREATURE:NIGHT_CREATURE_81:TALLOWjCREATURE:NIGHT_CREATURE_82:FATj!CREATURE:NIGHT_CREATURE_82:TALLOWjCREATURE:NIGHT_CREATURE_83:FATj!CREATURE:NIGHT_CREATURE_83:TALLOWjCREATURE:NIGHT_CREATURE_84:FATj!CREATURE:NIGHT_CREATURE_84:TALLOWjCREATURE:NIGHT_CREATURE_85:FATj!CREATURE:NIGHT_CREATURE_85:TALLOWjCREATURE:NIGHT_CREATURE_86:FATj!CREATURE:NIGHT_CREATURE_86:TALLOWjCREATURE:NIGHT_CREATURE_87:FATj!CREATURE:NIGHT_CREATURE_87:TALLOWjCREATURE:NIGHT_CREATURE_88:FATj!CREATURE:NIGHT_CREATURE_88:TALLOWjCREATURE:NIGHT_CREATURE_89:FATj!CREATURE:NIGHT_CREATURE_89:TALLOWjCREATURE:NIGHT_CREATURE_90:FATj!CREATURE:NIGHT_CREATURE_90:TALLOWjCREATURE:NIGHT_CREATURE_91:FATj!CREATURE:NIGHT_CREATURE_91:TALLOWjCREATURE:NIGHT_CREATURE_92:FATj!CREATURE:NIGHT_CREATURE_92:TALLOWjCREATURE:NIGHT_CREATURE_93:FATj!CREATURE:NIGHT_CREATURE_93:TALLOWjCREATURE:NIGHT_CREATURE_94:FATj!CREATURE:NIGHT_CREATURE_94:TALLOWjCREATURE:NIGHT_CREATURE_95:FATj!CREATURE:NIGHT_CREATURE_95:TALLOWjCREATURE:NIGHT_CREATURE_96:FATj!CREATURE:NIGHT_CREATURE_96:TALLOWjCREATURE:NIGHT_CREATURE_97:FATj!CREATURE:NIGHT_CREATURE_97:TALLOWjCREATURE:NIGHT_CREATURE_98:FATj!CREATURE:NIGHT_CREATURE_98:TALLOWjCREATURE:NIGHT_CREATURE_99:FATj!CREATURE:NIGHT_CREATURE_99:TALLOWjCREATURE:NIGHT_CREATURE_100:FATj"CREATURE:NIGHT_CREATURE_100:TALLOWjCREATURE:NIGHT_CREATURE_101:FATj"CREATURE:NIGHT_CREATURE_101:TALLOWjCREATURE:NIGHT_CREATURE_102:FATj"CREATURE:NIGHT_CREATURE_102:TALLOWjCREATURE:NIGHT_CREATURE_103:FATj"CREATURE:NIGHT_CREATURE_103:TALLOWjCREATURE:NIGHT_CREATURE_104:FATj"CREATURE:NIGHT_CREATURE_104:TALLOWjCREATURE:HF1248 DIVINE_1:FATjCREATURE:HF1248 DIVINE_1:TALLOWjCREATURE:HF1248 DIVINE_2:FATjCREATURE:HF1248 DIVINE_2:TALLOWjCREATURE:HF1248 DIVINE_3:FATjCREATURE:HF1248 DIVINE_3:TALLOWjCREATURE:HF1108 DIVINE_2:FATjCREATURE:HF1108 DIVINE_2:TALLOWjCREATURE:HF1249 DIVINE_1:FATjCREATURE:HF1249 DIVINE_1:TALLOWjCREATURE:HF1249 DIVINE_3:FATjCREATURE:HF1249 DIVINE_3:TALLOWjCREATURE:HF1345 DIVINE_3:FATjCREATURE:HF1345 DIVINE_3:TALLOWrPLANT:FLAX:SEEDrPLANT:FLAX:THREADrPLANT:JUTE:THREADrPLANT:HEMP:SEEDrPLANT:HEMP:THREADrPLANT:COTTON:SEEDrPLANT:COTTON:THREADrPLANT:RAMIE:THREADrPLANT:KENAF:SEEDrPLANT:KENAF:THREADrPLANT:GRASS_TAIL_PIG:THREADrPLANT:BUSH_QUARRY:SEEDrPLANT:REED_ROPE:THREADzPLANT:FLAX:SEEDzPLANT:HEMP:SEEDzPLANT:COTTON:SEEDzPLANT:KENAF:SEEDzPLANT:OLIVE:FRUITzPLANT:BUSH_QUARRY:SEEDzCREATURE:HONEY_BEE:WAX‚PLANT:FLAX:OIL‚PLANT:HEMP:OIL‚PLANT:COTTON:OIL‚PLANT:KENAF:OIL‚PLANT:OLIVE:OIL‚PLANT:POD_SWEET:EXTRACT‚PLANT:BUSH_QUARRY:OIL‚PLANT:BULB_KOBOLD:EXTRACT‚PLANT:HERB_VALLEY:EXTRACTŠCREATURE:BARK_SCORPION:VENOMŠ CREATURE:BARK_SCORPION_MAN:VENOMŠ"CREATURE:GIANT_BARK_SCORPION:VENOMŠ#CREATURE:SPIDER_BROWN_RECLUSE:VENOMŠ'CREATURE:BROWN_RECLUSE_SPIDER_MAN:VENOMŠ)CREATURE:GIANT_BROWN_RECLUSE_SPIDER:VENOMŠCREATURE:GILA_MONSTER:VENOMŠCREATURE:GILA_MONSTER_MAN:VENOMŠ!CREATURE:GIANT_GILA_MONSTER:VENOMŠCREATURE:DONKEY:MILKŠCREATURE:HORSE:MILKŠCREATURE:COW:MILKŠCREATURE:SHEEP:MILKŠCREATURE:PIG:MILKŠCREATURE:GOAT:MILKŠCREATURE:WATER_BUFFALO:MILKŠCREATURE:REINDEER:MILKŠCREATURE:YAK:MILKŠCREATURE:LLAMA:MILKŠCREATURE:ALPACA:MILKŠCREATURE:HONEY_BEE:ROYAL_JELLYŠCREATURE:HONEY_BEE:HONEYŠCREATURE:HONEY_BEE:VENOMŠCREATURE:BUMBLEBEE:ROYAL_JELLYŠCREATURE:BUMBLEBEE:HONEYŠCREATURE:BUMBLEBEE:VENOMŠCREATURE:PLATYPUS:VENOMŠCREATURE:PLATYPUS MAN:VENOMŠCREATURE:PLATYPUS, GIANT:VENOMŠCREATURE:CAMEL_1_HUMP:MILKŠCREATURE:CAMEL_1_HUMP_MAN:MILKŠ CREATURE:GIANT_CAMEL_1_HUMP:MILKŠCREATURE:CAMEL_2_HUMP:MILKŠCREATURE:CAMEL_2_HUMP_MAN:MILKŠ CREATURE:GIANT_CAMEL_2_HUMP:MILKŠCREATURE:HELMET_SNAKE:VENOMŠCREATURE:CAVE_FLOATER:POD_JUICEŠCREATURE:CAVE_BLOB:FLUIDŠCREATURE:OCTOPUS:INKŠCREATURE:OCTOPUS_MAN:INKŠCREATURE:GIANT_OCTOPUS:INKŠCREATURE:CUTTLEFISH:INKŠCREATURE:CUTTLEFISH_MAN:INKŠCREATURE:GIANT_CUTTLEFISH:INKŠCREATURE:MOGHOPPER:MOG_JUICEŠCREATURE:SPIDER_PHANTOM:VENOMŠCREATURE:SQUID:INKŠCREATURE:SQUID MAN:INKŠCREATURE:GIGANTIC SQUID:INKŠ!CREATURE:SPIDER_CAVE_GIANT:POISONŠCREATURE:SPIDER_CAVE:VENOMŠCREATURE:MAGGOT_PURRING:MILKŠCREATURE:ELEMENTMAN_IRON:GASŠCREATURE:SERPENT_MAN:VENOMŠCREATURE:KANGAROO:MILKŠCREATURE:KANGAROO_MAN:MILKŠCREATURE:GIANT_KANGAROO:MILKŠCREATURE:ADDER:VENOMŠCREATURE:ADDER_MAN:VENOMŠCREATURE:GIANT_ADDER:VENOMŠCREATURE:RATTLESNAKE:VENOMŠCREATURE:RATTLESNAKE_MAN:VENOMŠ CREATURE:GIANT_RATTLESNAKE:VENOMŠCREATURE:COPPERHEAD_SNAKE:VENOMŠ#CREATURE:COPPERHEAD_SNAKE_MAN:VENOMŠ%CREATURE:GIANT_COPPERHEAD_SNAKE:VENOMŠCREATURE:KING_COBRA:VENOMŠCREATURE:KING_COBRA_MAN:VENOMŠCREATURE:GIANT_KING_COBRA:VENOMŠCREATURE:BLACK_MAMBA:VENOMŠCREATURE:BLACK_MAMBA_MAN:VENOMŠ CREATURE:GIANT_BLACK_MAMBA:VENOMŠCREATURE:BUSHMASTER:VENOMŠCREATURE:BUSHMASTER_MAN:VENOMŠCREATURE:GIANT_BUSHMASTER:VENOMŠCREATURE:TAPIR:MILKŠCREATURE:TAPIR_MAN:MILKŠCREATURE:GIANT_TAPIR:MILKŠ!CREATURE:FORGOTTEN_BEAST_2:POISONŠ!CREATURE:FORGOTTEN_BEAST_4:POISONŠ!CREATURE:FORGOTTEN_BEAST_5:POISONŠ!CREATURE:FORGOTTEN_BEAST_7:POISONŠ!CREATURE:FORGOTTEN_BEAST_8:POISONŠ!CREATURE:FORGOTTEN_BEAST_9:POISONŠ"CREATURE:FORGOTTEN_BEAST_11:POISONŠ"CREATURE:FORGOTTEN_BEAST_13:POISONŠ"CREATURE:FORGOTTEN_BEAST_15:POISONŠ"CREATURE:FORGOTTEN_BEAST_16:POISONŠ"CREATURE:FORGOTTEN_BEAST_18:POISONŠ"CREATURE:FORGOTTEN_BEAST_19:POISONŠ"CREATURE:FORGOTTEN_BEAST_20:POISONŠ"CREATURE:FORGOTTEN_BEAST_21:POISONŠ"CREATURE:FORGOTTEN_BEAST_22:POISONŠ"CREATURE:FORGOTTEN_BEAST_24:POISONŠ"CREATURE:FORGOTTEN_BEAST_25:POISONŠ"CREATURE:FORGOTTEN_BEAST_27:POISONŠ"CREATURE:FORGOTTEN_BEAST_28:POISONŠ"CREATURE:FORGOTTEN_BEAST_33:POISONŠ"CREATURE:FORGOTTEN_BEAST_36:POISONŠ"CREATURE:FORGOTTEN_BEAST_37:POISONŠ"CREATURE:FORGOTTEN_BEAST_39:POISONŠ"CREATURE:FORGOTTEN_BEAST_40:POISONŠ"CREATURE:FORGOTTEN_BEAST_41:POISONŠ"CREATURE:FORGOTTEN_BEAST_43:POISONŠ"CREATURE:FORGOTTEN_BEAST_44:POISONŠ"CREATURE:FORGOTTEN_BEAST_45:POISONŠ"CREATURE:FORGOTTEN_BEAST_46:POISONŠ"CREATURE:FORGOTTEN_BEAST_48:POISONŠ"CREATURE:FORGOTTEN_BEAST_49:POISONŠ"CREATURE:FORGOTTEN_BEAST_50:POISONŠ"CREATURE:FORGOTTEN_BEAST_51:POISONŠ"CREATURE:FORGOTTEN_BEAST_56:POISONŠ"CREATURE:FORGOTTEN_BEAST_59:POISONŠ"CREATURE:FORGOTTEN_BEAST_61:POISONŠ"CREATURE:FORGOTTEN_BEAST_62:POISONŠ"CREATURE:FORGOTTEN_BEAST_64:POISONŠ"CREATURE:FORGOTTEN_BEAST_66:POISONŠ"CREATURE:FORGOTTEN_BEAST_67:POISONŠ"CREATURE:FORGOTTEN_BEAST_69:POISONŠ"CREATURE:FORGOTTEN_BEAST_70:POISONŠ"CREATURE:FORGOTTEN_BEAST_72:POISONŠ"CREATURE:FORGOTTEN_BEAST_73:POISONŠ"CREATURE:FORGOTTEN_BEAST_75:POISONŠ"CREATURE:FORGOTTEN_BEAST_77:POISONŠ"CREATURE:FORGOTTEN_BEAST_78:POISONŠ"CREATURE:FORGOTTEN_BEAST_80:POISONŠ"CREATURE:FORGOTTEN_BEAST_82:POISONŠ"CREATURE:FORGOTTEN_BEAST_84:POISONŠ"CREATURE:FORGOTTEN_BEAST_88:POISONŠ"CREATURE:FORGOTTEN_BEAST_89:POISONŠ"CREATURE:FORGOTTEN_BEAST_90:POISONŠ"CREATURE:FORGOTTEN_BEAST_92:POISONŠ"CREATURE:FORGOTTEN_BEAST_93:POISONŠ"CREATURE:FORGOTTEN_BEAST_94:POISONŠ"CREATURE:FORGOTTEN_BEAST_95:POISONŠ"CREATURE:FORGOTTEN_BEAST_97:POISONŠ"CREATURE:FORGOTTEN_BEAST_98:POISONŠ#CREATURE:FORGOTTEN_BEAST_100:POISONŠ#CREATURE:FORGOTTEN_BEAST_104:POISONŠ#CREATURE:FORGOTTEN_BEAST_105:POISONŠ#CREATURE:FORGOTTEN_BEAST_106:POISONŠ#CREATURE:FORGOTTEN_BEAST_107:POISONŠ#CREATURE:FORGOTTEN_BEAST_108:POISONŠ#CREATURE:FORGOTTEN_BEAST_110:POISONŠ#CREATURE:FORGOTTEN_BEAST_114:POISONŠ#CREATURE:FORGOTTEN_BEAST_115:POISONŠ#CREATURE:FORGOTTEN_BEAST_116:POISONŠ#CREATURE:FORGOTTEN_BEAST_117:POISONŠ#CREATURE:FORGOTTEN_BEAST_118:POISONŠ#CREATURE:FORGOTTEN_BEAST_120:POISONŠ#CREATURE:FORGOTTEN_BEAST_122:POISONŠ#CREATURE:FORGOTTEN_BEAST_123:POISONŠ#CREATURE:FORGOTTEN_BEAST_124:POISONŠ#CREATURE:FORGOTTEN_BEAST_126:POISONŠ#CREATURE:FORGOTTEN_BEAST_127:POISONŠ#CREATURE:FORGOTTEN_BEAST_130:POISONŠ#CREATURE:FORGOTTEN_BEAST_133:POISONŠ#CREATURE:FORGOTTEN_BEAST_134:POISONŠ#CREATURE:FORGOTTEN_BEAST_135:POISONŠ#CREATURE:FORGOTTEN_BEAST_136:POISONŠ#CREATURE:FORGOTTEN_BEAST_138:POISONŠ#CREATURE:FORGOTTEN_BEAST_139:POISONŠ#CREATURE:FORGOTTEN_BEAST_141:POISONŠ#CREATURE:FORGOTTEN_BEAST_143:POISONŠ#CREATURE:FORGOTTEN_BEAST_145:POISONŠ#CREATURE:FORGOTTEN_BEAST_147:POISONŠ#CREATURE:FORGOTTEN_BEAST_148:POISONŠ#CREATURE:FORGOTTEN_BEAST_151:POISONŠ#CREATURE:FORGOTTEN_BEAST_154:POISONŠ#CREATURE:FORGOTTEN_BEAST_155:POISONŠ#CREATURE:FORGOTTEN_BEAST_156:POISONŠ#CREATURE:FORGOTTEN_BEAST_157:POISONŠ#CREATURE:FORGOTTEN_BEAST_158:POISONŠ#CREATURE:FORGOTTEN_BEAST_160:POISONŠ#CREATURE:FORGOTTEN_BEAST_163:POISONŠ#CREATURE:FORGOTTEN_BEAST_165:POISONŠ#CREATURE:FORGOTTEN_BEAST_167:POISONŠ#CREATURE:FORGOTTEN_BEAST_170:POISONŠ#CREATURE:FORGOTTEN_BEAST_171:POISONŠ#CREATURE:FORGOTTEN_BEAST_172:POISONŠ#CREATURE:FORGOTTEN_BEAST_175:POISONŠ#CREATURE:FORGOTTEN_BEAST_176:POISONŠ#CREATURE:FORGOTTEN_BEAST_178:POISONŠ#CREATURE:FORGOTTEN_BEAST_179:POISONŠ#CREATURE:FORGOTTEN_BEAST_182:POISONŠ#CREATURE:FORGOTTEN_BEAST_183:POISONŠ#CREATURE:FORGOTTEN_BEAST_184:POISONŠ#CREATURE:FORGOTTEN_BEAST_185:POISONŠ#CREATURE:FORGOTTEN_BEAST_187:POISONŠ#CREATURE:FORGOTTEN_BEAST_188:POISONŠ#CREATURE:FORGOTTEN_BEAST_189:POISONŠ#CREATURE:FORGOTTEN_BEAST_190:POISONŠ#CREATURE:FORGOTTEN_BEAST_191:POISONŠ#CREATURE:FORGOTTEN_BEAST_192:POISONŠ#CREATURE:FORGOTTEN_BEAST_193:POISONŠ#CREATURE:FORGOTTEN_BEAST_194:POISONŠ#CREATURE:FORGOTTEN_BEAST_196:POISONŠ#CREATURE:FORGOTTEN_BEAST_197:POISONŠ#CREATURE:FORGOTTEN_BEAST_198:POISONŠ#CREATURE:FORGOTTEN_BEAST_199:POISONŠ#CREATURE:FORGOTTEN_BEAST_201:POISONŠ#CREATURE:FORGOTTEN_BEAST_203:POISONŠ#CREATURE:FORGOTTEN_BEAST_206:POISONŠ#CREATURE:FORGOTTEN_BEAST_207:POISONŠ#CREATURE:FORGOTTEN_BEAST_208:POISONŠ#CREATURE:FORGOTTEN_BEAST_210:POISONŠ#CREATURE:FORGOTTEN_BEAST_212:POISONŠ#CREATURE:FORGOTTEN_BEAST_213:POISONŠ#CREATURE:FORGOTTEN_BEAST_215:POISONŠ#CREATURE:FORGOTTEN_BEAST_216:POISONŠ#CREATURE:FORGOTTEN_BEAST_217:POISONŠ#CREATURE:FORGOTTEN_BEAST_218:POISONŠ#CREATURE:FORGOTTEN_BEAST_219:POISONŠ#CREATURE:FORGOTTEN_BEAST_220:POISONŠ#CREATURE:FORGOTTEN_BEAST_221:POISONŠ#CREATURE:FORGOTTEN_BEAST_223:POISONŠ#CREATURE:FORGOTTEN_BEAST_225:POISONŠ#CREATURE:FORGOTTEN_BEAST_227:POISONŠ#CREATURE:FORGOTTEN_BEAST_228:POISONŠ#CREATURE:FORGOTTEN_BEAST_230:POISONŠ#CREATURE:FORGOTTEN_BEAST_232:POISONŠ#CREATURE:FORGOTTEN_BEAST_233:POISONŠ#CREATURE:FORGOTTEN_BEAST_234:POISONŠ#CREATURE:FORGOTTEN_BEAST_236:POISONŠ#CREATURE:FORGOTTEN_BEAST_237:POISONŠ#CREATURE:FORGOTTEN_BEAST_240:POISONŠ#CREATURE:FORGOTTEN_BEAST_243:POISONŠ#CREATURE:FORGOTTEN_BEAST_244:POISONŠ#CREATURE:FORGOTTEN_BEAST_245:POISONŠ#CREATURE:FORGOTTEN_BEAST_247:POISONŠ#CREATURE:FORGOTTEN_BEAST_249:POISONŠ#CREATURE:FORGOTTEN_BEAST_252:POISONŠ#CREATURE:FORGOTTEN_BEAST_253:POISONŠ#CREATURE:FORGOTTEN_BEAST_254:POISONŠ#CREATURE:FORGOTTEN_BEAST_255:POISONŠ#CREATURE:FORGOTTEN_BEAST_256:POISONŠ#CREATURE:FORGOTTEN_BEAST_257:POISONŠ#CREATURE:FORGOTTEN_BEAST_258:POISONŠ#CREATURE:FORGOTTEN_BEAST_259:POISONŠ#CREATURE:FORGOTTEN_BEAST_260:POISONŠ#CREATURE:FORGOTTEN_BEAST_263:POISONŠ#CREATURE:FORGOTTEN_BEAST_264:POISONŠ#CREATURE:FORGOTTEN_BEAST_265:POISONŠ#CREATURE:FORGOTTEN_BEAST_266:POISONŠ#CREATURE:FORGOTTEN_BEAST_268:POISONŠ#CREATURE:FORGOTTEN_BEAST_269:POISONŠ#CREATURE:FORGOTTEN_BEAST_270:POISONŠ#CREATURE:FORGOTTEN_BEAST_271:POISONŠ#CREATURE:FORGOTTEN_BEAST_272:POISONŠ#CREATURE:FORGOTTEN_BEAST_273:POISONŠ#CREATURE:FORGOTTEN_BEAST_274:POISONŠ#CREATURE:FORGOTTEN_BEAST_275:POISONŠ#CREATURE:FORGOTTEN_BEAST_276:POISONŠ#CREATURE:FORGOTTEN_BEAST_278:POISONŠ#CREATURE:FORGOTTEN_BEAST_279:POISONŠ#CREATURE:FORGOTTEN_BEAST_283:POISONŠ#CREATURE:FORGOTTEN_BEAST_286:POISONŠ#CREATURE:FORGOTTEN_BEAST_288:POISONŠ#CREATURE:FORGOTTEN_BEAST_291:POISONŠ#CREATURE:FORGOTTEN_BEAST_295:POISONŠ#CREATURE:FORGOTTEN_BEAST_296:POISONŠ#CREATURE:FORGOTTEN_BEAST_297:POISONŠ#CREATURE:FORGOTTEN_BEAST_299:POISONŠ#CREATURE:FORGOTTEN_BEAST_300:POISONŠ#CREATURE:FORGOTTEN_BEAST_301:POISONŠ#CREATURE:FORGOTTEN_BEAST_302:POISONŠ#CREATURE:FORGOTTEN_BEAST_303:POISONŠ#CREATURE:FORGOTTEN_BEAST_305:POISONŠ#CREATURE:FORGOTTEN_BEAST_306:POISONŠ#CREATURE:FORGOTTEN_BEAST_307:POISONŠ#CREATURE:FORGOTTEN_BEAST_310:POISONŠ#CREATURE:FORGOTTEN_BEAST_312:POISONŠ#CREATURE:FORGOTTEN_BEAST_314:POISONŠ#CREATURE:FORGOTTEN_BEAST_315:POISONŠ#CREATURE:FORGOTTEN_BEAST_316:POISONŠ#CREATURE:FORGOTTEN_BEAST_319:POISONŠ#CREATURE:FORGOTTEN_BEAST_321:POISONŠ#CREATURE:FORGOTTEN_BEAST_322:POISONŠ#CREATURE:FORGOTTEN_BEAST_323:POISONŠ#CREATURE:FORGOTTEN_BEAST_324:POISONŠ#CREATURE:FORGOTTEN_BEAST_325:POISONŠ#CREATURE:FORGOTTEN_BEAST_327:POISONŠ#CREATURE:FORGOTTEN_BEAST_328:POISONŠ#CREATURE:FORGOTTEN_BEAST_329:POISONŠ#CREATURE:FORGOTTEN_BEAST_332:POISONŠ#CREATURE:FORGOTTEN_BEAST_334:POISONŠ#CREATURE:FORGOTTEN_BEAST_335:POISONŠ#CREATURE:FORGOTTEN_BEAST_336:POISONŠ#CREATURE:FORGOTTEN_BEAST_337:POISONŠ#CREATURE:FORGOTTEN_BEAST_338:POISONŠ#CREATURE:FORGOTTEN_BEAST_339:POISONŠ#CREATURE:FORGOTTEN_BEAST_341:POISONŠ#CREATURE:FORGOTTEN_BEAST_342:POISONŠ#CREATURE:FORGOTTEN_BEAST_343:POISONŠ#CREATURE:FORGOTTEN_BEAST_344:POISONŠ#CREATURE:FORGOTTEN_BEAST_348:POISONŠ#CREATURE:FORGOTTEN_BEAST_349:POISONŠ#CREATURE:FORGOTTEN_BEAST_351:POISONŠ#CREATURE:FORGOTTEN_BEAST_352:POISONŠ#CREATURE:FORGOTTEN_BEAST_353:POISONŠ#CREATURE:FORGOTTEN_BEAST_354:POISONŠ#CREATURE:FORGOTTEN_BEAST_355:POISONŠ#CREATURE:FORGOTTEN_BEAST_356:POISONŠ#CREATURE:FORGOTTEN_BEAST_357:POISONŠ#CREATURE:FORGOTTEN_BEAST_358:POISONŠ#CREATURE:FORGOTTEN_BEAST_359:POISONŠ#CREATURE:FORGOTTEN_BEAST_361:POISONŠ#CREATURE:FORGOTTEN_BEAST_363:POISONŠ#CREATURE:FORGOTTEN_BEAST_364:POISONŠ#CREATURE:FORGOTTEN_BEAST_365:POISONŠ#CREATURE:FORGOTTEN_BEAST_366:POISONŠ#CREATURE:FORGOTTEN_BEAST_367:POISONŠ#CREATURE:FORGOTTEN_BEAST_368:POISONŠ#CREATURE:FORGOTTEN_BEAST_369:POISONŠ#CREATURE:FORGOTTEN_BEAST_370:POISONŠ#CREATURE:FORGOTTEN_BEAST_375:POISONŠ#CREATURE:FORGOTTEN_BEAST_377:POISONŠ#CREATURE:FORGOTTEN_BEAST_378:POISONŠ#CREATURE:FORGOTTEN_BEAST_382:POISONŠ#CREATURE:FORGOTTEN_BEAST_385:POISONŠ#CREATURE:FORGOTTEN_BEAST_386:POISONŠ#CREATURE:FORGOTTEN_BEAST_387:POISONŠ#CREATURE:FORGOTTEN_BEAST_388:POISONŠ#CREATURE:FORGOTTEN_BEAST_389:POISONŠ#CREATURE:FORGOTTEN_BEAST_390:POISONŠ#CREATURE:FORGOTTEN_BEAST_391:POISONŠ#CREATURE:FORGOTTEN_BEAST_392:POISONŠ#CREATURE:FORGOTTEN_BEAST_394:POISONŠ#CREATURE:FORGOTTEN_BEAST_395:POISONŠ#CREATURE:FORGOTTEN_BEAST_398:POISONŠ#CREATURE:FORGOTTEN_BEAST_399:POISONŠ#CREATURE:FORGOTTEN_BEAST_400:POISONŠ#CREATURE:FORGOTTEN_BEAST_402:POISONŠ#CREATURE:FORGOTTEN_BEAST_405:POISONŠ#CREATURE:FORGOTTEN_BEAST_408:POISONŠ#CREATURE:FORGOTTEN_BEAST_409:POISONŠ#CREATURE:FORGOTTEN_BEAST_410:POISONŠ#CREATURE:FORGOTTEN_BEAST_412:POISONŠ#CREATURE:FORGOTTEN_BEAST_413:POISONŠ#CREATURE:FORGOTTEN_BEAST_414:POISONŠ#CREATURE:FORGOTTEN_BEAST_415:POISONŠ#CREATURE:FORGOTTEN_BEAST_416:POISONŠ#CREATURE:FORGOTTEN_BEAST_417:POISONŠ#CREATURE:FORGOTTEN_BEAST_418:POISONŠ#CREATURE:FORGOTTEN_BEAST_419:POISONŠ#CREATURE:FORGOTTEN_BEAST_420:POISONŠ#CREATURE:FORGOTTEN_BEAST_421:POISONŠ#CREATURE:FORGOTTEN_BEAST_422:POISONŠ#CREATURE:FORGOTTEN_BEAST_423:POISONŠ#CREATURE:FORGOTTEN_BEAST_425:POISONŠ#CREATURE:FORGOTTEN_BEAST_431:POISONŠ#CREATURE:FORGOTTEN_BEAST_433:POISONŠ#CREATURE:FORGOTTEN_BEAST_434:POISONŠ#CREATURE:FORGOTTEN_BEAST_436:POISONŠ#CREATURE:FORGOTTEN_BEAST_437:POISONŠ#CREATURE:FORGOTTEN_BEAST_439:POISONŠ#CREATURE:FORGOTTEN_BEAST_441:POISONŠ#CREATURE:FORGOTTEN_BEAST_443:POISONŠ#CREATURE:FORGOTTEN_BEAST_444:POISONŠ#CREATURE:FORGOTTEN_BEAST_445:POISONŠ#CREATURE:FORGOTTEN_BEAST_447:POISONŠ#CREATURE:FORGOTTEN_BEAST_449:POISONŠ#CREATURE:FORGOTTEN_BEAST_450:POISONŠ#CREATURE:FORGOTTEN_BEAST_451:POISONŠ#CREATURE:FORGOTTEN_BEAST_452:POISONŠ#CREATURE:FORGOTTEN_BEAST_453:POISONŠ#CREATURE:FORGOTTEN_BEAST_454:POISONŠ#CREATURE:FORGOTTEN_BEAST_455:POISONŠ#CREATURE:FORGOTTEN_BEAST_459:POISONŠ#CREATURE:FORGOTTEN_BEAST_461:POISONŠ#CREATURE:FORGOTTEN_BEAST_462:POISONŠ#CREATURE:FORGOTTEN_BEAST_463:POISONŠ#CREATURE:FORGOTTEN_BEAST_464:POISONŠ#CREATURE:FORGOTTEN_BEAST_469:POISONŠ#CREATURE:FORGOTTEN_BEAST_470:POISONŠ#CREATURE:FORGOTTEN_BEAST_474:POISONŠ#CREATURE:FORGOTTEN_BEAST_475:POISONŠ#CREATURE:FORGOTTEN_BEAST_476:POISONŠ#CREATURE:FORGOTTEN_BEAST_477:POISONŠ#CREATURE:FORGOTTEN_BEAST_478:POISONŠ#CREATURE:FORGOTTEN_BEAST_480:POISONŠ#CREATURE:FORGOTTEN_BEAST_481:POISONŠ#CREATURE:FORGOTTEN_BEAST_482:POISONŠ#CREATURE:FORGOTTEN_BEAST_483:POISONŠ#CREATURE:FORGOTTEN_BEAST_484:POISONŠ#CREATURE:FORGOTTEN_BEAST_485:POISONŠ#CREATURE:FORGOTTEN_BEAST_487:POISONŠ#CREATURE:FORGOTTEN_BEAST_489:POISONŠ#CREATURE:FORGOTTEN_BEAST_492:POISONŠ#CREATURE:FORGOTTEN_BEAST_494:POISONŠ#CREATURE:FORGOTTEN_BEAST_495:POISONŠ#CREATURE:FORGOTTEN_BEAST_497:POISONŠ#CREATURE:FORGOTTEN_BEAST_498:POISONŠ#CREATURE:FORGOTTEN_BEAST_499:POISONŠ#CREATURE:FORGOTTEN_BEAST_500:POISONŠ#CREATURE:FORGOTTEN_BEAST_501:POISONŠ#CREATURE:FORGOTTEN_BEAST_502:POISONŠ#CREATURE:FORGOTTEN_BEAST_503:POISONŠ#CREATURE:FORGOTTEN_BEAST_505:POISONŠ#CREATURE:FORGOTTEN_BEAST_506:POISONŠ#CREATURE:FORGOTTEN_BEAST_507:POISONŠ#CREATURE:FORGOTTEN_BEAST_509:POISONŠ#CREATURE:FORGOTTEN_BEAST_512:POISONŠ#CREATURE:FORGOTTEN_BEAST_513:POISONŠ#CREATURE:FORGOTTEN_BEAST_514:POISONŠ#CREATURE:FORGOTTEN_BEAST_515:POISONŠ#CREATURE:FORGOTTEN_BEAST_516:POISONŠ#CREATURE:FORGOTTEN_BEAST_518:POISONŠ#CREATURE:FORGOTTEN_BEAST_519:POISONŠ#CREATURE:FORGOTTEN_BEAST_522:POISONŠ#CREATURE:FORGOTTEN_BEAST_524:POISONŠ#CREATURE:FORGOTTEN_BEAST_525:POISONŠ#CREATURE:FORGOTTEN_BEAST_526:POISONŠ#CREATURE:FORGOTTEN_BEAST_527:POISONŠ#CREATURE:FORGOTTEN_BEAST_528:POISONŠ#CREATURE:FORGOTTEN_BEAST_529:POISONŠ#CREATURE:FORGOTTEN_BEAST_532:POISONŠ#CREATURE:FORGOTTEN_BEAST_533:POISONŠ#CREATURE:FORGOTTEN_BEAST_534:POISONŠ#CREATURE:FORGOTTEN_BEAST_535:POISONŠ#CREATURE:FORGOTTEN_BEAST_536:POISONŠ#CREATURE:FORGOTTEN_BEAST_537:POISONŠ#CREATURE:FORGOTTEN_BEAST_539:POISONŠ#CREATURE:FORGOTTEN_BEAST_540:POISONŠ#CREATURE:FORGOTTEN_BEAST_543:POISONŠ#CREATURE:FORGOTTEN_BEAST_544:POISONŠ#CREATURE:FORGOTTEN_BEAST_545:POISONŠ#CREATURE:FORGOTTEN_BEAST_546:POISONŠ#CREATURE:FORGOTTEN_BEAST_547:POISONŠ#CREATURE:FORGOTTEN_BEAST_548:POISONŠ#CREATURE:FORGOTTEN_BEAST_550:POISONŠ#CREATURE:FORGOTTEN_BEAST_551:POISONŠ#CREATURE:FORGOTTEN_BEAST_554:POISONŠ#CREATURE:FORGOTTEN_BEAST_555:POISONŠ#CREATURE:FORGOTTEN_BEAST_557:POISONŠ#CREATURE:FORGOTTEN_BEAST_558:POISONŠ#CREATURE:FORGOTTEN_BEAST_559:POISONŠ#CREATURE:FORGOTTEN_BEAST_565:POISONŠ#CREATURE:FORGOTTEN_BEAST_569:POISONŠ#CREATURE:FORGOTTEN_BEAST_570:POISONŠ#CREATURE:FORGOTTEN_BEAST_571:POISONŠ#CREATURE:FORGOTTEN_BEAST_572:POISONŠ#CREATURE:FORGOTTEN_BEAST_574:POISONŠ#CREATURE:FORGOTTEN_BEAST_577:POISONŠ#CREATURE:FORGOTTEN_BEAST_578:POISONŠ#CREATURE:FORGOTTEN_BEAST_579:POISONŠ#CREATURE:FORGOTTEN_BEAST_581:POISONŠ#CREATURE:FORGOTTEN_BEAST_583:POISONŠ#CREATURE:FORGOTTEN_BEAST_584:POISONŠ#CREATURE:FORGOTTEN_BEAST_585:POISONŠ#CREATURE:FORGOTTEN_BEAST_586:POISONŠ#CREATURE:FORGOTTEN_BEAST_587:POISONŠ#CREATURE:FORGOTTEN_BEAST_589:POISONŠ#CREATURE:FORGOTTEN_BEAST_590:POISONŠ#CREATURE:FORGOTTEN_BEAST_591:POISONŠ#CREATURE:FORGOTTEN_BEAST_592:POISONŠ#CREATURE:FORGOTTEN_BEAST_593:POISONŠ#CREATURE:FORGOTTEN_BEAST_594:POISONŠ#CREATURE:FORGOTTEN_BEAST_595:POISONŠ#CREATURE:FORGOTTEN_BEAST_597:POISONŠ#CREATURE:FORGOTTEN_BEAST_598:POISONŠ#CREATURE:FORGOTTEN_BEAST_599:POISONŠ#CREATURE:FORGOTTEN_BEAST_601:POISONŠ#CREATURE:FORGOTTEN_BEAST_602:POISONŠ#CREATURE:FORGOTTEN_BEAST_604:POISONŠ#CREATURE:FORGOTTEN_BEAST_607:POISONŠ#CREATURE:FORGOTTEN_BEAST_608:POISONŠ#CREATURE:FORGOTTEN_BEAST_609:POISONŠ#CREATURE:FORGOTTEN_BEAST_610:POISONŠ#CREATURE:FORGOTTEN_BEAST_618:POISONŠ#CREATURE:FORGOTTEN_BEAST_620:POISONŠ#CREATURE:FORGOTTEN_BEAST_621:POISONŠ#CREATURE:FORGOTTEN_BEAST_622:POISONŠ#CREATURE:FORGOTTEN_BEAST_624:POISONŠ#CREATURE:FORGOTTEN_BEAST_626:POISONŠ#CREATURE:FORGOTTEN_BEAST_627:POISONŠ#CREATURE:FORGOTTEN_BEAST_629:POISONŠ#CREATURE:FORGOTTEN_BEAST_632:POISONŠ#CREATURE:FORGOTTEN_BEAST_633:POISONŠ#CREATURE:FORGOTTEN_BEAST_634:POISONŠ#CREATURE:FORGOTTEN_BEAST_636:POISONŠ#CREATURE:FORGOTTEN_BEAST_638:POISONŠ#CREATURE:FORGOTTEN_BEAST_640:POISONŠ#CREATURE:FORGOTTEN_BEAST_641:POISONŠ#CREATURE:FORGOTTEN_BEAST_644:POISONŠ#CREATURE:FORGOTTEN_BEAST_645:POISONŠ#CREATURE:FORGOTTEN_BEAST_646:POISONŠ#CREATURE:FORGOTTEN_BEAST_647:POISONŠ#CREATURE:FORGOTTEN_BEAST_648:POISONŠ#CREATURE:FORGOTTEN_BEAST_649:POISONŠ#CREATURE:FORGOTTEN_BEAST_652:POISONŠ#CREATURE:FORGOTTEN_BEAST_656:POISONŠ#CREATURE:FORGOTTEN_BEAST_658:POISONŠ#CREATURE:FORGOTTEN_BEAST_659:POISONŠ#CREATURE:FORGOTTEN_BEAST_660:POISONŠ#CREATURE:FORGOTTEN_BEAST_663:POISONŠ#CREATURE:FORGOTTEN_BEAST_664:POISONŠ#CREATURE:FORGOTTEN_BEAST_666:POISONŠ#CREATURE:FORGOTTEN_BEAST_667:POISONŠ#CREATURE:FORGOTTEN_BEAST_668:POISONŠ#CREATURE:FORGOTTEN_BEAST_669:POISONŠ#CREATURE:FORGOTTEN_BEAST_670:POISONŠ#CREATURE:FORGOTTEN_BEAST_671:POISONŠ#CREATURE:FORGOTTEN_BEAST_674:POISONŠ#CREATURE:FORGOTTEN_BEAST_675:POISONŠ#CREATURE:FORGOTTEN_BEAST_678:POISONŠ#CREATURE:FORGOTTEN_BEAST_679:POISONŠ#CREATURE:FORGOTTEN_BEAST_681:POISONŠ#CREATURE:FORGOTTEN_BEAST_682:POISONŠ#CREATURE:FORGOTTEN_BEAST_686:POISONŠ#CREATURE:FORGOTTEN_BEAST_688:POISONŠ#CREATURE:FORGOTTEN_BEAST_689:POISONŠ#CREATURE:FORGOTTEN_BEAST_691:POISONŠ#CREATURE:FORGOTTEN_BEAST_692:POISONŠ#CREATURE:FORGOTTEN_BEAST_696:POISONŠ#CREATURE:FORGOTTEN_BEAST_698:POISONŠ#CREATURE:FORGOTTEN_BEAST_699:POISONŠ#CREATURE:FORGOTTEN_BEAST_702:POISONŠ#CREATURE:FORGOTTEN_BEAST_703:POISONŠ#CREATURE:FORGOTTEN_BEAST_704:POISONŠ#CREATURE:FORGOTTEN_BEAST_705:POISONŠ#CREATURE:FORGOTTEN_BEAST_707:POISONŠ#CREATURE:FORGOTTEN_BEAST_708:POISONŠ#CREATURE:FORGOTTEN_BEAST_709:POISONŠ#CREATURE:FORGOTTEN_BEAST_711:POISONŠ#CREATURE:FORGOTTEN_BEAST_712:POISONŠ#CREATURE:FORGOTTEN_BEAST_713:POISONŠ#CREATURE:FORGOTTEN_BEAST_714:POISONŠ#CREATURE:FORGOTTEN_BEAST_715:POISONŠ#CREATURE:FORGOTTEN_BEAST_718:POISONŠ#CREATURE:FORGOTTEN_BEAST_719:POISONŠ#CREATURE:FORGOTTEN_BEAST_721:POISONŠ#CREATURE:FORGOTTEN_BEAST_722:POISONŠ#CREATURE:FORGOTTEN_BEAST_724:POISONŠ#CREATURE:FORGOTTEN_BEAST_725:POISONŠ#CREATURE:FORGOTTEN_BEAST_726:POISONŠ#CREATURE:FORGOTTEN_BEAST_727:POISONŠ#CREATURE:FORGOTTEN_BEAST_731:POISONŠ#CREATURE:FORGOTTEN_BEAST_732:POISONŠ#CREATURE:FORGOTTEN_BEAST_733:POISONŠ#CREATURE:FORGOTTEN_BEAST_735:POISONŠ#CREATURE:FORGOTTEN_BEAST_737:POISONŠ#CREATURE:FORGOTTEN_BEAST_738:POISONŠ#CREATURE:FORGOTTEN_BEAST_739:POISONŠ#CREATURE:FORGOTTEN_BEAST_740:POISONŠ#CREATURE:FORGOTTEN_BEAST_741:POISONŠ#CREATURE:FORGOTTEN_BEAST_742:POISONŠ#CREATURE:FORGOTTEN_BEAST_744:POISONŠ#CREATURE:FORGOTTEN_BEAST_746:POISONŠ#CREATURE:FORGOTTEN_BEAST_748:POISONŠ#CREATURE:FORGOTTEN_BEAST_749:POISONŠ#CREATURE:FORGOTTEN_BEAST_750:POISONŠ#CREATURE:FORGOTTEN_BEAST_751:POISONŠ#CREATURE:FORGOTTEN_BEAST_752:POISONŠ#CREATURE:FORGOTTEN_BEAST_753:POISONŠ#CREATURE:FORGOTTEN_BEAST_756:POISONŠ#CREATURE:FORGOTTEN_BEAST_758:POISONŠ#CREATURE:FORGOTTEN_BEAST_760:POISONŠ#CREATURE:FORGOTTEN_BEAST_761:POISONŠ#CREATURE:FORGOTTEN_BEAST_762:POISONŠ#CREATURE:FORGOTTEN_BEAST_764:POISONŠ#CREATURE:FORGOTTEN_BEAST_766:POISONŠ#CREATURE:FORGOTTEN_BEAST_767:POISONŠ#CREATURE:FORGOTTEN_BEAST_769:POISONŠ#CREATURE:FORGOTTEN_BEAST_770:POISONŠ#CREATURE:FORGOTTEN_BEAST_771:POISONŠ#CREATURE:FORGOTTEN_BEAST_772:POISONŠ#CREATURE:FORGOTTEN_BEAST_773:POISONŠ#CREATURE:FORGOTTEN_BEAST_777:POISONŠ#CREATURE:FORGOTTEN_BEAST_778:POISONŠ#CREATURE:FORGOTTEN_BEAST_779:POISONŠ#CREATURE:FORGOTTEN_BEAST_780:POISONŠ#CREATURE:FORGOTTEN_BEAST_781:POISONŠ#CREATURE:FORGOTTEN_BEAST_783:POISONŠ#CREATURE:FORGOTTEN_BEAST_785:POISONŠ#CREATURE:FORGOTTEN_BEAST_787:POISONŠ#CREATURE:FORGOTTEN_BEAST_788:POISONŠ#CREATURE:FORGOTTEN_BEAST_790:POISONŠ#CREATURE:FORGOTTEN_BEAST_792:POISONŠ#CREATURE:FORGOTTEN_BEAST_793:POISONŠ#CREATURE:FORGOTTEN_BEAST_794:POISONŠ#CREATURE:FORGOTTEN_BEAST_795:POISONŠ#CREATURE:FORGOTTEN_BEAST_796:POISONŠ#CREATURE:FORGOTTEN_BEAST_798:POISONŠ#CREATURE:FORGOTTEN_BEAST_799:POISONŠ#CREATURE:FORGOTTEN_BEAST_800:POISONŠ#CREATURE:FORGOTTEN_BEAST_801:POISONŠ#CREATURE:FORGOTTEN_BEAST_802:POISONŠ#CREATURE:FORGOTTEN_BEAST_803:POISONŠ#CREATURE:FORGOTTEN_BEAST_806:POISONŠ#CREATURE:FORGOTTEN_BEAST_807:POISONŠ#CREATURE:FORGOTTEN_BEAST_810:POISONŠ#CREATURE:FORGOTTEN_BEAST_811:POISONŠ#CREATURE:FORGOTTEN_BEAST_813:POISONŠ#CREATURE:FORGOTTEN_BEAST_815:POISONŠ#CREATURE:FORGOTTEN_BEAST_818:POISONŠ#CREATURE:FORGOTTEN_BEAST_819:POISONŠ#CREATURE:FORGOTTEN_BEAST_820:POISONŠ#CREATURE:FORGOTTEN_BEAST_822:POISONŠ#CREATURE:FORGOTTEN_BEAST_823:POISONŠ#CREATURE:FORGOTTEN_BEAST_825:POISONŠ#CREATURE:FORGOTTEN_BEAST_826:POISONŠ#CREATURE:FORGOTTEN_BEAST_828:POISONŠ#CREATURE:FORGOTTEN_BEAST_830:POISONŠ#CREATURE:FORGOTTEN_BEAST_831:POISONŠ#CREATURE:FORGOTTEN_BEAST_832:POISONŠ#CREATURE:FORGOTTEN_BEAST_835:POISONŠ#CREATURE:FORGOTTEN_BEAST_836:POISONŠ#CREATURE:FORGOTTEN_BEAST_837:POISONŠ#CREATURE:FORGOTTEN_BEAST_839:POISONŠ#CREATURE:FORGOTTEN_BEAST_840:POISONŠ#CREATURE:FORGOTTEN_BEAST_841:POISONŠ#CREATURE:FORGOTTEN_BEAST_844:POISONŠ#CREATURE:FORGOTTEN_BEAST_845:POISONŠ#CREATURE:FORGOTTEN_BEAST_846:POISONŠ#CREATURE:FORGOTTEN_BEAST_847:POISONŠ#CREATURE:FORGOTTEN_BEAST_848:POISONŠ#CREATURE:FORGOTTEN_BEAST_849:POISONŠ#CREATURE:FORGOTTEN_BEAST_850:POISONŠ#CREATURE:FORGOTTEN_BEAST_851:POISONŠ#CREATURE:FORGOTTEN_BEAST_852:POISONŠ#CREATURE:FORGOTTEN_BEAST_853:POISONŠ#CREATURE:FORGOTTEN_BEAST_854:POISONŠ#CREATURE:FORGOTTEN_BEAST_856:POISONŠ#CREATURE:FORGOTTEN_BEAST_857:POISONŠ#CREATURE:FORGOTTEN_BEAST_859:POISONŠ#CREATURE:FORGOTTEN_BEAST_861:POISONŠ#CREATURE:FORGOTTEN_BEAST_862:POISONŠ#CREATURE:FORGOTTEN_BEAST_865:POISONŠCREATURE:TITAN_1:POISONŠCREATURE:TITAN_2:POISONŠCREATURE:TITAN_3:POISONŠCREATURE:TITAN_5:POISONŠCREATURE:TITAN_9:POISONŠCREATURE:TITAN_10:POISONŠCREATURE:TITAN_11:POISONŠCREATURE:TITAN_12:POISONŠCREATURE:TITAN_13:POISONŠCREATURE:TITAN_14:POISONŠCREATURE:TITAN_17:POISONŠCREATURE:TITAN_18:POISONŠCREATURE:TITAN_19:POISONŠCREATURE:TITAN_20:POISONŠCREATURE:TITAN_24:POISONŠCREATURE:TITAN_25:POISONŠCREATURE:TITAN_27:POISONŠCREATURE:TITAN_29:POISONŠCREATURE:TITAN_30:POISONŠCREATURE:TITAN_31:POISONŠCREATURE:DEMON_2:POISONŠCREATURE:DEMON_4:POISONŠCREATURE:DEMON_6:POISONŠCREATURE:DEMON_7:POISONŠCREATURE:DEMON_8:POISONŠCREATURE:DEMON_9:POISONŠCREATURE:DEMON_10:POISONŠCREATURE:DEMON_11:POISONŠCREATURE:DEMON_12:POISONŠCREATURE:DEMON_14:POISONŠCREATURE:DEMON_15:POISONŠCREATURE:DEMON_16:POISONŠCREATURE:DEMON_17:POISONŠCREATURE:DEMON_18:POISONŠCREATURE:DEMON_20:POISONŠCREATURE:DEMON_21:POISONŠCREATURE:DEMON_22:POISONŠCREATURE:DEMON_24:POISONŠCREATURE:DEMON_25:POISONŠCREATURE:DEMON_26:POISONŠCREATURE:DEMON_28:POISONŠCREATURE:DEMON_30:POISONŠCREATURE:DEMON_31:POISONŠCREATURE:DEMON_32:POISONŠCREATURE:DEMON_40:POISONŠCREATURE:DEMON_41:POISONŠCREATURE:DEMON_43:POISONŠCREATURE:DEMON_44:POISONŠCREATURE:DEMON_45:POISONŠCREATURE:DEMON_47:POISONŠCREATURE:DEMON_49:POISONŠ!CREATURE:NIGHT_CREATURE_64:POISONŠ!CREATURE:NIGHT_CREATURE_66:POISONŠ!CREATURE:NIGHT_CREATURE_75:POISONŠ!CREATURE:NIGHT_CREATURE_83:POISONŠ!CREATURE:NIGHT_CREATURE_85:POISONŠCREATURE:HF1108 DIVINE_3:POISONŠCREATURE:HF1249 DIVINE_3:POISONŠCREATURE:HF1345 DIVINE_1:POISON’LYE’INORGANIC:MILK_OF_LIME˜¢CUTTLEFISH:FEMALE¢CUTTLEFISH:MALE¢NAUTILUS:FEMALE¢ NAUTILUS:MALE¢MOGHOPPER:FEMALE¢MOGHOPPER:MALE¢POND_TURTLE:FEMALE¢POND_TURTLE:MALE¢MUSSEL:DEFAULT¢OYSTER:DEFAULT¢FISH_SALMON:FEMALE¢FISH_SALMON:MALE¢FISH_CLOWNFISH:FEMALE¢FISH_CLOWNFISH:MALE¢FISH_HAGFISH:FEMALE¢FISH_HAGFISH:MALE¢FISH_LAMPREY_BROOK:FEMALE¢FISH_LAMPREY_BROOK:MALE¢FISH_RAY_BAT:FEMALE¢FISH_RAY_BAT:MALE¢FISH_RAY_THORNBACK:FEMALE¢FISH_RAY_THORNBACK:MALE¢FISH_RATFISH_SPOTTED:FEMALE¢FISH_RATFISH_SPOTTED:MALE¢FISH_HERRING:FEMALE¢FISH_HERRING:MALE¢FISH_SHAD:FEMALE¢FISH_SHAD:MALE¢FISH_ANCHOVY:FEMALE¢FISH_ANCHOVY:MALE¢FISH_TROUT_STEELHEAD:FEMALE¢FISH_TROUT_STEELHEAD:MALE¢FISH_HAKE:FEMALE¢FISH_HAKE:MALE¢FISH_SEAHORSE:FEMALE¢FISH_SEAHORSE:MALE¢FISH_GLASSEYE:FEMALE¢FISH_GLASSEYE:MALE¢ FISH_PUFFER_WHITE_SPOTTED:FEMALE¢FISH_PUFFER_WHITE_SPOTTED:MALE¢FISH_SOLE:FEMALE¢FISH_SOLE:MALE¢FISH_FLOUNDER:FEMALE¢FISH_FLOUNDER:MALE¢FISH_MACKEREL:FEMALE¢FISH_MACKEREL:MALE¢JELLYFISH_SEA_NETTLE:DEFAULT¢ SQUID:FEMALE¢ -SQUID:MALE¢FISH_LUNGFISH:FEMALE¢FISH_LUNGFISH:MALE¢FISH_LOACH_CLOWN:FEMALE¢FISH_LOACH_CLOWN:MALE¢FISH_BULLHEAD_BROWN:FEMALE¢FISH_BULLHEAD_BROWN:MALE¢FISH_BULLHEAD_YELLOW:FEMALE¢FISH_BULLHEAD_YELLOW:MALE¢FISH_BULLHEAD_BLACK:FEMALE¢FISH_BULLHEAD_BLACK:MALE¢FISH_KNIFEFISH_BANDED:FEMALE¢FISH_KNIFEFISH_BANDED:MALE¢FISH_CHAR:FEMALE¢FISH_CHAR:MALE¢FISH_TROUT_RAINBOW:FEMALE¢FISH_TROUT_RAINBOW:MALE¢FISH_MOLLY_SAILFIN:FEMALE¢FISH_MOLLY_SAILFIN:MALE¢FISH_GUPPY:FEMALE¢FISH_GUPPY:MALE¢FISH_PERCH:FEMALE¢FISH_PERCH:MALE¢FISH_CAVE:FEMALE¢FISH_CAVE:MALE¢LOBSTER_CAVE:FEMALE¢LOBSTER_CAVE:MALE˜ ¨°¸À \ No newline at end of file +¨ \ No newline at end of file diff --git a/data/stockpiles/category_furniture.dfstock b/data/stockpiles/category_furniture.dfstock index 6c52781fb100a82428db8d6c2005d998841ffe1a..fdec022edf4e8b3fe20d910b5532343cd0acd15b 100644 GIT binary patch literal 4 Lcmb1QvS0)N0OJ5w literal 3259 zcmZ`*O>Y}F5Va7?v8gz1)X%8s#Yf$OAPCaiESK74#U(c+*NSpk7>NuRFq}YjfaYKH z*kgfSdhD^s{aWXN^r5Qyf202BU*V3IUFZ!8pu*1|j zFHR*zDk~F9@-c|hgpAPvP6>W1MBw&en;tG8acPZBsWBeVLPn=17TA z;z+v5L|btLJ+XqNU?>s&*Ol^CoD|xa5S>**kT0BvkWGb{DJq?X`l)y*DbZF%(In%oIJ#M`C>4)NU8*{$)?@K#f^5{V>?u>? zxPS$TAjJT}$~0OK$P*WHY$$*yv3>T;)KBNa1L>ktlUmx88BgP}H_6xSTSmjt6$SxeKAuH=ARrW)UR;q15QR z9XNVDF>3Vn&Idzt9u%^ga>HaQFaU;`%2g`r-K-^`EHeFcV*~+vqiuF4{O#sbV!+{g zowTnuxOYL-ZH1m}z(j|liuvgK9q3L2i;Pk#K)NOoOa+M8cr*HOqe3cAg_bp#1lHLZ zc{TcB_jB8Y|M#(UUMfSV1&e_~-f$6YU?3dY1)HX6^>ayNHm*QMi=tW!GJ=JiP*i3^ zqMSSGyhEY`naCxLF4Rhr)kHd*8CM`JQE?We4yXpkY)kZM>;hz_JmZ+3wzk9RL+X%97FnhZ<%Y2Rz z-}N=f97Dh3y;T}L&f+P^W4Lo4a#f(CyV{X{*CvPYHpAG`s?87UYm2+*>yF?}xPsSB zxcgx}!5B9RLdWG>5oI8dB|aBI*^p}63yDdFt1Zm>TRKeLM8{@GxGL~c8=bWQGU;_F z=tT5Fcfd()En&HEib{uF)h3QnG%D=YT&3F%HrwQG%CKr=^D@8^TL#z@l8@1!RU9$> zWtFBFSgY1x^)>+FbW^g^)^meOwMFx!E zmYgrqwKj4rM4hx(nRQSQ^=c~3S})Aa`4$PWHdl?t?qcm}Op(xGur@He#T;Kn-5ov! zWq6Hj+sOTDbg)E}bMH*mI>?A#YP`MBI_PWecS6;hM&~Y%?spSw;{;EIH~cyRJa0Au zGv82UZHEOuC5W~`GSQ%XiG*({a99^^l_VyMO@c`a9g5QpC~4?gL+)9lPcGtDB4E=d;0VaeXb9 z7niq-_h+Y*tDD93=ey%^`1EnHy!x;_8>nC3Ek52}eYm-}K07Hcez{#NFF#$M9nhj{et{^=e3+dKFVF(_?_ diff --git a/data/stockpiles/category_gems.dfstock b/data/stockpiles/category_gems.dfstock index 8d7b229a1145587d2dc0cda9e7cda76c80d8ed76..8a6483e26ec58e0d0c04b28768ea7becf941e944 100644 GIT binary patch literal 4 Lcma!I(qIGt0mA@> literal 7728 zcmZ`;yOQL%5!`m~;-uB;b=NvYbkNa1DCB@7hQu~VZ~?GqI8OhP%rj-mlqpl6ro@9p zlAJTU0Ms+9kVL=#@{jMn@3e64*;y&a^+%(nu;2ZVRvNoFFZ37Qxc-P6zw9?&f1^fY zJ29%}?`B-yuAj^A!B}NRmbj)jR$u>6_Gr<_o9Kj>*WVXut!H`rDq4B{QxR%0DRz~V3Eglj|Y|0_UFsbpL zgj54R*J}+(`l9SAC4-ZmhgD3qsjYb(q1a8*UVki(OserS^yC#f;RbVGZr^5M{ri=o zd=+mg9P;`Vl{?i_3^f8g7O68jZ~a~I0!6b5b*Bt1Qfu?N`bGA=>ZFy+4kS@_Qx;&R zoo*gaaI(^=F*!wzFfBH~=1Lxgp1XN7+d=5y+D~Pzvtqe5z0i#e_2#7(RfQ_mWOPuu zT#txO>8JtsBqZanJ-lHHe=WvejP>e8HNvBHvlS};p!9t$8Wm_T=A4UUCU!AtNJvON z?SL{$F-c9;0^`#fhzY5ABtqWY zSzcpy-EZ&8Hoyh#Pjb}UOp@_3NR2TG9Q>uETaB&i3r5WL%TI%OCTi}v` zBD8#ihp`4^&WrIqRhWdh1jFqJ%|Dm2Ka|nZ-!Ls5rn(QIQr%-jx$czj`#ioM^fYQ5 z#ehaFnIS7Znt!?FNtg0Kx&MlJk#7zLZye;ghLnq}<&5?)aOIfOOvdv84w3F`j{>|i za-twrfF@N|Qlg{8+PPK@V%Ya;oU7-a=?vy$tO9Akko%jvg;`Gth$LqPF?E0#r0>Cv z*lB@@F@P1Ie3aM>8-S0Cnux-w3IT}EDPWS37o||}0=Cw(?zj*K%t;!@Ek_df=HYeP z-JpxiNvh>TjeLJc9lfwxew(pEd5SAQ>W8ie3KJJ7Ev*VjZJ&B!v#a!F;n5-oX@zc? zI-%SPPg956qCcchTE$_tI8$BR5FJpqeKLg9nCRg_RZEAnS6ZBEPmc8H-jCYODzUfYuYF|6Q^W zvnUG>#J>7m##bWtEJ?(^qH-5v&+0c~UlEj;*jF?pBCBSdh1j#S5POyuV$b$BV$Z^j z*jF@!iP)dTk=R$1p}@^qyOcSg9iIR}NUdFw{(xm_}`=M3d5BhgH@zY=>k zRfs+BT!}sJEX1B+pNM@$H&(hn3LU9_o!Ilzf!MRQqhL^H6r$mR3`Q;XJUVrC%(#f zS&2Q59qv zn*L!WCyH;JmDqE`hOHaH{-v5*z@X{*mJE4v1eGM7n)o{x>54H%nNiYGqGpm`2Z1n zzOy5bXKxCzXH;h;rS4qZmDscUX|Cqn(dLcVb7?kWf7X!Wq}z8T_Uv>a_AD*Lo{LJv zo;N3c95Bhqi&CIB68qEkICxIdIBq$Ts3Z@s)9y&@Ptr*2xpkwCjo6>G1F0Xnz7l&j zu##fEd?bBY80wkWGj$3)m?zRom^p2$iHHJD{boe5Q6rFMEl=ewTcpT=uk(jWZhC3`ULf?Hi;4%!@M+DWR>c=8=1QHYF@xBe z?U(q)&%0_71E72$ad=dP`p@M9q!r;Eo^_epDHL({fs?NNLpV+!VxIa%hnFALkIxz9 zJWIM!D(6^&5C0lPAy0d}v-yKxNWY26q02E$F@?u7*rX4R5oaIr8OAQ-FN*<{2fhml ze|e!X6YguSI9`+m{NG2^0YIbR26a;a)zOOve-Ghk6ccrA44x@!<>vuKm>ri|t1bpe zyR&Qfn8oMhJaCTU#a4@*!;Pr{+Tbuj)JtzgFXJN{rwM-`jnAA7LPWPr4wmSX4F6&^ z)ei+TU!`aL)7;{Tu}iJNA2zUy2XNUw!^a7`4w&P`0bWvD*H#Tl1=aVi!e0{+Qxs6G z+%WrI9b3gpp@9gtWbA~l9X-pOS9Lr})&W7(E4V~Y2yW4jAR=Jmu1JkWX9LN@6mh$a zO2ce8OqsQ_SNq{J2z0{{=(q;c=%7Rd2B_!gAOU?+zUk3A=xg@77V}#$ea4Z%e@+oc zG!biK#Ty?-fDb&xF~S2>vK>9X<@J4i!=W>f;)?L_GDyv?oajp%I&|pJp+i5-Af+lnnhmFgqtR?& zzC7KX-(rX~KtTO9L+Epf!R$bEWdYx8k$zkQUv5~o;C7kX!E{rOqQ1--T#-E-db31+ z*y`yR1{b{{DCR7B_mNR#O!U^)P}u|EF6Y-9v>j}YYO-$$VGqXvp`vOCP2?BtFtvbLDZj(sqgvqU_Q;zto2 ztnp9|yjcF&#Ca!`pn#_7^L|4E=U&Y`MAx4`-oP2%)zC8^bWDjq2&;K;!2FNuI}_k6 zSmabqb!4F-SFs!Xd1Ij?xLIKtJ!4~*PwjAM1B&Q%l*CeF7`@a;V+f#NM_5P2rmcj9 zMT;o}*7Qe$Hd2^ZHKeGrlY3zFp!?GHmwy?x~@g7Y-Kg8He z>TL7WWEEN~Lcf#{%3jbbL(NlSAcfhF#o}>Q$bcJI5MiW9iMKWsiRFT-rHbxsL4L0) zoLId)xod?)Jx%MPiCi`f@)gOuKy=);CJSY0EVw^D9)@6!M%R{>(;ivBoMAJj!&wBv<6~D%w}8tbN4b7vRt~qzKK15(|DP z5UJR>h$Lb?YQD5w!$`X^3X+dz`_*wo=X%-LUi)q3W#yY!LGfVOusk=}OfRSX>Oip5 zvLeC(tXE4Gt|oYxp$8Akj6z7hhx`s=Z|Yx*RFQYBO!E!OXL&`%gf(h*5xgAx9?7)) Xr>^_ib-%jP@9y-c>;879f8FUn@-gPF diff --git a/data/stockpiles/category_weapons.dfstock b/data/stockpiles/category_weapons.dfstock index 6a84bf0c70272c8ceb65ef1e09343904535383e4..8f46ee61994481053c52c7ca6a6dcaaa44921bc4 100644 GIT binary patch literal 5 McmZo-Wb$AH00Sxj&j0`b literal 3838 zcmZ`*O>f*p7|u#Tl#RkifHvI{P*+Hx+`3g&+7sjP#2$7$V`j$LY%W&RCQ_s*t(H`x zSAGFUjvP61abvy8h#atGBhExg8AV$ z5pK$|3_VcHX7P9(H&x)pI&h?zRMFlQ#%ifE=h2~9BOI5749r+eA!2Wt3>JppMS>>C z=ma0f1Or4mkysPGm8sBv_%NcLA-`j>_bq}cxhcvP^{c-+lT3RAn<$owz3*4_H7TKu zElh1YRl5xPeH&W(0Bn0EQI%k3OpRmZ#P6>Ll=TD#o95b`y(GDZzOG z8+)BZDYLqXj?xtKQdb3)6H0JzLEG(gAvFH7`z^)HV`z?~7UKsSWFYEDiSZX348`U& zDO5G3j+v^8CKzI}Ek(UqwL~hcg7L%72@eJY8{`j$vwQB+Go0x*Zg-SffG&JA(~SX7jmG zYf=eo5+L z#WDa$GrAXC89=oj1;-|XYC|UT%?-A0B7ImAI488#N@h)hM0%MDCK0pHUvRhznkCHA zK5>Jy(-e+C)C(M{T%_v(;zg!cTZVKao0krr$T7g3;B<}tB>b4zFDsm|@JPVS({)qA zuRM|>t;5x#?FG!srmUpaiIqibg7kMP3%s%#Oc966)rN-!5JE-;uOkISP*28|m|E>A z&3TzLs>C}Wh<>fvb8~eZNCcQTo9&i3>|_x5~o`DSsrBYu5#{`Thb&Gp&U;YY>UFE{6li+5Lt_t@g*^5X2(&E(eN vgj$^RElzGNPN>C6XK`|C@rS{WgWm^(KL&$82U~v)_WvGi{WIA5cd+$8%10;W diff --git a/data/stockpiles/category_wood.dfstock b/data/stockpiles/category_wood.dfstock index b9480efb3eb8137b5b563f7c2b5ec2889330862c..5613a0f0770cb0bc4913da8f26c6de0f400b0792 100644 GIT binary patch literal 4 Lcmb(5VejUvNg_IN)|D|7;yv)L0}!fM*GMTQl(6pGG)q?Sy~1;hXR<-<=#7d z{iZ;nMuRYFOtN4ySTJf15;C~Xw8_r*I}wbw6^{v&Yxt0K#*9ydPgy#wUujRR!nJp| zDrM(N2p4>?LCf$Kd=!Yxkpc^(uZ0tgTrfF;ckOGXvj4x{?p~s0KYE~WOZIiXSz4*o z*X6Rb_@!ZmchlC2#eT+|1Hojm(w;Fy7{k-dLVb#&(PH!nii3X;+&U8{uS+eAQp?GT z7YD!vbMb~njK-&?Ql3J1e(lbu#WAQEKPZ68gl2{}*-F0{(LH4Rk zWZW;|PhWaDJT~>)_L?*ge`#8b6}h6U bYnK6hABG>p@N+o*8cx55)1Tq=cR2k6Qg5E1 From e59d60612c0407c298a7eb6d1219775b34643115 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 15:52:23 -0700 Subject: [PATCH 101/439] rename traps and cages --- .../{emptycages.dfstock => cages.dfstock} | Bin .../{emptyanimaltraps.dfstock => traps.dfstock} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename data/stockpiles/{emptycages.dfstock => cages.dfstock} (100%) rename data/stockpiles/{emptyanimaltraps.dfstock => traps.dfstock} (100%) diff --git a/data/stockpiles/emptycages.dfstock b/data/stockpiles/cages.dfstock similarity index 100% rename from data/stockpiles/emptycages.dfstock rename to data/stockpiles/cages.dfstock diff --git a/data/stockpiles/emptyanimaltraps.dfstock b/data/stockpiles/traps.dfstock similarity index 100% rename from data/stockpiles/emptyanimaltraps.dfstock rename to data/stockpiles/traps.dfstock From 4af59f865ab59e60ea1e28bde7d9ac91c3aadf93 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 15:52:38 -0700 Subject: [PATCH 102/439] update traps and cages --- data/stockpiles/cages.dfstock | Bin 27 -> 6 bytes data/stockpiles/traps.dfstock | Bin 27 -> 6 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/cages.dfstock b/data/stockpiles/cages.dfstock index 3a66abbd68612b0e514eac558c890cdbaaa6b3d1..0ca677985c949139e96301fb25e673409af302b7 100644 GIT binary patch literal 6 Ncmd;L;b0VC0001)04M+e literal 27 jcmd;L;b0VCn83(5gOPCoBf|j diff --git a/data/stockpiles/traps.dfstock b/data/stockpiles/traps.dfstock index d9121dc8aa9a79a2205e2a71192d620506ede5bb..ed1ba6776305c3f9bf020e9293d471a1cd50f24f 100644 GIT binary patch literal 6 Ncmd;L;b0J81ONb+04M+e literal 27 jcmd;L;b0J8oWRI9gOPCoBf| Date: Mon, 20 Mar 2023 16:04:35 -0700 Subject: [PATCH 103/439] update food stockpile defs --- data/stockpiles/booze.dfstock | Bin 0 -> 1809 bytes data/stockpiles/dye.dfstock | Bin 127 -> 106 bytes data/stockpiles/miscliquid.dfstock | Bin 57 -> 36 bytes data/stockpiles/plants.dfstock | Bin 3177 -> 3156 bytes data/stockpiles/preparedmeals.dfstock | Bin 26 -> 5 bytes data/stockpiles/seeds.dfstock | Bin 3395 -> 3374 bytes data/stockpiles/unpreparedfish.dfstock | Bin 1720 -> 1699 bytes data/stockpiles/wax.dfstock | Bin 98 -> 29 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/stockpiles/booze.dfstock diff --git a/data/stockpiles/booze.dfstock b/data/stockpiles/booze.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..736560f98897ed4fd903e871eef8c6b109542b88 GIT binary patch literal 1809 zcmZuyxsKZ~5KVp{$L82v2#|JxZBn`$Nt8vHSB9h=r{N!^&gW)qz0pd>LWO`g_nU)v ze_uU(PmV&_WgGU+JnornXs5|g*$r&N;o<8nFQ@p7@FR@lST;t$C*om)zlDA>PW|7_ zP)F>{88JTqtNme}%Ig{Cvw_|_xQo1>st5Q6TDDg;MD=9UuJ3NVjON|;4M{7&fE$=savVKdFz}}Iv_bswwSHt^K3IpqYQ6F z$YYGZ3)vfoD1MB=#w|m|j3W>bPF!q1#e=d0Dm$~JcRwd_vTkTSF-OfCt>`IdIx2er z6LAhUZD~%iP|=J)J=0*bk_#sCNusysv`h3)9#Fv*6FzSomGfXF1N+8El%)oK+W zOST{>2XNd=-#f#sBl;e#w{DH<;JRwoFxH`S)F0M3)R}U622M5@N-{lL;yMcQZ5t=8 zAm2r&F!&rQTMAIs+Uiq(pq41nSxr&c#a}IpF*xgMF0#{)>$FhBKr*n2oUS2!yK_Go ztpL-LqBlZu5Q}YYYqyvkN^JXO%9M3FulYhK3G~z-RGSR-I#8Hqfq2VaGMugVQJGRj zx7-xem?;cxW&dLy0$=mQG5R(c=P$!5hC1z7O({3$cHPco_Xv;UGRv-qPIl_3oFHbB z({kN`ZO#&}G%p7dFd9^<5Yyx!3AY18xI`DmtjX;{=wTTu*r_lVrW5Qosk$ z8X>zmG+y2cy@!Z2$}*c9uK8*am-WI(WM_|;#ECmZK>61`w_LS1fRC~p^0F*P1?~0} l_E`O&_dUxiR@v;P7|glJ72A13!%EOq-#OXTS@7@Wi~spv^2`7L literal 0 HcmV?d00001 diff --git a/data/stockpiles/dye.dfstock b/data/stockpiles/dye.dfstock index e8ef137d85db9a0f916a1bc5c210afb5a2acafaa..67b785d2034ee72a972af38b627fee5f0802b8bc 100644 GIT binary patch delta 4 Lcmb==nvewm1jqs8 delta 26 icmd0*pO7Uwfst_rBjW-_i4}|t8yFdOFftrqWB>qWK?bq_ diff --git a/data/stockpiles/miscliquid.dfstock b/data/stockpiles/miscliquid.dfstock index 56ef41c076b6afb1babccf74af65d5f006121ca3..dbf75a072e91902d3ee934f909c0dbff29b30471 100644 GIT binary patch delta 4 LcmcCinVqC1qI*$ diff --git a/data/stockpiles/plants.dfstock b/data/stockpiles/plants.dfstock index ac8573dd1d78fda8cf974e0571c7024bc1db6eca..ca55f19f98b1b203bf5bef88dd677ab137699e65 100644 GIT binary patch delta 7 OcmaDUaYbT72oC@bJ_7y# delta 29 lcmca2@ls+#2#@FlM#dS8j0+egRxmPbU}V_A$Z&v>0RV^I2h0Ef diff --git a/data/stockpiles/preparedmeals.dfstock b/data/stockpiles/preparedmeals.dfstock index 1df044d4855420be0cf579d5c3295a3b20ac4cb2..657c93f389775ef3f798afb5ec15a8225c6eb22f 100644 GIT binary patch literal 5 McmWe)p25fn00K4uumAu6 literal 26 gcmWe)p25gCfsqkNE?|^c!N{swN7e-9xnh4KLU{e delta 29 lcmZ1{by#YH90RVh~2VVdH diff --git a/data/stockpiles/unpreparedfish.dfstock b/data/stockpiles/unpreparedfish.dfstock index 465a95dddaf4044c86f9ec7b958739c01d39f275..13841da90175fdd324b56e32f3b3c4bd5209fdfc 100644 GIT binary patch delta 7 OcmdnNyO?*wVm1H_90Jb( delta 29 lcmZ3?yMuSbVm8qUjEplF85b~0tYBo=z{s$Jk>LO%0|0@t2b}-_ diff --git a/data/stockpiles/wax.dfstock b/data/stockpiles/wax.dfstock index f7ec69912e41e23f568923909774ee2d863ee8f4..35c69f6ca89bb85b5bbc6e13b7fa03c5b1f6ffec 100644 GIT binary patch literal 29 kcmWfVt`c(&a&-&|4RW>e@b`0#jCXQ%wF-BPn8C;Z0CMUF!~g&Q literal 98 zcmWgg&JuGDa&-&|4RW>e@b`0#jCXQ%wF-BPKoWNf^>y-bg^E||kU#z{mgqNAVh5 From fde51e5948603287d8d3db97b176dfc906f816e1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 16:05:07 -0700 Subject: [PATCH 104/439] fix some debug strings --- plugins/stockpiles/OrganicMatLookup.cpp | 8 ++++---- plugins/stockpiles/StockpileSerializer.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/stockpiles/OrganicMatLookup.cpp b/plugins/stockpiles/OrganicMatLookup.cpp index 2367eddb5..a9e2210c9 100644 --- a/plugins/stockpiles/OrganicMatLookup.cpp +++ b/plugins/stockpiles/OrganicMatLookup.cpp @@ -21,7 +21,7 @@ namespace DFHack { */ void OrganicMatLookup::food_mat_by_idx(organic_mat_category::organic_mat_category mat_category, std::vector::size_type food_idx, FoodMat& food_mat) { - DEBUG(log).print("food_lookup: food_idx(%zd) ", food_idx); + DEBUG(log).print("food_lookup: food_idx(%zd)\n", food_idx); df::world_raws& raws = world->raws; df::special_mat_table table = raws.mat_table; int32_t main_idx = table.organic_indexes[mat_category][food_idx]; @@ -31,11 +31,11 @@ void OrganicMatLookup::food_mat_by_idx(organic_mat_category::organic_mat_categor mat_category == organic_mat_category::Eggs) { food_mat.creature = raws.creatures.all[type]; food_mat.caste = food_mat.creature->caste[main_idx]; - DEBUG(log).print("special creature type(%d) caste(%d)", type, main_idx); + DEBUG(log).print("special creature type(%d) caste(%d)\n", type, main_idx); } else { food_mat.material.decode(type, main_idx); - DEBUG(log).print("type(%d) index(%d) token(%s)", type, main_idx, food_mat.material.getToken().c_str()); + DEBUG(log).print("type(%d) index(%d) token(%s)\n", type, main_idx, food_mat.material.getToken().c_str()); } } std::string OrganicMatLookup::food_token_by_idx(organic_mat_category::organic_mat_category mat_category, std::vector::size_type idx) { @@ -74,7 +74,7 @@ void OrganicMatLookup::food_build_map() { int16_t OrganicMatLookup::food_idx_by_token(organic_mat_category::organic_mat_category mat_category, const std::string& token) { df::world_raws& raws = world->raws; df::special_mat_table table = raws.mat_table; - DEBUG(log).print("food_idx_by_token: "); + DEBUG(log).print("food_idx_by_token:\n"); if (mat_category == organic_mat_category::Fish || mat_category == organic_mat_category::UnpreparedFish || mat_category == organic_mat_category::Eggs) { diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 04b046a3e..0cdfad13f 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1642,8 +1642,8 @@ bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { food_pair p = food_map((organic_mat_category)mat_category); if (!p.valid) continue; - DEBUG(log).print("food: %s\n", traits::key_table[mat_category]); - all = serialize_list_organic_mat(p.set_value, p.stockpile_values, (organic_mat_category)mat_category) && all; + all = serialize_list_organic_mat(p.set_value, p.stockpile_values, + (organic_mat_category)mat_category) && all; } return all; From 63f6d0bc72a350b7afd9711248f4e9c6bb825776 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 16:05:18 -0700 Subject: [PATCH 105/439] remove obsolete stockpile defs --- data/stockpiles/drinkanimal.dfstock | Bin 76 -> 0 bytes data/stockpiles/drinkplant.dfstock | Bin 1780 -> 0 bytes data/stockpiles/tallow.dfstock | 1 - 3 files changed, 1 deletion(-) delete mode 100644 data/stockpiles/drinkanimal.dfstock delete mode 100644 data/stockpiles/drinkplant.dfstock delete mode 100644 data/stockpiles/tallow.dfstock diff --git a/data/stockpiles/drinkanimal.dfstock b/data/stockpiles/drinkanimal.dfstock deleted file mode 100644 index f3cfabebf17ec146a46a1e43b5808916d6d4c525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmWeKH4=9Ya&-&|4RW>e@b`0#jCXQ%weod!bU~7E3iWmJafM0DU}TuU$T)+MaRH;m R3Py$vj0`&%84fTq008$;6Da@y diff --git a/data/stockpiles/drinkplant.dfstock b/data/stockpiles/drinkplant.dfstock deleted file mode 100644 index c03acc8bcbe6006b47659f0c9271ce1e85dbd204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1780 zcmZuyIgZpo6m1^>0mC*dLLwb$E-=}*U2d1UHfrgnN$N_36A}^<5^@j@!|(R{Zo4&d zVCnt+{iSaHJ-hoH47vP}wA&hWzm23_J&cO-Lm#!<-F=+o`QV=rzJ;+L^2!MKNU>kx zFQFfl5&t(6)KWC+h?sAHm2S68<@p51qk`Tmxbty477OqNv~(wGh-yiH7YI?m7VSL2 z5ZI2KJ_z<{au$^9nWajWBL7ENe3+!I@xH&7fwxd%FzQ-(D{i^!YPB&+=z!!f>a5n1 z_mj=QjZ$$fLLP(vmPubZMDc@n+OHYPY8ZfkaEe)Xqu&Wjpt4nSdhezr4%+m!qZqy9 zjaGD&677XOfPrFiI;?39K2w&AKz*cMCm|P1qytB{h88&+h}54;dQ4yV=(`zZG&15ozFMR##ldvxT463nP(?-k%bu*dhYTKliz&BE12; n=iT6!Wj-oswOVG{A5HVvG(Vf$U(M!sv-#6({x+Nc>Qm}N diff --git a/data/stockpiles/tallow.dfstock b/data/stockpiles/tallow.dfstock deleted file mode 100644 index 2dbd68d31..000000000 --- a/data/stockpiles/tallow.dfstock +++ /dev/null @@ -1 +0,0 @@ -¾ŽjCREATURE:TOAD:TALLOWjCREATURE:TOAD_MAN:TALLOWjCREATURE:GIANT_TOAD:TALLOWjCREATURE:WORM:TALLOWjCREATURE:WORM_MAN:TALLOWjCREATURE:BIRD_BLUEJAY:TALLOWjCREATURE:BLUEJAY_MAN:TALLOWjCREATURE:GIANT_BLUEJAY:TALLOWjCREATURE:BIRD_CARDINAL:TALLOWjCREATURE:CARDINAL_MAN:TALLOWjCREATURE:GIANT_CARDINAL:TALLOWjCREATURE:BIRD_GRACKLE:TALLOWjCREATURE:GRACKLE_MAN:TALLOWjCREATURE:GIANT_GRACKLE:TALLOWjCREATURE:BIRD_ORIOLE:TALLOWjCREATURE:ORIOLE_MAN:TALLOWjCREATURE:GIANT_ORIOLE:TALLOWj!CREATURE:BIRD_RW_BLACKBIRD:TALLOWj CREATURE:RW_BLACKBIRD_MAN:TALLOWj"CREATURE:GIANT_RW_BLACKBIRD:TALLOWjCREATURE:BIRD_PENGUIN:TALLOWj#CREATURE:BIRD_PENGUIN_LITTLE:TALLOWj$CREATURE:BIRD_PENGUIN_EMPEROR:TALLOWjCREATURE:PENGUIN MAN:TALLOWj"CREATURE:BIRD_PENGUIN_GIANT:TALLOWj%CREATURE:BIRD_FALCON_PEREGRINE:TALLOWj$CREATURE:PEREGRINE FALCON MAN:TALLOWj&CREATURE:GIANT PEREGRINE FALCON:TALLOWjCREATURE:BIRD_KIWI:TALLOWjCREATURE:KIWI MAN:TALLOWjCREATURE:BIRD_KIWI_GIANT:TALLOWjCREATURE:BIRD_OSTRICH:TALLOWjCREATURE:OSTRICH MAN:TALLOWj"CREATURE:BIRD_OSTRICH_GIANT:TALLOWjCREATURE:BIRD_CROW:TALLOWjCREATURE:CROW_MAN:TALLOWjCREATURE:GIANT_CROW:TALLOWjCREATURE:BIRD_RAVEN:TALLOWjCREATURE:RAVEN_MAN:TALLOWjCREATURE:GIANT_RAVEN:TALLOWjCREATURE:BIRD_CASSOWARY:TALLOWjCREATURE:CASSOWARY_MAN:TALLOWjCREATURE:GIANT_CASSOWARY:TALLOWjCREATURE:BIRD_KEA:TALLOWjCREATURE:KEA_MAN:TALLOWjCREATURE:GIANT_KEA:TALLOWjCREATURE:BIRD_OWL_SNOWY:TALLOWjCREATURE:SNOWY_OWL_MAN:TALLOWjCREATURE:GIANT_SNOWY_OWL:TALLOWjCREATURE:SPARROW:TALLOWjCREATURE:SPARROW_MAN:TALLOWjCREATURE:GIANT_SPARROW:TALLOWj CREATURE:BIRD_STORK_WHITE:TALLOWjCREATURE:WHITE_STORK_MAN:TALLOWj!CREATURE:GIANT_WHITE_STORK:TALLOWjCREATURE:BIRD_LOON:TALLOWjCREATURE:LOON_MAN:TALLOWjCREATURE:GIANT_LOON:TALLOWjCREATURE:BIRD_OWL_BARN:TALLOWjCREATURE:BARN_OWL_MAN:TALLOWjCREATURE:GIANT_BARN_OWL:TALLOWjCREATURE:BIRD_PARAKEET:TALLOWjCREATURE:PARAKEET_MAN:TALLOWjCREATURE:GIANT_PARAKEET:TALLOWjCREATURE:BIRD_KAKAPO:TALLOWjCREATURE:KAKAPO_MAN:TALLOWjCREATURE:GIANT_KAKAPO:TALLOWj CREATURE:BIRD_PARROT_GREY:TALLOWjCREATURE:GREY_PARROT_MAN:TALLOWj!CREATURE:GIANT_GREY_PARROT:TALLOWjCREATURE:BIRD_PUFFIN:TALLOWjCREATURE:PUFFIN_MAN:TALLOWjCREATURE:GIANT_PUFFIN:TALLOWjCREATURE:BIRD_SWAN:TALLOWjCREATURE:SWAN_MAN:TALLOWjCREATURE:GIANT_SWAN:TALLOWjCREATURE:BIRD_LORIKEET:TALLOWjCREATURE:LORIKEET_MAN:TALLOWjCREATURE:GIANT_LORIKEET:TALLOWjCREATURE:BIRD_WREN:TALLOWjCREATURE:WREN_MAN:TALLOWjCREATURE:GIANT_WREN:TALLOWjCREATURE:BIRD_OSPREY:TALLOWjCREATURE:OSPREY_MAN:TALLOWjCREATURE:GIANT_OSPREY:TALLOWjCREATURE:BIRD_EMU:TALLOWjCREATURE:EMU_MAN:TALLOWjCREATURE:GIANT_EMU:TALLOWjCREATURE:BIRD_COCKATIEL:TALLOWjCREATURE:COCKATIEL_MAN:TALLOWjCREATURE:GIANT_COCKATIEL:TALLOWj)CREATURE:BIRD_LOVEBIRD_PEACH-FACED:TALLOWj(CREATURE:PEACH-FACED_LOVEBIRD_MAN:TALLOWj*CREATURE:GIANT_PEACH-FACED_LOVEBIRD:TALLOWjCREATURE:BIRD_MAGPIE:TALLOWjCREATURE:MAGPIE_MAN:TALLOWjCREATURE:GIANT_MAGPIE:TALLOWjCREATURE:BIRD_KESTREL:TALLOWjCREATURE:KESTREL_MAN:TALLOWjCREATURE:GIANT_KESTREL:TALLOWjCREATURE:BIRD_ALBATROSS:TALLOWjCREATURE:ALBATROSS_MAN:TALLOWjCREATURE:GIANT_ALBATROSS:TALLOWj%CREATURE:BIRD_OWL_GREAT_HORNED:TALLOWj$CREATURE:GREAT_HORNED_OWL_MAN:TALLOWj&CREATURE:GIANT_GREAT_HORNED_OWL:TALLOWjCREATURE:BIRD_EAGLE:TALLOWjCREATURE:EAGLE_MAN:TALLOWjCREATURE:GIANT_EAGLE:TALLOWjCREATURE:BIRD_HORNBILL:TALLOWjCREATURE:HORNBILL_MAN:TALLOWjCREATURE:GIANT_HORNBILL:TALLOWj$CREATURE:BIRD_LOVEBIRD_MASKED:TALLOWj#CREATURE:MASKED_LOVEBIRD_MAN:TALLOWj%CREATURE:GIANT_MASKED_LOVEBIRD:TALLOWjCREATURE:BIRD_BUSHTIT:TALLOWjCREATURE:BUSHTIT_MAN:TALLOWjCREATURE:GIANT_BUSHTIT:TALLOWjCREATURE:DAMSELFLY:TALLOWjCREATURE:DAMSELFLY_MAN:TALLOWjCREATURE:GIANT_DAMSELFLY:TALLOWjCREATURE:MOTH:TALLOWjCREATURE:MOTH_MAN:TALLOWjCREATURE:GIANT_MOTH:TALLOWjCREATURE:GRASSHOPPER:TALLOWjCREATURE:GRASSHOPPER_MAN:TALLOWj!CREATURE:GIANT_GRASSHOPPER:TALLOWjCREATURE:BARK_SCORPION:TALLOWj!CREATURE:BARK_SCORPION_MAN:TALLOWj#CREATURE:GIANT_BARK_SCORPION:TALLOWjCREATURE:MANTIS:TALLOWjCREATURE:MANTIS_MAN:TALLOWjCREATURE:GIANT_MANTIS:TALLOWjCREATURE:TICK:TALLOWjCREATURE:TICK_MAN:TALLOWjCREATURE:GIANT_TICK:TALLOWjCREATURE:LOUSE:TALLOWjCREATURE:LOUSE_MAN:TALLOWjCREATURE:GIANT_LOUSE:TALLOWjCREATURE:THRIPS:TALLOWjCREATURE:THRIPS_MAN:TALLOWjCREATURE:GIANT_THRIPS:TALLOWjCREATURE:SLUG:TALLOWjCREATURE:SLUG_MAN:TALLOWjCREATURE:GIANT_SLUG:TALLOWjCREATURE:MOSQUITO:TALLOWjCREATURE:MOSQUITO_MAN:TALLOWjCREATURE:GIANT_MOSQUITO:TALLOWjCREATURE:SPIDER_JUMPING:TALLOWj"CREATURE:JUMPING_SPIDER_MAN:TALLOWj$CREATURE:GIANT_JUMPING_SPIDER:TALLOWjCREATURE:TERMITE:TALLOWjCREATURE:MOON_SNAIL:TALLOWjCREATURE:MOON_SNAIL_MAN:TALLOWj CREATURE:GIANT_MOON_SNAIL:TALLOWj$CREATURE:SPIDER_BROWN_RECLUSE:TALLOWj(CREATURE:BROWN_RECLUSE_SPIDER_MAN:TALLOWj*CREATURE:GIANT_BROWN_RECLUSE_SPIDER:TALLOWjCREATURE:SNAIL:TALLOWjCREATURE:SNAIL_MAN:TALLOWjCREATURE:GIANT_SNAIL:TALLOWjCREATURE:GECKO_LEOPARD:TALLOWj!CREATURE:LEOPARD_GECKO_MAN:TALLOWj#CREATURE:GIANT_LEOPARD_GECKO:TALLOWjCREATURE:DESERT TORTOISE:TALLOWj#CREATURE:DESERT_TORTOISE_MAN:TALLOWj%CREATURE:GIANT_DESERT_TORTOISE:TALLOWjCREATURE:GILA_MONSTER:TALLOWj CREATURE:GILA_MONSTER_MAN:TALLOWj"CREATURE:GIANT_GILA_MONSTER:TALLOWjCREATURE:DOG:TALLOWjCREATURE:CAT:TALLOWjCREATURE:MULE:TALLOWjCREATURE:DONKEY:TALLOWjCREATURE:HORSE:TALLOWjCREATURE:COW:TALLOWjCREATURE:SHEEP:TALLOWjCREATURE:PIG:TALLOWjCREATURE:GOAT:TALLOWjCREATURE:BIRD_CHICKEN:TALLOWjCREATURE:CAVY:TALLOWjCREATURE:BIRD_DUCK:TALLOWjCREATURE:WATER_BUFFALO:TALLOWjCREATURE:REINDEER:TALLOWjCREATURE:BIRD_GOOSE:TALLOWjCREATURE:YAK:TALLOWjCREATURE:LLAMA:TALLOWjCREATURE:ALPACA:TALLOWjCREATURE:BIRD_GUINEAFOWL:TALLOWj!CREATURE:BIRD_PEAFOWL_BLUE:TALLOWjCREATURE:BIRD_TURKEY:TALLOWjCREATURE:RABBIT:TALLOWjCREATURE:FLY:TALLOWjCREATURE:FLY_MAN:TALLOWjCREATURE:GIANT_FLY:TALLOWjCREATURE:ROACH_LARGE:TALLOWjCREATURE:ROACH_MAN:TALLOWjCREATURE:GIANT_ROACH:TALLOWjCREATURE:BEETLE:TALLOWjCREATURE:BEETLE_MAN:TALLOWjCREATURE:GIANT_BEETLE:TALLOWjCREATURE:ANT:TALLOWj!CREATURE:BUTTERFLY_MONARCH:TALLOWj%CREATURE:BUTTERFLY_MONARCH_MAN:TALLOWj'CREATURE:GIANT_BUTTERFLY_MONARCH:TALLOWjCREATURE:FIREFLY:TALLOWjCREATURE:FIREFLY_MAN:TALLOWjCREATURE:GIANT_FIREFLY:TALLOWjCREATURE:DRAGONFLY:TALLOWjCREATURE:DRAGONFLY_MAN:TALLOWjCREATURE:GIANT_DRAGONFLY:TALLOWjCREATURE:HONEY_BEE:TALLOWjCREATURE:BUMBLEBEE:TALLOWjCREATURE:GOAT_MOUNTAIN:TALLOWj!CREATURE:GOAT_MOUNTAIN_MAN:TALLOWj#CREATURE:GIANT_GOAT_MOUNTAIN:TALLOWjCREATURE:MARMOT_HOARY:TALLOWj CREATURE:MARMOT_HOARY_MAN:TALLOWj"CREATURE:GIANT_MARMOT_HOARY:TALLOWjCREATURE:GNOME_MOUNTAIN:TALLOWjCREATURE:GNOME_DARK:TALLOWjCREATURE:WALRUS:TALLOWjCREATURE:WALRUS_MAN:TALLOWjCREATURE:GIANT_WALRUS:TALLOWj CREATURE:FISH_LAMPREY_SEA:TALLOWj!CREATURE:SHARK_GREAT_WHITE:TALLOWjCREATURE:SHARK_FRILL:TALLOWj#CREATURE:SHARK_SPINY_DOGFISH:TALLOWj'CREATURE:SHARK_WOBBEGONG_SPOTTED:TALLOWjCREATURE:SHARK_WHALE:TALLOWjCREATURE:SHARK_BASKING:TALLOWjCREATURE:SHARK_NURSE:TALLOWj#CREATURE:SHARK_MAKO_SHORTFIN:TALLOWj"CREATURE:SHARK_MAKO_LONGFIN:TALLOWjCREATURE:SHARK_TIGER:TALLOWjCREATURE:SHARK_BULL:TALLOWj#CREATURE:SHARK_REEF_BLACKTIP:TALLOWj#CREATURE:SHARK_REEF_WHITETIP:TALLOWjCREATURE:SHARK_BLUE:TALLOWj CREATURE:SHARK_HAMMERHEAD:TALLOWjCREATURE:SHARK_ANGEL:TALLOWj!CREATURE:FISH_SKATE_COMMON:TALLOWjCREATURE:FISH_RAY_MANTA:TALLOWjCREATURE:FISH_STINGRAY:TALLOWjCREATURE:FISH_COELACANTH:TALLOWjCREATURE:FISH_STURGEON:TALLOWjCREATURE:FISH_CONGER_EEL:TALLOWjCREATURE:FISH_MILKFISH:TALLOWjCREATURE:FISH_COD:TALLOWjCREATURE:FISH_OPAH:TALLOWj"CREATURE:FISH_GROUPER_GIANT:TALLOWjCREATURE:FISH_BLUEFISH:TALLOWj"CREATURE:FISH_SUNFISH_OCEAN:TALLOWjCREATURE:FISH_SWORDFISH:TALLOWjCREATURE:FISH_MARLIN:TALLOWjCREATURE:FISH_HALIBUT:TALLOWj$CREATURE:FISH_BARRACUDA_GREAT:TALLOWj!CREATURE:FISH_TUNA_BLUEFIN:TALLOWjCREATURE:NARWHAL:TALLOWjCREATURE:NARWHAL MAN:TALLOWjCREATURE:NARWHAL, GIANT:TALLOWjCREATURE:HIPPO:TALLOWjCREATURE:HIPPO_MAN:TALLOWjCREATURE:GIANT_HIPPO:TALLOWj!CREATURE:FISH_GAR_LONGNOSE:TALLOWjCREATURE:FISH_CARP:TALLOWjCREATURE:FISH_TIGERFISH:TALLOWjCREATURE:FISH_PIKE:TALLOWjCREATURE:PLATYPUS:TALLOWjCREATURE:PLATYPUS MAN:TALLOWjCREATURE:PLATYPUS, GIANT:TALLOWjCREATURE:BEAR_GRIZZLY:TALLOWj CREATURE:BEAR_GRIZZLY_MAN:TALLOWj"CREATURE:GIANT_BEAR_GRIZZLY:TALLOWjCREATURE:BEAR_BLACK:TALLOWjCREATURE:BEAR_BLACK_MAN:TALLOWj CREATURE:GIANT_BEAR_BLACK:TALLOWjCREATURE:DEER:TALLOWjCREATURE:DEER_MAN:TALLOWjCREATURE:GIANT_DEER:TALLOWjCREATURE:FOX:TALLOWjCREATURE:FOX_MAN:TALLOWjCREATURE:GIANT_FOX:TALLOWjCREATURE:RACCOON:TALLOWjCREATURE:RACCOON_MAN:TALLOWjCREATURE:GIANT_RACCOON:TALLOWjCREATURE:MACAQUE_RHESUS:TALLOWj"CREATURE:MACAQUE_RHESUS_MAN:TALLOWj$CREATURE:GIANT_MACAQUE_RHESUS:TALLOWjCREATURE:COUGAR:TALLOWjCREATURE:COUGAR_MAN:TALLOWjCREATURE:GIANT_COUGAR:TALLOWjCREATURE:WOLF:TALLOWjCREATURE:WOLF_MAN:TALLOWjCREATURE:GIANT_WOLF:TALLOWjCREATURE:GROUNDHOG:TALLOWjCREATURE:GROUNDHOG_MAN:TALLOWjCREATURE:GIANT_GROUNDHOG:TALLOWjCREATURE:ALLIGATOR:TALLOWjCREATURE:ALLIGATOR_MAN:TALLOWjCREATURE:GIANT_ALLIGATOR:TALLOWjCREATURE:BIRD_BUZZARD:TALLOWjCREATURE:BUZZARD_MAN:TALLOWjCREATURE:GIANT_BUZZARD:TALLOWjCREATURE:PANDA:TALLOWjCREATURE:PANDA, GIGANTIC:TALLOWjCREATURE:PANDA MAN:TALLOWjCREATURE:CAPYBARA:TALLOWjCREATURE:CAPYBARA, GIANT:TALLOWjCREATURE:CAPYBARA MAN:TALLOWjCREATURE:BADGER:TALLOWjCREATURE:BADGER MAN:TALLOWjCREATURE:BADGER, GIANT:TALLOWjCREATURE:MOOSE:TALLOWjCREATURE:MOOSE MAN:TALLOWjCREATURE:MOOSE, GIANT:TALLOWjCREATURE:RED PANDA:TALLOWjCREATURE:RED PANDA MAN:TALLOWj CREATURE:RED PANDA, GIANT:TALLOWjCREATURE:ELEPHANT:TALLOWjCREATURE:ELEPHANT_MAN:TALLOWjCREATURE:GIANT_ELEPHANT:TALLOWjCREATURE:WARTHOG:TALLOWjCREATURE:WARTHOG_MAN:TALLOWjCREATURE:GIANT_WARTHOG:TALLOWjCREATURE:LION:TALLOWjCREATURE:LION_MAN:TALLOWjCREATURE:GIANT_LION:TALLOWjCREATURE:LEOPARD:TALLOWjCREATURE:LEOPARD_MAN:TALLOWjCREATURE:GIANT_LEOPARD:TALLOWjCREATURE:JAGUAR:TALLOWjCREATURE:JAGUAR_MAN:TALLOWjCREATURE:GIANT_JAGUAR:TALLOWjCREATURE:TIGER:TALLOWjCREATURE:TIGER_MAN:TALLOWjCREATURE:GIANT_TIGER:TALLOWjCREATURE:CHEETAH:TALLOWjCREATURE:CHEETAH_MAN:TALLOWjCREATURE:GIANT_CHEETAH:TALLOWjCREATURE:GAZELLE:TALLOWjCREATURE:GAZELLE_MAN:TALLOWjCREATURE:GIANT_GAZELLE:TALLOWjCREATURE:MANDRILL:TALLOWjCREATURE:MANDRILL_MAN:TALLOWjCREATURE:GIANT_MANDRILL:TALLOWjCREATURE:CHIMPANZEE:TALLOWjCREATURE:BONOBO:TALLOWjCREATURE:GORILLA:TALLOWjCREATURE:ORANGUTAN:TALLOWjCREATURE:GIBBON_SIAMANG:TALLOWj#CREATURE:GIBBON_WHITE_HANDED:TALLOWj#CREATURE:GIBBON_BLACK_HANDED:TALLOWjCREATURE:GIBBON_GRAY:TALLOWjCREATURE:GIBBON_SILVERY:TALLOWjCREATURE:GIBBON_PILEATED:TALLOWjCREATURE:GIBBON_BILOU:TALLOWj#CREATURE:GIBBON_WHITE_BROWED:TALLOWj$CREATURE:GIBBON_BLACK_CRESTED:TALLOWjCREATURE:CAMEL_1_HUMP:TALLOWj CREATURE:CAMEL_1_HUMP_MAN:TALLOWj"CREATURE:GIANT_CAMEL_1_HUMP:TALLOWjCREATURE:CAMEL_2_HUMP:TALLOWj CREATURE:CAMEL_2_HUMP_MAN:TALLOWj"CREATURE:GIANT_CAMEL_2_HUMP:TALLOWj#CREATURE:CROCODILE_SALTWATER:TALLOWj'CREATURE:CROCODILE_SALTWATER_MAN:TALLOWj)CREATURE:GIANT_CROCODILE_SALTWATER:TALLOWjCREATURE:BIRD_VULTURE:TALLOWjCREATURE:VULTURE_MAN:TALLOWjCREATURE:GIANT_VULTURE:TALLOWjCREATURE:RHINOCEROS:TALLOWjCREATURE:RHINOCEROS_MAN:TALLOWj CREATURE:GIANT_RHINOCEROS:TALLOWjCREATURE:GIRAFFE:TALLOWjCREATURE:GIRAFFE_MAN:TALLOWjCREATURE:GIANT_GIRAFFE:TALLOWjCREATURE:HONEY BADGER:TALLOWj CREATURE:HONEY BADGER MAN:TALLOWj#CREATURE:HONEY BADGER, GIANT:TALLOWjCREATURE:GIANT TORTOISE:TALLOWj"CREATURE:GIANT TORTOISE MAN:TALLOWj!CREATURE:GIGANTIC TORTOISE:TALLOWjCREATURE:ARMADILLO:TALLOWjCREATURE:ARMADILLO MAN:TALLOWj CREATURE:ARMADILLO, GIANT:TALLOWjCREATURE:MUSKOX:TALLOWjCREATURE:MUSKOX_MAN:TALLOWjCREATURE:GIANT_MUSKOX:TALLOWjCREATURE:ELK:TALLOWjCREATURE:ELK_MAN:TALLOWjCREATURE:GIANT_ELK:TALLOWjCREATURE:BEAR_POLAR:TALLOWjCREATURE:BEAR_POLAR_MAN:TALLOWj CREATURE:GIANT_BEAR_POLAR:TALLOWjCREATURE:WOLVERINE:TALLOWjCREATURE:WOLVERINE_MAN:TALLOWjCREATURE:GIANT_WOLVERINE:TALLOWjCREATURE:CHINCHILLA:TALLOWjCREATURE:CHINCHILLA_MAN:TALLOWj CREATURE:GIANT_CHINCHILLA:TALLOWjCREATURE:FLOATING_GUTS:TALLOWjCREATURE:DRUNIAN:TALLOWjCREATURE:CREEPING_EYE:TALLOWj&CREATURE:VORACIOUS_CAVE_CRAWLER:TALLOWjCREATURE:BLIND_CAVE_OGRE:TALLOWjCREATURE:CAP_HOPPER:TALLOWjCREATURE:MAGMA_CRAB:TALLOWjCREATURE:CRUNDLE:TALLOWjCREATURE:HUNGRY_HEAD:TALLOWjCREATURE:ELK_BIRD:TALLOWjCREATURE:HELMET_SNAKE:TALLOWjCREATURE:GREEN_DEVOURER:TALLOWjCREATURE:RUTHERER:TALLOWjCREATURE:CREEPY_CRAWLER:TALLOWjCREATURE:DRALTHA:TALLOWjCREATURE:GIANT_EARTHWORM:TALLOWjCREATURE:BUGBAT:TALLOWjCREATURE:MANERA:TALLOWjCREATURE:MOLEMARIAN:TALLOWjCREATURE:JABBERER:TALLOWjCREATURE:POND_GRABBER:TALLOWjCREATURE:BLIND_CAVE_BEAR:TALLOWjCREATURE:CAVE_DRAGON:TALLOWjCREATURE:REACHER:TALLOWjCREATURE:GORLAK:TALLOWjCREATURE:OCTOPUS:TALLOWjCREATURE:OCTOPUS_MAN:TALLOWjCREATURE:GIANT_OCTOPUS:TALLOWjCREATURE:CRAB:TALLOWjCREATURE:CRAB_MAN:TALLOWjCREATURE:GIANT_CRAB:TALLOWjCREATURE:LEOPARD_SEAL:TALLOWj CREATURE:LEOPARD_SEAL_MAN:TALLOWj"CREATURE:GIANT_LEOPARD_SEAL:TALLOWjCREATURE:CUTTLEFISH:TALLOWjCREATURE:CUTTLEFISH_MAN:TALLOWj CREATURE:GIANT_CUTTLEFISH:TALLOWjCREATURE:ORCA:TALLOWjCREATURE:ORCA_MAN:TALLOWjCREATURE:GIANT_ORCA:TALLOWjCREATURE:HORSESHOE_CRAB:TALLOWj"CREATURE:HORSESHOE_CRAB_MAN:TALLOWj$CREATURE:GIANT_HORSESHOE_CRAB:TALLOWjCREATURE:SPERM_WHALE:TALLOWjCREATURE:SPERM_WHALE_MAN:TALLOWj!CREATURE:GIANT_SPERM_WHALE:TALLOWjCREATURE:ELEPHANT_SEAL:TALLOWj!CREATURE:ELEPHANT_SEAL_MAN:TALLOWj#CREATURE:GIANT_ELEPHANT_SEAL:TALLOWjCREATURE:HARP_SEAL:TALLOWjCREATURE:HARP_SEAL_MAN:TALLOWjCREATURE:GIANT_HARP_SEAL:TALLOWjCREATURE:NAUTILUS:TALLOWjCREATURE:NAUTILUS_MAN:TALLOWjCREATURE:GIANT_NAUTILUS:TALLOWjCREATURE:FOXSQUIRREL:TALLOWjCREATURE:MOGHOPPER:TALLOWjCREATURE:RAT_DEMON:TALLOWjCREATURE:WAMBLER_FLUFFY:TALLOWj'CREATURE:LIZARD_RHINO_TWO_LEGGED:TALLOWjCREATURE:WORM_KNUCKLE:TALLOWjCREATURE:SPIDER_PHANTOM:TALLOWjCREATURE:FLY_ACORN:TALLOWjCREATURE:GNAT_BLOOD:TALLOWjCREATURE:LIZARD:TALLOWjCREATURE:LIZARD_MAN:TALLOWjCREATURE:GIANT_LIZARD:TALLOWjCREATURE:SKINK:TALLOWjCREATURE:SKINK_MAN:TALLOWjCREATURE:GIANT_SKINK:TALLOWjCREATURE:CHAMELEON:TALLOWjCREATURE:CHAMELEON_MAN:TALLOWjCREATURE:GIANT_CHAMELEON:TALLOWjCREATURE:ANOLE:TALLOWjCREATURE:ANOLE_MAN:TALLOWjCREATURE:GIANT_ANOLE:TALLOWjCREATURE:IGUANA:TALLOWjCREATURE:IGUANA_MAN:TALLOWjCREATURE:GIANT_IGUANA:TALLOWjCREATURE:RIVER OTTER:TALLOWjCREATURE:SEA OTTER:TALLOWjCREATURE:OTTER_MAN:TALLOWjCREATURE:GIANT_OTTER:TALLOWjCREATURE:SNAPPING TURTLE:TALLOWj)CREATURE:ALLIGATOR SNAPPING TURTLE:TALLOWj#CREATURE:SNAPPING_TURTLE_MAN:TALLOWj%CREATURE:GIANT_SNAPPING_TURTLE:TALLOWjCREATURE:BEAVER:TALLOWjCREATURE:BEAVER_MAN:TALLOWjCREATURE:GIANT_BEAVER:TALLOWjCREATURE:LEECH:TALLOWjCREATURE:LEECH_MAN:TALLOWjCREATURE:GIANT_LEECH:TALLOWjCREATURE:AXOLOTL:TALLOWjCREATURE:AXOLOTL_MAN:TALLOWjCREATURE:GIANT_AXOLOTL:TALLOWjCREATURE:MINK:TALLOWjCREATURE:MINK_MAN:TALLOWjCREATURE:GIANT_MINK:TALLOWjCREATURE:POND_TURTLE:TALLOWjCREATURE:POND_TURTLE_MAN:TALLOWj!CREATURE:GIANT_POND_TURTLE:TALLOWjCREATURE:RAT:TALLOWjCREATURE:RAT_MAN:TALLOWjCREATURE:SQUIRREL_GRAY:TALLOWj!CREATURE:SQUIRREL_GRAY_MAN:TALLOWj#CREATURE:GIANT_SQUIRREL_GRAY:TALLOWjCREATURE:SQUIRREL_RED:TALLOWj CREATURE:SQUIRREL_RED_MAN:TALLOWj"CREATURE:GIANT_SQUIRREL_RED:TALLOWjCREATURE:CHIPMUNK:TALLOWjCREATURE:CHIPMUNK_MAN:TALLOWjCREATURE:GIANT_CHIPMUNK:TALLOWjCREATURE:HAMSTER:TALLOWjCREATURE:HAMSTER_MAN:TALLOWjCREATURE:GIANT_HAMSTER:TALLOWjCREATURE:HEDGEHOG:TALLOWjCREATURE:HEDGEHOG_MAN:TALLOWjCREATURE:GIANT_HEDGEHOG:TALLOWjCREATURE:SQUIRREL_FLYING:TALLOWj#CREATURE:FLYING_SQUIRREL_MAN:TALLOWj%CREATURE:GIANT_FLYING_SQUIRREL:TALLOWjCREATURE:MUSSEL:TALLOWjCREATURE:OYSTER:TALLOWjCREATURE:FISH_SALMON:TALLOWjCREATURE:FISH_CLOWNFISH:TALLOWjCREATURE:FISH_HAGFISH:TALLOWj"CREATURE:FISH_LAMPREY_BROOK:TALLOWjCREATURE:FISH_RAY_BAT:TALLOWj"CREATURE:FISH_RAY_THORNBACK:TALLOWj$CREATURE:FISH_RATFISH_SPOTTED:TALLOWjCREATURE:FISH_HERRING:TALLOWjCREATURE:FISH_SHAD:TALLOWjCREATURE:FISH_ANCHOVY:TALLOWj$CREATURE:FISH_TROUT_STEELHEAD:TALLOWjCREATURE:FISH_HAKE:TALLOWjCREATURE:FISH_SEAHORSE:TALLOWjCREATURE:FISH_GLASSEYE:TALLOWj)CREATURE:FISH_PUFFER_WHITE_SPOTTED:TALLOWjCREATURE:FISH_SOLE:TALLOWjCREATURE:FISH_FLOUNDER:TALLOWjCREATURE:FISH_MACKEREL:TALLOWj$CREATURE:JELLYFISH_SEA_NETTLE:TALLOWjCREATURE:SQUID:TALLOWjCREATURE:SQUID MAN:TALLOWjCREATURE:GIGANTIC SQUID:TALLOWjCREATURE:FISH_LUNGFISH:TALLOWj CREATURE:FISH_LOACH_CLOWN:TALLOWj#CREATURE:FISH_BULLHEAD_BROWN:TALLOWj$CREATURE:FISH_BULLHEAD_YELLOW:TALLOWj#CREATURE:FISH_BULLHEAD_BLACK:TALLOWj%CREATURE:FISH_KNIFEFISH_BANDED:TALLOWjCREATURE:FISH_CHAR:TALLOWj"CREATURE:FISH_TROUT_RAINBOW:TALLOWj"CREATURE:FISH_MOLLY_SAILFIN:TALLOWjCREATURE:FISH_GUPPY:TALLOWjCREATURE:FISH_PERCH:TALLOWjCREATURE:DWARF:TALLOWjCREATURE:HUMAN:TALLOWjCREATURE:ELF:TALLOWjCREATURE:GOBLIN:TALLOWjCREATURE:KOBOLD:TALLOWjCREATURE:GREMLIN:TALLOWjCREATURE:TROLL:TALLOWjCREATURE:OGRE:TALLOWjCREATURE:UNICORN:TALLOWjCREATURE:DRAGON:TALLOWjCREATURE:SATYR:TALLOWjCREATURE:GIANT:TALLOWjCREATURE:CYCLOPS:TALLOWjCREATURE:ETTIN:TALLOWjCREATURE:MINOTAUR:TALLOWjCREATURE:YETI:TALLOWjCREATURE:SASQUATCH:TALLOWjCREATURE:BLIZZARD_MAN:TALLOWjCREATURE:WOLF_ICE:TALLOWjCREATURE:FAIRY:TALLOWjCREATURE:PIXIE:TALLOWjCREATURE:BEAK_DOG:TALLOWjCREATURE:GRIMELING:TALLOWjCREATURE:BLENDEC_FOUL:TALLOWjCREATURE:STRANGLER:TALLOWjCREATURE:NIGHTWING:TALLOWjCREATURE:HARPY:TALLOWjCREATURE:HYDRA:TALLOWjCREATURE:MERPERSON:TALLOWjCREATURE:SEA_SERPENT:TALLOWjCREATURE:SEA_MONSTER:TALLOWjCREATURE:BIRD_ROC:TALLOWjCREATURE:CROCODILE_CAVE:TALLOWjCREATURE:TOAD_GIANT_CAVE:TALLOWjCREATURE:OLM_GIANT:TALLOWjCREATURE:BAT_GIANT:TALLOWjCREATURE:RAT_GIANT:TALLOWjCREATURE:RAT_LARGE:TALLOWjCREATURE:MOLE_DOG_NAKED:TALLOWjCREATURE:TROGLODYTE:TALLOWjCREATURE:MOLE_GIANT:TALLOWjCREATURE:IMP_FIRE:TALLOWj!CREATURE:SPIDER_CAVE_GIANT:TALLOWjCREATURE:SPIDER_CAVE:TALLOWjCREATURE:FISH_CAVE:TALLOWjCREATURE:CAVE_FISH_MAN:TALLOWjCREATURE:LOBSTER_CAVE:TALLOWjCREATURE:OLM:TALLOWjCREATURE:OLM_MAN:TALLOWjCREATURE:BAT:TALLOWjCREATURE:BAT_MAN:TALLOWjCREATURE:MAGGOT_PURRING:TALLOWj!CREATURE:BIRD_SWALLOW_CAVE:TALLOWj CREATURE:CAVE_SWALLOW_MAN:TALLOWj'CREATURE:BIRD_SWALLOW_CAVE_GIANT:TALLOWjCREATURE:AMPHIBIAN_MAN:TALLOWjCREATURE:REPTILE_MAN:TALLOWjCREATURE:SERPENT_MAN:TALLOWjCREATURE:ANT_MAN:TALLOWjCREATURE:RODENT MAN:TALLOWjCREATURE:WILD_BOAR:TALLOWjCREATURE:WILD_BOAR_MAN:TALLOWjCREATURE:GIANT_WILD_BOAR:TALLOWjCREATURE:COYOTE:TALLOWjCREATURE:COYOTE_MAN:TALLOWjCREATURE:GIANT_COYOTE:TALLOWjCREATURE:KANGAROO:TALLOWjCREATURE:KANGAROO_MAN:TALLOWjCREATURE:GIANT_KANGAROO:TALLOWjCREATURE:KOALA:TALLOWjCREATURE:KOALA_MAN:TALLOWjCREATURE:GIANT_KOALA:TALLOWjCREATURE:ADDER:TALLOWjCREATURE:ADDER_MAN:TALLOWjCREATURE:GIANT_ADDER:TALLOWjCREATURE:ECHIDNA:TALLOWjCREATURE:ECHIDNA_MAN:TALLOWjCREATURE:GIANT_ECHIDNA:TALLOWjCREATURE:PORCUPINE:TALLOWjCREATURE:PORCUPINE_MAN:TALLOWjCREATURE:GIANT_PORCUPINE:TALLOWjCREATURE:KINGSNAKE:TALLOWjCREATURE:KINGSNAKE_MAN:TALLOWjCREATURE:GIANT_KINGSNAKE:TALLOWjCREATURE:GRAY_LANGUR:TALLOWjCREATURE:GRAY_LANGUR_MAN:TALLOWj!CREATURE:GIANT_GRAY_LANGUR:TALLOWjCREATURE:BOBCAT:TALLOWjCREATURE:BOBCAT_MAN:TALLOWjCREATURE:GIANT_BOBCAT:TALLOWjCREATURE:SKUNK:TALLOWjCREATURE:SKUNK_MAN:TALLOWjCREATURE:GIANT_SKUNK:TALLOWjCREATURE:GREEN_TREE_FROG:TALLOWj#CREATURE:GREEN_TREE_FROG_MAN:TALLOWj%CREATURE:GIANT_GREEN_TREE_FROG:TALLOWjCREATURE:HARE:TALLOWjCREATURE:HARE_MAN:TALLOWjCREATURE:GIANT_HARE:TALLOWjCREATURE:RATTLESNAKE:TALLOWjCREATURE:RATTLESNAKE_MAN:TALLOWj!CREATURE:GIANT_RATTLESNAKE:TALLOWjCREATURE:WEASEL:TALLOWjCREATURE:WEASEL_MAN:TALLOWjCREATURE:GIANT_WEASEL:TALLOWj CREATURE:COPPERHEAD_SNAKE:TALLOWj$CREATURE:COPPERHEAD_SNAKE_MAN:TALLOWj&CREATURE:GIANT_COPPERHEAD_SNAKE:TALLOWjCREATURE:IBEX:TALLOWjCREATURE:IBEX_MAN:TALLOWjCREATURE:GIANT_IBEX:TALLOWjCREATURE:WOMBAT:TALLOWjCREATURE:WOMBAT_MAN:TALLOWjCREATURE:GIANT_WOMBAT:TALLOWjCREATURE:DINGO:TALLOWjCREATURE:DINGO_MAN:TALLOWjCREATURE:GIANT_DINGO:TALLOWjCREATURE:COATI:TALLOWjCREATURE:COATI_MAN:TALLOWjCREATURE:GIANT_COATI:TALLOWjCREATURE:OPOSSUM:TALLOWjCREATURE:OPOSSUM_MAN:TALLOWjCREATURE:GIANT_OPOSSUM:TALLOWjCREATURE:MONGOOSE:TALLOWjCREATURE:MONGOOSE_MAN:TALLOWjCREATURE:GIANT_MONGOOSE:TALLOWjCREATURE:HYENA:TALLOWjCREATURE:HYENA_MAN:TALLOWjCREATURE:GIANT_HYENA:TALLOWjCREATURE:ANACONDA:TALLOWjCREATURE:ANACONDA_MAN:TALLOWjCREATURE:GIANT_ANACONDA:TALLOWjCREATURE:MONITOR_LIZARD:TALLOWj"CREATURE:MONITOR_LIZARD_MAN:TALLOWj$CREATURE:GIANT_MONITOR_LIZARD:TALLOWjCREATURE:KING_COBRA:TALLOWjCREATURE:KING_COBRA_MAN:TALLOWj CREATURE:GIANT_KING_COBRA:TALLOWjCREATURE:OCELOT:TALLOWjCREATURE:OCELOT_MAN:TALLOWjCREATURE:GIANT_OCELOT:TALLOWjCREATURE:JACKAL:TALLOWjCREATURE:JACKAL_MAN:TALLOWjCREATURE:GIANT_JACKAL:TALLOWjCREATURE:CAPUCHIN:TALLOWjCREATURE:CAPUCHIN_MAN:TALLOWjCREATURE:GIANT_CAPUCHIN:TALLOWjCREATURE:SLOTH:TALLOWjCREATURE:SLOTH_MAN:TALLOWjCREATURE:GIANT_SLOTH:TALLOWjCREATURE:SPIDER_MONKEY:TALLOWj!CREATURE:SPIDER_MONKEY_MAN:TALLOWj#CREATURE:GIANT_SPIDER_MONKEY:TALLOWjCREATURE:PANGOLIN:TALLOWjCREATURE:PANGOLIN_MAN:TALLOWjCREATURE:GIANT_PANGOLIN:TALLOWjCREATURE:BLACK_MAMBA:TALLOWjCREATURE:BLACK_MAMBA_MAN:TALLOWj!CREATURE:GIANT_BLACK_MAMBA:TALLOWjCREATURE:BEAR_SLOTH:TALLOWjCREATURE:SLOTH_BEAR_MAN:TALLOWj CREATURE:GIANT_SLOTH_BEAR:TALLOWjCREATURE:AYE-AYE:TALLOWjCREATURE:AYE-AYE_MAN:TALLOWjCREATURE:GIANT_AYE-AYE:TALLOWjCREATURE:BUSHMASTER:TALLOWjCREATURE:BUSHMASTER_MAN:TALLOWj CREATURE:GIANT_BUSHMASTER:TALLOWjCREATURE:PYTHON:TALLOWjCREATURE:PYTHON_MAN:TALLOWjCREATURE:GIANT_PYTHON:TALLOWjCREATURE:TAPIR:TALLOWjCREATURE:TAPIR_MAN:TALLOWjCREATURE:GIANT_TAPIR:TALLOWjCREATURE:IMPALA:TALLOWjCREATURE:IMPALA_MAN:TALLOWjCREATURE:GIANT_IMPALA:TALLOWjCREATURE:AARDVARK:TALLOWjCREATURE:AARDVARK_MAN:TALLOWjCREATURE:GIANT_AARDVARK:TALLOWjCREATURE:LION_TAMARIN:TALLOWj CREATURE:LION_TAMARIN_MAN:TALLOWj"CREATURE:GIANT_LION_TAMARIN:TALLOWjCREATURE:STOAT:TALLOWjCREATURE:STOAT_MAN:TALLOWjCREATURE:GIANT_STOAT:TALLOWjCREATURE:LYNX:TALLOWjCREATURE:LYNX_MAN:TALLOWjCREATURE:GIANT_LYNX:TALLOWjCREATURE:GNOLL:TALLOWjCREATURE:NAGA:TALLOWj!CREATURE:FORGOTTEN_BEAST_2:TALLOWj!CREATURE:FORGOTTEN_BEAST_4:TALLOWj!CREATURE:FORGOTTEN_BEAST_5:TALLOWj!CREATURE:FORGOTTEN_BEAST_6:TALLOWj!CREATURE:FORGOTTEN_BEAST_7:TALLOWj"CREATURE:FORGOTTEN_BEAST_10:TALLOWj"CREATURE:FORGOTTEN_BEAST_12:TALLOWj"CREATURE:FORGOTTEN_BEAST_13:TALLOWj"CREATURE:FORGOTTEN_BEAST_16:TALLOWj"CREATURE:FORGOTTEN_BEAST_17:TALLOWj"CREATURE:FORGOTTEN_BEAST_18:TALLOWj"CREATURE:FORGOTTEN_BEAST_19:TALLOWj"CREATURE:FORGOTTEN_BEAST_20:TALLOWj"CREATURE:FORGOTTEN_BEAST_22:TALLOWj"CREATURE:FORGOTTEN_BEAST_23:TALLOWj"CREATURE:FORGOTTEN_BEAST_24:TALLOWj"CREATURE:FORGOTTEN_BEAST_25:TALLOWj"CREATURE:FORGOTTEN_BEAST_26:TALLOWj"CREATURE:FORGOTTEN_BEAST_27:TALLOWj"CREATURE:FORGOTTEN_BEAST_28:TALLOWj"CREATURE:FORGOTTEN_BEAST_29:TALLOWj"CREATURE:FORGOTTEN_BEAST_32:TALLOWj"CREATURE:FORGOTTEN_BEAST_33:TALLOWj"CREATURE:FORGOTTEN_BEAST_34:TALLOWj"CREATURE:FORGOTTEN_BEAST_35:TALLOWj"CREATURE:FORGOTTEN_BEAST_36:TALLOWj"CREATURE:FORGOTTEN_BEAST_39:TALLOWj"CREATURE:FORGOTTEN_BEAST_41:TALLOWj"CREATURE:FORGOTTEN_BEAST_42:TALLOWj"CREATURE:FORGOTTEN_BEAST_43:TALLOWj"CREATURE:FORGOTTEN_BEAST_44:TALLOWj"CREATURE:FORGOTTEN_BEAST_45:TALLOWj"CREATURE:FORGOTTEN_BEAST_47:TALLOWj"CREATURE:FORGOTTEN_BEAST_50:TALLOWj"CREATURE:FORGOTTEN_BEAST_52:TALLOWj"CREATURE:FORGOTTEN_BEAST_53:TALLOWj"CREATURE:FORGOTTEN_BEAST_55:TALLOWj"CREATURE:FORGOTTEN_BEAST_56:TALLOWj"CREATURE:FORGOTTEN_BEAST_58:TALLOWj"CREATURE:FORGOTTEN_BEAST_59:TALLOWj"CREATURE:FORGOTTEN_BEAST_60:TALLOWj"CREATURE:FORGOTTEN_BEAST_61:TALLOWj"CREATURE:FORGOTTEN_BEAST_64:TALLOWj"CREATURE:FORGOTTEN_BEAST_66:TALLOWj"CREATURE:FORGOTTEN_BEAST_67:TALLOWj"CREATURE:FORGOTTEN_BEAST_69:TALLOWj"CREATURE:FORGOTTEN_BEAST_71:TALLOWj"CREATURE:FORGOTTEN_BEAST_72:TALLOWj"CREATURE:FORGOTTEN_BEAST_73:TALLOWj"CREATURE:FORGOTTEN_BEAST_74:TALLOWj"CREATURE:FORGOTTEN_BEAST_75:TALLOWj"CREATURE:FORGOTTEN_BEAST_78:TALLOWj"CREATURE:FORGOTTEN_BEAST_80:TALLOWj"CREATURE:FORGOTTEN_BEAST_81:TALLOWj"CREATURE:FORGOTTEN_BEAST_82:TALLOWj"CREATURE:FORGOTTEN_BEAST_83:TALLOWj"CREATURE:FORGOTTEN_BEAST_84:TALLOWj"CREATURE:FORGOTTEN_BEAST_86:TALLOWj"CREATURE:FORGOTTEN_BEAST_87:TALLOWj"CREATURE:FORGOTTEN_BEAST_89:TALLOWj"CREATURE:FORGOTTEN_BEAST_90:TALLOWj"CREATURE:FORGOTTEN_BEAST_92:TALLOWj"CREATURE:FORGOTTEN_BEAST_94:TALLOWj"CREATURE:FORGOTTEN_BEAST_95:TALLOWj"CREATURE:FORGOTTEN_BEAST_96:TALLOWj"CREATURE:FORGOTTEN_BEAST_97:TALLOWj"CREATURE:FORGOTTEN_BEAST_98:TALLOWj#CREATURE:FORGOTTEN_BEAST_100:TALLOWj#CREATURE:FORGOTTEN_BEAST_105:TALLOWj#CREATURE:FORGOTTEN_BEAST_106:TALLOWj#CREATURE:FORGOTTEN_BEAST_107:TALLOWj#CREATURE:FORGOTTEN_BEAST_108:TALLOWj#CREATURE:FORGOTTEN_BEAST_109:TALLOWj#CREATURE:FORGOTTEN_BEAST_111:TALLOWj#CREATURE:FORGOTTEN_BEAST_112:TALLOWj#CREATURE:FORGOTTEN_BEAST_113:TALLOWj#CREATURE:FORGOTTEN_BEAST_114:TALLOWj#CREATURE:FORGOTTEN_BEAST_115:TALLOWj#CREATURE:FORGOTTEN_BEAST_116:TALLOWj#CREATURE:FORGOTTEN_BEAST_117:TALLOWj#CREATURE:FORGOTTEN_BEAST_118:TALLOWj#CREATURE:FORGOTTEN_BEAST_119:TALLOWj#CREATURE:FORGOTTEN_BEAST_120:TALLOWj#CREATURE:FORGOTTEN_BEAST_122:TALLOWj#CREATURE:FORGOTTEN_BEAST_123:TALLOWj#CREATURE:FORGOTTEN_BEAST_124:TALLOWj#CREATURE:FORGOTTEN_BEAST_125:TALLOWj#CREATURE:FORGOTTEN_BEAST_127:TALLOWj#CREATURE:FORGOTTEN_BEAST_128:TALLOWj#CREATURE:FORGOTTEN_BEAST_130:TALLOWj#CREATURE:FORGOTTEN_BEAST_131:TALLOWj#CREATURE:FORGOTTEN_BEAST_132:TALLOWj#CREATURE:FORGOTTEN_BEAST_133:TALLOWj#CREATURE:FORGOTTEN_BEAST_134:TALLOWj#CREATURE:FORGOTTEN_BEAST_135:TALLOWj#CREATURE:FORGOTTEN_BEAST_137:TALLOWj#CREATURE:FORGOTTEN_BEAST_138:TALLOWj#CREATURE:FORGOTTEN_BEAST_139:TALLOWj#CREATURE:FORGOTTEN_BEAST_141:TALLOWj#CREATURE:FORGOTTEN_BEAST_142:TALLOWj#CREATURE:FORGOTTEN_BEAST_144:TALLOWj#CREATURE:FORGOTTEN_BEAST_146:TALLOWj#CREATURE:FORGOTTEN_BEAST_148:TALLOWj#CREATURE:FORGOTTEN_BEAST_149:TALLOWj#CREATURE:FORGOTTEN_BEAST_150:TALLOWj#CREATURE:FORGOTTEN_BEAST_152:TALLOWj#CREATURE:FORGOTTEN_BEAST_154:TALLOWj#CREATURE:FORGOTTEN_BEAST_156:TALLOWj#CREATURE:FORGOTTEN_BEAST_157:TALLOWj#CREATURE:FORGOTTEN_BEAST_158:TALLOWj#CREATURE:FORGOTTEN_BEAST_159:TALLOWj#CREATURE:FORGOTTEN_BEAST_161:TALLOWj#CREATURE:FORGOTTEN_BEAST_162:TALLOWj#CREATURE:FORGOTTEN_BEAST_163:TALLOWj#CREATURE:FORGOTTEN_BEAST_165:TALLOWj#CREATURE:FORGOTTEN_BEAST_167:TALLOWj#CREATURE:FORGOTTEN_BEAST_168:TALLOWj#CREATURE:FORGOTTEN_BEAST_169:TALLOWj#CREATURE:FORGOTTEN_BEAST_170:TALLOWj#CREATURE:FORGOTTEN_BEAST_171:TALLOWj#CREATURE:FORGOTTEN_BEAST_172:TALLOWj#CREATURE:FORGOTTEN_BEAST_173:TALLOWj#CREATURE:FORGOTTEN_BEAST_176:TALLOWj#CREATURE:FORGOTTEN_BEAST_177:TALLOWj#CREATURE:FORGOTTEN_BEAST_178:TALLOWj#CREATURE:FORGOTTEN_BEAST_179:TALLOWj#CREATURE:FORGOTTEN_BEAST_180:TALLOWj#CREATURE:FORGOTTEN_BEAST_181:TALLOWj#CREATURE:FORGOTTEN_BEAST_182:TALLOWj#CREATURE:FORGOTTEN_BEAST_183:TALLOWj#CREATURE:FORGOTTEN_BEAST_184:TALLOWj#CREATURE:FORGOTTEN_BEAST_185:TALLOWj#CREATURE:FORGOTTEN_BEAST_186:TALLOWj#CREATURE:FORGOTTEN_BEAST_188:TALLOWj#CREATURE:FORGOTTEN_BEAST_189:TALLOWj#CREATURE:FORGOTTEN_BEAST_190:TALLOWj#CREATURE:FORGOTTEN_BEAST_191:TALLOWj#CREATURE:FORGOTTEN_BEAST_193:TALLOWj#CREATURE:FORGOTTEN_BEAST_194:TALLOWj#CREATURE:FORGOTTEN_BEAST_195:TALLOWj#CREATURE:FORGOTTEN_BEAST_196:TALLOWj#CREATURE:FORGOTTEN_BEAST_197:TALLOWj#CREATURE:FORGOTTEN_BEAST_199:TALLOWj#CREATURE:FORGOTTEN_BEAST_200:TALLOWj#CREATURE:FORGOTTEN_BEAST_201:TALLOWj#CREATURE:FORGOTTEN_BEAST_204:TALLOWj#CREATURE:FORGOTTEN_BEAST_205:TALLOWj#CREATURE:FORGOTTEN_BEAST_206:TALLOWj#CREATURE:FORGOTTEN_BEAST_207:TALLOWj#CREATURE:FORGOTTEN_BEAST_208:TALLOWj#CREATURE:FORGOTTEN_BEAST_209:TALLOWj#CREATURE:FORGOTTEN_BEAST_210:TALLOWj#CREATURE:FORGOTTEN_BEAST_211:TALLOWj#CREATURE:FORGOTTEN_BEAST_212:TALLOWj#CREATURE:FORGOTTEN_BEAST_213:TALLOWj#CREATURE:FORGOTTEN_BEAST_214:TALLOWj#CREATURE:FORGOTTEN_BEAST_215:TALLOWj#CREATURE:FORGOTTEN_BEAST_216:TALLOWj#CREATURE:FORGOTTEN_BEAST_217:TALLOWj#CREATURE:FORGOTTEN_BEAST_218:TALLOWj#CREATURE:FORGOTTEN_BEAST_220:TALLOWj#CREATURE:FORGOTTEN_BEAST_221:TALLOWj#CREATURE:FORGOTTEN_BEAST_224:TALLOWj#CREATURE:FORGOTTEN_BEAST_225:TALLOWj#CREATURE:FORGOTTEN_BEAST_228:TALLOWj#CREATURE:FORGOTTEN_BEAST_231:TALLOWj#CREATURE:FORGOTTEN_BEAST_232:TALLOWj#CREATURE:FORGOTTEN_BEAST_235:TALLOWj#CREATURE:FORGOTTEN_BEAST_236:TALLOWj#CREATURE:FORGOTTEN_BEAST_237:TALLOWj#CREATURE:FORGOTTEN_BEAST_239:TALLOWj#CREATURE:FORGOTTEN_BEAST_240:TALLOWj#CREATURE:FORGOTTEN_BEAST_242:TALLOWj#CREATURE:FORGOTTEN_BEAST_243:TALLOWj#CREATURE:FORGOTTEN_BEAST_244:TALLOWj#CREATURE:FORGOTTEN_BEAST_245:TALLOWj#CREATURE:FORGOTTEN_BEAST_246:TALLOWj#CREATURE:FORGOTTEN_BEAST_247:TALLOWj#CREATURE:FORGOTTEN_BEAST_248:TALLOWj#CREATURE:FORGOTTEN_BEAST_249:TALLOWj#CREATURE:FORGOTTEN_BEAST_253:TALLOWj#CREATURE:FORGOTTEN_BEAST_255:TALLOWj#CREATURE:FORGOTTEN_BEAST_256:TALLOWj#CREATURE:FORGOTTEN_BEAST_259:TALLOWj#CREATURE:FORGOTTEN_BEAST_260:TALLOWj#CREATURE:FORGOTTEN_BEAST_263:TALLOWj#CREATURE:FORGOTTEN_BEAST_264:TALLOWj#CREATURE:FORGOTTEN_BEAST_265:TALLOWj#CREATURE:FORGOTTEN_BEAST_266:TALLOWj#CREATURE:FORGOTTEN_BEAST_268:TALLOWj#CREATURE:FORGOTTEN_BEAST_269:TALLOWj#CREATURE:FORGOTTEN_BEAST_270:TALLOWj#CREATURE:FORGOTTEN_BEAST_271:TALLOWj#CREATURE:FORGOTTEN_BEAST_272:TALLOWj#CREATURE:FORGOTTEN_BEAST_273:TALLOWj#CREATURE:FORGOTTEN_BEAST_274:TALLOWj#CREATURE:FORGOTTEN_BEAST_275:TALLOWj#CREATURE:FORGOTTEN_BEAST_276:TALLOWj#CREATURE:FORGOTTEN_BEAST_277:TALLOWj#CREATURE:FORGOTTEN_BEAST_279:TALLOWj#CREATURE:FORGOTTEN_BEAST_280:TALLOWj#CREATURE:FORGOTTEN_BEAST_281:TALLOWj#CREATURE:FORGOTTEN_BEAST_282:TALLOWj#CREATURE:FORGOTTEN_BEAST_283:TALLOWj#CREATURE:FORGOTTEN_BEAST_285:TALLOWj#CREATURE:FORGOTTEN_BEAST_286:TALLOWj#CREATURE:FORGOTTEN_BEAST_287:TALLOWj#CREATURE:FORGOTTEN_BEAST_288:TALLOWj#CREATURE:FORGOTTEN_BEAST_289:TALLOWj#CREATURE:FORGOTTEN_BEAST_290:TALLOWj#CREATURE:FORGOTTEN_BEAST_293:TALLOWj#CREATURE:FORGOTTEN_BEAST_295:TALLOWj#CREATURE:FORGOTTEN_BEAST_297:TALLOWj#CREATURE:FORGOTTEN_BEAST_300:TALLOWj#CREATURE:FORGOTTEN_BEAST_302:TALLOWj#CREATURE:FORGOTTEN_BEAST_306:TALLOWj#CREATURE:FORGOTTEN_BEAST_307:TALLOWj#CREATURE:FORGOTTEN_BEAST_310:TALLOWj#CREATURE:FORGOTTEN_BEAST_311:TALLOWj#CREATURE:FORGOTTEN_BEAST_312:TALLOWj#CREATURE:FORGOTTEN_BEAST_314:TALLOWj#CREATURE:FORGOTTEN_BEAST_316:TALLOWj#CREATURE:FORGOTTEN_BEAST_317:TALLOWj#CREATURE:FORGOTTEN_BEAST_318:TALLOWj#CREATURE:FORGOTTEN_BEAST_320:TALLOWj#CREATURE:FORGOTTEN_BEAST_321:TALLOWj#CREATURE:FORGOTTEN_BEAST_322:TALLOWj#CREATURE:FORGOTTEN_BEAST_323:TALLOWj#CREATURE:FORGOTTEN_BEAST_324:TALLOWj#CREATURE:FORGOTTEN_BEAST_325:TALLOWj#CREATURE:FORGOTTEN_BEAST_326:TALLOWj#CREATURE:FORGOTTEN_BEAST_327:TALLOWj#CREATURE:FORGOTTEN_BEAST_328:TALLOWj#CREATURE:FORGOTTEN_BEAST_329:TALLOWj#CREATURE:FORGOTTEN_BEAST_330:TALLOWj#CREATURE:FORGOTTEN_BEAST_332:TALLOWj#CREATURE:FORGOTTEN_BEAST_333:TALLOWj#CREATURE:FORGOTTEN_BEAST_335:TALLOWj#CREATURE:FORGOTTEN_BEAST_336:TALLOWj#CREATURE:FORGOTTEN_BEAST_337:TALLOWj#CREATURE:FORGOTTEN_BEAST_338:TALLOWj#CREATURE:FORGOTTEN_BEAST_339:TALLOWj#CREATURE:FORGOTTEN_BEAST_341:TALLOWj#CREATURE:FORGOTTEN_BEAST_342:TALLOWj#CREATURE:FORGOTTEN_BEAST_343:TALLOWj#CREATURE:FORGOTTEN_BEAST_344:TALLOWj#CREATURE:FORGOTTEN_BEAST_347:TALLOWj#CREATURE:FORGOTTEN_BEAST_348:TALLOWj#CREATURE:FORGOTTEN_BEAST_349:TALLOWj#CREATURE:FORGOTTEN_BEAST_351:TALLOWj#CREATURE:FORGOTTEN_BEAST_352:TALLOWj#CREATURE:FORGOTTEN_BEAST_353:TALLOWj#CREATURE:FORGOTTEN_BEAST_354:TALLOWj#CREATURE:FORGOTTEN_BEAST_355:TALLOWj#CREATURE:FORGOTTEN_BEAST_356:TALLOWj#CREATURE:FORGOTTEN_BEAST_357:TALLOWj#CREATURE:FORGOTTEN_BEAST_358:TALLOWj#CREATURE:FORGOTTEN_BEAST_359:TALLOWj#CREATURE:FORGOTTEN_BEAST_361:TALLOWj#CREATURE:FORGOTTEN_BEAST_363:TALLOWj#CREATURE:FORGOTTEN_BEAST_364:TALLOWj#CREATURE:FORGOTTEN_BEAST_365:TALLOWj#CREATURE:FORGOTTEN_BEAST_366:TALLOWj#CREATURE:FORGOTTEN_BEAST_367:TALLOWj#CREATURE:FORGOTTEN_BEAST_368:TALLOWj#CREATURE:FORGOTTEN_BEAST_370:TALLOWj#CREATURE:FORGOTTEN_BEAST_372:TALLOWj#CREATURE:FORGOTTEN_BEAST_374:TALLOWj#CREATURE:FORGOTTEN_BEAST_375:TALLOWj#CREATURE:FORGOTTEN_BEAST_377:TALLOWj#CREATURE:FORGOTTEN_BEAST_378:TALLOWj#CREATURE:FORGOTTEN_BEAST_379:TALLOWj#CREATURE:FORGOTTEN_BEAST_380:TALLOWj#CREATURE:FORGOTTEN_BEAST_381:TALLOWj#CREATURE:FORGOTTEN_BEAST_382:TALLOWj#CREATURE:FORGOTTEN_BEAST_383:TALLOWj#CREATURE:FORGOTTEN_BEAST_384:TALLOWj#CREATURE:FORGOTTEN_BEAST_385:TALLOWj#CREATURE:FORGOTTEN_BEAST_386:TALLOWj#CREATURE:FORGOTTEN_BEAST_387:TALLOWj#CREATURE:FORGOTTEN_BEAST_388:TALLOWj#CREATURE:FORGOTTEN_BEAST_389:TALLOWj#CREATURE:FORGOTTEN_BEAST_390:TALLOWj#CREATURE:FORGOTTEN_BEAST_391:TALLOWj#CREATURE:FORGOTTEN_BEAST_392:TALLOWj#CREATURE:FORGOTTEN_BEAST_393:TALLOWj#CREATURE:FORGOTTEN_BEAST_396:TALLOWj#CREATURE:FORGOTTEN_BEAST_397:TALLOWj#CREATURE:FORGOTTEN_BEAST_398:TALLOWj#CREATURE:FORGOTTEN_BEAST_400:TALLOWj#CREATURE:FORGOTTEN_BEAST_403:TALLOWj#CREATURE:FORGOTTEN_BEAST_404:TALLOWj#CREATURE:FORGOTTEN_BEAST_405:TALLOWj#CREATURE:FORGOTTEN_BEAST_406:TALLOWj#CREATURE:FORGOTTEN_BEAST_407:TALLOWj#CREATURE:FORGOTTEN_BEAST_408:TALLOWj#CREATURE:FORGOTTEN_BEAST_409:TALLOWj#CREATURE:FORGOTTEN_BEAST_410:TALLOWj#CREATURE:FORGOTTEN_BEAST_411:TALLOWj#CREATURE:FORGOTTEN_BEAST_412:TALLOWj#CREATURE:FORGOTTEN_BEAST_413:TALLOWj#CREATURE:FORGOTTEN_BEAST_414:TALLOWj#CREATURE:FORGOTTEN_BEAST_416:TALLOWj#CREATURE:FORGOTTEN_BEAST_417:TALLOWj#CREATURE:FORGOTTEN_BEAST_418:TALLOWj#CREATURE:FORGOTTEN_BEAST_420:TALLOWj#CREATURE:FORGOTTEN_BEAST_421:TALLOWj#CREATURE:FORGOTTEN_BEAST_422:TALLOWj#CREATURE:FORGOTTEN_BEAST_423:TALLOWj#CREATURE:FORGOTTEN_BEAST_424:TALLOWj#CREATURE:FORGOTTEN_BEAST_427:TALLOWj#CREATURE:FORGOTTEN_BEAST_429:TALLOWj#CREATURE:FORGOTTEN_BEAST_430:TALLOWj#CREATURE:FORGOTTEN_BEAST_432:TALLOWj#CREATURE:FORGOTTEN_BEAST_433:TALLOWj#CREATURE:FORGOTTEN_BEAST_434:TALLOWj#CREATURE:FORGOTTEN_BEAST_435:TALLOWj#CREATURE:FORGOTTEN_BEAST_436:TALLOWj#CREATURE:FORGOTTEN_BEAST_437:TALLOWj#CREATURE:FORGOTTEN_BEAST_438:TALLOWj#CREATURE:FORGOTTEN_BEAST_440:TALLOWj#CREATURE:FORGOTTEN_BEAST_441:TALLOWj#CREATURE:FORGOTTEN_BEAST_442:TALLOWj#CREATURE:FORGOTTEN_BEAST_444:TALLOWj#CREATURE:FORGOTTEN_BEAST_446:TALLOWj#CREATURE:FORGOTTEN_BEAST_447:TALLOWj#CREATURE:FORGOTTEN_BEAST_448:TALLOWj#CREATURE:FORGOTTEN_BEAST_449:TALLOWj#CREATURE:FORGOTTEN_BEAST_450:TALLOWj#CREATURE:FORGOTTEN_BEAST_451:TALLOWj#CREATURE:FORGOTTEN_BEAST_453:TALLOWj#CREATURE:FORGOTTEN_BEAST_454:TALLOWj#CREATURE:FORGOTTEN_BEAST_455:TALLOWj#CREATURE:FORGOTTEN_BEAST_457:TALLOWj#CREATURE:FORGOTTEN_BEAST_459:TALLOWj#CREATURE:FORGOTTEN_BEAST_461:TALLOWj#CREATURE:FORGOTTEN_BEAST_462:TALLOWj#CREATURE:FORGOTTEN_BEAST_463:TALLOWj#CREATURE:FORGOTTEN_BEAST_465:TALLOWj#CREATURE:FORGOTTEN_BEAST_466:TALLOWj#CREATURE:FORGOTTEN_BEAST_468:TALLOWj#CREATURE:FORGOTTEN_BEAST_469:TALLOWj#CREATURE:FORGOTTEN_BEAST_470:TALLOWj#CREATURE:FORGOTTEN_BEAST_471:TALLOWj#CREATURE:FORGOTTEN_BEAST_472:TALLOWj#CREATURE:FORGOTTEN_BEAST_474:TALLOWj#CREATURE:FORGOTTEN_BEAST_475:TALLOWj#CREATURE:FORGOTTEN_BEAST_476:TALLOWj#CREATURE:FORGOTTEN_BEAST_478:TALLOWj#CREATURE:FORGOTTEN_BEAST_479:TALLOWj#CREATURE:FORGOTTEN_BEAST_480:TALLOWj#CREATURE:FORGOTTEN_BEAST_481:TALLOWj#CREATURE:FORGOTTEN_BEAST_483:TALLOWj#CREATURE:FORGOTTEN_BEAST_486:TALLOWj#CREATURE:FORGOTTEN_BEAST_487:TALLOWj#CREATURE:FORGOTTEN_BEAST_489:TALLOWj#CREATURE:FORGOTTEN_BEAST_492:TALLOWj#CREATURE:FORGOTTEN_BEAST_494:TALLOWj#CREATURE:FORGOTTEN_BEAST_495:TALLOWj#CREATURE:FORGOTTEN_BEAST_496:TALLOWj#CREATURE:FORGOTTEN_BEAST_497:TALLOWj#CREATURE:FORGOTTEN_BEAST_498:TALLOWj#CREATURE:FORGOTTEN_BEAST_499:TALLOWj#CREATURE:FORGOTTEN_BEAST_501:TALLOWj#CREATURE:FORGOTTEN_BEAST_503:TALLOWj#CREATURE:FORGOTTEN_BEAST_504:TALLOWj#CREATURE:FORGOTTEN_BEAST_505:TALLOWj#CREATURE:FORGOTTEN_BEAST_507:TALLOWj#CREATURE:FORGOTTEN_BEAST_508:TALLOWj#CREATURE:FORGOTTEN_BEAST_510:TALLOWj#CREATURE:FORGOTTEN_BEAST_512:TALLOWj#CREATURE:FORGOTTEN_BEAST_513:TALLOWj#CREATURE:FORGOTTEN_BEAST_514:TALLOWj#CREATURE:FORGOTTEN_BEAST_515:TALLOWj#CREATURE:FORGOTTEN_BEAST_516:TALLOWj#CREATURE:FORGOTTEN_BEAST_517:TALLOWj#CREATURE:FORGOTTEN_BEAST_518:TALLOWj#CREATURE:FORGOTTEN_BEAST_519:TALLOWj#CREATURE:FORGOTTEN_BEAST_520:TALLOWj#CREATURE:FORGOTTEN_BEAST_521:TALLOWj#CREATURE:FORGOTTEN_BEAST_522:TALLOWj#CREATURE:FORGOTTEN_BEAST_523:TALLOWj#CREATURE:FORGOTTEN_BEAST_525:TALLOWj#CREATURE:FORGOTTEN_BEAST_526:TALLOWj#CREATURE:FORGOTTEN_BEAST_527:TALLOWj#CREATURE:FORGOTTEN_BEAST_528:TALLOWj#CREATURE:FORGOTTEN_BEAST_529:TALLOWj#CREATURE:FORGOTTEN_BEAST_530:TALLOWj#CREATURE:FORGOTTEN_BEAST_531:TALLOWj#CREATURE:FORGOTTEN_BEAST_532:TALLOWj#CREATURE:FORGOTTEN_BEAST_533:TALLOWj#CREATURE:FORGOTTEN_BEAST_534:TALLOWj#CREATURE:FORGOTTEN_BEAST_535:TALLOWj#CREATURE:FORGOTTEN_BEAST_536:TALLOWj#CREATURE:FORGOTTEN_BEAST_539:TALLOWj#CREATURE:FORGOTTEN_BEAST_540:TALLOWj#CREATURE:FORGOTTEN_BEAST_541:TALLOWj#CREATURE:FORGOTTEN_BEAST_543:TALLOWj#CREATURE:FORGOTTEN_BEAST_545:TALLOWj#CREATURE:FORGOTTEN_BEAST_546:TALLOWj#CREATURE:FORGOTTEN_BEAST_547:TALLOWj#CREATURE:FORGOTTEN_BEAST_548:TALLOWj#CREATURE:FORGOTTEN_BEAST_549:TALLOWj#CREATURE:FORGOTTEN_BEAST_550:TALLOWj#CREATURE:FORGOTTEN_BEAST_551:TALLOWj#CREATURE:FORGOTTEN_BEAST_554:TALLOWj#CREATURE:FORGOTTEN_BEAST_555:TALLOWj#CREATURE:FORGOTTEN_BEAST_556:TALLOWj#CREATURE:FORGOTTEN_BEAST_557:TALLOWj#CREATURE:FORGOTTEN_BEAST_561:TALLOWj#CREATURE:FORGOTTEN_BEAST_562:TALLOWj#CREATURE:FORGOTTEN_BEAST_564:TALLOWj#CREATURE:FORGOTTEN_BEAST_569:TALLOWj#CREATURE:FORGOTTEN_BEAST_570:TALLOWj#CREATURE:FORGOTTEN_BEAST_571:TALLOWj#CREATURE:FORGOTTEN_BEAST_572:TALLOWj#CREATURE:FORGOTTEN_BEAST_574:TALLOWj#CREATURE:FORGOTTEN_BEAST_576:TALLOWj#CREATURE:FORGOTTEN_BEAST_578:TALLOWj#CREATURE:FORGOTTEN_BEAST_579:TALLOWj#CREATURE:FORGOTTEN_BEAST_580:TALLOWj#CREATURE:FORGOTTEN_BEAST_581:TALLOWj#CREATURE:FORGOTTEN_BEAST_583:TALLOWj#CREATURE:FORGOTTEN_BEAST_584:TALLOWj#CREATURE:FORGOTTEN_BEAST_586:TALLOWj#CREATURE:FORGOTTEN_BEAST_588:TALLOWj#CREATURE:FORGOTTEN_BEAST_589:TALLOWj#CREATURE:FORGOTTEN_BEAST_590:TALLOWj#CREATURE:FORGOTTEN_BEAST_592:TALLOWj#CREATURE:FORGOTTEN_BEAST_593:TALLOWj#CREATURE:FORGOTTEN_BEAST_594:TALLOWj#CREATURE:FORGOTTEN_BEAST_595:TALLOWj#CREATURE:FORGOTTEN_BEAST_596:TALLOWj#CREATURE:FORGOTTEN_BEAST_597:TALLOWj#CREATURE:FORGOTTEN_BEAST_599:TALLOWj#CREATURE:FORGOTTEN_BEAST_600:TALLOWj#CREATURE:FORGOTTEN_BEAST_601:TALLOWj#CREATURE:FORGOTTEN_BEAST_603:TALLOWj#CREATURE:FORGOTTEN_BEAST_605:TALLOWj#CREATURE:FORGOTTEN_BEAST_607:TALLOWj#CREATURE:FORGOTTEN_BEAST_608:TALLOWj#CREATURE:FORGOTTEN_BEAST_609:TALLOWj#CREATURE:FORGOTTEN_BEAST_610:TALLOWj#CREATURE:FORGOTTEN_BEAST_611:TALLOWj#CREATURE:FORGOTTEN_BEAST_612:TALLOWj#CREATURE:FORGOTTEN_BEAST_613:TALLOWj#CREATURE:FORGOTTEN_BEAST_614:TALLOWj#CREATURE:FORGOTTEN_BEAST_616:TALLOWj#CREATURE:FORGOTTEN_BEAST_619:TALLOWj#CREATURE:FORGOTTEN_BEAST_620:TALLOWj#CREATURE:FORGOTTEN_BEAST_621:TALLOWj#CREATURE:FORGOTTEN_BEAST_623:TALLOWj#CREATURE:FORGOTTEN_BEAST_624:TALLOWj#CREATURE:FORGOTTEN_BEAST_625:TALLOWj#CREATURE:FORGOTTEN_BEAST_626:TALLOWj#CREATURE:FORGOTTEN_BEAST_627:TALLOWj#CREATURE:FORGOTTEN_BEAST_628:TALLOWj#CREATURE:FORGOTTEN_BEAST_629:TALLOWj#CREATURE:FORGOTTEN_BEAST_630:TALLOWj#CREATURE:FORGOTTEN_BEAST_631:TALLOWj#CREATURE:FORGOTTEN_BEAST_632:TALLOWj#CREATURE:FORGOTTEN_BEAST_633:TALLOWj#CREATURE:FORGOTTEN_BEAST_634:TALLOWj#CREATURE:FORGOTTEN_BEAST_635:TALLOWj#CREATURE:FORGOTTEN_BEAST_636:TALLOWj#CREATURE:FORGOTTEN_BEAST_637:TALLOWj#CREATURE:FORGOTTEN_BEAST_639:TALLOWj#CREATURE:FORGOTTEN_BEAST_640:TALLOWj#CREATURE:FORGOTTEN_BEAST_643:TALLOWj#CREATURE:FORGOTTEN_BEAST_644:TALLOWj#CREATURE:FORGOTTEN_BEAST_645:TALLOWj#CREATURE:FORGOTTEN_BEAST_646:TALLOWj#CREATURE:FORGOTTEN_BEAST_647:TALLOWj#CREATURE:FORGOTTEN_BEAST_649:TALLOWj#CREATURE:FORGOTTEN_BEAST_650:TALLOWj#CREATURE:FORGOTTEN_BEAST_651:TALLOWj#CREATURE:FORGOTTEN_BEAST_652:TALLOWj#CREATURE:FORGOTTEN_BEAST_656:TALLOWj#CREATURE:FORGOTTEN_BEAST_658:TALLOWj#CREATURE:FORGOTTEN_BEAST_659:TALLOWj#CREATURE:FORGOTTEN_BEAST_661:TALLOWj#CREATURE:FORGOTTEN_BEAST_663:TALLOWj#CREATURE:FORGOTTEN_BEAST_664:TALLOWj#CREATURE:FORGOTTEN_BEAST_666:TALLOWj#CREATURE:FORGOTTEN_BEAST_667:TALLOWj#CREATURE:FORGOTTEN_BEAST_669:TALLOWj#CREATURE:FORGOTTEN_BEAST_670:TALLOWj#CREATURE:FORGOTTEN_BEAST_671:TALLOWj#CREATURE:FORGOTTEN_BEAST_674:TALLOWj#CREATURE:FORGOTTEN_BEAST_675:TALLOWj#CREATURE:FORGOTTEN_BEAST_678:TALLOWj#CREATURE:FORGOTTEN_BEAST_680:TALLOWj#CREATURE:FORGOTTEN_BEAST_681:TALLOWj#CREATURE:FORGOTTEN_BEAST_682:TALLOWj#CREATURE:FORGOTTEN_BEAST_684:TALLOWj#CREATURE:FORGOTTEN_BEAST_685:TALLOWj#CREATURE:FORGOTTEN_BEAST_686:TALLOWj#CREATURE:FORGOTTEN_BEAST_687:TALLOWj#CREATURE:FORGOTTEN_BEAST_688:TALLOWj#CREATURE:FORGOTTEN_BEAST_689:TALLOWj#CREATURE:FORGOTTEN_BEAST_691:TALLOWj#CREATURE:FORGOTTEN_BEAST_692:TALLOWj#CREATURE:FORGOTTEN_BEAST_695:TALLOWj#CREATURE:FORGOTTEN_BEAST_696:TALLOWj#CREATURE:FORGOTTEN_BEAST_697:TALLOWj#CREATURE:FORGOTTEN_BEAST_698:TALLOWj#CREATURE:FORGOTTEN_BEAST_699:TALLOWj#CREATURE:FORGOTTEN_BEAST_700:TALLOWj#CREATURE:FORGOTTEN_BEAST_701:TALLOWj#CREATURE:FORGOTTEN_BEAST_702:TALLOWj#CREATURE:FORGOTTEN_BEAST_704:TALLOWj#CREATURE:FORGOTTEN_BEAST_706:TALLOWj#CREATURE:FORGOTTEN_BEAST_708:TALLOWj#CREATURE:FORGOTTEN_BEAST_709:TALLOWj#CREATURE:FORGOTTEN_BEAST_711:TALLOWj#CREATURE:FORGOTTEN_BEAST_712:TALLOWj#CREATURE:FORGOTTEN_BEAST_713:TALLOWj#CREATURE:FORGOTTEN_BEAST_714:TALLOWj#CREATURE:FORGOTTEN_BEAST_715:TALLOWj#CREATURE:FORGOTTEN_BEAST_717:TALLOWj#CREATURE:FORGOTTEN_BEAST_718:TALLOWj#CREATURE:FORGOTTEN_BEAST_719:TALLOWj#CREATURE:FORGOTTEN_BEAST_720:TALLOWj#CREATURE:FORGOTTEN_BEAST_721:TALLOWj#CREATURE:FORGOTTEN_BEAST_722:TALLOWj#CREATURE:FORGOTTEN_BEAST_723:TALLOWj#CREATURE:FORGOTTEN_BEAST_724:TALLOWj#CREATURE:FORGOTTEN_BEAST_726:TALLOWj#CREATURE:FORGOTTEN_BEAST_730:TALLOWj#CREATURE:FORGOTTEN_BEAST_731:TALLOWj#CREATURE:FORGOTTEN_BEAST_734:TALLOWj#CREATURE:FORGOTTEN_BEAST_735:TALLOWj#CREATURE:FORGOTTEN_BEAST_737:TALLOWj#CREATURE:FORGOTTEN_BEAST_738:TALLOWj#CREATURE:FORGOTTEN_BEAST_739:TALLOWj#CREATURE:FORGOTTEN_BEAST_740:TALLOWj#CREATURE:FORGOTTEN_BEAST_741:TALLOWj#CREATURE:FORGOTTEN_BEAST_742:TALLOWj#CREATURE:FORGOTTEN_BEAST_743:TALLOWj#CREATURE:FORGOTTEN_BEAST_744:TALLOWj#CREATURE:FORGOTTEN_BEAST_746:TALLOWj#CREATURE:FORGOTTEN_BEAST_747:TALLOWj#CREATURE:FORGOTTEN_BEAST_749:TALLOWj#CREATURE:FORGOTTEN_BEAST_750:TALLOWj#CREATURE:FORGOTTEN_BEAST_751:TALLOWj#CREATURE:FORGOTTEN_BEAST_752:TALLOWj#CREATURE:FORGOTTEN_BEAST_753:TALLOWj#CREATURE:FORGOTTEN_BEAST_754:TALLOWj#CREATURE:FORGOTTEN_BEAST_755:TALLOWj#CREATURE:FORGOTTEN_BEAST_756:TALLOWj#CREATURE:FORGOTTEN_BEAST_757:TALLOWj#CREATURE:FORGOTTEN_BEAST_758:TALLOWj#CREATURE:FORGOTTEN_BEAST_759:TALLOWj#CREATURE:FORGOTTEN_BEAST_760:TALLOWj#CREATURE:FORGOTTEN_BEAST_761:TALLOWj#CREATURE:FORGOTTEN_BEAST_762:TALLOWj#CREATURE:FORGOTTEN_BEAST_764:TALLOWj#CREATURE:FORGOTTEN_BEAST_767:TALLOWj#CREATURE:FORGOTTEN_BEAST_768:TALLOWj#CREATURE:FORGOTTEN_BEAST_769:TALLOWj#CREATURE:FORGOTTEN_BEAST_770:TALLOWj#CREATURE:FORGOTTEN_BEAST_773:TALLOWj#CREATURE:FORGOTTEN_BEAST_774:TALLOWj#CREATURE:FORGOTTEN_BEAST_776:TALLOWj#CREATURE:FORGOTTEN_BEAST_777:TALLOWj#CREATURE:FORGOTTEN_BEAST_778:TALLOWj#CREATURE:FORGOTTEN_BEAST_779:TALLOWj#CREATURE:FORGOTTEN_BEAST_780:TALLOWj#CREATURE:FORGOTTEN_BEAST_781:TALLOWj#CREATURE:FORGOTTEN_BEAST_782:TALLOWj#CREATURE:FORGOTTEN_BEAST_783:TALLOWj#CREATURE:FORGOTTEN_BEAST_784:TALLOWj#CREATURE:FORGOTTEN_BEAST_785:TALLOWj#CREATURE:FORGOTTEN_BEAST_786:TALLOWj#CREATURE:FORGOTTEN_BEAST_787:TALLOWj#CREATURE:FORGOTTEN_BEAST_789:TALLOWj#CREATURE:FORGOTTEN_BEAST_792:TALLOWj#CREATURE:FORGOTTEN_BEAST_793:TALLOWj#CREATURE:FORGOTTEN_BEAST_794:TALLOWj#CREATURE:FORGOTTEN_BEAST_795:TALLOWj#CREATURE:FORGOTTEN_BEAST_796:TALLOWj#CREATURE:FORGOTTEN_BEAST_799:TALLOWj#CREATURE:FORGOTTEN_BEAST_800:TALLOWj#CREATURE:FORGOTTEN_BEAST_801:TALLOWj#CREATURE:FORGOTTEN_BEAST_802:TALLOWj#CREATURE:FORGOTTEN_BEAST_803:TALLOWj#CREATURE:FORGOTTEN_BEAST_804:TALLOWj#CREATURE:FORGOTTEN_BEAST_806:TALLOWj#CREATURE:FORGOTTEN_BEAST_807:TALLOWj#CREATURE:FORGOTTEN_BEAST_809:TALLOWj#CREATURE:FORGOTTEN_BEAST_810:TALLOWj#CREATURE:FORGOTTEN_BEAST_811:TALLOWj#CREATURE:FORGOTTEN_BEAST_812:TALLOWj#CREATURE:FORGOTTEN_BEAST_815:TALLOWj#CREATURE:FORGOTTEN_BEAST_817:TALLOWj#CREATURE:FORGOTTEN_BEAST_818:TALLOWj#CREATURE:FORGOTTEN_BEAST_819:TALLOWj#CREATURE:FORGOTTEN_BEAST_820:TALLOWj#CREATURE:FORGOTTEN_BEAST_821:TALLOWj#CREATURE:FORGOTTEN_BEAST_822:TALLOWj#CREATURE:FORGOTTEN_BEAST_824:TALLOWj#CREATURE:FORGOTTEN_BEAST_825:TALLOWj#CREATURE:FORGOTTEN_BEAST_826:TALLOWj#CREATURE:FORGOTTEN_BEAST_827:TALLOWj#CREATURE:FORGOTTEN_BEAST_828:TALLOWj#CREATURE:FORGOTTEN_BEAST_831:TALLOWj#CREATURE:FORGOTTEN_BEAST_833:TALLOWj#CREATURE:FORGOTTEN_BEAST_835:TALLOWj#CREATURE:FORGOTTEN_BEAST_837:TALLOWj#CREATURE:FORGOTTEN_BEAST_838:TALLOWj#CREATURE:FORGOTTEN_BEAST_842:TALLOWj#CREATURE:FORGOTTEN_BEAST_843:TALLOWj#CREATURE:FORGOTTEN_BEAST_844:TALLOWj#CREATURE:FORGOTTEN_BEAST_845:TALLOWj#CREATURE:FORGOTTEN_BEAST_846:TALLOWj#CREATURE:FORGOTTEN_BEAST_847:TALLOWj#CREATURE:FORGOTTEN_BEAST_848:TALLOWj#CREATURE:FORGOTTEN_BEAST_849:TALLOWj#CREATURE:FORGOTTEN_BEAST_851:TALLOWj#CREATURE:FORGOTTEN_BEAST_853:TALLOWj#CREATURE:FORGOTTEN_BEAST_854:TALLOWj#CREATURE:FORGOTTEN_BEAST_855:TALLOWj#CREATURE:FORGOTTEN_BEAST_857:TALLOWj#CREATURE:FORGOTTEN_BEAST_858:TALLOWj#CREATURE:FORGOTTEN_BEAST_859:TALLOWj#CREATURE:FORGOTTEN_BEAST_860:TALLOWj#CREATURE:FORGOTTEN_BEAST_861:TALLOWj#CREATURE:FORGOTTEN_BEAST_862:TALLOWj#CREATURE:FORGOTTEN_BEAST_865:TALLOWj#CREATURE:FORGOTTEN_BEAST_866:TALLOWj#CREATURE:FORGOTTEN_BEAST_867:TALLOWjCREATURE:TITAN_1:TALLOWjCREATURE:TITAN_3:TALLOWjCREATURE:TITAN_4:TALLOWjCREATURE:TITAN_6:TALLOWjCREATURE:TITAN_7:TALLOWjCREATURE:TITAN_8:TALLOWjCREATURE:TITAN_9:TALLOWjCREATURE:TITAN_10:TALLOWjCREATURE:TITAN_11:TALLOWjCREATURE:TITAN_12:TALLOWjCREATURE:TITAN_13:TALLOWjCREATURE:TITAN_14:TALLOWjCREATURE:TITAN_15:TALLOWjCREATURE:TITAN_18:TALLOWjCREATURE:TITAN_19:TALLOWjCREATURE:TITAN_21:TALLOWjCREATURE:TITAN_23:TALLOWjCREATURE:TITAN_24:TALLOWjCREATURE:TITAN_25:TALLOWjCREATURE:TITAN_26:TALLOWjCREATURE:TITAN_27:TALLOWjCREATURE:TITAN_28:TALLOWjCREATURE:TITAN_29:TALLOWjCREATURE:TITAN_30:TALLOWjCREATURE:TITAN_32:TALLOWjCREATURE:TITAN_33:TALLOWjCREATURE:DEMON_7:TALLOWjCREATURE:DEMON_8:TALLOWjCREATURE:DEMON_9:TALLOWjCREATURE:DEMON_10:TALLOWjCREATURE:DEMON_11:TALLOWjCREATURE:DEMON_12:TALLOWjCREATURE:DEMON_13:TALLOWjCREATURE:DEMON_14:TALLOWjCREATURE:DEMON_15:TALLOWjCREATURE:DEMON_16:TALLOWjCREATURE:DEMON_17:TALLOWjCREATURE:DEMON_18:TALLOWjCREATURE:DEMON_19:TALLOWjCREATURE:DEMON_20:TALLOWjCREATURE:DEMON_21:TALLOWjCREATURE:DEMON_22:TALLOWjCREATURE:DEMON_23:TALLOWjCREATURE:DEMON_24:TALLOWjCREATURE:DEMON_25:TALLOWjCREATURE:DEMON_26:TALLOWjCREATURE:DEMON_27:TALLOWjCREATURE:DEMON_28:TALLOWjCREATURE:DEMON_29:TALLOWjCREATURE:DEMON_31:TALLOWjCREATURE:DEMON_32:TALLOWjCREATURE:DEMON_38:TALLOWjCREATURE:DEMON_39:TALLOWjCREATURE:DEMON_40:TALLOWjCREATURE:DEMON_41:TALLOWjCREATURE:DEMON_42:TALLOWjCREATURE:DEMON_43:TALLOWjCREATURE:DEMON_44:TALLOWjCREATURE:DEMON_45:TALLOWjCREATURE:DEMON_47:TALLOWjCREATURE:DEMON_48:TALLOWjCREATURE:DEMON_49:TALLOWjCREATURE:DEMON_52:TALLOWj CREATURE:NIGHT_CREATURE_1:TALLOWj CREATURE:NIGHT_CREATURE_2:TALLOWj CREATURE:NIGHT_CREATURE_3:TALLOWj CREATURE:NIGHT_CREATURE_4:TALLOWj CREATURE:NIGHT_CREATURE_5:TALLOWj CREATURE:NIGHT_CREATURE_6:TALLOWj CREATURE:NIGHT_CREATURE_7:TALLOWj CREATURE:NIGHT_CREATURE_8:TALLOWj CREATURE:NIGHT_CREATURE_9:TALLOWj!CREATURE:NIGHT_CREATURE_10:TALLOWj!CREATURE:NIGHT_CREATURE_11:TALLOWj!CREATURE:NIGHT_CREATURE_12:TALLOWj!CREATURE:NIGHT_CREATURE_13:TALLOWj!CREATURE:NIGHT_CREATURE_14:TALLOWj!CREATURE:NIGHT_CREATURE_15:TALLOWj!CREATURE:NIGHT_CREATURE_16:TALLOWj!CREATURE:NIGHT_CREATURE_17:TALLOWj!CREATURE:NIGHT_CREATURE_18:TALLOWj!CREATURE:NIGHT_CREATURE_19:TALLOWj!CREATURE:NIGHT_CREATURE_20:TALLOWj!CREATURE:NIGHT_CREATURE_21:TALLOWj!CREATURE:NIGHT_CREATURE_22:TALLOWj!CREATURE:NIGHT_CREATURE_23:TALLOWj!CREATURE:NIGHT_CREATURE_24:TALLOWj!CREATURE:NIGHT_CREATURE_25:TALLOWj!CREATURE:NIGHT_CREATURE_26:TALLOWj!CREATURE:NIGHT_CREATURE_27:TALLOWj!CREATURE:NIGHT_CREATURE_28:TALLOWj!CREATURE:NIGHT_CREATURE_29:TALLOWj!CREATURE:NIGHT_CREATURE_30:TALLOWj!CREATURE:NIGHT_CREATURE_31:TALLOWj!CREATURE:NIGHT_CREATURE_32:TALLOWj!CREATURE:NIGHT_CREATURE_33:TALLOWj!CREATURE:NIGHT_CREATURE_34:TALLOWj!CREATURE:NIGHT_CREATURE_35:TALLOWj!CREATURE:NIGHT_CREATURE_36:TALLOWj!CREATURE:NIGHT_CREATURE_37:TALLOWj!CREATURE:NIGHT_CREATURE_38:TALLOWj!CREATURE:NIGHT_CREATURE_39:TALLOWj!CREATURE:NIGHT_CREATURE_40:TALLOWj!CREATURE:NIGHT_CREATURE_41:TALLOWj!CREATURE:NIGHT_CREATURE_42:TALLOWj!CREATURE:NIGHT_CREATURE_43:TALLOWj!CREATURE:NIGHT_CREATURE_44:TALLOWj!CREATURE:NIGHT_CREATURE_45:TALLOWj!CREATURE:NIGHT_CREATURE_46:TALLOWj!CREATURE:NIGHT_CREATURE_47:TALLOWj!CREATURE:NIGHT_CREATURE_48:TALLOWj!CREATURE:NIGHT_CREATURE_49:TALLOWj!CREATURE:NIGHT_CREATURE_50:TALLOWj!CREATURE:NIGHT_CREATURE_51:TALLOWj!CREATURE:NIGHT_CREATURE_52:TALLOWj!CREATURE:NIGHT_CREATURE_53:TALLOWj!CREATURE:NIGHT_CREATURE_54:TALLOWj!CREATURE:NIGHT_CREATURE_55:TALLOWj!CREATURE:NIGHT_CREATURE_56:TALLOWj!CREATURE:NIGHT_CREATURE_57:TALLOWj!CREATURE:NIGHT_CREATURE_58:TALLOWj!CREATURE:NIGHT_CREATURE_59:TALLOWj!CREATURE:NIGHT_CREATURE_60:TALLOWj!CREATURE:NIGHT_CREATURE_61:TALLOWj!CREATURE:NIGHT_CREATURE_62:TALLOWj!CREATURE:NIGHT_CREATURE_63:TALLOWj!CREATURE:NIGHT_CREATURE_64:TALLOWj!CREATURE:NIGHT_CREATURE_65:TALLOWj!CREATURE:NIGHT_CREATURE_66:TALLOWj!CREATURE:NIGHT_CREATURE_67:TALLOWj!CREATURE:NIGHT_CREATURE_68:TALLOWj!CREATURE:NIGHT_CREATURE_69:TALLOWj!CREATURE:NIGHT_CREATURE_70:TALLOWj!CREATURE:NIGHT_CREATURE_71:TALLOWj!CREATURE:NIGHT_CREATURE_72:TALLOWj!CREATURE:NIGHT_CREATURE_73:TALLOWj!CREATURE:NIGHT_CREATURE_74:TALLOWj!CREATURE:NIGHT_CREATURE_75:TALLOWj!CREATURE:NIGHT_CREATURE_76:TALLOWj!CREATURE:NIGHT_CREATURE_77:TALLOWj!CREATURE:NIGHT_CREATURE_78:TALLOWj!CREATURE:NIGHT_CREATURE_79:TALLOWj!CREATURE:NIGHT_CREATURE_80:TALLOWj!CREATURE:NIGHT_CREATURE_81:TALLOWj!CREATURE:NIGHT_CREATURE_82:TALLOWj!CREATURE:NIGHT_CREATURE_83:TALLOWj!CREATURE:NIGHT_CREATURE_84:TALLOWj!CREATURE:NIGHT_CREATURE_85:TALLOWj!CREATURE:NIGHT_CREATURE_86:TALLOWj!CREATURE:NIGHT_CREATURE_87:TALLOWj!CREATURE:NIGHT_CREATURE_88:TALLOWj!CREATURE:NIGHT_CREATURE_89:TALLOWj!CREATURE:NIGHT_CREATURE_90:TALLOWj!CREATURE:NIGHT_CREATURE_91:TALLOWj!CREATURE:NIGHT_CREATURE_92:TALLOWj!CREATURE:NIGHT_CREATURE_93:TALLOWj!CREATURE:NIGHT_CREATURE_94:TALLOWj!CREATURE:NIGHT_CREATURE_95:TALLOWj!CREATURE:NIGHT_CREATURE_96:TALLOWj!CREATURE:NIGHT_CREATURE_97:TALLOWj!CREATURE:NIGHT_CREATURE_98:TALLOWj!CREATURE:NIGHT_CREATURE_99:TALLOWj"CREATURE:NIGHT_CREATURE_100:TALLOWj"CREATURE:NIGHT_CREATURE_101:TALLOWj"CREATURE:NIGHT_CREATURE_102:TALLOWj"CREATURE:NIGHT_CREATURE_103:TALLOWj"CREATURE:NIGHT_CREATURE_104:TALLOWjCREATURE:HF1248 DIVINE_1:TALLOWjCREATURE:HF1248 DIVINE_2:TALLOWjCREATURE:HF1248 DIVINE_3:TALLOWjCREATURE:HF1108 DIVINE_2:TALLOWjCREATURE:HF1249 DIVINE_1:TALLOWjCREATURE:HF1249 DIVINE_3:TALLOWjCREATURE:HF1345 DIVINE_3:TALLOW˜˜ ¨°¸À \ No newline at end of file From febc5299e9b16ff198045096655494b94b4d0398 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 16:51:11 -0700 Subject: [PATCH 106/439] don't mangle dfstock files --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a4068bc44..94bfad310 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,4 +41,4 @@ repos: entry: python3 ci/authors-rst.py files: docs/about/Authors\.rst pass_filenames: false -exclude: '^(depends/|data/.*\.json$|.*\.diff$)' +exclude: '^(depends/|data/.*\.json$|.*\.diff$|.*\.dfstock$)' From 3661cfdcf0aba43e8487337ab21fe49716f7c26f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 16:51:21 -0700 Subject: [PATCH 107/439] update furniture stockpile defs --- data/stockpiles/artifactfurniture.dfstock | Bin 33 -> 12 bytes data/stockpiles/bags.dfstock | Bin 34 -> 206 bytes data/stockpiles/buckets.dfstock | Bin 31 -> 2915 bytes data/stockpiles/masterworkfurniture.dfstock | Bin 34 -> 13 bytes data/stockpiles/pots.dfstock | Bin 33 -> 2921 bytes data/stockpiles/sand.dfstock | Bin 29 -> 211 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/artifactfurniture.dfstock b/data/stockpiles/artifactfurniture.dfstock index 13c32a66ac77a93eba6d0d5ebb57cd5925d932ea..adf198477a5b38c3e2e61096ac3879356b89e8bc 100644 GIT binary patch literal 12 Tcmb2*QsQtdD#=VsOfCTc5iSFL literal 33 pcmb2*QsQtdD#=VsOfH$g$T)+MaRDR43Py$vj0`&%84fTq0056)2p#|c diff --git a/data/stockpiles/bags.dfstock b/data/stockpiles/bags.dfstock index 0e1cc2902e06a52a371eb89831d6d1a822c2642c..6f95e76386fb2c6036a394dc5955984c94782f1c 100644 GIT binary patch literal 206 zcmY++!3u&f7yw`*A!~HmvEz>aTP(4RmWB?ZQw;ru!BF{|kk8mlb!yr1yL`L%Vzb=K zBWG77bNxtEp)?5WU^jFwA=7$n#P(o2bkmn{H4aF& qC&AKJjf1y+XPj7H%+n*aqZ6?tZ(CD)2qVl#_#YvRFdyMJLKr`Ip+j5% literal 34 qcmb2*=Hd+Ybai)i^!4?hz{og*k#PYd!wN=*4U7ys7#R*QG5`R7mZQZ6}z~D!}6-80BZ&wr}ai&O(q>?%>LeM%u03$8D6j=Z5 ze##DIIl7X)M;=|?&vP!7{`>6fFS16gWJu1gt<95pt;vK|XdBApEVD)?vtYYJX`M-C zwIrvLnJ=Z*$(LGED5Xozywa;=MpcHxOjt)cnHNq<(-xY%Pv!!qu0LD|xAuW_e>_{0 zGwCmXfwsfVRfElauLh$De%wP5ZJm&s zFbh@#`7&}3Y+xV~ItD$Nyz|d3(b=#E87-=&H)I6!C1I#6hQK(F+&POzd(wehYE{X- zC7X$`rqH%RTY}^)$SqI>jKvnvWf%jbSG?negW7P34Ix+7MTm*7pbRA7(OkK>cg5U2_<33#=(6yZ$g;8{EC>6~RTghkFqof9N+D<3>eLTsi4j0RkD~ zd%@R{RMRX3HW{vVFw?iN*s_@laY@+5^HFP6bOkc&z7!}CS{N@lp^Tx79H*$T8Auxw zW)uxFI4Wg6O)$P5hb_aVQLJl^NNoAzT@ZYY{wV|ZUpIMc9O--fZBxx{$N3yPlYE9sn4=U@fvgn{7<`o;q zr03WADng8ycqaEkV|VfFDQpoxGE^F2<7L)a*90|QJ{1*4PKho`w_hEs5%tj64HULdEOZ{Z)50V9zDHHOvV|04c_wWDDW!21T1`{N*{+6z9N`*MKV(_U5$oM z99TRTcHbmsi9Bnilds3p zAycmR5@8HLzq-qe)sC)P_FS??Vjp4-e+;i7mUQLu<0i?p_yMcE%p2@NrmXJKX4&Rl z=iBGJf*yNu0(*G^dvyYP&D(T{@%$9{;uQGu6!_{C_=twR&%4dX$NLWtx7)>6)$QMpo88@~?c$tvkN0=C b?;e*=9+%wXa_n*WZX=48SW~1*QtNmxf{}QE1s0pYb%5p% z_jmMBmRBR&J@RQdpYIKo{`>5!ujkh0tq;~wA(M+GPRUiR$%IyD8_MJ&vqmP9V7o(U zok=FOB&U;!FQwMW7g|y%rAscn(u-t5RffYvz@tvC3MZv$3r*f9R|2N4KU@p9@_}@J zyjYPl={L$)SCCQSjdIqc-wkItzmbk3!q)W|!M%ml+{>*pg5SyD^;V|e4t_I-)HvXS zgpXvfs8!K+*>Fr#P^PK4ozzkU2kd&d3#0U>;aJOMkglC8Bh#Nx;Na9;%k;;S51LlI zD0DIBfk`)2mke{cZ$*3BwM=P^&i*eE3S`!ODNrJ`FkWy%8ABO4PElbq zkTxdFC>msNRLcA~!T5R{whWs_v8p{HvE`32BLG!w6E9-UURJC`(=DSew`RX{u3hGyzI+lu)q`?Rt$+{Y`@GS2X8@Rnakfj99bVBsTG`Z%oc1;Ml{l9_tx zYBc=FfyHxS_f2B9cuBBn;X`t|0VSS~0R3V)EOOjzpcmdI212aZc@bm-^Y{-q9=4BS z^7U9cWXjcEB8&m(S9h7Q+R?IQ&n0Ul_95o*$M70rNmm{}ZjwxkAF$fXyumJH%IY3% zmTlg3zJ1Os=&=`Pu$O1BS7)%-yiJD~&(DD`&Vet_fv?Viucw!G`~LoMz5P7BT5cX5 z#CCnR+q|D%&+i{M51$XmOaJNPW_$l(JH3+syxV---G6voKTN-@)_?Cd+q+K>(@Wa! e?(f#`cC#msGwyLV_Bea;IO85?gU8vE$NvDd5*)Yy literal 33 pcmb2*;^Of2^mBD~3<{aR$T)+MaRDR43Py$vj0`&%84fTq004IT2P*&o diff --git a/data/stockpiles/sand.dfstock b/data/stockpiles/sand.dfstock index a934bcb440d029c04c8b28954f7335a39bc375c4..87b2fe9ce693bc680fd9f1d8fbba9c332542d627 100644 GIT binary patch literal 211 zcmY++!3u&f7yw`bp_O#mvEz>aTP#}{tr;qWCmA|nFjW2~ Date: Mon, 20 Mar 2023 16:51:46 -0700 Subject: [PATCH 108/439] spacing --- plugins/stockpiles/StockpileSerializer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 0cdfad13f..32546053d 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1705,6 +1705,7 @@ bool StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furni furniture->add_type(f_type); DEBUG(log).print("furniture_type %zd is %s\n", i, f_type.c_str()); } + all = serialize_list_material( furniture_mat_is_allowed, [&](const std::string& token) { furniture->add_mats(token); }, From 1a8f6fafffe41e068593cbab116fb099613cc1b0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:00:44 -0700 Subject: [PATCH 109/439] update refuse stockpile defs --- data/stockpiles/rawhides.dfstock | Bin 730 -> 6 bytes data/stockpiles/tannedhides.dfstock | Bin 741 -> 19 bytes data/stockpiles/usablehair.dfstock | Bin 759 -> 46 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/rawhides.dfstock b/data/stockpiles/rawhides.dfstock index b58c77edecc3fd043a6cd9e855cbe5308d164ccd..eedc71760dd3298bf49d84d89c85247544c5ad73 100644 GIT binary patch literal 6 NcmdO531Ez10009C0N4Nk literal 730 zcmXw1F_POb47A3QY{R+C6 z{o7HytB%x;s)=rsLojm@Iu9~ZXBM{UxdrMb$9biG*1<_3vLTnWc?pHiMZZ$N+c4@* zt>IayA2=m(*f+D*bPm?DD~Tg@h0%g~qtj#q^|^4_5bwfK0mR9JO_vvyjMv4A1I0z0 z2fEXD+@1&hz``>Yw4g@``h=0_*(R}B>0%hqfWJ<5-V%<~v)?NJOEwaVBx>1vg~+6P zpcXkZT?FLo;X0s=)b#T#9?ZhKb#zJM8S<(1!iCz&=A|O!K00L_5$etO&;Gl0uNeOZ!l9lBG5UC~kzBg!&(KuxTQ`nS!ZKfM?(95+`Y zCnUTK?3~2_p5ZN9ndKqu%l{Wh(tW8Ax9Y+(@mh~YJxm#)c%^&PeUx-~n++UVM6y6( z{Ump10X{yTTBDHI!j1t#Y?LF5DHitK7cOQw419u#bE@B|d)p)hx_RqdE?RBK(OFES zH)%sUeFl+7{V_;D+!j?wZFW4+S>~DAL3OR4LNL`Hz91_$AI-O>`Q9`?n$yqb^s71j JZccxi(?5GUsjL71 diff --git a/data/stockpiles/tannedhides.dfstock b/data/stockpiles/tannedhides.dfstock index 226bd0ec29b204e8be8e885e87ec364115542e1b..9c58d41ce6b004c24dbb6c5b0273903845ed2d0c 100644 GIT binary patch literal 19 acmdNA3Id}XUF+Y!=j^;LS#cOY4Z{aor->?VYgw@ zojSvd&@ggJ;&5-~Uc)(9&#okn)E7nx8jQ}f4K(D!WrMv7M@1t}9%%Z!s$_UqD-IA> zaUR{BzTx*Y>N^fzaG(S|Qcx#MM9(sb&7IDM;YRz*Y?m$JNdx<>;y-62u}Gqhy;qP- zx(DhIv(Q-pzCJD^%18}AE#iSJyje%*B%VQ^Ixk$Pn{8fehrAw%cN*R#d4M`au( z%G5{47}PD_Z8!ikV7wn5f5(ExWu>94Nw^N(Da^iTsU0KIGH`%Rtc-@&&7wZN7%m() zS0X0_yo~Ie#Q>h>HCtKaLG06i4=Cxr))v>Q!ZYwvpGG}InZWo?x2XFh>F_oiD71=X z0mHf^H)qj&db&EJpx8l<5kzd1Ba0~(^4(T0W<3maf{071>(sw)k^)`5buJgJGUVti zCNh|`A)Gz}$Rqz4CBW{As-rGD9_b{@Lfxo(uS+4A>Hu93_4zv5G#%L55S#brTibqb T+aGQ7vu%F0&F{AP(>DJA0E(=L diff --git a/data/stockpiles/usablehair.dfstock b/data/stockpiles/usablehair.dfstock index 97528d893bbc238bd0a2fbfd51ed4c0d3eb941da..2082d7dcf6783b380b96d1d586d9dd562afec6b2 100644 GIT binary patch literal 46 zcmdPW|1&Nqi(<|1?$Wuo3JY}0cK)ZZNEI}NjrP709?xun%gD0C?Lm4?lR zNjK^Y&qBkU_HB%I8t92Eod-$yV*cPE?ic`n{ZSBaq?i(=S3ysb+O_= zaS`W%?(`kEhfzPU@Qej5=uv_`VIq3ANo?+PG>m7!pKf+u6OJ^nUn~D(HWG^@>ezdQ z$fR4K4mmR&1?21DG@^~v^usJ3%)+~MbWGwI@~QK}g}R%~OGU`bo_M3-U6Kc>LquJl zMW#%Bbc{h=^4*3VGy}%_>2bHu04@s+Wl6$y=uQ##MN37DD9hjhHL)rh-d2nL^kTSh zTwRHrknl3Ha~1=5hUaW$mWQw}|6d?Ux1~ays|(M>Q#~5>FlB<`J6)n~lce3-Y~au$ zk_8IuC%HHa@ag%~8HL0Sc8m~WqwHBsv9Ry5a52kn;1f)oQ~gf;+bSv0*<0sw(P~4E z&SD~iNh{LnGl)Fu_fZ1kuBbZdvg45sGSAeFs`vUS1XCU03$m_{FkXA-*zQHow~Dcia4Fn}3Fku+IPh From e4ab868dd53980a32594964007b4acac7c85a92d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:02:36 -0700 Subject: [PATCH 110/439] remove unrepresentable refuse stockpile defs --- data/stockpiles/bones.dfstock | 157 ------------ data/stockpiles/corpses.dfstock | 157 ------------ data/stockpiles/craftrefuse.dfstock | 364 ---------------------------- data/stockpiles/hair.dfstock | 157 ------------ data/stockpiles/horns.dfstock | Bin 730 -> 0 bytes data/stockpiles/shells.dfstock | 157 ------------ data/stockpiles/skulls.dfstock | 157 ------------ data/stockpiles/teeth.dfstock | 157 ------------ 8 files changed, 1306 deletions(-) delete mode 100644 data/stockpiles/bones.dfstock delete mode 100644 data/stockpiles/corpses.dfstock delete mode 100644 data/stockpiles/craftrefuse.dfstock delete mode 100644 data/stockpiles/hair.dfstock delete mode 100644 data/stockpiles/horns.dfstock delete mode 100644 data/stockpiles/shells.dfstock delete mode 100644 data/stockpiles/skulls.dfstock delete mode 100644 data/stockpiles/teeth.dfstock diff --git a/data/stockpiles/bones.dfstock b/data/stockpiles/bones.dfstock deleted file mode 100644 index aeb2cdcf8..000000000 --- a/data/stockpiles/bones.dfstock +++ /dev/null @@ -1,157 +0,0 @@ -*ÆW -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCH2TOAD2TOAD_MAN2 -GIANT_TOAD2WORM2WORM_MAN2 BIRD_BLUEJAY2 BLUEJAY_MAN2 GIANT_BLUEJAY2 BIRD_CARDINAL2 CARDINAL_MAN2GIANT_CARDINAL2 BIRD_GRACKLE2 GRACKLE_MAN2 GIANT_GRACKLE2 BIRD_ORIOLE2 -ORIOLE_MAN2 GIANT_ORIOLE2BIRD_RW_BLACKBIRD2RW_BLACKBIRD_MAN2GIANT_RW_BLACKBIRD2 BIRD_PENGUIN2BIRD_PENGUIN_LITTLE2BIRD_PENGUIN_EMPEROR2 PENGUIN MAN2BIRD_PENGUIN_GIANT2BIRD_FALCON_PEREGRINE2PEREGRINE FALCON MAN2GIANT PEREGRINE FALCON2 BIRD_KIWI2KIWI MAN2BIRD_KIWI_GIANT2 BIRD_OSTRICH2 OSTRICH MAN2BIRD_OSTRICH_GIANT2 BIRD_CROW2CROW_MAN2 -GIANT_CROW2 -BIRD_RAVEN2 RAVEN_MAN2 GIANT_RAVEN2BIRD_CASSOWARY2 CASSOWARY_MAN2GIANT_CASSOWARY2BIRD_KEA2KEA_MAN2 GIANT_KEA2BIRD_OWL_SNOWY2 SNOWY_OWL_MAN2GIANT_SNOWY_OWL2SPARROW2 SPARROW_MAN2 GIANT_SPARROW2BIRD_STORK_WHITE2WHITE_STORK_MAN2GIANT_WHITE_STORK2 BIRD_LOON2LOON_MAN2 -GIANT_LOON2 BIRD_OWL_BARN2 BARN_OWL_MAN2GIANT_BARN_OWL2 BIRD_PARAKEET2 PARAKEET_MAN2GIANT_PARAKEET2 BIRD_KAKAPO2 -KAKAPO_MAN2 GIANT_KAKAPO2BIRD_PARROT_GREY2GREY_PARROT_MAN2GIANT_GREY_PARROT2 BIRD_PUFFIN2 -PUFFIN_MAN2 GIANT_PUFFIN2 BIRD_SWAN2SWAN_MAN2 -GIANT_SWAN2 BIRD_LORIKEET2 LORIKEET_MAN2GIANT_LORIKEET2 BIRD_WREN2WREN_MAN2 -GIANT_WREN2 BIRD_OSPREY2 -OSPREY_MAN2 GIANT_OSPREY2BIRD_EMU2EMU_MAN2 GIANT_EMU2BIRD_COCKATIEL2 COCKATIEL_MAN2GIANT_COCKATIEL2BIRD_LOVEBIRD_PEACH-FACED2PEACH-FACED_LOVEBIRD_MAN2GIANT_PEACH-FACED_LOVEBIRD2 BIRD_MAGPIE2 -MAGPIE_MAN2 GIANT_MAGPIE2 BIRD_KESTREL2 KESTREL_MAN2 GIANT_KESTREL2BIRD_ALBATROSS2 ALBATROSS_MAN2GIANT_ALBATROSS2BIRD_OWL_GREAT_HORNED2GREAT_HORNED_OWL_MAN2GIANT_GREAT_HORNED_OWL2 -BIRD_EAGLE2 EAGLE_MAN2 GIANT_EAGLE2 BIRD_HORNBILL2 HORNBILL_MAN2GIANT_HORNBILL2BIRD_LOVEBIRD_MASKED2MASKED_LOVEBIRD_MAN2GIANT_MASKED_LOVEBIRD2 BIRD_BUSHTIT2 BUSHTIT_MAN2 GIANT_BUSHTIT2 DAMSELFLY2 DAMSELFLY_MAN2GIANT_DAMSELFLY2MOTH2MOTH_MAN2 -GIANT_MOTH2 GRASSHOPPER2GRASSHOPPER_MAN2GIANT_GRASSHOPPER2 BARK_SCORPION2BARK_SCORPION_MAN2GIANT_BARK_SCORPION2MANTIS2 -MANTIS_MAN2 GIANT_MANTIS2TICK2TICK_MAN2 -GIANT_TICK2LOUSE2 LOUSE_MAN2 GIANT_LOUSE2THRIPS2 -THRIPS_MAN2 GIANT_THRIPS2SLUG2SLUG_MAN2 -GIANT_SLUG2MOSQUITO2 MOSQUITO_MAN2GIANT_MOSQUITO2SPIDER_JUMPING2JUMPING_SPIDER_MAN2GIANT_JUMPING_SPIDER2TERMITE2 -MOON_SNAIL2MOON_SNAIL_MAN2GIANT_MOON_SNAIL2SPIDER_BROWN_RECLUSE2BROWN_RECLUSE_SPIDER_MAN2GIANT_BROWN_RECLUSE_SPIDER2SNAIL2 SNAIL_MAN2 GIANT_SNAIL2 GECKO_LEOPARD2LEOPARD_GECKO_MAN2GIANT_LEOPARD_GECKO2DESERT TORTOISE2DESERT_TORTOISE_MAN2GIANT_DESERT_TORTOISE2 GILA_MONSTER2GILA_MONSTER_MAN2GIANT_GILA_MONSTER2DOG2CAT2MULE2DONKEY2HORSE2COW2SHEEP2PIG2GOAT2 BIRD_CHICKEN2CAVY2 BIRD_DUCK2 WATER_BUFFALO2REINDEER2 -BIRD_GOOSE2YAK2LLAMA2ALPACA2BIRD_GUINEAFOWL2BIRD_PEAFOWL_BLUE2 BIRD_TURKEY2RABBIT2CHIMERA2CENTAUR2GRIFFON2FLY2FLY_MAN2 GIANT_FLY2 ROACH_LARGE2 ROACH_MAN2 GIANT_ROACH2BEETLE2 -BEETLE_MAN2 GIANT_BEETLE2ANT2BUTTERFLY_MONARCH2BUTTERFLY_MONARCH_MAN2GIANT_BUTTERFLY_MONARCH2FIREFLY2 FIREFLY_MAN2 GIANT_FIREFLY2 DRAGONFLY2 DRAGONFLY_MAN2GIANT_DRAGONFLY2 HONEY_BEE2 BUMBLEBEE2 GOAT_MOUNTAIN2GOAT_MOUNTAIN_MAN2GIANT_GOAT_MOUNTAIN2 MARMOT_HOARY2MARMOT_HOARY_MAN2GIANT_MARMOT_HOARY2GNOME_MOUNTAIN2 -GNOME_DARK2WALRUS2 -WALRUS_MAN2 GIANT_WALRUS2FISH_LAMPREY_SEA2SHARK_GREAT_WHITE2 SHARK_FRILL2SHARK_SPINY_DOGFISH2SHARK_WOBBEGONG_SPOTTED2 SHARK_WHALE2 SHARK_BASKING2 SHARK_NURSE2SHARK_MAKO_SHORTFIN2SHARK_MAKO_LONGFIN2 SHARK_TIGER2 -SHARK_BULL2SHARK_REEF_BLACKTIP2SHARK_REEF_WHITETIP2 -SHARK_BLUE2SHARK_HAMMERHEAD2 SHARK_ANGEL2FISH_SKATE_COMMON2FISH_RAY_MANTA2 FISH_STINGRAY2FISH_COELACANTH2 FISH_STURGEON2FISH_CONGER_EEL2 FISH_MILKFISH2FISH_COD2 FISH_OPAH2FISH_GROUPER_GIANT2 FISH_BLUEFISH2FISH_SUNFISH_OCEAN2FISH_SWORDFISH2 FISH_MARLIN2 FISH_HALIBUT2FISH_BARRACUDA_GREAT2FISH_TUNA_BLUEFIN2NARWHAL2 NARWHAL MAN2NARWHAL, GIANT2HIPPO2 HIPPO_MAN2 GIANT_HIPPO2FISH_GAR_LONGNOSE2 FISH_CARP2FISH_TIGERFISH2 FISH_PIKE2PLATYPUS2 PLATYPUS MAN2PLATYPUS, GIANT2 BEAR_GRIZZLY2BEAR_GRIZZLY_MAN2GIANT_BEAR_GRIZZLY2 -BEAR_BLACK2BEAR_BLACK_MAN2GIANT_BEAR_BLACK2DEER2DEER_MAN2 -GIANT_DEER2FOX2FOX_MAN2 GIANT_FOX2RACCOON2 RACCOON_MAN2 GIANT_RACCOON2MACAQUE_RHESUS2MACAQUE_RHESUS_MAN2GIANT_MACAQUE_RHESUS2COUGAR2 -COUGAR_MAN2 GIANT_COUGAR2WOLF2WOLF_MAN2 -GIANT_WOLF2 GROUNDHOG2 GROUNDHOG_MAN2GIANT_GROUNDHOG2 ALLIGATOR2 ALLIGATOR_MAN2GIANT_ALLIGATOR2 BIRD_BUZZARD2 BUZZARD_MAN2 GIANT_BUZZARD2PANDA2PANDA, GIGANTIC2 PANDA MAN2CAPYBARA2CAPYBARA, GIANT2 CAPYBARA MAN2BADGER2 -BADGER MAN2 BADGER, GIANT2MOOSE2 MOOSE MAN2 MOOSE, GIANT2 RED PANDA2 RED PANDA MAN2RED PANDA, GIANT2ELEPHANT2 ELEPHANT_MAN2GIANT_ELEPHANT2WARTHOG2 WARTHOG_MAN2 GIANT_WARTHOG2LION2LION_MAN2 -GIANT_LION2LEOPARD2 LEOPARD_MAN2 GIANT_LEOPARD2JAGUAR2 -JAGUAR_MAN2 GIANT_JAGUAR2TIGER2 TIGER_MAN2 GIANT_TIGER2CHEETAH2 CHEETAH_MAN2 GIANT_CHEETAH2GAZELLE2 GAZELLE_MAN2 GIANT_GAZELLE2MANDRILL2 MANDRILL_MAN2GIANT_MANDRILL2 -CHIMPANZEE2BONOBO2GORILLA2 ORANGUTAN2GIBBON_SIAMANG2GIBBON_WHITE_HANDED2GIBBON_BLACK_HANDED2 GIBBON_GRAY2GIBBON_SILVERY2GIBBON_PILEATED2 GIBBON_BILOU2GIBBON_WHITE_BROWED2GIBBON_BLACK_CRESTED2 CAMEL_1_HUMP2CAMEL_1_HUMP_MAN2GIANT_CAMEL_1_HUMP2 CAMEL_2_HUMP2CAMEL_2_HUMP_MAN2GIANT_CAMEL_2_HUMP2CROCODILE_SALTWATER2CROCODILE_SALTWATER_MAN2GIANT_CROCODILE_SALTWATER2 BIRD_VULTURE2 VULTURE_MAN2 GIANT_VULTURE2 -RHINOCEROS2RHINOCEROS_MAN2GIANT_RHINOCEROS2GIRAFFE2 GIRAFFE_MAN2 GIANT_GIRAFFE2 HONEY BADGER2HONEY BADGER MAN2HONEY BADGER, GIANT2GIANT TORTOISE2GIANT TORTOISE MAN2GIGANTIC TORTOISE2 ARMADILLO2 ARMADILLO MAN2ARMADILLO, GIANT2MUSKOX2 -MUSKOX_MAN2 GIANT_MUSKOX2ELK2ELK_MAN2 GIANT_ELK2 -BEAR_POLAR2BEAR_POLAR_MAN2GIANT_BEAR_POLAR2 WOLVERINE2 WOLVERINE_MAN2GIANT_WOLVERINE2 -CHINCHILLA2CHINCHILLA_MAN2GIANT_CHINCHILLA2 FLOATING_GUTS2DRUNIAN2 CREEPING_EYE2VORACIOUS_CAVE_CRAWLER2BLIND_CAVE_OGRE2 -CAP_HOPPER2 -MAGMA_CRAB2CRUNDLE2 HUNGRY_HEAD2 -FLESH_BALL2ELK_BIRD2 HELMET_SNAKE2GREEN_DEVOURER2RUTHERER2CREEPY_CRAWLER2DRALTHA2GIANT_EARTHWORM2 BLOOD_MAN2BUGBAT2MANERA2 -MOLEMARIAN2JABBERER2 POND_GRABBER2BLIND_CAVE_BEAR2 CAVE_DRAGON2REACHER2ELEMENTMAN_GABBRO2GORLAK2 CAVE_FLOATER2PLUMP_HELMET_MAN2 CAVE_BLOB2ELEMENTMAN_AMETHYST2OCTOPUS2 OCTOPUS_MAN2 GIANT_OCTOPUS2CRAB2CRAB_MAN2 -GIANT_CRAB2 LEOPARD_SEAL2LEOPARD_SEAL_MAN2GIANT_LEOPARD_SEAL2 -CUTTLEFISH2CUTTLEFISH_MAN2GIANT_CUTTLEFISH2ORCA2ORCA_MAN2 -GIANT_ORCA2SPONGE2 -SPONGE_MAN2 GIANT_SPONGE2HORSESHOE_CRAB2HORSESHOE_CRAB_MAN2GIANT_HORSESHOE_CRAB2 SPERM_WHALE2SPERM_WHALE_MAN2GIANT_SPERM_WHALE2 ELEPHANT_SEAL2ELEPHANT_SEAL_MAN2GIANT_ELEPHANT_SEAL2 HARP_SEAL2 HARP_SEAL_MAN2GIANT_HARP_SEAL2NAUTILUS2 NAUTILUS_MAN2GIANT_NAUTILUS2 FOXSQUIRREL2 MOGHOPPER2 RAT_DEMON2WAMBLER_FLUFFY2LIZARD_RHINO_TWO_LEGGED2 WORM_KNUCKLE2SPIDER_PHANTOM2 FLY_ACORN2 -GNAT_BLOOD2LIZARD2 -LIZARD_MAN2 GIANT_LIZARD2SKINK2 SKINK_MAN2 GIANT_SKINK2 CHAMELEON2 CHAMELEON_MAN2GIANT_CHAMELEON2ANOLE2 ANOLE_MAN2 GIANT_ANOLE2IGUANA2 -IGUANA_MAN2 GIANT_IGUANA2 RIVER OTTER2 SEA OTTER2 OTTER_MAN2 GIANT_OTTER2SNAPPING TURTLE2ALLIGATOR SNAPPING TURTLE2SNAPPING_TURTLE_MAN2GIANT_SNAPPING_TURTLE2BEAVER2 -BEAVER_MAN2 GIANT_BEAVER2LEECH2 LEECH_MAN2 GIANT_LEECH2AXOLOTL2 AXOLOTL_MAN2 GIANT_AXOLOTL2MINK2MINK_MAN2 -GIANT_MINK2 POND_TURTLE2POND_TURTLE_MAN2GIANT_POND_TURTLE2RAT2RAT_MAN2 SQUIRREL_GRAY2SQUIRREL_GRAY_MAN2GIANT_SQUIRREL_GRAY2 SQUIRREL_RED2SQUIRREL_RED_MAN2GIANT_SQUIRREL_RED2CHIPMUNK2 CHIPMUNK_MAN2GIANT_CHIPMUNK2HAMSTER2 HAMSTER_MAN2 GIANT_HAMSTER2HEDGEHOG2 HEDGEHOG_MAN2GIANT_HEDGEHOG2SQUIRREL_FLYING2FLYING_SQUIRREL_MAN2GIANT_FLYING_SQUIRREL2MUSSEL2OYSTER2 FISH_SALMON2FISH_CLOWNFISH2 FISH_HAGFISH2FISH_LAMPREY_BROOK2 FISH_RAY_BAT2FISH_RAY_THORNBACK2FISH_RATFISH_SPOTTED2 FISH_HERRING2 FISH_SHAD2 FISH_ANCHOVY2FISH_TROUT_STEELHEAD2 FISH_HAKE2 FISH_SEAHORSE2 FISH_GLASSEYE2FISH_PUFFER_WHITE_SPOTTED2 FISH_SOLE2 FISH_FLOUNDER2 FISH_MACKEREL2JELLYFISH_SEA_NETTLE2SQUID2 SQUID MAN2GIGANTIC SQUID2 FISH_LUNGFISH2FISH_LOACH_CLOWN2FISH_BULLHEAD_BROWN2FISH_BULLHEAD_YELLOW2FISH_BULLHEAD_BLACK2FISH_KNIFEFISH_BANDED2 FISH_CHAR2FISH_TROUT_RAINBOW2FISH_MOLLY_SAILFIN2 -FISH_GUPPY2 -FISH_PERCH2DWARF2HUMAN2ELF2GOBLIN2KOBOLD2GREMLIN2TROLL2OGRE2UNICORN2DRAGON2SATYR2COLOSSUS_BRONZE2GIANT2CYCLOPS2ETTIN2MINOTAUR2YETI2 SASQUATCH2 BLIZZARD_MAN2WOLF_ICE2FAIRY2PIXIE2BEAK_DOG2 GRIMELING2 BLENDEC_FOUL2 STRANGLER2 NIGHTWING2HARPY2HYDRA2 MERPERSON2 SEA_SERPENT2 SEA_MONSTER2BIRD_ROC2CROCODILE_CAVE2TOAD_GIANT_CAVE2 OLM_GIANT2 BAT_GIANT2 RAT_GIANT2 RAT_LARGE2MOLE_DOG_NAKED2 -TROGLODYTE2 -MOLE_GIANT2IMP_FIRE2SPIDER_CAVE_GIANT2 SPIDER_CAVE2 FISH_CAVE2 CAVE_FISH_MAN2 LOBSTER_CAVE2 -SNAKE_FIRE2OLM2OLM_MAN2BAT2BAT_MAN2MAGGOT_PURRING2ELEMENTMAN_FIRE2ELEMENTMAN_MAGMA2ELEMENTMAN_IRON2ELEMENTMAN_MUD2BIRD_SWALLOW_CAVE2CAVE_SWALLOW_MAN2BIRD_SWALLOW_CAVE_GIANT2 AMPHIBIAN_MAN2 REPTILE_MAN2 SERPENT_MAN2ANT_MAN2 -RODENT MAN2 WILD_BOAR2 WILD_BOAR_MAN2GIANT_WILD_BOAR2COYOTE2 -COYOTE_MAN2 GIANT_COYOTE2KANGAROO2 KANGAROO_MAN2GIANT_KANGAROO2KOALA2 KOALA_MAN2 GIANT_KOALA2ADDER2 ADDER_MAN2 GIANT_ADDER2ECHIDNA2 ECHIDNA_MAN2 GIANT_ECHIDNA2 PORCUPINE2 PORCUPINE_MAN2GIANT_PORCUPINE2 KINGSNAKE2 KINGSNAKE_MAN2GIANT_KINGSNAKE2 GRAY_LANGUR2GRAY_LANGUR_MAN2GIANT_GRAY_LANGUR2BOBCAT2 -BOBCAT_MAN2 GIANT_BOBCAT2SKUNK2 SKUNK_MAN2 GIANT_SKUNK2GREEN_TREE_FROG2GREEN_TREE_FROG_MAN2GIANT_GREEN_TREE_FROG2HARE2HARE_MAN2 -GIANT_HARE2 RATTLESNAKE2RATTLESNAKE_MAN2GIANT_RATTLESNAKE2WEASEL2 -WEASEL_MAN2 GIANT_WEASEL2COPPERHEAD_SNAKE2COPPERHEAD_SNAKE_MAN2GIANT_COPPERHEAD_SNAKE2IBEX2IBEX_MAN2 -GIANT_IBEX2WOMBAT2 -WOMBAT_MAN2 GIANT_WOMBAT2DINGO2 DINGO_MAN2 GIANT_DINGO2COATI2 COATI_MAN2 GIANT_COATI2OPOSSUM2 OPOSSUM_MAN2 GIANT_OPOSSUM2MONGOOSE2 MONGOOSE_MAN2GIANT_MONGOOSE2HYENA2 HYENA_MAN2 GIANT_HYENA2ANACONDA2 ANACONDA_MAN2GIANT_ANACONDA2MONITOR_LIZARD2MONITOR_LIZARD_MAN2GIANT_MONITOR_LIZARD2 -KING_COBRA2KING_COBRA_MAN2GIANT_KING_COBRA2OCELOT2 -OCELOT_MAN2 GIANT_OCELOT2JACKAL2 -JACKAL_MAN2 GIANT_JACKAL2CAPUCHIN2 CAPUCHIN_MAN2GIANT_CAPUCHIN2SLOTH2 SLOTH_MAN2 GIANT_SLOTH2 SPIDER_MONKEY2SPIDER_MONKEY_MAN2GIANT_SPIDER_MONKEY2PANGOLIN2 PANGOLIN_MAN2GIANT_PANGOLIN2 BLACK_MAMBA2BLACK_MAMBA_MAN2GIANT_BLACK_MAMBA2 -BEAR_SLOTH2SLOTH_BEAR_MAN2GIANT_SLOTH_BEAR2AYE-AYE2 AYE-AYE_MAN2 GIANT_AYE-AYE2 -BUSHMASTER2BUSHMASTER_MAN2GIANT_BUSHMASTER2PYTHON2 -PYTHON_MAN2 GIANT_PYTHON2TAPIR2 TAPIR_MAN2 GIANT_TAPIR2IMPALA2 -IMPALA_MAN2 GIANT_IMPALA2AARDVARK2 AARDVARK_MAN2GIANT_AARDVARK2 LION_TAMARIN2LION_TAMARIN_MAN2GIANT_LION_TAMARIN2STOAT2 STOAT_MAN2 GIANT_STOAT2LYNX2LYNX_MAN2 -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/corpses.dfstock b/data/stockpiles/corpses.dfstock deleted file mode 100644 index dbaa101c1..000000000 --- a/data/stockpiles/corpses.dfstock +++ /dev/null @@ -1,157 +0,0 @@ -*ÆW -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCHTOADTOAD_MAN -GIANT_TOADWORMWORM_MAN BIRD_BLUEJAY BLUEJAY_MAN GIANT_BLUEJAY BIRD_CARDINAL CARDINAL_MANGIANT_CARDINAL BIRD_GRACKLE GRACKLE_MAN GIANT_GRACKLE BIRD_ORIOLE -ORIOLE_MAN GIANT_ORIOLEBIRD_RW_BLACKBIRDRW_BLACKBIRD_MANGIANT_RW_BLACKBIRD BIRD_PENGUINBIRD_PENGUIN_LITTLEBIRD_PENGUIN_EMPEROR PENGUIN MANBIRD_PENGUIN_GIANTBIRD_FALCON_PEREGRINEPEREGRINE FALCON MANGIANT PEREGRINE FALCON BIRD_KIWIKIWI MANBIRD_KIWI_GIANT BIRD_OSTRICH OSTRICH MANBIRD_OSTRICH_GIANT BIRD_CROWCROW_MAN -GIANT_CROW -BIRD_RAVEN RAVEN_MAN GIANT_RAVENBIRD_CASSOWARY CASSOWARY_MANGIANT_CASSOWARYBIRD_KEAKEA_MAN GIANT_KEABIRD_OWL_SNOWY SNOWY_OWL_MANGIANT_SNOWY_OWLSPARROW SPARROW_MAN GIANT_SPARROWBIRD_STORK_WHITEWHITE_STORK_MANGIANT_WHITE_STORK BIRD_LOONLOON_MAN -GIANT_LOON BIRD_OWL_BARN BARN_OWL_MANGIANT_BARN_OWL BIRD_PARAKEET PARAKEET_MANGIANT_PARAKEET BIRD_KAKAPO -KAKAPO_MAN GIANT_KAKAPOBIRD_PARROT_GREYGREY_PARROT_MANGIANT_GREY_PARROT BIRD_PUFFIN -PUFFIN_MAN GIANT_PUFFIN BIRD_SWANSWAN_MAN -GIANT_SWAN BIRD_LORIKEET LORIKEET_MANGIANT_LORIKEET BIRD_WRENWREN_MAN -GIANT_WREN BIRD_OSPREY -OSPREY_MAN GIANT_OSPREYBIRD_EMUEMU_MAN GIANT_EMUBIRD_COCKATIEL COCKATIEL_MANGIANT_COCKATIELBIRD_LOVEBIRD_PEACH-FACEDPEACH-FACED_LOVEBIRD_MANGIANT_PEACH-FACED_LOVEBIRD BIRD_MAGPIE -MAGPIE_MAN GIANT_MAGPIE BIRD_KESTREL KESTREL_MAN GIANT_KESTRELBIRD_ALBATROSS ALBATROSS_MANGIANT_ALBATROSSBIRD_OWL_GREAT_HORNEDGREAT_HORNED_OWL_MANGIANT_GREAT_HORNED_OWL -BIRD_EAGLE EAGLE_MAN GIANT_EAGLE BIRD_HORNBILL HORNBILL_MANGIANT_HORNBILLBIRD_LOVEBIRD_MASKEDMASKED_LOVEBIRD_MANGIANT_MASKED_LOVEBIRD BIRD_BUSHTIT BUSHTIT_MAN GIANT_BUSHTIT DAMSELFLY DAMSELFLY_MANGIANT_DAMSELFLYMOTHMOTH_MAN -GIANT_MOTH GRASSHOPPERGRASSHOPPER_MANGIANT_GRASSHOPPER BARK_SCORPIONBARK_SCORPION_MANGIANT_BARK_SCORPIONMANTIS -MANTIS_MAN GIANT_MANTISTICKTICK_MAN -GIANT_TICKLOUSE LOUSE_MAN GIANT_LOUSETHRIPS -THRIPS_MAN GIANT_THRIPSSLUGSLUG_MAN -GIANT_SLUGMOSQUITO MOSQUITO_MANGIANT_MOSQUITOSPIDER_JUMPINGJUMPING_SPIDER_MANGIANT_JUMPING_SPIDERTERMITE -MOON_SNAILMOON_SNAIL_MANGIANT_MOON_SNAILSPIDER_BROWN_RECLUSEBROWN_RECLUSE_SPIDER_MANGIANT_BROWN_RECLUSE_SPIDERSNAIL SNAIL_MAN GIANT_SNAIL GECKO_LEOPARDLEOPARD_GECKO_MANGIANT_LEOPARD_GECKODESERT TORTOISEDESERT_TORTOISE_MANGIANT_DESERT_TORTOISE GILA_MONSTERGILA_MONSTER_MANGIANT_GILA_MONSTERDOGCATMULEDONKEYHORSECOWSHEEPPIGGOAT BIRD_CHICKENCAVY BIRD_DUCK WATER_BUFFALOREINDEER -BIRD_GOOSEYAKLLAMAALPACABIRD_GUINEAFOWLBIRD_PEAFOWL_BLUE BIRD_TURKEYRABBITCHIMERACENTAURGRIFFONFLYFLY_MAN GIANT_FLY ROACH_LARGE ROACH_MAN GIANT_ROACHBEETLE -BEETLE_MAN GIANT_BEETLEANTBUTTERFLY_MONARCHBUTTERFLY_MONARCH_MANGIANT_BUTTERFLY_MONARCHFIREFLY FIREFLY_MAN GIANT_FIREFLY DRAGONFLY DRAGONFLY_MANGIANT_DRAGONFLY HONEY_BEE BUMBLEBEE GOAT_MOUNTAINGOAT_MOUNTAIN_MANGIANT_GOAT_MOUNTAIN MARMOT_HOARYMARMOT_HOARY_MANGIANT_MARMOT_HOARYGNOME_MOUNTAIN -GNOME_DARKWALRUS -WALRUS_MAN GIANT_WALRUSFISH_LAMPREY_SEASHARK_GREAT_WHITE SHARK_FRILLSHARK_SPINY_DOGFISHSHARK_WOBBEGONG_SPOTTED SHARK_WHALE SHARK_BASKING SHARK_NURSESHARK_MAKO_SHORTFINSHARK_MAKO_LONGFIN SHARK_TIGER -SHARK_BULLSHARK_REEF_BLACKTIPSHARK_REEF_WHITETIP -SHARK_BLUESHARK_HAMMERHEAD SHARK_ANGELFISH_SKATE_COMMONFISH_RAY_MANTA FISH_STINGRAYFISH_COELACANTH FISH_STURGEONFISH_CONGER_EEL FISH_MILKFISHFISH_COD FISH_OPAHFISH_GROUPER_GIANT FISH_BLUEFISHFISH_SUNFISH_OCEANFISH_SWORDFISH FISH_MARLIN FISH_HALIBUTFISH_BARRACUDA_GREATFISH_TUNA_BLUEFINNARWHAL NARWHAL MANNARWHAL, GIANTHIPPO HIPPO_MAN GIANT_HIPPOFISH_GAR_LONGNOSE FISH_CARPFISH_TIGERFISH FISH_PIKEPLATYPUS PLATYPUS MANPLATYPUS, GIANT BEAR_GRIZZLYBEAR_GRIZZLY_MANGIANT_BEAR_GRIZZLY -BEAR_BLACKBEAR_BLACK_MANGIANT_BEAR_BLACKDEERDEER_MAN -GIANT_DEERFOXFOX_MAN GIANT_FOXRACCOON RACCOON_MAN GIANT_RACCOONMACAQUE_RHESUSMACAQUE_RHESUS_MANGIANT_MACAQUE_RHESUSCOUGAR -COUGAR_MAN GIANT_COUGARWOLFWOLF_MAN -GIANT_WOLF GROUNDHOG GROUNDHOG_MANGIANT_GROUNDHOG ALLIGATOR ALLIGATOR_MANGIANT_ALLIGATOR BIRD_BUZZARD BUZZARD_MAN GIANT_BUZZARDPANDAPANDA, GIGANTIC PANDA MANCAPYBARACAPYBARA, GIANT CAPYBARA MANBADGER -BADGER MAN BADGER, GIANTMOOSE MOOSE MAN MOOSE, GIANT RED PANDA RED PANDA MANRED PANDA, GIANTELEPHANT ELEPHANT_MANGIANT_ELEPHANTWARTHOG WARTHOG_MAN GIANT_WARTHOGLIONLION_MAN -GIANT_LIONLEOPARD LEOPARD_MAN GIANT_LEOPARDJAGUAR -JAGUAR_MAN GIANT_JAGUARTIGER TIGER_MAN GIANT_TIGERCHEETAH CHEETAH_MAN GIANT_CHEETAHGAZELLE GAZELLE_MAN GIANT_GAZELLEMANDRILL MANDRILL_MANGIANT_MANDRILL -CHIMPANZEEBONOBOGORILLA ORANGUTANGIBBON_SIAMANGGIBBON_WHITE_HANDEDGIBBON_BLACK_HANDED GIBBON_GRAYGIBBON_SILVERYGIBBON_PILEATED GIBBON_BILOUGIBBON_WHITE_BROWEDGIBBON_BLACK_CRESTED CAMEL_1_HUMPCAMEL_1_HUMP_MANGIANT_CAMEL_1_HUMP CAMEL_2_HUMPCAMEL_2_HUMP_MANGIANT_CAMEL_2_HUMPCROCODILE_SALTWATERCROCODILE_SALTWATER_MANGIANT_CROCODILE_SALTWATER BIRD_VULTURE VULTURE_MAN GIANT_VULTURE -RHINOCEROSRHINOCEROS_MANGIANT_RHINOCEROSGIRAFFE GIRAFFE_MAN GIANT_GIRAFFE HONEY BADGERHONEY BADGER MANHONEY BADGER, GIANTGIANT TORTOISEGIANT TORTOISE MANGIGANTIC TORTOISE ARMADILLO ARMADILLO MANARMADILLO, GIANTMUSKOX -MUSKOX_MAN GIANT_MUSKOXELKELK_MAN GIANT_ELK -BEAR_POLARBEAR_POLAR_MANGIANT_BEAR_POLAR WOLVERINE WOLVERINE_MANGIANT_WOLVERINE -CHINCHILLACHINCHILLA_MANGIANT_CHINCHILLA FLOATING_GUTSDRUNIAN CREEPING_EYEVORACIOUS_CAVE_CRAWLERBLIND_CAVE_OGRE -CAP_HOPPER -MAGMA_CRABCRUNDLE HUNGRY_HEAD -FLESH_BALLELK_BIRD HELMET_SNAKEGREEN_DEVOURERRUTHERERCREEPY_CRAWLERDRALTHAGIANT_EARTHWORM BLOOD_MANBUGBATMANERA -MOLEMARIANJABBERER POND_GRABBERBLIND_CAVE_BEAR CAVE_DRAGONREACHERELEMENTMAN_GABBROGORLAK CAVE_FLOATERPLUMP_HELMET_MAN CAVE_BLOBELEMENTMAN_AMETHYSTOCTOPUS OCTOPUS_MAN GIANT_OCTOPUSCRABCRAB_MAN -GIANT_CRAB LEOPARD_SEALLEOPARD_SEAL_MANGIANT_LEOPARD_SEAL -CUTTLEFISHCUTTLEFISH_MANGIANT_CUTTLEFISHORCAORCA_MAN -GIANT_ORCASPONGE -SPONGE_MAN GIANT_SPONGEHORSESHOE_CRABHORSESHOE_CRAB_MANGIANT_HORSESHOE_CRAB SPERM_WHALESPERM_WHALE_MANGIANT_SPERM_WHALE ELEPHANT_SEALELEPHANT_SEAL_MANGIANT_ELEPHANT_SEAL HARP_SEAL HARP_SEAL_MANGIANT_HARP_SEALNAUTILUS NAUTILUS_MANGIANT_NAUTILUS FOXSQUIRREL MOGHOPPER RAT_DEMONWAMBLER_FLUFFYLIZARD_RHINO_TWO_LEGGED WORM_KNUCKLESPIDER_PHANTOM FLY_ACORN -GNAT_BLOODLIZARD -LIZARD_MAN GIANT_LIZARDSKINK SKINK_MAN GIANT_SKINK CHAMELEON CHAMELEON_MANGIANT_CHAMELEONANOLE ANOLE_MAN GIANT_ANOLEIGUANA -IGUANA_MAN GIANT_IGUANA RIVER OTTER SEA OTTER OTTER_MAN GIANT_OTTERSNAPPING TURTLEALLIGATOR SNAPPING TURTLESNAPPING_TURTLE_MANGIANT_SNAPPING_TURTLEBEAVER -BEAVER_MAN GIANT_BEAVERLEECH LEECH_MAN GIANT_LEECHAXOLOTL AXOLOTL_MAN GIANT_AXOLOTLMINKMINK_MAN -GIANT_MINK POND_TURTLEPOND_TURTLE_MANGIANT_POND_TURTLERATRAT_MAN SQUIRREL_GRAYSQUIRREL_GRAY_MANGIANT_SQUIRREL_GRAY SQUIRREL_REDSQUIRREL_RED_MANGIANT_SQUIRREL_REDCHIPMUNK CHIPMUNK_MANGIANT_CHIPMUNKHAMSTER HAMSTER_MAN GIANT_HAMSTERHEDGEHOG HEDGEHOG_MANGIANT_HEDGEHOGSQUIRREL_FLYINGFLYING_SQUIRREL_MANGIANT_FLYING_SQUIRRELMUSSELOYSTER FISH_SALMONFISH_CLOWNFISH FISH_HAGFISHFISH_LAMPREY_BROOK FISH_RAY_BATFISH_RAY_THORNBACKFISH_RATFISH_SPOTTED FISH_HERRING FISH_SHAD FISH_ANCHOVYFISH_TROUT_STEELHEAD FISH_HAKE FISH_SEAHORSE FISH_GLASSEYEFISH_PUFFER_WHITE_SPOTTED FISH_SOLE FISH_FLOUNDER FISH_MACKERELJELLYFISH_SEA_NETTLESQUID SQUID MANGIGANTIC SQUID FISH_LUNGFISHFISH_LOACH_CLOWNFISH_BULLHEAD_BROWNFISH_BULLHEAD_YELLOWFISH_BULLHEAD_BLACKFISH_KNIFEFISH_BANDED FISH_CHARFISH_TROUT_RAINBOWFISH_MOLLY_SAILFIN -FISH_GUPPY -FISH_PERCHDWARFHUMANELFGOBLINKOBOLDGREMLINTROLLOGREUNICORNDRAGONSATYRCOLOSSUS_BRONZEGIANTCYCLOPSETTINMINOTAURYETI SASQUATCH BLIZZARD_MANWOLF_ICEFAIRYPIXIEBEAK_DOG GRIMELING BLENDEC_FOUL STRANGLER NIGHTWINGHARPYHYDRA MERPERSON SEA_SERPENT SEA_MONSTERBIRD_ROCCROCODILE_CAVETOAD_GIANT_CAVE OLM_GIANT BAT_GIANT RAT_GIANT RAT_LARGEMOLE_DOG_NAKED -TROGLODYTE -MOLE_GIANTIMP_FIRESPIDER_CAVE_GIANT SPIDER_CAVE FISH_CAVE CAVE_FISH_MAN LOBSTER_CAVE -SNAKE_FIREOLMOLM_MANBATBAT_MANMAGGOT_PURRINGELEMENTMAN_FIREELEMENTMAN_MAGMAELEMENTMAN_IRONELEMENTMAN_MUDBIRD_SWALLOW_CAVECAVE_SWALLOW_MANBIRD_SWALLOW_CAVE_GIANT AMPHIBIAN_MAN REPTILE_MAN SERPENT_MANANT_MAN -RODENT MAN WILD_BOAR WILD_BOAR_MANGIANT_WILD_BOARCOYOTE -COYOTE_MAN GIANT_COYOTEKANGAROO KANGAROO_MANGIANT_KANGAROOKOALA KOALA_MAN GIANT_KOALAADDER ADDER_MAN GIANT_ADDERECHIDNA ECHIDNA_MAN GIANT_ECHIDNA PORCUPINE PORCUPINE_MANGIANT_PORCUPINE KINGSNAKE KINGSNAKE_MANGIANT_KINGSNAKE GRAY_LANGURGRAY_LANGUR_MANGIANT_GRAY_LANGURBOBCAT -BOBCAT_MAN GIANT_BOBCATSKUNK SKUNK_MAN GIANT_SKUNKGREEN_TREE_FROGGREEN_TREE_FROG_MANGIANT_GREEN_TREE_FROGHAREHARE_MAN -GIANT_HARE RATTLESNAKERATTLESNAKE_MANGIANT_RATTLESNAKEWEASEL -WEASEL_MAN GIANT_WEASELCOPPERHEAD_SNAKECOPPERHEAD_SNAKE_MANGIANT_COPPERHEAD_SNAKEIBEXIBEX_MAN -GIANT_IBEXWOMBAT -WOMBAT_MAN GIANT_WOMBATDINGO DINGO_MAN GIANT_DINGOCOATI COATI_MAN GIANT_COATIOPOSSUM OPOSSUM_MAN GIANT_OPOSSUMMONGOOSE MONGOOSE_MANGIANT_MONGOOSEHYENA HYENA_MAN GIANT_HYENAANACONDA ANACONDA_MANGIANT_ANACONDAMONITOR_LIZARDMONITOR_LIZARD_MANGIANT_MONITOR_LIZARD -KING_COBRAKING_COBRA_MANGIANT_KING_COBRAOCELOT -OCELOT_MAN GIANT_OCELOTJACKAL -JACKAL_MAN GIANT_JACKALCAPUCHIN CAPUCHIN_MANGIANT_CAPUCHINSLOTH SLOTH_MAN GIANT_SLOTH SPIDER_MONKEYSPIDER_MONKEY_MANGIANT_SPIDER_MONKEYPANGOLIN PANGOLIN_MANGIANT_PANGOLIN BLACK_MAMBABLACK_MAMBA_MANGIANT_BLACK_MAMBA -BEAR_SLOTHSLOTH_BEAR_MANGIANT_SLOTH_BEARAYE-AYE AYE-AYE_MAN GIANT_AYE-AYE -BUSHMASTERBUSHMASTER_MANGIANT_BUSHMASTERPYTHON -PYTHON_MAN GIANT_PYTHONTAPIR TAPIR_MAN GIANT_TAPIRIMPALA -IMPALA_MAN GIANT_IMPALAAARDVARK AARDVARK_MANGIANT_AARDVARK LION_TAMARINLION_TAMARIN_MANGIANT_LION_TAMARINSTOAT STOAT_MAN GIANT_STOATLYNXLYNX_MAN -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/craftrefuse.dfstock b/data/stockpiles/craftrefuse.dfstock deleted file mode 100644 index f834658d4..000000000 --- a/data/stockpiles/craftrefuse.dfstock +++ /dev/null @@ -1,364 +0,0 @@ -*ïÍ -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCH*TOAD*TOAD_MAN* -GIANT_TOAD*WORM*WORM_MAN* BIRD_BLUEJAY* BLUEJAY_MAN* GIANT_BLUEJAY* BIRD_CARDINAL* CARDINAL_MAN*GIANT_CARDINAL* BIRD_GRACKLE* GRACKLE_MAN* GIANT_GRACKLE* BIRD_ORIOLE* -ORIOLE_MAN* GIANT_ORIOLE*BIRD_RW_BLACKBIRD*RW_BLACKBIRD_MAN*GIANT_RW_BLACKBIRD* BIRD_PENGUIN*BIRD_PENGUIN_LITTLE*BIRD_PENGUIN_EMPEROR* PENGUIN MAN*BIRD_PENGUIN_GIANT*BIRD_FALCON_PEREGRINE*PEREGRINE FALCON MAN*GIANT PEREGRINE FALCON* BIRD_KIWI*KIWI MAN*BIRD_KIWI_GIANT* BIRD_OSTRICH* OSTRICH MAN*BIRD_OSTRICH_GIANT* BIRD_CROW*CROW_MAN* -GIANT_CROW* -BIRD_RAVEN* RAVEN_MAN* GIANT_RAVEN*BIRD_CASSOWARY* CASSOWARY_MAN*GIANT_CASSOWARY*BIRD_KEA*KEA_MAN* GIANT_KEA*BIRD_OWL_SNOWY* SNOWY_OWL_MAN*GIANT_SNOWY_OWL*SPARROW* SPARROW_MAN* GIANT_SPARROW*BIRD_STORK_WHITE*WHITE_STORK_MAN*GIANT_WHITE_STORK* BIRD_LOON*LOON_MAN* -GIANT_LOON* BIRD_OWL_BARN* BARN_OWL_MAN*GIANT_BARN_OWL* BIRD_PARAKEET* PARAKEET_MAN*GIANT_PARAKEET* BIRD_KAKAPO* -KAKAPO_MAN* GIANT_KAKAPO*BIRD_PARROT_GREY*GREY_PARROT_MAN*GIANT_GREY_PARROT* BIRD_PUFFIN* -PUFFIN_MAN* GIANT_PUFFIN* BIRD_SWAN*SWAN_MAN* -GIANT_SWAN* BIRD_LORIKEET* LORIKEET_MAN*GIANT_LORIKEET* BIRD_WREN*WREN_MAN* -GIANT_WREN* BIRD_OSPREY* -OSPREY_MAN* GIANT_OSPREY*BIRD_EMU*EMU_MAN* GIANT_EMU*BIRD_COCKATIEL* COCKATIEL_MAN*GIANT_COCKATIEL*BIRD_LOVEBIRD_PEACH-FACED*PEACH-FACED_LOVEBIRD_MAN*GIANT_PEACH-FACED_LOVEBIRD* BIRD_MAGPIE* -MAGPIE_MAN* GIANT_MAGPIE* BIRD_KESTREL* KESTREL_MAN* GIANT_KESTREL*BIRD_ALBATROSS* ALBATROSS_MAN*GIANT_ALBATROSS*BIRD_OWL_GREAT_HORNED*GREAT_HORNED_OWL_MAN*GIANT_GREAT_HORNED_OWL* -BIRD_EAGLE* EAGLE_MAN* GIANT_EAGLE* BIRD_HORNBILL* HORNBILL_MAN*GIANT_HORNBILL*BIRD_LOVEBIRD_MASKED*MASKED_LOVEBIRD_MAN*GIANT_MASKED_LOVEBIRD* BIRD_BUSHTIT* BUSHTIT_MAN* GIANT_BUSHTIT* DAMSELFLY* DAMSELFLY_MAN*GIANT_DAMSELFLY*MOTH*MOTH_MAN* -GIANT_MOTH* GRASSHOPPER*GRASSHOPPER_MAN*GIANT_GRASSHOPPER* BARK_SCORPION*BARK_SCORPION_MAN*GIANT_BARK_SCORPION*MANTIS* -MANTIS_MAN* GIANT_MANTIS*TICK*TICK_MAN* -GIANT_TICK*LOUSE* LOUSE_MAN* GIANT_LOUSE*THRIPS* -THRIPS_MAN* GIANT_THRIPS*SLUG*SLUG_MAN* -GIANT_SLUG*MOSQUITO* MOSQUITO_MAN*GIANT_MOSQUITO*SPIDER_JUMPING*JUMPING_SPIDER_MAN*GIANT_JUMPING_SPIDER*TERMITE* -MOON_SNAIL*MOON_SNAIL_MAN*GIANT_MOON_SNAIL*SPIDER_BROWN_RECLUSE*BROWN_RECLUSE_SPIDER_MAN*GIANT_BROWN_RECLUSE_SPIDER*SNAIL* SNAIL_MAN* GIANT_SNAIL* GECKO_LEOPARD*LEOPARD_GECKO_MAN*GIANT_LEOPARD_GECKO*DESERT TORTOISE*DESERT_TORTOISE_MAN*GIANT_DESERT_TORTOISE* GILA_MONSTER*GILA_MONSTER_MAN*GIANT_GILA_MONSTER*DOG*CAT*MULE*DONKEY*HORSE*COW*SHEEP*PIG*GOAT* BIRD_CHICKEN*CAVY* BIRD_DUCK* WATER_BUFFALO*REINDEER* -BIRD_GOOSE*YAK*LLAMA*ALPACA*BIRD_GUINEAFOWL*BIRD_PEAFOWL_BLUE* BIRD_TURKEY*RABBIT*CHIMERA*CENTAUR*GRIFFON*FLY*FLY_MAN* GIANT_FLY* ROACH_LARGE* ROACH_MAN* GIANT_ROACH*BEETLE* -BEETLE_MAN* GIANT_BEETLE*ANT*BUTTERFLY_MONARCH*BUTTERFLY_MONARCH_MAN*GIANT_BUTTERFLY_MONARCH*FIREFLY* FIREFLY_MAN* GIANT_FIREFLY* DRAGONFLY* DRAGONFLY_MAN*GIANT_DRAGONFLY* HONEY_BEE* BUMBLEBEE* GOAT_MOUNTAIN*GOAT_MOUNTAIN_MAN*GIANT_GOAT_MOUNTAIN* MARMOT_HOARY*MARMOT_HOARY_MAN*GIANT_MARMOT_HOARY*GNOME_MOUNTAIN* -GNOME_DARK*WALRUS* -WALRUS_MAN* GIANT_WALRUS*FISH_LAMPREY_SEA*SHARK_GREAT_WHITE* SHARK_FRILL*SHARK_SPINY_DOGFISH*SHARK_WOBBEGONG_SPOTTED* SHARK_WHALE* SHARK_BASKING* SHARK_NURSE*SHARK_MAKO_SHORTFIN*SHARK_MAKO_LONGFIN* SHARK_TIGER* -SHARK_BULL*SHARK_REEF_BLACKTIP*SHARK_REEF_WHITETIP* -SHARK_BLUE*SHARK_HAMMERHEAD* SHARK_ANGEL*FISH_SKATE_COMMON*FISH_RAY_MANTA* FISH_STINGRAY*FISH_COELACANTH* FISH_STURGEON*FISH_CONGER_EEL* FISH_MILKFISH*FISH_COD* FISH_OPAH*FISH_GROUPER_GIANT* FISH_BLUEFISH*FISH_SUNFISH_OCEAN*FISH_SWORDFISH* FISH_MARLIN* FISH_HALIBUT*FISH_BARRACUDA_GREAT*FISH_TUNA_BLUEFIN*NARWHAL* NARWHAL MAN*NARWHAL, GIANT*HIPPO* HIPPO_MAN* GIANT_HIPPO*FISH_GAR_LONGNOSE* FISH_CARP*FISH_TIGERFISH* FISH_PIKE*PLATYPUS* PLATYPUS MAN*PLATYPUS, GIANT* BEAR_GRIZZLY*BEAR_GRIZZLY_MAN*GIANT_BEAR_GRIZZLY* -BEAR_BLACK*BEAR_BLACK_MAN*GIANT_BEAR_BLACK*DEER*DEER_MAN* -GIANT_DEER*FOX*FOX_MAN* GIANT_FOX*RACCOON* RACCOON_MAN* GIANT_RACCOON*MACAQUE_RHESUS*MACAQUE_RHESUS_MAN*GIANT_MACAQUE_RHESUS*COUGAR* -COUGAR_MAN* GIANT_COUGAR*WOLF*WOLF_MAN* -GIANT_WOLF* GROUNDHOG* GROUNDHOG_MAN*GIANT_GROUNDHOG* ALLIGATOR* ALLIGATOR_MAN*GIANT_ALLIGATOR* BIRD_BUZZARD* BUZZARD_MAN* GIANT_BUZZARD*PANDA*PANDA, GIGANTIC* PANDA MAN*CAPYBARA*CAPYBARA, GIANT* CAPYBARA MAN*BADGER* -BADGER MAN* BADGER, GIANT*MOOSE* MOOSE MAN* MOOSE, GIANT* RED PANDA* RED PANDA MAN*RED PANDA, GIANT*ELEPHANT* ELEPHANT_MAN*GIANT_ELEPHANT*WARTHOG* WARTHOG_MAN* GIANT_WARTHOG*LION*LION_MAN* -GIANT_LION*LEOPARD* LEOPARD_MAN* GIANT_LEOPARD*JAGUAR* -JAGUAR_MAN* GIANT_JAGUAR*TIGER* TIGER_MAN* GIANT_TIGER*CHEETAH* CHEETAH_MAN* GIANT_CHEETAH*GAZELLE* GAZELLE_MAN* GIANT_GAZELLE*MANDRILL* MANDRILL_MAN*GIANT_MANDRILL* -CHIMPANZEE*BONOBO*GORILLA* ORANGUTAN*GIBBON_SIAMANG*GIBBON_WHITE_HANDED*GIBBON_BLACK_HANDED* GIBBON_GRAY*GIBBON_SILVERY*GIBBON_PILEATED* GIBBON_BILOU*GIBBON_WHITE_BROWED*GIBBON_BLACK_CRESTED* CAMEL_1_HUMP*CAMEL_1_HUMP_MAN*GIANT_CAMEL_1_HUMP* CAMEL_2_HUMP*CAMEL_2_HUMP_MAN*GIANT_CAMEL_2_HUMP*CROCODILE_SALTWATER*CROCODILE_SALTWATER_MAN*GIANT_CROCODILE_SALTWATER* BIRD_VULTURE* VULTURE_MAN* GIANT_VULTURE* -RHINOCEROS*RHINOCEROS_MAN*GIANT_RHINOCEROS*GIRAFFE* GIRAFFE_MAN* GIANT_GIRAFFE* HONEY BADGER*HONEY BADGER MAN*HONEY BADGER, GIANT*GIANT TORTOISE*GIANT TORTOISE MAN*GIGANTIC TORTOISE* ARMADILLO* ARMADILLO MAN*ARMADILLO, GIANT*MUSKOX* -MUSKOX_MAN* GIANT_MUSKOX*ELK*ELK_MAN* GIANT_ELK* -BEAR_POLAR*BEAR_POLAR_MAN*GIANT_BEAR_POLAR* WOLVERINE* WOLVERINE_MAN*GIANT_WOLVERINE* -CHINCHILLA*CHINCHILLA_MAN*GIANT_CHINCHILLA* FLOATING_GUTS*DRUNIAN* CREEPING_EYE*VORACIOUS_CAVE_CRAWLER*BLIND_CAVE_OGRE* -CAP_HOPPER* -MAGMA_CRAB*CRUNDLE* HUNGRY_HEAD* -FLESH_BALL*ELK_BIRD* HELMET_SNAKE*GREEN_DEVOURER*RUTHERER*CREEPY_CRAWLER*DRALTHA*GIANT_EARTHWORM* BLOOD_MAN*BUGBAT*MANERA* -MOLEMARIAN*JABBERER* POND_GRABBER*BLIND_CAVE_BEAR* CAVE_DRAGON*REACHER*ELEMENTMAN_GABBRO*GORLAK* CAVE_FLOATER*PLUMP_HELMET_MAN* CAVE_BLOB*ELEMENTMAN_AMETHYST*OCTOPUS* OCTOPUS_MAN* GIANT_OCTOPUS*CRAB*CRAB_MAN* -GIANT_CRAB* LEOPARD_SEAL*LEOPARD_SEAL_MAN*GIANT_LEOPARD_SEAL* -CUTTLEFISH*CUTTLEFISH_MAN*GIANT_CUTTLEFISH*ORCA*ORCA_MAN* -GIANT_ORCA*SPONGE* -SPONGE_MAN* GIANT_SPONGE*HORSESHOE_CRAB*HORSESHOE_CRAB_MAN*GIANT_HORSESHOE_CRAB* SPERM_WHALE*SPERM_WHALE_MAN*GIANT_SPERM_WHALE* ELEPHANT_SEAL*ELEPHANT_SEAL_MAN*GIANT_ELEPHANT_SEAL* HARP_SEAL* HARP_SEAL_MAN*GIANT_HARP_SEAL*NAUTILUS* NAUTILUS_MAN*GIANT_NAUTILUS* FOXSQUIRREL* MOGHOPPER* RAT_DEMON*WAMBLER_FLUFFY*LIZARD_RHINO_TWO_LEGGED* WORM_KNUCKLE*SPIDER_PHANTOM* FLY_ACORN* -GNAT_BLOOD*LIZARD* -LIZARD_MAN* GIANT_LIZARD*SKINK* SKINK_MAN* GIANT_SKINK* CHAMELEON* CHAMELEON_MAN*GIANT_CHAMELEON*ANOLE* ANOLE_MAN* GIANT_ANOLE*IGUANA* -IGUANA_MAN* GIANT_IGUANA* RIVER OTTER* SEA OTTER* OTTER_MAN* GIANT_OTTER*SNAPPING TURTLE*ALLIGATOR SNAPPING TURTLE*SNAPPING_TURTLE_MAN*GIANT_SNAPPING_TURTLE*BEAVER* -BEAVER_MAN* GIANT_BEAVER*LEECH* LEECH_MAN* GIANT_LEECH*AXOLOTL* AXOLOTL_MAN* GIANT_AXOLOTL*MINK*MINK_MAN* -GIANT_MINK* POND_TURTLE*POND_TURTLE_MAN*GIANT_POND_TURTLE*RAT*RAT_MAN* SQUIRREL_GRAY*SQUIRREL_GRAY_MAN*GIANT_SQUIRREL_GRAY* SQUIRREL_RED*SQUIRREL_RED_MAN*GIANT_SQUIRREL_RED*CHIPMUNK* CHIPMUNK_MAN*GIANT_CHIPMUNK*HAMSTER* HAMSTER_MAN* GIANT_HAMSTER*HEDGEHOG* HEDGEHOG_MAN*GIANT_HEDGEHOG*SQUIRREL_FLYING*FLYING_SQUIRREL_MAN*GIANT_FLYING_SQUIRREL*MUSSEL*OYSTER* FISH_SALMON*FISH_CLOWNFISH* FISH_HAGFISH*FISH_LAMPREY_BROOK* FISH_RAY_BAT*FISH_RAY_THORNBACK*FISH_RATFISH_SPOTTED* FISH_HERRING* FISH_SHAD* FISH_ANCHOVY*FISH_TROUT_STEELHEAD* FISH_HAKE* FISH_SEAHORSE* FISH_GLASSEYE*FISH_PUFFER_WHITE_SPOTTED* FISH_SOLE* FISH_FLOUNDER* FISH_MACKEREL*JELLYFISH_SEA_NETTLE*SQUID* SQUID MAN*GIGANTIC SQUID* FISH_LUNGFISH*FISH_LOACH_CLOWN*FISH_BULLHEAD_BROWN*FISH_BULLHEAD_YELLOW*FISH_BULLHEAD_BLACK*FISH_KNIFEFISH_BANDED* FISH_CHAR*FISH_TROUT_RAINBOW*FISH_MOLLY_SAILFIN* -FISH_GUPPY* -FISH_PERCH*DWARF*HUMAN*ELF*GOBLIN*KOBOLD*GREMLIN*TROLL*OGRE*UNICORN*DRAGON*SATYR*COLOSSUS_BRONZE*GIANT*CYCLOPS*ETTIN*MINOTAUR*YETI* SASQUATCH* BLIZZARD_MAN*WOLF_ICE*FAIRY*PIXIE*BEAK_DOG* GRIMELING* BLENDEC_FOUL* STRANGLER* NIGHTWING*HARPY*HYDRA* MERPERSON* SEA_SERPENT* SEA_MONSTER*BIRD_ROC*CROCODILE_CAVE*TOAD_GIANT_CAVE* OLM_GIANT* BAT_GIANT* RAT_GIANT* RAT_LARGE*MOLE_DOG_NAKED* -TROGLODYTE* -MOLE_GIANT*IMP_FIRE*SPIDER_CAVE_GIANT* SPIDER_CAVE* FISH_CAVE* CAVE_FISH_MAN* LOBSTER_CAVE* -SNAKE_FIRE*OLM*OLM_MAN*BAT*BAT_MAN*MAGGOT_PURRING*ELEMENTMAN_FIRE*ELEMENTMAN_MAGMA*ELEMENTMAN_IRON*ELEMENTMAN_MUD*BIRD_SWALLOW_CAVE*CAVE_SWALLOW_MAN*BIRD_SWALLOW_CAVE_GIANT* AMPHIBIAN_MAN* REPTILE_MAN* SERPENT_MAN*ANT_MAN* -RODENT MAN* WILD_BOAR* WILD_BOAR_MAN*GIANT_WILD_BOAR*COYOTE* -COYOTE_MAN* GIANT_COYOTE*KANGAROO* KANGAROO_MAN*GIANT_KANGAROO*KOALA* KOALA_MAN* GIANT_KOALA*ADDER* ADDER_MAN* GIANT_ADDER*ECHIDNA* ECHIDNA_MAN* GIANT_ECHIDNA* PORCUPINE* PORCUPINE_MAN*GIANT_PORCUPINE* KINGSNAKE* KINGSNAKE_MAN*GIANT_KINGSNAKE* GRAY_LANGUR*GRAY_LANGUR_MAN*GIANT_GRAY_LANGUR*BOBCAT* -BOBCAT_MAN* GIANT_BOBCAT*SKUNK* SKUNK_MAN* GIANT_SKUNK*GREEN_TREE_FROG*GREEN_TREE_FROG_MAN*GIANT_GREEN_TREE_FROG*HARE*HARE_MAN* -GIANT_HARE* RATTLESNAKE*RATTLESNAKE_MAN*GIANT_RATTLESNAKE*WEASEL* -WEASEL_MAN* GIANT_WEASEL*COPPERHEAD_SNAKE*COPPERHEAD_SNAKE_MAN*GIANT_COPPERHEAD_SNAKE*IBEX*IBEX_MAN* -GIANT_IBEX*WOMBAT* -WOMBAT_MAN* GIANT_WOMBAT*DINGO* DINGO_MAN* GIANT_DINGO*COATI* COATI_MAN* GIANT_COATI*OPOSSUM* OPOSSUM_MAN* GIANT_OPOSSUM*MONGOOSE* MONGOOSE_MAN*GIANT_MONGOOSE*HYENA* HYENA_MAN* GIANT_HYENA*ANACONDA* ANACONDA_MAN*GIANT_ANACONDA*MONITOR_LIZARD*MONITOR_LIZARD_MAN*GIANT_MONITOR_LIZARD* -KING_COBRA*KING_COBRA_MAN*GIANT_KING_COBRA*OCELOT* -OCELOT_MAN* GIANT_OCELOT*JACKAL* -JACKAL_MAN* GIANT_JACKAL*CAPUCHIN* CAPUCHIN_MAN*GIANT_CAPUCHIN*SLOTH* SLOTH_MAN* GIANT_SLOTH* SPIDER_MONKEY*SPIDER_MONKEY_MAN*GIANT_SPIDER_MONKEY*PANGOLIN* PANGOLIN_MAN*GIANT_PANGOLIN* BLACK_MAMBA*BLACK_MAMBA_MAN*GIANT_BLACK_MAMBA* -BEAR_SLOTH*SLOTH_BEAR_MAN*GIANT_SLOTH_BEAR*AYE-AYE* AYE-AYE_MAN* GIANT_AYE-AYE* -BUSHMASTER*BUSHMASTER_MAN*GIANT_BUSHMASTER*PYTHON* -PYTHON_MAN* GIANT_PYTHON*TAPIR* TAPIR_MAN* GIANT_TAPIR*IMPALA* -IMPALA_MAN* GIANT_IMPALA*AARDVARK* AARDVARK_MAN*GIANT_AARDVARK* LION_TAMARIN*LION_TAMARIN_MAN*GIANT_LION_TAMARIN*STOAT* STOAT_MAN* GIANT_STOAT*LYNX*LYNX_MAN* -GIANT_LYNX2TOAD2TOAD_MAN2 -GIANT_TOAD2WORM2WORM_MAN2 BIRD_BLUEJAY2 BLUEJAY_MAN2 GIANT_BLUEJAY2 BIRD_CARDINAL2 CARDINAL_MAN2GIANT_CARDINAL2 BIRD_GRACKLE2 GRACKLE_MAN2 GIANT_GRACKLE2 BIRD_ORIOLE2 -ORIOLE_MAN2 GIANT_ORIOLE2BIRD_RW_BLACKBIRD2RW_BLACKBIRD_MAN2GIANT_RW_BLACKBIRD2 BIRD_PENGUIN2BIRD_PENGUIN_LITTLE2BIRD_PENGUIN_EMPEROR2 PENGUIN MAN2BIRD_PENGUIN_GIANT2BIRD_FALCON_PEREGRINE2PEREGRINE FALCON MAN2GIANT PEREGRINE FALCON2 BIRD_KIWI2KIWI MAN2BIRD_KIWI_GIANT2 BIRD_OSTRICH2 OSTRICH MAN2BIRD_OSTRICH_GIANT2 BIRD_CROW2CROW_MAN2 -GIANT_CROW2 -BIRD_RAVEN2 RAVEN_MAN2 GIANT_RAVEN2BIRD_CASSOWARY2 CASSOWARY_MAN2GIANT_CASSOWARY2BIRD_KEA2KEA_MAN2 GIANT_KEA2BIRD_OWL_SNOWY2 SNOWY_OWL_MAN2GIANT_SNOWY_OWL2SPARROW2 SPARROW_MAN2 GIANT_SPARROW2BIRD_STORK_WHITE2WHITE_STORK_MAN2GIANT_WHITE_STORK2 BIRD_LOON2LOON_MAN2 -GIANT_LOON2 BIRD_OWL_BARN2 BARN_OWL_MAN2GIANT_BARN_OWL2 BIRD_PARAKEET2 PARAKEET_MAN2GIANT_PARAKEET2 BIRD_KAKAPO2 -KAKAPO_MAN2 GIANT_KAKAPO2BIRD_PARROT_GREY2GREY_PARROT_MAN2GIANT_GREY_PARROT2 BIRD_PUFFIN2 -PUFFIN_MAN2 GIANT_PUFFIN2 BIRD_SWAN2SWAN_MAN2 -GIANT_SWAN2 BIRD_LORIKEET2 LORIKEET_MAN2GIANT_LORIKEET2 BIRD_WREN2WREN_MAN2 -GIANT_WREN2 BIRD_OSPREY2 -OSPREY_MAN2 GIANT_OSPREY2BIRD_EMU2EMU_MAN2 GIANT_EMU2BIRD_COCKATIEL2 COCKATIEL_MAN2GIANT_COCKATIEL2BIRD_LOVEBIRD_PEACH-FACED2PEACH-FACED_LOVEBIRD_MAN2GIANT_PEACH-FACED_LOVEBIRD2 BIRD_MAGPIE2 -MAGPIE_MAN2 GIANT_MAGPIE2 BIRD_KESTREL2 KESTREL_MAN2 GIANT_KESTREL2BIRD_ALBATROSS2 ALBATROSS_MAN2GIANT_ALBATROSS2BIRD_OWL_GREAT_HORNED2GREAT_HORNED_OWL_MAN2GIANT_GREAT_HORNED_OWL2 -BIRD_EAGLE2 EAGLE_MAN2 GIANT_EAGLE2 BIRD_HORNBILL2 HORNBILL_MAN2GIANT_HORNBILL2BIRD_LOVEBIRD_MASKED2MASKED_LOVEBIRD_MAN2GIANT_MASKED_LOVEBIRD2 BIRD_BUSHTIT2 BUSHTIT_MAN2 GIANT_BUSHTIT2 DAMSELFLY2 DAMSELFLY_MAN2GIANT_DAMSELFLY2MOTH2MOTH_MAN2 -GIANT_MOTH2 GRASSHOPPER2GRASSHOPPER_MAN2GIANT_GRASSHOPPER2 BARK_SCORPION2BARK_SCORPION_MAN2GIANT_BARK_SCORPION2MANTIS2 -MANTIS_MAN2 GIANT_MANTIS2TICK2TICK_MAN2 -GIANT_TICK2LOUSE2 LOUSE_MAN2 GIANT_LOUSE2THRIPS2 -THRIPS_MAN2 GIANT_THRIPS2SLUG2SLUG_MAN2 -GIANT_SLUG2MOSQUITO2 MOSQUITO_MAN2GIANT_MOSQUITO2SPIDER_JUMPING2JUMPING_SPIDER_MAN2GIANT_JUMPING_SPIDER2TERMITE2 -MOON_SNAIL2MOON_SNAIL_MAN2GIANT_MOON_SNAIL2SPIDER_BROWN_RECLUSE2BROWN_RECLUSE_SPIDER_MAN2GIANT_BROWN_RECLUSE_SPIDER2SNAIL2 SNAIL_MAN2 GIANT_SNAIL2 GECKO_LEOPARD2LEOPARD_GECKO_MAN2GIANT_LEOPARD_GECKO2DESERT TORTOISE2DESERT_TORTOISE_MAN2GIANT_DESERT_TORTOISE2 GILA_MONSTER2GILA_MONSTER_MAN2GIANT_GILA_MONSTER2DOG2CAT2MULE2DONKEY2HORSE2COW2SHEEP2PIG2GOAT2 BIRD_CHICKEN2CAVY2 BIRD_DUCK2 WATER_BUFFALO2REINDEER2 -BIRD_GOOSE2YAK2LLAMA2ALPACA2BIRD_GUINEAFOWL2BIRD_PEAFOWL_BLUE2 BIRD_TURKEY2RABBIT2CHIMERA2CENTAUR2GRIFFON2FLY2FLY_MAN2 GIANT_FLY2 ROACH_LARGE2 ROACH_MAN2 GIANT_ROACH2BEETLE2 -BEETLE_MAN2 GIANT_BEETLE2ANT2BUTTERFLY_MONARCH2BUTTERFLY_MONARCH_MAN2GIANT_BUTTERFLY_MONARCH2FIREFLY2 FIREFLY_MAN2 GIANT_FIREFLY2 DRAGONFLY2 DRAGONFLY_MAN2GIANT_DRAGONFLY2 HONEY_BEE2 BUMBLEBEE2 GOAT_MOUNTAIN2GOAT_MOUNTAIN_MAN2GIANT_GOAT_MOUNTAIN2 MARMOT_HOARY2MARMOT_HOARY_MAN2GIANT_MARMOT_HOARY2GNOME_MOUNTAIN2 -GNOME_DARK2WALRUS2 -WALRUS_MAN2 GIANT_WALRUS2FISH_LAMPREY_SEA2SHARK_GREAT_WHITE2 SHARK_FRILL2SHARK_SPINY_DOGFISH2SHARK_WOBBEGONG_SPOTTED2 SHARK_WHALE2 SHARK_BASKING2 SHARK_NURSE2SHARK_MAKO_SHORTFIN2SHARK_MAKO_LONGFIN2 SHARK_TIGER2 -SHARK_BULL2SHARK_REEF_BLACKTIP2SHARK_REEF_WHITETIP2 -SHARK_BLUE2SHARK_HAMMERHEAD2 SHARK_ANGEL2FISH_SKATE_COMMON2FISH_RAY_MANTA2 FISH_STINGRAY2FISH_COELACANTH2 FISH_STURGEON2FISH_CONGER_EEL2 FISH_MILKFISH2FISH_COD2 FISH_OPAH2FISH_GROUPER_GIANT2 FISH_BLUEFISH2FISH_SUNFISH_OCEAN2FISH_SWORDFISH2 FISH_MARLIN2 FISH_HALIBUT2FISH_BARRACUDA_GREAT2FISH_TUNA_BLUEFIN2NARWHAL2 NARWHAL MAN2NARWHAL, GIANT2HIPPO2 HIPPO_MAN2 GIANT_HIPPO2FISH_GAR_LONGNOSE2 FISH_CARP2FISH_TIGERFISH2 FISH_PIKE2PLATYPUS2 PLATYPUS MAN2PLATYPUS, GIANT2 BEAR_GRIZZLY2BEAR_GRIZZLY_MAN2GIANT_BEAR_GRIZZLY2 -BEAR_BLACK2BEAR_BLACK_MAN2GIANT_BEAR_BLACK2DEER2DEER_MAN2 -GIANT_DEER2FOX2FOX_MAN2 GIANT_FOX2RACCOON2 RACCOON_MAN2 GIANT_RACCOON2MACAQUE_RHESUS2MACAQUE_RHESUS_MAN2GIANT_MACAQUE_RHESUS2COUGAR2 -COUGAR_MAN2 GIANT_COUGAR2WOLF2WOLF_MAN2 -GIANT_WOLF2 GROUNDHOG2 GROUNDHOG_MAN2GIANT_GROUNDHOG2 ALLIGATOR2 ALLIGATOR_MAN2GIANT_ALLIGATOR2 BIRD_BUZZARD2 BUZZARD_MAN2 GIANT_BUZZARD2PANDA2PANDA, GIGANTIC2 PANDA MAN2CAPYBARA2CAPYBARA, GIANT2 CAPYBARA MAN2BADGER2 -BADGER MAN2 BADGER, GIANT2MOOSE2 MOOSE MAN2 MOOSE, GIANT2 RED PANDA2 RED PANDA MAN2RED PANDA, GIANT2ELEPHANT2 ELEPHANT_MAN2GIANT_ELEPHANT2WARTHOG2 WARTHOG_MAN2 GIANT_WARTHOG2LION2LION_MAN2 -GIANT_LION2LEOPARD2 LEOPARD_MAN2 GIANT_LEOPARD2JAGUAR2 -JAGUAR_MAN2 GIANT_JAGUAR2TIGER2 TIGER_MAN2 GIANT_TIGER2CHEETAH2 CHEETAH_MAN2 GIANT_CHEETAH2GAZELLE2 GAZELLE_MAN2 GIANT_GAZELLE2MANDRILL2 MANDRILL_MAN2GIANT_MANDRILL2 -CHIMPANZEE2BONOBO2GORILLA2 ORANGUTAN2GIBBON_SIAMANG2GIBBON_WHITE_HANDED2GIBBON_BLACK_HANDED2 GIBBON_GRAY2GIBBON_SILVERY2GIBBON_PILEATED2 GIBBON_BILOU2GIBBON_WHITE_BROWED2GIBBON_BLACK_CRESTED2 CAMEL_1_HUMP2CAMEL_1_HUMP_MAN2GIANT_CAMEL_1_HUMP2 CAMEL_2_HUMP2CAMEL_2_HUMP_MAN2GIANT_CAMEL_2_HUMP2CROCODILE_SALTWATER2CROCODILE_SALTWATER_MAN2GIANT_CROCODILE_SALTWATER2 BIRD_VULTURE2 VULTURE_MAN2 GIANT_VULTURE2 -RHINOCEROS2RHINOCEROS_MAN2GIANT_RHINOCEROS2GIRAFFE2 GIRAFFE_MAN2 GIANT_GIRAFFE2 HONEY BADGER2HONEY BADGER MAN2HONEY BADGER, GIANT2GIANT TORTOISE2GIANT TORTOISE MAN2GIGANTIC TORTOISE2 ARMADILLO2 ARMADILLO MAN2ARMADILLO, GIANT2MUSKOX2 -MUSKOX_MAN2 GIANT_MUSKOX2ELK2ELK_MAN2 GIANT_ELK2 -BEAR_POLAR2BEAR_POLAR_MAN2GIANT_BEAR_POLAR2 WOLVERINE2 WOLVERINE_MAN2GIANT_WOLVERINE2 -CHINCHILLA2CHINCHILLA_MAN2GIANT_CHINCHILLA2 FLOATING_GUTS2DRUNIAN2 CREEPING_EYE2VORACIOUS_CAVE_CRAWLER2BLIND_CAVE_OGRE2 -CAP_HOPPER2 -MAGMA_CRAB2CRUNDLE2 HUNGRY_HEAD2 -FLESH_BALL2ELK_BIRD2 HELMET_SNAKE2GREEN_DEVOURER2RUTHERER2CREEPY_CRAWLER2DRALTHA2GIANT_EARTHWORM2 BLOOD_MAN2BUGBAT2MANERA2 -MOLEMARIAN2JABBERER2 POND_GRABBER2BLIND_CAVE_BEAR2 CAVE_DRAGON2REACHER2ELEMENTMAN_GABBRO2GORLAK2 CAVE_FLOATER2PLUMP_HELMET_MAN2 CAVE_BLOB2ELEMENTMAN_AMETHYST2OCTOPUS2 OCTOPUS_MAN2 GIANT_OCTOPUS2CRAB2CRAB_MAN2 -GIANT_CRAB2 LEOPARD_SEAL2LEOPARD_SEAL_MAN2GIANT_LEOPARD_SEAL2 -CUTTLEFISH2CUTTLEFISH_MAN2GIANT_CUTTLEFISH2ORCA2ORCA_MAN2 -GIANT_ORCA2SPONGE2 -SPONGE_MAN2 GIANT_SPONGE2HORSESHOE_CRAB2HORSESHOE_CRAB_MAN2GIANT_HORSESHOE_CRAB2 SPERM_WHALE2SPERM_WHALE_MAN2GIANT_SPERM_WHALE2 ELEPHANT_SEAL2ELEPHANT_SEAL_MAN2GIANT_ELEPHANT_SEAL2 HARP_SEAL2 HARP_SEAL_MAN2GIANT_HARP_SEAL2NAUTILUS2 NAUTILUS_MAN2GIANT_NAUTILUS2 FOXSQUIRREL2 MOGHOPPER2 RAT_DEMON2WAMBLER_FLUFFY2LIZARD_RHINO_TWO_LEGGED2 WORM_KNUCKLE2SPIDER_PHANTOM2 FLY_ACORN2 -GNAT_BLOOD2LIZARD2 -LIZARD_MAN2 GIANT_LIZARD2SKINK2 SKINK_MAN2 GIANT_SKINK2 CHAMELEON2 CHAMELEON_MAN2GIANT_CHAMELEON2ANOLE2 ANOLE_MAN2 GIANT_ANOLE2IGUANA2 -IGUANA_MAN2 GIANT_IGUANA2 RIVER OTTER2 SEA OTTER2 OTTER_MAN2 GIANT_OTTER2SNAPPING TURTLE2ALLIGATOR SNAPPING TURTLE2SNAPPING_TURTLE_MAN2GIANT_SNAPPING_TURTLE2BEAVER2 -BEAVER_MAN2 GIANT_BEAVER2LEECH2 LEECH_MAN2 GIANT_LEECH2AXOLOTL2 AXOLOTL_MAN2 GIANT_AXOLOTL2MINK2MINK_MAN2 -GIANT_MINK2 POND_TURTLE2POND_TURTLE_MAN2GIANT_POND_TURTLE2RAT2RAT_MAN2 SQUIRREL_GRAY2SQUIRREL_GRAY_MAN2GIANT_SQUIRREL_GRAY2 SQUIRREL_RED2SQUIRREL_RED_MAN2GIANT_SQUIRREL_RED2CHIPMUNK2 CHIPMUNK_MAN2GIANT_CHIPMUNK2HAMSTER2 HAMSTER_MAN2 GIANT_HAMSTER2HEDGEHOG2 HEDGEHOG_MAN2GIANT_HEDGEHOG2SQUIRREL_FLYING2FLYING_SQUIRREL_MAN2GIANT_FLYING_SQUIRREL2MUSSEL2OYSTER2 FISH_SALMON2FISH_CLOWNFISH2 FISH_HAGFISH2FISH_LAMPREY_BROOK2 FISH_RAY_BAT2FISH_RAY_THORNBACK2FISH_RATFISH_SPOTTED2 FISH_HERRING2 FISH_SHAD2 FISH_ANCHOVY2FISH_TROUT_STEELHEAD2 FISH_HAKE2 FISH_SEAHORSE2 FISH_GLASSEYE2FISH_PUFFER_WHITE_SPOTTED2 FISH_SOLE2 FISH_FLOUNDER2 FISH_MACKEREL2JELLYFISH_SEA_NETTLE2SQUID2 SQUID MAN2GIGANTIC SQUID2 FISH_LUNGFISH2FISH_LOACH_CLOWN2FISH_BULLHEAD_BROWN2FISH_BULLHEAD_YELLOW2FISH_BULLHEAD_BLACK2FISH_KNIFEFISH_BANDED2 FISH_CHAR2FISH_TROUT_RAINBOW2FISH_MOLLY_SAILFIN2 -FISH_GUPPY2 -FISH_PERCH2DWARF2HUMAN2ELF2GOBLIN2KOBOLD2GREMLIN2TROLL2OGRE2UNICORN2DRAGON2SATYR2COLOSSUS_BRONZE2GIANT2CYCLOPS2ETTIN2MINOTAUR2YETI2 SASQUATCH2 BLIZZARD_MAN2WOLF_ICE2FAIRY2PIXIE2BEAK_DOG2 GRIMELING2 BLENDEC_FOUL2 STRANGLER2 NIGHTWING2HARPY2HYDRA2 MERPERSON2 SEA_SERPENT2 SEA_MONSTER2BIRD_ROC2CROCODILE_CAVE2TOAD_GIANT_CAVE2 OLM_GIANT2 BAT_GIANT2 RAT_GIANT2 RAT_LARGE2MOLE_DOG_NAKED2 -TROGLODYTE2 -MOLE_GIANT2IMP_FIRE2SPIDER_CAVE_GIANT2 SPIDER_CAVE2 FISH_CAVE2 CAVE_FISH_MAN2 LOBSTER_CAVE2 -SNAKE_FIRE2OLM2OLM_MAN2BAT2BAT_MAN2MAGGOT_PURRING2ELEMENTMAN_FIRE2ELEMENTMAN_MAGMA2ELEMENTMAN_IRON2ELEMENTMAN_MUD2BIRD_SWALLOW_CAVE2CAVE_SWALLOW_MAN2BIRD_SWALLOW_CAVE_GIANT2 AMPHIBIAN_MAN2 REPTILE_MAN2 SERPENT_MAN2ANT_MAN2 -RODENT MAN2 WILD_BOAR2 WILD_BOAR_MAN2GIANT_WILD_BOAR2COYOTE2 -COYOTE_MAN2 GIANT_COYOTE2KANGAROO2 KANGAROO_MAN2GIANT_KANGAROO2KOALA2 KOALA_MAN2 GIANT_KOALA2ADDER2 ADDER_MAN2 GIANT_ADDER2ECHIDNA2 ECHIDNA_MAN2 GIANT_ECHIDNA2 PORCUPINE2 PORCUPINE_MAN2GIANT_PORCUPINE2 KINGSNAKE2 KINGSNAKE_MAN2GIANT_KINGSNAKE2 GRAY_LANGUR2GRAY_LANGUR_MAN2GIANT_GRAY_LANGUR2BOBCAT2 -BOBCAT_MAN2 GIANT_BOBCAT2SKUNK2 SKUNK_MAN2 GIANT_SKUNK2GREEN_TREE_FROG2GREEN_TREE_FROG_MAN2GIANT_GREEN_TREE_FROG2HARE2HARE_MAN2 -GIANT_HARE2 RATTLESNAKE2RATTLESNAKE_MAN2GIANT_RATTLESNAKE2WEASEL2 -WEASEL_MAN2 GIANT_WEASEL2COPPERHEAD_SNAKE2COPPERHEAD_SNAKE_MAN2GIANT_COPPERHEAD_SNAKE2IBEX2IBEX_MAN2 -GIANT_IBEX2WOMBAT2 -WOMBAT_MAN2 GIANT_WOMBAT2DINGO2 DINGO_MAN2 GIANT_DINGO2COATI2 COATI_MAN2 GIANT_COATI2OPOSSUM2 OPOSSUM_MAN2 GIANT_OPOSSUM2MONGOOSE2 MONGOOSE_MAN2GIANT_MONGOOSE2HYENA2 HYENA_MAN2 GIANT_HYENA2ANACONDA2 ANACONDA_MAN2GIANT_ANACONDA2MONITOR_LIZARD2MONITOR_LIZARD_MAN2GIANT_MONITOR_LIZARD2 -KING_COBRA2KING_COBRA_MAN2GIANT_KING_COBRA2OCELOT2 -OCELOT_MAN2 GIANT_OCELOT2JACKAL2 -JACKAL_MAN2 GIANT_JACKAL2CAPUCHIN2 CAPUCHIN_MAN2GIANT_CAPUCHIN2SLOTH2 SLOTH_MAN2 GIANT_SLOTH2 SPIDER_MONKEY2SPIDER_MONKEY_MAN2GIANT_SPIDER_MONKEY2PANGOLIN2 PANGOLIN_MAN2GIANT_PANGOLIN2 BLACK_MAMBA2BLACK_MAMBA_MAN2GIANT_BLACK_MAMBA2 -BEAR_SLOTH2SLOTH_BEAR_MAN2GIANT_SLOTH_BEAR2AYE-AYE2 AYE-AYE_MAN2 GIANT_AYE-AYE2 -BUSHMASTER2BUSHMASTER_MAN2GIANT_BUSHMASTER2PYTHON2 -PYTHON_MAN2 GIANT_PYTHON2TAPIR2 TAPIR_MAN2 GIANT_TAPIR2IMPALA2 -IMPALA_MAN2 GIANT_IMPALA2AARDVARK2 AARDVARK_MAN2GIANT_AARDVARK2 LION_TAMARIN2LION_TAMARIN_MAN2GIANT_LION_TAMARIN2STOAT2 STOAT_MAN2 GIANT_STOAT2LYNX2LYNX_MAN2 -GIANT_LYNX:SHEEP:LLAMA:ALPACA:TROLLBTOADBTOAD_MANB -GIANT_TOADBWORMBWORM_MANB BIRD_BLUEJAYB BLUEJAY_MANB GIANT_BLUEJAYB BIRD_CARDINALB CARDINAL_MANBGIANT_CARDINALB BIRD_GRACKLEB GRACKLE_MANB GIANT_GRACKLEB BIRD_ORIOLEB -ORIOLE_MANB GIANT_ORIOLEBBIRD_RW_BLACKBIRDBRW_BLACKBIRD_MANBGIANT_RW_BLACKBIRDB BIRD_PENGUINBBIRD_PENGUIN_LITTLEBBIRD_PENGUIN_EMPERORB PENGUIN MANBBIRD_PENGUIN_GIANTBBIRD_FALCON_PEREGRINEBPEREGRINE FALCON MANBGIANT PEREGRINE FALCONB BIRD_KIWIBKIWI MANBBIRD_KIWI_GIANTB BIRD_OSTRICHB OSTRICH MANBBIRD_OSTRICH_GIANTB BIRD_CROWBCROW_MANB -GIANT_CROWB -BIRD_RAVENB RAVEN_MANB GIANT_RAVENBBIRD_CASSOWARYB CASSOWARY_MANBGIANT_CASSOWARYBBIRD_KEABKEA_MANB GIANT_KEABBIRD_OWL_SNOWYB SNOWY_OWL_MANBGIANT_SNOWY_OWLBSPARROWB SPARROW_MANB GIANT_SPARROWBBIRD_STORK_WHITEBWHITE_STORK_MANBGIANT_WHITE_STORKB BIRD_LOONBLOON_MANB -GIANT_LOONB BIRD_OWL_BARNB BARN_OWL_MANBGIANT_BARN_OWLB BIRD_PARAKEETB PARAKEET_MANBGIANT_PARAKEETB BIRD_KAKAPOB -KAKAPO_MANB GIANT_KAKAPOBBIRD_PARROT_GREYBGREY_PARROT_MANBGIANT_GREY_PARROTB BIRD_PUFFINB -PUFFIN_MANB GIANT_PUFFINB BIRD_SWANBSWAN_MANB -GIANT_SWANB BIRD_LORIKEETB LORIKEET_MANBGIANT_LORIKEETB BIRD_WRENBWREN_MANB -GIANT_WRENB BIRD_OSPREYB -OSPREY_MANB GIANT_OSPREYBBIRD_EMUBEMU_MANB GIANT_EMUBBIRD_COCKATIELB COCKATIEL_MANBGIANT_COCKATIELBBIRD_LOVEBIRD_PEACH-FACEDBPEACH-FACED_LOVEBIRD_MANBGIANT_PEACH-FACED_LOVEBIRDB BIRD_MAGPIEB -MAGPIE_MANB GIANT_MAGPIEB BIRD_KESTRELB KESTREL_MANB GIANT_KESTRELBBIRD_ALBATROSSB ALBATROSS_MANBGIANT_ALBATROSSBBIRD_OWL_GREAT_HORNEDBGREAT_HORNED_OWL_MANBGIANT_GREAT_HORNED_OWLB -BIRD_EAGLEB EAGLE_MANB GIANT_EAGLEB BIRD_HORNBILLB HORNBILL_MANBGIANT_HORNBILLBBIRD_LOVEBIRD_MASKEDBMASKED_LOVEBIRD_MANBGIANT_MASKED_LOVEBIRDB BIRD_BUSHTITB BUSHTIT_MANB GIANT_BUSHTITB DAMSELFLYB DAMSELFLY_MANBGIANT_DAMSELFLYBMOTHBMOTH_MANB -GIANT_MOTHB GRASSHOPPERBGRASSHOPPER_MANBGIANT_GRASSHOPPERB BARK_SCORPIONBBARK_SCORPION_MANBGIANT_BARK_SCORPIONBMANTISB -MANTIS_MANB GIANT_MANTISBTICKBTICK_MANB -GIANT_TICKBLOUSEB LOUSE_MANB GIANT_LOUSEBTHRIPSB -THRIPS_MANB GIANT_THRIPSBSLUGBSLUG_MANB -GIANT_SLUGBMOSQUITOB MOSQUITO_MANBGIANT_MOSQUITOBSPIDER_JUMPINGBJUMPING_SPIDER_MANBGIANT_JUMPING_SPIDERBTERMITEB -MOON_SNAILBMOON_SNAIL_MANBGIANT_MOON_SNAILBSPIDER_BROWN_RECLUSEBBROWN_RECLUSE_SPIDER_MANBGIANT_BROWN_RECLUSE_SPIDERBSNAILB SNAIL_MANB GIANT_SNAILB GECKO_LEOPARDBLEOPARD_GECKO_MANBGIANT_LEOPARD_GECKOBDESERT TORTOISEBDESERT_TORTOISE_MANBGIANT_DESERT_TORTOISEB GILA_MONSTERBGILA_MONSTER_MANBGIANT_GILA_MONSTERBDOGBCATBMULEBDONKEYBHORSEBCOWBSHEEPBPIGBGOATB BIRD_CHICKENBCAVYB BIRD_DUCKB WATER_BUFFALOBREINDEERB -BIRD_GOOSEBYAKBLLAMABALPACABBIRD_GUINEAFOWLBBIRD_PEAFOWL_BLUEB BIRD_TURKEYBRABBITBCHIMERABCENTAURBGRIFFONBFLYBFLY_MANB GIANT_FLYB ROACH_LARGEB ROACH_MANB GIANT_ROACHBBEETLEB -BEETLE_MANB GIANT_BEETLEBANTBBUTTERFLY_MONARCHBBUTTERFLY_MONARCH_MANBGIANT_BUTTERFLY_MONARCHBFIREFLYB FIREFLY_MANB GIANT_FIREFLYB DRAGONFLYB DRAGONFLY_MANBGIANT_DRAGONFLYB HONEY_BEEB BUMBLEBEEB GOAT_MOUNTAINBGOAT_MOUNTAIN_MANBGIANT_GOAT_MOUNTAINB MARMOT_HOARYBMARMOT_HOARY_MANBGIANT_MARMOT_HOARYBGNOME_MOUNTAINB -GNOME_DARKBWALRUSB -WALRUS_MANB GIANT_WALRUSBFISH_LAMPREY_SEABSHARK_GREAT_WHITEB SHARK_FRILLBSHARK_SPINY_DOGFISHBSHARK_WOBBEGONG_SPOTTEDB SHARK_WHALEB SHARK_BASKINGB SHARK_NURSEBSHARK_MAKO_SHORTFINBSHARK_MAKO_LONGFINB SHARK_TIGERB -SHARK_BULLBSHARK_REEF_BLACKTIPBSHARK_REEF_WHITETIPB -SHARK_BLUEBSHARK_HAMMERHEADB SHARK_ANGELBFISH_SKATE_COMMONBFISH_RAY_MANTAB FISH_STINGRAYBFISH_COELACANTHB FISH_STURGEONBFISH_CONGER_EELB FISH_MILKFISHBFISH_CODB FISH_OPAHBFISH_GROUPER_GIANTB FISH_BLUEFISHBFISH_SUNFISH_OCEANBFISH_SWORDFISHB FISH_MARLINB FISH_HALIBUTBFISH_BARRACUDA_GREATBFISH_TUNA_BLUEFINBNARWHALB NARWHAL MANBNARWHAL, GIANTBHIPPOB HIPPO_MANB GIANT_HIPPOBFISH_GAR_LONGNOSEB FISH_CARPBFISH_TIGERFISHB FISH_PIKEBPLATYPUSB PLATYPUS MANBPLATYPUS, GIANTB BEAR_GRIZZLYBBEAR_GRIZZLY_MANBGIANT_BEAR_GRIZZLYB -BEAR_BLACKBBEAR_BLACK_MANBGIANT_BEAR_BLACKBDEERBDEER_MANB -GIANT_DEERBFOXBFOX_MANB GIANT_FOXBRACCOONB RACCOON_MANB GIANT_RACCOONBMACAQUE_RHESUSBMACAQUE_RHESUS_MANBGIANT_MACAQUE_RHESUSBCOUGARB -COUGAR_MANB GIANT_COUGARBWOLFBWOLF_MANB -GIANT_WOLFB GROUNDHOGB GROUNDHOG_MANBGIANT_GROUNDHOGB ALLIGATORB ALLIGATOR_MANBGIANT_ALLIGATORB BIRD_BUZZARDB BUZZARD_MANB GIANT_BUZZARDBPANDABPANDA, GIGANTICB PANDA MANBCAPYBARABCAPYBARA, GIANTB CAPYBARA MANBBADGERB -BADGER MANB BADGER, GIANTBMOOSEB MOOSE MANB MOOSE, GIANTB RED PANDAB RED PANDA MANBRED PANDA, GIANTBELEPHANTB ELEPHANT_MANBGIANT_ELEPHANTBWARTHOGB WARTHOG_MANB GIANT_WARTHOGBLIONBLION_MANB -GIANT_LIONBLEOPARDB LEOPARD_MANB GIANT_LEOPARDBJAGUARB -JAGUAR_MANB GIANT_JAGUARBTIGERB TIGER_MANB GIANT_TIGERBCHEETAHB CHEETAH_MANB GIANT_CHEETAHBGAZELLEB GAZELLE_MANB GIANT_GAZELLEBMANDRILLB MANDRILL_MANBGIANT_MANDRILLB -CHIMPANZEEBBONOBOBGORILLAB ORANGUTANBGIBBON_SIAMANGBGIBBON_WHITE_HANDEDBGIBBON_BLACK_HANDEDB GIBBON_GRAYBGIBBON_SILVERYBGIBBON_PILEATEDB GIBBON_BILOUBGIBBON_WHITE_BROWEDBGIBBON_BLACK_CRESTEDB CAMEL_1_HUMPBCAMEL_1_HUMP_MANBGIANT_CAMEL_1_HUMPB CAMEL_2_HUMPBCAMEL_2_HUMP_MANBGIANT_CAMEL_2_HUMPBCROCODILE_SALTWATERBCROCODILE_SALTWATER_MANBGIANT_CROCODILE_SALTWATERB BIRD_VULTUREB VULTURE_MANB GIANT_VULTUREB -RHINOCEROSBRHINOCEROS_MANBGIANT_RHINOCEROSBGIRAFFEB GIRAFFE_MANB GIANT_GIRAFFEB HONEY BADGERBHONEY BADGER MANBHONEY BADGER, GIANTBGIANT TORTOISEBGIANT TORTOISE MANBGIGANTIC TORTOISEB ARMADILLOB ARMADILLO MANBARMADILLO, GIANTBMUSKOXB -MUSKOX_MANB GIANT_MUSKOXBELKBELK_MANB GIANT_ELKB -BEAR_POLARBBEAR_POLAR_MANBGIANT_BEAR_POLARB WOLVERINEB WOLVERINE_MANBGIANT_WOLVERINEB -CHINCHILLABCHINCHILLA_MANBGIANT_CHINCHILLAB FLOATING_GUTSBDRUNIANB CREEPING_EYEBVORACIOUS_CAVE_CRAWLERBBLIND_CAVE_OGREB -CAP_HOPPERB -MAGMA_CRABBCRUNDLEB HUNGRY_HEADB -FLESH_BALLBELK_BIRDB HELMET_SNAKEBGREEN_DEVOURERBRUTHERERBCREEPY_CRAWLERBDRALTHABGIANT_EARTHWORMB BLOOD_MANBBUGBATBMANERAB -MOLEMARIANBJABBERERB POND_GRABBERBBLIND_CAVE_BEARB CAVE_DRAGONBREACHERBELEMENTMAN_GABBROBGORLAKB CAVE_FLOATERBPLUMP_HELMET_MANB CAVE_BLOBBELEMENTMAN_AMETHYSTBOCTOPUSB OCTOPUS_MANB GIANT_OCTOPUSBCRABBCRAB_MANB -GIANT_CRABB LEOPARD_SEALBLEOPARD_SEAL_MANBGIANT_LEOPARD_SEALB -CUTTLEFISHBCUTTLEFISH_MANBGIANT_CUTTLEFISHBORCABORCA_MANB -GIANT_ORCABSPONGEB -SPONGE_MANB GIANT_SPONGEBHORSESHOE_CRABBHORSESHOE_CRAB_MANBGIANT_HORSESHOE_CRABB SPERM_WHALEBSPERM_WHALE_MANBGIANT_SPERM_WHALEB ELEPHANT_SEALBELEPHANT_SEAL_MANBGIANT_ELEPHANT_SEALB HARP_SEALB HARP_SEAL_MANBGIANT_HARP_SEALBNAUTILUSB NAUTILUS_MANBGIANT_NAUTILUSB FOXSQUIRRELB MOGHOPPERB RAT_DEMONBWAMBLER_FLUFFYBLIZARD_RHINO_TWO_LEGGEDB WORM_KNUCKLEBSPIDER_PHANTOMB FLY_ACORNB -GNAT_BLOODBLIZARDB -LIZARD_MANB GIANT_LIZARDBSKINKB SKINK_MANB GIANT_SKINKB CHAMELEONB CHAMELEON_MANBGIANT_CHAMELEONBANOLEB ANOLE_MANB GIANT_ANOLEBIGUANAB -IGUANA_MANB GIANT_IGUANAB RIVER OTTERB SEA OTTERB OTTER_MANB GIANT_OTTERBSNAPPING TURTLEBALLIGATOR SNAPPING TURTLEBSNAPPING_TURTLE_MANBGIANT_SNAPPING_TURTLEBBEAVERB -BEAVER_MANB GIANT_BEAVERBLEECHB LEECH_MANB GIANT_LEECHBAXOLOTLB AXOLOTL_MANB GIANT_AXOLOTLBMINKBMINK_MANB -GIANT_MINKB POND_TURTLEBPOND_TURTLE_MANBGIANT_POND_TURTLEBRATBRAT_MANB SQUIRREL_GRAYBSQUIRREL_GRAY_MANBGIANT_SQUIRREL_GRAYB SQUIRREL_REDBSQUIRREL_RED_MANBGIANT_SQUIRREL_REDBCHIPMUNKB CHIPMUNK_MANBGIANT_CHIPMUNKBHAMSTERB HAMSTER_MANB GIANT_HAMSTERBHEDGEHOGB HEDGEHOG_MANBGIANT_HEDGEHOGBSQUIRREL_FLYINGBFLYING_SQUIRREL_MANBGIANT_FLYING_SQUIRRELBMUSSELBOYSTERB FISH_SALMONBFISH_CLOWNFISHB FISH_HAGFISHBFISH_LAMPREY_BROOKB FISH_RAY_BATBFISH_RAY_THORNBACKBFISH_RATFISH_SPOTTEDB FISH_HERRINGB FISH_SHADB FISH_ANCHOVYBFISH_TROUT_STEELHEADB FISH_HAKEB FISH_SEAHORSEB FISH_GLASSEYEBFISH_PUFFER_WHITE_SPOTTEDB FISH_SOLEB FISH_FLOUNDERB FISH_MACKERELBJELLYFISH_SEA_NETTLEBSQUIDB SQUID MANBGIGANTIC SQUIDB FISH_LUNGFISHBFISH_LOACH_CLOWNBFISH_BULLHEAD_BROWNBFISH_BULLHEAD_YELLOWBFISH_BULLHEAD_BLACKBFISH_KNIFEFISH_BANDEDB FISH_CHARBFISH_TROUT_RAINBOWBFISH_MOLLY_SAILFINB -FISH_GUPPYB -FISH_PERCHBDWARFBHUMANBELFBGOBLINBKOBOLDBGREMLINBTROLLBOGREBUNICORNBDRAGONBSATYRBCOLOSSUS_BRONZEBGIANTBCYCLOPSBETTINBMINOTAURBYETIB SASQUATCHB BLIZZARD_MANBWOLF_ICEBFAIRYBPIXIEBBEAK_DOGB GRIMELINGB BLENDEC_FOULB STRANGLERB NIGHTWINGBHARPYBHYDRAB MERPERSONB SEA_SERPENTB SEA_MONSTERBBIRD_ROCBCROCODILE_CAVEBTOAD_GIANT_CAVEB OLM_GIANTB BAT_GIANTB RAT_GIANTB RAT_LARGEBMOLE_DOG_NAKEDB -TROGLODYTEB -MOLE_GIANTBIMP_FIREBSPIDER_CAVE_GIANTB SPIDER_CAVEB FISH_CAVEB CAVE_FISH_MANB LOBSTER_CAVEB -SNAKE_FIREBOLMBOLM_MANBBATBBAT_MANBMAGGOT_PURRINGBELEMENTMAN_FIREBELEMENTMAN_MAGMABELEMENTMAN_IRONBELEMENTMAN_MUDBBIRD_SWALLOW_CAVEBCAVE_SWALLOW_MANBBIRD_SWALLOW_CAVE_GIANTB AMPHIBIAN_MANB REPTILE_MANB SERPENT_MANBANT_MANB -RODENT MANB WILD_BOARB WILD_BOAR_MANBGIANT_WILD_BOARBCOYOTEB -COYOTE_MANB GIANT_COYOTEBKANGAROOB KANGAROO_MANBGIANT_KANGAROOBKOALAB KOALA_MANB GIANT_KOALABADDERB ADDER_MANB GIANT_ADDERBECHIDNAB ECHIDNA_MANB GIANT_ECHIDNAB PORCUPINEB PORCUPINE_MANBGIANT_PORCUPINEB KINGSNAKEB KINGSNAKE_MANBGIANT_KINGSNAKEB GRAY_LANGURBGRAY_LANGUR_MANBGIANT_GRAY_LANGURBBOBCATB -BOBCAT_MANB GIANT_BOBCATBSKUNKB SKUNK_MANB GIANT_SKUNKBGREEN_TREE_FROGBGREEN_TREE_FROG_MANBGIANT_GREEN_TREE_FROGBHAREBHARE_MANB -GIANT_HAREB RATTLESNAKEBRATTLESNAKE_MANBGIANT_RATTLESNAKEBWEASELB -WEASEL_MANB GIANT_WEASELBCOPPERHEAD_SNAKEBCOPPERHEAD_SNAKE_MANBGIANT_COPPERHEAD_SNAKEBIBEXBIBEX_MANB -GIANT_IBEXBWOMBATB -WOMBAT_MANB GIANT_WOMBATBDINGOB DINGO_MANB GIANT_DINGOBCOATIB COATI_MANB GIANT_COATIBOPOSSUMB OPOSSUM_MANB GIANT_OPOSSUMBMONGOOSEB MONGOOSE_MANBGIANT_MONGOOSEBHYENAB HYENA_MANB GIANT_HYENABANACONDAB ANACONDA_MANBGIANT_ANACONDABMONITOR_LIZARDBMONITOR_LIZARD_MANBGIANT_MONITOR_LIZARDB -KING_COBRABKING_COBRA_MANBGIANT_KING_COBRABOCELOTB -OCELOT_MANB GIANT_OCELOTBJACKALB -JACKAL_MANB GIANT_JACKALBCAPUCHINB CAPUCHIN_MANBGIANT_CAPUCHINBSLOTHB SLOTH_MANB GIANT_SLOTHB SPIDER_MONKEYBSPIDER_MONKEY_MANBGIANT_SPIDER_MONKEYBPANGOLINB PANGOLIN_MANBGIANT_PANGOLINB BLACK_MAMBABBLACK_MAMBA_MANBGIANT_BLACK_MAMBAB -BEAR_SLOTHBSLOTH_BEAR_MANBGIANT_SLOTH_BEARBAYE-AYEB AYE-AYE_MANB GIANT_AYE-AYEB -BUSHMASTERBBUSHMASTER_MANBGIANT_BUSHMASTERBPYTHONB -PYTHON_MANB GIANT_PYTHONBTAPIRB TAPIR_MANB GIANT_TAPIRBIMPALAB -IMPALA_MANB GIANT_IMPALABAARDVARKB AARDVARK_MANBGIANT_AARDVARKB LION_TAMARINBLION_TAMARIN_MANBGIANT_LION_TAMARINBSTOATB STOAT_MANB GIANT_STOATBLYNXBLYNX_MANB -GIANT_LYNXJTOADJTOAD_MANJ -GIANT_TOADJWORMJWORM_MANJ BIRD_BLUEJAYJ BLUEJAY_MANJ GIANT_BLUEJAYJ BIRD_CARDINALJ CARDINAL_MANJGIANT_CARDINALJ BIRD_GRACKLEJ GRACKLE_MANJ GIANT_GRACKLEJ BIRD_ORIOLEJ -ORIOLE_MANJ GIANT_ORIOLEJBIRD_RW_BLACKBIRDJRW_BLACKBIRD_MANJGIANT_RW_BLACKBIRDJ BIRD_PENGUINJBIRD_PENGUIN_LITTLEJBIRD_PENGUIN_EMPERORJ PENGUIN MANJBIRD_PENGUIN_GIANTJBIRD_FALCON_PEREGRINEJPEREGRINE FALCON MANJGIANT PEREGRINE FALCONJ BIRD_KIWIJKIWI MANJBIRD_KIWI_GIANTJ BIRD_OSTRICHJ OSTRICH MANJBIRD_OSTRICH_GIANTJ BIRD_CROWJCROW_MANJ -GIANT_CROWJ -BIRD_RAVENJ RAVEN_MANJ GIANT_RAVENJBIRD_CASSOWARYJ CASSOWARY_MANJGIANT_CASSOWARYJBIRD_KEAJKEA_MANJ GIANT_KEAJBIRD_OWL_SNOWYJ SNOWY_OWL_MANJGIANT_SNOWY_OWLJSPARROWJ SPARROW_MANJ GIANT_SPARROWJBIRD_STORK_WHITEJWHITE_STORK_MANJGIANT_WHITE_STORKJ BIRD_LOONJLOON_MANJ -GIANT_LOONJ BIRD_OWL_BARNJ BARN_OWL_MANJGIANT_BARN_OWLJ BIRD_PARAKEETJ PARAKEET_MANJGIANT_PARAKEETJ BIRD_KAKAPOJ -KAKAPO_MANJ GIANT_KAKAPOJBIRD_PARROT_GREYJGREY_PARROT_MANJGIANT_GREY_PARROTJ BIRD_PUFFINJ -PUFFIN_MANJ GIANT_PUFFINJ BIRD_SWANJSWAN_MANJ -GIANT_SWANJ BIRD_LORIKEETJ LORIKEET_MANJGIANT_LORIKEETJ BIRD_WRENJWREN_MANJ -GIANT_WRENJ BIRD_OSPREYJ -OSPREY_MANJ GIANT_OSPREYJBIRD_EMUJEMU_MANJ GIANT_EMUJBIRD_COCKATIELJ COCKATIEL_MANJGIANT_COCKATIELJBIRD_LOVEBIRD_PEACH-FACEDJPEACH-FACED_LOVEBIRD_MANJGIANT_PEACH-FACED_LOVEBIRDJ BIRD_MAGPIEJ -MAGPIE_MANJ GIANT_MAGPIEJ BIRD_KESTRELJ KESTREL_MANJ GIANT_KESTRELJBIRD_ALBATROSSJ ALBATROSS_MANJGIANT_ALBATROSSJBIRD_OWL_GREAT_HORNEDJGREAT_HORNED_OWL_MANJGIANT_GREAT_HORNED_OWLJ -BIRD_EAGLEJ EAGLE_MANJ GIANT_EAGLEJ BIRD_HORNBILLJ HORNBILL_MANJGIANT_HORNBILLJBIRD_LOVEBIRD_MASKEDJMASKED_LOVEBIRD_MANJGIANT_MASKED_LOVEBIRDJ BIRD_BUSHTITJ BUSHTIT_MANJ GIANT_BUSHTITJ DAMSELFLYJ DAMSELFLY_MANJGIANT_DAMSELFLYJMOTHJMOTH_MANJ -GIANT_MOTHJ GRASSHOPPERJGRASSHOPPER_MANJGIANT_GRASSHOPPERJ BARK_SCORPIONJBARK_SCORPION_MANJGIANT_BARK_SCORPIONJMANTISJ -MANTIS_MANJ GIANT_MANTISJTICKJTICK_MANJ -GIANT_TICKJLOUSEJ LOUSE_MANJ GIANT_LOUSEJTHRIPSJ -THRIPS_MANJ GIANT_THRIPSJSLUGJSLUG_MANJ -GIANT_SLUGJMOSQUITOJ MOSQUITO_MANJGIANT_MOSQUITOJSPIDER_JUMPINGJJUMPING_SPIDER_MANJGIANT_JUMPING_SPIDERJTERMITEJ -MOON_SNAILJMOON_SNAIL_MANJGIANT_MOON_SNAILJSPIDER_BROWN_RECLUSEJBROWN_RECLUSE_SPIDER_MANJGIANT_BROWN_RECLUSE_SPIDERJSNAILJ SNAIL_MANJ GIANT_SNAILJ GECKO_LEOPARDJLEOPARD_GECKO_MANJGIANT_LEOPARD_GECKOJDESERT TORTOISEJDESERT_TORTOISE_MANJGIANT_DESERT_TORTOISEJ GILA_MONSTERJGILA_MONSTER_MANJGIANT_GILA_MONSTERJDOGJCATJMULEJDONKEYJHORSEJCOWJSHEEPJPIGJGOATJ BIRD_CHICKENJCAVYJ BIRD_DUCKJ WATER_BUFFALOJREINDEERJ -BIRD_GOOSEJYAKJLLAMAJALPACAJBIRD_GUINEAFOWLJBIRD_PEAFOWL_BLUEJ BIRD_TURKEYJRABBITJCHIMERAJCENTAURJGRIFFONJFLYJFLY_MANJ GIANT_FLYJ ROACH_LARGEJ ROACH_MANJ GIANT_ROACHJBEETLEJ -BEETLE_MANJ GIANT_BEETLEJANTJBUTTERFLY_MONARCHJBUTTERFLY_MONARCH_MANJGIANT_BUTTERFLY_MONARCHJFIREFLYJ FIREFLY_MANJ GIANT_FIREFLYJ DRAGONFLYJ DRAGONFLY_MANJGIANT_DRAGONFLYJ HONEY_BEEJ BUMBLEBEEJ GOAT_MOUNTAINJGOAT_MOUNTAIN_MANJGIANT_GOAT_MOUNTAINJ MARMOT_HOARYJMARMOT_HOARY_MANJGIANT_MARMOT_HOARYJGNOME_MOUNTAINJ -GNOME_DARKJWALRUSJ -WALRUS_MANJ GIANT_WALRUSJFISH_LAMPREY_SEAJSHARK_GREAT_WHITEJ SHARK_FRILLJSHARK_SPINY_DOGFISHJSHARK_WOBBEGONG_SPOTTEDJ SHARK_WHALEJ SHARK_BASKINGJ SHARK_NURSEJSHARK_MAKO_SHORTFINJSHARK_MAKO_LONGFINJ SHARK_TIGERJ -SHARK_BULLJSHARK_REEF_BLACKTIPJSHARK_REEF_WHITETIPJ -SHARK_BLUEJSHARK_HAMMERHEADJ SHARK_ANGELJFISH_SKATE_COMMONJFISH_RAY_MANTAJ FISH_STINGRAYJFISH_COELACANTHJ FISH_STURGEONJFISH_CONGER_EELJ FISH_MILKFISHJFISH_CODJ FISH_OPAHJFISH_GROUPER_GIANTJ FISH_BLUEFISHJFISH_SUNFISH_OCEANJFISH_SWORDFISHJ FISH_MARLINJ FISH_HALIBUTJFISH_BARRACUDA_GREATJFISH_TUNA_BLUEFINJNARWHALJ NARWHAL MANJNARWHAL, GIANTJHIPPOJ HIPPO_MANJ GIANT_HIPPOJFISH_GAR_LONGNOSEJ FISH_CARPJFISH_TIGERFISHJ FISH_PIKEJPLATYPUSJ PLATYPUS MANJPLATYPUS, GIANTJ BEAR_GRIZZLYJBEAR_GRIZZLY_MANJGIANT_BEAR_GRIZZLYJ -BEAR_BLACKJBEAR_BLACK_MANJGIANT_BEAR_BLACKJDEERJDEER_MANJ -GIANT_DEERJFOXJFOX_MANJ GIANT_FOXJRACCOONJ RACCOON_MANJ GIANT_RACCOONJMACAQUE_RHESUSJMACAQUE_RHESUS_MANJGIANT_MACAQUE_RHESUSJCOUGARJ -COUGAR_MANJ GIANT_COUGARJWOLFJWOLF_MANJ -GIANT_WOLFJ GROUNDHOGJ GROUNDHOG_MANJGIANT_GROUNDHOGJ ALLIGATORJ ALLIGATOR_MANJGIANT_ALLIGATORJ BIRD_BUZZARDJ BUZZARD_MANJ GIANT_BUZZARDJPANDAJPANDA, GIGANTICJ PANDA MANJCAPYBARAJCAPYBARA, GIANTJ CAPYBARA MANJBADGERJ -BADGER MANJ BADGER, GIANTJMOOSEJ MOOSE MANJ MOOSE, GIANTJ RED PANDAJ RED PANDA MANJRED PANDA, GIANTJELEPHANTJ ELEPHANT_MANJGIANT_ELEPHANTJWARTHOGJ WARTHOG_MANJ GIANT_WARTHOGJLIONJLION_MANJ -GIANT_LIONJLEOPARDJ LEOPARD_MANJ GIANT_LEOPARDJJAGUARJ -JAGUAR_MANJ GIANT_JAGUARJTIGERJ TIGER_MANJ GIANT_TIGERJCHEETAHJ CHEETAH_MANJ GIANT_CHEETAHJGAZELLEJ GAZELLE_MANJ GIANT_GAZELLEJMANDRILLJ MANDRILL_MANJGIANT_MANDRILLJ -CHIMPANZEEJBONOBOJGORILLAJ ORANGUTANJGIBBON_SIAMANGJGIBBON_WHITE_HANDEDJGIBBON_BLACK_HANDEDJ GIBBON_GRAYJGIBBON_SILVERYJGIBBON_PILEATEDJ GIBBON_BILOUJGIBBON_WHITE_BROWEDJGIBBON_BLACK_CRESTEDJ CAMEL_1_HUMPJCAMEL_1_HUMP_MANJGIANT_CAMEL_1_HUMPJ CAMEL_2_HUMPJCAMEL_2_HUMP_MANJGIANT_CAMEL_2_HUMPJCROCODILE_SALTWATERJCROCODILE_SALTWATER_MANJGIANT_CROCODILE_SALTWATERJ BIRD_VULTUREJ VULTURE_MANJ GIANT_VULTUREJ -RHINOCEROSJRHINOCEROS_MANJGIANT_RHINOCEROSJGIRAFFEJ GIRAFFE_MANJ GIANT_GIRAFFEJ HONEY BADGERJHONEY BADGER MANJHONEY BADGER, GIANTJGIANT TORTOISEJGIANT TORTOISE MANJGIGANTIC TORTOISEJ ARMADILLOJ ARMADILLO MANJARMADILLO, GIANTJMUSKOXJ -MUSKOX_MANJ GIANT_MUSKOXJELKJELK_MANJ GIANT_ELKJ -BEAR_POLARJBEAR_POLAR_MANJGIANT_BEAR_POLARJ WOLVERINEJ WOLVERINE_MANJGIANT_WOLVERINEJ -CHINCHILLAJCHINCHILLA_MANJGIANT_CHINCHILLAJ FLOATING_GUTSJDRUNIANJ CREEPING_EYEJVORACIOUS_CAVE_CRAWLERJBLIND_CAVE_OGREJ -CAP_HOPPERJ -MAGMA_CRABJCRUNDLEJ HUNGRY_HEADJ -FLESH_BALLJELK_BIRDJ HELMET_SNAKEJGREEN_DEVOURERJRUTHERERJCREEPY_CRAWLERJDRALTHAJGIANT_EARTHWORMJ BLOOD_MANJBUGBATJMANERAJ -MOLEMARIANJJABBERERJ POND_GRABBERJBLIND_CAVE_BEARJ CAVE_DRAGONJREACHERJELEMENTMAN_GABBROJGORLAKJ CAVE_FLOATERJPLUMP_HELMET_MANJ CAVE_BLOBJELEMENTMAN_AMETHYSTJOCTOPUSJ OCTOPUS_MANJ GIANT_OCTOPUSJCRABJCRAB_MANJ -GIANT_CRABJ LEOPARD_SEALJLEOPARD_SEAL_MANJGIANT_LEOPARD_SEALJ -CUTTLEFISHJCUTTLEFISH_MANJGIANT_CUTTLEFISHJORCAJORCA_MANJ -GIANT_ORCAJSPONGEJ -SPONGE_MANJ GIANT_SPONGEJHORSESHOE_CRABJHORSESHOE_CRAB_MANJGIANT_HORSESHOE_CRABJ SPERM_WHALEJSPERM_WHALE_MANJGIANT_SPERM_WHALEJ ELEPHANT_SEALJELEPHANT_SEAL_MANJGIANT_ELEPHANT_SEALJ HARP_SEALJ HARP_SEAL_MANJGIANT_HARP_SEALJNAUTILUSJ NAUTILUS_MANJGIANT_NAUTILUSJ FOXSQUIRRELJ MOGHOPPERJ RAT_DEMONJWAMBLER_FLUFFYJLIZARD_RHINO_TWO_LEGGEDJ WORM_KNUCKLEJSPIDER_PHANTOMJ FLY_ACORNJ -GNAT_BLOODJLIZARDJ -LIZARD_MANJ GIANT_LIZARDJSKINKJ SKINK_MANJ GIANT_SKINKJ CHAMELEONJ CHAMELEON_MANJGIANT_CHAMELEONJANOLEJ ANOLE_MANJ GIANT_ANOLEJIGUANAJ -IGUANA_MANJ GIANT_IGUANAJ RIVER OTTERJ SEA OTTERJ OTTER_MANJ GIANT_OTTERJSNAPPING TURTLEJALLIGATOR SNAPPING TURTLEJSNAPPING_TURTLE_MANJGIANT_SNAPPING_TURTLEJBEAVERJ -BEAVER_MANJ GIANT_BEAVERJLEECHJ LEECH_MANJ GIANT_LEECHJAXOLOTLJ AXOLOTL_MANJ GIANT_AXOLOTLJMINKJMINK_MANJ -GIANT_MINKJ POND_TURTLEJPOND_TURTLE_MANJGIANT_POND_TURTLEJRATJRAT_MANJ SQUIRREL_GRAYJSQUIRREL_GRAY_MANJGIANT_SQUIRREL_GRAYJ SQUIRREL_REDJSQUIRREL_RED_MANJGIANT_SQUIRREL_REDJCHIPMUNKJ CHIPMUNK_MANJGIANT_CHIPMUNKJHAMSTERJ HAMSTER_MANJ GIANT_HAMSTERJHEDGEHOGJ HEDGEHOG_MANJGIANT_HEDGEHOGJSQUIRREL_FLYINGJFLYING_SQUIRREL_MANJGIANT_FLYING_SQUIRRELJMUSSELJOYSTERJ FISH_SALMONJFISH_CLOWNFISHJ FISH_HAGFISHJFISH_LAMPREY_BROOKJ FISH_RAY_BATJFISH_RAY_THORNBACKJFISH_RATFISH_SPOTTEDJ FISH_HERRINGJ FISH_SHADJ FISH_ANCHOVYJFISH_TROUT_STEELHEADJ FISH_HAKEJ FISH_SEAHORSEJ FISH_GLASSEYEJFISH_PUFFER_WHITE_SPOTTEDJ FISH_SOLEJ FISH_FLOUNDERJ FISH_MACKERELJJELLYFISH_SEA_NETTLEJSQUIDJ SQUID MANJGIGANTIC SQUIDJ FISH_LUNGFISHJFISH_LOACH_CLOWNJFISH_BULLHEAD_BROWNJFISH_BULLHEAD_YELLOWJFISH_BULLHEAD_BLACKJFISH_KNIFEFISH_BANDEDJ FISH_CHARJFISH_TROUT_RAINBOWJFISH_MOLLY_SAILFINJ -FISH_GUPPYJ -FISH_PERCHJDWARFJHUMANJELFJGOBLINJKOBOLDJGREMLINJTROLLJOGREJUNICORNJDRAGONJSATYRJCOLOSSUS_BRONZEJGIANTJCYCLOPSJETTINJMINOTAURJYETIJ SASQUATCHJ BLIZZARD_MANJWOLF_ICEJFAIRYJPIXIEJBEAK_DOGJ GRIMELINGJ BLENDEC_FOULJ STRANGLERJ NIGHTWINGJHARPYJHYDRAJ MERPERSONJ SEA_SERPENTJ SEA_MONSTERJBIRD_ROCJCROCODILE_CAVEJTOAD_GIANT_CAVEJ OLM_GIANTJ BAT_GIANTJ RAT_GIANTJ RAT_LARGEJMOLE_DOG_NAKEDJ -TROGLODYTEJ -MOLE_GIANTJIMP_FIREJSPIDER_CAVE_GIANTJ SPIDER_CAVEJ FISH_CAVEJ CAVE_FISH_MANJ LOBSTER_CAVEJ -SNAKE_FIREJOLMJOLM_MANJBATJBAT_MANJMAGGOT_PURRINGJELEMENTMAN_FIREJELEMENTMAN_MAGMAJELEMENTMAN_IRONJELEMENTMAN_MUDJBIRD_SWALLOW_CAVEJCAVE_SWALLOW_MANJBIRD_SWALLOW_CAVE_GIANTJ AMPHIBIAN_MANJ REPTILE_MANJ SERPENT_MANJANT_MANJ -RODENT MANJ WILD_BOARJ WILD_BOAR_MANJGIANT_WILD_BOARJCOYOTEJ -COYOTE_MANJ GIANT_COYOTEJKANGAROOJ KANGAROO_MANJGIANT_KANGAROOJKOALAJ KOALA_MANJ GIANT_KOALAJADDERJ ADDER_MANJ GIANT_ADDERJECHIDNAJ ECHIDNA_MANJ GIANT_ECHIDNAJ PORCUPINEJ PORCUPINE_MANJGIANT_PORCUPINEJ KINGSNAKEJ KINGSNAKE_MANJGIANT_KINGSNAKEJ GRAY_LANGURJGRAY_LANGUR_MANJGIANT_GRAY_LANGURJBOBCATJ -BOBCAT_MANJ GIANT_BOBCATJSKUNKJ SKUNK_MANJ GIANT_SKUNKJGREEN_TREE_FROGJGREEN_TREE_FROG_MANJGIANT_GREEN_TREE_FROGJHAREJHARE_MANJ -GIANT_HAREJ RATTLESNAKEJRATTLESNAKE_MANJGIANT_RATTLESNAKEJWEASELJ -WEASEL_MANJ GIANT_WEASELJCOPPERHEAD_SNAKEJCOPPERHEAD_SNAKE_MANJGIANT_COPPERHEAD_SNAKEJIBEXJIBEX_MANJ -GIANT_IBEXJWOMBATJ -WOMBAT_MANJ GIANT_WOMBATJDINGOJ DINGO_MANJ GIANT_DINGOJCOATIJ COATI_MANJ GIANT_COATIJOPOSSUMJ OPOSSUM_MANJ GIANT_OPOSSUMJMONGOOSEJ MONGOOSE_MANJGIANT_MONGOOSEJHYENAJ HYENA_MANJ GIANT_HYENAJANACONDAJ ANACONDA_MANJGIANT_ANACONDAJMONITOR_LIZARDJMONITOR_LIZARD_MANJGIANT_MONITOR_LIZARDJ -KING_COBRAJKING_COBRA_MANJGIANT_KING_COBRAJOCELOTJ -OCELOT_MANJ GIANT_OCELOTJJACKALJ -JACKAL_MANJ GIANT_JACKALJCAPUCHINJ CAPUCHIN_MANJGIANT_CAPUCHINJSLOTHJ SLOTH_MANJ GIANT_SLOTHJ SPIDER_MONKEYJSPIDER_MONKEY_MANJGIANT_SPIDER_MONKEYJPANGOLINJ PANGOLIN_MANJGIANT_PANGOLINJ BLACK_MAMBAJBLACK_MAMBA_MANJGIANT_BLACK_MAMBAJ -BEAR_SLOTHJSLOTH_BEAR_MANJGIANT_SLOTH_BEARJAYE-AYEJ AYE-AYE_MANJ GIANT_AYE-AYEJ -BUSHMASTERJBUSHMASTER_MANJGIANT_BUSHMASTERJPYTHONJ -PYTHON_MANJ GIANT_PYTHONJTAPIRJ TAPIR_MANJ GIANT_TAPIRJIMPALAJ -IMPALA_MANJ GIANT_IMPALAJAARDVARKJ AARDVARK_MANJGIANT_AARDVARKJ LION_TAMARINJLION_TAMARIN_MANJGIANT_LION_TAMARINJSTOATJ STOAT_MANJ GIANT_STOATJLYNXJLYNX_MANJ -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/hair.dfstock b/data/stockpiles/hair.dfstock deleted file mode 100644 index 1aad78df1..000000000 --- a/data/stockpiles/hair.dfstock +++ /dev/null @@ -1,157 +0,0 @@ -*ÆW -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCH:TOAD:TOAD_MAN: -GIANT_TOAD:WORM:WORM_MAN: BIRD_BLUEJAY: BLUEJAY_MAN: GIANT_BLUEJAY: BIRD_CARDINAL: CARDINAL_MAN:GIANT_CARDINAL: BIRD_GRACKLE: GRACKLE_MAN: GIANT_GRACKLE: BIRD_ORIOLE: -ORIOLE_MAN: GIANT_ORIOLE:BIRD_RW_BLACKBIRD:RW_BLACKBIRD_MAN:GIANT_RW_BLACKBIRD: BIRD_PENGUIN:BIRD_PENGUIN_LITTLE:BIRD_PENGUIN_EMPEROR: PENGUIN MAN:BIRD_PENGUIN_GIANT:BIRD_FALCON_PEREGRINE:PEREGRINE FALCON MAN:GIANT PEREGRINE FALCON: BIRD_KIWI:KIWI MAN:BIRD_KIWI_GIANT: BIRD_OSTRICH: OSTRICH MAN:BIRD_OSTRICH_GIANT: BIRD_CROW:CROW_MAN: -GIANT_CROW: -BIRD_RAVEN: RAVEN_MAN: GIANT_RAVEN:BIRD_CASSOWARY: CASSOWARY_MAN:GIANT_CASSOWARY:BIRD_KEA:KEA_MAN: GIANT_KEA:BIRD_OWL_SNOWY: SNOWY_OWL_MAN:GIANT_SNOWY_OWL:SPARROW: SPARROW_MAN: GIANT_SPARROW:BIRD_STORK_WHITE:WHITE_STORK_MAN:GIANT_WHITE_STORK: BIRD_LOON:LOON_MAN: -GIANT_LOON: BIRD_OWL_BARN: BARN_OWL_MAN:GIANT_BARN_OWL: BIRD_PARAKEET: PARAKEET_MAN:GIANT_PARAKEET: BIRD_KAKAPO: -KAKAPO_MAN: GIANT_KAKAPO:BIRD_PARROT_GREY:GREY_PARROT_MAN:GIANT_GREY_PARROT: BIRD_PUFFIN: -PUFFIN_MAN: GIANT_PUFFIN: BIRD_SWAN:SWAN_MAN: -GIANT_SWAN: BIRD_LORIKEET: LORIKEET_MAN:GIANT_LORIKEET: BIRD_WREN:WREN_MAN: -GIANT_WREN: BIRD_OSPREY: -OSPREY_MAN: GIANT_OSPREY:BIRD_EMU:EMU_MAN: GIANT_EMU:BIRD_COCKATIEL: COCKATIEL_MAN:GIANT_COCKATIEL:BIRD_LOVEBIRD_PEACH-FACED:PEACH-FACED_LOVEBIRD_MAN:GIANT_PEACH-FACED_LOVEBIRD: BIRD_MAGPIE: -MAGPIE_MAN: GIANT_MAGPIE: BIRD_KESTREL: KESTREL_MAN: GIANT_KESTREL:BIRD_ALBATROSS: ALBATROSS_MAN:GIANT_ALBATROSS:BIRD_OWL_GREAT_HORNED:GREAT_HORNED_OWL_MAN:GIANT_GREAT_HORNED_OWL: -BIRD_EAGLE: EAGLE_MAN: GIANT_EAGLE: BIRD_HORNBILL: HORNBILL_MAN:GIANT_HORNBILL:BIRD_LOVEBIRD_MASKED:MASKED_LOVEBIRD_MAN:GIANT_MASKED_LOVEBIRD: BIRD_BUSHTIT: BUSHTIT_MAN: GIANT_BUSHTIT: DAMSELFLY: DAMSELFLY_MAN:GIANT_DAMSELFLY:MOTH:MOTH_MAN: -GIANT_MOTH: GRASSHOPPER:GRASSHOPPER_MAN:GIANT_GRASSHOPPER: BARK_SCORPION:BARK_SCORPION_MAN:GIANT_BARK_SCORPION:MANTIS: -MANTIS_MAN: GIANT_MANTIS:TICK:TICK_MAN: -GIANT_TICK:LOUSE: LOUSE_MAN: GIANT_LOUSE:THRIPS: -THRIPS_MAN: GIANT_THRIPS:SLUG:SLUG_MAN: -GIANT_SLUG:MOSQUITO: MOSQUITO_MAN:GIANT_MOSQUITO:SPIDER_JUMPING:JUMPING_SPIDER_MAN:GIANT_JUMPING_SPIDER:TERMITE: -MOON_SNAIL:MOON_SNAIL_MAN:GIANT_MOON_SNAIL:SPIDER_BROWN_RECLUSE:BROWN_RECLUSE_SPIDER_MAN:GIANT_BROWN_RECLUSE_SPIDER:SNAIL: SNAIL_MAN: GIANT_SNAIL: GECKO_LEOPARD:LEOPARD_GECKO_MAN:GIANT_LEOPARD_GECKO:DESERT TORTOISE:DESERT_TORTOISE_MAN:GIANT_DESERT_TORTOISE: GILA_MONSTER:GILA_MONSTER_MAN:GIANT_GILA_MONSTER:DOG:CAT:MULE:DONKEY:HORSE:COW:SHEEP:PIG:GOAT: BIRD_CHICKEN:CAVY: BIRD_DUCK: WATER_BUFFALO:REINDEER: -BIRD_GOOSE:YAK:LLAMA:ALPACA:BIRD_GUINEAFOWL:BIRD_PEAFOWL_BLUE: BIRD_TURKEY:RABBIT:CHIMERA:CENTAUR:GRIFFON:FLY:FLY_MAN: GIANT_FLY: ROACH_LARGE: ROACH_MAN: GIANT_ROACH:BEETLE: -BEETLE_MAN: GIANT_BEETLE:ANT:BUTTERFLY_MONARCH:BUTTERFLY_MONARCH_MAN:GIANT_BUTTERFLY_MONARCH:FIREFLY: FIREFLY_MAN: GIANT_FIREFLY: DRAGONFLY: DRAGONFLY_MAN:GIANT_DRAGONFLY: HONEY_BEE: BUMBLEBEE: GOAT_MOUNTAIN:GOAT_MOUNTAIN_MAN:GIANT_GOAT_MOUNTAIN: MARMOT_HOARY:MARMOT_HOARY_MAN:GIANT_MARMOT_HOARY:GNOME_MOUNTAIN: -GNOME_DARK:WALRUS: -WALRUS_MAN: GIANT_WALRUS:FISH_LAMPREY_SEA:SHARK_GREAT_WHITE: SHARK_FRILL:SHARK_SPINY_DOGFISH:SHARK_WOBBEGONG_SPOTTED: SHARK_WHALE: SHARK_BASKING: SHARK_NURSE:SHARK_MAKO_SHORTFIN:SHARK_MAKO_LONGFIN: SHARK_TIGER: -SHARK_BULL:SHARK_REEF_BLACKTIP:SHARK_REEF_WHITETIP: -SHARK_BLUE:SHARK_HAMMERHEAD: SHARK_ANGEL:FISH_SKATE_COMMON:FISH_RAY_MANTA: FISH_STINGRAY:FISH_COELACANTH: FISH_STURGEON:FISH_CONGER_EEL: FISH_MILKFISH:FISH_COD: FISH_OPAH:FISH_GROUPER_GIANT: FISH_BLUEFISH:FISH_SUNFISH_OCEAN:FISH_SWORDFISH: FISH_MARLIN: FISH_HALIBUT:FISH_BARRACUDA_GREAT:FISH_TUNA_BLUEFIN:NARWHAL: NARWHAL MAN:NARWHAL, GIANT:HIPPO: HIPPO_MAN: GIANT_HIPPO:FISH_GAR_LONGNOSE: FISH_CARP:FISH_TIGERFISH: FISH_PIKE:PLATYPUS: PLATYPUS MAN:PLATYPUS, GIANT: BEAR_GRIZZLY:BEAR_GRIZZLY_MAN:GIANT_BEAR_GRIZZLY: -BEAR_BLACK:BEAR_BLACK_MAN:GIANT_BEAR_BLACK:DEER:DEER_MAN: -GIANT_DEER:FOX:FOX_MAN: GIANT_FOX:RACCOON: RACCOON_MAN: GIANT_RACCOON:MACAQUE_RHESUS:MACAQUE_RHESUS_MAN:GIANT_MACAQUE_RHESUS:COUGAR: -COUGAR_MAN: GIANT_COUGAR:WOLF:WOLF_MAN: -GIANT_WOLF: GROUNDHOG: GROUNDHOG_MAN:GIANT_GROUNDHOG: ALLIGATOR: ALLIGATOR_MAN:GIANT_ALLIGATOR: BIRD_BUZZARD: BUZZARD_MAN: GIANT_BUZZARD:PANDA:PANDA, GIGANTIC: PANDA MAN:CAPYBARA:CAPYBARA, GIANT: CAPYBARA MAN:BADGER: -BADGER MAN: BADGER, GIANT:MOOSE: MOOSE MAN: MOOSE, GIANT: RED PANDA: RED PANDA MAN:RED PANDA, GIANT:ELEPHANT: ELEPHANT_MAN:GIANT_ELEPHANT:WARTHOG: WARTHOG_MAN: GIANT_WARTHOG:LION:LION_MAN: -GIANT_LION:LEOPARD: LEOPARD_MAN: GIANT_LEOPARD:JAGUAR: -JAGUAR_MAN: GIANT_JAGUAR:TIGER: TIGER_MAN: GIANT_TIGER:CHEETAH: CHEETAH_MAN: GIANT_CHEETAH:GAZELLE: GAZELLE_MAN: GIANT_GAZELLE:MANDRILL: MANDRILL_MAN:GIANT_MANDRILL: -CHIMPANZEE:BONOBO:GORILLA: ORANGUTAN:GIBBON_SIAMANG:GIBBON_WHITE_HANDED:GIBBON_BLACK_HANDED: GIBBON_GRAY:GIBBON_SILVERY:GIBBON_PILEATED: GIBBON_BILOU:GIBBON_WHITE_BROWED:GIBBON_BLACK_CRESTED: CAMEL_1_HUMP:CAMEL_1_HUMP_MAN:GIANT_CAMEL_1_HUMP: CAMEL_2_HUMP:CAMEL_2_HUMP_MAN:GIANT_CAMEL_2_HUMP:CROCODILE_SALTWATER:CROCODILE_SALTWATER_MAN:GIANT_CROCODILE_SALTWATER: BIRD_VULTURE: VULTURE_MAN: GIANT_VULTURE: -RHINOCEROS:RHINOCEROS_MAN:GIANT_RHINOCEROS:GIRAFFE: GIRAFFE_MAN: GIANT_GIRAFFE: HONEY BADGER:HONEY BADGER MAN:HONEY BADGER, GIANT:GIANT TORTOISE:GIANT TORTOISE MAN:GIGANTIC TORTOISE: ARMADILLO: ARMADILLO MAN:ARMADILLO, GIANT:MUSKOX: -MUSKOX_MAN: GIANT_MUSKOX:ELK:ELK_MAN: GIANT_ELK: -BEAR_POLAR:BEAR_POLAR_MAN:GIANT_BEAR_POLAR: WOLVERINE: WOLVERINE_MAN:GIANT_WOLVERINE: -CHINCHILLA:CHINCHILLA_MAN:GIANT_CHINCHILLA: FLOATING_GUTS:DRUNIAN: CREEPING_EYE:VORACIOUS_CAVE_CRAWLER:BLIND_CAVE_OGRE: -CAP_HOPPER: -MAGMA_CRAB:CRUNDLE: HUNGRY_HEAD: -FLESH_BALL:ELK_BIRD: HELMET_SNAKE:GREEN_DEVOURER:RUTHERER:CREEPY_CRAWLER:DRALTHA:GIANT_EARTHWORM: BLOOD_MAN:BUGBAT:MANERA: -MOLEMARIAN:JABBERER: POND_GRABBER:BLIND_CAVE_BEAR: CAVE_DRAGON:REACHER:ELEMENTMAN_GABBRO:GORLAK: CAVE_FLOATER:PLUMP_HELMET_MAN: CAVE_BLOB:ELEMENTMAN_AMETHYST:OCTOPUS: OCTOPUS_MAN: GIANT_OCTOPUS:CRAB:CRAB_MAN: -GIANT_CRAB: LEOPARD_SEAL:LEOPARD_SEAL_MAN:GIANT_LEOPARD_SEAL: -CUTTLEFISH:CUTTLEFISH_MAN:GIANT_CUTTLEFISH:ORCA:ORCA_MAN: -GIANT_ORCA:SPONGE: -SPONGE_MAN: GIANT_SPONGE:HORSESHOE_CRAB:HORSESHOE_CRAB_MAN:GIANT_HORSESHOE_CRAB: SPERM_WHALE:SPERM_WHALE_MAN:GIANT_SPERM_WHALE: ELEPHANT_SEAL:ELEPHANT_SEAL_MAN:GIANT_ELEPHANT_SEAL: HARP_SEAL: HARP_SEAL_MAN:GIANT_HARP_SEAL:NAUTILUS: NAUTILUS_MAN:GIANT_NAUTILUS: FOXSQUIRREL: MOGHOPPER: RAT_DEMON:WAMBLER_FLUFFY:LIZARD_RHINO_TWO_LEGGED: WORM_KNUCKLE:SPIDER_PHANTOM: FLY_ACORN: -GNAT_BLOOD:LIZARD: -LIZARD_MAN: GIANT_LIZARD:SKINK: SKINK_MAN: GIANT_SKINK: CHAMELEON: CHAMELEON_MAN:GIANT_CHAMELEON:ANOLE: ANOLE_MAN: GIANT_ANOLE:IGUANA: -IGUANA_MAN: GIANT_IGUANA: RIVER OTTER: SEA OTTER: OTTER_MAN: GIANT_OTTER:SNAPPING TURTLE:ALLIGATOR SNAPPING TURTLE:SNAPPING_TURTLE_MAN:GIANT_SNAPPING_TURTLE:BEAVER: -BEAVER_MAN: GIANT_BEAVER:LEECH: LEECH_MAN: GIANT_LEECH:AXOLOTL: AXOLOTL_MAN: GIANT_AXOLOTL:MINK:MINK_MAN: -GIANT_MINK: POND_TURTLE:POND_TURTLE_MAN:GIANT_POND_TURTLE:RAT:RAT_MAN: SQUIRREL_GRAY:SQUIRREL_GRAY_MAN:GIANT_SQUIRREL_GRAY: SQUIRREL_RED:SQUIRREL_RED_MAN:GIANT_SQUIRREL_RED:CHIPMUNK: CHIPMUNK_MAN:GIANT_CHIPMUNK:HAMSTER: HAMSTER_MAN: GIANT_HAMSTER:HEDGEHOG: HEDGEHOG_MAN:GIANT_HEDGEHOG:SQUIRREL_FLYING:FLYING_SQUIRREL_MAN:GIANT_FLYING_SQUIRREL:MUSSEL:OYSTER: FISH_SALMON:FISH_CLOWNFISH: FISH_HAGFISH:FISH_LAMPREY_BROOK: FISH_RAY_BAT:FISH_RAY_THORNBACK:FISH_RATFISH_SPOTTED: FISH_HERRING: FISH_SHAD: FISH_ANCHOVY:FISH_TROUT_STEELHEAD: FISH_HAKE: FISH_SEAHORSE: FISH_GLASSEYE:FISH_PUFFER_WHITE_SPOTTED: FISH_SOLE: FISH_FLOUNDER: FISH_MACKEREL:JELLYFISH_SEA_NETTLE:SQUID: SQUID MAN:GIGANTIC SQUID: FISH_LUNGFISH:FISH_LOACH_CLOWN:FISH_BULLHEAD_BROWN:FISH_BULLHEAD_YELLOW:FISH_BULLHEAD_BLACK:FISH_KNIFEFISH_BANDED: FISH_CHAR:FISH_TROUT_RAINBOW:FISH_MOLLY_SAILFIN: -FISH_GUPPY: -FISH_PERCH:DWARF:HUMAN:ELF:GOBLIN:KOBOLD:GREMLIN:TROLL:OGRE:UNICORN:DRAGON:SATYR:COLOSSUS_BRONZE:GIANT:CYCLOPS:ETTIN:MINOTAUR:YETI: SASQUATCH: BLIZZARD_MAN:WOLF_ICE:FAIRY:PIXIE:BEAK_DOG: GRIMELING: BLENDEC_FOUL: STRANGLER: NIGHTWING:HARPY:HYDRA: MERPERSON: SEA_SERPENT: SEA_MONSTER:BIRD_ROC:CROCODILE_CAVE:TOAD_GIANT_CAVE: OLM_GIANT: BAT_GIANT: RAT_GIANT: RAT_LARGE:MOLE_DOG_NAKED: -TROGLODYTE: -MOLE_GIANT:IMP_FIRE:SPIDER_CAVE_GIANT: SPIDER_CAVE: FISH_CAVE: CAVE_FISH_MAN: LOBSTER_CAVE: -SNAKE_FIRE:OLM:OLM_MAN:BAT:BAT_MAN:MAGGOT_PURRING:ELEMENTMAN_FIRE:ELEMENTMAN_MAGMA:ELEMENTMAN_IRON:ELEMENTMAN_MUD:BIRD_SWALLOW_CAVE:CAVE_SWALLOW_MAN:BIRD_SWALLOW_CAVE_GIANT: AMPHIBIAN_MAN: REPTILE_MAN: SERPENT_MAN:ANT_MAN: -RODENT MAN: WILD_BOAR: WILD_BOAR_MAN:GIANT_WILD_BOAR:COYOTE: -COYOTE_MAN: GIANT_COYOTE:KANGAROO: KANGAROO_MAN:GIANT_KANGAROO:KOALA: KOALA_MAN: GIANT_KOALA:ADDER: ADDER_MAN: GIANT_ADDER:ECHIDNA: ECHIDNA_MAN: GIANT_ECHIDNA: PORCUPINE: PORCUPINE_MAN:GIANT_PORCUPINE: KINGSNAKE: KINGSNAKE_MAN:GIANT_KINGSNAKE: GRAY_LANGUR:GRAY_LANGUR_MAN:GIANT_GRAY_LANGUR:BOBCAT: -BOBCAT_MAN: GIANT_BOBCAT:SKUNK: SKUNK_MAN: GIANT_SKUNK:GREEN_TREE_FROG:GREEN_TREE_FROG_MAN:GIANT_GREEN_TREE_FROG:HARE:HARE_MAN: -GIANT_HARE: RATTLESNAKE:RATTLESNAKE_MAN:GIANT_RATTLESNAKE:WEASEL: -WEASEL_MAN: GIANT_WEASEL:COPPERHEAD_SNAKE:COPPERHEAD_SNAKE_MAN:GIANT_COPPERHEAD_SNAKE:IBEX:IBEX_MAN: -GIANT_IBEX:WOMBAT: -WOMBAT_MAN: GIANT_WOMBAT:DINGO: DINGO_MAN: GIANT_DINGO:COATI: COATI_MAN: GIANT_COATI:OPOSSUM: OPOSSUM_MAN: GIANT_OPOSSUM:MONGOOSE: MONGOOSE_MAN:GIANT_MONGOOSE:HYENA: HYENA_MAN: GIANT_HYENA:ANACONDA: ANACONDA_MAN:GIANT_ANACONDA:MONITOR_LIZARD:MONITOR_LIZARD_MAN:GIANT_MONITOR_LIZARD: -KING_COBRA:KING_COBRA_MAN:GIANT_KING_COBRA:OCELOT: -OCELOT_MAN: GIANT_OCELOT:JACKAL: -JACKAL_MAN: GIANT_JACKAL:CAPUCHIN: CAPUCHIN_MAN:GIANT_CAPUCHIN:SLOTH: SLOTH_MAN: GIANT_SLOTH: SPIDER_MONKEY:SPIDER_MONKEY_MAN:GIANT_SPIDER_MONKEY:PANGOLIN: PANGOLIN_MAN:GIANT_PANGOLIN: BLACK_MAMBA:BLACK_MAMBA_MAN:GIANT_BLACK_MAMBA: -BEAR_SLOTH:SLOTH_BEAR_MAN:GIANT_SLOTH_BEAR:AYE-AYE: AYE-AYE_MAN: GIANT_AYE-AYE: -BUSHMASTER:BUSHMASTER_MAN:GIANT_BUSHMASTER:PYTHON: -PYTHON_MAN: GIANT_PYTHON:TAPIR: TAPIR_MAN: GIANT_TAPIR:IMPALA: -IMPALA_MAN: GIANT_IMPALA:AARDVARK: AARDVARK_MAN:GIANT_AARDVARK: LION_TAMARIN:LION_TAMARIN_MAN:GIANT_LION_TAMARIN:STOAT: STOAT_MAN: GIANT_STOAT:LYNX:LYNX_MAN: -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/horns.dfstock b/data/stockpiles/horns.dfstock deleted file mode 100644 index 44726daa047e31f19d1fe00209f5029460d8e174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmXw1F_POb43x%_Y{R+C6 z{o7Nwt4`ESs)??%L$GiWI*l?>Z&tSHxdrNH$N5gfqN9^SWJ4}#^AZZ3ihiYGw_(zq zI>U?5Fmg)buy5vG(>Ykrt|X4s7e)&jjLx$SG~~i%L%a(|1rR3>Hho@IGG13J4ir~$ z9_UWraeEr|0}C%$(1IQ%=o2QQXPd<4PG`e-2K;5V%a(AYf&EtbpRbq^6%1@n9C-t)p`i&yY`@7cSJzHm?;SuSepYhIdIGq)riaeHNKA z_0cf~b<1}f4$ur3@2AJzu>iQNG?X<7*P%N_*cUAoF`_Jk2h_x>Xn5N!`qPWy!f|sY zazet($j(^|;2B=Cl|>%HzWjfIB;D5vajh;q6EF2>)Wehsitlubx=)f0Z?l0zt4J0o zte@oOEWoGdQ)d(sJJ>Noh>db&F~!2Z+sehPhk;KpaY^+%^>3S`Kv!>_%SEdVIXa7p z3?^+zr_Uhrs6R#th`XZdsLPH=I?1w7H>%$2rw~kafG^03%}4XCZNInekGA>QHow~D Jcia4Fn}2%@sj2_~ diff --git a/data/stockpiles/shells.dfstock b/data/stockpiles/shells.dfstock deleted file mode 100644 index 548152764..000000000 --- a/data/stockpiles/shells.dfstock +++ /dev/null @@ -1,157 +0,0 @@ -*ÆW -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCHBTOADBTOAD_MANB -GIANT_TOADBWORMBWORM_MANB BIRD_BLUEJAYB BLUEJAY_MANB GIANT_BLUEJAYB BIRD_CARDINALB CARDINAL_MANBGIANT_CARDINALB BIRD_GRACKLEB GRACKLE_MANB GIANT_GRACKLEB BIRD_ORIOLEB -ORIOLE_MANB GIANT_ORIOLEBBIRD_RW_BLACKBIRDBRW_BLACKBIRD_MANBGIANT_RW_BLACKBIRDB BIRD_PENGUINBBIRD_PENGUIN_LITTLEBBIRD_PENGUIN_EMPERORB PENGUIN MANBBIRD_PENGUIN_GIANTBBIRD_FALCON_PEREGRINEBPEREGRINE FALCON MANBGIANT PEREGRINE FALCONB BIRD_KIWIBKIWI MANBBIRD_KIWI_GIANTB BIRD_OSTRICHB OSTRICH MANBBIRD_OSTRICH_GIANTB BIRD_CROWBCROW_MANB -GIANT_CROWB -BIRD_RAVENB RAVEN_MANB GIANT_RAVENBBIRD_CASSOWARYB CASSOWARY_MANBGIANT_CASSOWARYBBIRD_KEABKEA_MANB GIANT_KEABBIRD_OWL_SNOWYB SNOWY_OWL_MANBGIANT_SNOWY_OWLBSPARROWB SPARROW_MANB GIANT_SPARROWBBIRD_STORK_WHITEBWHITE_STORK_MANBGIANT_WHITE_STORKB BIRD_LOONBLOON_MANB -GIANT_LOONB BIRD_OWL_BARNB BARN_OWL_MANBGIANT_BARN_OWLB BIRD_PARAKEETB PARAKEET_MANBGIANT_PARAKEETB BIRD_KAKAPOB -KAKAPO_MANB GIANT_KAKAPOBBIRD_PARROT_GREYBGREY_PARROT_MANBGIANT_GREY_PARROTB BIRD_PUFFINB -PUFFIN_MANB GIANT_PUFFINB BIRD_SWANBSWAN_MANB -GIANT_SWANB BIRD_LORIKEETB LORIKEET_MANBGIANT_LORIKEETB BIRD_WRENBWREN_MANB -GIANT_WRENB BIRD_OSPREYB -OSPREY_MANB GIANT_OSPREYBBIRD_EMUBEMU_MANB GIANT_EMUBBIRD_COCKATIELB COCKATIEL_MANBGIANT_COCKATIELBBIRD_LOVEBIRD_PEACH-FACEDBPEACH-FACED_LOVEBIRD_MANBGIANT_PEACH-FACED_LOVEBIRDB BIRD_MAGPIEB -MAGPIE_MANB GIANT_MAGPIEB BIRD_KESTRELB KESTREL_MANB GIANT_KESTRELBBIRD_ALBATROSSB ALBATROSS_MANBGIANT_ALBATROSSBBIRD_OWL_GREAT_HORNEDBGREAT_HORNED_OWL_MANBGIANT_GREAT_HORNED_OWLB -BIRD_EAGLEB EAGLE_MANB GIANT_EAGLEB BIRD_HORNBILLB HORNBILL_MANBGIANT_HORNBILLBBIRD_LOVEBIRD_MASKEDBMASKED_LOVEBIRD_MANBGIANT_MASKED_LOVEBIRDB BIRD_BUSHTITB BUSHTIT_MANB GIANT_BUSHTITB DAMSELFLYB DAMSELFLY_MANBGIANT_DAMSELFLYBMOTHBMOTH_MANB -GIANT_MOTHB GRASSHOPPERBGRASSHOPPER_MANBGIANT_GRASSHOPPERB BARK_SCORPIONBBARK_SCORPION_MANBGIANT_BARK_SCORPIONBMANTISB -MANTIS_MANB GIANT_MANTISBTICKBTICK_MANB -GIANT_TICKBLOUSEB LOUSE_MANB GIANT_LOUSEBTHRIPSB -THRIPS_MANB GIANT_THRIPSBSLUGBSLUG_MANB -GIANT_SLUGBMOSQUITOB MOSQUITO_MANBGIANT_MOSQUITOBSPIDER_JUMPINGBJUMPING_SPIDER_MANBGIANT_JUMPING_SPIDERBTERMITEB -MOON_SNAILBMOON_SNAIL_MANBGIANT_MOON_SNAILBSPIDER_BROWN_RECLUSEBBROWN_RECLUSE_SPIDER_MANBGIANT_BROWN_RECLUSE_SPIDERBSNAILB SNAIL_MANB GIANT_SNAILB GECKO_LEOPARDBLEOPARD_GECKO_MANBGIANT_LEOPARD_GECKOBDESERT TORTOISEBDESERT_TORTOISE_MANBGIANT_DESERT_TORTOISEB GILA_MONSTERBGILA_MONSTER_MANBGIANT_GILA_MONSTERBDOGBCATBMULEBDONKEYBHORSEBCOWBSHEEPBPIGBGOATB BIRD_CHICKENBCAVYB BIRD_DUCKB WATER_BUFFALOBREINDEERB -BIRD_GOOSEBYAKBLLAMABALPACABBIRD_GUINEAFOWLBBIRD_PEAFOWL_BLUEB BIRD_TURKEYBRABBITBCHIMERABCENTAURBGRIFFONBFLYBFLY_MANB GIANT_FLYB ROACH_LARGEB ROACH_MANB GIANT_ROACHBBEETLEB -BEETLE_MANB GIANT_BEETLEBANTBBUTTERFLY_MONARCHBBUTTERFLY_MONARCH_MANBGIANT_BUTTERFLY_MONARCHBFIREFLYB FIREFLY_MANB GIANT_FIREFLYB DRAGONFLYB DRAGONFLY_MANBGIANT_DRAGONFLYB HONEY_BEEB BUMBLEBEEB GOAT_MOUNTAINBGOAT_MOUNTAIN_MANBGIANT_GOAT_MOUNTAINB MARMOT_HOARYBMARMOT_HOARY_MANBGIANT_MARMOT_HOARYBGNOME_MOUNTAINB -GNOME_DARKBWALRUSB -WALRUS_MANB GIANT_WALRUSBFISH_LAMPREY_SEABSHARK_GREAT_WHITEB SHARK_FRILLBSHARK_SPINY_DOGFISHBSHARK_WOBBEGONG_SPOTTEDB SHARK_WHALEB SHARK_BASKINGB SHARK_NURSEBSHARK_MAKO_SHORTFINBSHARK_MAKO_LONGFINB SHARK_TIGERB -SHARK_BULLBSHARK_REEF_BLACKTIPBSHARK_REEF_WHITETIPB -SHARK_BLUEBSHARK_HAMMERHEADB SHARK_ANGELBFISH_SKATE_COMMONBFISH_RAY_MANTAB FISH_STINGRAYBFISH_COELACANTHB FISH_STURGEONBFISH_CONGER_EELB FISH_MILKFISHBFISH_CODB FISH_OPAHBFISH_GROUPER_GIANTB FISH_BLUEFISHBFISH_SUNFISH_OCEANBFISH_SWORDFISHB FISH_MARLINB FISH_HALIBUTBFISH_BARRACUDA_GREATBFISH_TUNA_BLUEFINBNARWHALB NARWHAL MANBNARWHAL, GIANTBHIPPOB HIPPO_MANB GIANT_HIPPOBFISH_GAR_LONGNOSEB FISH_CARPBFISH_TIGERFISHB FISH_PIKEBPLATYPUSB PLATYPUS MANBPLATYPUS, GIANTB BEAR_GRIZZLYBBEAR_GRIZZLY_MANBGIANT_BEAR_GRIZZLYB -BEAR_BLACKBBEAR_BLACK_MANBGIANT_BEAR_BLACKBDEERBDEER_MANB -GIANT_DEERBFOXBFOX_MANB GIANT_FOXBRACCOONB RACCOON_MANB GIANT_RACCOONBMACAQUE_RHESUSBMACAQUE_RHESUS_MANBGIANT_MACAQUE_RHESUSBCOUGARB -COUGAR_MANB GIANT_COUGARBWOLFBWOLF_MANB -GIANT_WOLFB GROUNDHOGB GROUNDHOG_MANBGIANT_GROUNDHOGB ALLIGATORB ALLIGATOR_MANBGIANT_ALLIGATORB BIRD_BUZZARDB BUZZARD_MANB GIANT_BUZZARDBPANDABPANDA, GIGANTICB PANDA MANBCAPYBARABCAPYBARA, GIANTB CAPYBARA MANBBADGERB -BADGER MANB BADGER, GIANTBMOOSEB MOOSE MANB MOOSE, GIANTB RED PANDAB RED PANDA MANBRED PANDA, GIANTBELEPHANTB ELEPHANT_MANBGIANT_ELEPHANTBWARTHOGB WARTHOG_MANB GIANT_WARTHOGBLIONBLION_MANB -GIANT_LIONBLEOPARDB LEOPARD_MANB GIANT_LEOPARDBJAGUARB -JAGUAR_MANB GIANT_JAGUARBTIGERB TIGER_MANB GIANT_TIGERBCHEETAHB CHEETAH_MANB GIANT_CHEETAHBGAZELLEB GAZELLE_MANB GIANT_GAZELLEBMANDRILLB MANDRILL_MANBGIANT_MANDRILLB -CHIMPANZEEBBONOBOBGORILLAB ORANGUTANBGIBBON_SIAMANGBGIBBON_WHITE_HANDEDBGIBBON_BLACK_HANDEDB GIBBON_GRAYBGIBBON_SILVERYBGIBBON_PILEATEDB GIBBON_BILOUBGIBBON_WHITE_BROWEDBGIBBON_BLACK_CRESTEDB CAMEL_1_HUMPBCAMEL_1_HUMP_MANBGIANT_CAMEL_1_HUMPB CAMEL_2_HUMPBCAMEL_2_HUMP_MANBGIANT_CAMEL_2_HUMPBCROCODILE_SALTWATERBCROCODILE_SALTWATER_MANBGIANT_CROCODILE_SALTWATERB BIRD_VULTUREB VULTURE_MANB GIANT_VULTUREB -RHINOCEROSBRHINOCEROS_MANBGIANT_RHINOCEROSBGIRAFFEB GIRAFFE_MANB GIANT_GIRAFFEB HONEY BADGERBHONEY BADGER MANBHONEY BADGER, GIANTBGIANT TORTOISEBGIANT TORTOISE MANBGIGANTIC TORTOISEB ARMADILLOB ARMADILLO MANBARMADILLO, GIANTBMUSKOXB -MUSKOX_MANB GIANT_MUSKOXBELKBELK_MANB GIANT_ELKB -BEAR_POLARBBEAR_POLAR_MANBGIANT_BEAR_POLARB WOLVERINEB WOLVERINE_MANBGIANT_WOLVERINEB -CHINCHILLABCHINCHILLA_MANBGIANT_CHINCHILLAB FLOATING_GUTSBDRUNIANB CREEPING_EYEBVORACIOUS_CAVE_CRAWLERBBLIND_CAVE_OGREB -CAP_HOPPERB -MAGMA_CRABBCRUNDLEB HUNGRY_HEADB -FLESH_BALLBELK_BIRDB HELMET_SNAKEBGREEN_DEVOURERBRUTHERERBCREEPY_CRAWLERBDRALTHABGIANT_EARTHWORMB BLOOD_MANBBUGBATBMANERAB -MOLEMARIANBJABBERERB POND_GRABBERBBLIND_CAVE_BEARB CAVE_DRAGONBREACHERBELEMENTMAN_GABBROBGORLAKB CAVE_FLOATERBPLUMP_HELMET_MANB CAVE_BLOBBELEMENTMAN_AMETHYSTBOCTOPUSB OCTOPUS_MANB GIANT_OCTOPUSBCRABBCRAB_MANB -GIANT_CRABB LEOPARD_SEALBLEOPARD_SEAL_MANBGIANT_LEOPARD_SEALB -CUTTLEFISHBCUTTLEFISH_MANBGIANT_CUTTLEFISHBORCABORCA_MANB -GIANT_ORCABSPONGEB -SPONGE_MANB GIANT_SPONGEBHORSESHOE_CRABBHORSESHOE_CRAB_MANBGIANT_HORSESHOE_CRABB SPERM_WHALEBSPERM_WHALE_MANBGIANT_SPERM_WHALEB ELEPHANT_SEALBELEPHANT_SEAL_MANBGIANT_ELEPHANT_SEALB HARP_SEALB HARP_SEAL_MANBGIANT_HARP_SEALBNAUTILUSB NAUTILUS_MANBGIANT_NAUTILUSB FOXSQUIRRELB MOGHOPPERB RAT_DEMONBWAMBLER_FLUFFYBLIZARD_RHINO_TWO_LEGGEDB WORM_KNUCKLEBSPIDER_PHANTOMB FLY_ACORNB -GNAT_BLOODBLIZARDB -LIZARD_MANB GIANT_LIZARDBSKINKB SKINK_MANB GIANT_SKINKB CHAMELEONB CHAMELEON_MANBGIANT_CHAMELEONBANOLEB ANOLE_MANB GIANT_ANOLEBIGUANAB -IGUANA_MANB GIANT_IGUANAB RIVER OTTERB SEA OTTERB OTTER_MANB GIANT_OTTERBSNAPPING TURTLEBALLIGATOR SNAPPING TURTLEBSNAPPING_TURTLE_MANBGIANT_SNAPPING_TURTLEBBEAVERB -BEAVER_MANB GIANT_BEAVERBLEECHB LEECH_MANB GIANT_LEECHBAXOLOTLB AXOLOTL_MANB GIANT_AXOLOTLBMINKBMINK_MANB -GIANT_MINKB POND_TURTLEBPOND_TURTLE_MANBGIANT_POND_TURTLEBRATBRAT_MANB SQUIRREL_GRAYBSQUIRREL_GRAY_MANBGIANT_SQUIRREL_GRAYB SQUIRREL_REDBSQUIRREL_RED_MANBGIANT_SQUIRREL_REDBCHIPMUNKB CHIPMUNK_MANBGIANT_CHIPMUNKBHAMSTERB HAMSTER_MANB GIANT_HAMSTERBHEDGEHOGB HEDGEHOG_MANBGIANT_HEDGEHOGBSQUIRREL_FLYINGBFLYING_SQUIRREL_MANBGIANT_FLYING_SQUIRRELBMUSSELBOYSTERB FISH_SALMONBFISH_CLOWNFISHB FISH_HAGFISHBFISH_LAMPREY_BROOKB FISH_RAY_BATBFISH_RAY_THORNBACKBFISH_RATFISH_SPOTTEDB FISH_HERRINGB FISH_SHADB FISH_ANCHOVYBFISH_TROUT_STEELHEADB FISH_HAKEB FISH_SEAHORSEB FISH_GLASSEYEBFISH_PUFFER_WHITE_SPOTTEDB FISH_SOLEB FISH_FLOUNDERB FISH_MACKERELBJELLYFISH_SEA_NETTLEBSQUIDB SQUID MANBGIGANTIC SQUIDB FISH_LUNGFISHBFISH_LOACH_CLOWNBFISH_BULLHEAD_BROWNBFISH_BULLHEAD_YELLOWBFISH_BULLHEAD_BLACKBFISH_KNIFEFISH_BANDEDB FISH_CHARBFISH_TROUT_RAINBOWBFISH_MOLLY_SAILFINB -FISH_GUPPYB -FISH_PERCHBDWARFBHUMANBELFBGOBLINBKOBOLDBGREMLINBTROLLBOGREBUNICORNBDRAGONBSATYRBCOLOSSUS_BRONZEBGIANTBCYCLOPSBETTINBMINOTAURBYETIB SASQUATCHB BLIZZARD_MANBWOLF_ICEBFAIRYBPIXIEBBEAK_DOGB GRIMELINGB BLENDEC_FOULB STRANGLERB NIGHTWINGBHARPYBHYDRAB MERPERSONB SEA_SERPENTB SEA_MONSTERBBIRD_ROCBCROCODILE_CAVEBTOAD_GIANT_CAVEB OLM_GIANTB BAT_GIANTB RAT_GIANTB RAT_LARGEBMOLE_DOG_NAKEDB -TROGLODYTEB -MOLE_GIANTBIMP_FIREBSPIDER_CAVE_GIANTB SPIDER_CAVEB FISH_CAVEB CAVE_FISH_MANB LOBSTER_CAVEB -SNAKE_FIREBOLMBOLM_MANBBATBBAT_MANBMAGGOT_PURRINGBELEMENTMAN_FIREBELEMENTMAN_MAGMABELEMENTMAN_IRONBELEMENTMAN_MUDBBIRD_SWALLOW_CAVEBCAVE_SWALLOW_MANBBIRD_SWALLOW_CAVE_GIANTB AMPHIBIAN_MANB REPTILE_MANB SERPENT_MANBANT_MANB -RODENT MANB WILD_BOARB WILD_BOAR_MANBGIANT_WILD_BOARBCOYOTEB -COYOTE_MANB GIANT_COYOTEBKANGAROOB KANGAROO_MANBGIANT_KANGAROOBKOALAB KOALA_MANB GIANT_KOALABADDERB ADDER_MANB GIANT_ADDERBECHIDNAB ECHIDNA_MANB GIANT_ECHIDNAB PORCUPINEB PORCUPINE_MANBGIANT_PORCUPINEB KINGSNAKEB KINGSNAKE_MANBGIANT_KINGSNAKEB GRAY_LANGURBGRAY_LANGUR_MANBGIANT_GRAY_LANGURBBOBCATB -BOBCAT_MANB GIANT_BOBCATBSKUNKB SKUNK_MANB GIANT_SKUNKBGREEN_TREE_FROGBGREEN_TREE_FROG_MANBGIANT_GREEN_TREE_FROGBHAREBHARE_MANB -GIANT_HAREB RATTLESNAKEBRATTLESNAKE_MANBGIANT_RATTLESNAKEBWEASELB -WEASEL_MANB GIANT_WEASELBCOPPERHEAD_SNAKEBCOPPERHEAD_SNAKE_MANBGIANT_COPPERHEAD_SNAKEBIBEXBIBEX_MANB -GIANT_IBEXBWOMBATB -WOMBAT_MANB GIANT_WOMBATBDINGOB DINGO_MANB GIANT_DINGOBCOATIB COATI_MANB GIANT_COATIBOPOSSUMB OPOSSUM_MANB GIANT_OPOSSUMBMONGOOSEB MONGOOSE_MANBGIANT_MONGOOSEBHYENAB HYENA_MANB GIANT_HYENABANACONDAB ANACONDA_MANBGIANT_ANACONDABMONITOR_LIZARDBMONITOR_LIZARD_MANBGIANT_MONITOR_LIZARDB -KING_COBRABKING_COBRA_MANBGIANT_KING_COBRABOCELOTB -OCELOT_MANB GIANT_OCELOTBJACKALB -JACKAL_MANB GIANT_JACKALBCAPUCHINB CAPUCHIN_MANBGIANT_CAPUCHINBSLOTHB SLOTH_MANB GIANT_SLOTHB SPIDER_MONKEYBSPIDER_MONKEY_MANBGIANT_SPIDER_MONKEYBPANGOLINB PANGOLIN_MANBGIANT_PANGOLINB BLACK_MAMBABBLACK_MAMBA_MANBGIANT_BLACK_MAMBAB -BEAR_SLOTHBSLOTH_BEAR_MANBGIANT_SLOTH_BEARBAYE-AYEB AYE-AYE_MANB GIANT_AYE-AYEB -BUSHMASTERBBUSHMASTER_MANBGIANT_BUSHMASTERBPYTHONB -PYTHON_MANB GIANT_PYTHONBTAPIRB TAPIR_MANB GIANT_TAPIRBIMPALAB -IMPALA_MANB GIANT_IMPALABAARDVARKB AARDVARK_MANBGIANT_AARDVARKB LION_TAMARINBLION_TAMARIN_MANBGIANT_LION_TAMARINBSTOATB STOAT_MANB GIANT_STOATBLYNXBLYNX_MANB -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/skulls.dfstock b/data/stockpiles/skulls.dfstock deleted file mode 100644 index ae52e4537..000000000 --- a/data/stockpiles/skulls.dfstock +++ /dev/null @@ -1,157 +0,0 @@ -*ÆW -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCH*TOAD*TOAD_MAN* -GIANT_TOAD*WORM*WORM_MAN* BIRD_BLUEJAY* BLUEJAY_MAN* GIANT_BLUEJAY* BIRD_CARDINAL* CARDINAL_MAN*GIANT_CARDINAL* BIRD_GRACKLE* GRACKLE_MAN* GIANT_GRACKLE* BIRD_ORIOLE* -ORIOLE_MAN* GIANT_ORIOLE*BIRD_RW_BLACKBIRD*RW_BLACKBIRD_MAN*GIANT_RW_BLACKBIRD* BIRD_PENGUIN*BIRD_PENGUIN_LITTLE*BIRD_PENGUIN_EMPEROR* PENGUIN MAN*BIRD_PENGUIN_GIANT*BIRD_FALCON_PEREGRINE*PEREGRINE FALCON MAN*GIANT PEREGRINE FALCON* BIRD_KIWI*KIWI MAN*BIRD_KIWI_GIANT* BIRD_OSTRICH* OSTRICH MAN*BIRD_OSTRICH_GIANT* BIRD_CROW*CROW_MAN* -GIANT_CROW* -BIRD_RAVEN* RAVEN_MAN* GIANT_RAVEN*BIRD_CASSOWARY* CASSOWARY_MAN*GIANT_CASSOWARY*BIRD_KEA*KEA_MAN* GIANT_KEA*BIRD_OWL_SNOWY* SNOWY_OWL_MAN*GIANT_SNOWY_OWL*SPARROW* SPARROW_MAN* GIANT_SPARROW*BIRD_STORK_WHITE*WHITE_STORK_MAN*GIANT_WHITE_STORK* BIRD_LOON*LOON_MAN* -GIANT_LOON* BIRD_OWL_BARN* BARN_OWL_MAN*GIANT_BARN_OWL* BIRD_PARAKEET* PARAKEET_MAN*GIANT_PARAKEET* BIRD_KAKAPO* -KAKAPO_MAN* GIANT_KAKAPO*BIRD_PARROT_GREY*GREY_PARROT_MAN*GIANT_GREY_PARROT* BIRD_PUFFIN* -PUFFIN_MAN* GIANT_PUFFIN* BIRD_SWAN*SWAN_MAN* -GIANT_SWAN* BIRD_LORIKEET* LORIKEET_MAN*GIANT_LORIKEET* BIRD_WREN*WREN_MAN* -GIANT_WREN* BIRD_OSPREY* -OSPREY_MAN* GIANT_OSPREY*BIRD_EMU*EMU_MAN* GIANT_EMU*BIRD_COCKATIEL* COCKATIEL_MAN*GIANT_COCKATIEL*BIRD_LOVEBIRD_PEACH-FACED*PEACH-FACED_LOVEBIRD_MAN*GIANT_PEACH-FACED_LOVEBIRD* BIRD_MAGPIE* -MAGPIE_MAN* GIANT_MAGPIE* BIRD_KESTREL* KESTREL_MAN* GIANT_KESTREL*BIRD_ALBATROSS* ALBATROSS_MAN*GIANT_ALBATROSS*BIRD_OWL_GREAT_HORNED*GREAT_HORNED_OWL_MAN*GIANT_GREAT_HORNED_OWL* -BIRD_EAGLE* EAGLE_MAN* GIANT_EAGLE* BIRD_HORNBILL* HORNBILL_MAN*GIANT_HORNBILL*BIRD_LOVEBIRD_MASKED*MASKED_LOVEBIRD_MAN*GIANT_MASKED_LOVEBIRD* BIRD_BUSHTIT* BUSHTIT_MAN* GIANT_BUSHTIT* DAMSELFLY* DAMSELFLY_MAN*GIANT_DAMSELFLY*MOTH*MOTH_MAN* -GIANT_MOTH* GRASSHOPPER*GRASSHOPPER_MAN*GIANT_GRASSHOPPER* BARK_SCORPION*BARK_SCORPION_MAN*GIANT_BARK_SCORPION*MANTIS* -MANTIS_MAN* GIANT_MANTIS*TICK*TICK_MAN* -GIANT_TICK*LOUSE* LOUSE_MAN* GIANT_LOUSE*THRIPS* -THRIPS_MAN* GIANT_THRIPS*SLUG*SLUG_MAN* -GIANT_SLUG*MOSQUITO* MOSQUITO_MAN*GIANT_MOSQUITO*SPIDER_JUMPING*JUMPING_SPIDER_MAN*GIANT_JUMPING_SPIDER*TERMITE* -MOON_SNAIL*MOON_SNAIL_MAN*GIANT_MOON_SNAIL*SPIDER_BROWN_RECLUSE*BROWN_RECLUSE_SPIDER_MAN*GIANT_BROWN_RECLUSE_SPIDER*SNAIL* SNAIL_MAN* GIANT_SNAIL* GECKO_LEOPARD*LEOPARD_GECKO_MAN*GIANT_LEOPARD_GECKO*DESERT TORTOISE*DESERT_TORTOISE_MAN*GIANT_DESERT_TORTOISE* GILA_MONSTER*GILA_MONSTER_MAN*GIANT_GILA_MONSTER*DOG*CAT*MULE*DONKEY*HORSE*COW*SHEEP*PIG*GOAT* BIRD_CHICKEN*CAVY* BIRD_DUCK* WATER_BUFFALO*REINDEER* -BIRD_GOOSE*YAK*LLAMA*ALPACA*BIRD_GUINEAFOWL*BIRD_PEAFOWL_BLUE* BIRD_TURKEY*RABBIT*CHIMERA*CENTAUR*GRIFFON*FLY*FLY_MAN* GIANT_FLY* ROACH_LARGE* ROACH_MAN* GIANT_ROACH*BEETLE* -BEETLE_MAN* GIANT_BEETLE*ANT*BUTTERFLY_MONARCH*BUTTERFLY_MONARCH_MAN*GIANT_BUTTERFLY_MONARCH*FIREFLY* FIREFLY_MAN* GIANT_FIREFLY* DRAGONFLY* DRAGONFLY_MAN*GIANT_DRAGONFLY* HONEY_BEE* BUMBLEBEE* GOAT_MOUNTAIN*GOAT_MOUNTAIN_MAN*GIANT_GOAT_MOUNTAIN* MARMOT_HOARY*MARMOT_HOARY_MAN*GIANT_MARMOT_HOARY*GNOME_MOUNTAIN* -GNOME_DARK*WALRUS* -WALRUS_MAN* GIANT_WALRUS*FISH_LAMPREY_SEA*SHARK_GREAT_WHITE* SHARK_FRILL*SHARK_SPINY_DOGFISH*SHARK_WOBBEGONG_SPOTTED* SHARK_WHALE* SHARK_BASKING* SHARK_NURSE*SHARK_MAKO_SHORTFIN*SHARK_MAKO_LONGFIN* SHARK_TIGER* -SHARK_BULL*SHARK_REEF_BLACKTIP*SHARK_REEF_WHITETIP* -SHARK_BLUE*SHARK_HAMMERHEAD* SHARK_ANGEL*FISH_SKATE_COMMON*FISH_RAY_MANTA* FISH_STINGRAY*FISH_COELACANTH* FISH_STURGEON*FISH_CONGER_EEL* FISH_MILKFISH*FISH_COD* FISH_OPAH*FISH_GROUPER_GIANT* FISH_BLUEFISH*FISH_SUNFISH_OCEAN*FISH_SWORDFISH* FISH_MARLIN* FISH_HALIBUT*FISH_BARRACUDA_GREAT*FISH_TUNA_BLUEFIN*NARWHAL* NARWHAL MAN*NARWHAL, GIANT*HIPPO* HIPPO_MAN* GIANT_HIPPO*FISH_GAR_LONGNOSE* FISH_CARP*FISH_TIGERFISH* FISH_PIKE*PLATYPUS* PLATYPUS MAN*PLATYPUS, GIANT* BEAR_GRIZZLY*BEAR_GRIZZLY_MAN*GIANT_BEAR_GRIZZLY* -BEAR_BLACK*BEAR_BLACK_MAN*GIANT_BEAR_BLACK*DEER*DEER_MAN* -GIANT_DEER*FOX*FOX_MAN* GIANT_FOX*RACCOON* RACCOON_MAN* GIANT_RACCOON*MACAQUE_RHESUS*MACAQUE_RHESUS_MAN*GIANT_MACAQUE_RHESUS*COUGAR* -COUGAR_MAN* GIANT_COUGAR*WOLF*WOLF_MAN* -GIANT_WOLF* GROUNDHOG* GROUNDHOG_MAN*GIANT_GROUNDHOG* ALLIGATOR* ALLIGATOR_MAN*GIANT_ALLIGATOR* BIRD_BUZZARD* BUZZARD_MAN* GIANT_BUZZARD*PANDA*PANDA, GIGANTIC* PANDA MAN*CAPYBARA*CAPYBARA, GIANT* CAPYBARA MAN*BADGER* -BADGER MAN* BADGER, GIANT*MOOSE* MOOSE MAN* MOOSE, GIANT* RED PANDA* RED PANDA MAN*RED PANDA, GIANT*ELEPHANT* ELEPHANT_MAN*GIANT_ELEPHANT*WARTHOG* WARTHOG_MAN* GIANT_WARTHOG*LION*LION_MAN* -GIANT_LION*LEOPARD* LEOPARD_MAN* GIANT_LEOPARD*JAGUAR* -JAGUAR_MAN* GIANT_JAGUAR*TIGER* TIGER_MAN* GIANT_TIGER*CHEETAH* CHEETAH_MAN* GIANT_CHEETAH*GAZELLE* GAZELLE_MAN* GIANT_GAZELLE*MANDRILL* MANDRILL_MAN*GIANT_MANDRILL* -CHIMPANZEE*BONOBO*GORILLA* ORANGUTAN*GIBBON_SIAMANG*GIBBON_WHITE_HANDED*GIBBON_BLACK_HANDED* GIBBON_GRAY*GIBBON_SILVERY*GIBBON_PILEATED* GIBBON_BILOU*GIBBON_WHITE_BROWED*GIBBON_BLACK_CRESTED* CAMEL_1_HUMP*CAMEL_1_HUMP_MAN*GIANT_CAMEL_1_HUMP* CAMEL_2_HUMP*CAMEL_2_HUMP_MAN*GIANT_CAMEL_2_HUMP*CROCODILE_SALTWATER*CROCODILE_SALTWATER_MAN*GIANT_CROCODILE_SALTWATER* BIRD_VULTURE* VULTURE_MAN* GIANT_VULTURE* -RHINOCEROS*RHINOCEROS_MAN*GIANT_RHINOCEROS*GIRAFFE* GIRAFFE_MAN* GIANT_GIRAFFE* HONEY BADGER*HONEY BADGER MAN*HONEY BADGER, GIANT*GIANT TORTOISE*GIANT TORTOISE MAN*GIGANTIC TORTOISE* ARMADILLO* ARMADILLO MAN*ARMADILLO, GIANT*MUSKOX* -MUSKOX_MAN* GIANT_MUSKOX*ELK*ELK_MAN* GIANT_ELK* -BEAR_POLAR*BEAR_POLAR_MAN*GIANT_BEAR_POLAR* WOLVERINE* WOLVERINE_MAN*GIANT_WOLVERINE* -CHINCHILLA*CHINCHILLA_MAN*GIANT_CHINCHILLA* FLOATING_GUTS*DRUNIAN* CREEPING_EYE*VORACIOUS_CAVE_CRAWLER*BLIND_CAVE_OGRE* -CAP_HOPPER* -MAGMA_CRAB*CRUNDLE* HUNGRY_HEAD* -FLESH_BALL*ELK_BIRD* HELMET_SNAKE*GREEN_DEVOURER*RUTHERER*CREEPY_CRAWLER*DRALTHA*GIANT_EARTHWORM* BLOOD_MAN*BUGBAT*MANERA* -MOLEMARIAN*JABBERER* POND_GRABBER*BLIND_CAVE_BEAR* CAVE_DRAGON*REACHER*ELEMENTMAN_GABBRO*GORLAK* CAVE_FLOATER*PLUMP_HELMET_MAN* CAVE_BLOB*ELEMENTMAN_AMETHYST*OCTOPUS* OCTOPUS_MAN* GIANT_OCTOPUS*CRAB*CRAB_MAN* -GIANT_CRAB* LEOPARD_SEAL*LEOPARD_SEAL_MAN*GIANT_LEOPARD_SEAL* -CUTTLEFISH*CUTTLEFISH_MAN*GIANT_CUTTLEFISH*ORCA*ORCA_MAN* -GIANT_ORCA*SPONGE* -SPONGE_MAN* GIANT_SPONGE*HORSESHOE_CRAB*HORSESHOE_CRAB_MAN*GIANT_HORSESHOE_CRAB* SPERM_WHALE*SPERM_WHALE_MAN*GIANT_SPERM_WHALE* ELEPHANT_SEAL*ELEPHANT_SEAL_MAN*GIANT_ELEPHANT_SEAL* HARP_SEAL* HARP_SEAL_MAN*GIANT_HARP_SEAL*NAUTILUS* NAUTILUS_MAN*GIANT_NAUTILUS* FOXSQUIRREL* MOGHOPPER* RAT_DEMON*WAMBLER_FLUFFY*LIZARD_RHINO_TWO_LEGGED* WORM_KNUCKLE*SPIDER_PHANTOM* FLY_ACORN* -GNAT_BLOOD*LIZARD* -LIZARD_MAN* GIANT_LIZARD*SKINK* SKINK_MAN* GIANT_SKINK* CHAMELEON* CHAMELEON_MAN*GIANT_CHAMELEON*ANOLE* ANOLE_MAN* GIANT_ANOLE*IGUANA* -IGUANA_MAN* GIANT_IGUANA* RIVER OTTER* SEA OTTER* OTTER_MAN* GIANT_OTTER*SNAPPING TURTLE*ALLIGATOR SNAPPING TURTLE*SNAPPING_TURTLE_MAN*GIANT_SNAPPING_TURTLE*BEAVER* -BEAVER_MAN* GIANT_BEAVER*LEECH* LEECH_MAN* GIANT_LEECH*AXOLOTL* AXOLOTL_MAN* GIANT_AXOLOTL*MINK*MINK_MAN* -GIANT_MINK* POND_TURTLE*POND_TURTLE_MAN*GIANT_POND_TURTLE*RAT*RAT_MAN* SQUIRREL_GRAY*SQUIRREL_GRAY_MAN*GIANT_SQUIRREL_GRAY* SQUIRREL_RED*SQUIRREL_RED_MAN*GIANT_SQUIRREL_RED*CHIPMUNK* CHIPMUNK_MAN*GIANT_CHIPMUNK*HAMSTER* HAMSTER_MAN* GIANT_HAMSTER*HEDGEHOG* HEDGEHOG_MAN*GIANT_HEDGEHOG*SQUIRREL_FLYING*FLYING_SQUIRREL_MAN*GIANT_FLYING_SQUIRREL*MUSSEL*OYSTER* FISH_SALMON*FISH_CLOWNFISH* FISH_HAGFISH*FISH_LAMPREY_BROOK* FISH_RAY_BAT*FISH_RAY_THORNBACK*FISH_RATFISH_SPOTTED* FISH_HERRING* FISH_SHAD* FISH_ANCHOVY*FISH_TROUT_STEELHEAD* FISH_HAKE* FISH_SEAHORSE* FISH_GLASSEYE*FISH_PUFFER_WHITE_SPOTTED* FISH_SOLE* FISH_FLOUNDER* FISH_MACKEREL*JELLYFISH_SEA_NETTLE*SQUID* SQUID MAN*GIGANTIC SQUID* FISH_LUNGFISH*FISH_LOACH_CLOWN*FISH_BULLHEAD_BROWN*FISH_BULLHEAD_YELLOW*FISH_BULLHEAD_BLACK*FISH_KNIFEFISH_BANDED* FISH_CHAR*FISH_TROUT_RAINBOW*FISH_MOLLY_SAILFIN* -FISH_GUPPY* -FISH_PERCH*DWARF*HUMAN*ELF*GOBLIN*KOBOLD*GREMLIN*TROLL*OGRE*UNICORN*DRAGON*SATYR*COLOSSUS_BRONZE*GIANT*CYCLOPS*ETTIN*MINOTAUR*YETI* SASQUATCH* BLIZZARD_MAN*WOLF_ICE*FAIRY*PIXIE*BEAK_DOG* GRIMELING* BLENDEC_FOUL* STRANGLER* NIGHTWING*HARPY*HYDRA* MERPERSON* SEA_SERPENT* SEA_MONSTER*BIRD_ROC*CROCODILE_CAVE*TOAD_GIANT_CAVE* OLM_GIANT* BAT_GIANT* RAT_GIANT* RAT_LARGE*MOLE_DOG_NAKED* -TROGLODYTE* -MOLE_GIANT*IMP_FIRE*SPIDER_CAVE_GIANT* SPIDER_CAVE* FISH_CAVE* CAVE_FISH_MAN* LOBSTER_CAVE* -SNAKE_FIRE*OLM*OLM_MAN*BAT*BAT_MAN*MAGGOT_PURRING*ELEMENTMAN_FIRE*ELEMENTMAN_MAGMA*ELEMENTMAN_IRON*ELEMENTMAN_MUD*BIRD_SWALLOW_CAVE*CAVE_SWALLOW_MAN*BIRD_SWALLOW_CAVE_GIANT* AMPHIBIAN_MAN* REPTILE_MAN* SERPENT_MAN*ANT_MAN* -RODENT MAN* WILD_BOAR* WILD_BOAR_MAN*GIANT_WILD_BOAR*COYOTE* -COYOTE_MAN* GIANT_COYOTE*KANGAROO* KANGAROO_MAN*GIANT_KANGAROO*KOALA* KOALA_MAN* GIANT_KOALA*ADDER* ADDER_MAN* GIANT_ADDER*ECHIDNA* ECHIDNA_MAN* GIANT_ECHIDNA* PORCUPINE* PORCUPINE_MAN*GIANT_PORCUPINE* KINGSNAKE* KINGSNAKE_MAN*GIANT_KINGSNAKE* GRAY_LANGUR*GRAY_LANGUR_MAN*GIANT_GRAY_LANGUR*BOBCAT* -BOBCAT_MAN* GIANT_BOBCAT*SKUNK* SKUNK_MAN* GIANT_SKUNK*GREEN_TREE_FROG*GREEN_TREE_FROG_MAN*GIANT_GREEN_TREE_FROG*HARE*HARE_MAN* -GIANT_HARE* RATTLESNAKE*RATTLESNAKE_MAN*GIANT_RATTLESNAKE*WEASEL* -WEASEL_MAN* GIANT_WEASEL*COPPERHEAD_SNAKE*COPPERHEAD_SNAKE_MAN*GIANT_COPPERHEAD_SNAKE*IBEX*IBEX_MAN* -GIANT_IBEX*WOMBAT* -WOMBAT_MAN* GIANT_WOMBAT*DINGO* DINGO_MAN* GIANT_DINGO*COATI* COATI_MAN* GIANT_COATI*OPOSSUM* OPOSSUM_MAN* GIANT_OPOSSUM*MONGOOSE* MONGOOSE_MAN*GIANT_MONGOOSE*HYENA* HYENA_MAN* GIANT_HYENA*ANACONDA* ANACONDA_MAN*GIANT_ANACONDA*MONITOR_LIZARD*MONITOR_LIZARD_MAN*GIANT_MONITOR_LIZARD* -KING_COBRA*KING_COBRA_MAN*GIANT_KING_COBRA*OCELOT* -OCELOT_MAN* GIANT_OCELOT*JACKAL* -JACKAL_MAN* GIANT_JACKAL*CAPUCHIN* CAPUCHIN_MAN*GIANT_CAPUCHIN*SLOTH* SLOTH_MAN* GIANT_SLOTH* SPIDER_MONKEY*SPIDER_MONKEY_MAN*GIANT_SPIDER_MONKEY*PANGOLIN* PANGOLIN_MAN*GIANT_PANGOLIN* BLACK_MAMBA*BLACK_MAMBA_MAN*GIANT_BLACK_MAMBA* -BEAR_SLOTH*SLOTH_BEAR_MAN*GIANT_SLOTH_BEAR*AYE-AYE* AYE-AYE_MAN* GIANT_AYE-AYE* -BUSHMASTER*BUSHMASTER_MAN*GIANT_BUSHMASTER*PYTHON* -PYTHON_MAN* GIANT_PYTHON*TAPIR* TAPIR_MAN* GIANT_TAPIR*IMPALA* -IMPALA_MAN* GIANT_IMPALA*AARDVARK* AARDVARK_MAN*GIANT_AARDVARK* LION_TAMARIN*LION_TAMARIN_MAN*GIANT_LION_TAMARIN*STOAT* STOAT_MAN* GIANT_STOAT*LYNX*LYNX_MAN* -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file diff --git a/data/stockpiles/teeth.dfstock b/data/stockpiles/teeth.dfstock deleted file mode 100644 index 06875f8b5..000000000 --- a/data/stockpiles/teeth.dfstock +++ /dev/null @@ -1,157 +0,0 @@ -*ÆW -WOOD -DOOR - FLOODGATE -BED -CHAIR -CHAIN -FLASK -GOBLET - -INSTRUMENT -TOY -WINDOW -CAGE -BARREL -BUCKET - -ANIMALTRAP -TABLE -COFFIN -STATUE -WEAPON -ARMOR -SHOES -SHIELD -HELM -GLOVES -BOX -BAG -BIN - -ARMORSTAND - -WEAPONRACK -CABINET -FIGURINE -AMULET -SCEPTER -AMMO -CROWN -RING -EARRING -BRACELET -GEM -ANVIL -REMAINS -MEAT -FISH -FISH_RAW -VERMIN -PET -SEEDS -PLANT - SKIN_TANNED - PLANT_GROWTH -THREAD -CLOTH -TOTEM -PANTS -BACKPACK -QUIVER - CATAPULTPARTS - BALLISTAPARTS - SIEGEAMMO -BALLISTAARROWHEAD - TRAPPARTS -TRAPCOMP -DRINK - POWDER_MISC -CHEESE -FOOD - LIQUID_MISC -COIN -GLOB - PIPE_SECTION - HATCH_COVER -GRATE -QUERN - MILLSTONE -SPLINT -CRUTCH -TRACTION_BENCH -TOOL -SLAB -EGG -BOOK -SHEET -BRANCHJTOADJTOAD_MANJ -GIANT_TOADJWORMJWORM_MANJ BIRD_BLUEJAYJ BLUEJAY_MANJ GIANT_BLUEJAYJ BIRD_CARDINALJ CARDINAL_MANJGIANT_CARDINALJ BIRD_GRACKLEJ GRACKLE_MANJ GIANT_GRACKLEJ BIRD_ORIOLEJ -ORIOLE_MANJ GIANT_ORIOLEJBIRD_RW_BLACKBIRDJRW_BLACKBIRD_MANJGIANT_RW_BLACKBIRDJ BIRD_PENGUINJBIRD_PENGUIN_LITTLEJBIRD_PENGUIN_EMPERORJ PENGUIN MANJBIRD_PENGUIN_GIANTJBIRD_FALCON_PEREGRINEJPEREGRINE FALCON MANJGIANT PEREGRINE FALCONJ BIRD_KIWIJKIWI MANJBIRD_KIWI_GIANTJ BIRD_OSTRICHJ OSTRICH MANJBIRD_OSTRICH_GIANTJ BIRD_CROWJCROW_MANJ -GIANT_CROWJ -BIRD_RAVENJ RAVEN_MANJ GIANT_RAVENJBIRD_CASSOWARYJ CASSOWARY_MANJGIANT_CASSOWARYJBIRD_KEAJKEA_MANJ GIANT_KEAJBIRD_OWL_SNOWYJ SNOWY_OWL_MANJGIANT_SNOWY_OWLJSPARROWJ SPARROW_MANJ GIANT_SPARROWJBIRD_STORK_WHITEJWHITE_STORK_MANJGIANT_WHITE_STORKJ BIRD_LOONJLOON_MANJ -GIANT_LOONJ BIRD_OWL_BARNJ BARN_OWL_MANJGIANT_BARN_OWLJ BIRD_PARAKEETJ PARAKEET_MANJGIANT_PARAKEETJ BIRD_KAKAPOJ -KAKAPO_MANJ GIANT_KAKAPOJBIRD_PARROT_GREYJGREY_PARROT_MANJGIANT_GREY_PARROTJ BIRD_PUFFINJ -PUFFIN_MANJ GIANT_PUFFINJ BIRD_SWANJSWAN_MANJ -GIANT_SWANJ BIRD_LORIKEETJ LORIKEET_MANJGIANT_LORIKEETJ BIRD_WRENJWREN_MANJ -GIANT_WRENJ BIRD_OSPREYJ -OSPREY_MANJ GIANT_OSPREYJBIRD_EMUJEMU_MANJ GIANT_EMUJBIRD_COCKATIELJ COCKATIEL_MANJGIANT_COCKATIELJBIRD_LOVEBIRD_PEACH-FACEDJPEACH-FACED_LOVEBIRD_MANJGIANT_PEACH-FACED_LOVEBIRDJ BIRD_MAGPIEJ -MAGPIE_MANJ GIANT_MAGPIEJ BIRD_KESTRELJ KESTREL_MANJ GIANT_KESTRELJBIRD_ALBATROSSJ ALBATROSS_MANJGIANT_ALBATROSSJBIRD_OWL_GREAT_HORNEDJGREAT_HORNED_OWL_MANJGIANT_GREAT_HORNED_OWLJ -BIRD_EAGLEJ EAGLE_MANJ GIANT_EAGLEJ BIRD_HORNBILLJ HORNBILL_MANJGIANT_HORNBILLJBIRD_LOVEBIRD_MASKEDJMASKED_LOVEBIRD_MANJGIANT_MASKED_LOVEBIRDJ BIRD_BUSHTITJ BUSHTIT_MANJ GIANT_BUSHTITJ DAMSELFLYJ DAMSELFLY_MANJGIANT_DAMSELFLYJMOTHJMOTH_MANJ -GIANT_MOTHJ GRASSHOPPERJGRASSHOPPER_MANJGIANT_GRASSHOPPERJ BARK_SCORPIONJBARK_SCORPION_MANJGIANT_BARK_SCORPIONJMANTISJ -MANTIS_MANJ GIANT_MANTISJTICKJTICK_MANJ -GIANT_TICKJLOUSEJ LOUSE_MANJ GIANT_LOUSEJTHRIPSJ -THRIPS_MANJ GIANT_THRIPSJSLUGJSLUG_MANJ -GIANT_SLUGJMOSQUITOJ MOSQUITO_MANJGIANT_MOSQUITOJSPIDER_JUMPINGJJUMPING_SPIDER_MANJGIANT_JUMPING_SPIDERJTERMITEJ -MOON_SNAILJMOON_SNAIL_MANJGIANT_MOON_SNAILJSPIDER_BROWN_RECLUSEJBROWN_RECLUSE_SPIDER_MANJGIANT_BROWN_RECLUSE_SPIDERJSNAILJ SNAIL_MANJ GIANT_SNAILJ GECKO_LEOPARDJLEOPARD_GECKO_MANJGIANT_LEOPARD_GECKOJDESERT TORTOISEJDESERT_TORTOISE_MANJGIANT_DESERT_TORTOISEJ GILA_MONSTERJGILA_MONSTER_MANJGIANT_GILA_MONSTERJDOGJCATJMULEJDONKEYJHORSEJCOWJSHEEPJPIGJGOATJ BIRD_CHICKENJCAVYJ BIRD_DUCKJ WATER_BUFFALOJREINDEERJ -BIRD_GOOSEJYAKJLLAMAJALPACAJBIRD_GUINEAFOWLJBIRD_PEAFOWL_BLUEJ BIRD_TURKEYJRABBITJCHIMERAJCENTAURJGRIFFONJFLYJFLY_MANJ GIANT_FLYJ ROACH_LARGEJ ROACH_MANJ GIANT_ROACHJBEETLEJ -BEETLE_MANJ GIANT_BEETLEJANTJBUTTERFLY_MONARCHJBUTTERFLY_MONARCH_MANJGIANT_BUTTERFLY_MONARCHJFIREFLYJ FIREFLY_MANJ GIANT_FIREFLYJ DRAGONFLYJ DRAGONFLY_MANJGIANT_DRAGONFLYJ HONEY_BEEJ BUMBLEBEEJ GOAT_MOUNTAINJGOAT_MOUNTAIN_MANJGIANT_GOAT_MOUNTAINJ MARMOT_HOARYJMARMOT_HOARY_MANJGIANT_MARMOT_HOARYJGNOME_MOUNTAINJ -GNOME_DARKJWALRUSJ -WALRUS_MANJ GIANT_WALRUSJFISH_LAMPREY_SEAJSHARK_GREAT_WHITEJ SHARK_FRILLJSHARK_SPINY_DOGFISHJSHARK_WOBBEGONG_SPOTTEDJ SHARK_WHALEJ SHARK_BASKINGJ SHARK_NURSEJSHARK_MAKO_SHORTFINJSHARK_MAKO_LONGFINJ SHARK_TIGERJ -SHARK_BULLJSHARK_REEF_BLACKTIPJSHARK_REEF_WHITETIPJ -SHARK_BLUEJSHARK_HAMMERHEADJ SHARK_ANGELJFISH_SKATE_COMMONJFISH_RAY_MANTAJ FISH_STINGRAYJFISH_COELACANTHJ FISH_STURGEONJFISH_CONGER_EELJ FISH_MILKFISHJFISH_CODJ FISH_OPAHJFISH_GROUPER_GIANTJ FISH_BLUEFISHJFISH_SUNFISH_OCEANJFISH_SWORDFISHJ FISH_MARLINJ FISH_HALIBUTJFISH_BARRACUDA_GREATJFISH_TUNA_BLUEFINJNARWHALJ NARWHAL MANJNARWHAL, GIANTJHIPPOJ HIPPO_MANJ GIANT_HIPPOJFISH_GAR_LONGNOSEJ FISH_CARPJFISH_TIGERFISHJ FISH_PIKEJPLATYPUSJ PLATYPUS MANJPLATYPUS, GIANTJ BEAR_GRIZZLYJBEAR_GRIZZLY_MANJGIANT_BEAR_GRIZZLYJ -BEAR_BLACKJBEAR_BLACK_MANJGIANT_BEAR_BLACKJDEERJDEER_MANJ -GIANT_DEERJFOXJFOX_MANJ GIANT_FOXJRACCOONJ RACCOON_MANJ GIANT_RACCOONJMACAQUE_RHESUSJMACAQUE_RHESUS_MANJGIANT_MACAQUE_RHESUSJCOUGARJ -COUGAR_MANJ GIANT_COUGARJWOLFJWOLF_MANJ -GIANT_WOLFJ GROUNDHOGJ GROUNDHOG_MANJGIANT_GROUNDHOGJ ALLIGATORJ ALLIGATOR_MANJGIANT_ALLIGATORJ BIRD_BUZZARDJ BUZZARD_MANJ GIANT_BUZZARDJPANDAJPANDA, GIGANTICJ PANDA MANJCAPYBARAJCAPYBARA, GIANTJ CAPYBARA MANJBADGERJ -BADGER MANJ BADGER, GIANTJMOOSEJ MOOSE MANJ MOOSE, GIANTJ RED PANDAJ RED PANDA MANJRED PANDA, GIANTJELEPHANTJ ELEPHANT_MANJGIANT_ELEPHANTJWARTHOGJ WARTHOG_MANJ GIANT_WARTHOGJLIONJLION_MANJ -GIANT_LIONJLEOPARDJ LEOPARD_MANJ GIANT_LEOPARDJJAGUARJ -JAGUAR_MANJ GIANT_JAGUARJTIGERJ TIGER_MANJ GIANT_TIGERJCHEETAHJ CHEETAH_MANJ GIANT_CHEETAHJGAZELLEJ GAZELLE_MANJ GIANT_GAZELLEJMANDRILLJ MANDRILL_MANJGIANT_MANDRILLJ -CHIMPANZEEJBONOBOJGORILLAJ ORANGUTANJGIBBON_SIAMANGJGIBBON_WHITE_HANDEDJGIBBON_BLACK_HANDEDJ GIBBON_GRAYJGIBBON_SILVERYJGIBBON_PILEATEDJ GIBBON_BILOUJGIBBON_WHITE_BROWEDJGIBBON_BLACK_CRESTEDJ CAMEL_1_HUMPJCAMEL_1_HUMP_MANJGIANT_CAMEL_1_HUMPJ CAMEL_2_HUMPJCAMEL_2_HUMP_MANJGIANT_CAMEL_2_HUMPJCROCODILE_SALTWATERJCROCODILE_SALTWATER_MANJGIANT_CROCODILE_SALTWATERJ BIRD_VULTUREJ VULTURE_MANJ GIANT_VULTUREJ -RHINOCEROSJRHINOCEROS_MANJGIANT_RHINOCEROSJGIRAFFEJ GIRAFFE_MANJ GIANT_GIRAFFEJ HONEY BADGERJHONEY BADGER MANJHONEY BADGER, GIANTJGIANT TORTOISEJGIANT TORTOISE MANJGIGANTIC TORTOISEJ ARMADILLOJ ARMADILLO MANJARMADILLO, GIANTJMUSKOXJ -MUSKOX_MANJ GIANT_MUSKOXJELKJELK_MANJ GIANT_ELKJ -BEAR_POLARJBEAR_POLAR_MANJGIANT_BEAR_POLARJ WOLVERINEJ WOLVERINE_MANJGIANT_WOLVERINEJ -CHINCHILLAJCHINCHILLA_MANJGIANT_CHINCHILLAJ FLOATING_GUTSJDRUNIANJ CREEPING_EYEJVORACIOUS_CAVE_CRAWLERJBLIND_CAVE_OGREJ -CAP_HOPPERJ -MAGMA_CRABJCRUNDLEJ HUNGRY_HEADJ -FLESH_BALLJELK_BIRDJ HELMET_SNAKEJGREEN_DEVOURERJRUTHERERJCREEPY_CRAWLERJDRALTHAJGIANT_EARTHWORMJ BLOOD_MANJBUGBATJMANERAJ -MOLEMARIANJJABBERERJ POND_GRABBERJBLIND_CAVE_BEARJ CAVE_DRAGONJREACHERJELEMENTMAN_GABBROJGORLAKJ CAVE_FLOATERJPLUMP_HELMET_MANJ CAVE_BLOBJELEMENTMAN_AMETHYSTJOCTOPUSJ OCTOPUS_MANJ GIANT_OCTOPUSJCRABJCRAB_MANJ -GIANT_CRABJ LEOPARD_SEALJLEOPARD_SEAL_MANJGIANT_LEOPARD_SEALJ -CUTTLEFISHJCUTTLEFISH_MANJGIANT_CUTTLEFISHJORCAJORCA_MANJ -GIANT_ORCAJSPONGEJ -SPONGE_MANJ GIANT_SPONGEJHORSESHOE_CRABJHORSESHOE_CRAB_MANJGIANT_HORSESHOE_CRABJ SPERM_WHALEJSPERM_WHALE_MANJGIANT_SPERM_WHALEJ ELEPHANT_SEALJELEPHANT_SEAL_MANJGIANT_ELEPHANT_SEALJ HARP_SEALJ HARP_SEAL_MANJGIANT_HARP_SEALJNAUTILUSJ NAUTILUS_MANJGIANT_NAUTILUSJ FOXSQUIRRELJ MOGHOPPERJ RAT_DEMONJWAMBLER_FLUFFYJLIZARD_RHINO_TWO_LEGGEDJ WORM_KNUCKLEJSPIDER_PHANTOMJ FLY_ACORNJ -GNAT_BLOODJLIZARDJ -LIZARD_MANJ GIANT_LIZARDJSKINKJ SKINK_MANJ GIANT_SKINKJ CHAMELEONJ CHAMELEON_MANJGIANT_CHAMELEONJANOLEJ ANOLE_MANJ GIANT_ANOLEJIGUANAJ -IGUANA_MANJ GIANT_IGUANAJ RIVER OTTERJ SEA OTTERJ OTTER_MANJ GIANT_OTTERJSNAPPING TURTLEJALLIGATOR SNAPPING TURTLEJSNAPPING_TURTLE_MANJGIANT_SNAPPING_TURTLEJBEAVERJ -BEAVER_MANJ GIANT_BEAVERJLEECHJ LEECH_MANJ GIANT_LEECHJAXOLOTLJ AXOLOTL_MANJ GIANT_AXOLOTLJMINKJMINK_MANJ -GIANT_MINKJ POND_TURTLEJPOND_TURTLE_MANJGIANT_POND_TURTLEJRATJRAT_MANJ SQUIRREL_GRAYJSQUIRREL_GRAY_MANJGIANT_SQUIRREL_GRAYJ SQUIRREL_REDJSQUIRREL_RED_MANJGIANT_SQUIRREL_REDJCHIPMUNKJ CHIPMUNK_MANJGIANT_CHIPMUNKJHAMSTERJ HAMSTER_MANJ GIANT_HAMSTERJHEDGEHOGJ HEDGEHOG_MANJGIANT_HEDGEHOGJSQUIRREL_FLYINGJFLYING_SQUIRREL_MANJGIANT_FLYING_SQUIRRELJMUSSELJOYSTERJ FISH_SALMONJFISH_CLOWNFISHJ FISH_HAGFISHJFISH_LAMPREY_BROOKJ FISH_RAY_BATJFISH_RAY_THORNBACKJFISH_RATFISH_SPOTTEDJ FISH_HERRINGJ FISH_SHADJ FISH_ANCHOVYJFISH_TROUT_STEELHEADJ FISH_HAKEJ FISH_SEAHORSEJ FISH_GLASSEYEJFISH_PUFFER_WHITE_SPOTTEDJ FISH_SOLEJ FISH_FLOUNDERJ FISH_MACKERELJJELLYFISH_SEA_NETTLEJSQUIDJ SQUID MANJGIGANTIC SQUIDJ FISH_LUNGFISHJFISH_LOACH_CLOWNJFISH_BULLHEAD_BROWNJFISH_BULLHEAD_YELLOWJFISH_BULLHEAD_BLACKJFISH_KNIFEFISH_BANDEDJ FISH_CHARJFISH_TROUT_RAINBOWJFISH_MOLLY_SAILFINJ -FISH_GUPPYJ -FISH_PERCHJDWARFJHUMANJELFJGOBLINJKOBOLDJGREMLINJTROLLJOGREJUNICORNJDRAGONJSATYRJCOLOSSUS_BRONZEJGIANTJCYCLOPSJETTINJMINOTAURJYETIJ SASQUATCHJ BLIZZARD_MANJWOLF_ICEJFAIRYJPIXIEJBEAK_DOGJ GRIMELINGJ BLENDEC_FOULJ STRANGLERJ NIGHTWINGJHARPYJHYDRAJ MERPERSONJ SEA_SERPENTJ SEA_MONSTERJBIRD_ROCJCROCODILE_CAVEJTOAD_GIANT_CAVEJ OLM_GIANTJ BAT_GIANTJ RAT_GIANTJ RAT_LARGEJMOLE_DOG_NAKEDJ -TROGLODYTEJ -MOLE_GIANTJIMP_FIREJSPIDER_CAVE_GIANTJ SPIDER_CAVEJ FISH_CAVEJ CAVE_FISH_MANJ LOBSTER_CAVEJ -SNAKE_FIREJOLMJOLM_MANJBATJBAT_MANJMAGGOT_PURRINGJELEMENTMAN_FIREJELEMENTMAN_MAGMAJELEMENTMAN_IRONJELEMENTMAN_MUDJBIRD_SWALLOW_CAVEJCAVE_SWALLOW_MANJBIRD_SWALLOW_CAVE_GIANTJ AMPHIBIAN_MANJ REPTILE_MANJ SERPENT_MANJANT_MANJ -RODENT MANJ WILD_BOARJ WILD_BOAR_MANJGIANT_WILD_BOARJCOYOTEJ -COYOTE_MANJ GIANT_COYOTEJKANGAROOJ KANGAROO_MANJGIANT_KANGAROOJKOALAJ KOALA_MANJ GIANT_KOALAJADDERJ ADDER_MANJ GIANT_ADDERJECHIDNAJ ECHIDNA_MANJ GIANT_ECHIDNAJ PORCUPINEJ PORCUPINE_MANJGIANT_PORCUPINEJ KINGSNAKEJ KINGSNAKE_MANJGIANT_KINGSNAKEJ GRAY_LANGURJGRAY_LANGUR_MANJGIANT_GRAY_LANGURJBOBCATJ -BOBCAT_MANJ GIANT_BOBCATJSKUNKJ SKUNK_MANJ GIANT_SKUNKJGREEN_TREE_FROGJGREEN_TREE_FROG_MANJGIANT_GREEN_TREE_FROGJHAREJHARE_MANJ -GIANT_HAREJ RATTLESNAKEJRATTLESNAKE_MANJGIANT_RATTLESNAKEJWEASELJ -WEASEL_MANJ GIANT_WEASELJCOPPERHEAD_SNAKEJCOPPERHEAD_SNAKE_MANJGIANT_COPPERHEAD_SNAKEJIBEXJIBEX_MANJ -GIANT_IBEXJWOMBATJ -WOMBAT_MANJ GIANT_WOMBATJDINGOJ DINGO_MANJ GIANT_DINGOJCOATIJ COATI_MANJ GIANT_COATIJOPOSSUMJ OPOSSUM_MANJ GIANT_OPOSSUMJMONGOOSEJ MONGOOSE_MANJGIANT_MONGOOSEJHYENAJ HYENA_MANJ GIANT_HYENAJANACONDAJ ANACONDA_MANJGIANT_ANACONDAJMONITOR_LIZARDJMONITOR_LIZARD_MANJGIANT_MONITOR_LIZARDJ -KING_COBRAJKING_COBRA_MANJGIANT_KING_COBRAJOCELOTJ -OCELOT_MANJ GIANT_OCELOTJJACKALJ -JACKAL_MANJ GIANT_JACKALJCAPUCHINJ CAPUCHIN_MANJGIANT_CAPUCHINJSLOTHJ SLOTH_MANJ GIANT_SLOTHJ SPIDER_MONKEYJSPIDER_MONKEY_MANJGIANT_SPIDER_MONKEYJPANGOLINJ PANGOLIN_MANJGIANT_PANGOLINJ BLACK_MAMBAJBLACK_MAMBA_MANJGIANT_BLACK_MAMBAJ -BEAR_SLOTHJSLOTH_BEAR_MANJGIANT_SLOTH_BEARJAYE-AYEJ AYE-AYE_MANJ GIANT_AYE-AYEJ -BUSHMASTERJBUSHMASTER_MANJGIANT_BUSHMASTERJPYTHONJ -PYTHON_MANJ GIANT_PYTHONJTAPIRJ TAPIR_MANJ GIANT_TAPIRJIMPALAJ -IMPALA_MANJ GIANT_IMPALAJAARDVARKJ AARDVARK_MANJGIANT_AARDVARKJ LION_TAMARINJLION_TAMARIN_MANJGIANT_LION_TAMARINJSTOATJ STOAT_MANJ GIANT_STOATJLYNXJLYNX_MANJ -GIANT_LYNXPX˜ ¨°¸À \ No newline at end of file From 0d1caafeb36ab0ee7a98ad8cff6ef29a419434df Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:08:37 -0700 Subject: [PATCH 111/439] update stone stockpile defs --- data/stockpiles/bauxite.dfstock | Bin 42 -> 21 bytes data/stockpiles/clay.dfstock | Bin 125 -> 104 bytes data/stockpiles/coalproducing.dfstock | Bin 69 -> 48 bytes data/stockpiles/economic.dfstock | Bin 266 -> 245 bytes data/stockpiles/flux.dfstock | Bin 118 -> 97 bytes .../{iron.dfstock => ironore.dfstock} | Bin 84 -> 63 bytes .../{metal.dfstock => metalore.dfstock} | Bin 389 -> 368 bytes data/stockpiles/otherstone.dfstock | Bin 1123 -> 1102 bytes ...aster.dfstock => plasterproducing.dfstock} | Bin 103 -> 82 bytes 9 files changed, 0 insertions(+), 0 deletions(-) rename data/stockpiles/{iron.dfstock => ironore.dfstock} (51%) rename data/stockpiles/{metal.dfstock => metalore.dfstock} (87%) rename data/stockpiles/{plaster.dfstock => plasterproducing.dfstock} (60%) diff --git a/data/stockpiles/bauxite.dfstock b/data/stockpiles/bauxite.dfstock index 25524dcb9032e269b96a0f3e161a091056a1c451..83a49cb5b46a80a7e75a73eafe9b9711f6455162 100644 GIT binary patch delta 4 LcmdNAogfMT0w4h8 delta 26 icmWgDnjk7Vfst_rBjW-_h82tq8yFdPFftrqWB>q6eg&KW diff --git a/data/stockpiles/clay.dfstock b/data/stockpiles/clay.dfstock index 7e661688d746282ef78dd723b8c54c97b24b3695..e01c7abaf7d58c77aec38c6b4f65b5523f40baca 100644 GIT binary patch delta 4 Lcmb=;n2-Sg1h@g- delta 26 icmd0(osc0qfst_rBjW-_h82tq8yFdPFftrqWB>qUdqEOa<)# diff --git a/data/stockpiles/economic.dfstock b/data/stockpiles/economic.dfstock index b69a8034c0f694c53da4e9d61fbdc15695d09241..976f4cc11f7a5094000d3be86817cb054b515097 100644 GIT binary patch delta 6 NcmeBT`pP)rD*y>N0|)>B delta 28 kcmey$*u^yAtLOwq#uqSb_Rd| diff --git a/data/stockpiles/iron.dfstock b/data/stockpiles/ironore.dfstock similarity index 51% rename from data/stockpiles/iron.dfstock rename to data/stockpiles/ironore.dfstock index 90182276c7dd93c5de4a4fff79c828085788a190..2108b60ac3ecba9a4671642eef6870b0c9e86842 100644 GIT binary patch delta 4 LcmWHspI{FF18@Oj delta 26 icmcBynP4wEfst_rBjW-_h82tq8yFdPFftrqWB>qIq6QiO diff --git a/data/stockpiles/metal.dfstock b/data/stockpiles/metalore.dfstock similarity index 87% rename from data/stockpiles/metal.dfstock rename to data/stockpiles/metalore.dfstock index a8b58b0adb9a986c64b6293b6a09bcf4d81026b8..8cbb60959edb7679dcb68f4d7cf8c7504bb03643 100644 GIT binary patch delta 7 OcmZo={=l@MfDr%-WdfW4 delta 29 lcmeys)XKb}fKhY;BjXH4#s!QFD;OCzFf#67WH`Xc004Yu2U7q5 diff --git a/data/stockpiles/otherstone.dfstock b/data/stockpiles/otherstone.dfstock index 79c865f4e5bc598b68f1d683d2ce5976c7070be7..1f9f867edf1c8544c656445f60f1bc88abe1d681 100644 GIT binary patch delta 7 OcmaFNagJky9}55tLIT79 delta 29 lcmX@d@t9+SAB*S&M#dS8j0+eURxmPbU}W6E$Z&v>0RVut2YUbj diff --git a/data/stockpiles/plaster.dfstock b/data/stockpiles/plasterproducing.dfstock similarity index 60% rename from data/stockpiles/plaster.dfstock rename to data/stockpiles/plasterproducing.dfstock index 6ac4d4607b4b2df25fa02c132bc910b5046cee8b..2764150a3f55b7791ba460ef3c692992856ca887 100644 GIT binary patch delta 4 LcmYcfnh*p41PB3~ delta 26 icmWGapAaNEfst_rBjW-_h82tq8yFdPFftrqWB>qOAO=$a From fecebe5d711f7d4a33064b59e2b94be17e261e53 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:12:54 -0700 Subject: [PATCH 112/439] update ammo stockpile defs --- data/stockpiles/artifactammo.dfstock | Bin 33 -> 12 bytes data/stockpiles/bolts.dfstock | Bin 45 -> 923 bytes data/stockpiles/boneammo.dfstock | Bin 29 -> 8 bytes data/stockpiles/masterworkammo.dfstock | Bin 34 -> 13 bytes data/stockpiles/metalammo.dfstock | Bin 768 -> 725 bytes data/stockpiles/woodammo.dfstock | Bin 29 -> 8 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/artifactammo.dfstock b/data/stockpiles/artifactammo.dfstock index 874ec21064edbf5f45e96dcb2a57a5a51462099c..16cd6f57e91f5567da74cd624dcbaa24cf529bec 100644 GIT binary patch literal 12 TcmZ?bQsQtdD#=VsOfCTc6AlBV literal 33 pcmZ?bQsQtdD#=VsOfH$g$T)+MaRDR43PyMG*AN!H`Vp@iB(-KZ>ZDnu7^Z$-e6$ zYGFYz^ULNJedG}6PNGw2PnruZQRH*tfkzD;Ea^1-0B;pk8jQ`L2PtGKo{OJ;R2ngR zc&0j{uDR`r^=eqZh7D@i5E#3ZGrD!KR|orba8L(_R+HzebQ9+Xt2Ixu%+2FTEewXCwHn&>ndztKtbi0W&>zc-2MUt=gnbm}Ok*?!qVV{k*X|ykm_StBg KMq3;0v+)1$lq_H@-s$$Br$h?AD78;OlJX8Lk<%F delta 92 zcmcc0+Q6pl^nz82&(qI8$lcM;)7i>1$lni{@9yv8vQhXMqo@c%O|XZnk56!jtE=@nv diff --git a/data/stockpiles/woodammo.dfstock b/data/stockpiles/woodammo.dfstock index 623ca25f239a3faf33bc1e79710a50a0356cb6c8..6bec8b1e589154621fba15a68f13d3a73a472e2e 100644 GIT binary patch literal 8 PcmZ=_6JiPX_jdsR1?>Tt literal 29 lcmZ=_6JiPX_jj4V$T)+MaRDR43Py Date: Mon, 20 Mar 2023 17:17:25 -0700 Subject: [PATCH 113/439] update bars/blocks stockpile defs --- data/stockpiles/ash.dfstock | Bin 28 -> 7 bytes data/stockpiles/bars.dfstock | Bin 803 -> 760 bytes data/stockpiles/blocks.dfstock | Bin 2671 -> 2662 bytes data/stockpiles/coal.dfstock | Bin 31 -> 8 bytes data/stockpiles/ironbars.dfstock | Bin 39 -> 18 bytes data/stockpiles/metalbars.dfstock | Bin 768 -> 725 bytes data/stockpiles/otherbars.dfstock | Bin 715 -> 37 bytes data/stockpiles/pearlash.dfstock | Bin 33 -> 12 bytes data/stockpiles/pigironbars.dfstock | Bin 43 -> 22 bytes data/stockpiles/potash.dfstock | Bin 31 -> 10 bytes data/stockpiles/soap.dfstock | Bin 29 -> 8 bytes data/stockpiles/steelbars.dfstock | Bin 40 -> 19 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/ash.dfstock b/data/stockpiles/ash.dfstock index 70948081e2e7a2f858a236093a08acc37cdeac68..d313e0096d9bd3df718a9b7dfe60dfa50de46d89 100644 GIT binary patch literal 7 OcmWGy delta 79 zcmeytx|oeQsGDsfvk5<+r=Ne2yQ80{vz5EQkIP20XN;mE2(e%fS0A6?5LZ{9$=Xb3 bMJF&a&R}F*z{s$IQDOrl!wyD<1B?s+g8CJQ diff --git a/data/stockpiles/blocks.dfstock b/data/stockpiles/blocks.dfstock index 293dc52510e59dea7cdc58504a883a7cece347eb..cd08d93338e7f7e73da8d65b8c904069047f53f8 100644 GIT binary patch delta 72 zcmaDa@=Sy&=1$lq_H@-s$$Br$h?AD78;OlJXA^9~~b delta 92 zcmcc0+Q6n9^nz82&(qI8$lcM;)7i>1$lni{@9yv8vQhXMqo@c%O|XZnk56!jtEE diff --git a/data/stockpiles/otherbars.dfstock b/data/stockpiles/otherbars.dfstock index 8eb0d432c9397b1bf9cda39e40417fd28fb6e48f..4cbcc1c8f9edaee5a76d306803c3fcc9d1e07b46 100644 GIT binary patch literal 37 ncmWGi=3;U7cl6<63-Awd4EEq+1`!+qu8u)IAQnrozheLZk%9;g literal 715 zcmZvZyG{c!5JlGoWq5^0;=hQZC<>kJooq&#wO6(`h&28sN=iyfBpOOS4J)v+qjfpQ zGk5M>+pi0LiQ3pkXjD&)p_*T(+94gl=0usUJ122&50tAMQLB7LTBDD^uad5`!a07M zKu5x(?%SLJf$}!8N$QJD{63W(JbSQViyHXj2z!fL0)97oAn}s>B@lJKSWw@d%w&>( zSB7yQ5{ZoF^R&c8ON6=^njg}WB%$`i&p3u z&)L0h2Sm|N{GTlB8V|8AEDCH{V5q7u?4mO diff --git a/data/stockpiles/potash.dfstock b/data/stockpiles/potash.dfstock index 0db45dd7f02fc03b156fcdeec39002e5355f8711..8a09e446fe97cd24fe93d9840f65a46a3256c0df 100644 GIT binary patch literal 10 RcmWII;9?8#4{;3k000VX0y+Qy literal 31 ncmWII;9?8#4{;3kn83(5gOPCoBf|>>6 literal 40 wcmWF%l;ZdF^AB=&^z(GK3J!5~^_jrPID?UK0VBf-Mu`oK3_BPZ4lptR0LbGBmjD0& From 93b289042cbbda5dd860d2d1ed447f21d3320000 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:18:57 -0700 Subject: [PATCH 114/439] update gem stockpile defs --- data/stockpiles/cutgems.dfstock | Bin 2907 -> 2886 bytes data/stockpiles/cutglass.dfstock | Bin 64 -> 43 bytes data/stockpiles/cutstone.dfstock | Bin 1880 -> 1893 bytes data/stockpiles/roughgems.dfstock | Bin 2907 -> 2886 bytes data/stockpiles/roughglass.dfstock | Bin 64 -> 43 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/cutgems.dfstock b/data/stockpiles/cutgems.dfstock index 42949b8dcc2b9070e7c83af389a31a7f3ec5e305..1049acd6735e43165f17811674c93e0f7ceb57f1 100644 GIT binary patch delta 7 OcmcaDc1&!88#e$AWdhFt delta 29 lcmX>mc3W(N8@K2LM#dS8j0+eURxnCzU}V_A$Z&v>0RV!t2b}-_ diff --git a/data/stockpiles/cutglass.dfstock b/data/stockpiles/cutglass.dfstock index 7523381b419e564539214d990c8119cf6b4ab40a..6997d42acd16a5e7a44368c673e96614cb0570cd 100644 GIT binary patch delta 4 LcmZ?Jo}di?0?+{` delta 26 icmdOPn4m2>fst_rBjW-_h82tw8yFdOFftrqWB>qD!v*yK diff --git a/data/stockpiles/cutstone.dfstock b/data/stockpiles/cutstone.dfstock index ccbcaf42e9f2a154a1c3fb63aca66d0595102aa5..5e0f3f881ba08e522bf372252d1aa083988f934d 100644 GIT binary patch delta 46 zcmcb?_mqz*>d{6fM|LG81y4W!Aa_SUPiHHqAb;QBcxNA1N56Py|Db?iSC`P>5CBrx B4f_B9 delta 33 pcmaFLcY}{9>cB=OM|RN(jEplF85b}ztYDPbz{s$Jk>LO%0|2TQ2)_UT diff --git a/data/stockpiles/roughgems.dfstock b/data/stockpiles/roughgems.dfstock index 20ea6b98ace404d22c71d7a728116978e90db471..fdad4be1added15df89853ffa6f8849acfc412c5 100644 GIT binary patch delta 7 OcmcaDc1&!88#e$AWdhFt delta 29 lcmX>mc3W(N8@K2LM#dS8j0+eURxnCzU}V_A$Z&v>0RV!t2b}-_ diff --git a/data/stockpiles/roughglass.dfstock b/data/stockpiles/roughglass.dfstock index 9571b3f80ba1a33f3bacad1036beb0e4788c6eba..23b95b81ac8ac31bb49bd82b1fddf850cb8226ef 100644 GIT binary patch delta 4 LcmZ?Jo}di?0?+{` delta 26 icmdOPn4m2>fst_rBjW-_h82tw8yFdOFftrqWB>qD!v*yK From e9594a0c3beaeb39c288c5dcc1e6adcc9ad5f1ca Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:23:22 -0700 Subject: [PATCH 115/439] update finished goods stockpile defs --- data/stockpiles/artifactfinishedgoods.dfstock | Bin 33 -> 12 bytes data/stockpiles/crafts.dfstock | Bin 82 -> 5866 bytes data/stockpiles/goblets.dfstock | Bin 31 -> 5803 bytes .../masterworkfinishedgoods.dfstock | Bin 34 -> 13 bytes data/stockpiles/stonetools.dfstock | Bin 1886 -> 2063 bytes data/stockpiles/toys.dfstock | 2 ++ data/stockpiles/woodtools.dfstock | 2 ++ 7 files changed, 4 insertions(+) create mode 100644 data/stockpiles/toys.dfstock create mode 100644 data/stockpiles/woodtools.dfstock diff --git a/data/stockpiles/artifactfinishedgoods.dfstock b/data/stockpiles/artifactfinishedgoods.dfstock index 760b0867d663d7d8f5c4242ebf4d0b5dd8bb4546..08e8e0706ba17660eb19c85f176b0644dead52f3 100644 GIT binary patch literal 12 TcmYe|QsQtdD#=VsOfCTc6pjPM literal 33 pcmYe|QsQtdD#=VsOfH$g$T)+MaRDR43PyY{bJR+qmLRclnZeB-5Rf^wJV(%F4| zd4|>E@{JNM{kX`SkScEctWeeEd9XoMtFyhe`Rb}Mq7J<@Hk7Ng%+_j!_4KE-u3nut z&|+5SzEsAn-WVl9sod(!YqMLOiz>sPb7`G0tE<8(RriGv-mk7Cwz~1pTj@FujX`Graxj8`odH6o&3`;BWk$$dKPK(>2f4Fe z^@TP0`gaFmrhV0ha{cFpXwpEDiCk1bT1*6~0Q#ag>%SjVNaaMOWe@lOYV}??wf^gJ z*#}_t|1CDw0q_E~pcsTNBLIO062hTTNKmwOcgG;AtkXx}l;{q_l|$mxMie5<)Mutu zn|C5tYf7>ajrJRO(i+V`Y=F!;8lqrh8!@w#88mJRpY2!H`=$LPO$sRHTj8{q8lDnT zWr-fOg9{6>w8jWVq!%vdG)i=|GFsFeXC~@g<)c&7OY!5B;+Y-gTsOo@s5atOL5Ul3 zNHH|J-VH*+SZK4U1|;2TH%ZB0gC3g1R2x8lUqi8vOhdqKvkbejGPwqnl;h$4&qQV~$BFB=1|R!5ie-0LDI&HuvLn3Og%zEKj7rxz|pD zh7Or>ap`V2sf=w{CU_DW`KAm`xpcYg9?KjZ%U-8H+1pqR3xi;BS7^uyJdF z()iX0$32lKjntE(_zfnl&T#q?uN_0jm59#7oDz$As8*(LS_fP*P=rx;@G#YY%mq>3 z4;3aM4#7C6LG#}Z?SHE+=E@D&(u37Q43+AhA{y&XEVgUw`y)M4*R`n7sE5pul@iV0 zZAPXW@<6$N2L>EZ4hC-`^09`Li&4uG?U8U*J*JtAj~{S|G))E+;GU6_1VaUgsYWG- z=qRzS%`~PJREFG7B<&r^Yq49Ri|j&b)GdZT zYTcxx#8pPUZ?QsoN-IF>N!Q~DlNKl~xsFK9d(*MmNxJQrT2zH;7E?0~mne6~Z0d1Z zlt*cslqD2!@~4GZ69V-lPMpWVO$(8MIUSRHz~w1bLv6^$%B0uL&fMy4LhmEIM@nfV=X{mWE)gz zt4Kv;TjG8j<^o}MTvW_8sRN19ay=YmpC72P5E+I^w&u!iAO_l%i4*|&gv4R?f={$7 z7inClT{iO?MVwu5hGYLI9FL3ZEas-{OgbP)zn7&3Bao!1mBuxhB;bb(MIj$b9LFJ= zBN@_fQ*x+bB8zF9vDit6Lyd25$4e!_Y!r|8*yY0b2tcU9;3?q$JYxj_R10oU-$YOy zdm-@{fKQW{uE^4Y%`zS0J=?aPt8a9X0;Jue&$!Hn<2QnIux0axkv0Qpqr(Kzpn?;n z8qQ)$Q+$P)F6vZ`qH8=}9*9@)z9RW0;vI%9(%-Z>CXr%j4I;({b}=WbypNX?E+t?N zVuF{H>&)qDP(k(G>G%wkFhvH(*8zRpDozOlM6f068gy+PSmuMy(x+q{5JbJAOVoP4 zGq+JhAjDZQG#Y)2`V)j;6S8kk$iC$?O*XzfCH(4?@at2;Z%zrny}qz7-#>kPc=_e}YXA8BEMFcz zygq(^{dW8G@$vbW>F4%RG&)2`M9)5a#eEIP6^Yw*z hd42lu@ZIapCyh6(@n){^=99)7)_8N!c=Ji){{U{5F$Dks delta 31 ncmaE*8^n}kJ(1a3bOIye3`WKUj0`InB{ncJ>|kU#z{mgqhW!Vo diff --git a/data/stockpiles/goblets.dfstock b/data/stockpiles/goblets.dfstock index 6bf3c6ccb777ce4474a7bceb763e545de3a8e77a..b117634ba5c45e349563210aa9569cdc8a25a741 100644 GIT binary patch literal 5803 zcmZ`-U2o*J6@BQs+1A)Joqi?L78v-YfPp>)K@g;G6h%wip+qf7%~*aJIEfc9U~B@{ z0h)i*pV>oF+Bq6cA9Y3E&vOqi`Q3m2`P*MtwlFHJUhS`nAK(Flxh!^5#FyZC6>DJ z(7qgu&`5(CDL}?T!MXDWmwCdZYA$2 zp!H6ze|OYdIQYi`9~5+~jw?D{9g;UJGa~4=Z+M+DN(Kkno8w+ATL0H>4Z!~(VO+(k1C{cqS5jI z_yB6{UO2V>>+-h`!0P||*;yx*5vT>lAbcGG2sDro4vj*BqHTv;22o?3J^`mhcNnf5 z5~ntz5@DvkFumHm6{T8Jl8xxJ-@udJXa-^jWX{nL1smImnWe&@aZ~tgzp>sg?I&qc zKr!!x(_U(LN=TJ8demkY7Gi0Q5sXMLT*+ya=xAlMXgSV8w52LXr>K|W=9J=@9p&7R zVy>UEeok#P&9W!B?EZb?kB$}%RyJlsbL1F zB-@;FoA28NoSgEy&Gw0tyTL`+tf?I%&2NJ3T_eCLig~7TV%W%97^z~t`B#amLY0;y zI;dRfq*kbew;RFr@Lj_$4&qQV~$BFB=35w!5idS2IC=;HuvLn3Og&e zEKj7rxzkR9Xd9&=9%7PzL6-Wa}?jL>=xqhKxjFUP*G%C~>$JuEC z#%M4VpnR0r5jFrH7c~zGiz-AQ9=eE0MqZLa!42lTnsuiiiC`AeM7JDCT04^0VzopU z*@e`o9fm(@-K3+&RYtw*@rUx1{s5_GU5_J7`ax+abwp};Faw*Nq&EXoi)t{BoiCRUSjb?3hE90a?(%%rMTegBNCYs2JU-ypn2+gRL?) z)&lfJwn3G)iBv?kCGNLjE)ZtRMa5i`I*=%>)cGL$>`0B3C@@U2HCGRr7-&@?QUK%= z5{KCfKGCXDq;Z{A*}`iSadyGU$Not;9v9bH%w0X0bU=`PFKZ1(AW79KjcYPVzz=vg z;CN~r$03>{zmR^Ll0yv>Sxn=M#Y#FHTI}78mr8=!C?4;z%OB$-0HF$lr-1+Sj8y@7eRIEg~Ve3wk9!Mk);Kj6*|Oww(UJv-{>j@NUKMmahVOLZv^RJE9MO&Z2{0m zhY6xV1t)5i&tghbe1(}V>Qs$t=saE?h*$8wBKalaEru=9-}NOXkt(+a5n~6tn3Gj` zh?f&CC14I>f|r!*!s#Zfp!#lgdvX5(hctm}iGlTRbi4W~fIF_@`?5)mgr z(W z^4+|3L|YHJMF;`NSK3Udc4B{^7bi+2_z-p29C;cf-FQ5JD$ySBklA@v_TWMaHNAV0 zw`I!w;Y*HSlznwZ_VpRrH)mwua+)R^U!D_wbx!#8IpH_wgx_Ahw$DF2ez<@BX{BZT==JCVB(=XHKYyb0456_Q3K3`p`|9t=O)63(JAMT&7e$(9l`{m*J n{m)NVuf_ArrDyk?EpbB)&@HD0sE>!Zf&j~f36AIc(V literal 31 ncmYe|;9_(4ck*!!nZU?6gOPCoBf|C*wrO8I7ErV zzbGX$FR`dni90+sC&#%cF|8yuMTyrfGcPr#62|2SE-gqc%FHiP;&!b_PAw?O%+E{A xQR4JXEG|hcN-ND#;&3b~$xKU3F42OUsO64qq!y}?T5uz^kd4$r7^wv}5&*AKM}z Date: Mon, 20 Mar 2023 17:25:47 -0700 Subject: [PATCH 116/439] update cloth stockpile defs --- data/stockpiles/adamantinecloth.dfstock | Bin 45 -> 24 bytes data/stockpiles/adamantinethread.dfstock | Bin 45 -> 24 bytes data/stockpiles/cloth.dfstock | Bin 4919 -> 5009 bytes data/stockpiles/thread.dfstock | Bin 4919 -> 5009 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/stockpiles/adamantinecloth.dfstock b/data/stockpiles/adamantinecloth.dfstock index e63bd31d021f0d0dce2373a5c6e31b96906b9962..38781d313086daffb7f7f89cc18b323bf439af80 100644 GIT binary patch delta 4 LcmdOum>>ZF0yqHf delta 26 icmb2pogg7Pfst_rBjW-_h82tw8yFdOFftrqWB>q8MFqS7 diff --git a/data/stockpiles/adamantinethread.dfstock b/data/stockpiles/adamantinethread.dfstock index 0b50c6c3935b0a4b210398ef7ff255fac2984266..2231b389f544c9daf78536e8ff6e0e7737c80874 100644 GIT binary patch delta 4 LcmdOum>>ZF0yqHf delta 26 icmb2pogg7Pfst_rBjW-_h82tw8yFdOFftrqWB>q8MFqS7 diff --git a/data/stockpiles/cloth.dfstock b/data/stockpiles/cloth.dfstock index fbe98f3728f2c53ed198b3883c8b24cd95670c47..26c4c52f300b14ad85bf66ff1df64ad35dbba7f6 100644 GIT binary patch literal 5009 zcma)ANsiPo6g>l7&=LZPVF9RCiRWbJPPr~aSV!kLNMc8bpQdi(tR=ONCY zzu%8vv)1VT+M2X$?8&slLtFoK>Wik+rm zf^BD-a;!+eKBDp!6znu^HL764(lF|FoKE~y-lj0zY7CD<7Q?DzxYZcJ=Hhx`6t)_} z-N+cWg=0k=&KD-IB8e4ASl&!wDG8+T2+lelV<|B-ms1!zjwb`>up2qf5y$J3OW3d+ z_cT|q7k3E`7p9AlM<6T^FQzJ$?*7|mdMwLGzx#B(5<1H~LjbKu-TEMC1E1HCy$Rd=1O`fF?UU7y55ya5J- z422jBp2AXOgC~d~pr=wI8-y7e*-+3^C6JBO*?1qQ+!H7+s{tzsrZ9XEb7>14#9ZD2 z6z&Qbp!gbxC^RHDKq2gl;?RnQ2eH@{`n)eJfd?^$t#DWX#<9B`HUkqdbxdJjl#`4= zUNr1Frm?%JQ=Y&N86<9n3$3bIh77~_G5bRyyXY~1g5rp%i zZ~<`F2|NR23{xis>|Kc?l6a~~EX`8G0!R(pTWTCMR&R=-FBHRJLow_+!ncvIG*bfg zg|IXezOaPnG-357iL)zVrHSAqAv^;JUp2ywNm#uVZU*IFE9dn^F_;&HE3NSOR0LZ} zVL4P-8I*sL1cJtI5{b=HHaX;p#xEyqVJ!{J2KbY*M zG+(lAd;BZ3_Ryz8XD86s?ivp*hmHC1_e5QJ@L~X4vn$5E4!gCLx$(T$18>us{l4!^ zQT9!-@r#$vh_&m!ts8GBTaG2zZ>?>ztts07z_K(uGl0)WrYRefJM>|H*Vbh@-M^_k Y_$`XQN72t{@hf`yJ6imS7Js9~J!7g}d;kCd diff --git a/data/stockpiles/thread.dfstock b/data/stockpiles/thread.dfstock index eee0653acbf1edd4577813336a0bc5f45e5c2ba9..2774f50e8a5aa2e2a55c51b13760eadd8daf8f9a 100644 GIT binary patch literal 5009 zcma)A$#R=87{2>fyUk3OnJ$O6N6?OM3dpt^wgH^>#yj*u`pjh_2`6k{uAe^r`-1rU z@5k<2+8Etk8*^-Ho0+D+Z>ryA-hRT9ibL#LM`)8q+xP?ru>Mr)PsgyeS(L>Lb5FVLp9Z6b@|>Sc=5vD(rOPbGTt{ z0u_-6=7>ZvbR_Z>w{8oGu`L98L@1^(Yzu=`M>vj)d<6xEPGMUTEG2mM^wIof}O^#Mip#W8b;lQ(}|zT>lB7tjp1>~Vpw$yw;ChZTwE`V!d7Fr z8yUm4aIA>K`N9NNB(Wk1%bO`IC4m$k!CA*+EG35KatcGo@nql}b|c3*;&^>>2^*H< zp5_V`15aS+1YUe1f`d#%FaaWlJ3z$HBSEkf{4FIYRzz{=@Fo#>lL)+o1>Ud%ccVyf z8u90rz$GPdF~}HpfFzg_o-6AsOES1@B!eX-87yzfVM$2==Zh4u>ZHWx;%AG*-`md!Lsn?Adoywy&2d9-a_0e2wpY zn)0bH{2A`eyy2NCs=<2SZZmvlzvG9u=9C{YHN$6iIyoWWQ@;OT+P|su;XlyvlLBRDVN7v*F{VCVv~8Y&d9DlXz_%k)=e15fdb{5>Rh~al{{se^W1;{6 literal 4919 zcma)AyOPr|6ph<-B(TG4hDWhOY3p&Nq|-V|V%D)ej(f*ySsAA6F6vv3$TLj@)-KU6BrT4&A=HfBj+$^F0d~G=7md~7lL=1d%e6|Bd&1J z3Ku}bd&D16=@q;IB8I6G3CxSYl@<&ZKwwc7SUd#BL1Sqa5|&XA>|Nn!^yPjLg!7_s z0dUs|JOgA5Qzr%NU5O)-c&bS(%~HbxNDbRtY8*6HZ;GKW6vJUdG3+|Rw~??kQv&sc zurw3Cu!QF{Vf7}7vnyexiQpt5JOc<{HNuTaSiKc)2IXHXm-R(4m=}dBt?>9%1Y1gB zIaF8~lz);0g2rzWjlY64z9bqyI5Zx7+CM2TN2Kv3(f-L8utKgGo(*rcCTmR5y3&nd zr}bAOw$IBM?gZ`(cd9nVee%w5H}B4H=lwmtv4^r~y~d1jKjz1{>~&!Aq{_R0Fzan@ zKChd7_g84+p^vA=j-b6gR32LP8`JLhL|J%n(Sx-)WW!#E-P*!zJ?~Y|+tucHY#Wp1 zZI$i(;*~RE?WV2E${TvQ97=H9TU)L7CaeDg^V}Rv4?Z23Ca+BD(EI&OUFP|C|E}=h Y*C_fHML(k1&*=HDX!bjr{fTCO0Y-01TmS$7 From 02c57f944a5d2c558c73a95e216699f5c12e80c2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:39:40 -0700 Subject: [PATCH 117/439] update weapon stockpile defs --- data/stockpiles/adamantineweapons.dfstock | Bin 0 -> 29 bytes data/stockpiles/artifactweapons.dfstock | Bin 38 -> 17 bytes data/stockpiles/bronzeweapons.dfstock | Bin 46 -> 25 bytes data/stockpiles/copperweapons.dfstock | Bin 46 -> 25 bytes data/stockpiles/ironweapons.dfstock | Bin 44 -> 23 bytes data/stockpiles/masterworkweapons.dfstock | Bin 39 -> 18 bytes data/stockpiles/metalweapons.dfstock | Bin 773 -> 730 bytes data/stockpiles/platinumweapons.dfstock | Bin 0 -> 27 bytes data/stockpiles/silverweapons.dfstock | Bin 0 -> 25 bytes data/stockpiles/steelweapons.dfstock | Bin 45 -> 24 bytes data/stockpiles/stoneweapons.dfstock | Bin 1885 -> 1898 bytes data/stockpiles/trapcomponents.dfstock | Bin 224 -> 203 bytes data/stockpiles/unusableweapons.dfstock | Bin 0 -> 7 bytes data/stockpiles/usableweapons.dfstock | Bin 0 -> 7 bytes data/stockpiles/woodentools.dfstock | Bin 35 -> 0 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/stockpiles/adamantineweapons.dfstock create mode 100644 data/stockpiles/platinumweapons.dfstock create mode 100644 data/stockpiles/silverweapons.dfstock create mode 100644 data/stockpiles/unusableweapons.dfstock create mode 100644 data/stockpiles/usableweapons.dfstock delete mode 100644 data/stockpiles/woodentools.dfstock diff --git a/data/stockpiles/adamantineweapons.dfstock b/data/stockpiles/adamantineweapons.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..6236196f0e9703f3b256c8587c99be8f028b9d62 GIT binary patch literal 29 kcmZo-lu{D$^z#pLcl7ggwsLfF^mX(L@$_@GU~pgn0BVv3@&Et; literal 0 HcmV?d00001 diff --git a/data/stockpiles/artifactweapons.dfstock b/data/stockpiles/artifactweapons.dfstock index ba91931e0e069823cbeac65cb2dec05c24991ead..0299f41d2e2478893dba784749fe9fb1bbdb440a 100644 GIT binary patch literal 17 YcmZo-q8j|IN~ diff --git a/data/stockpiles/copperweapons.dfstock b/data/stockpiles/copperweapons.dfstock index d3a2aac2fcfca2deb38ce1ed0cee9b2c0f4705b1..a30c53107a94b0364d319b0623a231d090d7afa1 100644 GIT binary patch delta 4 LcmdOsoFEAR0zd%q delta 26 icmb2tn;q8j|IN~ diff --git a/data/stockpiles/ironweapons.dfstock b/data/stockpiles/ironweapons.dfstock index 2128596fe949bfe1720f9d1be04bb0944fa24676..8c0afecd16e397bccd998712a9d78c4bbf3904ac 100644 GIT binary patch delta 4 LcmdN9pCAqZ0x$sU delta 26 icmWgFnIJAYfst_rBjW-_h82tw8yFdOFftrqWB>q7`vtiG diff --git a/data/stockpiles/masterworkweapons.dfstock b/data/stockpiles/masterworkweapons.dfstock index 29d2ec1b843a14908024805b9421815e739478fa..61bbfd17b1d585c72706429bb4cba09ac37fcc64 100644 GIT binary patch literal 18 ZcmZo- literal 39 vcmZo-qslWzek3t>e;=30@=O;2WH%0R delta 97 zcmcb`+RCQV#Q26)iO>ZF0yqHf delta 26 icmb2pogg7Pfst_rBjW-_h82tw8yFdOFftrqWB>q8MFqS7 diff --git a/data/stockpiles/stoneweapons.dfstock b/data/stockpiles/stoneweapons.dfstock index 8a6ee77aa472f31e712f4dc22ec701667beb9a5b..acba2374c111028ff8d0379cf57a00da29249a2c 100644 GIT binary patch delta 51 zcmcc1_ll3XiSgM+W=D24B?V7E{~&iqKTl^Xryzgd;CN>rS4Y2iXaAspU{{yW;1CN2 G2L=F{P!6yF delta 38 ucmaFGcbAX3iSfurW=D2O3kC;<35<+07#SBZGOS>f*ucoJgOT9?BLe`>dI@v@ diff --git a/data/stockpiles/trapcomponents.dfstock b/data/stockpiles/trapcomponents.dfstock index 9f7c4194b5c2a24dcf43d037cd3d6b2fc67c1592..475b530d4c5f17a7313a2a0660eb059dee4dfd50 100644 GIT binary patch delta 6 NcmaFBc$#s-X#fgk0|@{C delta 28 kcmX@j_<(W3Y0(Lcj58P+7cercV3gRv$gqQv;Q%880EDjx*8l(j diff --git a/data/stockpiles/unusableweapons.dfstock b/data/stockpiles/unusableweapons.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..6af8d1b5a2a48242cd3fb5bee39b763d76ced295 GIT binary patch literal 7 OcmZo-WU*jyU<3dK5CH)I literal 0 HcmV?d00001 diff --git a/data/stockpiles/usableweapons.dfstock b/data/stockpiles/usableweapons.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..248610ae941c9286c6d5750425297d6e8248c16e GIT binary patch literal 7 OcmZo-WU*j$U;qFG5&;1K literal 0 HcmV?d00001 diff --git a/data/stockpiles/woodentools.dfstock b/data/stockpiles/woodentools.dfstock deleted file mode 100644 index de3acb7945ccceee4f6fa92d626bd2fc0211ac87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 rcmYe|;bIB#_xBNE3HSGRnZU?6gOPCoBf| Date: Mon, 20 Mar 2023 17:42:21 -0700 Subject: [PATCH 118/439] update armor stockpile defs --- data/stockpiles/artifactarmor.dfstock | Bin 38 -> 17 bytes data/stockpiles/bronzearmor.dfstock | Bin 46 -> 25 bytes data/stockpiles/copperarmor.dfstock | Bin 46 -> 25 bytes data/stockpiles/ironarmor.dfstock | Bin 44 -> 23 bytes data/stockpiles/masterworkarmor.dfstock | Bin 39 -> 18 bytes data/stockpiles/metalarmor.dfstock | Bin 773 -> 730 bytes data/stockpiles/otherarmor.dfstock | Bin 122 -> 101 bytes data/stockpiles/steelarmor.dfstock | Bin 45 -> 24 bytes data/stockpiles/unusablearmor.dfstock | Bin 0 -> 7 bytes data/stockpiles/usablearmor.dfstock | Bin 0 -> 7 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/stockpiles/unusablearmor.dfstock create mode 100644 data/stockpiles/usablearmor.dfstock diff --git a/data/stockpiles/artifactarmor.dfstock b/data/stockpiles/artifactarmor.dfstock index 8d81ee35585d3995b7ae9bebca153b18d871bf9c..af207f4fd5cd112a3d676a9f8d81ca155e8fd70c 100644 GIT binary patch literal 17 YcmeBTq8j|IN~ diff --git a/data/stockpiles/copperarmor.dfstock b/data/stockpiles/copperarmor.dfstock index 695eeb321abfd6b97a795283860c10bf6d14655e..bc7b8ec58e5a07cb0a80cd813037b7c34e1a1bda 100644 GIT binary patch delta 4 LcmdOsoFEAR0zd%q delta 26 icmb2tn;q8j|IN~ diff --git a/data/stockpiles/ironarmor.dfstock b/data/stockpiles/ironarmor.dfstock index a1cdc6fd1133e9ca5d3978179972cfee9d28cfc3..9474bd69f36ca53d6a47ebd963b46b7d7fdcb39b 100644 GIT binary patch delta 4 LcmdN9pCAqZ0x$sU delta 26 icmWgFnIJAYfst_rBjW-_h82tw8yFdOFftrqWB>q7`vtiG diff --git a/data/stockpiles/masterworkarmor.dfstock b/data/stockpiles/masterworkarmor.dfstock index e3d457dc88d36da0dfd598376e1b424500ccfe9b..09330aa79153d2d16996ffb6a2cd168abe42cae3 100644 GIT binary patch literal 18 ZcmeBTqslWzek3t>e;=30@=O;2YL^a~ delta 97 zcmcb`+RCQV#rTHRiOqUhX$hn diff --git a/data/stockpiles/steelarmor.dfstock b/data/stockpiles/steelarmor.dfstock index aff9f56d2184b6ebf962722b3cff3868e3f4b02d..c2ba86fcbbe767fce19ad31f97eca698842a63a8 100644 GIT binary patch delta 4 LcmdOum>>ZF0yqHf delta 26 icmb2pogg7Pfst_rBjW-_h82tw8yFdOFftrqWB>q8MFqS7 diff --git a/data/stockpiles/unusablearmor.dfstock b/data/stockpiles/unusablearmor.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..d5b2e9c64925daefe29d8247bb6b02c69bdec9b8 GIT binary patch literal 7 OcmeBTWQkx%U<3dL2mwg| literal 0 HcmV?d00001 diff --git a/data/stockpiles/usablearmor.dfstock b/data/stockpiles/usablearmor.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..58c9296de954a2967b0d70677fde9aab32707c97 GIT binary patch literal 7 OcmeBTWQkx*U;qFH3IRy~ literal 0 HcmV?d00001 From d1db7b4ff39341014fcfae0ad2f40b11439ff3ef Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 17:44:05 -0700 Subject: [PATCH 119/439] round out the stockpile defs --- data/stockpiles/otherweapons.dfstock | Bin 122 -> 1992 bytes data/stockpiles/tools.dfstock | Bin 29 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/stockpiles/tools.dfstock diff --git a/data/stockpiles/otherweapons.dfstock b/data/stockpiles/otherweapons.dfstock index 3c59675f00eb52be2680bd170d2882ea23d568dc..f1127a78419b9876b5ec72273bbd1a410bf8b588 100644 GIT binary patch literal 1992 zcmZ`)+m6&Q3|*u_Jgi{3Uy6`WzXI`uo0=v}nv^)5-R?{Og>U1-IO&X3w<8|w_;P%F z?EZQ3_pUnJ$Jkc4gQt*Z<72kfp^1U3r()Ur>X~QCmQ!^Q=a1EGmzcxcc@n8^4Ib0w zR?l~4Th4p2J%PEc$Yvtg47UN7gI64Tx)jJG%4z8 z$xhMlyc${>P?$g*%g(DMQ!L6WHsV@Go9X->G4IFXsM-;~>v^z~-=h#?o#YMrz)nP4 zdP)t3qA*zQDerKB{K(#_4LlM;;g~7fdbTNNgQJ9E@Yg`_C*hbN#_O4qRRNj|Xu!-1(vDX|K7Xmf3 z0c>Ie(H6i;qM36d%k3VZjVa6*Hnh5?K~U+%3K=KD)X&%NUz~ORVQgC$y7Ov$T-^rL zbw3@qb2(TVI%Ga9v?{KfdMPr1Ifno)=BULNpFnL^h7jqihLQ%%(BB?eXcU3%nP)vFUs| z6cNLeq8}H4O6Y^j#$t7_*BW<2<3lNZtt0Y9c9^bO<0dA0(BWwC$Sj!Do(s&HySK3jP%VmSSw%dwj#my^5H85e& za}^DEGHh3ef}PGQq7(qWmSCmoME5hb)Z^z{a4RBl4>5jL0N_kuq(Q Date: Mon, 20 Mar 2023 19:09:29 -0700 Subject: [PATCH 120/439] add weapons toggle stockpile setting --- data/stockpiles/weapons.dfstock | Bin 0 -> 709 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/stockpiles/weapons.dfstock diff --git a/data/stockpiles/weapons.dfstock b/data/stockpiles/weapons.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..e4968f56d4a16f14d4fc2edfca5a24651d83c615 GIT binary patch literal 709 zcmZ{iJx&BM42741#s>hz@*^sGDnzxOj7g%+&&bIrbh!&R<7P}W5>Pz4D9_LNoafJr zuS>da!b?tXzDn%-xi{w*x(5P(NT0aYAW(K3qiAoe^Z?wYWu1F*Su5QjeUZ(HfFc{A zBd{3FrA)a&*W%5Yu7GP8Zqa?n&93R6W@mvW$6*qkA>Kami-W(liyz Date: Mon, 20 Mar 2023 19:21:44 -0700 Subject: [PATCH 121/439] in-progress docs --- docs/plugins/stockpiles.rst | 218 +++++++++++++++++++++++++++++++++++- 1 file changed, 216 insertions(+), 2 deletions(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 83cfada02..3d262b1e8 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -46,9 +46,18 @@ Examples Imports a player-exported settings file named ``plants``, or the library ``plants`` settings file if a player-exported file by that name doesn't exist. +``stockpiles import -m enable plants`` + Enables plants in the selected stockpile. +``stockpiles import -m disable category_food -f tallow`` + Disables all tallow in the selected food stockpile. ``stockpiles export mysettings`` Export the settings for the currently selected stockpile to a file named ``dfhack-config/stockpiles/mysettings.dfstock``. +``stockpiles export mysettings -i categories,types`` + Export the stockpile category and item settings, but ignore the container + and general settings. This allows you to import the configuration later + without touching the container and general settings of the target + stockpile. Options ------- @@ -92,6 +101,211 @@ The stockpiles settings library ------------------------------- DFHack comes with a library of useful stockpile settings files that are ready -for import: +for import. If the stockpile configuration that you need isn't directly +represented, you can often use the ``enable`` and ``disable`` modes and/or +the ``filter`` option to transform an existing saved stockpile setting. Some +stockpile configurations can only be achieved with filters since the contents +of the stockpile lists are different for each world. For example, to disable +all tallow in your main food stockpile, you'd run this command:: + + stockpiles import category_food -m disable -f tallow + +Top-level categories +~~~~~~~~~~~~~~~~~~~~ + +Each stockpile category has a file that allows you to enable or disable the +entire category, or with a filter, any matchable subset thereof:: + + category_ammo + category_animals + category_armor + category_bars_blocks + category_cloth + category_coins + category_corpses + category_finished_goods + category_food + category_furniture + category_gems + category_leather + category_refuse + category_sheets + category_stone + category_weapons + category_wood + +For many of the categories, there are also settings files that manipulate interesting +subsets of that category. + +Ammo stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +bolts +metalammo +boneammo +woodammo +masterworkammo +artifactammo + +Animal stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +traps +cages + +Armor stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +metalarmor +otherarmor +ironarmor +bronzearmor +copperarmor +steelarmor +masterworkarmor +artifactarmor +usablearmor +unusablearmor + + +Bar stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~ + +bars +metalbars +ironbars +pigironbars +steelbars +otherbars +coal +potash +ash +pearlash +soap +blocks + +Cloth stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +thread +adamantinethread +cloth +adamantinecloth + +Notes: + +* ``thread`` and ``cloth`` refers to all materials that are not adamantine. + +Finished goods stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +stonetools +woodtools +crafts +goblets +toys +masterworkfinishedgoods +artifactfinishedgoods + +Food stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +preparedmeals +unpreparedfish +plants +booze +seeds +dye +miscliquid +wax + +Furniture stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +pots +bags +buckets +sand +masterworkfurniture +artifactfurniture + +* Because of the limitations of Dwarf Fortress, ``bags`` cannot distinguish + between empty bags and bags filled with gypsum powder. + +Gem stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~ + +roughgems +roughglass +cutgems +cutglass +cutstone + +Refuse stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +=========== ================== ================== +Exclusive Forbid Permit +=========== ================== ================== +corpses forbidcorpses permitcorpses +skulls forbidskulls permitskulls +bones forbidbones permitbones +shells forbidshells permitshells +teeth forbidteeth permitteeth +horns forbidhorns permithorns +hair forbidhair permithair +craftrefuse forbidcraftrefuse permitcraftrefuse +=========== ================== ================== + +Notes: + +* ``usablehair`` Only hair and wool that can make usable clothing is included, + i.e. from sheep, llamas, alpacas, and trolls. +* ``craftrefuse`` includes everything a craftsdwarf or tailor can use: skulls, + bones, shells, teeth, horns, and "usable" hair/wool (defined above). + +rawhides +tannedhides +usablehair + +You can get a stockpile of usable refuse with the following set of commands:: + + stockpiles import category_refuse -m enable -f skulls + stockpiles import category_refuse -m enable -f bones + stockpiles import category_refuse -m enable -f shells + stockpiles import category_refuse -m enable -f teeth + stockpiles import category_refuse -m enable -f horns + stockpiles import usablehair -m enable + +Stone stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +metalore +ironore +economic +flux +plasterproducing +coalproducing +otherstone +bauxite +clay + +Weapon stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -TODO: port alias library here +weapons +metalweapons +stoneweapons +otherweapons +trapcomponents +ironweapons +silverweapons +bronzeweapons +copperweapons +steelweapons +platinumweapons +adamantineweapons +masterworkweapons +artifactweapons +usableweapons +unusableweapons From 581c7370ca24a670e86eb41e64417e74249c6cfc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 22:29:26 -0700 Subject: [PATCH 122/439] prepend searchable prefix --- plugins/stockpiles/StockpileSerializer.cpp | 315 ++++++++++----------- plugins/stockpiles/StockpileSerializer.h | 6 +- 2 files changed, 156 insertions(+), 165 deletions(-) diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 32546053d..203d466b0 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -222,29 +222,34 @@ static typename df::enum_traits::base_type linear_index(df::enum_traits tr return -1; } -static void set_elem(bool all, char val, bool enabled, bool& elem) { - if (all || enabled) - elem = val; -} - static bool matches_filter(const string& filter, const string& name) { if (!filter.size()) return true; + DEBUG(log).print("searching for '%s' in '%s'\n", filter.c_str(), name.c_str()); return std::search(name.begin(), name.end(), filter.begin(), filter.end(), [](unsigned char ch1, unsigned char ch2) { return std::toupper(ch1) == std::toupper(ch2); } ) != name.end(); } -static void set_filter_elem(const string& filter, char val, const string& name, const string& id, char& elem) { - if (matches_filter(filter, name)) { +static void set_flag(const char* name, const string& filter, bool all, char val, bool enabled, bool& elem) { + if ((all || enabled) && matches_filter(filter, name)) { + DEBUG(log).print("setting %s to %d\n", name, val); + elem = val; + } +} + +static void set_filter_elem(const char* subcat, const string& filter, char val, + const string& name, const string& id, char& elem) { + if (matches_filter(filter, subcat + ((*subcat ? "/" : "") + name))) { DEBUG(log).print("setting %s (%s) to %d\n", name.c_str(), id.c_str(), val); elem = val; } } template -static void set_filter_elem(const string& filter, T_val val, const string& name, T_id id, T_val& elem) { - if (matches_filter(filter, name)) { +static void set_filter_elem(const char* subcat, const string& filter, T_val val, + const string& name, T_id id, T_val& elem) { + if (matches_filter(filter, subcat + ((*subcat ? "/" : "") + name))) { DEBUG(log).print("setting %s (%d) to %d\n", name.c_str(), (int32_t)id, val); elem = val; } @@ -286,15 +291,15 @@ static bool serialize_list_itemdef(FuncWriteExport add_value, return all; } -static void unserialize_list_itemdef(bool all, char val, const string& filter, FuncReadImport read_value, - int32_t list_size, std::vector& pile_list, item_type::item_type type) { +static void unserialize_list_itemdef(const char* subcat, bool all, char val, const string& filter, + FuncReadImport read_value, int32_t list_size, std::vector& pile_list, item_type::item_type type) { int num_elems = Items::getSubtypeCount(type); pile_list.resize(num_elems, '\0'); if (all) { for (auto idx = 0; idx < num_elems; ++idx) { ItemTypeInfo ii; ii.decode(type, idx); - set_filter_elem(filter, val, ii.toString(), idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, ii.toString(), idx, pile_list.at(idx)); } return; } @@ -308,7 +313,7 @@ static void unserialize_list_itemdef(bool all, char val, const string& filter, F WARN(log).print("item type index invalid: %d\n", ii.subtype); continue; } - set_filter_elem(filter, val, id, ii.subtype, pile_list.at(ii.subtype)); + set_filter_elem(subcat, filter, val, id, ii.subtype, pile_list.at(ii.subtype)); } } @@ -334,12 +339,12 @@ static void quality_clear(bool(&pile_list)[7]) { std::fill(pile_list, pile_list + 7, false); } -static void unserialize_list_quality(bool all, bool val, const string& filter, +static void unserialize_list_quality(const char* subcat, bool all, bool val, const string& filter, FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]) { if (all) { for (auto idx = 0; idx < 7; ++idx) { string id = ENUM_KEY_STR(item_quality, (df::item_quality)idx); - set_filter_elem(filter, val, id, idx, pile_list[idx]); + set_filter_elem(subcat, filter, val, id, idx, pile_list[idx]); } return; } @@ -353,7 +358,7 @@ static void unserialize_list_quality(bool all, bool val, const string& filter, WARN(log).print("invalid quality token: %s\n", quality.c_str()); continue; } - set_filter_elem(filter, val, quality, idx, pile_list[idx]); + set_filter_elem(subcat, filter, val, quality, idx, pile_list[idx]); } } @@ -395,14 +400,14 @@ static bool serialize_list_other_mats( return all; } -static void unserialize_list_other_mats(bool all, char val, const string& filter, +static void unserialize_list_other_mats(const char* subcat, bool all, char val, const string& filter, const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { size_t num_elems = other_mats.size(); pile_list.resize(num_elems, '\0'); if (all) { for (auto & entry : other_mats) - set_filter_elem(filter, val, entry.second, entry.first, pile_list.at(entry.first)); + set_filter_elem(subcat, filter, val, entry.second, entry.first, pile_list.at(entry.first)); return; } @@ -417,7 +422,7 @@ static void unserialize_list_other_mats(bool all, char val, const string& filter WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, num_elems); continue; } - set_filter_elem(filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); } } @@ -445,14 +450,15 @@ static bool serialize_list_organic_mat(FuncWriteExport add_value, return all; } -static void unserialize_list_organic_mat(bool all, char val, const string& filter, FuncReadImport read_value, - size_t list_size, std::vector& pile_list, organic_mat_category::organic_mat_category cat) { +static void unserialize_list_organic_mat(const char* subcat, bool all, char val, const string& filter, + FuncReadImport read_value, size_t list_size, std::vector& pile_list, + organic_mat_category::organic_mat_category cat) { size_t num_elems = OrganicMatLookup::food_max_size(cat); pile_list.resize(num_elems, '\0'); if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string token = OrganicMatLookup::food_token_by_idx(cat, idx); - set_filter_elem(filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); } return; } @@ -464,7 +470,7 @@ static void unserialize_list_organic_mat(bool all, char val, const string& filte WARN(log).print("organic mat index too large! idx[%d] max_size[%zd]\n", idx, num_elems); continue; } - set_filter_elem(filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); } } @@ -493,8 +499,8 @@ static bool serialize_list_item_type(FuncItemAllowed is_allowed, return all; } -static void unserialize_list_item_type(bool all, char val, const string& filter, FuncItemAllowed is_allowed, - FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { +static void unserialize_list_item_type(const char* subcat, bool all, char val, const string& filter, + FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { // TODO can we remove the hardcoded list size? size_t num_elems = 112; pile_list.resize(num_elems, '\0'); @@ -506,7 +512,7 @@ static void unserialize_list_item_type(bool all, char val, const string& filter, if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string id = ENUM_KEY_STR(item_type, (df::item_type)idx); - set_filter_elem(filter, val, id, idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, id, idx, pile_list.at(idx)); } return; } @@ -523,7 +529,7 @@ static void unserialize_list_item_type(bool all, char val, const string& filter, WARN(log).print("error item_type index too large! idx[%d] max_size[%zd]\n", idx, num_elems); continue; } - set_filter_elem(filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); } } @@ -545,7 +551,7 @@ static bool serialize_list_material(FuncMaterialAllowed is_allowed, return all; } -static void unserialize_list_material(bool all, char val, const string& filter, +static void unserialize_list_material(const char* subcat, bool all, char val, const string& filter, FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { // we initialize all disallowed values to 1 @@ -562,7 +568,7 @@ static void unserialize_list_material(bool all, char val, const string& filter, for (size_t idx = 0; idx < num_elems; ++idx) { MaterialInfo mi; mi.decode(0, idx); - set_filter_elem(filter, val, mi.toString(), idx, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, mi.toString(), idx, pile_list.at(idx)); } return; } @@ -576,7 +582,7 @@ static void unserialize_list_material(bool all, char val, const string& filter, WARN(log).print("material type index invalid: %d\n", mi.index); continue; } - set_filter_elem(filter, val, id, mi.index, pile_list.at(mi.index)); + set_filter_elem(subcat, filter, val, id, mi.index, pile_list.at(mi.index)); } } @@ -598,14 +604,14 @@ static bool serialize_list_creature(FuncWriteExport add_value, const std::vector return all; } -static void unserialize_list_creature(bool all, char val, const string& filter, +static void unserialize_list_creature(const char* subcat, bool all, char val, const string& filter, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { size_t num_elems = world->raws.creatures.all.size(); pile_list.resize(num_elems, '\0'); if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { auto r = find_creature(idx); - set_filter_elem(filter, val, r->name[0], r->creature_id, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, r->name[0], r->creature_id, pile_list.at(idx)); } return; } @@ -618,7 +624,7 @@ static void unserialize_list_creature(bool all, char val, const string& filter, continue; } auto r = find_creature(idx); - set_filter_elem(filter, val, r->name[0], r->creature_id, pile_list.at(idx)); + set_filter_elem(subcat, filter, val, r->name[0], r->creature_id, pile_list.at(idx)); } } @@ -796,7 +802,7 @@ static void read_elem(const char *name, DeserializeMode mode, bool is_set = elem_fn() != 0; if (mode == DESERIALIZE_MODE_SET || is_set) { T_elem val = (mode == DESERIALIZE_MODE_DISABLE) ? 0 : elem_fn(); - DEBUG(log).print("setting %s=%d\n", name, val); + DEBUG(log).print("setting %s to %d\n", name, val); setting = val; } } @@ -809,17 +815,13 @@ static void read_category(const char *name, DeserializeMode mode, enum df::stockpile_group_set::Mask cat_mask, std::function clear_fn, std::function set_fn) { - bool has_cat = has_cat_fn(); - bool all = has_cat && cat_fn().has_all() && cat_fn().all(); - bool just_disable = all && mode == DESERIALIZE_MODE_DISABLE; - - if (mode == DESERIALIZE_MODE_SET || just_disable) { + if (mode == DESERIALIZE_MODE_SET) { DEBUG(log).print("clearing %s\n", name); cat_flags &= ~cat_mask; clear_fn(); } - if (!has_cat || just_disable) + if (!has_cat_fn()) return; if (mode == DESERIALIZE_MODE_DISABLE && !(cat_flags & cat_mask)) @@ -828,6 +830,7 @@ static void read_category(const char *name, DeserializeMode mode, if (mode == DESERIALIZE_MODE_SET || mode == DESERIALIZE_MODE_ENABLE) cat_flags |= cat_mask; + bool all = cat_fn().all(); char val = (mode == DESERIALIZE_MODE_DISABLE) ? (char)0 : (char)1; DEBUG(log).print("setting %s %s elements to %d\n", all ? "all" : "marked", name, val); @@ -932,32 +935,18 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil [&](bool all, char val) { auto & bammo = mBuffer.ammo(); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("type", all, val, filter, [&](const size_t& idx) -> const std::string& { return bammo.type(idx); }, bammo.type_size(), pammo.type, item_type::AMMO); - unserialize_list_material(all, val, filter, ammo_mat_is_allowed, + unserialize_list_material("mats", all, val, filter, ammo_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, bammo.mats_size(), pammo.mats); - pammo.other_mats.resize(2, '\0'); - if (bammo.other_mats_size() > 0) { - // TODO remove hardcoded value - for (int i = 0; i < bammo.other_mats_size(); ++i) { - const std::string token = bammo.other_mats(i); - const int32_t idx = token == "WOOD" ? 0 : token == "BONE" ? 1 - : -1; - DEBUG(log).print("other mats %d is %s\n", idx, token.c_str()); - if (idx == -1) - continue; - pammo.other_mats.at(idx) = 1; - } - } - pammo.other_mats.resize(2, '\0'); if (all) { - set_filter_elem(filter, val, "WOOD", 0, pammo.other_mats.at(0)); - set_filter_elem(filter, val, "BONE", 1, pammo.other_mats.at(1)); + set_filter_elem("other", filter, val, "WOOD", 0, pammo.other_mats.at(0)); + set_filter_elem("other", filter, val, "BONE", 1, pammo.other_mats.at(1)); } else { // TODO can we un-hardcode the values? for (int i = 0; i < bammo.other_mats_size(); ++i) { @@ -965,15 +954,15 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil const int32_t idx = id == "WOOD" ? 0 : id == "BONE" ? 1 : -1; if (idx == -1) continue; - set_filter_elem(filter, val, id, idx, pammo.other_mats.at(idx)); + set_filter_elem("other", filter, val, id, idx, pammo.other_mats.at(idx)); } } - unserialize_list_quality(all, val, filter, + unserialize_list_quality("core", all, val, filter, [&](const size_t& idx) -> const std::string& { return bammo.quality_core(idx); }, bammo.quality_core_size(), pammo.quality_core); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("total", all, val, filter, [&](const size_t& idx) -> const std::string& { return bammo.quality_total(idx); }, bammo.quality_total_size(), pammo.quality_total); }); @@ -1006,10 +995,10 @@ void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& [&](bool all, char val) { auto & banimals = mBuffer.animals(); - set_elem(all, val, banimals.empty_cages(), panimals.empty_cages); - set_elem(all, val, banimals.empty_traps(), panimals.empty_traps); + set_flag("cages", filter, all, val, banimals.empty_cages(), panimals.empty_cages); + set_flag("traps", filter, all, val, banimals.empty_traps(), panimals.empty_traps); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("", all, val, filter, [&](const size_t& idx) -> const std::string& { return banimals.enabled(idx); }, banimals.enabled_size(), panimals.enabled); }); @@ -1113,47 +1102,47 @@ void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & barmor = mBuffer.armor(); - set_elem(all, val, barmor.unusable(), parmor.unusable); - set_elem(all, val, barmor.usable(), parmor.usable); + set_flag("nouse", filter, all, val, barmor.unusable(), parmor.unusable); + set_flag("canuse", filter, all, val, barmor.usable(), parmor.usable); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("body", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.body(idx); }, barmor.body_size(), parmor.body, item_type::ARMOR); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("head", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.head(idx); }, barmor.head_size(), parmor.head, item_type::HELM); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("feet", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.feet(idx); }, barmor.feet_size(), parmor.feet, item_type::SHOES); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("hands", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.hands(idx); }, barmor.hands_size(), parmor.hands, item_type::GLOVES); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("legs", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.legs(idx); }, barmor.legs_size(), parmor.legs, item_type::PANTS); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("shield", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.shield(idx); }, barmor.shield_size(), parmor.shield, item_type::SHIELD); - unserialize_list_material(all, val, filter, + unserialize_list_material("mats", all, val, filter, armor_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return barmor.mats(idx); }, barmor.mats_size(), parmor.mats); - unserialize_list_other_mats(all, val, filter, + unserialize_list_other_mats("other", all, val, filter, mOtherMatsWeaponsArmor.mats, [&](const size_t& idx) -> const std::string& { return barmor.other_mats(idx); }, barmor.other_mats_size(), parmor.other_mats); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("core", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.quality_core(idx); }, barmor.quality_core_size(), parmor.quality_core); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("total", all, val, filter, [&](const size_t& idx) -> const std::string& { return barmor.quality_total(idx); }, barmor.quality_total_size(), parmor.quality_total); }); @@ -1197,29 +1186,29 @@ void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::stri mPile->settings.flags.whole, mPile->settings.flags.mask_bars_blocks, [&]() { - pbarsblocks.bars_other_mats.clear(); pbarsblocks.bars_mats.clear(); - pbarsblocks.blocks_other_mats.clear(); + pbarsblocks.bars_other_mats.clear(); pbarsblocks.blocks_mats.clear(); + pbarsblocks.blocks_other_mats.clear(); }, [&](bool all, char val) { auto & bbarsblocks = mBuffer.barsblocks(); - unserialize_list_material(all, val, filter, bars_mat_is_allowed, + unserialize_list_material("mats/bars", all, val, filter, bars_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bbarsblocks.bars_mats(idx); }, bbarsblocks.bars_mats_size(), pbarsblocks.bars_mats); - unserialize_list_material(all, val, filter, - blocks_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_mats(idx); }, - bbarsblocks.blocks_mats_size(), pbarsblocks.blocks_mats); - - unserialize_list_other_mats(all, val, filter, + unserialize_list_other_mats("other/bars", all, val, filter, mOtherMatsBars.mats, [&](const size_t& idx) -> const std::string& { return bbarsblocks.bars_other_mats(idx); }, bbarsblocks.bars_other_mats_size(), pbarsblocks.bars_other_mats); - unserialize_list_other_mats(all, val, filter, + unserialize_list_material("mats/blocks", all, val, filter, + blocks_mat_is_allowed, + [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_mats(idx); }, + bbarsblocks.blocks_mats_size(), pbarsblocks.blocks_mats); + + unserialize_list_other_mats("other/blocks", all, val, filter, mOtherMatsBlocks.mats, [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_other_mats(idx); }, bbarsblocks.blocks_other_mats_size(), pbarsblocks.blocks_other_mats); @@ -1272,47 +1261,47 @@ void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& fi mPile->settings.flags.whole, mPile->settings.flags.mask_cloth, [&]() { - pcloth.thread_metal.clear(); - pcloth.thread_plant.clear(); pcloth.thread_silk.clear(); pcloth.thread_yarn.clear(); - pcloth.cloth_metal.clear(); - pcloth.cloth_plant.clear(); + pcloth.thread_plant.clear(); + pcloth.thread_metal.clear(); pcloth.cloth_silk.clear(); + pcloth.cloth_plant.clear(); pcloth.cloth_yarn.clear(); + pcloth.cloth_metal.clear(); }, [&](bool all, char val) { auto & bcloth = mBuffer.cloth(); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("thread/silk", all, val, filter, [&](size_t idx) -> std::string { return bcloth.thread_silk(idx); }, bcloth.thread_silk_size(), pcloth.thread_silk, organic_mat_category::Silk); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("thread/plant", all, val, filter, [&](size_t idx) -> std::string { return bcloth.thread_plant(idx); }, bcloth.thread_plant_size(), pcloth.thread_plant, organic_mat_category::PlantFiber); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("thread/yarn", all, val, filter, [&](size_t idx) -> std::string { return bcloth.thread_yarn(idx); }, bcloth.thread_yarn_size(), pcloth.thread_yarn, organic_mat_category::Yarn); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("thread/metal", all, val, filter, [&](size_t idx) -> std::string { return bcloth.thread_metal(idx); }, bcloth.thread_metal_size(), pcloth.thread_metal, organic_mat_category::MetalThread); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("cloth/silk", all, val, filter, [&](size_t idx) -> std::string { return bcloth.cloth_silk(idx); }, bcloth.cloth_silk_size(), pcloth.cloth_silk, organic_mat_category::Silk); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("cloth/plant", all, val, filter, [&](size_t idx) -> std::string { return bcloth.cloth_plant(idx); }, bcloth.cloth_plant_size(), pcloth.cloth_plant, organic_mat_category::PlantFiber); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("cloth/yarn", all, val, filter, [&](size_t idx) -> std::string { return bcloth.cloth_yarn(idx); }, bcloth.cloth_yarn_size(), pcloth.cloth_yarn, organic_mat_category::Yarn); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("cloth/metal", all, val, filter, [&](size_t idx) -> std::string { return bcloth.cloth_metal(idx); }, bcloth.cloth_metal_size(), pcloth.cloth_metal, organic_mat_category::MetalThread); }); @@ -1342,7 +1331,7 @@ void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bcoin = mBuffer.coin(); - unserialize_list_material(all, val, filter, coins_mat_is_allowed, + unserialize_list_material("", all, val, filter, coins_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bcoin.mats(idx); }, bcoin.mats_size(), pcoins.mats); }); @@ -1426,23 +1415,23 @@ void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::s [&](bool all, char val) { auto & bfinished_goods = mBuffer.finished_goods(); - unserialize_list_item_type(all, val, filter, finished_goods_type_is_allowed, + unserialize_list_item_type("type", all, val, filter, finished_goods_type_is_allowed, [&](const size_t& idx) -> const std::string& { return bfinished_goods.type(idx); }, bfinished_goods.type_size(), pfinished_goods.type); - unserialize_list_material(all, val, filter, finished_goods_mat_is_allowed, + unserialize_list_material("mats", all, val, filter, finished_goods_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bfinished_goods.mats(idx); }, bfinished_goods.mats_size(), pfinished_goods.mats); - unserialize_list_other_mats(all, val, filter, mOtherMatsFinishedGoods.mats, + unserialize_list_other_mats("other", all, val, filter, mOtherMatsFinishedGoods.mats, [&](const size_t& idx) -> const std::string& { return bfinished_goods.other_mats(idx); }, bfinished_goods.other_mats_size(), pfinished_goods.other_mats); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("core", all, val, filter, [&](const size_t& idx) -> const std::string& { return bfinished_goods.quality_core(idx); }, bfinished_goods.quality_core_size(), pfinished_goods.quality_core); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("total", all, val, filter, [&](const size_t& idx) -> const std::string& { return bfinished_goods.quality_total(idx); }, bfinished_goods.quality_total_size(), pfinished_goods.quality_total); }); @@ -1458,7 +1447,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_meat(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; - return food_pair(setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); + return food_pair("meat", setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); } case organic_mat_category::Fish: { @@ -1466,7 +1455,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_fish(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; - return food_pair(setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); + return food_pair("fish", setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); } case organic_mat_category::UnpreparedFish: { @@ -1474,7 +1463,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_unprepared_fish(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; - return food_pair(setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); + return food_pair("unpreparedfish", setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); } case organic_mat_category::Eggs: { @@ -1482,7 +1471,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_egg(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; - return food_pair(setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); + return food_pair("egg", setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); } case organic_mat_category::Plants: { @@ -1490,7 +1479,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_plants(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; - return food_pair(setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); + return food_pair("plants", setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); } case organic_mat_category::PlantDrink: { @@ -1498,7 +1487,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_drink_plant(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; - return food_pair(setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); + return food_pair("drink/plant", setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); } case organic_mat_category::CreatureDrink: { @@ -1506,7 +1495,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_drink_animal(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; - return food_pair(setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); + return food_pair("drink/animal", setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); } case organic_mat_category::PlantCheese: { @@ -1514,7 +1503,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_cheese_plant(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; - return food_pair(setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); + return food_pair("cheese/plant", setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); } case organic_mat_category::CreatureCheese: { @@ -1522,7 +1511,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_cheese_animal(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; - return food_pair(setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); + return food_pair("cheese/animal", setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); } case organic_mat_category::Seed: { @@ -1530,7 +1519,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_seeds(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; - return food_pair(setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); + return food_pair("seeds", setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); } case organic_mat_category::Leaf: { @@ -1538,7 +1527,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_leaves(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; - return food_pair(setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); + return food_pair("leaves", setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); } case organic_mat_category::PlantPowder: { @@ -1546,7 +1535,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_powder_plant(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; - return food_pair(setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); + return food_pair("powder/plant", setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); } case organic_mat_category::CreaturePowder: { @@ -1554,7 +1543,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_powder_creature(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; - return food_pair(setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); + return food_pair("powder/animal", setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); } case organic_mat_category::Glob: { @@ -1562,7 +1551,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_glob(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; - return food_pair(setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); + return food_pair("glob", setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); } case organic_mat_category::PlantLiquid: { @@ -1570,7 +1559,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_liquid_plant(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; - return food_pair(setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); + return food_pair("liquid/plant", setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); } case organic_mat_category::CreatureLiquid: { @@ -1578,7 +1567,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_liquid_animal(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; - return food_pair(setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); + return food_pair("liquid/animal", setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); } case organic_mat_category::MiscLiquid: { @@ -1586,7 +1575,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_liquid_misc(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; - return food_pair(setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); + return food_pair("liquid/misc", setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); } case organic_mat_category::Paste: @@ -1595,7 +1584,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_glob_paste(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; - return food_pair(setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); + return food_pair("paste", setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); } case organic_mat_category::Pressed: { @@ -1603,7 +1592,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_glob_pressed(id); }; FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; - return food_pair(setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); + return food_pair("pressed", setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); } case organic_mat_category::Leather: case organic_mat_category::Silk: @@ -1671,13 +1660,13 @@ void StockpileSerializer::read_food(DeserializeMode mode, const std::string& fil [&](bool all, char val) { auto & bfood = mBuffer.food(); - set_elem(all, val, bfood.prepared_meals(), pfood.prepared_meals); + set_flag("preparedmeals", filter, all, val, bfood.prepared_meals(), pfood.prepared_meals); for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { food_pair p = food_map((organic_mat_category)mat_category); if (!p.valid) continue; - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat(p.name, all, val, filter, p.get_value, p.serialized_count, *p.stockpile_values, (organic_mat_category)mat_category); } @@ -1749,7 +1738,7 @@ void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string id = ENUM_KEY_STR(furniture_type, (df::furniture_type)idx); - set_filter_elem(filter, val, id, idx, pfurniture.type.at(idx)); + set_filter_elem("type", filter, val, id, idx, pfurniture.type.at(idx)); } } else { for (int i = 0; i < bfurniture.type_size(); ++i) { @@ -1759,23 +1748,23 @@ void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string WARN(log).print("furniture type index invalid %s, idx=%d\n", token.c_str(), idx); continue; } - set_filter_elem(filter, val, token, idx, pfurniture.type.at(idx)); + set_filter_elem("type", filter, val, token, idx, pfurniture.type.at(idx)); } } - unserialize_list_material(all, val, filter, furniture_mat_is_allowed, + unserialize_list_material("mats", all, val, filter, furniture_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bfurniture.mats(idx); }, bfurniture.mats_size(), pfurniture.mats); - unserialize_list_other_mats(all, val, filter, + unserialize_list_other_mats("other", all, val, filter, mOtherMatsFurniture.mats, [&](const size_t& idx) -> const std::string& { return bfurniture.other_mats(idx); }, bfurniture.other_mats_size(), pfurniture.other_mats); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("core", all, val, filter, [&](const size_t& idx) -> const std::string& { return bfurniture.quality_core(idx); }, bfurniture.quality_core_size(), pfurniture.quality_core); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("total", all, val, filter, [&](const size_t& idx) -> const std::string& { return bfurniture.quality_total(idx); }, bfurniture.quality_total_size(), pfurniture.quality_total); }); @@ -1853,11 +1842,11 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil [&](bool all, char val) { auto & bgems = mBuffer.gems(); - unserialize_list_material(all, val, filter, gem_mat_is_allowed, + unserialize_list_material("mats/rough", all, val, filter, gem_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bgems.rough_mats(idx); }, bgems.rough_mats_size(),pgems.rough_mats); - unserialize_list_material(all, val, filter, gem_cut_mat_is_allowed, + unserialize_list_material("mats/cut", all, val, filter, gem_cut_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bgems.cut_mats(idx); }, bgems.cut_mats_size(), pgems.cut_mats); @@ -1869,11 +1858,11 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil MaterialInfo mi; mi.decode(idx, -1); if (gem_other_mat_is_allowed(mi)) - set_filter_elem(filter, val, mi.getToken(), idx, pgems.rough_other_mats.at(idx)); + set_filter_elem("other/rough", filter, val, mi.getToken(), idx, pgems.rough_other_mats.at(idx)); if (!mi.isValid()) mi.decode(0, idx); if (gem_other_mat_is_allowed(mi)) - set_filter_elem(filter, val, mi.getToken(), idx, pgems.cut_other_mats.at(idx)); + set_filter_elem("other/cut", filter, val, mi.getToken(), idx, pgems.cut_other_mats.at(idx)); } return; } else { @@ -1881,10 +1870,10 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil for (size_t i = 0; i < builtin_size; ++i) { string id = bgems.rough_other_mats(i); if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) - set_filter_elem(filter, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); + set_filter_elem("other/rough", filter, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); id = bgems.cut_other_mats(i); if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) - set_filter_elem(filter, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); + set_filter_elem("other/cut", filter, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); } } }); @@ -1909,7 +1898,7 @@ void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& [&](bool all, char val) { auto & bleather = mBuffer.leather(); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("", all, val, filter, [&](size_t idx) -> std::string { return bleather.mats(idx); }, bleather.mats_size(), pleather.mats, organic_mat_category::Leather); }); @@ -1933,7 +1922,7 @@ void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& }, [&](bool all, char val) { auto & bcorpses = mBuffer.corpses_v50(); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("", all, val, filter, [&](const size_t& idx) -> const std::string& { return bcorpses.corpses(idx); }, bcorpses.corpses_size(), pcorpses.corpses); }); @@ -2010,35 +1999,35 @@ void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& f [&](bool all, char val) { auto & brefuse = mBuffer.refuse(); - set_elem(all, val, brefuse.fresh_raw_hide(), prefuse.fresh_raw_hide); - set_elem(all, val, brefuse.rotten_raw_hide(), prefuse.rotten_raw_hide); + set_flag("rawhide/fresh", filter, all, val, brefuse.fresh_raw_hide(), prefuse.fresh_raw_hide); + set_flag("rawhide/rotten", filter, all, val, brefuse.rotten_raw_hide(), prefuse.rotten_raw_hide); - unserialize_list_item_type(all, val, filter, refuse_type_is_allowed, + unserialize_list_item_type("type", all, val, filter, refuse_type_is_allowed, [&](const size_t& idx) -> const string& { return brefuse.type(idx); }, brefuse.type_size(), prefuse.type); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("corpses", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.corpses(idx); }, brefuse.corpses_size(), prefuse.corpses); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("bodyparts", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.body_parts(idx); }, brefuse.body_parts_size(), prefuse.body_parts); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("skulls", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.skulls(idx); }, brefuse.skulls_size(), prefuse.skulls); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("bones", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.bones(idx); }, brefuse.bones_size(), prefuse.bones); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("hair", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.hair(idx); }, brefuse.hair_size(), prefuse.hair); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("shells", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.shells(idx); }, brefuse.shells_size(), prefuse.shells); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("teeth", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.teeth(idx); }, brefuse.teeth_size(), prefuse.teeth); - unserialize_list_creature(all, val, filter, + unserialize_list_creature("horns", all, val, filter, [&](const size_t& idx) -> const string& { return brefuse.horns(idx); }, brefuse.horns_size(), prefuse.horns); }); @@ -2071,11 +2060,11 @@ void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bsheet = mBuffer.sheet(); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("paper", all, val, filter, [&](size_t idx) -> std::string { return bsheet.paper(idx); }, bsheet.paper_size(), psheet.paper, organic_mat_category::Paper); - unserialize_list_organic_mat(all, val, filter, + unserialize_list_organic_mat("parchment", all, val, filter, [&](size_t idx) -> std::string { return bsheet.parchment(idx); }, bsheet.parchment_size(), psheet.parchment, organic_mat_category::Parchment); }); @@ -2109,7 +2098,7 @@ void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bstone = mBuffer.stone(); - unserialize_list_material(all, val, filter, stone_is_allowed, + unserialize_list_material("", all, val, filter, stone_is_allowed, [&](const size_t& idx) -> const std::string& { return bstone.mats(idx); }, bstone.mats_size(), pstone.mats); }); @@ -2177,30 +2166,30 @@ void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& [&](bool all, char val) { auto & bweapons = mBuffer.weapons(); - set_elem(all, val, bweapons.unusable(), pweapons.unusable); - set_elem(all, val, bweapons.usable(), pweapons.usable); + set_flag("nouse", filter, all, val, bweapons.unusable(), pweapons.unusable); + set_flag("canuse", filter, all, val, bweapons.usable(), pweapons.usable); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("type/weapon", all, val, filter, [&](const size_t& idx) -> const std::string& { return bweapons.weapon_type(idx); }, bweapons.weapon_type_size(), pweapons.weapon_type, item_type::WEAPON); - unserialize_list_itemdef(all, val, filter, + unserialize_list_itemdef("type/trapcomp", all, val, filter, [&](const size_t& idx) -> const std::string& { return bweapons.trapcomp_type(idx); }, bweapons.trapcomp_type_size(), pweapons.trapcomp_type, item_type::TRAPCOMP); - unserialize_list_material(all, val, filter, weapons_mat_is_allowed, + unserialize_list_material("mats", all, val, filter, weapons_mat_is_allowed, [&](const size_t& idx) -> const std::string& { return bweapons.mats(idx); }, bweapons.mats_size(), pweapons.mats); - unserialize_list_other_mats(all, val, filter, mOtherMatsWeaponsArmor.mats, + unserialize_list_other_mats("other", all, val, filter, mOtherMatsWeaponsArmor.mats, [&](const size_t& idx) -> const std::string& { return bweapons.other_mats(idx); }, bweapons.other_mats_size(), pweapons.other_mats); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("core", all, val, filter, [&](const size_t& idx) -> const std::string& { return bweapons.quality_core(idx); }, bweapons.quality_core_size(), pweapons.quality_core); - unserialize_list_quality(all, val, filter, + unserialize_list_quality("total", all, val, filter, [&](const size_t& idx) -> const std::string& { return bweapons.quality_total(idx); }, bweapons.quality_total_size(), pweapons.quality_total); }); @@ -2245,7 +2234,7 @@ void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& fil if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string id = world->raws.plants.all[idx]->id; - set_filter_elem(filter, val, id, idx, pwood.mats.at(idx)); + set_filter_elem("", filter, val, id, idx, pwood.mats.at(idx)); } } else { for (int i = 0; i < bwood.mats_size(); ++i) { @@ -2255,7 +2244,7 @@ void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& fil WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); continue; } - set_filter_elem(filter, val, token, idx, pwood.mats.at(idx)); + set_filter_elem("", filter, val, token, idx, pwood.mats.at(idx)); } } }); diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index 4085744d0..8573a453e 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -39,6 +39,7 @@ typedef std::function FuncMaterialAllowed; // convenient struct for parsing food stockpile items struct food_pair { + const char * name; // exporting FuncWriteExport set_value; std::vector* stockpile_values; @@ -47,8 +48,9 @@ struct food_pair { size_t serialized_count; bool valid; - food_pair(FuncWriteExport s, std::vector* sp_v, FuncReadImport g, size_t count) - : set_value(s), stockpile_values(sp_v), get_value(g), serialized_count(count), valid(true) { } + food_pair(const char * n, FuncWriteExport s, std::vector* sp_v, FuncReadImport g, size_t count) + : name(n), set_value(s), stockpile_values(sp_v), get_value(g), serialized_count(count), + valid(true) { } food_pair(): valid(false) { } }; From cabdfe67bf90bcbca65b15d22b32b61d7f017be8 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 23:25:21 -0700 Subject: [PATCH 123/439] remove quality sp settings, update bolts --- data/stockpiles/artifactammo.dfstock | 2 -- data/stockpiles/artifactarmor.dfstock | Bin 17 -> 0 bytes data/stockpiles/artifactfinishedgoods.dfstock | 2 -- data/stockpiles/artifactfurniture.dfstock | 2 -- data/stockpiles/artifactweapons.dfstock | Bin 17 -> 0 bytes data/stockpiles/bolts.dfstock | 4 ++-- data/stockpiles/masterworkammo.dfstock | 1 - data/stockpiles/masterworkarmor.dfstock | Bin 18 -> 0 bytes data/stockpiles/masterworkfinishedgoods.dfstock | 1 - data/stockpiles/masterworkfurniture.dfstock | 1 - data/stockpiles/masterworkweapons.dfstock | Bin 18 -> 0 bytes 11 files changed, 2 insertions(+), 11 deletions(-) delete mode 100644 data/stockpiles/artifactammo.dfstock delete mode 100644 data/stockpiles/artifactarmor.dfstock delete mode 100644 data/stockpiles/artifactfinishedgoods.dfstock delete mode 100644 data/stockpiles/artifactfurniture.dfstock delete mode 100644 data/stockpiles/artifactweapons.dfstock delete mode 100644 data/stockpiles/masterworkammo.dfstock delete mode 100644 data/stockpiles/masterworkarmor.dfstock delete mode 100644 data/stockpiles/masterworkfinishedgoods.dfstock delete mode 100644 data/stockpiles/masterworkfurniture.dfstock delete mode 100644 data/stockpiles/masterworkweapons.dfstock diff --git a/data/stockpiles/artifactammo.dfstock b/data/stockpiles/artifactammo.dfstock deleted file mode 100644 index 16cd6f57e..000000000 --- a/data/stockpiles/artifactammo.dfstock +++ /dev/null @@ -1,2 +0,0 @@ -B -"Artifact \ No newline at end of file diff --git a/data/stockpiles/artifactarmor.dfstock b/data/stockpiles/artifactarmor.dfstock deleted file mode 100644 index af207f4fd5cd112a3d676a9f8d81ca155e8fd70c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 YcmeBT From 876425fbc8a5118e1331f152e4fedc3765b8e809 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 23:25:52 -0700 Subject: [PATCH 124/439] allow multiple filters --- docs/plugins/stockpiles.rst | 47 +- plugins/lua/stockpiles.lua | 6 +- plugins/stockpiles/StockpileSerializer.cpp | 686 +++++++++++---------- plugins/stockpiles/StockpileSerializer.h | 40 +- plugins/stockpiles/stockpiles.cpp | 5 +- 5 files changed, 403 insertions(+), 381 deletions(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 3d262b1e8..c36031ad7 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -77,14 +77,15 @@ Options to the stockpile, but no other settings are changed. In ``disable`` mode, enabled settings in the file are *removed* from the current stockpile configuration, and nothing else is changed. -``-f``, ``--filter `` - When importing, only modify the settings that contain the given substring. +``-f``, ``--filter [,...]`` + When importing, only modify the settings that contain at least one of the + given substrings. Configuration elements ---------------------- -The different configuration elements you can include in an exported settings file -are: +The different configuration elements you can include in an exported settings +file are: :containers: Max bins, max barrels, and num wheelbarrows. :general: Whether the stockpile takes from links only and whether organic @@ -104,9 +105,9 @@ DFHack comes with a library of useful stockpile settings files that are ready for import. If the stockpile configuration that you need isn't directly represented, you can often use the ``enable`` and ``disable`` modes and/or the ``filter`` option to transform an existing saved stockpile setting. Some -stockpile configurations can only be achieved with filters since the contents -of the stockpile lists are different for each world. For example, to disable -all tallow in your main food stockpile, you'd run this command:: +stockpile configurations can only be achieved with filters since the stockpile +lists are different for each world. For example, to disable all tallow in your +main food stockpile, you'd run this command:: stockpiles import category_food -m disable -f tallow @@ -134,18 +135,34 @@ entire category, or with a filter, any matchable subset thereof:: category_weapons category_wood -For many of the categories, there are also settings files that manipulate interesting -subsets of that category. +For many of the categories, there are also subcategory prefixes that you can +match with filters and convenient pre-made settings files that manipulate +interesting category subsets. Ammo stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~ -bolts -metalammo -boneammo -woodammo -masterworkammo -artifactammo +Subcategory prefixes:: + + type/ + mats/ + other/ + core/ + total/ + +Convenience settings files:: + + bolts + metalammo + boneammo + woodammo + +Example commands for a stockpile of metal bolts:: + + stockpiles import category_ammo + stockpiles import -m disable -f other/ category_ammo + stockpiles import -m disable -f type/ category_ammo + stockpiles import -m enable bolts Animal stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index 1a92e2c0c..f9c7d7b4a 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -113,7 +113,7 @@ local function import_stockpile(name, opts) else name = STOCKPILES_LIBRARY_DIR .. '/' .. name end - stockpiles_import(name, get_sp_id(opts), opts.mode, opts.filter) + stockpiles_import(name, get_sp_id(opts), opts.mode, table.concat(opts.filters, ',')) end local valid_includes = {general=true, categories=true, types=true} @@ -145,11 +145,11 @@ local function process_args(opts, args) opts.includes = {} opts.mode = 'set' - opts.filter = '' + opts.filters = {} return argparse.processArgsGetopt(args, { {'f', 'filter', hasArg=true, - handler=function(arg) opts.filter = arg end}, + handler=function(arg) opts.filters = argparse.stringList(arg) end}, {'h', 'help', handler=function() opts.help = true end}, {'i', 'include', hasArg=true, handler=function(arg) opts.includes = parse_include(arg) end}, diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 203d466b0..ca51c0b3e 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -168,7 +168,7 @@ bool StockpileSerializer::serialize_to_ostream(std::ostream* output, uint32_t in return output->good(); } -bool StockpileSerializer::serialize_to_file(const std::string& file, uint32_t includedElements) { +bool StockpileSerializer::serialize_to_file(const string& file, uint32_t includedElements) { std::fstream output(file, std::ios::out | std::ios::binary | std::ios::trunc); if (output.fail()) { WARN(log).print("ERROR: failed to open file for writing: '%s'\n", @@ -178,7 +178,7 @@ bool StockpileSerializer::serialize_to_file(const std::string& file, uint32_t in return serialize_to_ostream(&output, includedElements); } -bool StockpileSerializer::parse_from_istream(std::istream* input, DeserializeMode mode, const std::string& filter) { +bool StockpileSerializer::parse_from_istream(std::istream* input, DeserializeMode mode, const vector& filters) { if (input->fail()) return false; mBuffer.Clear(); @@ -186,18 +186,18 @@ bool StockpileSerializer::parse_from_istream(std::istream* input, DeserializeMod const bool res = mBuffer.ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); if (res) - read(mode, filter); + read(mode, filters); return res; } -bool StockpileSerializer::unserialize_from_file(const std::string& file, DeserializeMode mode, const string& filter) { +bool StockpileSerializer::unserialize_from_file(const string& file, DeserializeMode mode, const vector& filters) { std::fstream input(file, std::ios::in | std::ios::binary); if (input.fail()) { WARN(log).print("failed to open file for reading: '%s'\n", file.c_str()); return false; } - return parse_from_istream(&input, mode, filter); + return parse_from_istream(&input, mode, filters); } /** @@ -207,7 +207,7 @@ bool StockpileSerializer::unserialize_from_file(const std::string& file, Deseria * @return the enum's value, -1 if not found */ template -static typename df::enum_traits::base_type linear_index(df::enum_traits traits, const std::string& token) { +static typename df::enum_traits::base_type linear_index(df::enum_traits traits, const string& token) { auto j = traits.first_item_value; auto limit = traits.last_item_value; // sometimes enums start at -1, which is bad news for array indexing @@ -222,34 +222,36 @@ static typename df::enum_traits::base_type linear_index(df::enum_traits tr return -1; } -static bool matches_filter(const string& filter, const string& name) { - if (!filter.size()) - return true; - DEBUG(log).print("searching for '%s' in '%s'\n", filter.c_str(), name.c_str()); - return std::search(name.begin(), name.end(), filter.begin(), filter.end(), - [](unsigned char ch1, unsigned char ch2) { return std::toupper(ch1) == std::toupper(ch2); } - ) != name.end(); +static bool matches_filter(const vector& filters, const string& name) { + for (auto & filter : filters) { + DEBUG(log).print("searching for '%s' in '%s'\n", filter.c_str(), name.c_str()); + if (std::search(name.begin(), name.end(), filter.begin(), filter.end(), + [](unsigned char ch1, unsigned char ch2) { return std::toupper(ch1) == std::toupper(ch2); } + ) != name.end()) + return true; + } + return !filters.size(); } -static void set_flag(const char* name, const string& filter, bool all, char val, bool enabled, bool& elem) { - if ((all || enabled) && matches_filter(filter, name)) { +static void set_flag(const char* name, const vector& filters, bool all, char val, bool enabled, bool& elem) { + if ((all || enabled) && matches_filter(filters, name)) { DEBUG(log).print("setting %s to %d\n", name, val); elem = val; } } -static void set_filter_elem(const char* subcat, const string& filter, char val, +static void set_filter_elem(const char* subcat, const vector& filters, char val, const string& name, const string& id, char& elem) { - if (matches_filter(filter, subcat + ((*subcat ? "/" : "") + name))) { + if (matches_filter(filters, subcat + ((*subcat ? "/" : "") + name))) { DEBUG(log).print("setting %s (%s) to %d\n", name.c_str(), id.c_str(), val); elem = val; } } template -static void set_filter_elem(const char* subcat, const string& filter, T_val val, +static void set_filter_elem(const char* subcat, const vector& filters, T_val val, const string& name, T_id id, T_val& elem) { - if (matches_filter(filter, subcat + ((*subcat ? "/" : "") + name))) { + if (matches_filter(filters, subcat + ((*subcat ? "/" : "") + name))) { DEBUG(log).print("setting %s (%d) to %d\n", name.c_str(), (int32_t)id, val); elem = val; } @@ -269,8 +271,8 @@ static void set_filter_elem(const char* subcat, const string& filter, T_val val, * The unserialization process is the same in reverse. */ static bool serialize_list_itemdef(FuncWriteExport add_value, - std::vector list, - std::vector items, + vector list, + vector items, item_type::item_type type) { bool all = true; for (size_t i = 0; i < list.size(); ++i) { @@ -291,15 +293,15 @@ static bool serialize_list_itemdef(FuncWriteExport add_value, return all; } -static void unserialize_list_itemdef(const char* subcat, bool all, char val, const string& filter, - FuncReadImport read_value, int32_t list_size, std::vector& pile_list, item_type::item_type type) { +static void unserialize_list_itemdef(const char* subcat, bool all, char val, const vector& filters, + FuncReadImport read_value, int32_t list_size, vector& pile_list, item_type::item_type type) { int num_elems = Items::getSubtypeCount(type); pile_list.resize(num_elems, '\0'); if (all) { for (auto idx = 0; idx < num_elems; ++idx) { ItemTypeInfo ii; ii.decode(type, idx); - set_filter_elem(subcat, filter, val, ii.toString(), idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, ii.toString(), idx, pile_list.at(idx)); } return; } @@ -313,7 +315,7 @@ static void unserialize_list_itemdef(const char* subcat, bool all, char val, con WARN(log).print("item type index invalid: %d\n", ii.subtype); continue; } - set_filter_elem(subcat, filter, val, id, ii.subtype, pile_list.at(ii.subtype)); + set_filter_elem(subcat, filters, val, id, ii.subtype, pile_list.at(ii.subtype)); } } @@ -328,7 +330,7 @@ static bool serialize_list_quality(FuncWriteExport add_value, all = false; continue; } - const std::string f_type(quality_traits::key_table[i]); + const string f_type(quality_traits::key_table[i]); add_value(f_type); DEBUG(log).print("adding quality %s\n", f_type.c_str()); } @@ -339,12 +341,12 @@ static void quality_clear(bool(&pile_list)[7]) { std::fill(pile_list, pile_list + 7, false); } -static void unserialize_list_quality(const char* subcat, bool all, bool val, const string& filter, +static void unserialize_list_quality(const char* subcat, bool all, bool val, const vector& filters, FuncReadImport read_value, int32_t list_size, bool(&pile_list)[7]) { if (all) { for (auto idx = 0; idx < 7; ++idx) { string id = ENUM_KEY_STR(item_quality, (df::item_quality)idx); - set_filter_elem(subcat, filter, val, id, idx, pile_list[idx]); + set_filter_elem(subcat, filters, val, id, idx, pile_list[idx]); } return; } @@ -352,26 +354,26 @@ static void unserialize_list_quality(const char* subcat, bool all, bool val, con using df::enums::item_quality::item_quality; df::enum_traits quality_traits; for (int i = 0; i < list_size; ++i) { - const std::string quality = read_value(i); + const string quality = read_value(i); df::enum_traits::base_type idx = linear_index(quality_traits, quality); if (idx < 0) { WARN(log).print("invalid quality token: %s\n", quality.c_str()); continue; } - set_filter_elem(subcat, filter, val, quality, idx, pile_list[idx]); + set_filter_elem(subcat, filters, val, quality, idx, pile_list[idx]); } } -static string other_mats_index(const std::map other_mats, +static string other_mats_index(const std::map other_mats, int idx) { auto it = other_mats.find(idx); if (it == other_mats.end()) - return std::string(); + return string(); return it->second; } -static int other_mats_token(const std::map other_mats, - const std::string& token) { +static int other_mats_token(const std::map other_mats, + const string& token) { for (auto it = other_mats.begin(); it != other_mats.end(); ++it) { if (it->second == token) return it->first; @@ -380,16 +382,16 @@ static int other_mats_token(const std::map other_mats, } static bool serialize_list_other_mats( - const std::map other_mats, + const std::map other_mats, FuncWriteExport add_value, - std::vector list) { + vector list) { bool all = true; for (size_t i = 0; i < list.size(); ++i) { if (!list.at(i)) { all = false; continue; } - const std::string token = other_mats_index(other_mats, i); + const string token = other_mats_index(other_mats, i); if (token.empty()) { WARN(log).print("invalid other material with index %zd\n", i); continue; @@ -400,19 +402,19 @@ static bool serialize_list_other_mats( return all; } -static void unserialize_list_other_mats(const char* subcat, bool all, char val, const string& filter, - const std::map other_mats, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { +static void unserialize_list_other_mats(const char* subcat, bool all, char val, const vector& filters, + const std::map other_mats, FuncReadImport read_value, int32_t list_size, vector& pile_list) { size_t num_elems = other_mats.size(); pile_list.resize(num_elems, '\0'); if (all) { for (auto & entry : other_mats) - set_filter_elem(subcat, filter, val, entry.second, entry.first, pile_list.at(entry.first)); + set_filter_elem(subcat, filters, val, entry.second, entry.first, pile_list.at(entry.first)); return; } for (int i = 0; i < list_size; ++i) { - const std::string token = read_value(i); + const string token = read_value(i); size_t idx = other_mats_token(other_mats, token); if (idx < 0) { WARN(log).print("invalid other mat with token %s\n", token.c_str()); @@ -422,12 +424,12 @@ static void unserialize_list_other_mats(const char* subcat, bool all, char val, WARN(log).print("other_mats index too large! idx[%zd] max_size[%zd]\n", idx, num_elems); continue; } - set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, token, idx, pile_list.at(idx)); } } static bool serialize_list_organic_mat(FuncWriteExport add_value, - const std::vector* list, + const vector* list, organic_mat_category::organic_mat_category cat) { bool all = true; if (!list) { @@ -439,7 +441,7 @@ static bool serialize_list_organic_mat(FuncWriteExport add_value, all = false; continue; } - std::string token = OrganicMatLookup::food_token_by_idx(cat, i); + string token = OrganicMatLookup::food_token_by_idx(cat, i); if (token.empty()) { DEBUG(log).print("food mat invalid :(\n"); continue; @@ -450,32 +452,32 @@ static bool serialize_list_organic_mat(FuncWriteExport add_value, return all; } -static void unserialize_list_organic_mat(const char* subcat, bool all, char val, const string& filter, - FuncReadImport read_value, size_t list_size, std::vector& pile_list, +static void unserialize_list_organic_mat(const char* subcat, bool all, char val, const vector& filters, + FuncReadImport read_value, size_t list_size, vector& pile_list, organic_mat_category::organic_mat_category cat) { size_t num_elems = OrganicMatLookup::food_max_size(cat); pile_list.resize(num_elems, '\0'); if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string token = OrganicMatLookup::food_token_by_idx(cat, idx); - set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, token, idx, pile_list.at(idx)); } return; } for (size_t i = 0; i < list_size; ++i) { - const std::string token = read_value(i); + const string token = read_value(i); int16_t idx = OrganicMatLookup::food_idx_by_token(cat, token); if (idx < 0 || size_t(idx) >= num_elems) { WARN(log).print("organic mat index too large! idx[%d] max_size[%zd]\n", idx, num_elems); continue; } - set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, token, idx, pile_list.at(idx)); } } static bool serialize_list_item_type(FuncItemAllowed is_allowed, - FuncWriteExport add_value, const std::vector& list) { + FuncWriteExport add_value, const vector& list) { using df::enums::item_type::item_type; using type_traits = df::enum_traits; @@ -490,7 +492,7 @@ static bool serialize_list_item_type(FuncItemAllowed is_allowed, continue; } const item_type type = (item_type)((df::enum_traits::base_type)i); - std::string r_type(type_traits::key_table[i + 1]); + string r_type(type_traits::key_table[i + 1]); if (!is_allowed(type)) continue; add_value(r_type); @@ -499,8 +501,8 @@ static bool serialize_list_item_type(FuncItemAllowed is_allowed, return all; } -static void unserialize_list_item_type(const char* subcat, bool all, char val, const string& filter, - FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { +static void unserialize_list_item_type(const char* subcat, bool all, char val, const vector& filters, + FuncItemAllowed is_allowed, FuncReadImport read_value, int32_t list_size, vector& pile_list) { // TODO can we remove the hardcoded list size? size_t num_elems = 112; pile_list.resize(num_elems, '\0'); @@ -512,7 +514,7 @@ static void unserialize_list_item_type(const char* subcat, bool all, char val, c if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string id = ENUM_KEY_STR(item_type, (df::item_type)idx); - set_filter_elem(subcat, filter, val, id, idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, id, idx, pile_list.at(idx)); } return; } @@ -520,7 +522,7 @@ static void unserialize_list_item_type(const char* subcat, bool all, char val, c using df::enums::item_type::item_type; df::enum_traits type_traits; for (int i = 0; i < list_size; ++i) { - const std::string token = read_value(i); + const string token = read_value(i); // subtract one because item_type starts at -1 const df::enum_traits::base_type idx = linear_index(type_traits, token) - 1; if (!is_allowed((item_type)idx)) @@ -529,12 +531,12 @@ static void unserialize_list_item_type(const char* subcat, bool all, char val, c WARN(log).print("error item_type index too large! idx[%d] max_size[%zd]\n", idx, num_elems); continue; } - set_filter_elem(subcat, filter, val, token, idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, token, idx, pile_list.at(idx)); } } static bool serialize_list_material(FuncMaterialAllowed is_allowed, - FuncWriteExport add_value, const std::vector& list) { + FuncWriteExport add_value, const vector& list) { bool all = true; MaterialInfo mi; for (size_t i = 0; i < list.size(); ++i) { @@ -551,9 +553,9 @@ static bool serialize_list_material(FuncMaterialAllowed is_allowed, return all; } -static void unserialize_list_material(const char* subcat, bool all, char val, const string& filter, +static void unserialize_list_material(const char* subcat, bool all, char val, const vector& filters, FuncMaterialAllowed is_allowed, FuncReadImport read_value, int32_t list_size, - std::vector& pile_list) { + vector& pile_list) { // we initialize all disallowed values to 1 // why? because that's how the memory is in DF before we muck with it. size_t num_elems = world->raws.inorganics.size(); @@ -568,7 +570,7 @@ static void unserialize_list_material(const char* subcat, bool all, char val, co for (size_t idx = 0; idx < num_elems; ++idx) { MaterialInfo mi; mi.decode(0, idx); - set_filter_elem(subcat, filter, val, mi.toString(), idx, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, mi.toString(), idx, pile_list.at(idx)); } return; } @@ -582,11 +584,11 @@ static void unserialize_list_material(const char* subcat, bool all, char val, co WARN(log).print("material type index invalid: %d\n", mi.index); continue; } - set_filter_elem(subcat, filter, val, id, mi.index, pile_list.at(mi.index)); + set_filter_elem(subcat, filters, val, id, mi.index, pile_list.at(mi.index)); } } -static bool serialize_list_creature(FuncWriteExport add_value, const std::vector& list) { +static bool serialize_list_creature(FuncWriteExport add_value, const vector& list) { bool all = true; for (size_t i = 0; i < list.size(); ++i) { @@ -604,14 +606,14 @@ static bool serialize_list_creature(FuncWriteExport add_value, const std::vector return all; } -static void unserialize_list_creature(const char* subcat, bool all, char val, const string& filter, - FuncReadImport read_value, int32_t list_size, std::vector& pile_list) { +static void unserialize_list_creature(const char* subcat, bool all, char val, const vector& filters, + FuncReadImport read_value, int32_t list_size, vector& pile_list) { size_t num_elems = world->raws.creatures.all.size(); pile_list.resize(num_elems, '\0'); if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { auto r = find_creature(idx); - set_filter_elem(subcat, filter, val, r->name[0], r->creature_id, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, r->name[0], r->creature_id, pile_list.at(idx)); } return; } @@ -624,7 +626,7 @@ static void unserialize_list_creature(const char* subcat, bool all, char val, co continue; } auto r = find_creature(idx); - set_filter_elem(subcat, filter, val, r->name[0], r->creature_id, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, r->name[0], r->creature_id, pile_list.at(idx)); } } @@ -754,34 +756,34 @@ void StockpileSerializer::write(uint32_t includedElements) { std::bind(&StockpileSerializer::write_wood, this, _1)); } -void StockpileSerializer::read(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read(DeserializeMode mode, const vector& filters) { DEBUG(log).print("==READ==\n"); read_containers(mode); read_general(mode); - read_ammo(mode, filter); - read_animals(mode, filter); - read_armor(mode, filter); - read_bars_blocks(mode, filter); - read_cloth(mode, filter); - read_coins(mode, filter); - read_finished_goods(mode, filter); - read_food(mode, filter); - read_furniture(mode, filter); - read_gems(mode, filter); - read_leather(mode, filter); + read_ammo(mode, filters); + read_animals(mode, filters); + read_armor(mode, filters); + read_bars_blocks(mode, filters); + read_cloth(mode, filters); + read_coins(mode, filters); + read_finished_goods(mode, filters); + read_food(mode, filters); + read_furniture(mode, filters); + read_gems(mode, filters); + read_leather(mode, filters); // support for old versions before corpses had a set if (mBuffer.has_corpses()) { StockpileSettings::CorpsesSet* corpses = mBuffer.mutable_corpses_v50(); corpses->set_all(true); } - read_corpses(mode, filter); + read_corpses(mode, filters); - read_refuse(mode, filter); - read_sheet(mode, filter); - read_stone(mode, filter); - read_weapons(mode, filter); - read_wood(mode, filter); + read_refuse(mode, filters); + read_sheet(mode, filters); + read_stone(mode, filters); + read_weapons(mode, filters); + read_wood(mode, filters); } void StockpileSerializer::write_containers() { @@ -880,14 +882,14 @@ static bool ammo_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { bool all = serialize_list_itemdef( - [&](const std::string& token) { ammo->add_type(token); }, + [&](const string& token) { ammo->add_type(token); }, mPile->settings.ammo.type, - std::vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), + vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), item_type::AMMO); all = serialize_list_material( ammo_mat_is_allowed, - [&](const std::string& token) { ammo->add_mats(token); }, + [&](const string& token) { ammo->add_mats(token); }, mPile->settings.ammo.mats) && all; if (mPile->settings.ammo.other_mats.size() > 2) { @@ -902,23 +904,23 @@ bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { all = false; continue; } - const std::string token = i == 0 ? "WOOD" : "BONE"; + const string token = i == 0 ? "WOOD" : "BONE"; ammo->add_other_mats(token); DEBUG(log).print("other mats %zd is %s\n", i, token.c_str()); } all = serialize_list_quality( - [&](const std::string& token) { ammo->add_quality_core(token); }, + [&](const string& token) { ammo->add_quality_core(token); }, mPile->settings.ammo.quality_core) && all; all = serialize_list_quality( - [&](const std::string& token) { ammo->add_quality_total(token); }, + [&](const string& token) { ammo->add_quality_total(token); }, mPile->settings.ammo.quality_total) && all; return all; } -void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_ammo(DeserializeMode mode, const vector& filters) { auto & pammo = mPile->settings.ammo; read_category("ammo", mode, std::bind(&StockpileSettings::has_ammo, mBuffer), @@ -935,35 +937,35 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const std::string& fil [&](bool all, char val) { auto & bammo = mBuffer.ammo(); - unserialize_list_itemdef("type", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bammo.type(idx); }, + unserialize_list_itemdef("type", all, val, filters, + [&](const size_t& idx) -> const string& { return bammo.type(idx); }, bammo.type_size(), pammo.type, item_type::AMMO); - unserialize_list_material("mats", all, val, filter, ammo_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bammo.mats(idx); }, + unserialize_list_material("mats", all, val, filters, ammo_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bammo.mats(idx); }, bammo.mats_size(), pammo.mats); pammo.other_mats.resize(2, '\0'); if (all) { - set_filter_elem("other", filter, val, "WOOD", 0, pammo.other_mats.at(0)); - set_filter_elem("other", filter, val, "BONE", 1, pammo.other_mats.at(1)); + set_filter_elem("other", filters, val, "WOOD", 0, pammo.other_mats.at(0)); + set_filter_elem("other", filters, val, "BONE", 1, pammo.other_mats.at(1)); } else { // TODO can we un-hardcode the values? for (int i = 0; i < bammo.other_mats_size(); ++i) { - const std::string id = bammo.other_mats(i); + const string id = bammo.other_mats(i); const int32_t idx = id == "WOOD" ? 0 : id == "BONE" ? 1 : -1; if (idx == -1) continue; - set_filter_elem("other", filter, val, id, idx, pammo.other_mats.at(idx)); + set_filter_elem("other", filters, val, id, idx, pammo.other_mats.at(idx)); } } - unserialize_list_quality("core", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bammo.quality_core(idx); }, + unserialize_list_quality("core", all, val, filters, + [&](const size_t& idx) -> const string& { return bammo.quality_core(idx); }, bammo.quality_core_size(), pammo.quality_core); - unserialize_list_quality("total", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bammo.quality_total(idx); }, + unserialize_list_quality("total", all, val, filters, + [&](const size_t& idx) -> const string& { return bammo.quality_total(idx); }, bammo.quality_total_size(), pammo.quality_total); }); } @@ -976,11 +978,11 @@ bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) animals->set_empty_traps(panimals.empty_traps); return serialize_list_creature( - [&](const std::string& token) { animals->add_enabled(token); }, + [&](const string& token) { animals->add_enabled(token); }, panimals.enabled) && all; } -void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_animals(DeserializeMode mode, const vector& filters) { auto & panimals = mPile->settings.animals; read_category("animals", mode, std::bind(&StockpileSettings::has_animals, mBuffer), @@ -995,11 +997,11 @@ void StockpileSerializer::read_animals(DeserializeMode mode, const std::string& [&](bool all, char val) { auto & banimals = mBuffer.animals(); - set_flag("cages", filter, all, val, banimals.empty_cages(), panimals.empty_cages); - set_flag("traps", filter, all, val, banimals.empty_traps(), panimals.empty_traps); + set_flag("cages", filters, all, val, banimals.empty_cages(), panimals.empty_cages); + set_flag("traps", filters, all, val, banimals.empty_traps(), panimals.empty_traps); - unserialize_list_creature("", all, val, filter, - [&](const size_t& idx) -> const std::string& { return banimals.enabled(idx); }, + unserialize_list_creature("", all, val, filters, + [&](const size_t& idx) -> const string& { return banimals.enabled(idx); }, banimals.enabled_size(), panimals.enabled); }); } @@ -1018,69 +1020,69 @@ bool StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { // armor type all = serialize_list_itemdef( - [&](const std::string& token) { armor->add_body(token); }, + [&](const string& token) { armor->add_body(token); }, parmor.body, - std::vector(world->raws.itemdefs.armor.begin(), world->raws.itemdefs.armor.end()), + vector(world->raws.itemdefs.armor.begin(), world->raws.itemdefs.armor.end()), item_type::ARMOR) && all; // helm type all = serialize_list_itemdef( - [&](const std::string& token) { armor->add_head(token); }, + [&](const string& token) { armor->add_head(token); }, parmor.head, - std::vector(world->raws.itemdefs.helms.begin(), world->raws.itemdefs.helms.end()), + vector(world->raws.itemdefs.helms.begin(), world->raws.itemdefs.helms.end()), item_type::HELM) && all; // shoes type all = serialize_list_itemdef( - [&](const std::string& token) { armor->add_feet(token); }, + [&](const string& token) { armor->add_feet(token); }, parmor.feet, - std::vector(world->raws.itemdefs.shoes.begin(), world->raws.itemdefs.shoes.end()), + vector(world->raws.itemdefs.shoes.begin(), world->raws.itemdefs.shoes.end()), item_type::SHOES) && all; // gloves type all = serialize_list_itemdef( - [&](const std::string& token) { armor->add_hands(token); }, + [&](const string& token) { armor->add_hands(token); }, parmor.hands, - std::vector(world->raws.itemdefs.gloves.begin(), world->raws.itemdefs.gloves.end()), + vector(world->raws.itemdefs.gloves.begin(), world->raws.itemdefs.gloves.end()), item_type::GLOVES) && all; // pant type all = serialize_list_itemdef( - [&](const std::string& token) { armor->add_legs(token); }, + [&](const string& token) { armor->add_legs(token); }, parmor.legs, - std::vector(world->raws.itemdefs.pants.begin(), world->raws.itemdefs.pants.end()), + vector(world->raws.itemdefs.pants.begin(), world->raws.itemdefs.pants.end()), item_type::PANTS) && all; // shield type all = serialize_list_itemdef( - [&](const std::string& token) { armor->add_shield(token); }, + [&](const string& token) { armor->add_shield(token); }, parmor.shield, - std::vector(world->raws.itemdefs.shields.begin(), world->raws.itemdefs.shields.end()), + vector(world->raws.itemdefs.shields.begin(), world->raws.itemdefs.shields.end()), item_type::SHIELD) && all; // materials all = serialize_list_material( armor_mat_is_allowed, - [&](const std::string& token) { armor->add_mats(token); }, + [&](const string& token) { armor->add_mats(token); }, parmor.mats) && all; // other mats all = serialize_list_other_mats( - mOtherMatsWeaponsArmor.mats, [&](const std::string& token) { armor->add_other_mats(token); }, + mOtherMatsWeaponsArmor.mats, [&](const string& token) { armor->add_other_mats(token); }, parmor.other_mats) && all; // quality core - all = serialize_list_quality([&](const std::string& token) { armor->add_quality_core(token); }, + all = serialize_list_quality([&](const string& token) { armor->add_quality_core(token); }, parmor.quality_core) && all; // quality total - all = serialize_list_quality([&](const std::string& token) { armor->add_quality_total(token); }, + all = serialize_list_quality([&](const string& token) { armor->add_quality_total(token); }, parmor.quality_total) && all; return all; } -void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_armor(DeserializeMode mode, const vector& filters) { auto & parmor = mPile->settings.armor; read_category("armor", mode, std::bind(&StockpileSettings::has_armor, mBuffer), @@ -1102,48 +1104,48 @@ void StockpileSerializer::read_armor(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & barmor = mBuffer.armor(); - set_flag("nouse", filter, all, val, barmor.unusable(), parmor.unusable); - set_flag("canuse", filter, all, val, barmor.usable(), parmor.usable); + set_flag("nouse", filters, all, val, barmor.unusable(), parmor.unusable); + set_flag("canuse", filters, all, val, barmor.usable(), parmor.usable); - unserialize_list_itemdef("body", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.body(idx); }, + unserialize_list_itemdef("body", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.body(idx); }, barmor.body_size(), parmor.body, item_type::ARMOR); - unserialize_list_itemdef("head", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.head(idx); }, + unserialize_list_itemdef("head", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.head(idx); }, barmor.head_size(), parmor.head, item_type::HELM); - unserialize_list_itemdef("feet", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.feet(idx); }, + unserialize_list_itemdef("feet", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.feet(idx); }, barmor.feet_size(), parmor.feet, item_type::SHOES); - unserialize_list_itemdef("hands", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.hands(idx); }, + unserialize_list_itemdef("hands", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.hands(idx); }, barmor.hands_size(), parmor.hands, item_type::GLOVES); - unserialize_list_itemdef("legs", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.legs(idx); }, + unserialize_list_itemdef("legs", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.legs(idx); }, barmor.legs_size(), parmor.legs, item_type::PANTS); - unserialize_list_itemdef("shield", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.shield(idx); }, + unserialize_list_itemdef("shield", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.shield(idx); }, barmor.shield_size(), parmor.shield, item_type::SHIELD); - unserialize_list_material("mats", all, val, filter, + unserialize_list_material("mats", all, val, filters, armor_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return barmor.mats(idx); }, + [&](const size_t& idx) -> const string& { return barmor.mats(idx); }, barmor.mats_size(), parmor.mats); - unserialize_list_other_mats("other", all, val, filter, - mOtherMatsWeaponsArmor.mats, [&](const size_t& idx) -> const std::string& { return barmor.other_mats(idx); }, + unserialize_list_other_mats("other", all, val, filters, + mOtherMatsWeaponsArmor.mats, [&](const size_t& idx) -> const string& { return barmor.other_mats(idx); }, barmor.other_mats_size(), parmor.other_mats); - unserialize_list_quality("core", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.quality_core(idx); }, + unserialize_list_quality("core", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.quality_core(idx); }, barmor.quality_core_size(), parmor.quality_core); - unserialize_list_quality("total", all, val, filter, - [&](const size_t& idx) -> const std::string& { return barmor.quality_total(idx); }, + unserialize_list_quality("total", all, val, filters, + [&](const size_t& idx) -> const string& { return barmor.quality_total(idx); }, barmor.quality_total_size(), parmor.quality_total); }); } @@ -1159,26 +1161,26 @@ static bool blocks_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { bool all = serialize_list_material( bars_mat_is_allowed, - [&](const std::string& token) { bars_blocks->add_bars_mats(token); }, + [&](const string& token) { bars_blocks->add_bars_mats(token); }, mPile->settings.bars_blocks.bars_mats); all = serialize_list_material( blocks_mat_is_allowed, - [&](const std::string& token) { bars_blocks->add_blocks_mats(token); }, + [&](const string& token) { bars_blocks->add_blocks_mats(token); }, mPile->settings.bars_blocks.blocks_mats) && all; all = serialize_list_other_mats( - mOtherMatsBars.mats, [&](const std::string& token) { bars_blocks->add_bars_other_mats(token); }, + mOtherMatsBars.mats, [&](const string& token) { bars_blocks->add_bars_other_mats(token); }, mPile->settings.bars_blocks.bars_other_mats) && all; all = serialize_list_other_mats( - mOtherMatsBlocks.mats, [&](const std::string& token) { bars_blocks->add_blocks_other_mats(token); }, + mOtherMatsBlocks.mats, [&](const string& token) { bars_blocks->add_blocks_other_mats(token); }, mPile->settings.bars_blocks.blocks_other_mats) && all; return all; } -void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const vector& filters) { auto & pbarsblocks = mPile->settings.bars_blocks; read_category("bars_blocks", mode, std::bind(&StockpileSettings::has_barsblocks, mBuffer), @@ -1194,23 +1196,23 @@ void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const std::stri [&](bool all, char val) { auto & bbarsblocks = mBuffer.barsblocks(); - unserialize_list_material("mats/bars", all, val, filter, bars_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bbarsblocks.bars_mats(idx); }, + unserialize_list_material("mats/bars", all, val, filters, bars_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bbarsblocks.bars_mats(idx); }, bbarsblocks.bars_mats_size(), pbarsblocks.bars_mats); - unserialize_list_other_mats("other/bars", all, val, filter, + unserialize_list_other_mats("other/bars", all, val, filters, mOtherMatsBars.mats, - [&](const size_t& idx) -> const std::string& { return bbarsblocks.bars_other_mats(idx); }, + [&](const size_t& idx) -> const string& { return bbarsblocks.bars_other_mats(idx); }, bbarsblocks.bars_other_mats_size(), pbarsblocks.bars_other_mats); - unserialize_list_material("mats/blocks", all, val, filter, + unserialize_list_material("mats/blocks", all, val, filters, blocks_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_mats(idx); }, + [&](const size_t& idx) -> const string& { return bbarsblocks.blocks_mats(idx); }, bbarsblocks.blocks_mats_size(), pbarsblocks.blocks_mats); - unserialize_list_other_mats("other/blocks", all, val, filter, + unserialize_list_other_mats("other/blocks", all, val, filters, mOtherMatsBlocks.mats, - [&](const size_t& idx) -> const std::string& { return bbarsblocks.blocks_other_mats(idx); }, + [&](const size_t& idx) -> const string& { return bbarsblocks.blocks_other_mats(idx); }, bbarsblocks.blocks_other_mats_size(), pbarsblocks.blocks_other_mats); }); } @@ -1219,41 +1221,41 @@ bool StockpileSerializer::write_cloth(StockpileSettings::ClothSet* cloth) { bool all = true; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_thread_silk(token); }, + [&](const string& token) { cloth->add_thread_silk(token); }, &mPile->settings.cloth.thread_silk, organic_mat_category::Silk) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_thread_plant(token); }, + [&](const string& token) { cloth->add_thread_plant(token); }, &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_thread_yarn(token); }, + [&](const string& token) { cloth->add_thread_yarn(token); }, &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_thread_metal(token); }, + [&](const string& token) { cloth->add_thread_metal(token); }, &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_cloth_silk(token); }, + [&](const string& token) { cloth->add_cloth_silk(token); }, &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_cloth_plant(token); }, + [&](const string& token) { cloth->add_cloth_plant(token); }, &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_cloth_yarn(token); }, + [&](const string& token) { cloth->add_cloth_yarn(token); }, &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn) && all; all = serialize_list_organic_mat( - [&](const std::string& token) { cloth->add_cloth_metal(token); }, + [&](const string& token) { cloth->add_cloth_metal(token); }, &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread) && all; return all; } -void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_cloth(DeserializeMode mode, const vector& filters) { auto & pcloth = mPile->settings.cloth; read_category("cloth", mode, std::bind(&StockpileSettings::has_cloth, mBuffer), @@ -1273,36 +1275,36 @@ void StockpileSerializer::read_cloth(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bcloth = mBuffer.cloth(); - unserialize_list_organic_mat("thread/silk", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.thread_silk(idx); }, + unserialize_list_organic_mat("thread/silk", all, val, filters, + [&](size_t idx) -> string { return bcloth.thread_silk(idx); }, bcloth.thread_silk_size(), pcloth.thread_silk, organic_mat_category::Silk); - unserialize_list_organic_mat("thread/plant", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.thread_plant(idx); }, + unserialize_list_organic_mat("thread/plant", all, val, filters, + [&](size_t idx) -> string { return bcloth.thread_plant(idx); }, bcloth.thread_plant_size(), pcloth.thread_plant, organic_mat_category::PlantFiber); - unserialize_list_organic_mat("thread/yarn", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.thread_yarn(idx); }, + unserialize_list_organic_mat("thread/yarn", all, val, filters, + [&](size_t idx) -> string { return bcloth.thread_yarn(idx); }, bcloth.thread_yarn_size(), pcloth.thread_yarn, organic_mat_category::Yarn); - unserialize_list_organic_mat("thread/metal", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.thread_metal(idx); }, + unserialize_list_organic_mat("thread/metal", all, val, filters, + [&](size_t idx) -> string { return bcloth.thread_metal(idx); }, bcloth.thread_metal_size(), pcloth.thread_metal, organic_mat_category::MetalThread); - unserialize_list_organic_mat("cloth/silk", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.cloth_silk(idx); }, + unserialize_list_organic_mat("cloth/silk", all, val, filters, + [&](size_t idx) -> string { return bcloth.cloth_silk(idx); }, bcloth.cloth_silk_size(), pcloth.cloth_silk, organic_mat_category::Silk); - unserialize_list_organic_mat("cloth/plant", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.cloth_plant(idx); }, + unserialize_list_organic_mat("cloth/plant", all, val, filters, + [&](size_t idx) -> string { return bcloth.cloth_plant(idx); }, bcloth.cloth_plant_size(), pcloth.cloth_plant, organic_mat_category::PlantFiber); - unserialize_list_organic_mat("cloth/yarn", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.cloth_yarn(idx); }, + unserialize_list_organic_mat("cloth/yarn", all, val, filters, + [&](size_t idx) -> string { return bcloth.cloth_yarn(idx); }, bcloth.cloth_yarn_size(), pcloth.cloth_yarn, organic_mat_category::Yarn); - unserialize_list_organic_mat("cloth/metal", all, val, filter, - [&](size_t idx) -> std::string { return bcloth.cloth_metal(idx); }, + unserialize_list_organic_mat("cloth/metal", all, val, filters, + [&](size_t idx) -> string { return bcloth.cloth_metal(idx); }, bcloth.cloth_metal_size(), pcloth.cloth_metal, organic_mat_category::MetalThread); }); } @@ -1314,11 +1316,11 @@ static bool coins_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_coins(StockpileSettings::CoinSet* coins) { return serialize_list_material( coins_mat_is_allowed, - [&](const std::string& token) { coins->add_mats(token); }, + [&](const string& token) { coins->add_mats(token); }, mPile->settings.coins.mats); } -void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_coins(DeserializeMode mode, const vector& filters) { auto & pcoins = mPile->settings.coins; read_category("coin", mode, std::bind(&StockpileSettings::has_coin, mBuffer), @@ -1331,8 +1333,8 @@ void StockpileSerializer::read_coins(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bcoin = mBuffer.coin(); - unserialize_list_material("", all, val, filter, coins_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bcoin.mats(idx); }, + unserialize_list_material("", all, val, filters, coins_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bcoin.mats(idx); }, bcoin.mats_size(), pcoins.mats); }); } @@ -1377,28 +1379,28 @@ static bool finished_goods_mat_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { bool all = serialize_list_item_type( finished_goods_type_is_allowed, - [&](const std::string& token) { finished_goods->add_type(token); }, + [&](const string& token) { finished_goods->add_type(token); }, mPile->settings.finished_goods.type); all = serialize_list_material( finished_goods_mat_is_allowed, - [&](const std::string& token) { finished_goods->add_mats(token); }, + [&](const string& token) { finished_goods->add_mats(token); }, mPile->settings.finished_goods.mats) && all; all = serialize_list_other_mats( - mOtherMatsFinishedGoods.mats, [&](const std::string& token) { finished_goods->add_other_mats(token); }, + mOtherMatsFinishedGoods.mats, [&](const string& token) { finished_goods->add_other_mats(token); }, mPile->settings.finished_goods.other_mats) && all; - all = serialize_list_quality([&](const std::string& token) { finished_goods->add_quality_core(token); }, + all = serialize_list_quality([&](const string& token) { finished_goods->add_quality_core(token); }, mPile->settings.finished_goods.quality_core) && all; - all = serialize_list_quality([&](const std::string& token) { finished_goods->add_quality_total(token); }, + all = serialize_list_quality([&](const string& token) { finished_goods->add_quality_total(token); }, mPile->settings.finished_goods.quality_total) && all; return all; } -void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_finished_goods(DeserializeMode mode, const vector& filters) { auto & pfinished_goods = mPile->settings.finished_goods; read_category("finished_goods", mode, std::bind(&StockpileSettings::has_finished_goods, mBuffer), @@ -1415,24 +1417,24 @@ void StockpileSerializer::read_finished_goods(DeserializeMode mode, const std::s [&](bool all, char val) { auto & bfinished_goods = mBuffer.finished_goods(); - unserialize_list_item_type("type", all, val, filter, finished_goods_type_is_allowed, - [&](const size_t& idx) -> const std::string& { return bfinished_goods.type(idx); }, + unserialize_list_item_type("type", all, val, filters, finished_goods_type_is_allowed, + [&](const size_t& idx) -> const string& { return bfinished_goods.type(idx); }, bfinished_goods.type_size(), pfinished_goods.type); - unserialize_list_material("mats", all, val, filter, finished_goods_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bfinished_goods.mats(idx); }, + unserialize_list_material("mats", all, val, filters, finished_goods_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bfinished_goods.mats(idx); }, bfinished_goods.mats_size(), pfinished_goods.mats); - unserialize_list_other_mats("other", all, val, filter, mOtherMatsFinishedGoods.mats, - [&](const size_t& idx) -> const std::string& { return bfinished_goods.other_mats(idx); }, + unserialize_list_other_mats("other", all, val, filters, mOtherMatsFinishedGoods.mats, + [&](const size_t& idx) -> const string& { return bfinished_goods.other_mats(idx); }, bfinished_goods.other_mats_size(), pfinished_goods.other_mats); - unserialize_list_quality("core", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bfinished_goods.quality_core(idx); }, + unserialize_list_quality("core", all, val, filters, + [&](const size_t& idx) -> const string& { return bfinished_goods.quality_core(idx); }, bfinished_goods.quality_core_size(), pfinished_goods.quality_core); - unserialize_list_quality("total", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bfinished_goods.quality_total(idx); }, + unserialize_list_quality("total", all, val, filters, + [&](const size_t& idx) -> const string& { return bfinished_goods.quality_total(idx); }, bfinished_goods.quality_total_size(), pfinished_goods.quality_total); }); } @@ -1443,155 +1445,155 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego switch (cat) { case organic_mat_category::Meat: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_meat(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().meat(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().meat(idx); }; return food_pair("meat", setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); } case organic_mat_category::Fish: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_fish(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().fish(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().fish(idx); }; return food_pair("fish", setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); } case organic_mat_category::UnpreparedFish: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_unprepared_fish(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().unprepared_fish(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().unprepared_fish(idx); }; return food_pair("unpreparedfish", setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); } case organic_mat_category::Eggs: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_egg(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().egg(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().egg(idx); }; return food_pair("egg", setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); } case organic_mat_category::Plants: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_plants(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().plants(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().plants(idx); }; return food_pair("plants", setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); } case organic_mat_category::PlantDrink: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_drink_plant(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().drink_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().drink_plant(idx); }; return food_pair("drink/plant", setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); } case organic_mat_category::CreatureDrink: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_drink_animal(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().drink_animal(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().drink_animal(idx); }; return food_pair("drink/animal", setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); } case organic_mat_category::PlantCheese: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_cheese_plant(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().cheese_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().cheese_plant(idx); }; return food_pair("cheese/plant", setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); } case organic_mat_category::CreatureCheese: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_cheese_animal(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().cheese_animal(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().cheese_animal(idx); }; return food_pair("cheese/animal", setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); } case organic_mat_category::Seed: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_seeds(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().seeds(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().seeds(idx); }; return food_pair("seeds", setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); } case organic_mat_category::Leaf: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_leaves(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().leaves(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().leaves(idx); }; return food_pair("leaves", setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); } case organic_mat_category::PlantPowder: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_powder_plant(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().powder_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().powder_plant(idx); }; return food_pair("powder/plant", setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); } case organic_mat_category::CreaturePowder: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_powder_creature(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().powder_creature(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().powder_creature(idx); }; return food_pair("powder/animal", setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); } case organic_mat_category::Glob: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_glob(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().glob(idx); }; return food_pair("glob", setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); } case organic_mat_category::PlantLiquid: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_liquid_plant(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_plant(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().liquid_plant(idx); }; return food_pair("liquid/plant", setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); } case organic_mat_category::CreatureLiquid: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_liquid_animal(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_animal(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().liquid_animal(idx); }; return food_pair("liquid/animal", setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); } case organic_mat_category::MiscLiquid: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_liquid_misc(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().liquid_misc(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().liquid_misc(idx); }; return food_pair("liquid/misc", setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); } case organic_mat_category::Paste: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_glob_paste(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob_paste(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().glob_paste(idx); }; return food_pair("paste", setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); } case organic_mat_category::Pressed: { - FuncWriteExport setter = [&](const std::string& id) { + FuncWriteExport setter = [&](const string& id) { mBuffer.mutable_food()->add_glob_pressed(id); }; - FuncReadImport getter = [&](size_t idx) -> std::string { return mBuffer.food().glob_pressed(idx); }; + FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().glob_pressed(idx); }; return food_pair("pressed", setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); } case organic_mat_category::Leather: @@ -1638,7 +1640,7 @@ bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { return all; } -void StockpileSerializer::read_food(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_food(DeserializeMode mode, const vector& filters) { using df::enums::organic_mat_category::organic_mat_category; using traits = df::enum_traits; @@ -1660,13 +1662,13 @@ void StockpileSerializer::read_food(DeserializeMode mode, const std::string& fil [&](bool all, char val) { auto & bfood = mBuffer.food(); - set_flag("preparedmeals", filter, all, val, bfood.prepared_meals(), pfood.prepared_meals); + set_flag("preparedmeals", filters, all, val, bfood.prepared_meals(), pfood.prepared_meals); for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { food_pair p = food_map((organic_mat_category)mat_category); if (!p.valid) continue; - unserialize_list_organic_mat(p.name, all, val, filter, + unserialize_list_organic_mat(p.name, all, val, filters, p.get_value, p.serialized_count, *p.stockpile_values, (organic_mat_category)mat_category); } @@ -1690,30 +1692,30 @@ bool StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furni all = false; continue; } - std::string f_type(type_traits::key_table[i]); + string f_type(type_traits::key_table[i]); furniture->add_type(f_type); DEBUG(log).print("furniture_type %zd is %s\n", i, f_type.c_str()); } all = serialize_list_material( furniture_mat_is_allowed, - [&](const std::string& token) { furniture->add_mats(token); }, + [&](const string& token) { furniture->add_mats(token); }, pfurniture.mats) && all; all = serialize_list_other_mats( mOtherMatsFurniture.mats, - [&](const std::string& token) { furniture->add_other_mats(token); }, + [&](const string& token) { furniture->add_other_mats(token); }, pfurniture.other_mats) && all; all = serialize_list_quality( - [&](const std::string& token) { furniture->add_quality_core(token); }, + [&](const string& token) { furniture->add_quality_core(token); }, pfurniture.quality_core) && all; all = serialize_list_quality( - [&](const std::string& token) { furniture->add_quality_total(token); }, + [&](const string& token) { furniture->add_quality_total(token); }, pfurniture.quality_total) && all; return all; } -void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_furniture(DeserializeMode mode, const vector& filters) { auto & pfurniture = mPile->settings.furniture; read_category("furniture", mode, std::bind(&StockpileSettings::has_furniture, mBuffer), @@ -1738,34 +1740,34 @@ void StockpileSerializer::read_furniture(DeserializeMode mode, const std::string if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string id = ENUM_KEY_STR(furniture_type, (df::furniture_type)idx); - set_filter_elem("type", filter, val, id, idx, pfurniture.type.at(idx)); + set_filter_elem("type", filters, val, id, idx, pfurniture.type.at(idx)); } } else { for (int i = 0; i < bfurniture.type_size(); ++i) { - const std::string token = bfurniture.type(i); + const string token = bfurniture.type(i); df::enum_traits::base_type idx = linear_index(type_traits, token); if (idx < 0 || size_t(idx) >= pfurniture.type.size()) { WARN(log).print("furniture type index invalid %s, idx=%d\n", token.c_str(), idx); continue; } - set_filter_elem("type", filter, val, token, idx, pfurniture.type.at(idx)); + set_filter_elem("type", filters, val, token, idx, pfurniture.type.at(idx)); } } - unserialize_list_material("mats", all, val, filter, furniture_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bfurniture.mats(idx); }, + unserialize_list_material("mats", all, val, filters, furniture_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bfurniture.mats(idx); }, bfurniture.mats_size(), pfurniture.mats); - unserialize_list_other_mats("other", all, val, filter, - mOtherMatsFurniture.mats, [&](const size_t& idx) -> const std::string& { return bfurniture.other_mats(idx); }, + unserialize_list_other_mats("other", all, val, filters, + mOtherMatsFurniture.mats, [&](const size_t& idx) -> const string& { return bfurniture.other_mats(idx); }, bfurniture.other_mats_size(), pfurniture.other_mats); - unserialize_list_quality("core", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bfurniture.quality_core(idx); }, + unserialize_list_quality("core", all, val, filters, + [&](const size_t& idx) -> const string& { return bfurniture.quality_core(idx); }, bfurniture.quality_core_size(), pfurniture.quality_core); - unserialize_list_quality("total", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bfurniture.quality_total(idx); }, + unserialize_list_quality("total", all, val, filters, + [&](const size_t& idx) -> const string& { return bfurniture.quality_total(idx); }, bfurniture.quality_total_size(), pfurniture.quality_total); }); } @@ -1789,12 +1791,12 @@ bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { bool all = serialize_list_material( gem_mat_is_allowed, - [&](const std::string& token) { gems->add_rough_mats(token); }, + [&](const string& token) { gems->add_rough_mats(token); }, pgems.rough_mats); all = serialize_list_material( gem_cut_mat_is_allowed, - [&](const std::string& token) { gems->add_cut_mats(token); }, + [&](const string& token) { gems->add_cut_mats(token); }, pgems.cut_mats) && all; for (size_t i = 0; i < pgems.rough_other_mats.size(); ++i) { @@ -1826,7 +1828,7 @@ bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { return all; } -void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_gems(DeserializeMode mode, const vector& filters) { auto & pgems = mPile->settings.gems; read_category("gems", mode, std::bind(&StockpileSettings::has_gems, mBuffer), @@ -1842,12 +1844,12 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil [&](bool all, char val) { auto & bgems = mBuffer.gems(); - unserialize_list_material("mats/rough", all, val, filter, gem_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bgems.rough_mats(idx); }, + unserialize_list_material("mats/rough", all, val, filters, gem_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bgems.rough_mats(idx); }, bgems.rough_mats_size(),pgems.rough_mats); - unserialize_list_material("mats/cut", all, val, filter, gem_cut_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bgems.cut_mats(idx); }, + unserialize_list_material("mats/cut", all, val, filters, gem_cut_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bgems.cut_mats(idx); }, bgems.cut_mats_size(), pgems.cut_mats); const size_t builtin_size = std::extentraws.mat_table.builtin)>::value; @@ -1858,11 +1860,11 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil MaterialInfo mi; mi.decode(idx, -1); if (gem_other_mat_is_allowed(mi)) - set_filter_elem("other/rough", filter, val, mi.getToken(), idx, pgems.rough_other_mats.at(idx)); + set_filter_elem("other/rough", filters, val, mi.getToken(), idx, pgems.rough_other_mats.at(idx)); if (!mi.isValid()) mi.decode(0, idx); if (gem_other_mat_is_allowed(mi)) - set_filter_elem("other/cut", filter, val, mi.getToken(), idx, pgems.cut_other_mats.at(idx)); + set_filter_elem("other/cut", filters, val, mi.getToken(), idx, pgems.cut_other_mats.at(idx)); } return; } else { @@ -1870,10 +1872,10 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil for (size_t i = 0; i < builtin_size; ++i) { string id = bgems.rough_other_mats(i); if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) - set_filter_elem("other/rough", filter, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); + set_filter_elem("other/rough", filters, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); id = bgems.cut_other_mats(i); if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) - set_filter_elem("other/cut", filter, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); + set_filter_elem("other/cut", filters, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); } } }); @@ -1881,11 +1883,11 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const std::string& fil bool StockpileSerializer::write_leather(StockpileSettings::LeatherSet* leather) { return serialize_list_organic_mat( - [&](const std::string& id) { leather->add_mats(id); }, + [&](const string& id) { leather->add_mats(id); }, &mPile->settings.leather.mats, organic_mat_category::Leather); } -void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_leather(DeserializeMode mode, const vector& filters) { auto & pleather = mPile->settings.leather; read_category("leather", mode, std::bind(&StockpileSettings::has_leather, mBuffer), @@ -1898,19 +1900,19 @@ void StockpileSerializer::read_leather(DeserializeMode mode, const std::string& [&](bool all, char val) { auto & bleather = mBuffer.leather(); - unserialize_list_organic_mat("", all, val, filter, - [&](size_t idx) -> std::string { return bleather.mats(idx); }, + unserialize_list_organic_mat("", all, val, filters, + [&](size_t idx) -> string { return bleather.mats(idx); }, bleather.mats_size(), pleather.mats, organic_mat_category::Leather); }); } bool StockpileSerializer::write_corpses(StockpileSettings::CorpsesSet* corpses) { return serialize_list_creature( - [&](const std::string& token) { corpses->add_corpses(token); }, + [&](const string& token) { corpses->add_corpses(token); }, mPile->settings.corpses.corpses); } -void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_corpses(DeserializeMode mode, const vector& filters) { auto & pcorpses = mPile->settings.corpses; read_category("corpses", mode, std::bind(&StockpileSettings::has_corpses_v50, mBuffer), @@ -1922,8 +1924,8 @@ void StockpileSerializer::read_corpses(DeserializeMode mode, const std::string& }, [&](bool all, char val) { auto & bcorpses = mBuffer.corpses_v50(); - unserialize_list_creature("", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bcorpses.corpses(idx); }, + unserialize_list_creature("", all, val, filters, + [&](const size_t& idx) -> const string& { return bcorpses.corpses(idx); }, bcorpses.corpses_size(), pcorpses.corpses); }); } @@ -1945,38 +1947,38 @@ bool StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { refuse->set_rotten_raw_hide(prefuse.rotten_raw_hide); all = serialize_list_item_type(refuse_type_is_allowed, - [&](const std::string& token) { refuse->add_type(token); }, + [&](const string& token) { refuse->add_type(token); }, prefuse.type) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_corpses(token); }, + [&](const string& token) { refuse->add_corpses(token); }, prefuse.corpses) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_body_parts(token); }, + [&](const string& token) { refuse->add_body_parts(token); }, prefuse.body_parts) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_skulls(token); }, + [&](const string& token) { refuse->add_skulls(token); }, prefuse.skulls) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_bones(token); }, + [&](const string& token) { refuse->add_bones(token); }, prefuse.bones) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_hair(token); }, + [&](const string& token) { refuse->add_hair(token); }, prefuse.hair) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_shells(token); }, + [&](const string& token) { refuse->add_shells(token); }, prefuse.shells) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_teeth(token); }, + [&](const string& token) { refuse->add_teeth(token); }, prefuse.teeth) && all; all = serialize_list_creature( - [&](const std::string& token) { refuse->add_horns(token); }, + [&](const string& token) { refuse->add_horns(token); }, prefuse.horns) && all; return all; } -void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_refuse(DeserializeMode mode, const vector& filters) { auto & prefuse = mPile->settings.refuse; read_category("refuse", mode, std::bind(&StockpileSettings::has_refuse, mBuffer), @@ -1999,35 +2001,35 @@ void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& f [&](bool all, char val) { auto & brefuse = mBuffer.refuse(); - set_flag("rawhide/fresh", filter, all, val, brefuse.fresh_raw_hide(), prefuse.fresh_raw_hide); - set_flag("rawhide/rotten", filter, all, val, brefuse.rotten_raw_hide(), prefuse.rotten_raw_hide); + set_flag("rawhide/fresh", filters, all, val, brefuse.fresh_raw_hide(), prefuse.fresh_raw_hide); + set_flag("rawhide/rotten", filters, all, val, brefuse.rotten_raw_hide(), prefuse.rotten_raw_hide); - unserialize_list_item_type("type", all, val, filter, refuse_type_is_allowed, + unserialize_list_item_type("type", all, val, filters, refuse_type_is_allowed, [&](const size_t& idx) -> const string& { return brefuse.type(idx); }, brefuse.type_size(), prefuse.type); - unserialize_list_creature("corpses", all, val, filter, + unserialize_list_creature("corpses", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.corpses(idx); }, brefuse.corpses_size(), prefuse.corpses); - unserialize_list_creature("bodyparts", all, val, filter, + unserialize_list_creature("bodyparts", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.body_parts(idx); }, brefuse.body_parts_size(), prefuse.body_parts); - unserialize_list_creature("skulls", all, val, filter, + unserialize_list_creature("skulls", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.skulls(idx); }, brefuse.skulls_size(), prefuse.skulls); - unserialize_list_creature("bones", all, val, filter, + unserialize_list_creature("bones", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.bones(idx); }, brefuse.bones_size(), prefuse.bones); - unserialize_list_creature("hair", all, val, filter, + unserialize_list_creature("hair", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.hair(idx); }, brefuse.hair_size(), prefuse.hair); - unserialize_list_creature("shells", all, val, filter, + unserialize_list_creature("shells", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.shells(idx); }, brefuse.shells_size(), prefuse.shells); - unserialize_list_creature("teeth", all, val, filter, + unserialize_list_creature("teeth", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.teeth(idx); }, brefuse.teeth_size(), prefuse.teeth); - unserialize_list_creature("horns", all, val, filter, + unserialize_list_creature("horns", all, val, filters, [&](const size_t& idx) -> const string& { return brefuse.horns(idx); }, brefuse.horns_size(), prefuse.horns); }); @@ -2036,17 +2038,17 @@ void StockpileSerializer::read_refuse(DeserializeMode mode, const std::string& f bool StockpileSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { bool all = serialize_list_organic_mat( - [&](const std::string& token) { sheet->add_paper(token); }, + [&](const string& token) { sheet->add_paper(token); }, &mPile->settings.sheet.paper, organic_mat_category::Paper); all = serialize_list_organic_mat( - [&](const std::string& token) { sheet->add_parchment(token); }, + [&](const string& token) { sheet->add_parchment(token); }, &mPile->settings.sheet.parchment, organic_mat_category::Parchment) && all; return all; } -void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_sheet(DeserializeMode mode, const vector& filters) { auto & psheet = mPile->settings.sheet; read_category("sheet", mode, std::bind(&StockpileSettings::has_sheet, mBuffer), @@ -2060,12 +2062,12 @@ void StockpileSerializer::read_sheet(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bsheet = mBuffer.sheet(); - unserialize_list_organic_mat("paper", all, val, filter, - [&](size_t idx) -> std::string { return bsheet.paper(idx); }, + unserialize_list_organic_mat("paper", all, val, filters, + [&](size_t idx) -> string { return bsheet.paper(idx); }, bsheet.paper_size(), psheet.paper, organic_mat_category::Paper); - unserialize_list_organic_mat("parchment", all, val, filter, - [&](size_t idx) -> std::string { return bsheet.parchment(idx); }, + unserialize_list_organic_mat("parchment", all, val, filters, + [&](size_t idx) -> string { return bsheet.parchment(idx); }, bsheet.parchment_size(), psheet.parchment, organic_mat_category::Parchment); }); } @@ -2081,11 +2083,11 @@ static bool stone_is_allowed(const MaterialInfo& mi) { bool StockpileSerializer::write_stone(StockpileSettings::StoneSet* stone) { return serialize_list_material( stone_is_allowed, - [&](const std::string& token) { stone->add_mats(token); }, + [&](const string& token) { stone->add_mats(token); }, mPile->settings.stone.mats); } -void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_stone(DeserializeMode mode, const vector& filters) { auto & pstone = mPile->settings.stone; read_category("stone", mode, std::bind(&StockpileSettings::has_stone, mBuffer), @@ -2098,8 +2100,8 @@ void StockpileSerializer::read_stone(DeserializeMode mode, const std::string& fi [&](bool all, char val) { auto & bstone = mBuffer.stone(); - unserialize_list_material("", all, val, filter, stone_is_allowed, - [&](const size_t& idx) -> const std::string& { return bstone.mats(idx); }, + unserialize_list_material("", all, val, filters, stone_is_allowed, + [&](const size_t& idx) -> const string& { return bstone.mats(idx); }, bstone.mats_size(), pstone.mats); }); } @@ -2116,39 +2118,39 @@ bool StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) weapons->set_usable(pweapons.usable); all = serialize_list_itemdef( - [&](const std::string& token) { weapons->add_weapon_type(token); }, + [&](const string& token) { weapons->add_weapon_type(token); }, pweapons.weapon_type, - std::vector(world->raws.itemdefs.weapons.begin(), world->raws.itemdefs.weapons.end()), + vector(world->raws.itemdefs.weapons.begin(), world->raws.itemdefs.weapons.end()), item_type::WEAPON) && all; all = serialize_list_itemdef( - [&](const std::string& token) { weapons->add_trapcomp_type(token); }, + [&](const string& token) { weapons->add_trapcomp_type(token); }, pweapons.trapcomp_type, - std::vector(world->raws.itemdefs.trapcomps.begin(), world->raws.itemdefs.trapcomps.end()), + vector(world->raws.itemdefs.trapcomps.begin(), world->raws.itemdefs.trapcomps.end()), item_type::TRAPCOMP) && all; all = serialize_list_material( weapons_mat_is_allowed, - [&](const std::string& token) { weapons->add_mats(token); }, + [&](const string& token) { weapons->add_mats(token); }, pweapons.mats) && all; all = serialize_list_other_mats( mOtherMatsWeaponsArmor.mats, - [&](const std::string& token) { weapons->add_other_mats(token); }, + [&](const string& token) { weapons->add_other_mats(token); }, pweapons.other_mats) && all; all = serialize_list_quality( - [&](const std::string& token) { weapons->add_quality_core(token); }, + [&](const string& token) { weapons->add_quality_core(token); }, pweapons.quality_core) && all; all = serialize_list_quality( - [&](const std::string& token) { weapons->add_quality_total(token); }, + [&](const string& token) { weapons->add_quality_total(token); }, pweapons.quality_total) && all; return all; } -void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_weapons(DeserializeMode mode, const vector& filters) { auto & pweapons = mPile->settings.weapons; read_category("weapons", mode, std::bind(&StockpileSettings::has_weapons, mBuffer), @@ -2166,31 +2168,31 @@ void StockpileSerializer::read_weapons(DeserializeMode mode, const std::string& [&](bool all, char val) { auto & bweapons = mBuffer.weapons(); - set_flag("nouse", filter, all, val, bweapons.unusable(), pweapons.unusable); - set_flag("canuse", filter, all, val, bweapons.usable(), pweapons.usable); + set_flag("nouse", filters, all, val, bweapons.unusable(), pweapons.unusable); + set_flag("canuse", filters, all, val, bweapons.usable(), pweapons.usable); - unserialize_list_itemdef("type/weapon", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bweapons.weapon_type(idx); }, + unserialize_list_itemdef("type/weapon", all, val, filters, + [&](const size_t& idx) -> const string& { return bweapons.weapon_type(idx); }, bweapons.weapon_type_size(), pweapons.weapon_type, item_type::WEAPON); - unserialize_list_itemdef("type/trapcomp", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bweapons.trapcomp_type(idx); }, + unserialize_list_itemdef("type/trapcomp", all, val, filters, + [&](const size_t& idx) -> const string& { return bweapons.trapcomp_type(idx); }, bweapons.trapcomp_type_size(), pweapons.trapcomp_type, item_type::TRAPCOMP); - unserialize_list_material("mats", all, val, filter, weapons_mat_is_allowed, - [&](const size_t& idx) -> const std::string& { return bweapons.mats(idx); }, + unserialize_list_material("mats", all, val, filters, weapons_mat_is_allowed, + [&](const size_t& idx) -> const string& { return bweapons.mats(idx); }, bweapons.mats_size(), pweapons.mats); - unserialize_list_other_mats("other", all, val, filter, mOtherMatsWeaponsArmor.mats, - [&](const size_t& idx) -> const std::string& { return bweapons.other_mats(idx); }, + unserialize_list_other_mats("other", all, val, filters, mOtherMatsWeaponsArmor.mats, + [&](const size_t& idx) -> const string& { return bweapons.other_mats(idx); }, bweapons.other_mats_size(), pweapons.other_mats); - unserialize_list_quality("core", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bweapons.quality_core(idx); }, + unserialize_list_quality("core", all, val, filters, + [&](const size_t& idx) -> const string& { return bweapons.quality_core(idx); }, bweapons.quality_core_size(), pweapons.quality_core); - unserialize_list_quality("total", all, val, filter, - [&](const size_t& idx) -> const std::string& { return bweapons.quality_total(idx); }, + unserialize_list_quality("total", all, val, filters, + [&](const size_t& idx) -> const string& { return bweapons.quality_total(idx); }, bweapons.quality_total_size(), pweapons.quality_total); }); } @@ -2215,7 +2217,7 @@ bool StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { return all; } -void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& filter) { +void StockpileSerializer::read_wood(DeserializeMode mode, const vector& filters) { auto & pwood = mPile->settings.wood; read_category("wood", mode, std::bind(&StockpileSettings::has_wood, mBuffer), @@ -2234,17 +2236,17 @@ void StockpileSerializer::read_wood(DeserializeMode mode, const std::string& fil if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { string id = world->raws.plants.all[idx]->id; - set_filter_elem("", filter, val, id, idx, pwood.mats.at(idx)); + set_filter_elem("", filters, val, id, idx, pwood.mats.at(idx)); } } else { for (int i = 0; i < bwood.mats_size(); ++i) { - const std::string token = bwood.mats(i); + const string token = bwood.mats(i); const size_t idx = find_plant(token); if (idx < 0 || (size_t)idx >= num_elems) { WARN(log).print("wood mat index invalid %s idx=%zd\n", token.c_str(), idx); continue; } - set_filter_elem("", filter, val, token, idx, pwood.mats.at(idx)); + set_filter_elem("", filters, val, token, idx, pwood.mats.at(idx)); } } }); diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index 8573a453e..f0e1a62e2 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -81,12 +81,12 @@ public: /** * Again, copied from message.cc */ - bool parse_from_istream(std::istream* input, DeserializeMode mode, const std::string& filter); + bool parse_from_istream(std::istream* input, DeserializeMode mode, const std::vector& filters); /** * Read stockpile settings from file */ - bool unserialize_from_file(const std::string& file, DeserializeMode mode, const std::string& filter); + bool unserialize_from_file(const std::string& file, DeserializeMode mode, const std::vector& filters); private: df::building_stockpilest* mPile; @@ -96,7 +96,7 @@ private: void write(uint32_t includedElements); // parse serialized data into ui indices - void read(DeserializeMode mode, const std::string& filter); + void read(DeserializeMode mode, const std::vector& filters); void write_containers(); void read_containers(DeserializeMode mode); @@ -104,38 +104,38 @@ private: void read_general(DeserializeMode mode); bool write_ammo(dfstockpiles::StockpileSettings::AmmoSet* ammo); - void read_ammo(DeserializeMode mode, const std::string& filter); + void read_ammo(DeserializeMode mode, const std::vector& filters); bool write_animals(dfstockpiles::StockpileSettings::AnimalsSet* animals); - void read_animals(DeserializeMode mode, const std::string& filter); + void read_animals(DeserializeMode mode, const std::vector& filters); bool write_armor(dfstockpiles::StockpileSettings::ArmorSet* armor); - void read_armor(DeserializeMode mode, const std::string& filter); + void read_armor(DeserializeMode mode, const std::vector& filters); bool write_bars_blocks(dfstockpiles::StockpileSettings::BarsBlocksSet* bars_blocks); - void read_bars_blocks(DeserializeMode mode, const std::string& filter); + void read_bars_blocks(DeserializeMode mode, const std::vector& filters); bool write_cloth(dfstockpiles::StockpileSettings::ClothSet* cloth); - void read_cloth(DeserializeMode mode, const std::string& filter); + void read_cloth(DeserializeMode mode, const std::vector& filters); bool write_coins(dfstockpiles::StockpileSettings::CoinSet* coins); - void read_coins(DeserializeMode mode, const std::string& filter); + void read_coins(DeserializeMode mode, const std::vector& filters); bool write_finished_goods(dfstockpiles::StockpileSettings::FinishedGoodsSet* finished_goods); - void read_finished_goods(DeserializeMode mode, const std::string& filter); + void read_finished_goods(DeserializeMode mode, const std::vector& filters); food_pair food_map(df::enums::organic_mat_category::organic_mat_category cat); bool write_food(dfstockpiles::StockpileSettings::FoodSet* food); - void read_food(DeserializeMode mode, const std::string& filter); + void read_food(DeserializeMode mode, const std::vector& filters); bool write_furniture(dfstockpiles::StockpileSettings::FurnitureSet* furniture); - void read_furniture(DeserializeMode mode, const std::string& filter); + void read_furniture(DeserializeMode mode, const std::vector& filters); bool write_gems(dfstockpiles::StockpileSettings::GemsSet* gems); - void read_gems(DeserializeMode mode, const std::string& filter); + void read_gems(DeserializeMode mode, const std::vector& filters); bool write_leather(dfstockpiles::StockpileSettings::LeatherSet* leather); - void read_leather(DeserializeMode mode, const std::string& filter); + void read_leather(DeserializeMode mode, const std::vector& filters); bool write_corpses(dfstockpiles::StockpileSettings::CorpsesSet* corpses); - void read_corpses(DeserializeMode mode, const std::string& filter); + void read_corpses(DeserializeMode mode, const std::vector& filters); bool write_refuse(dfstockpiles::StockpileSettings::RefuseSet* refuse); - void read_refuse(DeserializeMode mode, const std::string& filter); + void read_refuse(DeserializeMode mode, const std::vector& filters); bool write_sheet(dfstockpiles::StockpileSettings::SheetSet* sheet); - void read_sheet(DeserializeMode mode, const std::string& filter); + void read_sheet(DeserializeMode mode, const std::vector& filters); bool write_stone(dfstockpiles::StockpileSettings::StoneSet* stone); - void read_stone(DeserializeMode mode, const std::string& filter); + void read_stone(DeserializeMode mode, const std::vector& filters); bool write_weapons(dfstockpiles::StockpileSettings::WeaponsSet* weapons); - void read_weapons(DeserializeMode mode, const std::string& filter); + void read_weapons(DeserializeMode mode, const std::vector& filters); bool write_wood(dfstockpiles::StockpileSettings::WoodSet* wood); - void read_wood(DeserializeMode mode, const std::string& filter); + void read_wood(DeserializeMode mode, const std::vector& filters); }; diff --git a/plugins/stockpiles/stockpiles.cpp b/plugins/stockpiles/stockpiles.cpp index 99cc16607..d1ce46e9c 100644 --- a/plugins/stockpiles/stockpiles.cpp +++ b/plugins/stockpiles/stockpiles.cpp @@ -129,9 +129,12 @@ static bool stockpiles_import(color_ostream& out, string fname, int id, string m else if (mode_str == "disable") mode = DESERIALIZE_MODE_DISABLE; + vector filters; + split_string(&filters, filter, ",", true); + try { StockpileSerializer cereal(sp); - if (!cereal.unserialize_from_file(fname, mode, filter)) { + if (!cereal.unserialize_from_file(fname, mode, filters)) { out.printerr("deserialization failed: '%s'\n", fname.c_str()); return false; } From 5af26675b44a4ec60e532ddde771367cfd88b7af Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 23:28:56 -0700 Subject: [PATCH 125/439] rename "category" files to just "cat" --- data/stockpiles/{category_ammo.dfstock => cat_ammo.dfstock} | 0 data/stockpiles/{category_animals.dfstock => cat_animals.dfstock} | 0 data/stockpiles/{category_armor.dfstock => cat_armor.dfstock} | 0 .../{category_bars_blocks.dfstock => cat_bars_blocks.dfstock} | 0 data/stockpiles/{category_cloth.dfstock => cat_cloth.dfstock} | 0 data/stockpiles/{category_coins.dfstock => cat_coins.dfstock} | 0 data/stockpiles/{category_corpses.dfstock => cat_corpses.dfstock} | 0 ...category_finished_goods.dfstock => cat_finished_goods.dfstock} | 0 data/stockpiles/{category_food.dfstock => cat_food.dfstock} | 0 .../{category_furniture.dfstock => cat_furniture.dfstock} | 0 data/stockpiles/{category_gems.dfstock => cat_gems.dfstock} | 0 data/stockpiles/{category_leather.dfstock => cat_leather.dfstock} | 0 data/stockpiles/{category_refuse.dfstock => cat_refuse.dfstock} | 0 data/stockpiles/{category_sheets.dfstock => cat_sheets.dfstock} | 0 data/stockpiles/{category_stone.dfstock => cat_stone.dfstock} | 0 data/stockpiles/{category_weapons.dfstock => cat_weapons.dfstock} | 0 data/stockpiles/{category_wood.dfstock => cat_wood.dfstock} | 0 17 files changed, 0 insertions(+), 0 deletions(-) rename data/stockpiles/{category_ammo.dfstock => cat_ammo.dfstock} (100%) rename data/stockpiles/{category_animals.dfstock => cat_animals.dfstock} (100%) rename data/stockpiles/{category_armor.dfstock => cat_armor.dfstock} (100%) rename data/stockpiles/{category_bars_blocks.dfstock => cat_bars_blocks.dfstock} (100%) rename data/stockpiles/{category_cloth.dfstock => cat_cloth.dfstock} (100%) rename data/stockpiles/{category_coins.dfstock => cat_coins.dfstock} (100%) rename data/stockpiles/{category_corpses.dfstock => cat_corpses.dfstock} (100%) rename data/stockpiles/{category_finished_goods.dfstock => cat_finished_goods.dfstock} (100%) rename data/stockpiles/{category_food.dfstock => cat_food.dfstock} (100%) rename data/stockpiles/{category_furniture.dfstock => cat_furniture.dfstock} (100%) rename data/stockpiles/{category_gems.dfstock => cat_gems.dfstock} (100%) rename data/stockpiles/{category_leather.dfstock => cat_leather.dfstock} (100%) rename data/stockpiles/{category_refuse.dfstock => cat_refuse.dfstock} (100%) rename data/stockpiles/{category_sheets.dfstock => cat_sheets.dfstock} (100%) rename data/stockpiles/{category_stone.dfstock => cat_stone.dfstock} (100%) rename data/stockpiles/{category_weapons.dfstock => cat_weapons.dfstock} (100%) rename data/stockpiles/{category_wood.dfstock => cat_wood.dfstock} (100%) diff --git a/data/stockpiles/category_ammo.dfstock b/data/stockpiles/cat_ammo.dfstock similarity index 100% rename from data/stockpiles/category_ammo.dfstock rename to data/stockpiles/cat_ammo.dfstock diff --git a/data/stockpiles/category_animals.dfstock b/data/stockpiles/cat_animals.dfstock similarity index 100% rename from data/stockpiles/category_animals.dfstock rename to data/stockpiles/cat_animals.dfstock diff --git a/data/stockpiles/category_armor.dfstock b/data/stockpiles/cat_armor.dfstock similarity index 100% rename from data/stockpiles/category_armor.dfstock rename to data/stockpiles/cat_armor.dfstock diff --git a/data/stockpiles/category_bars_blocks.dfstock b/data/stockpiles/cat_bars_blocks.dfstock similarity index 100% rename from data/stockpiles/category_bars_blocks.dfstock rename to data/stockpiles/cat_bars_blocks.dfstock diff --git a/data/stockpiles/category_cloth.dfstock b/data/stockpiles/cat_cloth.dfstock similarity index 100% rename from data/stockpiles/category_cloth.dfstock rename to data/stockpiles/cat_cloth.dfstock diff --git a/data/stockpiles/category_coins.dfstock b/data/stockpiles/cat_coins.dfstock similarity index 100% rename from data/stockpiles/category_coins.dfstock rename to data/stockpiles/cat_coins.dfstock diff --git a/data/stockpiles/category_corpses.dfstock b/data/stockpiles/cat_corpses.dfstock similarity index 100% rename from data/stockpiles/category_corpses.dfstock rename to data/stockpiles/cat_corpses.dfstock diff --git a/data/stockpiles/category_finished_goods.dfstock b/data/stockpiles/cat_finished_goods.dfstock similarity index 100% rename from data/stockpiles/category_finished_goods.dfstock rename to data/stockpiles/cat_finished_goods.dfstock diff --git a/data/stockpiles/category_food.dfstock b/data/stockpiles/cat_food.dfstock similarity index 100% rename from data/stockpiles/category_food.dfstock rename to data/stockpiles/cat_food.dfstock diff --git a/data/stockpiles/category_furniture.dfstock b/data/stockpiles/cat_furniture.dfstock similarity index 100% rename from data/stockpiles/category_furniture.dfstock rename to data/stockpiles/cat_furniture.dfstock diff --git a/data/stockpiles/category_gems.dfstock b/data/stockpiles/cat_gems.dfstock similarity index 100% rename from data/stockpiles/category_gems.dfstock rename to data/stockpiles/cat_gems.dfstock diff --git a/data/stockpiles/category_leather.dfstock b/data/stockpiles/cat_leather.dfstock similarity index 100% rename from data/stockpiles/category_leather.dfstock rename to data/stockpiles/cat_leather.dfstock diff --git a/data/stockpiles/category_refuse.dfstock b/data/stockpiles/cat_refuse.dfstock similarity index 100% rename from data/stockpiles/category_refuse.dfstock rename to data/stockpiles/cat_refuse.dfstock diff --git a/data/stockpiles/category_sheets.dfstock b/data/stockpiles/cat_sheets.dfstock similarity index 100% rename from data/stockpiles/category_sheets.dfstock rename to data/stockpiles/cat_sheets.dfstock diff --git a/data/stockpiles/category_stone.dfstock b/data/stockpiles/cat_stone.dfstock similarity index 100% rename from data/stockpiles/category_stone.dfstock rename to data/stockpiles/cat_stone.dfstock diff --git a/data/stockpiles/category_weapons.dfstock b/data/stockpiles/cat_weapons.dfstock similarity index 100% rename from data/stockpiles/category_weapons.dfstock rename to data/stockpiles/cat_weapons.dfstock diff --git a/data/stockpiles/category_wood.dfstock b/data/stockpiles/cat_wood.dfstock similarity index 100% rename from data/stockpiles/category_wood.dfstock rename to data/stockpiles/cat_wood.dfstock From cdf2c407bcfd5a9bd45a394ef38db38f933a3749 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 20 Mar 2023 23:53:16 -0700 Subject: [PATCH 126/439] simplify finished goods stockpile settings --- data/stockpiles/crafts.dfstock | 4 ++-- data/stockpiles/goblets.dfstock | 4 ++-- data/stockpiles/stonetools.dfstock | 4 ++-- data/stockpiles/toys.dfstock | 4 ++-- data/stockpiles/woodtools.dfstock | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/data/stockpiles/crafts.dfstock b/data/stockpiles/crafts.dfstock index 9367855ee..633dd9f1f 100644 --- a/data/stockpiles/crafts.dfstock +++ b/data/stockpiles/crafts.dfstock @@ -1,4 +1,4 @@ -bç- +bG FIGURINE AMULET SCEPTER @@ -7,4 +7,4 @@ b EARRING BRACELET GEM -TOTEMWOOD PLANT_CLOTHBONETOOTHHORNPEARLSHELLLEATHERSILKAMBERCORAL GREEN_GLASS CLEAR_GLASS CRYSTAL_GLASSYARNWAXINORGANIC:IRONINORGANIC:SILVERINORGANIC:COPPERINORGANIC:NICKELINORGANIC:ZINCINORGANIC:BRONZEINORGANIC:BRASSINORGANIC:STEELINORGANIC:PIG_IRONINORGANIC:PLATINUMINORGANIC:ELECTRUM INORGANIC:TININORGANIC:PEWTER_FINEINORGANIC:PEWTER_TRIFLEINORGANIC:PEWTER_LAYINORGANIC:LEADINORGANIC:ALUMINUMINORGANIC:NICKEL_SILVERINORGANIC:BILLONINORGANIC:STERLING_SILVERINORGANIC:BLACK_BRONZEINORGANIC:ROSE_GOLDINORGANIC:BISMUTHINORGANIC:BISMUTH_BRONZEINORGANIC:ADAMANTINEINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:ONYXINORGANIC:MORIONINORGANIC:SCHORLINORGANIC:LACE AGATEINORGANIC:BLUE JADEINORGANIC:LAPIS LAZULIINORGANIC:PRASEINORGANIC:PRASE OPALINORGANIC:BLOODSTONEINORGANIC:MOSS AGATEINORGANIC:MOSS OPALINORGANIC:VARISCITEINORGANIC:CHRYSOPRASEINORGANIC:CHRYSOCOLLAINORGANIC:SARDINORGANIC:CARNELIANINORGANIC:BANDED AGATEINORGANIC:SARDONYXINORGANIC:CHERRY OPALINORGANIC:LAVENDER JADEINORGANIC:PINK JADEINORGANIC:TUBE AGATEINORGANIC:FIRE AGATEINORGANIC:PLUME AGATEINORGANIC:BROWN JASPERINORGANIC:PICTURE JASPERINORGANIC:SMOKY QUARTZINORGANIC:WAX OPALINORGANIC:WOOD OPALINORGANIC:AMBER OPALINORGANIC:GOLD OPALINORGANIC:CITRINEINORGANIC:YELLOW JASPERINORGANIC:TIGEREYEINORGANIC:TIGER IRONINORGANIC:SUNSTONEINORGANIC:RESIN OPALINORGANIC:PYRITEINORGANIC:CLEAR TOURMALINEINORGANIC:GRAY CHALCEDONYINORGANIC:DENDRITIC AGATEINORGANIC:SHELL OPALINORGANIC:BONE OPALINORGANIC:WHITE CHALCEDONYINORGANIC:FORTIFICATION AGATEINORGANIC:MILK QUARTZINORGANIC:MOONSTONEINORGANIC:WHITE JADEINORGANIC:JASPER OPALINORGANIC:PINEAPPLE OPALINORGANIC:ONYX OPALINORGANIC:MILK OPALINORGANIC:PIPE OPALINORGANIC:AVENTURINEINORGANIC:TURQUOISEINORGANIC:QUARTZ_ROSEINORGANIC:CRYSTAL_ROCKINORGANIC:BLACK ZIRCONINORGANIC:BLACK PYROPEINORGANIC:MELANITEINORGANIC:INDIGO TOURMALINEINORGANIC:BLUE GARNETINORGANIC:TSAVORITEINORGANIC:GREEN TOURMALINEINORGANIC:DEMANTOIDINORGANIC:GREEN ZIRCONINORGANIC:GREEN JADEINORGANIC:HELIODORINORGANIC:PERIDOTINORGANIC:RED ZIRCONINORGANIC:RED TOURMALINEINORGANIC:RED PYROPEINORGANIC:ALMANDINEINORGANIC:RED GROSSULARINORGANIC:PINK TOURMALINEINORGANIC:RED BERYLINORGANIC:FIRE OPALINORGANIC:RHODOLITEINORGANIC:SPINEL_PURPLEINORGANIC:ALEXANDRITEINORGANIC:TANZANITEINORGANIC:MORGANITEINORGANIC:VIOLET SPESSARTINEINORGANIC:PINK GARNETINORGANIC:KUNZITEINORGANIC:CINNAMON GROSSULARINORGANIC:HONEY YELLOW BERYLINORGANIC:JELLY OPALINORGANIC:BROWN ZIRCONINORGANIC:YELLOW ZIRCONINORGANIC:GOLDEN BERYLINORGANIC:YELLOW SPESSARTINEINORGANIC:TOPAZINORGANIC:TOPAZOLITEINORGANIC:YELLOW GROSSULARINORGANIC:RUBICELLEINORGANIC:CLEAR GARNETINORGANIC:GOSHENITEINORGANIC:CAT'S EYEINORGANIC:CLEAR ZIRCONINORGANIC:AMETHYSTINORGANIC:AQUAMARINEINORGANIC:SPINEL_REDINORGANIC:CHRYSOBERYLINORGANIC:OPAL_PFIREINORGANIC:OPAL_REDFLASHINORGANIC:OPAL_BLACKINORGANIC:OPAL_WHITEINORGANIC:OPAL_CRYSTALINORGANIC:OPAL_CLAROINORGANIC:OPAL_LEVININORGANIC:OPAL_HARLEQUININORGANIC:OPAL_PINFIREINORGANIC:OPAL_BANDFIREINORGANIC:DIAMOND_LYINORGANIC:DIAMOND_FYINORGANIC:EMERALDINORGANIC:RUBYINORGANIC:SAPPHIREINORGANIC:DIAMOND_CLEARINORGANIC:DIAMOND_REDINORGANIC:DIAMOND_GREENINORGANIC:DIAMOND_BLUEINORGANIC:DIAMOND_YELLOWINORGANIC:DIAMOND_BLACKINORGANIC:SAPPHIRE_STARINORGANIC:RUBY_STARINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE INORGANIC:BROMS_CLEAN_CORPSEDUSTINORGANIC:GOLDINORGANIC:DIVINE_1INORGANIC:DIVINE_3INORGANIC:DIVINE_5INORGANIC:DIVINE_7INORGANIC:DIVINE_9INORGANIC:DIVINE_11INORGANIC:DIVINE_13INORGANIC:DIVINE_15INORGANIC:DIVINE_17INORGANIC:DIVINE_19"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file +TOTEM \ No newline at end of file diff --git a/data/stockpiles/goblets.dfstock b/data/stockpiles/goblets.dfstock index b117634ba..bff4f8a6d 100644 --- a/data/stockpiles/goblets.dfstock +++ b/data/stockpiles/goblets.dfstock @@ -1,2 +1,2 @@ -b¨- -GOBLETWOOD PLANT_CLOTHBONETOOTHHORNPEARLSHELLLEATHERSILKAMBERCORAL GREEN_GLASS CLEAR_GLASS CRYSTAL_GLASSYARNWAXINORGANIC:IRONINORGANIC:SILVERINORGANIC:COPPERINORGANIC:NICKELINORGANIC:ZINCINORGANIC:BRONZEINORGANIC:BRASSINORGANIC:STEELINORGANIC:PIG_IRONINORGANIC:PLATINUMINORGANIC:ELECTRUM INORGANIC:TININORGANIC:PEWTER_FINEINORGANIC:PEWTER_TRIFLEINORGANIC:PEWTER_LAYINORGANIC:LEADINORGANIC:ALUMINUMINORGANIC:NICKEL_SILVERINORGANIC:BILLONINORGANIC:STERLING_SILVERINORGANIC:BLACK_BRONZEINORGANIC:ROSE_GOLDINORGANIC:BISMUTHINORGANIC:BISMUTH_BRONZEINORGANIC:ADAMANTINEINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:ONYXINORGANIC:MORIONINORGANIC:SCHORLINORGANIC:LACE AGATEINORGANIC:BLUE JADEINORGANIC:LAPIS LAZULIINORGANIC:PRASEINORGANIC:PRASE OPALINORGANIC:BLOODSTONEINORGANIC:MOSS AGATEINORGANIC:MOSS OPALINORGANIC:VARISCITEINORGANIC:CHRYSOPRASEINORGANIC:CHRYSOCOLLAINORGANIC:SARDINORGANIC:CARNELIANINORGANIC:BANDED AGATEINORGANIC:SARDONYXINORGANIC:CHERRY OPALINORGANIC:LAVENDER JADEINORGANIC:PINK JADEINORGANIC:TUBE AGATEINORGANIC:FIRE AGATEINORGANIC:PLUME AGATEINORGANIC:BROWN JASPERINORGANIC:PICTURE JASPERINORGANIC:SMOKY QUARTZINORGANIC:WAX OPALINORGANIC:WOOD OPALINORGANIC:AMBER OPALINORGANIC:GOLD OPALINORGANIC:CITRINEINORGANIC:YELLOW JASPERINORGANIC:TIGEREYEINORGANIC:TIGER IRONINORGANIC:SUNSTONEINORGANIC:RESIN OPALINORGANIC:PYRITEINORGANIC:CLEAR TOURMALINEINORGANIC:GRAY CHALCEDONYINORGANIC:DENDRITIC AGATEINORGANIC:SHELL OPALINORGANIC:BONE OPALINORGANIC:WHITE CHALCEDONYINORGANIC:FORTIFICATION AGATEINORGANIC:MILK QUARTZINORGANIC:MOONSTONEINORGANIC:WHITE JADEINORGANIC:JASPER OPALINORGANIC:PINEAPPLE OPALINORGANIC:ONYX OPALINORGANIC:MILK OPALINORGANIC:PIPE OPALINORGANIC:AVENTURINEINORGANIC:TURQUOISEINORGANIC:QUARTZ_ROSEINORGANIC:CRYSTAL_ROCKINORGANIC:BLACK ZIRCONINORGANIC:BLACK PYROPEINORGANIC:MELANITEINORGANIC:INDIGO TOURMALINEINORGANIC:BLUE GARNETINORGANIC:TSAVORITEINORGANIC:GREEN TOURMALINEINORGANIC:DEMANTOIDINORGANIC:GREEN ZIRCONINORGANIC:GREEN JADEINORGANIC:HELIODORINORGANIC:PERIDOTINORGANIC:RED ZIRCONINORGANIC:RED TOURMALINEINORGANIC:RED PYROPEINORGANIC:ALMANDINEINORGANIC:RED GROSSULARINORGANIC:PINK TOURMALINEINORGANIC:RED BERYLINORGANIC:FIRE OPALINORGANIC:RHODOLITEINORGANIC:SPINEL_PURPLEINORGANIC:ALEXANDRITEINORGANIC:TANZANITEINORGANIC:MORGANITEINORGANIC:VIOLET SPESSARTINEINORGANIC:PINK GARNETINORGANIC:KUNZITEINORGANIC:CINNAMON GROSSULARINORGANIC:HONEY YELLOW BERYLINORGANIC:JELLY OPALINORGANIC:BROWN ZIRCONINORGANIC:YELLOW ZIRCONINORGANIC:GOLDEN BERYLINORGANIC:YELLOW SPESSARTINEINORGANIC:TOPAZINORGANIC:TOPAZOLITEINORGANIC:YELLOW GROSSULARINORGANIC:RUBICELLEINORGANIC:CLEAR GARNETINORGANIC:GOSHENITEINORGANIC:CAT'S EYEINORGANIC:CLEAR ZIRCONINORGANIC:AMETHYSTINORGANIC:AQUAMARINEINORGANIC:SPINEL_REDINORGANIC:CHRYSOBERYLINORGANIC:OPAL_PFIREINORGANIC:OPAL_REDFLASHINORGANIC:OPAL_BLACKINORGANIC:OPAL_WHITEINORGANIC:OPAL_CRYSTALINORGANIC:OPAL_CLAROINORGANIC:OPAL_LEVININORGANIC:OPAL_HARLEQUININORGANIC:OPAL_PINFIREINORGANIC:OPAL_BANDFIREINORGANIC:DIAMOND_LYINORGANIC:DIAMOND_FYINORGANIC:EMERALDINORGANIC:RUBYINORGANIC:SAPPHIREINORGANIC:DIAMOND_CLEARINORGANIC:DIAMOND_REDINORGANIC:DIAMOND_GREENINORGANIC:DIAMOND_BLUEINORGANIC:DIAMOND_YELLOWINORGANIC:DIAMOND_BLACKINORGANIC:SAPPHIRE_STARINORGANIC:RUBY_STARINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE INORGANIC:BROMS_CLEAN_CORPSEDUSTINORGANIC:GOLDINORGANIC:DIVINE_1INORGANIC:DIVINE_3INORGANIC:DIVINE_5INORGANIC:DIVINE_7INORGANIC:DIVINE_9INORGANIC:DIVINE_11INORGANIC:DIVINE_13INORGANIC:DIVINE_15INORGANIC:DIVINE_17INORGANIC:DIVINE_19"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file +b +GOBLET \ No newline at end of file diff --git a/data/stockpiles/stonetools.dfstock b/data/stockpiles/stonetools.dfstock index 2ac7807ad..dee961a74 100644 --- a/data/stockpiles/stonetools.dfstock +++ b/data/stockpiles/stonetools.dfstock @@ -1,2 +1,2 @@ -bŒ -TOOLINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE INORGANIC:BROMS_CLEAN_CORPSEDUST"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file +bÆ +TOOLINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE \ No newline at end of file diff --git a/data/stockpiles/toys.dfstock b/data/stockpiles/toys.dfstock index 7edca2019..a90eab591 100644 --- a/data/stockpiles/toys.dfstock +++ b/data/stockpiles/toys.dfstock @@ -1,2 +1,2 @@ -b¥- -TOYWOOD PLANT_CLOTHBONETOOTHHORNPEARLSHELLLEATHERSILKAMBERCORAL GREEN_GLASS CLEAR_GLASS CRYSTAL_GLASSYARNWAXINORGANIC:IRONINORGANIC:SILVERINORGANIC:COPPERINORGANIC:NICKELINORGANIC:ZINCINORGANIC:BRONZEINORGANIC:BRASSINORGANIC:STEELINORGANIC:PIG_IRONINORGANIC:PLATINUMINORGANIC:ELECTRUM INORGANIC:TININORGANIC:PEWTER_FINEINORGANIC:PEWTER_TRIFLEINORGANIC:PEWTER_LAYINORGANIC:LEADINORGANIC:ALUMINUMINORGANIC:NICKEL_SILVERINORGANIC:BILLONINORGANIC:STERLING_SILVERINORGANIC:BLACK_BRONZEINORGANIC:ROSE_GOLDINORGANIC:BISMUTHINORGANIC:BISMUTH_BRONZEINORGANIC:ADAMANTINEINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:ONYXINORGANIC:MORIONINORGANIC:SCHORLINORGANIC:LACE AGATEINORGANIC:BLUE JADEINORGANIC:LAPIS LAZULIINORGANIC:PRASEINORGANIC:PRASE OPALINORGANIC:BLOODSTONEINORGANIC:MOSS AGATEINORGANIC:MOSS OPALINORGANIC:VARISCITEINORGANIC:CHRYSOPRASEINORGANIC:CHRYSOCOLLAINORGANIC:SARDINORGANIC:CARNELIANINORGANIC:BANDED AGATEINORGANIC:SARDONYXINORGANIC:CHERRY OPALINORGANIC:LAVENDER JADEINORGANIC:PINK JADEINORGANIC:TUBE AGATEINORGANIC:FIRE AGATEINORGANIC:PLUME AGATEINORGANIC:BROWN JASPERINORGANIC:PICTURE JASPERINORGANIC:SMOKY QUARTZINORGANIC:WAX OPALINORGANIC:WOOD OPALINORGANIC:AMBER OPALINORGANIC:GOLD OPALINORGANIC:CITRINEINORGANIC:YELLOW JASPERINORGANIC:TIGEREYEINORGANIC:TIGER IRONINORGANIC:SUNSTONEINORGANIC:RESIN OPALINORGANIC:PYRITEINORGANIC:CLEAR TOURMALINEINORGANIC:GRAY CHALCEDONYINORGANIC:DENDRITIC AGATEINORGANIC:SHELL OPALINORGANIC:BONE OPALINORGANIC:WHITE CHALCEDONYINORGANIC:FORTIFICATION AGATEINORGANIC:MILK QUARTZINORGANIC:MOONSTONEINORGANIC:WHITE JADEINORGANIC:JASPER OPALINORGANIC:PINEAPPLE OPALINORGANIC:ONYX OPALINORGANIC:MILK OPALINORGANIC:PIPE OPALINORGANIC:AVENTURINEINORGANIC:TURQUOISEINORGANIC:QUARTZ_ROSEINORGANIC:CRYSTAL_ROCKINORGANIC:BLACK ZIRCONINORGANIC:BLACK PYROPEINORGANIC:MELANITEINORGANIC:INDIGO TOURMALINEINORGANIC:BLUE GARNETINORGANIC:TSAVORITEINORGANIC:GREEN TOURMALINEINORGANIC:DEMANTOIDINORGANIC:GREEN ZIRCONINORGANIC:GREEN JADEINORGANIC:HELIODORINORGANIC:PERIDOTINORGANIC:RED ZIRCONINORGANIC:RED TOURMALINEINORGANIC:RED PYROPEINORGANIC:ALMANDINEINORGANIC:RED GROSSULARINORGANIC:PINK TOURMALINEINORGANIC:RED BERYLINORGANIC:FIRE OPALINORGANIC:RHODOLITEINORGANIC:SPINEL_PURPLEINORGANIC:ALEXANDRITEINORGANIC:TANZANITEINORGANIC:MORGANITEINORGANIC:VIOLET SPESSARTINEINORGANIC:PINK GARNETINORGANIC:KUNZITEINORGANIC:CINNAMON GROSSULARINORGANIC:HONEY YELLOW BERYLINORGANIC:JELLY OPALINORGANIC:BROWN ZIRCONINORGANIC:YELLOW ZIRCONINORGANIC:GOLDEN BERYLINORGANIC:YELLOW SPESSARTINEINORGANIC:TOPAZINORGANIC:TOPAZOLITEINORGANIC:YELLOW GROSSULARINORGANIC:RUBICELLEINORGANIC:CLEAR GARNETINORGANIC:GOSHENITEINORGANIC:CAT'S EYEINORGANIC:CLEAR ZIRCONINORGANIC:AMETHYSTINORGANIC:AQUAMARINEINORGANIC:SPINEL_REDINORGANIC:CHRYSOBERYLINORGANIC:OPAL_PFIREINORGANIC:OPAL_REDFLASHINORGANIC:OPAL_BLACKINORGANIC:OPAL_WHITEINORGANIC:OPAL_CRYSTALINORGANIC:OPAL_CLAROINORGANIC:OPAL_LEVININORGANIC:OPAL_HARLEQUININORGANIC:OPAL_PINFIREINORGANIC:OPAL_BANDFIREINORGANIC:DIAMOND_LYINORGANIC:DIAMOND_FYINORGANIC:EMERALDINORGANIC:RUBYINORGANIC:SAPPHIREINORGANIC:DIAMOND_CLEARINORGANIC:DIAMOND_REDINORGANIC:DIAMOND_GREENINORGANIC:DIAMOND_BLUEINORGANIC:DIAMOND_YELLOWINORGANIC:DIAMOND_BLACKINORGANIC:SAPPHIRE_STARINORGANIC:RUBY_STARINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE INORGANIC:BROMS_CLEAN_CORPSEDUSTINORGANIC:GOLDINORGANIC:DIVINE_1INORGANIC:DIVINE_3INORGANIC:DIVINE_5INORGANIC:DIVINE_7INORGANIC:DIVINE_9INORGANIC:DIVINE_11INORGANIC:DIVINE_13INORGANIC:DIVINE_15INORGANIC:DIVINE_17INORGANIC:DIVINE_19"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file +b +TOY \ No newline at end of file diff --git a/data/stockpiles/woodtools.dfstock b/data/stockpiles/woodtools.dfstock index 12c100005..86eb0d0c8 100644 --- a/data/stockpiles/woodtools.dfstock +++ b/data/stockpiles/woodtools.dfstock @@ -1,2 +1,2 @@ -b° -TOOLWOOD"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file +b +TOOLWOOD \ No newline at end of file From b5d4f04d2ff176836cf8bf3ec0a2edeeca8bf556 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 21 Mar 2023 00:19:49 -0700 Subject: [PATCH 127/439] differentiate fish --- docs/plugins/stockpiles.rst | 181 ++++++++++++++------- plugins/stockpiles/StockpileSerializer.cpp | 4 +- 2 files changed, 122 insertions(+), 63 deletions(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index c36031ad7..987be3299 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -48,7 +48,7 @@ Examples exist. ``stockpiles import -m enable plants`` Enables plants in the selected stockpile. -``stockpiles import -m disable category_food -f tallow`` +``stockpiles import -m disable cat_food -f tallow`` Disables all tallow in the selected food stockpile. ``stockpiles export mysettings`` Export the settings for the currently selected stockpile to a file named @@ -109,7 +109,7 @@ stockpile configurations can only be achieved with filters since the stockpile lists are different for each world. For example, to disable all tallow in your main food stockpile, you'd run this command:: - stockpiles import category_food -m disable -f tallow + stockpiles import cat_food -m disable -f tallow Top-level categories ~~~~~~~~~~~~~~~~~~~~ @@ -117,27 +117,27 @@ Top-level categories Each stockpile category has a file that allows you to enable or disable the entire category, or with a filter, any matchable subset thereof:: - category_ammo - category_animals - category_armor - category_bars_blocks - category_cloth - category_coins - category_corpses - category_finished_goods - category_food - category_furniture - category_gems - category_leather - category_refuse - category_sheets - category_stone - category_weapons - category_wood - -For many of the categories, there are also subcategory prefixes that you can -match with filters and convenient pre-made settings files that manipulate -interesting category subsets. + cat_ammo + cat_animals + cat_armor + cat_bars_blocks + cat_cloth + cat_coins + cat_corpses + cat_finished_goods + cat_food + cat_furniture + cat_gems + cat_leather + cat_refuse + cat_sheets + cat_stone + cat_weapons + cat_wood + +For many of the categories, there are also flags and subcategory prefixes that +you can match with filters and convenient pre-made settings files that +manipulate interesting category subsets. Ammo stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -150,7 +150,7 @@ Subcategory prefixes:: core/ total/ -Convenience settings files:: +Settings files:: bolts metalammo @@ -159,59 +159,118 @@ Convenience settings files:: Example commands for a stockpile of metal bolts:: - stockpiles import category_ammo - stockpiles import -m disable -f other/ category_ammo - stockpiles import -m disable -f type/ category_ammo + stockpiles import cat_ammo -f mats/,core/,total/ stockpiles import -m enable bolts Animal stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -traps -cages +Flags:: + + cages + traps + +Settings files:: + + cages + traps + +Example commands for a stockpile of empty cages:: + + stockpiles import cages + +Or, using the flag for the same effect:: + + stockpiles import cat_animals -f cages Armor stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -metalarmor -otherarmor -ironarmor -bronzearmor -copperarmor -steelarmor -masterworkarmor -artifactarmor -usablearmor -unusablearmor +Flags and subcategory prefixes:: + + nouse + canuse + body/ + head/ + feet/ + hands/ + legs/ + shield/ + mats/ + other/ + core/ + total/ + +Settings files:: + metalarmor + otherarmor + ironarmor + bronzearmor + copperarmor + steelarmor + usablearmor + unusablearmor + +Example commands for a stockpile of sub-masterwork meltable armor:: + + stockpiles import cat_armor + stockpiles import -m disable -f other/,core/mas,core/art cat_armor Bar stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~ -bars -metalbars -ironbars -pigironbars -steelbars -otherbars -coal -potash -ash -pearlash -soap -blocks +Subcategory prefixes:: + + mats/bars/ + other/bars/ + mats/blocks/ + other/blocks/ + +Settings files:: + + bars + metalbars + ironbars + pigironbars + steelbars + otherbars + coal + potash + ash + pearlash + soap + blocks + +Example commands for a stockpile of blocks:: + + stockpiles import blocks Cloth stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -thread -adamantinethread -cloth -adamantinecloth +Subcategory prefixes:: + + thread/silk/ + thread/plant/ + thread/yarn/ + thread/metal/ + cloth/silk/ + cloth/plant/ + cloth/yarn/ + cloth/metal/ + +Settings files:: + + thread + adamantinethread + cloth + adamantinecloth Notes: -* ``thread`` and ``cloth`` refers to all materials that are not adamantine. +* ``thread`` and ``cloth`` settings files set all materials that are not +adamantine. Finished goods stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -287,11 +346,11 @@ usablehair You can get a stockpile of usable refuse with the following set of commands:: - stockpiles import category_refuse -m enable -f skulls - stockpiles import category_refuse -m enable -f bones - stockpiles import category_refuse -m enable -f shells - stockpiles import category_refuse -m enable -f teeth - stockpiles import category_refuse -m enable -f horns + stockpiles import cat_refuse -m enable -f skulls + stockpiles import cat_refuse -m enable -f bones + stockpiles import cat_refuse -m enable -f shells + stockpiles import cat_refuse -m enable -f teeth + stockpiles import cat_refuse -m enable -f horns stockpiles import usablehair -m enable Stone stockpile adjustments diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index ca51c0b3e..dd418c840 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1457,7 +1457,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_fish(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().fish(idx); }; - return food_pair("fish", setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); + return food_pair("fish/prepared", setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); } case organic_mat_category::UnpreparedFish: { @@ -1465,7 +1465,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_unprepared_fish(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().unprepared_fish(idx); }; - return food_pair("unpreparedfish", setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); + return food_pair("fish/unprepared", setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); } case organic_mat_category::Eggs: { From f6ebe36012a3ceb364d0105f98c2f90421e3ada5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 21 Mar 2023 00:46:06 -0700 Subject: [PATCH 128/439] final stockpile library update --- data/stockpiles/bags.dfstock | 4 ++-- data/stockpiles/buckets.dfstock | 4 ++-- data/stockpiles/pots.dfstock | 4 ++-- data/stockpiles/sand.dfstock | 5 +++-- data/stockpiles/weapons.dfstock | Bin 709 -> 0 bytes 5 files changed, 9 insertions(+), 8 deletions(-) delete mode 100644 data/stockpiles/weapons.dfstock diff --git a/data/stockpiles/bags.dfstock b/data/stockpiles/bags.dfstock index 6f95e7638..3bfa1a1a1 100644 --- a/data/stockpiles/bags.dfstock +++ b/data/stockpiles/bags.dfstock @@ -1,2 +1,2 @@ -Ë -BAG PLANT_CLOTHLEATHERSILKYARN"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file + +BAG \ No newline at end of file diff --git a/data/stockpiles/buckets.dfstock b/data/stockpiles/buckets.dfstock index 656e21309..cb6b8c4bb 100644 --- a/data/stockpiles/buckets.dfstock +++ b/data/stockpiles/buckets.dfstock @@ -1,2 +1,2 @@ -à -BUCKETWOOD PLANT_CLOTHBONETOOTHHORNPEARLSHELLLEATHERSILKAMBERCORAL GREEN_GLASS CLEAR_GLASS CRYSTAL_GLASSYARNINORGANIC:IRONINORGANIC:SILVERINORGANIC:COPPERINORGANIC:NICKELINORGANIC:ZINCINORGANIC:BRONZEINORGANIC:BRASSINORGANIC:STEELINORGANIC:PIG_IRONINORGANIC:PLATINUMINORGANIC:ELECTRUM INORGANIC:TININORGANIC:PEWTER_FINEINORGANIC:PEWTER_TRIFLEINORGANIC:PEWTER_LAYINORGANIC:LEADINORGANIC:ALUMINUMINORGANIC:NICKEL_SILVERINORGANIC:BILLONINORGANIC:STERLING_SILVERINORGANIC:BLACK_BRONZEINORGANIC:ROSE_GOLDINORGANIC:BISMUTHINORGANIC:BISMUTH_BRONZEINORGANIC:ADAMANTINEINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE INORGANIC:BROMS_CLEAN_CORPSEDUSTINORGANIC:GOLDINORGANIC:DIVINE_1INORGANIC:DIVINE_3INORGANIC:DIVINE_5INORGANIC:DIVINE_7INORGANIC:DIVINE_9INORGANIC:DIVINE_11INORGANIC:DIVINE_13INORGANIC:DIVINE_15INORGANIC:DIVINE_17INORGANIC:DIVINE_19"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file + +BUCKET \ No newline at end of file diff --git a/data/stockpiles/pots.dfstock b/data/stockpiles/pots.dfstock index 016b086b3..2c1fe0e5c 100644 --- a/data/stockpiles/pots.dfstock +++ b/data/stockpiles/pots.dfstock @@ -1,2 +1,2 @@ -æ - FOOD_STORAGEWOOD PLANT_CLOTHBONETOOTHHORNPEARLSHELLLEATHERSILKAMBERCORAL GREEN_GLASS CLEAR_GLASS CRYSTAL_GLASSYARNINORGANIC:IRONINORGANIC:SILVERINORGANIC:COPPERINORGANIC:NICKELINORGANIC:ZINCINORGANIC:BRONZEINORGANIC:BRASSINORGANIC:STEELINORGANIC:PIG_IRONINORGANIC:PLATINUMINORGANIC:ELECTRUM INORGANIC:TININORGANIC:PEWTER_FINEINORGANIC:PEWTER_TRIFLEINORGANIC:PEWTER_LAYINORGANIC:LEADINORGANIC:ALUMINUMINORGANIC:NICKEL_SILVERINORGANIC:BILLONINORGANIC:STERLING_SILVERINORGANIC:BLACK_BRONZEINORGANIC:ROSE_GOLDINORGANIC:BISMUTHINORGANIC:BISMUTH_BRONZEINORGANIC:ADAMANTINEINORGANIC:PLASTERINORGANIC:CERAMIC_EARTHENWAREINORGANIC:CERAMIC_STONEWAREINORGANIC:CERAMIC_PORCELAININORGANIC:ASH_GLAZEINORGANIC:TIN_GLAZEINORGANIC:SANDSTONEINORGANIC:SILTSTONEINORGANIC:MUDSTONEINORGANIC:SHALEINORGANIC:CLAYSTONEINORGANIC:ROCK_SALTINORGANIC:LIMESTONEINORGANIC:CONGLOMERATEINORGANIC:DOLOMITEINORGANIC:CHERTINORGANIC:CHALKINORGANIC:GRANITEINORGANIC:DIORITEINORGANIC:GABBROINORGANIC:RHYOLITEINORGANIC:BASALTINORGANIC:ANDESITEINORGANIC:DACITEINORGANIC:OBSIDIANINORGANIC:QUARTZITEINORGANIC:SLATEINORGANIC:PHYLLITEINORGANIC:SCHISTINORGANIC:GNEISSINORGANIC:MARBLEINORGANIC:HEMATITEINORGANIC:LIMONITEINORGANIC:GARNIERITEINORGANIC:NATIVE_GOLDINORGANIC:NATIVE_SILVERINORGANIC:NATIVE_COPPERINORGANIC:MALACHITEINORGANIC:GALENAINORGANIC:SPHALERITEINORGANIC:CASSITERITEINORGANIC:COAL_BITUMINOUSINORGANIC:LIGNITEINORGANIC:NATIVE_PLATINUMINORGANIC:CINNABARINORGANIC:COBALTITEINORGANIC:TETRAHEDRITEINORGANIC:HORN_SILVERINORGANIC:GYPSUMINORGANIC:TALC INORGANIC:JETINORGANIC:PUDDINGSTONEINORGANIC:PETRIFIED_WOODINORGANIC:GRAPHITEINORGANIC:BRIMSTONEINORGANIC:KIMBERLITEINORGANIC:BISMUTHINITEINORGANIC:REALGARINORGANIC:ORPIMENTINORGANIC:STIBNITEINORGANIC:MARCASITEINORGANIC:SYLVITEINORGANIC:CRYOLITEINORGANIC:PERICLASEINORGANIC:ILMENITEINORGANIC:RUTILEINORGANIC:MAGNETITEINORGANIC:CHROMITEINORGANIC:PYROLUSITEINORGANIC:PITCHBLENDEINORGANIC:BAUXITEINORGANIC:NATIVE_ALUMINUMINORGANIC:BORAXINORGANIC:OLIVINEINORGANIC:HORNBLENDEINORGANIC:KAOLINITEINORGANIC:SERPENTINEINORGANIC:ORTHOCLASEINORGANIC:MICROCLINEINORGANIC:MICAINORGANIC:CALCITEINORGANIC:SALTPETERINORGANIC:ALABASTERINORGANIC:SELENITEINORGANIC:SATINSPARINORGANIC:ANHYDRITEINORGANIC:ALUNITEINORGANIC:RAW_ADAMANTINEINORGANIC:SLADE INORGANIC:BROMS_CLEAN_CORPSEDUSTINORGANIC:GOLDINORGANIC:DIVINE_1INORGANIC:DIVINE_3INORGANIC:DIVINE_5INORGANIC:DIVINE_7INORGANIC:DIVINE_9INORGANIC:DIVINE_11INORGANIC:DIVINE_13INORGANIC:DIVINE_15INORGANIC:DIVINE_17INORGANIC:DIVINE_19"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file + + FOOD_STORAGE \ No newline at end of file diff --git a/data/stockpiles/sand.dfstock b/data/stockpiles/sand.dfstock index 87b2fe9ce..b97921e81 100644 --- a/data/stockpiles/sand.dfstock +++ b/data/stockpiles/sand.dfstock @@ -1,2 +1,3 @@ -Ð -SAND_BAG PLANT_CLOTHLEATHERSILKYARN"Ordinary" WellCrafted" FinelyCrafted"Superior" Exceptional" Masterful"Artifact*Ordinary* WellCrafted* FinelyCrafted*Superior* Exceptional* Masterful*Artifact \ No newline at end of file + + +SAND_BAG \ No newline at end of file diff --git a/data/stockpiles/weapons.dfstock b/data/stockpiles/weapons.dfstock deleted file mode 100644 index e4968f56d4a16f14d4fc2edfca5a24651d83c615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmZ{iJx&BM42741#s>hz@*^sGDnzxOj7g%+&&bIrbh!&R<7P}W5>Pz4D9_LNoafJr zuS>da!b?tXzDn%-xi{w*x(5P(NT0aYAW(K3qiAoe^Z?wYWu1F*Su5QjeUZ(HfFc{A zBd{3FrA)a&*W%5Yu7GP8Zqa?n&93R6W@mvW$6*qkA>Kami-W(liyz Date: Tue, 21 Mar 2023 00:46:21 -0700 Subject: [PATCH 129/439] finalize docs, clear flags --- docs/plugins/stockpiles.rst | 241 ++++++++++++++------- plugins/stockpiles/StockpileSerializer.cpp | 4 + 2 files changed, 170 insertions(+), 75 deletions(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 987be3299..6b87d7a96 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -275,113 +275,204 @@ adamantine. Finished goods stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -stonetools -woodtools -crafts -goblets -toys -masterworkfinishedgoods -artifactfinishedgoods +Subcategory prefixes:: + + type/ + mats/ + other/ + core/ + total/ + +Settings files:: + + stonetools + woodtools + crafts + goblets + toys + +Example commands for a toy stockpile:: + + stockpiles import cat_furniture -f mats/,other/,core/,total/ + stockpiles import -m enable toys Food stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~ -preparedmeals -unpreparedfish -plants -booze -seeds -dye -miscliquid -wax +Flags and subcategory prefixes:: + + preparedmeals + meat/ + fish/prepared/ + fish/unprepared/ + egg/ + plants/ + drink/plant/ + drink/animal/ + cheese/plant/ + cheese/animal/ + seeds/ + leaves/ + powder/plant/ + powder/animal/ + glob/ + liquid/plant/ + liquid/animal/ + liquid/misc/ + paste/ + pressed/ + +Settings files:: + + preparedmeals + unpreparedfish + plants + booze + seeds + dye + miscliquid + wax + +Example commands for a kitchen ingredients stockpile:: + + stockpiles import cat_food -f meat/,fish/prepared/,egg/,cheese/,leaves/,powder/,glob/,liquid/plant/,paste/,pressed/ + stockpiles import cat_food -m enable -f milk,royal_jelly + stockpiles import dye -m disable + stockpiles import cat_food -m disable -f tallow,thread,liquid/misc/ Furniture stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -pots -bags -buckets -sand -masterworkfurniture -artifactfurniture +Subcategory prefixes:: + + type/ + mats/ + other/ + core/ + total/ + +Settings files:: + + pots + bags + buckets + sand * Because of the limitations of Dwarf Fortress, ``bags`` cannot distinguish between empty bags and bags filled with gypsum powder. +Example commands for a sand bag stockpile:: + + stockpiles import cat_furniture + stockpiles import cat_furniture -m disable -f type/ + stockpiles import sand -m enable + Gem stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~ -roughgems -roughglass -cutgems -cutglass -cutstone +Subcategory prefixes:: + + mats/rough/ + mats/cut/ + other/rough/ + other/cut/ + +Settings files:: + + roughgems + roughglass + cutgems + cutglass + cutstone Refuse stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -=========== ================== ================== -Exclusive Forbid Permit -=========== ================== ================== -corpses forbidcorpses permitcorpses -skulls forbidskulls permitskulls -bones forbidbones permitbones -shells forbidshells permitshells -teeth forbidteeth permitteeth -horns forbidhorns permithorns -hair forbidhair permithair -craftrefuse forbidcraftrefuse permitcraftrefuse -=========== ================== ================== +Flags and subcategory prefixes:: + + rawhide/fresh + rawhide/rotten + type/ + corpses/ + bodyparts/ + skulls/ + bones/ + hair/ + shells/ + teeth/ + horns/ + +Settings files:: + + rawhides + tannedhides + usablehair Notes: * ``usablehair`` Only hair and wool that can make usable clothing is included, i.e. from sheep, llamas, alpacas, and trolls. -* ``craftrefuse`` includes everything a craftsdwarf or tailor can use: skulls, - bones, shells, teeth, horns, and "usable" hair/wool (defined above). - -rawhides -tannedhides -usablehair -You can get a stockpile of usable refuse with the following set of commands:: +Example commands for a craftable refuse stockpile:: - stockpiles import cat_refuse -m enable -f skulls - stockpiles import cat_refuse -m enable -f bones - stockpiles import cat_refuse -m enable -f shells - stockpiles import cat_refuse -m enable -f teeth - stockpiles import cat_refuse -m enable -f horns + stockpiles import cat_refuse -f skulls/,bones/,shells',teeth/,horns/ stockpiles import usablehair -m enable +Sheet stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Subcategory prefixes:: + + paper/ + parchment/ + Stone stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -metalore -ironore -economic -flux -plasterproducing -coalproducing -otherstone -bauxite -clay +Settings files:: + + metalore + ironore + economic + flux + plasterproducing + coalproducing + otherstone + bauxite + clay Weapon stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -weapons -metalweapons -stoneweapons -otherweapons -trapcomponents -ironweapons -silverweapons -bronzeweapons -copperweapons -steelweapons -platinumweapons -adamantineweapons -masterworkweapons -artifactweapons -usableweapons -unusableweapons +Flags and subcategory prefixes:: + + nouse + canuse + type/weapon/ + type/trapcomp/ + mats/ + other/ + core/ + total/ + +Settings files:: + + metalweapons + stoneweapons + otherweapons + trapcomponents + ironweapons + silverweapons + bronzeweapons + copperweapons + steelweapons + platinumweapons + adamantineweapons + usableweapons + unusableweapons + +Example commands for a non-metallic trap components stockpile:: + + stockpiles import cat_weapons + stockpiles import cat_weapons -m disable -f type/weapon/ + stockpiles metalweapons -m disable diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index dd418c840..f6a63ff4f 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1090,6 +1090,8 @@ void StockpileSerializer::read_armor(DeserializeMode mode, const vector& mPile->settings.flags.whole, mPile->settings.flags.mask_armor, [&]() { + parmor.unusable = false; + parmor.usable = false; parmor.body.clear(); parmor.head.clear(); parmor.feet.clear(); @@ -2158,6 +2160,8 @@ void StockpileSerializer::read_weapons(DeserializeMode mode, const vectorsettings.flags.whole, mPile->settings.flags.mask_weapons, [&]() { + pweapons.unusable = false; + pweapons.usable = false; pweapons.weapon_type.clear(); pweapons.trapcomp_type.clear(); pweapons.other_mats.clear(); From 22872f61c408d0763b98fb09e4ded0c35bafbb52 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 21 Mar 2023 02:13:23 -0700 Subject: [PATCH 130/439] fix indent --- docs/plugins/stockpiles.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 6b87d7a96..8093b6c1d 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -270,7 +270,7 @@ Settings files:: Notes: * ``thread`` and ``cloth`` settings files set all materials that are not -adamantine. + adamantine. Finished goods stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 9154a52d0a869a065cf2c7ec3183b56d5b7a5962 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 22 Mar 2023 23:58:02 -0700 Subject: [PATCH 131/439] remove spaces and dashes from allowed filename chars since this will likely make it more difficult to represent stockpile filenames in quickfort's stockpile configuration language --- docs/plugins/stockpiles.rst | 3 +-- plugins/lua/stockpiles.lua | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 8093b6c1d..560ae2497 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -20,8 +20,7 @@ Usage Exported stockpile settings are saved in the ``dfhack-config/stockpiles`` folder, where you can view and delete them, if desired. Names can only -contain numbers, letters, periods, underscores, dashes, and spaces. If -the name has spaces, be sure to surround it with double quotes (:kbd:`"`). +contain numbers, letters, periods, and underscores. The names of library settings files are all prefixed by the string ``library/``. You can specify library files explicitly by including the prefix, or you can diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index f9c7d7b4a..6134f0a1b 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -62,8 +62,8 @@ local function assert_safe_name(name) if not name or #name == 0 then qerror('name missing or empty') end - if name:find('[^%a ._-]') then - qerror('name can only contain numbers, letters, periods, underscores, dashes, and spaces') + if name:find('[^%a._]') then + qerror('name can only contain numbers, letters, periods, and underscores') end end From 05f407e10bedde8102eac52f235d55eecb9d70d7 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 23 Mar 2023 02:36:20 -0700 Subject: [PATCH 132/439] update changelog --- docs/changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 2b88261f8..c7baf4df8 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -41,6 +41,11 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `buildingplan`: upright spike traps are now placed extended rather than retracted ## Misc Improvements +- `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from +- `stockpiles`: support partial application of a saved config based on dynamic filtering +- `stockpiles`: additive and subtractive modes when applying a second stockpile configuration on top of a first +- `stockpiles`: write player-exported stockpile configurations to the ``dfhack-config/stockpiles`` folder. If you have any stockpile configs in other directories, please move them to that folder. +- `stockpiles`: now includes a library of useful stockpile configs (see docs for details) - `automelt`: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed) ## Documentation From 873e94ea5df894780f67e64b5f7f161ba3d7e5af Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 23 Mar 2023 10:48:33 -0700 Subject: [PATCH 133/439] actually record the deserialized material mask val --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 4 ++-- plugins/buildingplan/itemfilter.cpp | 14 ++++++-------- plugins/buildingplan/itemfilter.h | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 142b10e83..976490f97 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,6 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - `tailor`: now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine - `buildingplan`: upright spike traps are now placed extended rather than retracted +- `buildingplan`: fixed material filter getting lost for planning buildings on save/reload ## Misc Improvements - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index b472c7390..1e2d2c80e 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -130,7 +130,7 @@ static const vector & get_job_items(color_ostream &out, Bu }, [&](lua_State *L) { df::job_item *jitem = Lua::GetDFObject(L, -1); - DEBUG(status,out).print("retrieving job_item for (%d, %d, %d) index=%d: %p\n", + DEBUG(status,out).print("retrieving job_item for (%d, %d, %d) index=%d: 0x%p\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), index, jitem); if (!jitem) failed = true; @@ -311,7 +311,7 @@ DFhackCExport command_result plugin_load_data (color_ostream &out) { PlannedBuilding pb(out, building_configs[idx]); df::building *bld = df::building::find(pb.id); if (!bld) { - INFO(status,out).print("building %d no longer exists; skipping\n", pb.id); + DEBUG(status,out).print("building %d no longer exists; skipping\n", pb.id); pb.remove(out); continue; } diff --git a/plugins/buildingplan/itemfilter.cpp b/plugins/buildingplan/itemfilter.cpp index 8e66c3ed7..dac5f98d6 100644 --- a/plugins/buildingplan/itemfilter.cpp +++ b/plugins/buildingplan/itemfilter.cpp @@ -35,7 +35,7 @@ bool ItemFilter::isEmpty() const { && materials.empty(); } -static bool deserializeMaterialMask(string ser, df::dfhack_material_category mat_mask) { +static bool deserializeMaterialMask(const string& ser, df::dfhack_material_category& mat_mask) { if (ser.empty()) return true; @@ -46,7 +46,7 @@ static bool deserializeMaterialMask(string ser, df::dfhack_material_category mat return true; } -static bool deserializeMaterials(string ser, set &materials) { +static bool deserializeMaterials(const string& ser, set &materials) { if (ser.empty()) return true; @@ -63,7 +63,7 @@ static bool deserializeMaterials(string ser, set &material return true; } -ItemFilter::ItemFilter(color_ostream &out, string serialized) : ItemFilter() { +ItemFilter::ItemFilter(color_ostream &out, const string& serialized) : ItemFilter() { vector tokens; split_string(&tokens, serialized, "/"); if (tokens.size() < 5) { @@ -87,11 +87,9 @@ string ItemFilter::serialize() const { std::ostringstream ser; ser << bitfield_to_string(mat_mask, ",") << "/"; vector matstrs; - if (!materials.empty()) { - for (auto &mat : materials) - matstrs.emplace_back(mat.getToken()); - ser << join_strings(",", matstrs); - } + for (auto &mat : materials) + matstrs.emplace_back(mat.getToken()); + ser << join_strings(",", matstrs); ser << "/" << static_cast(min_quality); ser << "/" << static_cast(max_quality); ser << "/" << static_cast(decorated_only); diff --git a/plugins/buildingplan/itemfilter.h b/plugins/buildingplan/itemfilter.h index 5ae59dd4a..c74150434 100644 --- a/plugins/buildingplan/itemfilter.h +++ b/plugins/buildingplan/itemfilter.h @@ -8,7 +8,7 @@ class ItemFilter { public: ItemFilter(); - ItemFilter(DFHack::color_ostream &out, std::string serialized); + ItemFilter(DFHack::color_ostream &out, const std::string& serialized); void clear(); bool isEmpty() const; From 95f6e6e5beab4ad2367b561dbd080dbafc22e8d4 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Thu, 23 Mar 2023 16:21:14 -0500 Subject: [PATCH 134/439] tailor: fix material overrun issue properly track materials required for already-queued jobs fixes #3056 --- docs/changelog.txt | 2 +- library/xml | 2 +- plugins/tailor.cpp | 31 ++++++++++++++++++++++++------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 142b10e83..ca5b87255 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,8 +37,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. ## Fixes -- `tailor`: now properly discriminates between dyed and undyed cloth and no longer defaults to using adamantine - `buildingplan`: upright spike traps are now placed extended rather than retracted +- `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, and properly tracks material requirements for already queued orders ## Misc Improvements - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from diff --git a/library/xml b/library/xml index 8b8ac2de0..0dc8ae877 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 8b8ac2de03ab5f8e5506864a751933059abfd03e +Subproject commit 0dc8ae87746e287538be01f01dc628662e756794 diff --git a/plugins/tailor.cpp b/plugins/tailor.cpp index 66e54dd60..2c5a1a027 100644 --- a/plugins/tailor.cpp +++ b/plugins/tailor.cpp @@ -383,6 +383,17 @@ public: auto sub = o->item_subtype; int race = o->hist_figure_id; + + for (auto& m : all_materials) + { + if (o->material_category.whole == m.job_material.whole) + { + supply[m] -= o->amount_left; + TRACE(cycle).print("tailor: supply of %s reduced by %d due to being required for an existing order\n", + m.name.c_str(), o->amount_left); + } + } + if (race == -1) continue; // -1 means that the race of the worker will determine the size made; we must ignore these jobs @@ -525,6 +536,18 @@ public: } return ordered; } + + int do_cycle() + { + reset(); + scan_clothing(); + scan_materials(); + scan_replacements(); + create_orders(); + scan_existing_orders(); + return place_orders(); + } + }; static std::unique_ptr tailor_instance; @@ -684,13 +707,7 @@ static int do_cycle(color_ostream &out) { DEBUG(cycle,out).print("running %s cycle\n", plugin_name); - tailor_instance->reset(); - tailor_instance->scan_clothing(); - tailor_instance->scan_materials(); - tailor_instance->scan_replacements(); - tailor_instance->create_orders(); - tailor_instance->scan_existing_orders(); - return tailor_instance->place_orders(); + return tailor_instance->do_cycle(); } ///////////////////////////////////////////////////// From 013c6fe02a376fa1a2b4d6823879a8171a2f5ee1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 23 Mar 2023 11:07:10 -0700 Subject: [PATCH 135/439] don't render footprint if we're minmized --- plugins/lua/buildingplan/planneroverlay.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index a60b2ebcd..ec05e90f6 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -694,6 +694,8 @@ function PlannerOverlay:onRenderFrame(dc, rect) uibs.building_type, uibs.building_subtype, uibs.custom_type)) end + if self.minimized then return end + local selection_pos = self.saved_selection_pos or uibs.selection_pos if not selection_pos or selection_pos.x < 0 then return end From 0f8478df17596ffb07589c0500592827e509f8be Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 24 Mar 2023 07:13:34 +0000 Subject: [PATCH 136/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 0dc8ae877..8b8ac2de0 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 0dc8ae87746e287538be01f01dc628662e756794 +Subproject commit 8b8ac2de03ab5f8e5506864a751933059abfd03e diff --git a/scripts b/scripts index 7f388c0c1..0b37dcf99 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 7f388c0c1bf9ed5fa3f7abf1153da54921a93e15 +Subproject commit 0b37dcf996bf4b64423d2acb3e3ca224ad76c6bc From 99d050d0a85f6120f8bed2fa1775dc479b7f852c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 14:06:39 -0700 Subject: [PATCH 137/439] respect building size limits --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 135 +++++++++++++------- 2 files changed, 92 insertions(+), 44 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 2a5b2cf15..88c6eac3b 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,6 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - `buildingplan`: upright spike traps are now placed extended rather than retracted - `buildingplan`: fixed material filter getting lost for planning buildings on save/reload +- `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) - `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, and properly tracks material requirements for already queued orders ## Misc Improvements diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index ec05e90f6..e92824f5f 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -23,13 +23,68 @@ local function is_choosing_area() return uibs.selection_pos.x >= 0 end -local function get_cur_area_dims(placement_data) - if not placement_data and not is_choosing_area() then return 1, 1, 1 end - local selection_pos = placement_data and placement_data.p1 or uibs.selection_pos - local pos = placement_data and placement_data.p2 or uibs.pos - return math.abs(selection_pos.x - pos.x) + 1, - math.abs(selection_pos.y - pos.y) + 1, - math.abs(selection_pos.z - pos.z) + 1 +-- TODO: reuse data in quickfort database +local function get_selection_size_limits() + local btype = uibs.building_type + if btype == df.building_type.Bridge + or btype == df.building_type.FarmPlot + or btype == df.building_type.RoadPaved + or btype == df.building_type.RoadDirt then + return {w=31, h=31} + elseif btype == df.building_type.AxleHorizontal + or btype == df.building_type.Rollers then + return uibs.direction == 1 and {w=1, h=31} or {w=31, h=1} + end +end + +local function get_selected_bounds(selection_pos, pos) + selection_pos = selection_pos or uibs.selection_pos + if not is_choosing_area() then return end + + pos = pos or uibs.pos + + local bounds = { + x1=math.min(selection_pos.x, pos.x), + x2=math.max(selection_pos.x, pos.x), + y1=math.min(selection_pos.y, pos.y), + y2=math.max(selection_pos.y, pos.y), + z1=math.min(selection_pos.z, pos.z), + z2=math.max(selection_pos.z, pos.z), + } + + -- clamp to map edges + bounds = { + x1=math.max(0, bounds.x1), + x2=math.min(df.global.world.map.x_count-1, bounds.x2), + y1=math.max(0, bounds.y1), + y2=math.min(df.global.world.map.y_count-1, bounds.y2), + z1=math.max(0, bounds.z1), + z2=math.min(df.global.world.map.z_count-1, bounds.z2), + } + + local limits = get_selection_size_limits() + if limits then + -- clamp to building type area limit + bounds = { + x1=math.max(selection_pos.x - (limits.w-1), bounds.x1), + x2=math.min(selection_pos.x + (limits.w-1), bounds.x2), + y1=math.max(selection_pos.y - (limits.h-1), bounds.y1), + y2=math.min(selection_pos.y + (limits.h-1), bounds.y2), + z1=bounds.z1, + z2=bounds.z2, + } + end + + return bounds +end + +local function get_cur_area_dims(bounds) + if not bounds and not is_choosing_area() then return 1, 1, 1 end + bounds = bounds or get_selected_bounds() + if not bounds then return 1, 1, 1 end + return bounds.x2 - bounds.x1 + 1, + bounds.y2 - bounds.y1 + 1, + bounds.z2 - bounds.z1 + 1 end local function is_pressure_plate() @@ -53,7 +108,7 @@ end -- adjusted from CycleHotkeyLabel on the planner panel local weapon_quantity = 1 -local function get_quantity(filter, hollow, placement_data) +local function get_quantity(filter, hollow, bounds) if is_pressure_plate() then local flags = uibs.plate_info.flags return (flags.units and 1 or 0) + (flags.water and 1 or 0) + @@ -62,7 +117,7 @@ local function get_quantity(filter, hollow, placement_data) return weapon_quantity end local quantity = filter.quantity or 1 - local dimx, dimy, dimz = get_cur_area_dims(placement_data) + local dimx, dimy, dimz = get_cur_area_dims(bounds) if quantity < 1 then return (((dimx * dimy) // 4) + 1) * dimz end @@ -519,19 +574,18 @@ function PlannerOverlay:clear_filter(idx) end local function get_placement_data() - local pos = uibs.pos local direction = uibs.direction - local width, height, depth = get_cur_area_dims() + local bounds = get_selected_bounds() + local width, height, depth = get_cur_area_dims(bounds) local _, adjusted_width, adjusted_height = dfhack.buildings.getCorrectSize( width, height, uibs.building_type, uibs.building_subtype, uibs.custom_type, direction) -- get the upper-left corner of the building/area at min z-level - local has_selection = is_choosing_area() - local start_pos = xyz2pos( - has_selection and math.min(uibs.selection_pos.x, pos.x) or pos.x - adjusted_width//2, - has_selection and math.min(uibs.selection_pos.y, pos.y) or pos.y - adjusted_height//2, - has_selection and math.min(uibs.selection_pos.z, pos.z) or pos.z - ) + local start_pos = bounds and xyz2pos(bounds.x1, bounds.y1, bounds.z1) or + xyz2pos( + uibs.pos.x - adjusted_width//2, + uibs.pos.y - adjusted_height//2, + uibs.pos.z) if uibs.building_type == df.building_type.ScrewPump then if direction == df.screw_pump_direction.FromSouth then start_pos.y = start_pos.y + 1 @@ -546,11 +600,11 @@ local function get_placement_data() and (width > 1 or height > 1 or depth > 1) then max_x = min_x + width - 1 max_y = min_y + height - 1 - max_z = math.max(uibs.selection_pos.z, pos.z) + max_z = math.max(uibs.selection_pos.z, uibs.pos.z) end return { - p1=xyz2pos(min_x, min_y, min_z), - p2=xyz2pos(max_x, max_y, max_z), + x1=min_x, y1=min_y, z1=min_z, + x2=max_x, y2=max_y, z2=max_z, width=adjusted_width, height=adjusted_height } @@ -564,10 +618,11 @@ function PlannerOverlay:save_placement() self.saved_pos = copyall(uibs.pos) uibs.selection_pos:clear() else - self.saved_selection_pos = copyall(self.saved_placement.p1) - self.saved_pos = copyall(self.saved_placement.p2) - self.saved_pos.x = self.saved_pos.x + self.saved_placement.width - 1 - self.saved_pos.y = self.saved_pos.y + self.saved_placement.height - 1 + local sp = self.saved_placement + self.saved_selection_pos = xyz2pos(sp.x1, sp.y1, sp.z1) + self.saved_pos = xyz2pos(sp.x2, sp.y2, sp.z2) + self.saved_pos.x = self.saved_pos.x + sp.width - 1 + self.saved_pos.y = self.saved_pos.y + sp.height - 1 end end @@ -624,6 +679,7 @@ function PlannerOverlay:onInput(keys) local num_filters = #filters local choose = self.subviews.choose if choose.enabled() and choose:getOptionValue() then + local bounds = get_selected_bounds() self:save_placement() local is_hollow = self.subviews.hollow:getOptionValue() local chosen_items, active_screens = {}, {} @@ -636,8 +692,7 @@ function PlannerOverlay:onInput(keys) active_screens[idx] = itemselection.ItemSelectionScreen{ index=idx, desc=require('plugins.buildingplan').get_desc(filter), - quantity=get_quantity(filter, is_hollow, - self.saved_placement), + quantity=get_quantity(filter, is_hollow, bounds), on_submit=function(items) chosen_items[idx] = items active_screens[idx]:dismiss() @@ -696,16 +751,8 @@ function PlannerOverlay:onRenderFrame(dc, rect) if self.minimized then return end - local selection_pos = self.saved_selection_pos or uibs.selection_pos - if not selection_pos or selection_pos.x < 0 then return end - - local pos = self.saved_pos or uibs.pos - local bounds = { - x1 = math.max(0, math.min(selection_pos.x, pos.x)), - x2 = math.min(df.global.world.map.x_count-1, math.max(selection_pos.x, pos.x)), - y1 = math.max(0, math.min(selection_pos.y, pos.y)), - y2 = math.min(df.global.world.map.y_count-1, math.max(selection_pos.y, pos.y)), - } + local bounds = get_selected_bounds(self.saved_selection_pos, self.saved_pos) + if not bounds then return end local hollow = self.subviews.hollow:getOptionValue() local default_pen = (self.saved_selection_pos or #uibs.errors == 0) and pens.GOOD_TILE_PEN or pens.BAD_TILE_PEN @@ -728,9 +775,9 @@ function PlannerOverlay:onRenderFrame(dc, rect) guidm.renderMapOverlay(get_overlay_pen, bounds) end -function PlannerOverlay:get_stairs_subtype(pos, corner1, corner2) +function PlannerOverlay:get_stairs_subtype(pos, bounds) local subtype = uibs.building_subtype - if pos.z == corner1.z then + if pos.z == bounds.z1 then local opt = self.subviews.stairs_bottom_subtype:getOptionValue() if opt == 'auto' then local tt = dfhack.maps.getTileType(pos) @@ -741,7 +788,7 @@ function PlannerOverlay:get_stairs_subtype(pos, corner1, corner2) else subtype = opt end - elseif pos.z == corner2.z then + elseif pos.z == bounds.z2 then local opt = self.subviews.stairs_top_subtype:getOptionValue() if opt == 'auto' then local tt = dfhack.maps.getTileType(pos) @@ -757,7 +804,7 @@ function PlannerOverlay:get_stairs_subtype(pos, corner1, corner2) end function PlannerOverlay:place_building(placement_data, chosen_items) - local p1, p2 = placement_data.p1, placement_data.p2 + local pd = placement_data local blds = {} local hollow = self.subviews.hollow:getOptionValue() local subtype = uibs.building_subtype @@ -767,17 +814,17 @@ function PlannerOverlay:place_building(placement_data, chosen_items) elseif is_weapon_trap() then filters[2].quantity = get_quantity(filters[2]) end - for z=p1.z,p2.z do for y=p1.y,p2.y do for x=p1.x,p2.x do - if hollow and x ~= p1.x and x ~= p2.x and y ~= p1.y and y ~= p2.y then + for z=pd.z1,pd.z2 do for y=pd.y1,pd.y2 do for x=pd.x1,pd.x2 do + if hollow and x ~= pd.x1 and x ~= pd.x2 and y ~= pd.y1 and y ~= pd.y2 then goto continue end local pos = xyz2pos(x, y, z) if is_stairs() then - subtype = self:get_stairs_subtype(pos, p1, p2) + subtype = self:get_stairs_subtype(pos, pd) end local bld, err = dfhack.buildings.constructBuilding{pos=pos, type=uibs.building_type, subtype=subtype, custom=uibs.custom_type, - width=placement_data.width, height=placement_data.height, + width=pd.width, height=pd.height, direction=uibs.direction, filters=filters} if err then -- it's ok if some buildings fail to build From c8f590cbacefad8121216041ec215a597effc082 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 14:36:06 -0700 Subject: [PATCH 138/439] allow player to choose any item when choosing items manually that is, ignore the global and building-specific filters --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 23 +++++---- plugins/buildingplan/buildingplan.h | 2 +- plugins/buildingplan/plannedbuilding.cpp | 2 +- plugins/lua/buildingplan/planneroverlay.lua | 57 +++++++++------------ 5 files changed, 38 insertions(+), 47 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 88c6eac3b..11d849e9b 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -43,6 +43,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, and properly tracks material requirements for already queued orders ## Misc Improvements +- `buildingplan`: filters and global settings are now ignored when manually choosing items for a building - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from - `stockpiles`: support partial application of a saved config based on dynamic filtering - `stockpiles`: additive and subtractive modes when applying a second stockpile configuration on top of a first diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 1e2d2c80e..7f43f4a3c 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -424,7 +424,7 @@ static string getBucket(const df::job_item & ji, const PlannedBuilding & pb, int } // get a list of item vectors that we should search for matches -vector getVectorIds(color_ostream &out, const df::job_item *job_item) { +vector getVectorIds(color_ostream &out, const df::job_item *job_item, bool ignore_filters) { std::vector ret; // if the filter already has the vector_id set to something specific, use it @@ -440,13 +440,13 @@ vector getVectorIds(color_ostream &out, const df::job_it // which vectors to search if (job_item->flags2.bits.building_material) { - if (get_config_bool(config, CONFIG_BLOCKS)) + if (ignore_filters || get_config_bool(config, CONFIG_BLOCKS)) ret.push_back(df::job_item_vector_id::BLOCKS); - if (get_config_bool(config, CONFIG_BOULDERS)) + if (ignore_filters || get_config_bool(config, CONFIG_BOULDERS)) ret.push_back(df::job_item_vector_id::BOULDER); - if (get_config_bool(config, CONFIG_LOGS)) + if (ignore_filters || get_config_bool(config, CONFIG_LOGS)) ret.push_back(df::job_item_vector_id::WOOD); - if (get_config_bool(config, CONFIG_BARS)) + if (ignore_filters || get_config_bool(config, CONFIG_BARS)) ret.push_back(df::job_item_vector_id::BAR); } @@ -624,7 +624,7 @@ static void scheduleCycle(color_ostream &out) { } static int scanAvailableItems(color_ostream &out, df::building_type type, int16_t subtype, - int32_t custom, int index, vector *item_ids = NULL, + int32_t custom, int index, bool ignore_filters, vector *item_ids = NULL, map *counts = NULL) { DEBUG(status,out).print( "entering countAvailableItems building_type=%d subtype=%d custom=%d index=%d\n", @@ -639,7 +639,7 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ auto &specials = item_filters.getSpecials(); auto &jitem = job_items[index]; - auto vector_ids = getVectorIds(out, jitem); + auto vector_ids = getVectorIds(out, jitem, ignore_filters); int count = 0; for (auto vector_id : vector_ids) { @@ -651,7 +651,8 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ filter.setMaterialMask(0); filter.setMaterials(set()); } - if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter, specials)) { + if (itemPassesScreen(item) && + (ignore_filters || matchesFilters(item, jitem, heat, filter, specials))) { if (item_ids) item_ids->emplace_back(item->id); if (counts) { @@ -680,7 +681,7 @@ static int getAvailableItems(lua_State *L) { "entering getAvailableItems building_type=%d subtype=%d custom=%d index=%d\n", type, subtype, custom, index); vector item_ids; - scanAvailableItems(*out, type, subtype, custom, index, &item_ids); + scanAvailableItems(*out, type, subtype, custom, index, true, &item_ids); Lua::PushVector(L, item_ids); return 1; } @@ -703,7 +704,7 @@ static int countAvailableItems(color_ostream &out, df::building_type type, int16 DEBUG(status,out).print( "entering countAvailableItems building_type=%d subtype=%d custom=%d index=%d\n", type, subtype, custom, index); - return scanAvailableItems(out, type, subtype, custom, index); + return scanAvailableItems(out, type, subtype, custom, index, false); } static bool hasFilter(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, int index) { @@ -871,7 +872,7 @@ static int getMaterialFilter(lua_State *L) { return 0; const auto &mat_filter = filters[index].getMaterials(); map counts; - scanAvailableItems(*out, type, subtype, custom, index, NULL, &counts); + scanAvailableItems(*out, type, subtype, custom, index, false, NULL, &counts); HeatSafety heat = get_heat_safety_filter(key); df::job_item jitem_cur_heat = getJobItemWithHeatSafety( get_job_items(*out, key)[index], heat); diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 495602b0b..756a81f83 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -47,7 +47,7 @@ bool get_config_bool(DFHack::PersistentDataItem &c, int index); void set_config_val(DFHack::PersistentDataItem &c, int index, int value); void set_config_bool(DFHack::PersistentDataItem &c, int index, bool value); -std::vector getVectorIds(DFHack::color_ostream &out, const df::job_item *job_item); +std::vector getVectorIds(DFHack::color_ostream &out, const df::job_item *job_item, bool ignore_filters); bool itemPassesScreen(df::item * item); df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat); bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter, const std::set &special); diff --git a/plugins/buildingplan/plannedbuilding.cpp b/plugins/buildingplan/plannedbuilding.cpp index 2be2cf26f..a20d7b29a 100644 --- a/plugins/buildingplan/plannedbuilding.cpp +++ b/plugins/buildingplan/plannedbuilding.cpp @@ -29,7 +29,7 @@ static vector> get_vector_ids(color_ostream &out, auto &jitems = bld->jobs[0]->job_items; int num_job_items = (int)jitems.size(); for (int jitem_idx = num_job_items - 1; jitem_idx >= 0; --jitem_idx) { - ret.emplace_back(getVectorIds(out, jitems[jitem_idx])); + ret.emplace_back(getVectorIds(out, jitems[jitem_idx], false)); } return ret; } diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index e92824f5f..7db3dc3a3 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -496,13 +496,6 @@ function PlannerOverlay:init() options={{label='Yes', value=true}, {label='No', value=false}}, initial_option=false, - enabled=function() - for idx = 1,4 do - if (self.subviews['item'..idx].available or 0) > 0 then - return true - end - end - end, on_change=function(choose) buildingplan.setChooseItems(uibs.building_type, uibs.building_subtype, uibs.custom_type, choose) end, @@ -678,7 +671,7 @@ function PlannerOverlay:onInput(keys) local filters = get_cur_filters() local num_filters = #filters local choose = self.subviews.choose - if choose.enabled() and choose:getOptionValue() then + if choose:getOptionValue() then local bounds = get_selected_bounds() self:save_placement() local is_hollow = self.subviews.hollow:getOptionValue() @@ -687,33 +680,29 @@ function PlannerOverlay:onInput(keys) df.global.game.main_interface.bottom_mode_selected = -1 for idx = num_filters,1,-1 do chosen_items[idx] = {} - if (self.subviews['item'..idx].available or 0) > 0 then - local filter = filters[idx] - active_screens[idx] = itemselection.ItemSelectionScreen{ - index=idx, - desc=require('plugins.buildingplan').get_desc(filter), - quantity=get_quantity(filter, is_hollow, bounds), - on_submit=function(items) - chosen_items[idx] = items - active_screens[idx]:dismiss() - active_screens[idx] = nil - pending = pending - 1 - if pending == 0 then - df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT - self:place_building(self:restore_placement(), chosen_items) - end - end, - on_cancel=function() - for i,scr in pairs(active_screens) do - scr:dismiss() - end + local filter = filters[idx] + active_screens[idx] = itemselection.ItemSelectionScreen{ + index=idx, + desc=require('plugins.buildingplan').get_desc(filter), + quantity=get_quantity(filter, is_hollow, bounds), + on_submit=function(items) + chosen_items[idx] = items + active_screens[idx]:dismiss() + active_screens[idx] = nil + pending = pending - 1 + if pending == 0 then df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT - self:restore_placement() - end, - }:show() - else - pending = pending - 1 - end + self:place_building(self:restore_placement(), chosen_items) + end + end, + on_cancel=function() + for i,scr in pairs(active_screens) do + scr:dismiss() + end + df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT + self:restore_placement() + end, + }:show() end else self:place_building(get_placement_data()) From fe0590503fa680426afe0d1e66f845e71a2de5b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 15:05:17 -0700 Subject: [PATCH 139/439] mark tiles with magma or deep water as "not free" --- docs/changelog.txt | 1 + library/modules/Buildings.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 88c6eac3b..11e552abe 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - `buildingplan`: upright spike traps are now placed extended rather than retracted +- `buildingplan`: you can no longer designate constructions on tiles with magma or deep water - `buildingplan`: fixed material filter getting lost for planning buildings on save/reload - `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) - `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, and properly tracks material requirements for already queued orders diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 1d1ba9318..de87d3fb8 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -799,10 +799,13 @@ bool Buildings::checkFreeTiles(df::coord pos, df::coord2d size, if (!allow_occupied && block->occupancy[btile.x][btile.y].bits.building) allowed = false; - else + else if (!allow_wall) { - auto tile = block->tiletype[btile.x][btile.y]; - if (!allow_wall && !HighPassable(tile)) + auto &tt = block->tiletype[btile.x][btile.y]; + auto &des = block->designation[btile.x][btile.y]; + if (!HighPassable(tt) || + des.bits.flow_size > 1 || + (des.bits.flow_size >= 1 && des.bits.liquid_type == df::tile_liquid::Magma)) allowed = false; } From 58eaf33b085f11bcc32dc940f061e9debb014178 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 15:26:17 -0700 Subject: [PATCH 140/439] normalize stairs so they all use the same filter --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 88c6eac3b..c550fbc8a 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,6 +37,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. ## Fixes +- `buildingplan`: filters are now properly applied to planned stairs - `buildingplan`: upright spike traps are now placed extended rather than retracted - `buildingplan`: fixed material filter getting lost for planning buildings on save/reload - `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 1e2d2c80e..fd77194e5 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -9,6 +9,7 @@ #include "modules/World.h" +#include "df/construction_type.h" #include "df/item.h" #include "df/job_item.h" #include "df/world.h" @@ -282,6 +283,18 @@ static void clear_state(color_ostream &out) { call_buildingplan_lua(&out, "reload_pens"); } +static int16_t get_subtype(df::building *bld) { + if (!bld) + return -1; + + int16_t subtype = bld->getSubtype(); + if (bld->getType() == df::building_type::Construction && + subtype >= df::construction_type::UpStair && + subtype <= df::construction_type::UpDownStair) + subtype = df::construction_type::UpDownStair; + return subtype; +} + DFhackCExport command_result plugin_load_data (color_ostream &out) { cycle_timestamp = 0; config = World::GetPersistentData(CONFIG_KEY); @@ -315,7 +328,7 @@ DFhackCExport command_result plugin_load_data (color_ostream &out) { pb.remove(out); continue; } - BuildingTypeKey key(bld->getType(), bld->getSubtype(), bld->getCustomType()); + BuildingTypeKey key(bld->getType(), get_subtype(bld), bld->getCustomType()); if (pb.item_filters.size() != get_item_filters(out, key).getItemFilters().size()) { WARN(status).print("loaded state for building %d doesn't match world\n", pb.id); pb.remove(out); @@ -604,11 +617,15 @@ static bool isPlannedBuilding(color_ostream &out, df::building *bld) { static bool addPlannedBuilding(color_ostream &out, df::building *bld) { DEBUG(status,out).print("entering addPlannedBuilding\n"); - if (!bld || planned_buildings.count(bld->id) - || !isPlannableBuilding(out, bld->getType(), bld->getSubtype(), - bld->getCustomType())) + if (!bld || planned_buildings.count(bld->id)) return false; - BuildingTypeKey key(bld->getType(), bld->getSubtype(), bld->getCustomType()); + + int16_t subtype = get_subtype(bld); + + if (!isPlannableBuilding(out, bld->getType(), subtype, bld->getCustomType())) + return false; + + BuildingTypeKey key(bld->getType(), subtype, bld->getCustomType()); PlannedBuilding pb(out, bld, get_heat_safety_filter(key), get_item_filters(out, key)); return registerPlannedBuilding(out, pb); } From a8822bdefa2268c55affe0e0d5e8fe5fc429e48d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 15:43:02 -0700 Subject: [PATCH 141/439] take carved stairs into account when auto building stairs --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index c550fbc8a..3e340cf94 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - `buildingplan`: filters are now properly applied to planned stairs +- `buildingplan`: existing carved up/down stairs are now taken into account when determining which stair shape to construct - `buildingplan`: upright spike traps are now placed extended rather than retracted - `buildingplan`: fixed material filter getting lost for planning buildings on save/reload - `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index e92824f5f..8231a8f46 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -782,7 +782,7 @@ function PlannerOverlay:get_stairs_subtype(pos, bounds) if opt == 'auto' then local tt = dfhack.maps.getTileType(pos) local shape = df.tiletype.attrs[tt].shape - if shape ~= df.tiletype_shape.STAIR_DOWN then + if shape ~= df.tiletype_shape.STAIR_DOWN and shape ~= df.tiletype_shape.STAIR_UPDOWN then subtype = df.construction_type.UpStair end else @@ -793,7 +793,7 @@ function PlannerOverlay:get_stairs_subtype(pos, bounds) if opt == 'auto' then local tt = dfhack.maps.getTileType(pos) local shape = df.tiletype.attrs[tt].shape - if shape ~= df.tiletype_shape.STAIR_UP then + if shape ~= df.tiletype_shape.STAIR_UP and shape ~= df.tiletype_shape.STAIR_UPDOWN then subtype = df.construction_type.DownStair end else From d67d57af3dbac5c71f0e273bfa5827e359091933 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 23:25:14 -0700 Subject: [PATCH 142/439] tombstone autounsuspend and add alias --- data/init/dfhack.tools.init | 1 + docs/about/Removed.rst | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/data/init/dfhack.tools.init b/data/init/dfhack.tools.init index 0ca764e8e..aaf0cf277 100644 --- a/data/init/dfhack.tools.init +++ b/data/init/dfhack.tools.init @@ -142,4 +142,5 @@ enable \ # Default Aliases # ################### +alias add autounsuspend suspendmanager alias add gui/dig gui/design diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index 4a8cdbccf..a0365e621 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -26,6 +26,12 @@ Moved frequently used materials to the top of the materials list when building buildings. Also offered extended options when building constructions. All functionality has been merged into `buildingplan`. +.. _autounsuspend: + +autounsuspend +============= +Replaced by `suspendmanager`. + .. _combine-drinks: combine-drinks From 2bc92042a5b17266a4c425a14d8c73862949334b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 23:25:24 -0700 Subject: [PATCH 143/439] allow enable to interpret aliases --- docs/changelog.txt | 1 + library/Core.cpp | 13 ++++++++----- library/include/Core.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 11e552abe..7cb1fafcf 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -51,6 +51,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `stockpiles`: now includes a library of useful stockpile configs (see docs for details) - `automelt`: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed) - `orders`: add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen +- `enable`: can now interpret aliases defined with the `alias` command ## Documentation diff --git a/library/Core.cpp b/library/Core.cpp index 01bc89480..d55959ceb 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -763,6 +763,8 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, s } } + part = GetAliasCommand(part, true); + Plugin * plug = (*plug_mgr)[part]; if(!plug) @@ -2657,13 +2659,14 @@ std::map> Core::ListAliases() return aliases; } -std::string Core::GetAliasCommand(const std::string &name, const std::string &default_) +std::string Core::GetAliasCommand(const std::string &name, bool ignore_params) { std::lock_guard lock(alias_mutex); - if (IsAlias(name)) - return join_strings(" ", aliases[name]); - else - return default_; + if (!IsAlias(name) || aliases[name].empty()) + return name; + if (ignore_params) + return aliases[name][0]; + return join_strings(" ", aliases[name]); } ///////////////// diff --git a/library/include/Core.h b/library/include/Core.h index 6c99e62be..8232708b5 100644 --- a/library/include/Core.h +++ b/library/include/Core.h @@ -173,7 +173,7 @@ namespace DFHack bool RunAlias(color_ostream &out, const std::string &name, const std::vector ¶meters, command_result &result); std::map> ListAliases(); - std::string GetAliasCommand(const std::string &name, const std::string &default_ = ""); + std::string GetAliasCommand(const std::string &name, bool ignore_params = false); std::string getHackPath(); From a1c2df23c52e7784536fa31e65a222e0c33be33c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 23:55:54 -0700 Subject: [PATCH 144/439] fix vscode lint warning --- library/lua/dfhack.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua index 2ee03dfed..51d6a0dfb 100644 --- a/library/lua/dfhack.lua +++ b/library/lua/dfhack.lua @@ -770,7 +770,7 @@ function dfhack.run_script_with_env(envVars, name, flags, ...) elseif ((type(v.required) == 'boolean' and v.required) or (type(v.required) == 'function' and v.required(flags))) then if not script_flags[flag] then - local msg = v.error or 'Flag "' .. flag .. '" not recognized' + local msg = v.error or ('Flag "' .. flag .. '" not recognized') error(name .. ': ' .. msg) end end From df286ab71e92f81ad54636b991045bfbaafeea5c Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sat, 25 Mar 2023 10:18:06 -0500 Subject: [PATCH 145/439] reenable getplants --- docs/changelog.txt | 1 + plugins/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 11e552abe..bf833d19b 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins +- `getplants`: getplants is now available - `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. ## Fixes diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 8fac3d467..fde94b711 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -119,7 +119,7 @@ dfhack_plugin(filltraffic filltraffic.cpp) #dfhack_plugin(follow follow.cpp) #dfhack_plugin(forceequip forceequip.cpp) #dfhack_plugin(generated-creature-renamer generated-creature-renamer.cpp) -#dfhack_plugin(getplants getplants.cpp) +dfhack_plugin(getplants getplants.cpp) dfhack_plugin(hotkeys hotkeys.cpp LINK_LIBRARIES lua) #dfhack_plugin(infiniteSky infiniteSky.cpp) #dfhack_plugin(isoworldremote isoworldremote.cpp PROTOBUFS isoworldremote) From 9f5e4eeda17630f8597f952f7c38a177621e21f3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 23:55:54 -0700 Subject: [PATCH 146/439] fix vscode lint warning --- library/lua/dfhack.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua index 2ee03dfed..51d6a0dfb 100644 --- a/library/lua/dfhack.lua +++ b/library/lua/dfhack.lua @@ -770,7 +770,7 @@ function dfhack.run_script_with_env(envVars, name, flags, ...) elseif ((type(v.required) == 'boolean' and v.required) or (type(v.required) == 'function' and v.required(flags))) then if not script_flags[flag] then - local msg = v.error or 'Flag "' .. flag .. '" not recognized' + local msg = v.error or ('Flag "' .. flag .. '" not recognized') error(name .. ': ' .. msg) end end From 1c25c9b80cd732c5f562f6029da7124d1e47affa Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sat, 25 Mar 2023 12:25:45 -0500 Subject: [PATCH 147/439] autoclothing: support disable this also includes some minor refactorings: * some debug messages have been "tagged" so it's obvious they're from autoclothing * a serialized list of flag checks has been replaced with a maskcheck * partial lua api added, currently only supports enable/disable --- plugins/CMakeLists.txt | 2 +- plugins/autoclothing.cpp | 114 +++++++++++++++++++++++++++++---------- 2 files changed, 86 insertions(+), 30 deletions(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 8fac3d467..047bd2269 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -77,7 +77,7 @@ set_source_files_properties( Brushes.h PROPERTIES HEADER_FILE_ONLY TRUE ) #dfhack_plugin(add-spatter add-spatter.cpp) dfhack_plugin(autobutcher autobutcher.cpp LINK_LIBRARIES lua) dfhack_plugin(autochop autochop.cpp LINK_LIBRARIES lua) -dfhack_plugin(autoclothing autoclothing.cpp) +dfhack_plugin(autoclothing autoclothing.cpp LINK_LIBRARIES lua) dfhack_plugin(autodump autodump.cpp) dfhack_plugin(autofarm autofarm.cpp) #dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_static) diff --git a/plugins/autoclothing.cpp b/plugins/autoclothing.cpp index fc8b1e43b..aa114cb84 100644 --- a/plugins/autoclothing.cpp +++ b/plugins/autoclothing.cpp @@ -61,7 +61,25 @@ namespace DFHack { } static const string CONFIG_KEY = string(plugin_name) + "/config"; +enum ConfigValues { + CONFIG_IS_ENABLED = 0, +}; +//static int get_config_val(PersistentDataItem& c, int index) { +// if (!c.isValid()) +// return -1; +// return c.ival(index); +//} +//static bool get_config_bool(PersistentDataItem& c, int index) { +// return get_config_val(c, index) == 1; +//} +static void set_config_val(PersistentDataItem& c, int index, int value) { + if (c.isValid()) + c.ival(index) = value; +} +static void set_config_bool(PersistentDataItem& c, int index, bool value) { + set_config_val(c, index, value ? 1 : 0); +} // Here go all the command declarations... // mostly to allow having the mandatory stuff on top of the file and commands on the bottom @@ -250,6 +268,29 @@ DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_chan } +DFhackCExport command_result plugin_enable(color_ostream& out, bool enable) { + if (!Core::getInstance().isWorldLoaded()) { + out.printerr("Cannot enable %s without a loaded world.\n", plugin_name); + return CR_FAILURE; + } + + if (enable != autoclothing_enabled) { + auto enabled = World::GetPersistentData("autoclothing/enabled"); + autoclothing_enabled = enable; + DEBUG(report, out).print("%s from the API; persisting\n", + autoclothing_enabled ? "enabled" : "disabled"); + set_config_bool(enabled, CONFIG_IS_ENABLED, autoclothing_enabled); + if (enable) + do_autoclothing(); + } + else { + DEBUG(report, out).print("%s from the API, but already %s; no action\n", + autoclothing_enabled ? "enabled" : "disabled", + autoclothing_enabled ? "enabled" : "disabled"); + } + return CR_OK; +} + // Whatever you put here will be done in each game step. Don't abuse it. // It's optional, so you can just comment it out like this if you don't need it. @@ -389,6 +430,7 @@ command_result autoclothing(color_ostream &out, vector & parameters) if (parameters.size() == 0) { CoreSuspender suspend; + out << "Automatic clothing management is currently " << (autoclothing_enabled ? "enabled" : "disabled") << "." << endl; out << "Currently set " << clothingOrders.size() << " automatic clothing orders" << endl; for (size_t i = 0; i < clothingOrders.size(); i++) { @@ -523,7 +565,7 @@ static void find_needed_clothing_items() if (!item) { - WARN(cycle).print("Invalid inventory item ID: %d\n", ownedItem); + WARN(cycle).print("autoclothing: Invalid inventory item ID: %d\n", ownedItem); continue; } @@ -728,34 +770,28 @@ static void list_unit_counts(color_ostream& out, map& unitList) static bool isAvailableItem(df::item* item) { - if (item->flags.bits.in_job) - return false; - if (item->flags.bits.hostile) - return false; - if (item->flags.bits.in_building) - return false; - if (item->flags.bits.in_building) - return false; - if (item->flags.bits.encased) - return false; - if (item->flags.bits.foreign) - return false; - if (item->flags.bits.trader) - return false; - if (item->flags.bits.owned) - return false; - if (item->flags.bits.artifact) - return false; - if (item->flags.bits.forbid) - return false; - if (item->flags.bits.dump) - return false; - if (item->flags.bits.on_fire) - return false; - if (item->flags.bits.melt) - return false; - if (item->flags.bits.hidden) + static struct BadFlags { + uint32_t whole; + + BadFlags() { + df::item_flags flags; +#define F(x) flags.bits.x = true; + F(in_job); F(hostile); F(in_building); F(encased); + F(foreign); F(trader); F(owned); F(forbid); + F(dump); F(on_fire); F(melt); F(hidden); + + F(garbage_collect); F(rotten); F(construction); + F(in_chest); F(removed); F(spider_web); + + // F(artifact); -- TODO: should this be included? +#undef F + whole = flags.whole; + } + } badFlags; + + if ((item->flags.whole & badFlags.whole) != 0) return false; + if (item->getWear() > 1) return false; if (!item->isClothing()) @@ -782,7 +818,7 @@ static void generate_report(color_ostream& out) auto item = Items::findItemByID(itemId); if (!item) { - WARN(cycle,out).print("Invalid inventory item ID: %d\n", itemId); + WARN(cycle,out).print("autoclothing: Invalid inventory item ID: %d\n", itemId); continue; } if (item->getWear() >= 1) @@ -915,3 +951,23 @@ static void generate_report(color_ostream& out) } } + +///////////////////////////////////////////////////// +// Lua API +// TODO: implement Lua hooks to manipulate the persistent order configuration +// + +static void autoclothing_doCycle(color_ostream& out) { + DEBUG(report, out).print("entering autoclothing_doCycle\n"); + do_autoclothing(); +} + + +DFHACK_PLUGIN_LUA_FUNCTIONS{ + DFHACK_LUA_FUNCTION(autoclothing_doCycle), + DFHACK_LUA_END +}; + +DFHACK_PLUGIN_LUA_COMMANDS{ + DFHACK_LUA_END +}; From 2627820bfa3df3841d78e79f9895f166346d0041 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 22:34:09 -0700 Subject: [PATCH 148/439] untested -> unavailable --- docs/Tags.rst | 2 +- docs/changelog.txt | 1 + docs/plugins/3dveins.rst | 2 +- docs/plugins/add-spatter.rst | 2 +- docs/plugins/autogems.rst | 2 +- docs/plugins/autotrade.rst | 2 +- docs/plugins/building-hacks.rst | 2 +- docs/plugins/burrows.rst | 2 +- docs/plugins/changeitem.rst | 2 +- docs/plugins/channel-safely.rst | 2 +- docs/plugins/createitem.rst | 2 +- docs/plugins/deramp.rst | 2 +- docs/plugins/digFlood.rst | 2 +- docs/plugins/diggingInvaders.rst | 2 +- docs/plugins/dwarfmonitor.rst | 2 +- docs/plugins/dwarfvet.rst | 2 +- docs/plugins/embark-assistant.rst | 2 +- docs/plugins/embark-tools.rst | 2 +- docs/plugins/fix-unit-occupancy.rst | 2 +- docs/plugins/fixveins.rst | 2 +- docs/plugins/flows.rst | 2 +- docs/plugins/follow.rst | 2 +- docs/plugins/forceequip.rst | 2 +- docs/plugins/generated-creature-renamer.rst | 2 +- docs/plugins/getplants.rst | 2 +- docs/plugins/infiniteSky.rst | 2 +- docs/plugins/isoworldremote.rst | 2 +- docs/plugins/jobutils.rst | 2 +- docs/plugins/labormanager.rst | 2 +- docs/plugins/lair.rst | 2 +- docs/plugins/luasocket.rst | 2 +- docs/plugins/manipulator.rst | 2 +- docs/plugins/map-render.rst | 2 +- docs/plugins/mode.rst | 2 +- docs/plugins/mousequery.rst | 2 +- docs/plugins/petcapRemover.rst | 2 +- docs/plugins/plants.rst | 2 +- docs/plugins/power-meter.rst | 2 +- docs/plugins/prospector.rst | 2 +- docs/plugins/rename.rst | 2 +- docs/plugins/rendermax.rst | 2 +- docs/plugins/search.rst | 2 +- docs/plugins/siege-engine.rst | 2 +- docs/plugins/sort.rst | 2 +- docs/plugins/spectate.rst | 2 +- docs/plugins/steam-engine.rst | 2 +- docs/plugins/stockflow.rst | 2 +- docs/plugins/stocks.rst | 2 +- docs/plugins/title-folder.rst | 2 +- docs/plugins/title-version.rst | 2 +- docs/plugins/trackstop.rst | 2 +- docs/plugins/tubefill.rst | 2 +- docs/plugins/tweak.rst | 2 +- docs/plugins/workNow.rst | 2 +- docs/plugins/workflow.rst | 2 +- docs/plugins/zone.rst | 2 +- library/lua/dfhack.lua | 2 +- 57 files changed, 57 insertions(+), 56 deletions(-) diff --git a/docs/Tags.rst b/docs/Tags.rst index 60a6a6813..5ff13d632 100644 --- a/docs/Tags.rst +++ b/docs/Tags.rst @@ -49,4 +49,4 @@ for the tag assignment spreadsheet. "misc" tags ----------- -- `untested `: Tools that are not yet tested with the current release. +- `unavailable `: Tools that are not yet available for the current release. diff --git a/docs/changelog.txt b/docs/changelog.txt index 7cb1fafcf..032ca52ad 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -54,6 +54,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `enable`: can now interpret aliases defined with the `alias` command ## Documentation +- ``untested`` tag has been renamed to ``unavailable`` to better reflect the status of the remaining unavaialable tools. all of the simply "untested" tools have now been tested and marked as working. the remaining tools are known to need development work before they are available again. ## API diff --git a/docs/plugins/3dveins.rst b/docs/plugins/3dveins.rst index 1d7acd94f..3112934ab 100644 --- a/docs/plugins/3dveins.rst +++ b/docs/plugins/3dveins.rst @@ -3,7 +3,7 @@ .. dfhack-tool:: :summary: Rewrite layer veins to expand in 3D space. - :tags: untested fort gameplay map + :tags: unavailable fort gameplay map Existing, flat veins are removed and new 3D veins that naturally span z-levels are generated in their place. The transformation preserves the mineral counts diff --git a/docs/plugins/add-spatter.rst b/docs/plugins/add-spatter.rst index fc3c507c2..6914690ea 100644 --- a/docs/plugins/add-spatter.rst +++ b/docs/plugins/add-spatter.rst @@ -3,7 +3,7 @@ add-spatter .. dfhack-tool:: :summary: Make tagged reactions produce contaminants. - :tags: untested adventure fort gameplay items + :tags: unavailable adventure fort gameplay items :no-command: Give some use to all those poisons that can be bought from caravans! The plugin diff --git a/docs/plugins/autogems.rst b/docs/plugins/autogems.rst index f18b671a1..6135b39d2 100644 --- a/docs/plugins/autogems.rst +++ b/docs/plugins/autogems.rst @@ -3,7 +3,7 @@ autogems .. dfhack-tool:: :summary: Automatically cut rough gems. - :tags: untested fort auto workorders + :tags: unavailable fort auto workorders :no-command: .. dfhack-command:: autogems-reload diff --git a/docs/plugins/autotrade.rst b/docs/plugins/autotrade.rst index 439eead40..24c1b42fa 100644 --- a/docs/plugins/autotrade.rst +++ b/docs/plugins/autotrade.rst @@ -3,7 +3,7 @@ autotrade .. dfhack-tool:: :summary: Quickly designate items to be traded. - :tags: untested fort productivity items stockpiles + :tags: unavailable fort productivity items stockpiles :no-command: When `enabled `, this plugin adds an option to the :kbd:`q` menu for diff --git a/docs/plugins/building-hacks.rst b/docs/plugins/building-hacks.rst index cce3479d8..b45b23be4 100644 --- a/docs/plugins/building-hacks.rst +++ b/docs/plugins/building-hacks.rst @@ -3,7 +3,7 @@ building-hacks .. dfhack-tool:: :summary: Provides a Lua API for creating powered workshops. - :tags: untested fort gameplay buildings + :tags: unavailable fort gameplay buildings :no-command: See `building-hacks-api` for more details. diff --git a/docs/plugins/burrows.rst b/docs/plugins/burrows.rst index 54812ece5..299656cf5 100644 --- a/docs/plugins/burrows.rst +++ b/docs/plugins/burrows.rst @@ -3,7 +3,7 @@ burrows .. dfhack-tool:: :summary: Auto-expand burrows as you dig. - :tags: untested fort auto design productivity map units + :tags: unavailable fort auto design productivity map units :no-command: .. dfhack-command:: burrow diff --git a/docs/plugins/changeitem.rst b/docs/plugins/changeitem.rst index fe9229a09..788b49247 100644 --- a/docs/plugins/changeitem.rst +++ b/docs/plugins/changeitem.rst @@ -3,7 +3,7 @@ changeitem .. dfhack-tool:: :summary: Change item material or base quality. - :tags: untested adventure fort armok items + :tags: unavailable adventure fort armok items By default, a change is only allowed if the existing and desired item materials are of the same subtype (for example wood -> wood, stone -> stone, etc). But diff --git a/docs/plugins/channel-safely.rst b/docs/plugins/channel-safely.rst index 3acbe66cd..c24f352b0 100644 --- a/docs/plugins/channel-safely.rst +++ b/docs/plugins/channel-safely.rst @@ -3,7 +3,7 @@ channel-safely .. dfhack-tool:: :summary: Auto-manage channel designations to keep dwarves safe. - :tags: untested fort auto + :tags: unavailable fort auto Multi-level channel projects can be dangerous, and managing the safety of your dwarves throughout the completion of such projects can be difficult and time diff --git a/docs/plugins/createitem.rst b/docs/plugins/createitem.rst index 7abe06cff..b287042c7 100644 --- a/docs/plugins/createitem.rst +++ b/docs/plugins/createitem.rst @@ -3,7 +3,7 @@ createitem .. dfhack-tool:: :summary: Create arbitrary items. - :tags: untested adventure fort armok items + :tags: unavailable adventure fort armok items You can create new items of any type and made of any material. A unit must be selected in-game to use this command. By default, items created are spawned at diff --git a/docs/plugins/deramp.rst b/docs/plugins/deramp.rst index 641f370a6..4a1f34548 100644 --- a/docs/plugins/deramp.rst +++ b/docs/plugins/deramp.rst @@ -3,7 +3,7 @@ deramp .. dfhack-tool:: :summary: Removes all ramps designated for removal from the map. - :tags: untested fort armok map + :tags: unavailable fort armok map It also removes any "floating" down ramps that can remain after a cave-in. diff --git a/docs/plugins/digFlood.rst b/docs/plugins/digFlood.rst index 70dd9b388..ee502371a 100644 --- a/docs/plugins/digFlood.rst +++ b/docs/plugins/digFlood.rst @@ -3,7 +3,7 @@ digFlood .. dfhack-tool:: :summary: Digs out veins as they are discovered. - :tags: untested fort auto map + :tags: unavailable fort auto map Once you register specific vein types, this tool will automatically designate tiles of those types of veins for digging as your miners complete adjacent diff --git a/docs/plugins/diggingInvaders.rst b/docs/plugins/diggingInvaders.rst index 4ea52013e..001636709 100644 --- a/docs/plugins/diggingInvaders.rst +++ b/docs/plugins/diggingInvaders.rst @@ -3,7 +3,7 @@ diggingInvaders .. dfhack-tool:: :summary: Invaders dig and destroy to get to your dwarves. - :tags: untested fort gameplay military units + :tags: unavailable fort gameplay military units Usage ----- diff --git a/docs/plugins/dwarfmonitor.rst b/docs/plugins/dwarfmonitor.rst index 47d49d1e0..45a5d8f85 100644 --- a/docs/plugins/dwarfmonitor.rst +++ b/docs/plugins/dwarfmonitor.rst @@ -3,7 +3,7 @@ dwarfmonitor .. dfhack-tool:: :summary: Report on dwarf preferences and efficiency. - :tags: untested fort inspection jobs units + :tags: unavailable fort inspection jobs units It can also show heads-up display widgets with live fort statistics. diff --git a/docs/plugins/dwarfvet.rst b/docs/plugins/dwarfvet.rst index 7480c10a6..b4dfe0ada 100644 --- a/docs/plugins/dwarfvet.rst +++ b/docs/plugins/dwarfvet.rst @@ -3,7 +3,7 @@ dwarfvet .. dfhack-tool:: :summary: Allows animals to be treated at animal hospitals. - :tags: untested fort gameplay animals + :tags: unavailable fort gameplay animals Annoyed that your dragons become useless after a minor injury? Well, with dwarfvet, injured animals will be treated at an animal hospital, which is simply diff --git a/docs/plugins/embark-assistant.rst b/docs/plugins/embark-assistant.rst index bb74f221d..282d4b122 100644 --- a/docs/plugins/embark-assistant.rst +++ b/docs/plugins/embark-assistant.rst @@ -3,7 +3,7 @@ embark-assistant .. dfhack-tool:: :summary: Embark site selection support. - :tags: untested embark fort interface + :tags: unavailable embark fort interface Run this command while the pre-embark screen is displayed to show extended (and reasonably correct) resource information for the embark rectangle as well as diff --git a/docs/plugins/embark-tools.rst b/docs/plugins/embark-tools.rst index 6a600019b..f320706ff 100644 --- a/docs/plugins/embark-tools.rst +++ b/docs/plugins/embark-tools.rst @@ -3,7 +3,7 @@ embark-tools .. dfhack-tool:: :summary: Extend the embark screen functionality. - :tags: untested embark fort interface + Usage ----- diff --git a/docs/plugins/fix-unit-occupancy.rst b/docs/plugins/fix-unit-occupancy.rst index 8589f765a..6ba01b712 100644 --- a/docs/plugins/fix-unit-occupancy.rst +++ b/docs/plugins/fix-unit-occupancy.rst @@ -3,7 +3,7 @@ fix-unit-occupancy .. dfhack-tool:: :summary: Fix phantom unit occupancy issues. - :tags: untested fort bugfix map + :tags: unavailable fort bugfix map If you see "unit blocking tile" messages that you can't account for (:bug:`3499`), this tool can help. diff --git a/docs/plugins/fixveins.rst b/docs/plugins/fixveins.rst index c13bbe9a1..552c5f8c3 100644 --- a/docs/plugins/fixveins.rst +++ b/docs/plugins/fixveins.rst @@ -3,7 +3,7 @@ fixveins .. dfhack-tool:: :summary: Restore missing mineral inclusions. - :tags: untested fort bugfix map + :tags: unavailable fort bugfix map This tool can also remove invalid references to mineral inclusions if you broke your embark with tools like `tiletypes`. diff --git a/docs/plugins/flows.rst b/docs/plugins/flows.rst index 209bb577c..56840d999 100644 --- a/docs/plugins/flows.rst +++ b/docs/plugins/flows.rst @@ -3,7 +3,7 @@ flows .. dfhack-tool:: :summary: Counts map blocks with flowing liquids. - :tags: untested fort inspection map + :tags: unavailable fort inspection map If you suspect that your magma sea leaks into HFS, you can use this tool to be sure without revealing the map. diff --git a/docs/plugins/follow.rst b/docs/plugins/follow.rst index 47db40bd8..e72f79ce0 100644 --- a/docs/plugins/follow.rst +++ b/docs/plugins/follow.rst @@ -3,7 +3,7 @@ follow .. dfhack-tool:: :summary: Make the screen follow the selected unit. - :tags: untested fort interface units + :tags: unavailable fort interface units Once you exit from the current menu or cursor mode, the screen will stay centered on the unit. Handy for watching dwarves running around. Deactivated by diff --git a/docs/plugins/forceequip.rst b/docs/plugins/forceequip.rst index d4c9a6c4a..2565d12c3 100644 --- a/docs/plugins/forceequip.rst +++ b/docs/plugins/forceequip.rst @@ -3,7 +3,7 @@ forceequip .. dfhack-tool:: :summary: Move items into a unit's inventory. - :tags: untested adventure fort animals items military units + :tags: unavailable adventure fort animals items military units This tool is typically used to equip specific clothing/armor items onto a dwarf, but can also be used to put armor onto a war animal or to add unusual items diff --git a/docs/plugins/generated-creature-renamer.rst b/docs/plugins/generated-creature-renamer.rst index ba1761a1b..ea386eacf 100644 --- a/docs/plugins/generated-creature-renamer.rst +++ b/docs/plugins/generated-creature-renamer.rst @@ -3,7 +3,7 @@ generated-creature-renamer .. dfhack-tool:: :summary: Automatically renames generated creatures. - :tags: untested adventure fort legends units + :tags: unavailable adventure fort legends units :no-command: .. dfhack-command:: list-generated diff --git a/docs/plugins/getplants.rst b/docs/plugins/getplants.rst index 756fa1aaa..0a59f2492 100644 --- a/docs/plugins/getplants.rst +++ b/docs/plugins/getplants.rst @@ -3,7 +3,7 @@ getplants .. dfhack-tool:: :summary: Designate trees for chopping and shrubs for gathering. - :tags: untested fort productivity plants + :tags: unavailable fort productivity plants Specify the types of trees to cut down and/or shrubs to gather by their plant names. diff --git a/docs/plugins/infiniteSky.rst b/docs/plugins/infiniteSky.rst index 7e8ec2f31..789709c9f 100644 --- a/docs/plugins/infiniteSky.rst +++ b/docs/plugins/infiniteSky.rst @@ -3,7 +3,7 @@ infiniteSky .. dfhack-tool:: :summary: Automatically allocate new z-levels of sky - :tags: untested fort auto design map + :tags: unavailable fort auto design map If enabled, this plugin will automatically allocate new z-levels of sky at the top of the map as you build up. Or it can allocate one or many additional levels diff --git a/docs/plugins/isoworldremote.rst b/docs/plugins/isoworldremote.rst index 2442f70ef..b792cb649 100644 --- a/docs/plugins/isoworldremote.rst +++ b/docs/plugins/isoworldremote.rst @@ -3,7 +3,7 @@ isoworldremote .. dfhack-tool:: :summary: Provides a remote API used by Isoworld. - :tags: untested dev graphics + :tags: unavailable dev graphics :no-command: See `remote` for related remote APIs. diff --git a/docs/plugins/jobutils.rst b/docs/plugins/jobutils.rst index f68c200b2..674c6897a 100644 --- a/docs/plugins/jobutils.rst +++ b/docs/plugins/jobutils.rst @@ -5,7 +5,7 @@ jobutils .. dfhack-tool:: :summary: Provides commands for interacting with jobs. - :tags: untested fort inspection jobs + :tags: unavailable fort inspection jobs :no-command: .. dfhack-command:: job diff --git a/docs/plugins/labormanager.rst b/docs/plugins/labormanager.rst index f808fcb59..731f706b8 100644 --- a/docs/plugins/labormanager.rst +++ b/docs/plugins/labormanager.rst @@ -3,7 +3,7 @@ labormanager .. dfhack-tool:: :summary: Automatically manage dwarf labors. - :tags: untested fort auto labors + :tags: unavailable fort auto labors Labormanager is derived from `autolabor` but uses a completely different approach to assigning jobs to dwarves. While autolabor tries to keep as many diff --git a/docs/plugins/lair.rst b/docs/plugins/lair.rst index 77ad0a045..82c5e211c 100644 --- a/docs/plugins/lair.rst +++ b/docs/plugins/lair.rst @@ -3,7 +3,7 @@ lair .. dfhack-tool:: :summary: Mark the map as a monster lair. - :tags: untested fort armok map + :tags: unavailable fort armok map This avoids item scatter when the fortress is abandoned. diff --git a/docs/plugins/luasocket.rst b/docs/plugins/luasocket.rst index 69f566e24..1aa320ed7 100644 --- a/docs/plugins/luasocket.rst +++ b/docs/plugins/luasocket.rst @@ -3,7 +3,7 @@ luasocket .. dfhack-tool:: :summary: Provides a Lua API for accessing network sockets. - :tags: untested dev + :tags: unavailable dev :no-command: See `luasocket-api` for details. diff --git a/docs/plugins/manipulator.rst b/docs/plugins/manipulator.rst index b4c0d6160..734800e77 100644 --- a/docs/plugins/manipulator.rst +++ b/docs/plugins/manipulator.rst @@ -3,7 +3,7 @@ manipulator .. dfhack-tool:: :summary: An in-game labor management interface. - :tags: untested fort productivity labors + :tags: unavailable fort productivity labors :no-command: It is equivalent to the popular Dwarf Therapist utility. diff --git a/docs/plugins/map-render.rst b/docs/plugins/map-render.rst index bbd01aa97..4f3c6ba72 100644 --- a/docs/plugins/map-render.rst +++ b/docs/plugins/map-render.rst @@ -3,7 +3,7 @@ map-render .. dfhack-tool:: :summary: Provides a Lua API for re-rendering portions of the map. - :tags: untested dev graphics + :tags: unavailable dev graphics :no-command: See `map-render-api` for details. diff --git a/docs/plugins/mode.rst b/docs/plugins/mode.rst index 42c7f6fcc..061e3a548 100644 --- a/docs/plugins/mode.rst +++ b/docs/plugins/mode.rst @@ -3,7 +3,7 @@ mode .. dfhack-tool:: :summary: See and change the game mode. - :tags: untested armok dev gameplay + :tags: unavailable armok dev gameplay .. warning:: diff --git a/docs/plugins/mousequery.rst b/docs/plugins/mousequery.rst index 0e49d3924..bff110f0e 100644 --- a/docs/plugins/mousequery.rst +++ b/docs/plugins/mousequery.rst @@ -3,7 +3,7 @@ mousequery .. dfhack-tool:: :summary: Adds mouse controls to the DF interface. - :tags: untested fort productivity interface + :tags: unavailable fort productivity interface Adds mouse controls to the DF interface. For example, with ``mousequery`` you can click on buildings to configure them, hold the mouse button to draw dig diff --git a/docs/plugins/petcapRemover.rst b/docs/plugins/petcapRemover.rst index 798e39f32..4f6ea4160 100644 --- a/docs/plugins/petcapRemover.rst +++ b/docs/plugins/petcapRemover.rst @@ -3,7 +3,7 @@ petcapRemover .. dfhack-tool:: :summary: Modify the pet population cap. - :tags: untested fort auto animals + :tags: unavailable fort auto animals In vanilla DF, pets will not reproduce unless the population is below 50 and the number of children of that species is below a certain percentage. This plugin diff --git a/docs/plugins/plants.rst b/docs/plugins/plants.rst index cdcc0daac..281b295cf 100644 --- a/docs/plugins/plants.rst +++ b/docs/plugins/plants.rst @@ -5,7 +5,7 @@ plants .. dfhack-tool:: :summary: Provides commands that interact with plants. - :tags: untested adventure fort armok map plants + :tags: unavailable adventure fort armok map plants :no-command: .. dfhack-command:: plant diff --git a/docs/plugins/power-meter.rst b/docs/plugins/power-meter.rst index 8ffc79e3e..f3a76c60a 100644 --- a/docs/plugins/power-meter.rst +++ b/docs/plugins/power-meter.rst @@ -3,7 +3,7 @@ power-meter .. dfhack-tool:: :summary: Allow pressure plates to measure power. - :tags: untested fort gameplay buildings + :tags: unavailable fort gameplay buildings :no-command: If you run `gui/power-meter` while building a pressure plate, the pressure diff --git a/docs/plugins/prospector.rst b/docs/plugins/prospector.rst index 3fb47cc57..4628d11c8 100644 --- a/docs/plugins/prospector.rst +++ b/docs/plugins/prospector.rst @@ -5,7 +5,7 @@ prospector .. dfhack-tool:: :summary: Provides commands that help you analyze natural resources. - :tags: untested embark fort armok inspection map + :tags: embark fort armok inspection map :no-command: .. dfhack-command:: prospect diff --git a/docs/plugins/rename.rst b/docs/plugins/rename.rst index 3c6ed4a77..903a1a1d4 100644 --- a/docs/plugins/rename.rst +++ b/docs/plugins/rename.rst @@ -3,7 +3,7 @@ rename .. dfhack-tool:: :summary: Easily rename things. - :tags: untested adventure fort productivity buildings stockpiles units + :tags: unavailable adventure fort productivity buildings stockpiles units Use `gui/rename` for an in-game interface. diff --git a/docs/plugins/rendermax.rst b/docs/plugins/rendermax.rst index 370771d6b..91faa6f5c 100644 --- a/docs/plugins/rendermax.rst +++ b/docs/plugins/rendermax.rst @@ -3,7 +3,7 @@ rendermax .. dfhack-tool:: :summary: Modify the map lighting. - :tags: untested adventure fort gameplay graphics + :tags: unavailable adventure fort gameplay graphics This plugin provides a collection of OpenGL lighting filters that affect how the map is drawn to the screen. diff --git a/docs/plugins/search.rst b/docs/plugins/search.rst index 8e1a93143..c1493f992 100644 --- a/docs/plugins/search.rst +++ b/docs/plugins/search.rst @@ -5,7 +5,7 @@ search .. dfhack-tool:: :summary: Adds search capabilities to the UI. - :tags: untested fort productivity interface + :tags: unavailable fort productivity interface :no-command: Search options are added to the Stocks, Animals, Trading, Stockpile, Noble diff --git a/docs/plugins/siege-engine.rst b/docs/plugins/siege-engine.rst index fa18dcd48..57693fa11 100644 --- a/docs/plugins/siege-engine.rst +++ b/docs/plugins/siege-engine.rst @@ -3,7 +3,7 @@ siege-engine .. dfhack-tool:: :summary: Extend the functionality and usability of siege engines. - :tags: untested fort gameplay buildings + :tags: unavailable fort gameplay buildings :no-command: Siege engines in DF haven't been updated since the game was 2D, and can only aim diff --git a/docs/plugins/sort.rst b/docs/plugins/sort.rst index 3a8c7c0f5..067e188fd 100644 --- a/docs/plugins/sort.rst +++ b/docs/plugins/sort.rst @@ -3,7 +3,7 @@ sort .. dfhack-tool:: :summary: Sort lists shown in the DF interface. - :tags: untested fort productivity interface + :tags: unavailable fort productivity interface :no-command: .. dfhack-command:: sort-items diff --git a/docs/plugins/spectate.rst b/docs/plugins/spectate.rst index 448369cd8..95ce852ae 100644 --- a/docs/plugins/spectate.rst +++ b/docs/plugins/spectate.rst @@ -3,7 +3,7 @@ spectate .. dfhack-tool:: :summary: Automatically follow productive dwarves. - :tags: untested fort interface + :tags: unavailable fort interface Usage ----- diff --git a/docs/plugins/steam-engine.rst b/docs/plugins/steam-engine.rst index 11d0145f3..532b311d0 100644 --- a/docs/plugins/steam-engine.rst +++ b/docs/plugins/steam-engine.rst @@ -3,7 +3,7 @@ steam-engine .. dfhack-tool:: :summary: Allow modded steam engine buildings to function. - :tags: untested fort gameplay buildings + :tags: unavailable fort gameplay buildings :no-command: The steam-engine plugin detects custom workshops with the string diff --git a/docs/plugins/stockflow.rst b/docs/plugins/stockflow.rst index f501fc904..29b7838fc 100644 --- a/docs/plugins/stockflow.rst +++ b/docs/plugins/stockflow.rst @@ -3,7 +3,7 @@ stockflow .. dfhack-tool:: :summary: Queue manager jobs based on free space in stockpiles. - :tags: untested fort auto stockpiles workorders + :tags: unavailable fort auto stockpiles workorders With this plugin, the fortress bookkeeper can tally up free space in specific stockpiles and queue jobs through the manager to produce items to fill the free diff --git a/docs/plugins/stocks.rst b/docs/plugins/stocks.rst index c924b748c..f8db4ee67 100644 --- a/docs/plugins/stocks.rst +++ b/docs/plugins/stocks.rst @@ -3,7 +3,7 @@ stocks .. dfhack-tool:: :summary: Enhanced fortress stock management interface. - :tags: untested fort productivity items + :tags: unavailable fort productivity items When the plugin is enabled, two new hotkeys become available: diff --git a/docs/plugins/title-folder.rst b/docs/plugins/title-folder.rst index 32818071b..ee4068547 100644 --- a/docs/plugins/title-folder.rst +++ b/docs/plugins/title-folder.rst @@ -3,7 +3,7 @@ title-folder .. dfhack-tool:: :summary: Displays the DF folder name in the window title bar. - :tags: untested interface + :tags: unavailable interface :no-command: Usage diff --git a/docs/plugins/title-version.rst b/docs/plugins/title-version.rst index 18c7c3ba8..4d0ef0c0b 100644 --- a/docs/plugins/title-version.rst +++ b/docs/plugins/title-version.rst @@ -3,7 +3,7 @@ title-version .. dfhack-tool:: :summary: Displays the DFHack version on DF's title screen. - :tags: untested interface + :tags: unavailable interface :no-command: Usage diff --git a/docs/plugins/trackstop.rst b/docs/plugins/trackstop.rst index 6ae23dcd0..041bcac2c 100644 --- a/docs/plugins/trackstop.rst +++ b/docs/plugins/trackstop.rst @@ -3,7 +3,7 @@ trackstop .. dfhack-tool:: :summary: Add dynamic configuration options for track stops. - :tags: untested fort gameplay buildings + :tags: unavailable fort gameplay buildings :no-command: When enabled, this plugin adds a :kbd:`q` menu for track stops, which is diff --git a/docs/plugins/tubefill.rst b/docs/plugins/tubefill.rst index eb568ef03..a8684c765 100644 --- a/docs/plugins/tubefill.rst +++ b/docs/plugins/tubefill.rst @@ -3,7 +3,7 @@ tubefill .. dfhack-tool:: :summary: Replenishes mined-out adamantine. - :tags: untested fort armok map + :tags: unavailable fort armok map Veins that were originally hollow will be left alone. diff --git a/docs/plugins/tweak.rst b/docs/plugins/tweak.rst index dc5ed19a8..f9467e333 100644 --- a/docs/plugins/tweak.rst +++ b/docs/plugins/tweak.rst @@ -3,7 +3,7 @@ tweak .. dfhack-tool:: :summary: A collection of tweaks and bugfixes. - :tags: untested adventure fort armok bugfix fps interface + :tags: unavailable adventure fort armok bugfix fps interface Usage ----- diff --git a/docs/plugins/workNow.rst b/docs/plugins/workNow.rst index 66bc822ae..cec39c667 100644 --- a/docs/plugins/workNow.rst +++ b/docs/plugins/workNow.rst @@ -3,7 +3,7 @@ workNow .. dfhack-tool:: :summary: Reduce the time that dwarves idle after completing a job. - :tags: untested fort auto labors + :tags: unavailable fort auto labors After finishing a job, dwarves will wander away for a while before picking up a new job. This plugin will automatically poke the game to assign dwarves to new diff --git a/docs/plugins/workflow.rst b/docs/plugins/workflow.rst index 72b7a8e2b..c95054c0e 100644 --- a/docs/plugins/workflow.rst +++ b/docs/plugins/workflow.rst @@ -3,7 +3,7 @@ workflow .. dfhack-tool:: :summary: Manage automated item production rules. - :tags: untested fort auto jobs + :tags: unavailable fort auto jobs Manage repeat jobs according to stock levels. `gui/workflow` provides a simple front-end integrated in the game UI. diff --git a/docs/plugins/zone.rst b/docs/plugins/zone.rst index 9d9991dde..af6ee2b5f 100644 --- a/docs/plugins/zone.rst +++ b/docs/plugins/zone.rst @@ -3,7 +3,7 @@ zone .. dfhack-tool:: :summary: Manage activity zones, cages, and the animals therein. - :tags: untested fort productivity animals buildings + :tags: unavailable fort productivity animals buildings Usage ----- diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua index 51d6a0dfb..aa33b62d6 100644 --- a/library/lua/dfhack.lua +++ b/library/lua/dfhack.lua @@ -702,7 +702,7 @@ local warned_scripts = {} function dfhack.run_script(name,...) if not warned_scripts[name] then local helpdb = require('helpdb') - if helpdb.is_entry(name) and helpdb.get_entry_tags(name).untested then + if helpdb.is_entry(name) and helpdb.get_entry_tags(name).unavailable then warned_scripts[name] = true dfhack.printerr(('UNTESTED WARNING: the "%s" script has not been validated to work well with this version of DF.'):format(name)) dfhack.printerr('It may not work as expected, or it may corrupt your game.') From 5cfa968b38f9f0834a7b7a127ef70f183fdbadf3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 25 Mar 2023 12:35:16 -0700 Subject: [PATCH 149/439] update scripts ref --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 0b37dcf99..f637dc4bf 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 0b37dcf996bf4b64423d2acb3e3ca224ad76c6bc +Subproject commit f637dc4bf18a7ca4968f45e79790893c6d22c3f5 From c8c004067803e74f9508e58d0e3c51eeb93bdd6e Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sat, 25 Mar 2023 14:56:04 -0500 Subject: [PATCH 150/439] tailor: add inventory sanity check debug mode enable with "tailor debugging on" disable with "tailor debugging off" this setting is not persisted --- plugins/lua/tailor.lua | 7 +++++ plugins/tailor.cpp | 58 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/plugins/lua/tailor.lua b/plugins/lua/tailor.lua index e9a88bfe1..46b3526d9 100644 --- a/plugins/lua/tailor.lua +++ b/plugins/lua/tailor.lua @@ -32,6 +32,11 @@ function setMaterials(names) idxs.adamantine or -1) end +function setDebugMode(opt) + local fl = (opt[1] == "true" or opt[1] == "on") + tailor_setDebugFlag(fl) +end + function parse_commandline(...) local args, opts = {...}, {} local positionals = process_args(opts, args) @@ -47,6 +52,8 @@ function parse_commandline(...) tailor_doCycle() elseif command == 'materials' then setMaterials(positionals) + elseif command == 'debugging' then + setDebugMode(positionals) else return false end diff --git a/plugins/tailor.cpp b/plugins/tailor.cpp index 2c5a1a027..3ba6744bb 100644 --- a/plugins/tailor.cpp +++ b/plugins/tailor.cpp @@ -157,7 +157,14 @@ private: int default_reserve = 10; + bool inventory_sanity_checking = false; + public: + void set_debug_flag(bool f) + { + inventory_sanity_checking = f; + } + void reset() { available.clear(); @@ -170,16 +177,42 @@ public: void scan_clothing() { - for (auto i : world->items.other[df::items_other_id::ANY_GENERIC37]) // GENERIC37 is "clothing" + if (!inventory_sanity_checking) { - if (i->flags.whole & badFlags.whole) - continue; - if (i->getWear() >= 1) - continue; - df::item_type t = i->getType(); - int size = world->raws.creatures.all[i->getMakerRace()]->adultsize; + for (auto i : world->items.other[df::items_other_id::ANY_GENERIC37]) // GENERIC37 is "clothing" + { + if (i->flags.whole & badFlags.whole) + continue; + if (i->getWear() >= 1) + continue; + df::item_type t = i->getType(); + int size = world->raws.creatures.all[i->getMakerRace()]->adultsize; + + available[std::make_pair(t, size)] += 1; + } + } + else + { + auto& l = world->items.other[df::items_other_id::ANY_GENERIC37]; + + for (auto i : world->items.other[df::items_other_id::IN_PLAY]) + { + if (i->flags.whole & badFlags.whole) + continue; + if (!i->isClothing()) + continue; + if (std::find(std::begin(l), std::end(l), i) == std::end(l)) + { + DEBUG(cycle).print("tailor: clothing item %d missing from GENERIC37 list\n", i->id); + } + if (i->getWear() >= 1) + continue; + df::item_type t = i->getType(); + int size = world->raws.creatures.all[i->getMakerRace()]->adultsize; + + available[std::make_pair(t, size)] += 1; + } - available[std::make_pair(t, size)] += 1; } } @@ -748,9 +781,18 @@ static int tailor_getMaterialPreferences(lua_State *L) { return 1; } +static void tailor_setDebugFlag(color_ostream& out, bool enable) +{ + DEBUG(config, out).print("entering tailor_setDebugFlag\n"); + + tailor_instance->set_debug_flag(enable); + +} + DFHACK_PLUGIN_LUA_FUNCTIONS { DFHACK_LUA_FUNCTION(tailor_doCycle), DFHACK_LUA_FUNCTION(tailor_setMaterialPreferences), + DFHACK_LUA_FUNCTION(tailor_setDebugFlag), DFHACK_LUA_END }; From 76bacee2382298c857afc3c3cca093900dceef7f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 02:07:59 -0800 Subject: [PATCH 151/439] dynamically add mod scripts to the script path --- docs/changelog.txt | 1 + library/Core.cpp | 101 +++++++++++++++++++++++++++++++++++------ library/include/Core.h | 3 +- 3 files changed, 91 insertions(+), 14 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index d70b7882c..f968d79ac 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -55,6 +55,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `automelt`: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed) - `orders`: add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen - `enable`: can now interpret aliases defined with the `alias` command +- scripts in installed mods are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod's folder: ``scripts_modinstalled/`` and ``scripts_modactive/``. ``scripts_modinstalled/`` folders will always be added the script path, regardless of whether the mod is active in a world. ``scripts_modactive/`` folders will only be added to the script path when the mod is active in the current loaded world. ## Documentation - ``untested`` tag has been renamed to ``unavailable`` to better reflect the status of the remaining unavaialable tools. all of the simply "untested" tools have now been tested and marked as working. the remaining tools are known to need development work before they are available again. diff --git a/library/Core.cpp b/library/Core.cpp index d55959ceb..1bca0f5ed 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -105,6 +105,7 @@ DBG_DECLARE(core,script,DebugCategory::LINFO); static const std::string CONFIG_PATH = "dfhack-config/"; static const std::string CONFIG_DEFAULTS_PATH = "hack/data/dfhack-config-defaults/"; +static const std::string MOD_PATH = "data/installed_mods/"; class MainThread { public: @@ -440,6 +441,12 @@ bool Core::addScriptPath(std::string path, bool search_before) return true; } +bool Core::setModScriptPaths(const std::vector &mod_script_paths) { + std::lock_guard lock(script_path_mutex); + script_paths[2] = mod_script_paths; + return true; +} + bool Core::removeScriptPath(std::string path) { std::lock_guard lock(script_path_mutex); @@ -464,20 +471,21 @@ void Core::getScriptPaths(std::vector *dest) std::lock_guard lock(script_path_mutex); dest->clear(); std::string df_path = this->p->getPath() + "/"; - for (auto it = script_paths[0].begin(); it != script_paths[0].end(); ++it) - dest->push_back(*it); + for (auto & path : script_paths[0]) + dest->emplace_back(path); dest->push_back(df_path + CONFIG_PATH + "scripts"); if (df::global::world && isWorldLoaded()) { std::string save = World::ReadWorldFolder(); if (save.size()) - dest->push_back(df_path + "/save/" + save + "/scripts"); + dest->emplace_back(df_path + "save/" + save + "/scripts"); } - dest->push_back(df_path + "/hack/scripts"); - for (auto it = script_paths[1].begin(); it != script_paths[1].end(); ++it) - dest->push_back(*it); + dest->emplace_back(df_path + "hack/scripts"); + for (auto & path : script_paths[2]) + dest->emplace_back(path); + for (auto & path : script_paths[1]) + dest->emplace_back(path); } - std::string Core::findScript(std::string name) { std::vector paths; @@ -526,6 +534,61 @@ bool loadScriptPaths(color_ostream &out, bool silent = false) return true; } +bool loadModScriptPaths(color_ostream &out) { + std::map files; + Filesystem::listdir_recursive(MOD_PATH, files, 0); + + DEBUG(script,out).print("found %zd installed mods\n", files.size()); + if (!files.size()) + return true; + + for (auto & entry : files) { + DEBUG(script,out).print(" %s\n", entry.first.c_str()); + } + + std::vector mod_paths; + if (Core::getInstance().isWorldLoaded()) { + DEBUG(script,out).print("active load order:\n"); + for (auto & path : df::global::world->object_loader.object_load_order_src_dir) { + DEBUG(script,out).print(" %s\n", path->c_str()); + if (0 == path->find(MOD_PATH)) + mod_paths.emplace_back(*path); + } + } + + std::vector mod_script_paths; + for (auto pathit = mod_paths.rbegin(); pathit != mod_paths.rend(); ++pathit) { + std::string active_path = *pathit + "scripts_modactive"; + std::string installed_path = *pathit + "scripts_modinstalled"; + DEBUG(script,out).print("checking active path: %s\n", pathit->c_str()); + if (Filesystem::isdir(active_path)) + mod_script_paths.emplace_back(active_path); + if (Filesystem::isdir(installed_path)) + mod_script_paths.emplace_back(installed_path); + std::string slashless = *pathit; + slashless.resize(slashless.size()-1); + if (0 == files.erase(slashless)) + WARN(script,out).print("script path not found: '%s'\n", pathit->c_str()); + } + + for (auto & entry : files) { + if (!entry.second) + continue; + DEBUG(script,out).print("checking inactive path: %s\n", entry.first.c_str()); + std::string installed_path = entry.first + "/scripts_modinstalled"; + if (Filesystem::isdir(installed_path)) + mod_script_paths.emplace_back(installed_path); + } + + DEBUG(script,out).print("final mod script paths:\n"); + for (auto & path : mod_script_paths) + DEBUG(script,out).print(" %s\n", path.c_str()); + + Core::getInstance().setModScriptPaths(mod_script_paths); + + return true; +} + static std::map state_change_event_map; static void sc_event_map_init() { if (!state_change_event_map.size()) @@ -2113,14 +2176,22 @@ void Core::onStateChange(color_ostream &out, state_change_event event) switch (event) { case SC_CORE_INITIALIZED: - { - auto L = Lua::Core::State; - Lua::StackUnwinder top(L); - Lua::CallLuaModuleFunction(con, L, "helpdb", "refresh"); - Lua::CallLuaModuleFunction(con, L, "script-manager", "reload"); - } + { + loadModScriptPaths(out); + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); + Lua::CallLuaModuleFunction(con, L, "helpdb", "refresh"); + Lua::CallLuaModuleFunction(con, L, "script-manager", "reload"); break; + } case SC_WORLD_LOADED: + { + loadModScriptPaths(out); + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); + Lua::CallLuaModuleFunction(con, L, "script-manager", "reload"); + // fallthrough + } case SC_WORLD_UNLOADED: case SC_MAP_LOADED: case SC_MAP_UNLOADED: @@ -2185,6 +2256,10 @@ void Core::onStateChange(color_ostream &out, state_change_event event) if (event == SC_WORLD_UNLOADED) { Persistence::Internal::clear(); + loadModScriptPaths(out); + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); + Lua::CallLuaModuleFunction(con, L, "script-manager", "reload"); } } diff --git a/library/include/Core.h b/library/include/Core.h index 8232708b5..2e022d6ca 100644 --- a/library/include/Core.h +++ b/library/include/Core.h @@ -158,6 +158,7 @@ namespace DFHack bool loadScriptFile(color_ostream &out, std::string fname, bool silent = false); bool addScriptPath(std::string path, bool search_before = false); + bool setModScriptPaths(const std::vector &mod_script_paths); bool removeScriptPath(std::string path); std::string findScript(std::string name); void getScriptPaths(std::vector *dest); @@ -239,7 +240,7 @@ namespace DFHack std::vector> allModules; DFHack::PluginManager * plug_mgr; - std::vector script_paths[2]; + std::vector script_paths[3]; std::mutex script_path_mutex; // hotkey-related stuff From e7f8fbb235eefdd7806befabaafefb9cd4fea991 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 08:53:29 -0800 Subject: [PATCH 152/439] apparaently the macro expansion has an ambiguous else --- library/Core.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/Core.cpp b/library/Core.cpp index 1bca0f5ed..b5337b827 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -567,8 +567,9 @@ bool loadModScriptPaths(color_ostream &out) { mod_script_paths.emplace_back(installed_path); std::string slashless = *pathit; slashless.resize(slashless.size()-1); - if (0 == files.erase(slashless)) + if (0 == files.erase(slashless)) { WARN(script,out).print("script path not found: '%s'\n", pathit->c_str()); + } } for (auto & entry : files) { From 42b18d001bca119b44328fe70c52e2c60135307d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 11 Mar 2023 12:51:46 -0800 Subject: [PATCH 153/439] refresh overlay and helpdb on new world to pick up mod content --- library/lua/helpdb.lua | 10 ++++++++++ plugins/lua/overlay.lua | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/library/lua/helpdb.lua b/library/lua/helpdb.lua index df5482aec..a7ac6226f 100644 --- a/library/lua/helpdb.lua +++ b/library/lua/helpdb.lua @@ -12,6 +12,8 @@ local TAG_DEFINITIONS = 'hack/docs/docs/Tags.txt' local SCRIPT_DOC_BEGIN = '[====[' local SCRIPT_DOC_END = ']====]' +local GLOBAL_KEY = 'HELPDB' + -- enums local ENTRY_TYPES = { BUILTIN='builtin', @@ -423,6 +425,14 @@ function refresh() ensure_db() end +dfhack.onStateChange[GLOBAL_KEY] = function(sc) + if sc ~= SC_WORLD_LOADED then + return + end + -- pick up widgets from active mods + refresh() +end + local function parse_blocks(text) local blocks = {} for line in text:gmatch('[^\n]*') do diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index 3d476bf0d..ff8bf7c98 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -8,6 +8,7 @@ local widgets = require('gui.widgets') local OVERLAY_CONFIG_FILE = 'dfhack-config/overlay.json' local OVERLAY_WIDGETS_VAR = 'OVERLAY_WIDGETS' +local GLOBAL_KEY = 'OVERLAY' local DEFAULT_X_POS, DEFAULT_Y_POS = -2, -2 @@ -311,6 +312,14 @@ function reload() reposition_widgets() end +dfhack.onStateChange[GLOBAL_KEY] = function(sc) + if sc ~= SC_WORLD_LOADED then + return + end + -- pick up widgets from active mods + reload() +end + local function dump_widget_config(name, widget) local pos = overlay_config[name].pos print(('widget %s is positioned at x=%d, y=%d'):format(name, pos.x, pos.y)) From c3946247d689d9c13e1001f45798bd5a21ab074f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 12 Mar 2023 17:05:54 -0700 Subject: [PATCH 154/439] update docs for Core --- docs/Core.rst | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/Core.rst b/docs/Core.rst index 86e357b27..56597e9f2 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -235,10 +235,41 @@ root DF folder): #. :file:`dfhack-config/scripts` #. :file:`save/{world}/scripts` (only if a save is loaded) #. :file:`hack/scripts` +#. :file:`data/installed_mods/...` (see below) For example, if ``teleport`` is run, these folders are searched in order for ``teleport.lua``, and the first matching file is run. +Scripts in installed mods +......................... + +Script directories in installed mods are automatically added to the script path +according to the following rules: + +**If a world is not loaded**, then directories matching the pattern +``data/installed_mods/*/scripts_modinstalled/`` are added to the script path +in alphabetical order of the mod name. + +**If a world is loaded**, then the ``scripts_modactive`` directories of active +mods are also added to the script path according to the active mod load order, +and scripts in active mods take precedence over scripts in +``scripts_modinstalled`` in non-active mods. For example, the search paths for +mods might look like this:: + + activemod1/scripts_modactive + activemod1/scripts_modinstalled + activemod2/scripts_modactive + activemod2/scripts_modinstalled + inactivemod1/scripts_modinstalled + inactivemod2/scripts_modinstalled + +Not all mods will have script directories, of course, and those mods will not be +added to the script search path. Mods are re-scanned whenever a world is loaded +or unloaded. + +Custom script paths +................... + Script paths can be added by modifying :file:`dfhack-config/script-paths.txt`. Each line should start with one of these characters: From 57d6cab10fef346c2faeeac7a1fac5c57ad13fb9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 12 Mar 2023 17:14:02 -0700 Subject: [PATCH 155/439] wording --- docs/Core.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/Core.rst b/docs/Core.rst index 56597e9f2..b6cdb2066 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -248,7 +248,7 @@ according to the following rules: **If a world is not loaded**, then directories matching the pattern ``data/installed_mods/*/scripts_modinstalled/`` are added to the script path -in alphabetical order of the mod name. +in alphabetical order. **If a world is loaded**, then the ``scripts_modactive`` directories of active mods are also added to the script path according to the active mod load order, @@ -256,12 +256,14 @@ and scripts in active mods take precedence over scripts in ``scripts_modinstalled`` in non-active mods. For example, the search paths for mods might look like this:: - activemod1/scripts_modactive - activemod1/scripts_modinstalled - activemod2/scripts_modactive - activemod2/scripts_modinstalled + activemod_last_in_load_order/scripts_modactive + activemod_last_in_load_order/scripts_modinstalled + activemod_second_to_last_in_load_order/scripts_modactive + activemod_second_to_last_in_load_order/scripts_modinstalled + ... inactivemod1/scripts_modinstalled inactivemod2/scripts_modinstalled + ... Not all mods will have script directories, of course, and those mods will not be added to the script search path. Mods are re-scanned whenever a world is loaded From de576b558615a87d00245ce20dc4f87804273551 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Mar 2023 21:11:18 -0700 Subject: [PATCH 156/439] start updating modding guide --- docs/guides/modding-guide.rst | 70 ++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index 73d9407d6..43e066105 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -8,29 +8,73 @@ DFHack modding guide What is the difference between a script and a mod? -------------------------------------------------- -A script is a single file that can be run as a command in DFHack, like something -that modifies or displays game data on request. A mod is something you install -to get persistent behavioural changes in the game and/or add new content. Mods -can contain and use scripts in addition to (or instead of) modifications to the -DF game raws. - -DFHack scripts are written in Lua. If you don't already know Lua, there's a -great primer at `lua.org `__. +Well, sometimes there is no difference. A mod is anything you add to the game, +which can be graphics overrides, content in the raws, DFHack scripts, or both. +There are already resources out there for +`raws modding `__, so this +guide will focus more on scripts, both standalone and as an extension to +raws-based mods. A DFHack script is a Lua file that can be run as a command in +DFHack. Scripts can do pretty much anything, from displaying information to +enforcing new game mechanics. + +If you don't already know Lua, there's a great primer at +`lua.org `__. Why not just mod the raws? -------------------------- It depends on what you want to do. Some mods *are* better to do in just the -raws. You don't need DFHack to add a new race or modify attributes, for example. -However, DFHack scripts can do many things that you just can't do in the raws, -like make a creature that trails smoke. Some things *could* be done in the raws, -but writing a script is less hacky, easier to maintain, easier to extend, and is +raws. You don't need DFHack to add a new race or modify attributes. However, +DFHack scripts can do many things that you just can't do in the raws, like make +a creature that trails smoke. Some things *could* be done in the raws, but +writing a script is less hacky, easier to maintain, easier to extend, and is not prone to side-effects. A great example is adding a syndrome when a reaction is performed. If done in the raws, you have to create an exploding boulder to apply the syndrome. DFHack scripts can add the syndrome directly and with much more flexibility. In the end, complex mods will likely require a mix of raw modding and DFHack scripting. +The structure of a mod +---------------------- + +For reference, `Tachy Guns `__ is a +full mod that conforms to this guide. + +Create a folder for mod projects somewhere outside your Dwarf Fortress +installation directory (e.g. ``/path/to/mymods/``) and use your mod IDs as the +names for the mod folders within it. In the example below, we'll use a mod ID of +``example-mod``. I'm sure your mods will have more creative names! The +``example-mod`` mod will be developed in the ``/path/to/mymods/example-mod/`` +directory and has a basic structure that looks like this:: + + init.d/example-mod.lua + raw/objects/... + raw/scripts/example-mod.lua + raw/scripts/example-mod/... + README.md + +Let's go through that line by line. + +* A short (one-line) script in ``init.d/`` to initialise your + mod when a save is loaded. +* Modifications to the game raws (potentially with custom raw tokens) go in + ``raw/objects/``. +* A control script in ``scripts/`` that handles enabling and disabling your + mod. +* A subfolder for your mod under ``scripts/`` will contain all the internal + scripts and/or modules used by your mod. + +It is a good idea to use a version control system to organize changes to your +mod code. You can create a separate Git repository for each of your mods. The +``README.md`` file will be your mod help text when people browse to your online +repository. + +Unless you want to install your ``raw/`` folder into your DF game folder every +time you make a change to your scripts, you should add your development scripts +directory to your script paths in ``dfhack-config/script-paths.txt``:: + + +/path/to/mymods/example-mod/scripts/ + A mod-maker's development environment ------------------------------------- @@ -54,7 +98,7 @@ Then that directory will be searched when you run DFHack commands from inside the game. The ``+`` at the front of the path means to search that directory first, before any other script directory (like :file:`hack/scripts` or :file:`raw/scripts`). That way, your latest changes will always be used instead -of older copies that you may have installed in a DF directory. +of older copies that you may have in mods installed in the DF directory. For scripts with the same name, the `order of precedence ` will be: From e4579a4aa13f6da015b4e5eb7d1a04ee0f4996d4 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 18:42:42 -0700 Subject: [PATCH 157/439] update modding guide --- docs/Core.rst | 3 +- docs/guides/modding-guide.rst | 309 ++++++++++++++++++---------------- 2 files changed, 162 insertions(+), 150 deletions(-) diff --git a/docs/Core.rst b/docs/Core.rst index b6cdb2066..c06a413da 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -267,7 +267,8 @@ mods might look like this:: Not all mods will have script directories, of course, and those mods will not be added to the script search path. Mods are re-scanned whenever a world is loaded -or unloaded. +or unloaded. For more information on scripts and mods, check out the +`modding-guide`. Custom script paths ................... diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index 43e066105..73758db6f 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -9,16 +9,16 @@ What is the difference between a script and a mod? -------------------------------------------------- Well, sometimes there is no difference. A mod is anything you add to the game, -which can be graphics overrides, content in the raws, DFHack scripts, or both. -There are already resources out there for +which can be graphics overrides, content in the raws, DFHack scripts, any, or +all. There are already resources out there for `raws modding `__, so this guide will focus more on scripts, both standalone and as an extension to -raws-based mods. A DFHack script is a Lua file that can be run as a command in -DFHack. Scripts can do pretty much anything, from displaying information to -enforcing new game mechanics. +raws-based mods. -If you don't already know Lua, there's a great primer at -`lua.org `__. +A DFHack script is a Lua file that can be run as a command in +DFHack. Scripts can do pretty much anything, from displaying information to +enforcing new game mechanics. If you don't already know Lua, there's a great +primer at `lua.org `__. Why not just mod the raws? -------------------------- @@ -26,13 +26,14 @@ Why not just mod the raws? It depends on what you want to do. Some mods *are* better to do in just the raws. You don't need DFHack to add a new race or modify attributes. However, DFHack scripts can do many things that you just can't do in the raws, like make -a creature that trails smoke. Some things *could* be done in the raws, but -writing a script is less hacky, easier to maintain, easier to extend, and is -not prone to side-effects. A great example is adding a syndrome when a reaction -is performed. If done in the raws, you have to create an exploding boulder to -apply the syndrome. DFHack scripts can add the syndrome directly and with much -more flexibility. In the end, complex mods will likely require a mix of raw -modding and DFHack scripting. +a creature that trails smoke or launch a unit into the air when they are hit +with a certain type of projectile. Some things *could* be done in the raws, but +a script is better (e.g. easier to maintain, easier to extend, and/or not prone +to side-effects). A great example is adding a syndrome when a reaction +is performed. If done in the raws, you have to create an exploding boulder as +an intermediary to apply the syndrome. DFHack scripts can add the syndrome +directly and with much more flexibility. In the end, complex mods will likely +require a mix of raw modding and DFHack scripting. The structure of a mod ---------------------- @@ -40,82 +41,102 @@ The structure of a mod For reference, `Tachy Guns `__ is a full mod that conforms to this guide. -Create a folder for mod projects somewhere outside your Dwarf Fortress -installation directory (e.g. ``/path/to/mymods/``) and use your mod IDs as the -names for the mod folders within it. In the example below, we'll use a mod ID of -``example-mod``. I'm sure your mods will have more creative names! The -``example-mod`` mod will be developed in the ``/path/to/mymods/example-mod/`` -directory and has a basic structure that looks like this:: +In the example below, we'll use a mod name of ``example-mod``. I'm sure your +mods will have more creative names! Mods have a basic structure that looks like +this:: - init.d/example-mod.lua - raw/objects/... - raw/scripts/example-mod.lua - raw/scripts/example-mod/... - README.md + info.txt + graphics/... + objects/... + scripts_modactive/example-mod.lua + scripts_modactive/internal/example-mod/... + scripts_modinstalled/... + README.md (optional) Let's go through that line by line. -* A short (one-line) script in ``init.d/`` to initialise your - mod when a save is loaded. -* Modifications to the game raws (potentially with custom raw tokens) go in - ``raw/objects/``. -* A control script in ``scripts/`` that handles enabling and disabling your - mod. -* A subfolder for your mod under ``scripts/`` will contain all the internal - scripts and/or modules used by your mod. +- The :file:`info.txt` file contains metadata about your mod that DF will + display in-game. You can read more about this file in the + `Official DF Modding Guide `__. +- Modifications to the game raws (potentially with custom raw tokens) go in + the :file:`graphics/` and :file:`objects/` folders. You can read more about + the files that go in these directories on the :wiki:`Modding` wiki page. +- A control script in :file:`scripts_modactive/` directory that handles + system-level event hooks (e.g. reloading state when a world is loaded), + registering `overlays `, and + `enabling/disabling ` your mod. You can put other + scripts in this directory as well if you want them to appear as runnable + DFHack commands when your mod is active for the current world. Lua modules + that your main scripts use, but which don't need to be directly runnable by + the player, should go in a subdirectory under + :file:`scripts_modactive/internal/` so they don't show up in the DFHack + `launcher ` command autocomplete lists. +- Scripts that you want to be available before a world is loaded (i.e. on the + DF title screen) or that you want to be runnable in any world, regardless + of whether your mod is active, should go in the + :file:`scripts_modinstalled/` folder. You can also have an :file:`internal/` + subfolder in here for private modules if you like. +- Finally, a :file:`README.md` file that has more information about your mod. + If you develop your mod using version control (recommended!), that + :file:`README.md` file can also serve as your git repository documentation. + +These files end up in a subdirectory under :file:`data/installed_mods/` when +the mod is selected as "active" for the first time. + +What if I just want to distribute a simple script? +-------------------------------------------------- + +If your mod is just a script with no raws modifications, things get a bit +simpler. All you need is:: -It is a good idea to use a version control system to organize changes to your -mod code. You can create a separate Git repository for each of your mods. The -``README.md`` file will be your mod help text when people browse to your online -repository. + info.txt + scripts_modinstalled/yourscript.lua + README.md (optional) -Unless you want to install your ``raw/`` folder into your DF game folder every -time you make a change to your scripts, you should add your development scripts -directory to your script paths in ``dfhack-config/script-paths.txt``:: +Adding your script to the :file:`scripts_modinstalled/` folder will allow +DFHack to find it and add your mod to the `script-paths`. Your script will be +runnable from the title screen and in any loaded world, regardless of whether +your mod is explicitly "active". - +/path/to/mymods/example-mod/scripts/ +Be sure to remind players to mark your mod as "active" at least once so it gets +installed to the :file:`data/installed_mods/` folder. They may have to create a +new world just so they can mark the mod as "active". This is true both for +players who copied the mod into the :file:`mods/` folder manually and for +players who subscribed via +`Steam Workshop `__. A mod-maker's development environment ------------------------------------- -While you're writing your mod, you need a place to store your in-development -scripts that will: +Create a folder for development somewhere outside your Dwarf Fortress +installation directory (e.g. ``/path/to/mymods/``). If you work on multiple +mods, you might want to make a subdirectory for each mod. -- be directly runnable by DFHack -- not get lost when you upgrade DFHack +If you have changes to the raws, you'll have to copy them into DF's ``data/ +installed_mods/`` folder to have them take effect, but you can set things up so +that scripts are run directly from your dev directory. This way, you can edit +your scripts and have the changes available in the game immediately: no +copying, no restarting. -The recommended approach is to create a directory somewhere outside of your DF -installation (let's call it "/path/to/own-scripts") and do all your script -development in there. +How does this magic work? Just add a line like this to your +``dfhack-config/script-paths.txt`` file:: -Inside your DF installation folder, there is a file named -:file:`dfhack-config/script-paths.txt`. If you add a line like this to that -file:: - - +/path/to/own-scripts + +/path/to/mymods/example-mod/scripts_modinstalled Then that directory will be searched when you run DFHack commands from inside the game. The ``+`` at the front of the path means to search that directory -first, before any other script directory (like :file:`hack/scripts` or -:file:`raw/scripts`). That way, your latest changes will always be used instead -of older copies that you may have in mods installed in the DF directory. - -For scripts with the same name, the `order of precedence ` will -be: - -1. ``own-scripts/`` -2. ``dfhack-config/scripts/`` -3. ``save/*/scripts/`` -4. ``hack/scripts/`` +first, before any other script directory (like :file:`hack/scripts` or other +versions of your mod in ``data/installed_mods/``). The structure of the game ------------------------- -"The game" is in the global variable `df `. The game's memory can be -found in ``df.global``, containing things like the list of all items, whether to -reindex pathfinding, et cetera. Also relevant to us in ``df`` are the various -types found in the game, e.g. ``df.pronoun_type`` which we will be using in this -guide. We'll explore more of the game structures below. +"The game" is in the global variable `df `. Most of the information +relevant to a script is found in ``df.global.world``, which contains things +like the list of all items, whether to reindex pathfinding, et cetera. Also +relevant to us are the various data types found in the game, e.g. +``df.pronoun_type`` which we will be using in this guide. We'll explore more of +the game structures below. Your first script ----------------- @@ -127,8 +148,8 @@ First line, we get the unit:: local unit = dfhack.gui.getSelectedUnit() -If no unit is selected, an error message will be printed (which can be silenced -by passing ``true`` to ``getSelectedUnit``) and ``unit`` will be ``nil``. +If no unit is selected, ``unit`` will be ``nil`` and an error message will be +printed (which can be silenced by passing ``true`` to ``getSelectedUnit``). If ``unit`` is ``nil``, we don't want the script to run anymore:: @@ -138,33 +159,32 @@ If ``unit`` is ``nil``, we don't want the script to run anymore:: Now, the field ``sex`` in a unit is an integer, but each integer corresponds to a string value ("it", "she", or "he"). We get this value by indexing the -bidirectional map ``df.pronoun_type``. Indexing the other way, incidentally, -with one of the strings, will yield its corresponding number. So:: +bidirectional map ``df.pronoun_type``. Indexing the other way, with one of the +strings, will yield its corresponding number. So:: local pronounTypeString = df.pronoun_type[unit.sex] print(pronounTypeString) -Simple. Save this as a Lua file in your own scripts directory and run it as -shown before when a unit is selected in the Dwarf Fortress UI. +Simple. Save this as a Lua file in your own scripts directory and run it from +`gui/launcher` when a unit is selected in the Dwarf Fortress UI. -Exploring DF structures ------------------------ +Exploring DF state +------------------ So how could you have known about the field and type we just used? Well, there are two main tools for discovering the various fields in the game's data structures. The first is the ``df-structures`` `repository `__ that contains XML files -describing the contents of the game's structures. These are complete, but +describing the layouts of the game's structures. These are complete, but difficult to read (for a human). The second option is the `gui/gm-editor` -script, an interactive data explorer. You can run the script while objects like -units are selected to view the data within them. You can also run -``gui/gm-editor scr`` to view the data for the current screen. Press :kbd:`?` -while the script is active to view help. +interface, an interactive data explorer. You can run the script while objects +like units are selected to view the data within them. Press :kbd:`?` while the +script is active to view help. Familiarising yourself with the many structs of the game will help with ideas immensely, and you can always ask for help in the `right places `. -Detecting triggers +Reacting to events ------------------ The common method for injecting new behaviour into the game is to define a @@ -174,7 +194,7 @@ provides two libraries for this, ``repeat-util`` and `eventful `. frames (paused or unpaused), ticks (unpaused), in-game days, months, or years. If you need to be aware the instant something happens, you'll need to run a check once a tick. Be careful not to do this gratuitously, though, since -running that often can slow down the game! +running callbacks too often can slow down the game! ``eventful``, on the other hand, is much more performance-friendly since it will only call your callback when a relevant event happens, like a reaction or job @@ -371,7 +391,8 @@ Then, let's make a ``repeat-util`` callback for once a tick:: repeatUtil.scheduleEvery(modId, 1, "ticks", function() Let's iterate over every active unit, and for every unit, iterate over their -worn items to calculate how much we are going to take from their on-foot movement timers:: +worn items to calculate how much we are going to take from their on-foot +movement timers:: for _, unit in ipairs(df.global.world.units.active) do local amount = 0 @@ -385,82 +406,78 @@ worn items to calculate how much we are going to take from their on-foot movemen end -- Subtract amount from on-foot movement timers if not on ground if not unit.flags1.on_ground then - dfhack.units.subtractActionTimers(unit, amount, df.unit_action_type_group.MovementFeet) + dfhack.units.subtractActionTimers(unit, amount, + df.unit_action_type_group.MovementFeet) end end -The structure of a full mod ---------------------------- - -For reference, `Tachy Guns `__ is a -full mod that conforms to this guide. - -Create a folder for mod projects somewhere outside your Dwarf Fortress -installation directory (e.g. ``/path/to/mymods/``) and use your mod IDs as the -names for the mod folders within it. In the example below, we'll use a mod ID of -``example-mod``. I'm sure your mods will have more creative names! The -``example-mod`` mod will be developed in the ``/path/to/mymods/example-mod/`` -directory and has a basic structure that looks like this:: - - init.d/example-mod.lua - raw/objects/... - raw/scripts/example-mod.lua - raw/scripts/example-mod/... - README.md +Putting it all together +----------------------- -Let's go through that line by line. +Ok, you're all set up! Now, let's take a look at an example +``scripts_modinstalled/example-mod.lua`` file:: -* A short (one-line) script in ``init.d/`` to initialise your - mod when a save is loaded. -* Modifications to the game raws (potentially with custom raw tokens) go in - ``raw/objects/``. -* A control script in ``scripts/`` that handles enabling and disabling your - mod. -* A subfolder for your mod under ``scripts/`` will contain all the internal - scripts and/or modules used by your mod. + -- main file for example-mod -It is a good idea to use a version control system to organize changes to your -mod code. You can create a separate Git repository for each of your mods. The -``README.md`` file will be your mod help text when people browse to your online -repository. + -- these lines indicate that the script supports the "enable" API so you + -- can start it by running "enable example-mod" and stop it by running + -- "disable example-mod" + --@module = true + --@enable = true -Unless you want to install your ``raw/`` folder into your DF game folder every -time you make a change to your scripts, you should add your development scripts -directory to your script paths in ``dfhack-config/script-paths.txt``:: + -- this is the help text that will appear in `help` and `gui/launcher` + -- Documentation on how to format docs here: + -- see possible tags here: https://docs.dfhack.org/en/latest/docs/Tags.html + --[====[ + example-mod + =========== - +/path/to/mymods/example-mod/scripts/ + Tags: fort | gameplay -Ok, you're all set up! Now, let's take a look at an example -``scripts/example-mod.lua`` file:: + Short one-sentence description ... - -- main setup and teardown for example-mod - -- this next line indicates that the script supports the "enable" - -- API so you can start it by running "enable example-mod" and stop - -- it by running "disable example-mod" - --@ enable = true + Longer description ... - local usage = [[ Usage ----- enable example-mod disable example-mod - ]] + ]====] + local repeatUtil = require('repeat-util') local eventful = require('plugins.eventful') -- you can reference global values or functions declared in any of -- your internal scripts - local moduleA = reqscript('example-mod/module-a') - local moduleB = reqscript('example-mod/module-b') - local moduleC = reqscript('example-mod/module-c') - local moduleD = reqscript('example-mod/module-d') + local moduleA = reqscript('internal/example-mod/module-a') + local moduleB = reqscript('internal/example-mod/module-b') + local moduleC = reqscript('internal/example-mod/module-c') + local moduleD = reqscript('internal/example-mod/module-d') + + local GLOBAL_KEY = 'example-mod' enabled = enabled or false - local modId = 'example-mod' + + function isEnabled() + return enabled + end + + dfhack.onStateChange[GLOBAL_KEY] = function(sc) + if sc == SC_MAP_UNLOADED then + dfhack.run_command('disable', 'example-mod') + return + end + + if sc ~= SC_MAP_LOADED or df.global.gamemode ~= df.game_mode.DWARF then + return + end + + dfhack.run_command('enable', 'example-mod') + end if not dfhack_flags.enable then - print(usage) + print(dfhack.script_help()) print() print(('Example mod is currently '):format( enabled and 'enabled' or 'disabled')) @@ -516,23 +533,17 @@ Ok, you're all set up! Now, let's take a look at an example enabled = false end -You can call ``enable example-mod`` and ``disable example-mod`` yourself while -developing, but for end users you can start your mod automatically from -``init.d/example-mod.lua``:: - - dfhack.run_command('enable example-mod') - -Inside ``raw/scripts/example-mod/module-a.lua`` you could have code like this:: +Inside ``scripts_modinstalled/internal/example-mod/module-a.lua`` you could +have code like this:: --@ module = true - -- The above line is required for reqscript to work function onLoad() -- global variables are exported -- do initialization here end - -- this is an internal function: local functions/variables - -- are not exported + -- this is a local function: local functions/variables + -- are not accessible to other scripts. local function usedByOnTick(unit) -- ... end @@ -543,6 +554,6 @@ Inside ``raw/scripts/example-mod/module-a.lua`` you could have code like this:: end end -The `reqscript ` function reloads scripts that have changed, so you can modify -your scripts while DF is running and just disable/enable your mod to load the -changes into your ongoing game! +The `reqscript ` function reloads scripts that have changed, so you +can modify your scripts while DF is running and just disable/enable your mod to +load the changes into your ongoing game! From 7cb9d3fe8cf4e1ca209e094ba7317aaba9b297d0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Mar 2023 18:47:18 -0700 Subject: [PATCH 158/439] formatting --- docs/guides/modding-guide.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index 73758db6f..cf61c801c 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -419,15 +419,15 @@ Ok, you're all set up! Now, let's take a look at an example -- main file for example-mod - -- these lines indicate that the script supports the "enable" API so you - -- can start it by running "enable example-mod" and stop it by running - -- "disable example-mod" + -- these lines indicate that the script supports the "enable" + -- API so you can start it by running "enable example-mod" and + -- stop it by running "disable example-mod" --@module = true --@enable = true - -- this is the help text that will appear in `help` and `gui/launcher` - -- Documentation on how to format docs here: - -- see possible tags here: https://docs.dfhack.org/en/latest/docs/Tags.html + -- this is the help text that will appear in `help` and + -- `gui/launcher`. see possible tags here: + -- https://docs.dfhack.org/en/latest/docs/Tags.html --[====[ example-mod =========== From 6a3e61519a1fd4af6a1802177e8090e50223787c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 25 Mar 2023 01:55:35 -0700 Subject: [PATCH 159/439] remove reference to Tachy Guns --- docs/guides/modding-guide.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index cf61c801c..5cabf0856 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -38,9 +38,6 @@ require a mix of raw modding and DFHack scripting. The structure of a mod ---------------------- -For reference, `Tachy Guns `__ is a -full mod that conforms to this guide. - In the example below, we'll use a mod name of ``example-mod``. I'm sure your mods will have more creative names! Mods have a basic structure that looks like this:: From 0ba4225d85924a86c97cad7938fdbfe95827f590 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 25 Mar 2023 15:19:24 -0700 Subject: [PATCH 160/439] support showing a different tile on hover for Labels --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 12 +++++++----- library/lua/gui/widgets.lua | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b9c31f146..ced0f961e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -64,6 +64,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua +- ``widget.Label``: tokens can now specify a ``htile`` property to indicate the tile that should be shown when the Label is hovered over with the mouse ## Removed diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 9f2386660..862c5bccc 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4731,10 +4731,12 @@ containing newlines, or a table with the following possible fields: Specifies the number of character positions to advance on the line before rendering the token. -* ``token.tile = pen`` +* ``token.tile``, ``token.htile`` Specifies a pen or texture index (or a function that returns a pen or texture - index) to paint as one tile before the main part of the token. + index) to paint as one tile before the main part of the token. If ``htile`` + is specified, that is used instead of ``tile`` when the Label is hovered over + with the mouse. * ``token.width = ...`` @@ -4762,10 +4764,10 @@ containing newlines, or a table with the following possible fields: Same as the attributes of the label itself, but applies only to the token. -* ``token.pen``, ``token.dpen`` +* ``token.pen``, ``token.dpen``, ``token.hpen`` - Specify the pen and disabled pen to be used for the token's text. - The field may be either the pen itself, or a callback that returns it. + Specify the pen, disabled pen, and hover pen to be used for the token's text. + The fields may be either the pen itself, or a callback that returns it. * ``token.on_activate`` diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index b86e31710..b5497f0d0 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1121,10 +1121,10 @@ function render_text(obj,dc,x0,y0,pen,dpen,disabled,hpen,hovered) end end - if token.tile then + if token.tile or (hovered and token.htile) then x = x + 1 if dc then - local tile = getval(token.tile) + local tile = hovered and getval(token.htile or token.tile) or getval(token.tile) local tile_pen = tonumber(tile) and to_pen{tile=tile} or tile dc:char(nil, tile_pen) if token.width then From 28eeb95eedca903efeb35024ffd8fa4d5ebb8254 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 25 Mar 2023 22:28:21 +0000 Subject: [PATCH 161/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index f637dc4bf..2568b79c3 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit f637dc4bf18a7ca4968f45e79790893c6d22c3f5 +Subproject commit 2568b79c3a74128b649bab8fdd20ce67cd88790f From b3a20e771b8b32d7015f7286673514329fa1b6d5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 25 Mar 2023 15:53:42 -0700 Subject: [PATCH 162/439] remove lua's ability to load binary chunks to protect against malware attacks --- depends/lua/src/ldo.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/depends/lua/src/ldo.c b/depends/lua/src/ldo.c index 316e45c8f..65158df0b 100644 --- a/depends/lua/src/ldo.c +++ b/depends/lua/src/ldo.c @@ -767,14 +767,14 @@ static void f_parser (lua_State *L, void *ud) { LClosure *cl; struct SParser *p = cast(struct SParser *, ud); int c = zgetc(p->z); /* read first character */ - if (c == LUA_SIGNATURE[0]) { - checkmode(L, p->mode, "binary"); - cl = luaU_undump(L, p->z, p->name); - } - else { + // if (c == LUA_SIGNATURE[0]) { + // checkmode(L, p->mode, "binary"); + // cl = luaU_undump(L, p->z, p->name); + // } + // else { checkmode(L, p->mode, "text"); cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); - } + // } lua_assert(cl->nupvalues == cl->p->sizeupvalues); luaF_initupvals(L, cl); } From e2d4d45c023438af92e2abbaa00bb2c206e9ac4c Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 27 Mar 2023 04:44:38 +0000 Subject: [PATCH 163/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 2568b79c3..bb3dfc0d3 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 2568b79c3a74128b649bab8fdd20ce67cd88790f +Subproject commit bb3dfc0d3e2bdebc4ba6fd814371662457b18917 From 4a173aac997c05b7921ccd96ee0446250c82b318 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Mon, 27 Mar 2023 00:07:40 -0500 Subject: [PATCH 164/439] tailor: fix #3093, #3103 I significantly restructured the assignment algorithm to eliminate the overproduction issues in #3093 #3103 is addressed by excluding units that don't have the caste-level EQUIPS flag closes #3093 closes #3103 --- docs/changelog.txt | 2 +- plugins/tailor.cpp | 151 ++++++++++++++++++++++----------------------- 2 files changed, 75 insertions(+), 78 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index ced0f961e..619a538e3 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,7 +44,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `buildingplan`: you can no longer designate constructions on tiles with magma or deep water - `buildingplan`: fixed material filter getting lost for planning buildings on save/reload - `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) -- `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, and properly tracks material requirements for already queued orders +- `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, properly tracks material requirements for already queued orders, skips units who can't wear clothes, and hopefully won't over-order items anymore ## Misc Improvements - `buildingplan`: filters and global settings are now ignored when manually choosing items for a building diff --git a/plugins/tailor.cpp b/plugins/tailor.cpp index 3ba6744bb..bb84c438c 100644 --- a/plugins/tailor.cpp +++ b/plugins/tailor.cpp @@ -144,13 +144,15 @@ static struct BadFlags { } badFlags; class Tailor { -private: - std::map, int> available; // key is item type & size - std::map, int> needed; // same - std::map, int> queued; // same +private: std::map sizes; // this maps body size to races - std::map, int> orders; // key is item type, item subtype, size + + std::map, int> available; + + std::map, int> needed; + + std::map, int> orders; std::map supply; std::map reserves; @@ -169,50 +171,34 @@ public: { available.clear(); needed.clear(); - queued.clear(); sizes.clear(); - orders.clear(); supply.clear(); + orders.clear(); } void scan_clothing() { - if (!inventory_sanity_checking) + for (auto i : world->items.other[df::items_other_id::ANY_GENERIC37]) // GENERIC37 is "nontattered clothing" { - for (auto i : world->items.other[df::items_other_id::ANY_GENERIC37]) // GENERIC37 is "clothing" + if (i->flags.whole & badFlags.whole) { - if (i->flags.whole & badFlags.whole) - continue; - if (i->getWear() >= 1) - continue; - df::item_type t = i->getType(); - int size = world->raws.creatures.all[i->getMakerRace()]->adultsize; - - available[std::make_pair(t, size)] += 1; + continue; } - } - else - { - auto& l = world->items.other[df::items_other_id::ANY_GENERIC37]; - - for (auto i : world->items.other[df::items_other_id::IN_PLAY]) - { - if (i->flags.whole & badFlags.whole) - continue; - if (!i->isClothing()) - continue; - if (std::find(std::begin(l), std::end(l), i) == std::end(l)) - { - DEBUG(cycle).print("tailor: clothing item %d missing from GENERIC37 list\n", i->id); - } - if (i->getWear() >= 1) - continue; - df::item_type t = i->getType(); - int size = world->raws.creatures.all[i->getMakerRace()]->adultsize; + if (i->getWear() >= 1) + continue; + df::item_type t = i->getType(); + int size = world->raws.creatures.all[i->getMakerRace()]->adultsize; - available[std::make_pair(t, size)] += 1; - } + available[std::make_pair(t, size)] += 1; + } + for (auto& i : available) + { + df::item_type t; + int size; + std::tie(t, size) = i.first; + DEBUG(cycle).print("tailor: %d %s of size %d found\n", + i.second, ENUM_KEY_STR(item_type, t).c_str(), size); } } @@ -273,14 +259,13 @@ public: if (!Units::isOwnCiv(u) || !Units::isOwnGroup(u) || !Units::isActive(u) || - Units::isBaby(u)) - continue; // skip units we don't control + Units::isBaby(u) || + !Units::casteFlagSet(u->race, u->caste, df::enums::caste_raw_flags::EQUIPS)) + continue; // skip units we don't control or that can't wear clothes std::set wearing; - wearing.clear(); - + std::set ordered; std::deque worn; - worn.clear(); for (auto inv : u->inventory) { @@ -295,33 +280,37 @@ public: int usize = world->raws.creatures.all[u->race]->adultsize; sizes[usize] = u->race; - for (auto ty : std::set{ df::item_type::ARMOR, df::item_type::PANTS, df::item_type::SHOES }) - { - if (wearing.count(ty) == 0) - { - TRACE(cycle).print("tailor: one %s of size %d needed to cover %s\n", - ENUM_KEY_STR(item_type, ty).c_str(), - usize, - Translation::TranslateName(&u->name, false).c_str()); - needed[std::make_pair(ty, usize)] += 1; - } - } - for (auto w : worn) { auto ty = w->getType(); - auto oo = itemTypeMap.find(ty); - if (oo == itemTypeMap.end()) - { - continue; - } - const df::job_type o = oo->second; int isize = world->raws.creatures.all[w->getMakerRace()]->adultsize; std::string description; w->getItemDescription(&description, 0); - if (available[std::make_pair(ty, usize)] > 0) + bool allocated = false; + + if (wearing.count(ty) == 0) + { + if (available[std::make_pair(ty, usize)] > 0) + { + available[std::make_pair(ty, usize)] -= 1; + DEBUG(cycle).print("tailor: allocating a %s (size %d) to %s\n", + ENUM_KEY_STR(item_type, ty).c_str(), usize, + Translation::TranslateName(&u->name, false).c_str()); + wearing.insert(ty); + } + else if (ordered.count(ty) == 0) + { + DEBUG(cycle).print ("tailor: %s (size %d) worn by %s (size %d) needs replacement, but none available\n", + description.c_str(), isize, + Translation::TranslateName(&u->name, false).c_str(), usize); + needed[std::make_pair(ty, usize)] += 1; + ordered.insert(ty); + } + } + + if (wearing.count(ty) > 0) { if (w->flags.bits.owned) { @@ -335,23 +324,21 @@ public: ); } - if (wearing.count(ty) == 0) - { - DEBUG(cycle).print("tailor: allocating a %s (size %d) to %s\n", - ENUM_KEY_STR(item_type, ty).c_str(), usize, - Translation::TranslateName(&u->name, false).c_str()); - available[std::make_pair(ty, usize)] -= 1; - } - if (w->getWear() > 1) w->flags.bits.dump = true; } - else + + } + + for (auto ty : std::set{ df::item_type::ARMOR, df::item_type::PANTS, df::item_type::SHOES }) + { + if (wearing.count(ty) == 0 && ordered.count(ty) == 0) { - DEBUG(cycle).print ("tailor: %s (size %d) worn by %s (size %d) needs replacement, but none available\n", - description.c_str(), isize, - Translation::TranslateName(&u->name, false).c_str(), usize); - orders[std::make_tuple(o, w->getSubtype(), usize)] += 1; + TRACE(cycle).print("tailor: one %s of size %d needed to cover %s\n", + ENUM_KEY_STR(item_type, ty).c_str(), + usize, + Translation::TranslateName(&u->name, false).c_str()); + needed[std::make_pair(ty, usize)] += 1; } } } @@ -367,6 +354,9 @@ public: int size = a.first.second; int count = a.second; + if (count <= 0) + continue; + int sub = 0; std::vector v; @@ -432,7 +422,14 @@ public: int size = world->raws.creatures.all[race]->adultsize; - orders[std::make_tuple(o->job_type, sub, size)] -= o->amount_left; + + auto tt = jobTypeMap.find(o->job_type); + if (tt == jobTypeMap.end()) + { + continue; + } + + needed[std::make_pair(tt->second, size)] -= o->amount_left; TRACE(cycle).print("tailor: existing order for %d %s of size %d detected\n", o->amount_left, ENUM_KEY_STR(job_type, o->job_type).c_str(), @@ -576,8 +573,8 @@ public: scan_clothing(); scan_materials(); scan_replacements(); - create_orders(); scan_existing_orders(); + create_orders(); return place_orders(); } From 0f5456c45b3324e9eb8135908cf425e83fe5481e Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Mon, 27 Mar 2023 00:31:47 -0500 Subject: [PATCH 165/439] tidy up after self remove a couple of no-longer-used variables that i missed last time --- plugins/tailor.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/tailor.cpp b/plugins/tailor.cpp index bb84c438c..286bd9c0d 100644 --- a/plugins/tailor.cpp +++ b/plugins/tailor.cpp @@ -288,8 +288,6 @@ public: std::string description; w->getItemDescription(&description, 0); - bool allocated = false; - if (wearing.count(ty) == 0) { if (available[std::make_pair(ty, usize)] > 0) @@ -404,7 +402,6 @@ public: if (f == jobTypeMap.end()) continue; - auto sub = o->item_subtype; int race = o->hist_figure_id; for (auto& m : all_materials) From f3862e3eecacd5af65d0799c49dcee6c3a964980 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Mon, 27 Mar 2023 00:44:03 -0500 Subject: [PATCH 166/439] tailor: gatekeep debugging code --- docs/changelog.txt | 6 +++++- plugins/tailor.cpp | 15 +++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 619a538e3..65194dcfa 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,7 +44,11 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `buildingplan`: you can no longer designate constructions on tiles with magma or deep water - `buildingplan`: fixed material filter getting lost for planning buildings on save/reload - `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) -- `tailor`: now properly discriminates between dyed and undyed cloth, no longer defaults to using adamantine, properly tracks material requirements for already queued orders, skips units who can't wear clothes, and hopefully won't over-order items anymore +- `tailor`: properly discriminates between dyed and undyed cloth +- `tailor`: no longer defaults to using adamantine +- `tailor`: properly tracks material requirements for already queued orders +- `tailor`: skips units who can't wear clothes +- `tailor`: hopefully won't over-order items any more ## Misc Improvements - `buildingplan`: filters and global settings are now ignored when manually choosing items for a building diff --git a/plugins/tailor.cpp b/plugins/tailor.cpp index 286bd9c0d..2b44d11ae 100644 --- a/plugins/tailor.cpp +++ b/plugins/tailor.cpp @@ -192,13 +192,16 @@ public: available[std::make_pair(t, size)] += 1; } - for (auto& i : available) + if (DBG_NAME(cycle).isEnabled(DebugCategory::LDEBUG)) { - df::item_type t; - int size; - std::tie(t, size) = i.first; - DEBUG(cycle).print("tailor: %d %s of size %d found\n", - i.second, ENUM_KEY_STR(item_type, t).c_str(), size); + for (auto& i : available) + { + df::item_type t; + int size; + std::tie(t, size) = i.first; + DEBUG(cycle).print("tailor: %d %s of size %d found\n", + i.second, ENUM_KEY_STR(item_type, t).c_str(), size); + } } } From 8da7e216a4a2dac1576ff68045c3fd79e34fcc9f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 27 Mar 2023 02:24:56 -0700 Subject: [PATCH 167/439] buildingplan - suspendmanager integration --- docs/changelog.txt | 1 + docs/plugins/buildingplan.rst | 5 ++- plugins/buildingplan/buildingplan.cpp | 39 ++++++++++++++------- plugins/buildingplan/buildingplan.h | 2 +- plugins/buildingplan/buildingplan_cycle.cpp | 19 +++++----- plugins/lua/buildingplan.lua | 5 +++ 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 65194dcfa..df153d43e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -52,6 +52,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: filters and global settings are now ignored when manually choosing items for a building +- `buildingplan`: if `suspendmanager` is running, then planned buildings will be left suspended when their items are all attached. `suspendmanager` will unsuspsend them for construction when it is safe to do so. - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from - `stockpiles`: support partial application of a saved config based on dynamic filtering - `stockpiles`: additive and subtractive modes when applying a second stockpile configuration on top of a first diff --git a/docs/plugins/buildingplan.rst b/docs/plugins/buildingplan.rst index 71951f386..9cc7e68a2 100644 --- a/docs/plugins/buildingplan.rst +++ b/docs/plugins/buildingplan.rst @@ -20,7 +20,10 @@ building. Once all items are attached, the construction job will be unsuspended and a dwarf will come and build the building. If you have the `unsuspend` overlay enabled (it is enabled by default), then buildingplan-suspended buildings will appear with a ``P`` marker on the main map, as opposed to the -usual ``x`` marker for "regular" suspended buildings. +usual ``x`` marker for "regular" suspended buildings. If you have +`suspendmanager` running, then buildings will be left suspended when their +items are all attached and ``suspendmanager`` will unsuspend them for +construction when it is safe to do so. If you want to impose restrictions on which items are chosen for the buildings, buildingplan has full support for quality and material filters (see `below diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 101349fde..11e08c2a0 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -72,7 +72,7 @@ static Tasks tasks; void PlannedBuilding::remove(color_ostream &out) { DEBUG(status,out).print("removing persistent data for building %d\n", id); World::DeletePersistentData(bld_config); - if (planned_buildings.count(id) > 0) + if (planned_buildings.count(id)) planned_buildings.erase(id); } @@ -212,9 +212,9 @@ static DefaultItemFilters & get_item_filters(color_ostream &out, const BuildingT static command_result do_command(color_ostream &out, vector ¶meters); void buildingplan_cycle(color_ostream &out, Tasks &tasks, - unordered_map &planned_buildings); + unordered_map &planned_buildings, bool unsuspend_on_finalize); -static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb); +static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb, bool unsuspend_on_finalize); DFhackCExport command_result plugin_init(color_ostream &out, std::vector &commands) { DEBUG(status,out).print("initializing %s\n", plugin_name); @@ -295,6 +295,16 @@ static int16_t get_subtype(df::building *bld) { return subtype; } +static bool is_suspendmanager_enabled(color_ostream &out) { + bool suspendmanager_enabled = false; + call_buildingplan_lua(&out, "is_suspendmanager_enabled", 0, 1, + Lua::DEFAULT_LUA_LAMBDA, + [&](lua_State *L){ + suspendmanager_enabled = lua_toboolean(L, -1); + }); + return suspendmanager_enabled; +} + DFhackCExport command_result plugin_load_data (color_ostream &out) { cycle_timestamp = 0; config = World::GetPersistentData(CONFIG_KEY); @@ -320,6 +330,7 @@ DFhackCExport command_result plugin_load_data (color_ostream &out) { vector building_configs; World::GetPersistentData(&building_configs, BLD_CONFIG_KEY); const size_t num_building_configs = building_configs.size(); + bool unsuspend_on_finalize = !is_suspendmanager_enabled(out); for (size_t idx = 0; idx < num_building_configs; ++idx) { PlannedBuilding pb(out, building_configs[idx]); df::building *bld = df::building::find(pb.id); @@ -334,7 +345,7 @@ DFhackCExport command_result plugin_load_data (color_ostream &out) { pb.remove(out); continue; } - registerPlannedBuilding(out, pb); + registerPlannedBuilding(out, pb, unsuspend_on_finalize); } return CR_OK; @@ -347,7 +358,8 @@ static void do_cycle(color_ostream &out) { cycle_timestamp = world->frame_counter; cycle_requested = false; - buildingplan_cycle(out, tasks, planned_buildings); + bool unsuspend_on_finalize = !is_suspendmanager_enabled(out); + buildingplan_cycle(out, tasks, planned_buildings, unsuspend_on_finalize); call_buildingplan_lua(&out, "signal_reset"); } @@ -469,7 +481,7 @@ vector getVectorIds(color_ostream &out, const df::job_it return ret; } -static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb) { +static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb, bool unsuspend_on_finalize) { df::building * bld = pb.getBuildingIfValidOrRemoveIfNot(out); if (!bld) return false; @@ -479,10 +491,15 @@ static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb) { return false; } + // suspend jobs + for (auto job : bld->jobs) + job->flags.bits.suspend = true; + auto job_items = bld->jobs[0]->job_items; if (isJobReady(out, job_items)) { // all items are already attached - finalizeBuilding(out, bld); + finalizeBuilding(out, bld, unsuspend_on_finalize); + pb.remove(out); return true; } @@ -508,10 +525,6 @@ static bool registerPlannedBuilding(color_ostream &out, PlannedBuilding & pb) { } } - // suspend jobs - for (auto job : bld->jobs) - job->flags.bits.suspend = true; - // add the planned buildings to our register planned_buildings.emplace(bld->id, pb); @@ -627,7 +640,9 @@ static bool addPlannedBuilding(color_ostream &out, df::building *bld) { BuildingTypeKey key(bld->getType(), subtype, bld->getCustomType()); PlannedBuilding pb(out, bld, get_heat_safety_filter(key), get_item_filters(out, key)); - return registerPlannedBuilding(out, pb); + + bool unsuspend_on_finalize = !is_suspendmanager_enabled(out); + return registerPlannedBuilding(out, pb, unsuspend_on_finalize); } static void doCycle(color_ostream &out) { diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 756a81f83..26aa77fbc 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -52,4 +52,4 @@ bool itemPassesScreen(df::item * item); df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat); bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter, const std::set &special); bool isJobReady(DFHack::color_ostream &out, const std::vector &jitems); -void finalizeBuilding(DFHack::color_ostream &out, df::building *bld); +void finalizeBuilding(DFHack::color_ostream &out, df::building *bld, bool unsuspend_on_finalize); diff --git a/plugins/buildingplan/buildingplan_cycle.cpp b/plugins/buildingplan/buildingplan_cycle.cpp index 803f1f130..3213e741d 100644 --- a/plugins/buildingplan/buildingplan_cycle.cpp +++ b/plugins/buildingplan/buildingplan_cycle.cpp @@ -111,7 +111,7 @@ static bool job_item_idx_lt(df::job_item_ref *a, df::job_item_ref *b) { // now all at 0, so there is no risk of having extra items attached. we don't // remove them to keep the "finalize with buildingplan active" path as similar // as possible to the "finalize with buildingplan disabled" path. -void finalizeBuilding(color_ostream &out, df::building *bld) { +void finalizeBuilding(color_ostream &out, df::building *bld, bool unsuspend_on_finalize) { DEBUG(cycle,out).print("finalizing building %d\n", bld->id); auto job = bld->jobs[0]; @@ -143,8 +143,10 @@ void finalizeBuilding(color_ostream &out, df::building *bld) { } // we're good to go! - job->flags.bits.suspend = false; - Job::checkBuildingsNow(); + if (unsuspend_on_finalize) { + job->flags.bits.suspend = false; + Job::checkBuildingsNow(); + } } static df::building * popInvalidTasks(color_ostream &out, Bucket &task_queue, @@ -181,7 +183,8 @@ static bool isAccessibleFrom(color_ostream &out, df::item *item, df::job *job) { static void doVector(color_ostream &out, df::job_item_vector_id vector_id, map &buckets, - unordered_map &planned_buildings) { + unordered_map &planned_buildings, + bool unsuspend_on_finalize) { auto other_id = ENUM_ATTR(job_item_vector_id, other, vector_id); auto item_vector = df::global::world->items.other[other_id]; DEBUG(cycle,out).print("matching %zu item(s) in vector %s against %zu filter bucket(s)\n", @@ -239,7 +242,7 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, --jitems[filter_idx]->quantity; task_queue.pop_front(); if (isJobReady(out, jitems)) { - finalizeBuilding(out, bld); + finalizeBuilding(out, bld, unsuspend_on_finalize); planned_buildings.at(id).remove(out); } if (task_queue.empty()) { @@ -274,7 +277,7 @@ struct VectorsToScanLast { }; void buildingplan_cycle(color_ostream &out, Tasks &tasks, - unordered_map &planned_buildings) { + unordered_map &planned_buildings, bool unsuspend_on_finalize) { static const VectorsToScanLast vectors_to_scan_last; DEBUG(cycle,out).print( @@ -292,7 +295,7 @@ void buildingplan_cycle(color_ostream &out, Tasks &tasks, } auto & buckets = it->second; - doVector(out, vector_id, buckets, planned_buildings); + doVector(out, vector_id, buckets, planned_buildings, unsuspend_on_finalize); if (buckets.empty()) { DEBUG(cycle,out).print("removing empty vector: %s; %zu vector(s) left\n", ENUM_KEY_STR(job_item_vector_id, vector_id).c_str(), @@ -306,7 +309,7 @@ void buildingplan_cycle(color_ostream &out, Tasks &tasks, if (tasks.count(vector_id) == 0) continue; auto & buckets = tasks[vector_id]; - doVector(out, vector_id, buckets, planned_buildings); + doVector(out, vector_id, buckets, planned_buildings, unsuspend_on_finalize); if (buckets.empty()) { DEBUG(cycle,out).print("removing empty vector: %s; %zu vector(s) left\n", ENUM_KEY_STR(job_item_vector_id, vector_id).c_str(), diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index 077470409..a33c1684f 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -51,6 +51,11 @@ function parse_commandline(...) return true end +function is_suspendmanager_enabled() + local ok, sm = pcall(reqscript, 'suspendmanager') + return ok and sm.isEnabled() +end + function get_num_filters(btype, subtype, custom) local filters = dfhack.buildings.getFiltersByType({}, btype, subtype, custom) return filters and #filters or 0 From 63772fd808107c37627ae5d5946a25baa7173d64 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 27 Mar 2023 03:51:45 -0700 Subject: [PATCH 168/439] ensure rclicks don't bleed through for dialogs --- library/lua/gui/dialogs.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/library/lua/gui/dialogs.lua b/library/lua/gui/dialogs.lua index 3b2470114..1b7858416 100644 --- a/library/lua/gui/dialogs.lua +++ b/library/lua/gui/dialogs.lua @@ -4,9 +4,6 @@ local _ENV = mkmodule('gui.dialogs') local gui = require('gui') local widgets = require('gui.widgets') -local utils = require('utils') - -local dscreen = dfhack.screen MessageBox = defclass(MessageBox, gui.FramedScreen) @@ -66,6 +63,7 @@ function MessageBox:onInput(keys) elseif (keys.LEAVESCREEN or keys._MOUSE_R_DOWN) and self.on_cancel then self.on_cancel() end + gui.markMouseClicksHandled(keys) return true end return self:inputToSubviews(keys) @@ -135,6 +133,7 @@ function InputBox:onInput(keys) if self.on_cancel then self.on_cancel() end + gui.markMouseClicksHandled(keys) return true end return self:inputToSubviews(keys) @@ -218,9 +217,9 @@ end function ListBox:onRenderFrame(dc,rect) ListBox.super.onRenderFrame(self,dc,rect) - --if self.select2_hint then - -- dc:seek(rect.x1+2,rect.y2):key('SEC_SELECT'):string(': '..self.select2_hint,COLOR_GREY) - --end + if self.select2_hint then + dc:seek(rect.x1+2,rect.y2):string('Shift-Click', COLOR_LIGHTGREEN):string(': '..self.select2_hint, COLOR_GREY) + end end function ListBox:getWantedFrameSize() @@ -236,6 +235,7 @@ function ListBox:onInput(keys) if self.on_cancel then self.on_cancel() end + gui.markMouseClicksHandled(keys) return true end return self:inputToSubviews(keys) From 0ed311c108ec68bcc0ddcd9063f08417130479b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 27 Mar 2023 03:52:12 -0700 Subject: [PATCH 169/439] allow exported orders files to be deleted from the import dialog --- plugins/lua/orders.lua | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/plugins/lua/orders.lua b/plugins/lua/orders.lua index 6f5bc677a..50197fce4 100644 --- a/plugins/lua/orders.lua +++ b/plugins/lua/orders.lua @@ -19,15 +19,37 @@ local function do_clear() function() dfhack.run_command('orders', 'clear') end) end +local function get_import_choices() + return dfhack.run_command_silent('orders', 'list'):split('\n') +end + local function do_import() - local output = dfhack.run_command_silent('orders', 'list') - dialogs.ListBox{ - frame_title='Import Manager Orders', + local dlg + local function get_dlg() return dlg end + dlg = dialogs.ListBox{ + frame_title='Import/Delete Manager Orders', with_filter=true, - choices=output:split('\n'), - on_select=function(idx, choice) + choices=get_import_choices(), + on_select=function(_, choice) dfhack.run_command('orders', 'import', choice.text) end, + dismiss_on_select2=false, + on_select2=function(_, choice) + if choice.text:startswith('library/') then return end + local fname = 'dfhack-config/orders/'..choice.text..'.json' + if not dfhack.filesystem.isfile(fname) then return end + dialogs.showYesNoPrompt('Delete orders file?', + 'Are you sure you want to delete "' .. fname .. '"?', nil, + function() + print('deleting ' .. fname) + os.remove(fname) + local list = get_dlg().subviews.list + local filter = list:getFilter() + list:setChoices(get_import_choices(), list:getSelected()) + list:setFilter(filter) + end) + end, + select2_hint='Delete file', }:show() end From d5c8237c913b655d9dc3060aa98810740c129ffa Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 27 Mar 2023 03:53:10 -0700 Subject: [PATCH 170/439] update changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 65194dcfa..d55ab6585 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -59,6 +59,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `stockpiles`: now includes a library of useful stockpile configs (see docs for details) - `automelt`: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed) - `orders`: add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen +- `orders`: add option to delete exported files from the import dialog - `enable`: can now interpret aliases defined with the `alias` command - scripts in installed mods are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod's folder: ``scripts_modinstalled/`` and ``scripts_modactive/``. ``scripts_modinstalled/`` folders will always be added the script path, regardless of whether the mod is active in a world. ``scripts_modactive/`` folders will only be added to the script path when the mod is active in the current loaded world. From b515b337ea55ed06c5223f81f861a77920014d5b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 27 Mar 2023 08:38:18 -0700 Subject: [PATCH 171/439] silence noisy buildingplan warning about itemless buildings not having items --- plugins/buildingplan/defaultitemfilters.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index fc7dd9f56..ac0a4699e 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -60,6 +60,8 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &f auto &serialized = filter_config.val(); DEBUG(status,out).print("deserializing default item filters for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); + if (!jitems.size()) + return; std::vector elems; split_string(&elems, serialized, "|"); std::vector filters = deserialize_item_filters(out, elems[0]); From df51835b1c5d076f3e7440b37e307100bc8b25be Mon Sep 17 00:00:00 2001 From: Tachytaenius Date: Mon, 27 Mar 2023 22:05:06 +0100 Subject: [PATCH 172/439] Amend main module code in modding guide --- docs/guides/modding-guide.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index 5cabf0856..b386b48c3 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -457,6 +457,8 @@ Ok, you're all set up! Now, let's take a look at an example enabled = enabled or false function isEnabled() + -- this function is for the enabled API, the script won't show up on the + -- control panel without it return enabled end @@ -473,6 +475,10 @@ Ok, you're all set up! Now, let's take a look at an example dfhack.run_command('enable', 'example-mod') end + if dfhack_flags.module then + return + end + if not dfhack_flags.enable then print(dfhack.script_help()) print() From 02b52fcb3decced37bad3dfd6226f35e7ddf6457 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 27 Mar 2023 16:11:21 -0700 Subject: [PATCH 173/439] confirm for removing burrows via the repaint menu --- docs/changelog.txt | 1 + docs/plugins/confirm.rst | 5 +++-- plugins/lua/confirm.lua | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index d55ab6585..62aa4a037 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -52,6 +52,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: filters and global settings are now ignored when manually choosing items for a building +- `confirm`: adds confirmation for removing burrows via the repaint menu - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from - `stockpiles`: support partial application of a saved config based on dynamic filtering - `stockpiles`: additive and subtractive modes when applying a second stockpile configuration on top of a first diff --git a/docs/plugins/confirm.rst b/docs/plugins/confirm.rst index f0a34b909..1e6270187 100644 --- a/docs/plugins/confirm.rst +++ b/docs/plugins/confirm.rst @@ -5,8 +5,9 @@ confirm :summary: Adds confirmation dialogs for destructive actions. :tags: fort interface -Now you can get the chance to avoid accidentally disbanding a squad or deleting a -hauling route in case you hit the key accidentally. +In the base game, it is frightenly easy to destroy hours of work with a single +misclick. Now you can avoid the consequences of accidentally disbanding a squad +(for example), or deleting a hauling route. Usage ----- diff --git a/plugins/lua/confirm.lua b/plugins/lua/confirm.lua index 13964645b..1ddf190b4 100644 --- a/plugins/lua/confirm.lua +++ b/plugins/lua/confirm.lua @@ -12,10 +12,11 @@ setmetatable(keys, { -- Mouse keys will be sent as a string instead of interface_key local MOUSE_LEFT = "MOUSE_LEFT" local MOUSE_RIGHT = "MOUSE_RIGHT" + --[[ The screen where a confirmation has been triggered Note that this is *not* necessarily the topmost viewscreen, so do not use gui.getCurViewscreen() or related functions. ]] -screen = nil +--screen = nil function if_nil(obj, default) if obj == nil then @@ -118,7 +119,9 @@ zone_remove.message = "Are you sure you want to remove this zone?" burrow_remove = defconf('burrow-remove') function burrow_remove.intercept_key(key) - return key == MOUSE_LEFT and df.global.game.main_interface.current_hover == 171 + return key == MOUSE_LEFT and + (df.global.game.main_interface.current_hover == 171 or + df.global.game.main_interface.current_hover == 168) end burrow_remove.title = "Remove burrow" burrow_remove.message = "Are you sure you want to remove this burrow?" From db45d20c237904d63a13a752bdce7c917374d3c1 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 28 Mar 2023 07:14:31 +0000 Subject: [PATCH 174/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index bb3dfc0d3..27089b81b 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit bb3dfc0d3e2bdebc4ba6fd814371662457b18917 +Subproject commit 27089b81be6f9de9486118a97a15be4dde09b1b3 From 147b0ba84ab39cd4b180cd5c8241656bdd11f78f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 28 Mar 2023 23:36:49 -0700 Subject: [PATCH 175/439] fix and extend Labels/CycleHotkeyLabels --- docs/changelog.txt | 3 +++ docs/dev/Lua API.rst | 4 ++-- library/lua/gui/widgets.lua | 12 ++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index f09fa8cc1..86ed0f148 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -72,6 +72,9 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``widget.Label``: tokens can now specify a ``htile`` property to indicate the tile that should be shown when the Label is hovered over with the mouse +- ``widget.Label``: click handlers no longer get the label itself as the first param to the click handler +- ``widget.CycleHotkeyLabel``: options that are bare integers will no longer be interpreted as the pen color in addition to being the label and value +- ``widget.CycleHotkeyLabel``: option labels and pens can now be functions that return a label or pen ## Removed diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 862c5bccc..2af9e39f1 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4901,8 +4901,8 @@ It has the following attributes: :label_below: If ``true``, then the option value will apear below the label instead of to the right of it. Defaults to ``false``. :options: A list of strings or tables of - ``{label=string, value=string[, pen=pen]}``. String options use the same - string for the label and value and the default pen. The optional ``pen`` + ``{label=string or fn, value=val[, pen=pen]}``. String options use the same + string for the label and value and use the default pen. The optional ``pen`` element could be a color like ``COLOR_RED``. :initial_option: The value or numeric index of the initial option. :on_change: The callback to call when the selected option changes. It is called diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index b5497f0d0..b33076cdc 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1361,11 +1361,11 @@ function Label:onInput(keys) return true end if keys._MOUSE_L_DOWN and self:getMousePos() and self.on_click then - self:on_click() + self.on_click() return true end if keys._MOUSE_R_DOWN and self:getMousePos() and self.on_rclick then - self:on_rclick() + self.on_rclick() return true end for k,v in pairs(self.scroll_keys) do @@ -1560,17 +1560,17 @@ function CycleHotkeyLabel:setOption(value_or_index, call_on_change) end end -local function cyclehotkeylabel_getOptionElem(self, option_idx, key) +local function cyclehotkeylabel_getOptionElem(self, option_idx, key, require_key) option_idx = option_idx or self.option_idx local option = self.options[option_idx] if type(option) == 'table' then return option[key] end - return option + return not require_key and option or nil end function CycleHotkeyLabel:getOptionLabel(option_idx) - return cyclehotkeylabel_getOptionElem(self, option_idx, 'label') + return getval(cyclehotkeylabel_getOptionElem(self, option_idx, 'label')) end function CycleHotkeyLabel:getOptionValue(option_idx) @@ -1578,7 +1578,7 @@ function CycleHotkeyLabel:getOptionValue(option_idx) end function CycleHotkeyLabel:getOptionPen(option_idx) - local pen = cyclehotkeylabel_getOptionElem(self, option_idx, 'pen') + local pen = getval(cyclehotkeylabel_getOptionElem(self, option_idx, 'pen', true)) if type(pen) == 'string' then return nil end return pen end From f2958a552901c5c04505af8b28f1638bd535868b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 28 Mar 2023 23:51:52 -0700 Subject: [PATCH 176/439] implement automaterial selection for buildingplan --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 6 +- plugins/buildingplan/buildingplan.h | 6 ++ plugins/buildingplan/defaultitemfilters.cpp | 10 ++-- plugins/buildingplan/defaultitemfilters.h | 6 +- plugins/lua/buildingplan/itemselection.lua | 61 +++++++++++++++++---- plugins/lua/buildingplan/planneroverlay.lua | 43 +++++++++++---- 7 files changed, 100 insertions(+), 33 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index f09fa8cc1..49c5bc0b5 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -53,6 +53,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: filters and global settings are now ignored when manually choosing items for a building - `buildingplan`: if `suspendmanager` is running, then planned buildings will be left suspended when their items are all attached. `suspendmanager` will unsuspsend them for construction when it is safe to do so. +- `buildingplan`: add option for autoselecting the last manually chosen item (like `automaterial` used to do) - `confirm`: adds confirmation for removing burrows via the repaint menu - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from - `stockpiles`: support partial application of a saved config based on dynamic filtering diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 11e08c2a0..7debbbf79 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -938,8 +938,10 @@ static int getMaterialFilter(lua_State *L) { return 1; } -static void setChooseItems(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, bool choose) { - DEBUG(status,out).print("entering setChooseItems\n"); +static void setChooseItems(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, int choose) { + DEBUG(status,out).print( + "entering setChooseItems building_type=%d subtype=%d custom=%d choose=%d\n", + type, subtype, custom, choose); BuildingTypeKey key(type, subtype, custom); auto &filters = get_item_filters(out, key); filters.setChooseItems(choose); diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 26aa77fbc..5c4f25aa4 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -42,6 +42,12 @@ enum HeatSafety { HEAT_SAFETY_MAGMA = 2, }; +enum ItemSelectionChoice { + ITEM_SELECTION_CHOICE_FILTER = 0, + ITEM_SELECTION_CHOICE_MANUAL = 1, + ITEM_SELECTION_CHOICE_AUTOMATERIAL = 2, +}; + int get_config_val(DFHack::PersistentDataItem &c, int index); bool get_config_bool(DFHack::PersistentDataItem &c, int index); void set_config_val(DFHack::PersistentDataItem &c, int index, int value); diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index ac0a4699e..35147579c 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -39,14 +39,14 @@ static string serialize(const std::vector &item_filters, const std:: } DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, const std::vector &jitems) - : key(key), choose_items(false) { + : key(key), choose_items(ItemSelectionChoice::ITEM_SELECTION_CHOICE_FILTER) { DEBUG(status,out).print("creating persistent data for filter key %d,%d,%d\n", std::get<0>(key), std::get<1>(key), std::get<2>(key)); filter_config = World::AddPersistentData(FILTER_CONFIG_KEY); set_config_val(filter_config, FILTER_CONFIG_TYPE, std::get<0>(key)); set_config_val(filter_config, FILTER_CONFIG_SUBTYPE, std::get<1>(key)); set_config_val(filter_config, FILTER_CONFIG_CUSTOM, std::get<2>(key)); - set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose_items); + set_config_val(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose_items); item_filters.resize(jitems.size()); for (size_t idx = 0; idx < jitems.size(); ++idx) { item_filters[idx].setMaxQuality(get_max_quality(jitems[idx]), true); @@ -56,7 +56,7 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &filter_config, const std::vector &jitems) : key(getKey(filter_config)), filter_config(filter_config) { - choose_items = get_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS); + choose_items = get_config_val(filter_config, FILTER_CONFIG_CHOOSE_ITEMS); auto &serialized = filter_config.val(); DEBUG(status,out).print("deserializing default item filters for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); @@ -81,9 +81,9 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &f } } -void DefaultItemFilters::setChooseItems(bool choose) { +void DefaultItemFilters::setChooseItems(int choose) { choose_items = choose; - set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose); + set_config_val(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose); } void DefaultItemFilters::setSpecial(const std::string &special, bool val) { diff --git a/plugins/buildingplan/defaultitemfilters.h b/plugins/buildingplan/defaultitemfilters.h index d7ed12a7b..7d285ce4c 100644 --- a/plugins/buildingplan/defaultitemfilters.h +++ b/plugins/buildingplan/defaultitemfilters.h @@ -14,17 +14,17 @@ public: DefaultItemFilters(DFHack::color_ostream &out, BuildingTypeKey key, const std::vector &jitems); DefaultItemFilters(DFHack::color_ostream &out, DFHack::PersistentDataItem &filter_config, const std::vector &jitems); - void setChooseItems(bool choose); + void setChooseItems(int choose); void setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index); void setSpecial(const std::string &special, bool val); - bool getChooseItems() const { return choose_items; } + int getChooseItems() const { return choose_items; } const std::vector & getItemFilters() const { return item_filters; } const std::set & getSpecials() const { return specials; } private: DFHack::PersistentDataItem filter_config; - bool choose_items; + int choose_items; std::vector item_filters; std::set specials; }; diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index 8134b9455..9cfe0f843 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -15,6 +15,12 @@ local BUILD_TEXT_HPEN = to_pen{fg=COLOR_WHITE, bg=COLOR_GREEN, keep_lower=true} -- most recent entries are at the *end* of the list local recently_used = {} +function get_automaterial_selection(building_type) + local tracker = recently_used[building_type] + if not tracker or not tracker.list then return end + return tracker.list[#tracker.list] +end + local function sort_by_type(a, b) local ad, bd = a.data, b.data return ad.item_type < bd.item_type or @@ -54,6 +60,7 @@ ItemSelection.ATTRS{ index=DEFAULT_NIL, desc=DEFAULT_NIL, quantity=DEFAULT_NIL, + autoselect=DEFAULT_NIL, on_submit=DEFAULT_NIL, on_cancel=DEFAULT_NIL, } @@ -63,34 +70,55 @@ function ItemSelection:init() self.selected_set = {} local plural = self.quantity == 1 and '' or 's' + local choices = self:get_choices(sort_by_recency) + + if self.autoselect then + self:do_autoselect(choices) + if self.num_selected >= self.quantity then + self:submit(choices) + return + end + end + self:addviews{ widgets.Label{ - frame={t=0, l=0, r=10}, + frame={t=0, l=0, r=16}, text={ - self.desc, - plural, - NEWLINE, + self.desc, plural, NEWLINE, ('Select up to %d item%s ('):format(self.quantity, plural), {text=function() return self.num_selected end}, ' selected)', }, }, widgets.Label{ - frame={r=0, w=11, t=0, h=3}, + frame={r=0, w=15, t=0, h=3}, text_pen=BUILD_TEXT_PEN, text_hpen=BUILD_TEXT_HPEN, text={ - ' ', NEWLINE, - ' Confirm ', NEWLINE, - ' ', + ' Use filter ', NEWLINE, + ' for remaining ', NEWLINE, + ' items ', }, on_click=self:callback('submit'), + visible=function() return self.num_selected < self.quantity end, + }, + widgets.Label{ + frame={r=0, w=15, t=0, h=3}, + text_pen=BUILD_TEXT_PEN, + text_hpen=BUILD_TEXT_HPEN, + text={ + ' ', NEWLINE, + ' Continue ', NEWLINE, + ' ', + }, + on_click=self:callback('submit'), + visible=function() return self.num_selected >= self.quantity end, }, widgets.FilteredList{ view_id='flist', frame={t=3, l=0, r=0, b=4}, case_sensitive=false, - choices=self:get_choices(sort_by_recency), + choices=choices, icon_width=2, on_submit=self:callback('toggle_group'), edit_on_char=function(ch) return ch:match('[%l -]') end, @@ -116,7 +144,7 @@ function ItemSelection:init() widgets.HotkeyLabel{ frame={l=22, b=1}, key='CUSTOM_SHIFT_C', - label='Confirm', + label='Continue', auto_width=true, on_activate=self:callback('submit'), }, @@ -215,6 +243,13 @@ function ItemSelection:get_choices(sort_fn) return choices end +function ItemSelection:do_autoselect(choices) + if #choices == 0 then return end + local desired = get_automaterial_selection(uibs.building_type) + if choices[1].search_key ~= desired then return end + self:toggle_group(1, choices[1]) +end + function ItemSelection:increment_group(idx, choice) local data = choice.data if self.quantity <= self.num_selected then return false end @@ -282,13 +317,13 @@ local function track_recently_used(choices) end end -function ItemSelection:submit() +function ItemSelection:submit(choices) local selected_items = {} for item_id in pairs(self.selected_set) do table.insert(selected_items, item_id) end if #selected_items > 0 then - track_recently_used(self.subviews.flist:getChoices()) + track_recently_used(choices or self.subviews.flist:getChoices()) end self.on_submit(selected_items) end @@ -328,6 +363,7 @@ ItemSelectionScreen.ATTRS { index=DEFAULT_NIL, desc=DEFAULT_NIL, quantity=DEFAULT_NIL, + autoselect=DEFAULT_NIL, on_submit=DEFAULT_NIL, on_cancel=DEFAULT_NIL, } @@ -338,6 +374,7 @@ function ItemSelectionScreen:init() index=self.index, desc=self.desc, quantity=self.quantity, + autoselect=self.autoselect, on_submit=self.on_submit, on_cancel=self.on_cancel, } diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 1ae7885cb..3c08597d3 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -490,12 +490,21 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel{ view_id='choose', - frame={b=0, l=0, w=25}, + frame={b=0, l=0}, key='CUSTOM_I', - label='Choose from items:', - options={{label='Yes', value=true}, - {label='No', value=false}}, - initial_option=false, + label='Item selection:', + options={ + {label='Use filters', value=0}, + { + label=function() + local automaterial = itemselection.get_automaterial_selection(uibs.building_type) + return ('Last choice (%s)'):format(automaterial or 'Will ask') + end, + value=2, + }, + {label='Manual choice', value=1}, + }, + initial_option=0, on_change=function(choose) buildingplan.setChooseItems(uibs.building_type, uibs.building_subtype, uibs.custom_type, choose) end, @@ -670,10 +679,11 @@ function PlannerOverlay:onInput(keys) if is_choosing_area() or cur_building_has_no_area() then local filters = get_cur_filters() local num_filters = #filters - local choose = self.subviews.choose - if choose:getOptionValue() then + local choose = self.subviews.choose:getOptionValue() + if choose > 0 then local bounds = get_selected_bounds() self:save_placement() + local autoselect = choose == 2 local is_hollow = self.subviews.hollow:getOptionValue() local chosen_items, active_screens = {}, {} local pending = num_filters @@ -681,14 +691,19 @@ function PlannerOverlay:onInput(keys) for idx = num_filters,1,-1 do chosen_items[idx] = {} local filter = filters[idx] - active_screens[idx] = itemselection.ItemSelectionScreen{ + local selection_screen = itemselection.ItemSelectionScreen{ index=idx, desc=require('plugins.buildingplan').get_desc(filter), quantity=get_quantity(filter, is_hollow, bounds), + autoselect=autoselect, on_submit=function(items) chosen_items[idx] = items - active_screens[idx]:dismiss() - active_screens[idx] = nil + if active_screens[idx] then + active_screens[idx]:dismiss() + active_screens[idx] = nil + else + active_screens[idx] = true + end pending = pending - 1 if pending == 0 then df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT @@ -702,7 +717,13 @@ function PlannerOverlay:onInput(keys) df.global.game.main_interface.bottom_mode_selected = df.main_bottom_mode_type.BUILDING_PLACEMENT self:restore_placement() end, - }:show() + } + if active_screens[idx] then + -- we've already returned via autoselect + active_screens[idx] = nil + else + active_screens[idx] = selection_screen:show() + end end else self:place_building(get_placement_data()) From 94728489524d682e26499e2cdecfbfaefb76be64 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 29 Mar 2023 07:03:34 +0000 Subject: [PATCH 177/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 27089b81b..71c58248e 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 27089b81be6f9de9486118a97a15be4dde09b1b3 +Subproject commit 71c58248e915b0ccf8ad090fd9a27bc5b9641883 From 12e7ae1207fc3792a266ccc4d8b306013dc14692 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 29 Mar 2023 00:29:44 -0700 Subject: [PATCH 178/439] sync tags from spreadsheet --- docs/plugins/getplants.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/getplants.rst b/docs/plugins/getplants.rst index 0a59f2492..05bac71c9 100644 --- a/docs/plugins/getplants.rst +++ b/docs/plugins/getplants.rst @@ -3,7 +3,7 @@ getplants .. dfhack-tool:: :summary: Designate trees for chopping and shrubs for gathering. - :tags: unavailable fort productivity plants + :tags: fort productivity plants Specify the types of trees to cut down and/or shrubs to gather by their plant names. From 0db93762cf495b589658e8d07ee9aa6ca608aef6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 29 Mar 2023 15:09:18 -0700 Subject: [PATCH 179/439] bounds check the choice data old forts that persisted data before this attribute existed will have an invalid value --- plugins/buildingplan/defaultitemfilters.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index 35147579c..069459841 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -57,6 +57,9 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &filter_config, const std::vector &jitems) : key(getKey(filter_config)), filter_config(filter_config) { choose_items = get_config_val(filter_config, FILTER_CONFIG_CHOOSE_ITEMS); + if (choose_items < ItemSelectionChoice::ITEM_SELECTION_CHOICE_FILTER || + choose_items > ItemSelectionChoice::ITEM_SELECTION_CHOICE_AUTOMATERIAL) + choose_items = ItemSelectionChoice::ITEM_SELECTION_CHOICE_FILTER; auto &serialized = filter_config.val(); DEBUG(status,out).print("deserializing default item filters for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); From 58cbed877b572bee210d0b3ebe98362b8aec25e1 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 30 Mar 2023 07:14:18 +0000 Subject: [PATCH 180/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 71c58248e..f6c4bc97e 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 71c58248e915b0ccf8ad090fd9a27bc5b9641883 +Subproject commit f6c4bc97ec50646b4dc813b0130025e0e0012382 From 7ff9d73a4cafa6fdd63dc208cbd988240fafa04a Mon Sep 17 00:00:00 2001 From: John Cosker Date: Thu, 30 Mar 2023 15:17:08 -0400 Subject: [PATCH 181/439] Technically drawing works --- plugins/CMakeLists.txt | 1 + plugins/design.cpp | 452 +++++++++++++++++++++++++++++++++++++++++ plugins/lua/design.lua | 9 + 3 files changed, 462 insertions(+) create mode 100644 plugins/design.cpp create mode 100644 plugins/lua/design.lua diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 477e83436..c880a89ff 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -77,6 +77,7 @@ set_source_files_properties( Brushes.h PROPERTIES HEADER_FILE_ONLY TRUE ) #dfhack_plugin(add-spatter add-spatter.cpp) dfhack_plugin(autobutcher autobutcher.cpp LINK_LIBRARIES lua) dfhack_plugin(autochop autochop.cpp LINK_LIBRARIES lua) +dfhack_plugin(design design.cpp LINK_LIBRARIES lua) dfhack_plugin(autoclothing autoclothing.cpp) dfhack_plugin(autodump autodump.cpp) dfhack_plugin(autofarm autofarm.cpp) diff --git a/plugins/design.cpp b/plugins/design.cpp new file mode 100644 index 000000000..25f876d3e --- /dev/null +++ b/plugins/design.cpp @@ -0,0 +1,452 @@ +#include +#include +#include +#include +#include +#include + +#include "ColorText.h" +#include "Debug.h" +#include "LuaTools.h" +#include "PluginManager.h" +#include "df/graphic_viewportst.h" +#include "df/world.h" +#include "modules/Persistence.h" +#include "modules/Screen.h" +#include "modules/World.h" + +DFHACK_PLUGIN("design"); +DFHACK_PLUGIN_IS_ENABLED(is_enabled); +using DFHack::color_value; + +REQUIRE_GLOBAL(window_x); +REQUIRE_GLOBAL(window_y); +REQUIRE_GLOBAL(world); +REQUIRE_GLOBAL(plotinfo); +using namespace DFHack; +using namespace df::enums; + +enum ConfigValues { + CONFIG_IS_ENABLED = 0, +}; +namespace DFHack { +// // for configuration-related logging +DBG_DECLARE(design, status, DebugCategory::LDEBUG); +// for logging during the periodic scan +DBG_DECLARE(design, cycle, DebugCategory::LDEBUG); +} // namespace DFHack +static const std::string CONFIG_KEY = std::string(plugin_name) + "/config"; +static PersistentDataItem config; +static const int32_t CYCLE_TICKS = 1200; +static int32_t cycle_timestamp = 0; // world->frame_counter at last cycle + +static command_result do_command(color_ostream &out, + std::vector ¶meters); +static int32_t do_cycle(color_ostream &out, bool force_designate = false); + +DFhackCExport command_result plugin_init(color_ostream &out, + std::vector &commands) { + DEBUG(status, out).print("initializing %s\n", plugin_name); + + // provide a configuration interface for the plugin + commands.push_back( + PluginCommand(plugin_name, "Designs stuff TBD", do_command)); + + return CR_OK; +} + +static int get_config_val(PersistentDataItem &c, int index) { + if (!c.isValid()) return -1; + return c.ival(index); +} + +static bool get_config_bool(PersistentDataItem &c, int index) { + return get_config_val(c, index) == 1; +} + +static void set_config_val(PersistentDataItem &c, int index, int value) { + if (c.isValid()) c.ival(index) = value; +} + +static void set_config_bool(PersistentDataItem &c, int index, bool value) { + set_config_val(c, index, value ? 1 : 0); +} + +DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) { + if (!Core::getInstance().isWorldLoaded()) { + out.printerr("Cannot enable %s without a loaded world.\n", plugin_name); + + return CR_FAILURE; + } + + if (enable != is_enabled) { + is_enabled = enable; + DEBUG(status, out) + .print("%s from the API; persisting\n", + is_enabled ? "enabled" : "disabled"); + set_config_bool(config, CONFIG_IS_ENABLED, is_enabled); + if (enable) do_cycle(out, true); + } else { + DEBUG(status, out) + .print("%s from the API, but already %s; no action\n", + is_enabled ? "enabled" : "disabled", + is_enabled ? "enabled" : "disabled"); + } + return CR_OK; +} + +DFhackCExport command_result plugin_shutdown(color_ostream &out) { + DEBUG(status, out).print("shutting down %s\n", plugin_name); + + return CR_OK; +} + +DFhackCExport command_result plugin_load_data(color_ostream &out) { + cycle_timestamp = 0; + config = World::GetPersistentData(CONFIG_KEY); + + if (!config.isValid()) { + DEBUG(status, out).print("no config found in this save; initializing\n"); + config = World::AddPersistentData(CONFIG_KEY); + set_config_bool(config, CONFIG_IS_ENABLED, is_enabled); + } + + // we have to copy our enabled flag into the global plugin variable, but + // all the other state we can directly read/modify from the persistent + // data structure. + is_enabled = get_config_bool(config, CONFIG_IS_ENABLED); + DEBUG(status, out) + .print("loading persisted enabled state: %s\n", + is_enabled ? "true" : "false"); + + return CR_OK; +} + +DFhackCExport command_result plugin_onstatechange(color_ostream &out, + state_change_event event) { + if (event == DFHack::SC_WORLD_UNLOADED) { + if (is_enabled) { + DEBUG(status, out).print("world unloaded; disabling %s\n", plugin_name); + is_enabled = false; + } + } + + return CR_OK; +} + +DFhackCExport command_result plugin_onupdate(color_ostream &out) { + if (is_enabled && world->frame_counter - cycle_timestamp >= CYCLE_TICKS) { + int32_t ret = do_cycle(out); + } + + return CR_OK; +} +int selected_tile_texpos = 0; +const static bool hi = + Screen::findGraphicsTile("CURSORS", 4, 3, &selected_tile_texpos); + +static command_result do_command(color_ostream &out, + std::vector ¶meters) { + return CR_OK; +} + +static int32_t do_cycle(color_ostream &out, bool force_designate) { return 0; } + +// Assuming the existence of a class named Point, similar to the one in Lua +class Point { + public: + int x; + int y; + + Point(int x, int y) : x(x), y(y) {} + + bool operator==(const Point &other) const { + return x == other.x && y == other.y; + } +}; + +// Assuming the existence of a class named Color, similar to the one in Lua +class Color { + public: + // Define your color values here +}; + +// Assuming the existence of a class named Pen, similar to the one in Lua +class Pen { + public: + std::string ch; + int tile; + color_value fg; + // Define your pen properties and methods here +}; + +class Design { + public: + std::map PENS; + + enum PEN_MASK { + NORTH = 0, + SOUTH, + EAST, + WEST, + DRAG_POINT, + MOUSEOVER, + INSHAPE, + EXTRA_POINT, + NUM_FLAGS + }; + + // Define the function similar to the Lua version + + uint32_t gen_pen_key(bool n, bool s, bool e, bool w, bool is_corner, + bool is_mouse_over, bool inshape, bool extra_point) { + std::bitset ret; + ret[NORTH] = n; + ret[SOUTH] = s; + ret[EAST] = e; + ret[WEST] = w; + ret[DRAG_POINT] = is_corner; + ret[MOUSEOVER] = is_mouse_over; + ret[INSHAPE] = inshape; + ret[EXTRA_POINT] = extra_point; + + return static_cast(ret.to_ulong()); + } + + Pen Design::get_pen(int x, int y, + const std::map> &arr); + // Define the function similar to the Lua version +}; + +Design design; + +// Add other methods and member variables needed for the class + +static int design_getPen(lua_State *L) { + std::map> arr; + if (lua_istable(L, -1)) { + // Iterate over the outer table + lua_pushnil(L); // First key + while (lua_next(L, -2) != 0) { + int x = lua_tointeger(L, -2); // Convert key to an integer + + if (lua_istable(L, -1)) { + // Iterate over the inner table + lua_pushnil(L); // First key + while (lua_next(L, -2) != 0) { + int y = lua_tointeger(L, -2); // Convert key to an integer + bool value = lua_toboolean(L, -1); + + if (value) { + if (arr.count(x) == 0) arr[x] = {}; + arr[x][y] = value; + } + lua_pop(L, 1); // Remove value, keep the key for the next iteration + } + } + lua_pop(L, 1); // Remove inner table, keep the key for the next iteration + } + } + + for (auto x : arr) { + for (auto y : x.second) { + Screen::Pen cur_tile = Screen::readTile(x.first, y.first, true); + // cur_tile.tile = selected_tile_texpos; + Pen pen = design.get_pen(x.first, y.first, arr); + cur_tile.tile = pen.tile; + Screen::paintTile(cur_tile, x.first - *window_x, y.first - *window_y, + true); + } + } + return 0; +} +enum class CURSORS { + INSIDE, + NORTH, + N_NUB, + S_NUB, + W_NUB, + E_NUB, + NE, + NW, + WEST, + EAST, + SW, + SOUTH, + SE, + VERT_NS, + VERT_EW, + POINT +}; + +std::map> CURSORS_MAP = { + {CURSORS::INSIDE, {1, 2}}, {CURSORS::NORTH, {1, 1}}, + {CURSORS::N_NUB, {3, 2}}, {CURSORS::S_NUB, {4, 2}}, + {CURSORS::W_NUB, {3, 1}}, {CURSORS::E_NUB, {5, 1}}, + {CURSORS::NE, {2, 1}}, {CURSORS::NW, {0, 1}}, + {CURSORS::WEST, {0, 2}}, {CURSORS::EAST, {2, 2}}, + {CURSORS::SW, {0, 3}}, {CURSORS::SOUTH, {1, 3}}, + {CURSORS::SE, {2, 3}}, {CURSORS::VERT_NS, {3, 3}}, + {CURSORS::VERT_EW, {4, 1}}, {CURSORS::POINT, {4, 3}}, +}; +Pen make_pen(const std::pair &direction, bool is_corner, + bool is_mouse_over, bool inshape, bool extra_point) { + color_value color = COLOR_GREEN; + int ycursor_mod = 0; + + if (!extra_point) { + if (is_corner) { + color = COLOR_CYAN; + ycursor_mod += 6; + if (is_mouse_over) { + color = COLOR_MAGENTA; + ycursor_mod += 3; + } + } + } else { + ycursor_mod += 15; + color = COLOR_LIGHTRED; + + if (is_mouse_over) { + color = COLOR_RED; + ycursor_mod += 3; + } + } + + Pen pen; + pen.ch = inshape ? "X" : "o"; + pen.fg = color; + int selected_tile_texpos = 0; + Screen::findGraphicsTile("CURSORS", direction.first, direction.second, &selected_tile_texpos); + pen.tile = selected_tile_texpos; + + // Assuming dfhack.screen.findGraphicsTile is replaced with a custom function + // findGraphicsTile pen.tile = findGraphicsTile("CURSORS", direction.first, + // direction.second + ycursor_mod); + + return pen; +} +Pen Design::get_pen(int x, int y, + const std::map> &arr) { + auto has_point = [&arr](int _x, int _y) { + return arr.count(_x) != 0 && arr.at(_x).count(_y) != 0 && arr.at(_x).at(_y); + }; + bool get_point = has_point(x, y); + + // Basic shapes are bounded by rectangles and therefore can have corner drag + // points even if they're not real points in the shape if (marks.size() >= + // shape.min_points && shape.basic_shape) { + // Point shape_top_left, shape_bot_right; + // shape.get_point_dims(shape_top_left, shape_bot_right); + + // if (x == shape_top_left.x && y == shape_top_left.y && + // shape.drag_corners.nw) { + // drag_point = true; + // } else if (x == shape_bot_right.x && y == shape_top_left.y && + // shape.drag_corners.ne) { + // drag_point = true; + // } else if (x == shape_top_left.x && y == shape_bot_right.y && + // shape.drag_corners.sw) { + // drag_point = true; + // } else if (x == shape_bot_right.x && y == shape_bot_right.y && + // shape.drag_corners.se) { + // drag_point = true; + // } + // } + + // for (const auto& mark : marks) { + // if (mark == Point(x, y)) { + // drag_point = true; + // } + // } + + // if (mirror_point && *mirror_point == Point(x, y)) { + // drag_point = true; + // } + + // // Check for an extra point + // bool extra_point = false; + // for (const auto& point : extra_points) { + // if (x == point.x && y == point.y) { + // extra_point = true; + // break; + // } + // } + + // // Show center point if both marks are set + // if ((shape.basic_shape && marks.size() == shape.max_points) || + // (!shape.basic_shape && !placing_mark.active && !marks.empty())) { + // int center_x, center_y; + // shape.get_center(center_x, center_y); + + // if (x == center_x && y == center_y) { + // extra_point = true; + // } + // } + + bool n = false, w = false, e = false, s = false; + if (get_point) { + if (y == 0 || !has_point(x, y - 1)) n = true; + if (x == 0 || !has_point(x - 1, y)) w = true; + if (!has_point(x + 1, y)) e = true; + if (!has_point(x, y + 1)) s = true; + } + // DEBUG(status).print("jcosker %d %d %d %d\n", n, s, e, w); + + // Get the bit field to use as a key for the PENS map + uint32_t pen_key = gen_pen_key(n, s, e, w, false, false, get_point, false); + // DEBUG(status).print("jcosker %zu\n", pen_key); + + if (PENS.find(pen_key) == PENS.end()) { + std::pair cursor{-1, -1}; + // int cursor = -1; // Assuming -1 is an invalid cursor value + + // Determine the cursor to use based on the input parameters + // The CURSORS enum or equivalent should be defined in your code + if (get_point && !n && !w && !e && !s) + cursor = CURSORS_MAP.at(CURSORS::INSIDE); + else if (get_point && n && w && !e && !s) + cursor = CURSORS_MAP.at(CURSORS::NW); + else if (get_point && n && !w && !e && !s) + cursor = CURSORS_MAP.at(CURSORS::NORTH); + else if (get_point && n && e && !w && !s) + cursor = CURSORS_MAP.at(CURSORS::NE); + else if (get_point && !n && w && !e && !s) + cursor = CURSORS_MAP.at(CURSORS::WEST); + else if (get_point && !n && !w && e && !s) + cursor = CURSORS_MAP.at(CURSORS::EAST); + else if (get_point && !n && w && !e && s) + cursor = CURSORS_MAP.at(CURSORS::SW); + else if (get_point && !n && !w && !e && s) + cursor = CURSORS_MAP.at(CURSORS::SOUTH); + else if (get_point && !n && !w && e && s) + cursor = CURSORS_MAP.at(CURSORS::SE); + else if (get_point && n && w && e && !s) + cursor = CURSORS_MAP.at(CURSORS::N_NUB); + else if (get_point && n && !w && e && s) + cursor = CURSORS_MAP.at(CURSORS::E_NUB); + else if (get_point && n && w && !e && s) + cursor = CURSORS_MAP.at(CURSORS::W_NUB); + else if (get_point && !n && w && e && s) + cursor = CURSORS_MAP.at(CURSORS::S_NUB); + else if (get_point && !n && w && e && !s) + cursor = CURSORS_MAP.at(CURSORS::VERT_NS); + else if (get_point && n && !w && !e && s) + cursor = CURSORS_MAP.at(CURSORS::VERT_EW); + else if (get_point && n && w && e && s) + cursor = CURSORS_MAP.at(CURSORS::POINT); + // else if (drag_point && !get_point) cursor = CURSORS::INSIDE; + // else if (extra_point) cursor = CURSORS::INSIDE; + // Create the pen if the cursor is set + + DEBUG(status).print("jcosker %d, %d\n", cursor.first, cursor.second); + if (cursor.first != -1) { + PENS[pen_key] = make_pen(cursor, false, false, get_point, false); + } + } + + // Return the pen for the caller + return PENS.at(pen_key); +} + +DFHACK_PLUGIN_LUA_COMMANDS{DFHACK_LUA_COMMAND(design_getPen), DFHACK_LUA_END}; diff --git a/plugins/lua/design.lua b/plugins/lua/design.lua new file mode 100644 index 000000000..fe916aa41 --- /dev/null +++ b/plugins/lua/design.lua @@ -0,0 +1,9 @@ +local _ENV = mkmodule('plugins.design') + +view2 = {design_window = { name = "hello"}} + +function getPen(hi) + design_getPen(hi) +end + +return _ENV From 0771fddcd3ff1fdc3474ba5571fa25df93bd9135 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 31 Mar 2023 07:13:59 +0000 Subject: [PATCH 182/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index f6c4bc97e..2cb58469e 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit f6c4bc97ec50646b4dc813b0130025e0e0012382 +Subproject commit 2cb58469e0696111d8a29a2d3ce0ca585d29b3f5 From 44adae24abaea4400962eb693401017f0769934c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 31 Mar 2023 04:45:59 -0700 Subject: [PATCH 183/439] fix items not being filtered correctly in item selection screen --- plugins/buildingplan/buildingplan.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 7debbbf79..81b5feaae 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -678,13 +678,14 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ auto other_id = ENUM_ATTR(job_item_vector_id, other, vector_id); for (auto &item : df::global::world->items.other[other_id]) { ItemFilter filter = filters[index]; - if (counts) { + set special = specials; + if (ignore_filters || counts) { // don't filter by material; we want counts for all materials filter.setMaterialMask(0); filter.setMaterials(set()); + special.clear(); } - if (itemPassesScreen(item) && - (ignore_filters || matchesFilters(item, jitem, heat, filter, specials))) { + if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter, specials)) { if (item_ids) item_ids->emplace_back(item->id); if (counts) { From 99e2e596c08635ad83d6b4997552622abdbdce9b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 31 Mar 2023 04:47:54 -0700 Subject: [PATCH 184/439] use normalized specials vector --- plugins/buildingplan/buildingplan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 81b5feaae..eb765c1c4 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -685,7 +685,7 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ filter.setMaterials(set()); special.clear(); } - if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter, specials)) { + if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter, special)) { if (item_ids) item_ids->emplace_back(item->id); if (counts) { From 38d4eea7acc54dc7f6aa540bd9833c21a3a5363d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 31 Mar 2023 05:02:02 -0700 Subject: [PATCH 185/439] bump to 50.07-beta2 --- CMakeLists.txt | 2 +- docs/changelog.txt | 47 +++++++++++++++++++++++++++++----------------- library/xml | 2 +- scripts | 2 +- 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 790e8f59b..dfb6dfb21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "beta1") +set(DFHACK_RELEASE "beta2") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/docs/changelog.txt b/docs/changelog.txt index 790e0a2ea..3fe5fdbbb 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,29 +34,45 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins -- `getplants`: getplants is now available -- `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time. + +## Fixes + +## Misc Improvements + +## Documentation + +## API + +## Lua + +## Removed + +# 50.07-beta2 + +## New Plugins +- `getplants`: designate trees for chopping and shrubs for gathering according to type +- `prospector`: get stone, ore, gem, and other tile property counts in fort mode. embark site estimates are not yet available. ## Fixes - `buildingplan`: filters are now properly applied to planned stairs - `buildingplan`: existing carved up/down stairs are now taken into account when determining which stair shape to construct - `buildingplan`: upright spike traps are now placed extended rather than retracted -- `buildingplan`: you can no longer designate constructions on tiles with magma or deep water -- `buildingplan`: fixed material filter getting lost for planning buildings on save/reload +- `buildingplan`: you can no longer designate constructions on tiles with magma or deep water, mirroring the vanilla restrictions +- `buildingplan`: fixed material filters getting lost for planning buildings on save/reload - `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) -- `tailor`: properly discriminates between dyed and undyed cloth -- `tailor`: no longer defaults to using adamantine -- `tailor`: properly tracks material requirements for already queued orders -- `tailor`: skips units who can't wear clothes -- `tailor`: hopefully won't over-order items any more +- `tailor`: properly discriminate between dyed and undyed cloth +- `tailor`: no longer default to using adamantine cloth for producing clothes +- `tailor`: take queued orders into account when calculating available materials +- `tailor`: skip units who can't wear clothes +- `tailor`: identify more available items as available, solving issues with over-production ## Misc Improvements -- `buildingplan`: filters and global settings are now ignored when manually choosing items for a building +- `buildingplan`: filters and global settings are now ignored when manually choosing items for a building, allowing you to make custom choices independently of the filters that would otherwise be used - `buildingplan`: if `suspendmanager` is running, then planned buildings will be left suspended when their items are all attached. `suspendmanager` will unsuspsend them for construction when it is safe to do so. - `buildingplan`: add option for autoselecting the last manually chosen item (like `automaterial` used to do) - `confirm`: adds confirmation for removing burrows via the repaint menu - `stockpiles`: support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from -- `stockpiles`: support partial application of a saved config based on dynamic filtering +- `stockpiles`: support partial application of a saved config based on dynamic filtering (e.g. disable all tallow in a food stockpile, even tallow from world-specific generated creatures) - `stockpiles`: additive and subtractive modes when applying a second stockpile configuration on top of a first - `stockpiles`: write player-exported stockpile configurations to the ``dfhack-config/stockpiles`` folder. If you have any stockpile configs in other directories, please move them to that folder. - `stockpiles`: now includes a library of useful stockpile configs (see docs for details) @@ -64,12 +80,11 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `orders`: add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen - `orders`: add option to delete exported files from the import dialog - `enable`: can now interpret aliases defined with the `alias` command -- scripts in installed mods are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod's folder: ``scripts_modinstalled/`` and ``scripts_modactive/``. ``scripts_modinstalled/`` folders will always be added the script path, regardless of whether the mod is active in a world. ``scripts_modactive/`` folders will only be added to the script path when the mod is active in the current loaded world. +- scripts in ``data/installed mods/`` subfolders are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod's folder: ``scripts_modinstalled/`` and ``scripts_modactive/``. ``scripts_modinstalled/`` folders will always be added the script path, regardless of whether the mod is active in a world. ``scripts_modactive/`` folders will only be added to the script path when the mod is active in the current loaded world. ## Documentation -- ``untested`` tag has been renamed to ``unavailable`` to better reflect the status of the remaining unavaialable tools. all of the simply "untested" tools have now been tested and marked as working. the remaining tools are known to need development work before they are available again. - -## API +- `modding-guide`: guide updated to include information for 3rd party script developers +- the ``untested`` tag has been renamed to ``unavailable`` to better reflect the status of the remaining unavaialable tools. most of the simply "untested" tools have now been tested and marked as working. the remaining tools are known to need development work before they are available again. ## Lua - ``widget.Label``: tokens can now specify a ``htile`` property to indicate the tile that should be shown when the Label is hovered over with the mouse @@ -77,8 +92,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - ``widget.CycleHotkeyLabel``: options that are bare integers will no longer be interpreted as the pen color in addition to being the label and value - ``widget.CycleHotkeyLabel``: option labels and pens can now be functions that return a label or pen -## Removed - # 50.07-beta1 ## Fixes diff --git a/library/xml b/library/xml index 8b8ac2de0..739d17867 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 8b8ac2de03ab5f8e5506864a751933059abfd03e +Subproject commit 739d1786723bbe912f448064c5705092a7936cc6 diff --git a/scripts b/scripts index 2cb58469e..0b55c5418 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 2cb58469e0696111d8a29a2d3ce0ca585d29b3f5 +Subproject commit 0b55c5418970917310bfd437499adfac0be80e0e From 18f1b5c675b99ec067f6423f326e49300908491a Mon Sep 17 00:00:00 2001 From: TaxiService Date: Fri, 31 Mar 2023 17:33:23 +0200 Subject: [PATCH 186/439] attempt#2 to fix masterwork/exceptional/decorated symbols this time we're using a couple of `static_cast(...)` thingies --- library/modules/Items.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index bfdd525be..9c1217c93 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -720,13 +720,13 @@ df::coord Items::getPosition(df::item *item) return item->pos; } -static char quality_table[] = { 0, '-', '+', '*', '=', '@' }; +static int quality_table[] = { 0, 45, 43, 42, 240, 15 }; static void addQuality(std::string &tmp, int quality) { if (quality > 0 && quality <= 5) { - char c = quality_table[quality]; - tmp = c + tmp + c; + int c = quality_table[quality]; + tmp = static_cast(c) + tmp + static_cast(c); } } @@ -825,7 +825,7 @@ std::string Items::getDescription(df::item *item, int type, bool decorate) addQuality(tmp, item->getQuality()); if (item->isImproved()) { - tmp = "<" + tmp + ">"; + tmp = static_cast(174) + tmp + static_cast(175); addQuality(tmp, item->getImprovementQuality()); } } From 51236f90fa79a1ef810bdea4574f86ffda5cbc0a Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Fri, 31 Mar 2023 21:05:19 -0500 Subject: [PATCH 187/439] update steam launcher this version launches dwarf fortress via the steam client the existing one doesn't set up the steam app context which means access to DF's steam workshop is broken. launching through the steam client avoids this issue. --- docs/changelog.txt | 1 + package/windows/launchdf.c | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 3fe5fdbbb..279acdef7 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- Steam launcher now launches Dwarf Fortress via the Steam client ## Misc Improvements diff --git a/package/windows/launchdf.c b/package/windows/launchdf.c index 9f4b01fcb..588624511 100644 --- a/package/windows/launchdf.c +++ b/package/windows/launchdf.c @@ -2,15 +2,28 @@ int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) { - STARTUPINFOA si; + STARTUPINFOW si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - if (CreateProcessA("Dwarf Fortress.exe", - NULL, + WCHAR steamPath[1024]; + DWORD datasize = 1024; + + LONG retCode = RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam", L"SteamExe", RRF_RT_REG_SZ, NULL, &steamPath, &datasize); + + if (retCode != ERROR_SUCCESS) + { + MessageBoxW(NULL, L"Could not find Steam client executable", NULL, 0); + exit(1); + } + + WCHAR commandLine[1024] = L"steam.exe -applaunch 975370"; + + if (CreateProcessW(steamPath, + commandLine, NULL, NULL, FALSE, @@ -20,7 +33,7 @@ int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) &si, &pi) == 0) { - MessageBoxA(NULL, "could not launch 'Dwarf Fortress.exe'", NULL, 0); + MessageBoxW(NULL, L"could not launch Dwarf Fortress", NULL, 0); exit(1); } From 92438ed98c39fe18510bbd2c78d12de87fc29aa3 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 1 Apr 2023 02:26:16 +0000 Subject: [PATCH 188/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 0b55c5418..298d9c00c 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 0b55c5418970917310bfd437499adfac0be80e0e +Subproject commit 298d9c00c7df81fc4ca363366dbaebf7f47be489 From d13dfd7d496cf45a5a56e5951457efb4ed9a5e70 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 31 Mar 2023 19:29:01 -0700 Subject: [PATCH 189/439] interpret shrubbery as floor instead of wall --- docs/changelog.txt | 3 ++- plugins/blueprint.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 279acdef7..b34e66aaa 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,7 +36,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes -- Steam launcher now launches Dwarf Fortress via the Steam client +- ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional +- `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls ## Misc Improvements diff --git a/plugins/blueprint.cpp b/plugins/blueprint.cpp index b09c4d497..39847935d 100644 --- a/plugins/blueprint.cpp +++ b/plugins/blueprint.cpp @@ -229,6 +229,9 @@ static const char * get_tile_dig(const df::coord &pos, const tile_context &) { case tiletype_shape::BOULDER: case tiletype_shape::PEBBLES: case tiletype_shape::BROOK_TOP: + case tiletype_shape::SAPLING: + case tiletype_shape::SHRUB: + case tiletype_shape::TWIG: return "d"; case tiletype_shape::STAIR_UP: return "u"; From 3a6893de53ee3994aa68641dd8b49a423ff617ab Mon Sep 17 00:00:00 2001 From: TaxiService Date: Sat, 1 Apr 2023 16:43:05 +0200 Subject: [PATCH 190/439] attempt to increase code readability following lethosor and myk's suggestions, each symbol now is its own constant with a descriptive name. ...will it work though? --- library/modules/Items.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index 9c1217c93..75951aaa5 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -720,13 +720,18 @@ df::coord Items::getPosition(df::item *item) return item->pos; } -static int quality_table[] = { 0, 45, 43, 42, 240, 15 }; +static const char MARKER_EXCEPTIONAL = static_cast(240); +static const char MARKER_MASTERWORK = static_cast(15); +static const char MARKER_IMPROVED_LEFT = static_cast(174); +static const char MARKER_IMPROVED_RIGHT = static_cast(175); + +static char quality_table[] = { 0, '-', '+', '*', MARKER_EXCEPTIONAL, MARKER_MASTERWORK }; static void addQuality(std::string &tmp, int quality) { if (quality > 0 && quality <= 5) { - int c = quality_table[quality]; - tmp = static_cast(c) + tmp + static_cast(c); + char c = quality_table[quality]; + tmp = c + tmp + c; } } @@ -825,7 +830,7 @@ std::string Items::getDescription(df::item *item, int type, bool decorate) addQuality(tmp, item->getQuality()); if (item->isImproved()) { - tmp = static_cast(174) + tmp + static_cast(175); + tmp = MARKER_IMPROVED_LEFT + tmp + MARKER_IMPROVED_RIGHT; addQuality(tmp, item->getImprovementQuality()); } } From e3bab1eb6b0c464d33b2a0f981d1e0b645eb1759 Mon Sep 17 00:00:00 2001 From: TaxiService Date: Sat, 1 Apr 2023 23:40:45 +0200 Subject: [PATCH 191/439] simplifying character definition even more removed those pesky superfluous consts and casts... --- library/modules/Items.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index 75951aaa5..5a34d7385 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -720,12 +720,7 @@ df::coord Items::getPosition(df::item *item) return item->pos; } -static const char MARKER_EXCEPTIONAL = static_cast(240); -static const char MARKER_MASTERWORK = static_cast(15); -static const char MARKER_IMPROVED_LEFT = static_cast(174); -static const char MARKER_IMPROVED_RIGHT = static_cast(175); - -static char quality_table[] = { 0, '-', '+', '*', MARKER_EXCEPTIONAL, MARKER_MASTERWORK }; +static char quality_table[] = { 0, '-', '+', '*', '\xF0', '\x0F' }; static void addQuality(std::string &tmp, int quality) { @@ -830,7 +825,7 @@ std::string Items::getDescription(df::item *item, int type, bool decorate) addQuality(tmp, item->getQuality()); if (item->isImproved()) { - tmp = MARKER_IMPROVED_LEFT + tmp + MARKER_IMPROVED_RIGHT; + tmp = '\xAE' + tmp + '\xAF'; addQuality(tmp, item->getImprovementQuality()); } } From 8d8a4abd13e96c17214dfb84fcbb94ab77f87b9e Mon Sep 17 00:00:00 2001 From: TaxiService Date: Sun, 2 Apr 2023 02:33:09 +0200 Subject: [PATCH 192/439] reverted loss of readability --- library/modules/Items.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index 5a34d7385..303f9771e 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -720,7 +720,13 @@ df::coord Items::getPosition(df::item *item) return item->pos; } -static char quality_table[] = { 0, '-', '+', '*', '\xF0', '\x0F' }; +// These '\xFF' chars refer to quality markers from curses.png, namely: 250 (≡), 15 (☼), 174 («) and 175 (»). +static const char MARKER_EXCEPTIONAL = '\xF0'; +static const char MARKER_MASTERWORK = '\x0F'; +static const char MARKER_IMPROVED_LEFT = '\xAE'; +static const char MARKER_IMPROVED_RIGHT = '\xAF'; + +static char quality_table[] = { 0, '-', '+', '*', MARKER_EXCEPTIONAL, MARKER_MASTERWORK }; static void addQuality(std::string &tmp, int quality) { @@ -825,7 +831,7 @@ std::string Items::getDescription(df::item *item, int type, bool decorate) addQuality(tmp, item->getQuality()); if (item->isImproved()) { - tmp = '\xAE' + tmp + '\xAF'; + tmp = MARKER_IMPROVED_LEFT + tmp + MARKER_IMPROVED_RIGHT; addQuality(tmp, item->getImprovementQuality()); } } From 5846c3fc12d2021509e501d4d0da10abaa55d0cf Mon Sep 17 00:00:00 2001 From: Myk Date: Sat, 1 Apr 2023 22:11:38 -0700 Subject: [PATCH 193/439] Update changelog.txt --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index b34e66aaa..6dde716b3 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,6 +40,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls ## Misc Improvements +- `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game ## Documentation From 9461e609a0a9ea23ecd9b4088c14c7aface63d33 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 1 Apr 2023 22:53:35 -0700 Subject: [PATCH 194/439] adjust text margin in hotkey menu for wide scrollbar --- docs/changelog.txt | 1 + plugins/lua/hotkeys.lua | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b34e66aaa..6ad97f8fa 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar - ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls diff --git a/plugins/lua/hotkeys.lua b/plugins/lua/hotkeys.lua index 0eb09d244..e8121fded 100644 --- a/plugins/lua/hotkeys.lua +++ b/plugins/lua/hotkeys.lua @@ -107,7 +107,7 @@ local function get_bindings_to_hotkeys(hotkeys, bindings) end -- number of non-text tiles: icon, space, space between cmd and hk, scrollbar -local LIST_BUFFER = 2 + 1 + 1 +local LIST_BUFFER = 2 + 1 + 1 + 2 local function get_choices(hotkeys, bindings, is_inverted) local choices, max_width, seen = {}, 0, {} @@ -143,7 +143,7 @@ local function get_choices(hotkeys, bindings, is_inverted) -- adjust width of command fields so the hotkey tokens are right justified for _,choice in ipairs(choices) do local command_token = choice.text[1] - command_token.width = max_width - choice.hk_width - 3 + command_token.width = max_width - choice.hk_width - 5 end return choices, max_width From 55f7643381f973ddb19e3be93f08c4bcfb26160a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 1 Apr 2023 23:50:14 -0700 Subject: [PATCH 195/439] use the defined constant instead of a magic number --- plugins/lua/hotkeys.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/lua/hotkeys.lua b/plugins/lua/hotkeys.lua index e8121fded..8edb70073 100644 --- a/plugins/lua/hotkeys.lua +++ b/plugins/lua/hotkeys.lua @@ -106,8 +106,8 @@ local function get_bindings_to_hotkeys(hotkeys, bindings) return bindings_to_hotkeys end --- number of non-text tiles: icon, space, space between cmd and hk, scrollbar -local LIST_BUFFER = 2 + 1 + 1 + 2 +-- number of non-text tiles: icon, space between cmd and hk, scrollbar+margin +local LIST_BUFFER = 2 + 1 + 3 local function get_choices(hotkeys, bindings, is_inverted) local choices, max_width, seen = {}, 0, {} @@ -143,7 +143,7 @@ local function get_choices(hotkeys, bindings, is_inverted) -- adjust width of command fields so the hotkey tokens are right justified for _,choice in ipairs(choices) do local command_token = choice.text[1] - command_token.width = max_width - choice.hk_width - 5 + command_token.width = max_width - choice.hk_width - (LIST_BUFFER - 1) end return choices, max_width From 40a6d968bf4425eb8b1ee355aa2c9e784186372e Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sun, 2 Apr 2023 07:12:31 +0000 Subject: [PATCH 196/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 298d9c00c..d2dad272e 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 298d9c00c7df81fc4ca363366dbaebf7f47be489 +Subproject commit d2dad272e4b24c043ca62f843511c763fb1f67b5 From f8de51aba3bd8710c59203e16bce50cb1f6e95ec Mon Sep 17 00:00:00 2001 From: silverflyone Date: Tue, 4 Apr 2023 03:08:43 +1000 Subject: [PATCH 197/439] Update Buildings.cpp Fixes #3159. Valid map coordinates from (0, 0, 0) to (world->map.x_count - 1, world->map.y_count - 1, world->map.z_count - 1). Stockpile coords (x1, y1, z) to (x2, y2, z) may lie outside of this region. Use min of (0, 0) and max of (world->map.x_count - 1, world->map.y_count - 1) when iterating the block. --- library/modules/Buildings.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 2b6fc8ec8..8a71485b2 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -1637,17 +1637,17 @@ StockpileIterator& StockpileIterator::operator++() { ++current; } else { // Start with the top-left block covering the stockpile. - block = Maps::getTileBlock(stockpile->x1, stockpile->y1, stockpile->z); + block = Maps::getTileBlock(std::min(std::max(stockpile->x1, 0), world->map.x_count-1), std::min(std::max(stockpile->y1, 0), world->map.y_count-1), stockpile->z); current = 0; } while (current >= block->items.size()) { // Out of items in this block; find the next block to search. - if (block->map_pos.x + 16 <= stockpile->x2) { - block = Maps::getTileBlock(block->map_pos.x + 16, block->map_pos.y, stockpile->z); + if (std::max(block->map_pos.x + 16, 0) <= std::min(std::max(stockpile->x2, 0), world->map.x_count-1)) { + block = Maps::getTileBlock(std::min(std::max(block->map_pos.x + 16, 0), world->map.x_count-1), block->map_pos.y, stockpile->z); current = 0; - } else if (block->map_pos.y + 16 <= stockpile->y2) { - block = Maps::getTileBlock(stockpile->x1, block->map_pos.y + 16, stockpile->z); + } else if (std::max(block->map_pos.y + 16, 0) <= std::min(std::max(stockpile->y2, 0), world->map.y_count-1)) { + block = Maps::getTileBlock(std::min(std::max(stockpile->x1, 0), world->map.x_count-1), std::min(std::max(block->map_pos.y + 16, 0), world->map.y_count-1), stockpile->z); current = 0; } else { // All items in all blocks have been checked. From 181f0bdf720f85f29c3c159b7f77d70b00dc22cc Mon Sep 17 00:00:00 2001 From: silverflyone Date: Tue, 4 Apr 2023 03:27:32 +1000 Subject: [PATCH 198/439] Update Buildings.cpp Boundary checks added. --- library/modules/Buildings.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 8a71485b2..172975e21 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -1635,6 +1635,12 @@ StockpileIterator& StockpileIterator::operator++() { if (block) { // Check the next item in the current block. ++current; + } + else if (stockpile->x2 < 0 || stockpile->y2 < 0 || stockpile->z < 0 || stockpile->x1 > world->map.x_count - 1 || stockpile->y1 > world->map.y_count - 1 || stockpile->z > world->map.z_count - 1) { + // if the stockpile bounds exist outside of valid map plane then no items can be in the stockpile + block = NULL; + item = NULL; + return *this; } else { // Start with the top-left block covering the stockpile. block = Maps::getTileBlock(std::min(std::max(stockpile->x1, 0), world->map.x_count-1), std::min(std::max(stockpile->y1, 0), world->map.y_count-1), stockpile->z); From 7c63ea9394e4222cd03dde1b3d30f8069e752689 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 20:13:57 +0200 Subject: [PATCH 199/439] added BOLD_FRAME and INTERIOR_MEDIUM_FRAME --- data/art/border-bold.png | Bin 0 -> 836 bytes docs/dev/Lua API.rst | 17 ++++++++++++++--- library/LuaApi.cpp | 1 + library/include/modules/Textures.h | 1 + library/lua/gui.lua | 3 +++ library/modules/Textures.cpp | 7 +++++++ 6 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 data/art/border-bold.png diff --git a/data/art/border-bold.png b/data/art/border-bold.png new file mode 100644 index 0000000000000000000000000000000000000000..16423a3a7477fd94d1e27a45f0f91b2f6f28af84 GIT binary patch literal 836 zcmV-K1H1f*P)3>q_IhpTDzpXQV0Ya?T#%Xxr4<(f~1J)^xK_v z@@{6{+>ARL0>0vIZ+Q3ioA>jZnai?lapBheUis|74G}Nf!?XRecX0F*&y&gI>$|+a zx`5|zpO5f)Z(|Jm#(FWj{^Ub}b*I7cWb9m*3gz3)r_I9gUN}m;wc6gW6r#Zj5dBrr zgpNR&M&70tTt0+>W*viH}Jt$jww56!b)+K_TRg8Rz#8txYu7Rov6doV85+(tm zzsi!#qr0!>gvj-j*Uj?bz#Yu@kLFc(qpScAd6wI>0ok7nDBBmAJ~~qj+HfU8&$h+C zv>|2aWBaJh3TPiNr%6Jf$}zOkDM~;6Q>p8*Ujyu=WbD!Z(<9-18i9MR?h-};GAoOHFC$XbICkwsN*rO)9eZ;l(Wt-^G z@ohKun8|L4V?fAO8Aisp^IRWIUYS7;eHj%L4-HFpu4nAX$e^$^%;2M((8*5q@!sv> znTNv4z43|In!5A~ia3c55(Y-_0)vloqM_LO9-=L|ORvD_7&lfkqhU;Tst=T&tdsj? zPlysq;a7Qvz@0FXW%E%ti5!3B&ik^yDXy^o!zE0WHbUsD@lNHB00RKGR=gVn;~Fyn O0000 Date: Mon, 3 Apr 2023 20:37:45 +0200 Subject: [PATCH 200/439] fixed vertical divider characters in ascii mode --- plugins/lua/buildingplan/pens.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index 973bb7bc6..ed8f393d6 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -19,8 +19,8 @@ function reload_pens() local tb_texpos = dfhack.textures.getThinBordersTexposStart() VERT_TOP_PEN = to_pen{tile=tp(tb_texpos, 10), ch=194, fg=COLOR_GREY, bg=COLOR_BLACK} - VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=192, fg=COLOR_GREY, bg=COLOR_BLACK} - VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} + VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} + VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=193, fg=COLOR_GREY, bg=COLOR_BLACK} local cp_texpos = dfhack.textures.getControlPanelTexposStart() BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} From d04780ee86d6038b6a9f52abe2a17efa25cea5d9 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 20:38:57 +0200 Subject: [PATCH 201/439] tweaked some item names shown on buildingplan uis --- plugins/lua/buildingplan.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index a33c1684f..2de467f7c 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -103,6 +103,14 @@ function get_desc(filter) desc = 'Mechanism' elseif desc == 'Wood' then desc = 'Log' + elseif desc == 'Any weapon' then + desc = 'Weapon' + elseif desc == 'Any spike' then + desc = 'Spike' + elseif desc == 'Ballistapart' then + desc = 'Ballista part' + elseif desc == 'Catapultpart' then + desc = 'Catapult part' end return desc From 57146c527a04be2cf8ceb2cbbbfb4f2539a9ac69 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 21:20:45 +0200 Subject: [PATCH 202/439] added changelog entry --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index b0b86c4cd..522ed00c0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,6 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua +- `gui`: added two new window borders, "BOLD_FRAME" and "INTERIOR_MEDIUM_FRAME" ## Removed From 4dc7b3cc43fc7b2bbf97781f2d6f081b7c3ab827 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 21:25:59 +0200 Subject: [PATCH 203/439] attempt to make changelog entry work --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 522ed00c0..d85231266 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,7 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua -- `gui`: added two new window borders, "BOLD_FRAME" and "INTERIOR_MEDIUM_FRAME" +- `widget`: added two new window borders, ``BOLD_FRAME`` and ``INTERIOR_MEDIUM_FRAME`` ## Removed From 3628f8c5545ad190620705311c33f84fa772c969 Mon Sep 17 00:00:00 2001 From: TaxiService Date: Mon, 3 Apr 2023 21:29:24 +0200 Subject: [PATCH 204/439] Update docs/changelog.txt YES PLS Co-authored-by: Myk --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index d85231266..ff9d05b0f 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,7 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua -- `widget`: added two new window borders, ``BOLD_FRAME`` and ``INTERIOR_MEDIUM_FRAME`` +- added two new window borders: ``gui.BOLD_FRAME`` for accented elements and ``gui.INTERIOR_MEDIUM_FRAME`` for a signature-less frame that's thicker than the existing ``gui.INTERIOR_FRAME`` ## Removed From 07a4da65736df10b07b36d7f8c70eec7a7b42969 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 22:23:32 +0200 Subject: [PATCH 205/439] reworked itemselection ui & added vertical divider pens --- docs/changelog.txt | 1 + plugins/lua/buildingplan/itemselection.lua | 81 ++++++++++++---------- plugins/lua/buildingplan/pens.lua | 6 ++ 3 files changed, 52 insertions(+), 36 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b0b86c4cd..dd1a29e28 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game +- `buildingplan`: rearranged elements of ``itemselection`` interface ## Documentation diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index 9cfe0f843..dfb77d1fd 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -55,7 +55,7 @@ end ItemSelection = defclass(ItemSelection, widgets.Window) ItemSelection.ATTRS{ frame_title='Choose items', - frame={w=56, h=20, l=4, t=8}, + frame={w=56, h=24, l=4, t=7}, resizable=true, index=DEFAULT_NIL, desc=DEFAULT_NIL, @@ -114,17 +114,8 @@ function ItemSelection:init() on_click=self:callback('submit'), visible=function() return self.num_selected >= self.quantity end, }, - widgets.FilteredList{ - view_id='flist', - frame={t=3, l=0, r=0, b=4}, - case_sensitive=false, - choices=choices, - icon_width=2, - on_submit=self:callback('toggle_group'), - edit_on_char=function(ch) return ch:match('[%l -]') end, - }, widgets.CycleHotkeyLabel{ - frame={l=0, b=2}, + frame={l=1, t=3}, key='CUSTOM_SHIFT_R', label='Sort by:', options={ @@ -134,53 +125,71 @@ function ItemSelection:init() }, on_change=self:callback('on_sort'), }, - widgets.HotkeyLabel{ - frame={l=0, b=1}, - key='SELECT', - label='Use all/none', - auto_width=true, - on_activate=function() self:toggle_group(self.subviews.flist.list:getSelected()) end, + widgets.FilteredList{ + view_id='flist', + frame={t=5, l=1, r=1, b=5}, + case_sensitive=false, + choices=choices, + icon_width=2, + on_submit=self:callback('toggle_group'), + edit_on_char=function(ch) return ch:match('[%l -]') end, }, - widgets.HotkeyLabel{ - frame={l=22, b=1}, - key='CUSTOM_SHIFT_C', - label='Continue', - auto_width=true, - on_activate=self:callback('submit'), + widgets.Label{ + frame={l=1, t=5}, + text_pen=COLOR_LIGHTCYAN, + text={">"}, }, - widgets.HotkeyLabel{ - frame={l=38, b=1}, - key='LEAVESCREEN', - label='Go back', - auto_width=true, - on_activate=self:callback('on_cancel'), + widgets.Panel{ + frame={l=0, t=6, r=0, b=4}, + frame_style=gui.INTERIOR_FRAME, }, widgets.HotkeyLabel{ - frame={l=0, b=0}, + frame={l=0, b=2}, key='KEYBOARD_CURSOR_RIGHT_FAST', - key_sep=' : ', + key_sep='ight: ', label='Use one', auto_width=true, on_activate=function() self:increment_group(self.subviews.flist.list:getSelected()) end, }, widgets.Label{ - frame={l=6, b=0, w=5}, + frame={l=6, b=2, w=5}, text_pen=COLOR_LIGHTGREEN, text='Right', }, widgets.HotkeyLabel{ - frame={l=23, b=0}, + frame={l=1, b=1}, key='KEYBOARD_CURSOR_LEFT_FAST', - key_sep=' : ', + key_sep='eft: ', label='Use one fewer', auto_width=true, on_activate=function() self:decrement_group(self.subviews.flist.list:getSelected()) end, }, widgets.Label{ - frame={l=29, b=0, w=4}, + frame={l=7, b=1, w=4}, text_pen=COLOR_LIGHTGREEN, text='Left', }, + widgets.HotkeyLabel{ + frame={l=6, b=0}, + key='SELECT', + label='Use all/none', + auto_width=true, + on_activate=function() self:toggle_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.HotkeyLabel{ + frame={r=5, b=2}, + key='LEAVESCREEN', + label='Go back', + auto_width=true, + on_activate=self:callback('on_cancel'), + }, + widgets.HotkeyLabel{ + frame={r=4, b=0}, + key='CUSTOM_SHIFT_C', + label='Continue', + auto_width=true, + on_activate=self:callback('submit'), + }, } end @@ -234,7 +243,7 @@ function ItemSelection:get_choices(sort_fn) for desc,choice in pairs(buckets) do local data = choice.data choice.text = { - {width=10, text=function() return ('[%d/%d]'):format(data.selected, data.quantity) end}, + {width=10, text=function() return ('%d/%d'):format(data.selected, data.quantity) end}, {gap=2, text=desc}, } table.insert(choices, choice) diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index 973bb7bc6..288aea0db 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -2,6 +2,7 @@ local _ENV = mkmodule('plugins.buildingplan.pens') GOOD_TILE_PEN, BAD_TILE_PEN = nil, nil VERT_TOP_PEN, VERT_MID_PEN, VERT_BOT_PEN = nil, nil, nil +HORI_LEFT_PEN, HORI_MID_PEN, HORI_RIGHT_PEN = nil, nil, nil BUTTON_START_PEN, BUTTON_END_PEN = nil, nil SELECTED_ITEM_PEN = nil MINIMIZED_LEFT_PEN, MINIMIZED_RIGHT_PEN = nil, nil @@ -22,6 +23,11 @@ function reload_pens() VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=192, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} + local mb_texpos = dfhack.textures.getMediumBordersTexposStart() + HORI_LEFT_PEN = to_pen{tile=tp(mb_texpos, 12), ch=195, fg=COLOR_GREY, bg=COLOR_BLACK} + HORI_MID_PEN = to_pen{tile=tp(mb_texpos, 5), ch=196, fg=COLOR_GREY, bg=COLOR_BLACK} + HORI_RIGHT_PEN = to_pen{tile=tp(mb_texpos, 13), ch=180, fg=COLOR_GREY, bg=COLOR_BLACK} + local cp_texpos = dfhack.textures.getControlPanelTexposStart() BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} BUTTON_END_PEN = to_pen{tile=tp(cp_texpos, 15), ch=']', fg=COLOR_YELLOW} From ea9f3ef9d1a743945b29c4d70fcbb628cb579cfb Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 22:27:50 +0200 Subject: [PATCH 206/439] restored pens.lua (has nothing to do with itemselection) --- plugins/lua/buildingplan/pens.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index 288aea0db..973bb7bc6 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -2,7 +2,6 @@ local _ENV = mkmodule('plugins.buildingplan.pens') GOOD_TILE_PEN, BAD_TILE_PEN = nil, nil VERT_TOP_PEN, VERT_MID_PEN, VERT_BOT_PEN = nil, nil, nil -HORI_LEFT_PEN, HORI_MID_PEN, HORI_RIGHT_PEN = nil, nil, nil BUTTON_START_PEN, BUTTON_END_PEN = nil, nil SELECTED_ITEM_PEN = nil MINIMIZED_LEFT_PEN, MINIMIZED_RIGHT_PEN = nil, nil @@ -23,11 +22,6 @@ function reload_pens() VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=192, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} - local mb_texpos = dfhack.textures.getMediumBordersTexposStart() - HORI_LEFT_PEN = to_pen{tile=tp(mb_texpos, 12), ch=195, fg=COLOR_GREY, bg=COLOR_BLACK} - HORI_MID_PEN = to_pen{tile=tp(mb_texpos, 5), ch=196, fg=COLOR_GREY, bg=COLOR_BLACK} - HORI_RIGHT_PEN = to_pen{tile=tp(mb_texpos, 13), ch=180, fg=COLOR_GREY, bg=COLOR_BLACK} - local cp_texpos = dfhack.textures.getControlPanelTexposStart() BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} BUTTON_END_PEN = to_pen{tile=tp(cp_texpos, 15), ch=']', fg=COLOR_YELLOW} From 8860ddf9828a6a9d4aa67fcc0ddcb08f52fa5137 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Mon, 3 Apr 2023 22:46:31 +0200 Subject: [PATCH 207/439] planneroverlay: initial rework commit --- docs/changelog.txt | 1 + plugins/lua/buildingplan/pens.lua | 15 +- plugins/lua/buildingplan/planneroverlay.lua | 167 +++++++++++++------- 3 files changed, 119 insertions(+), 64 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index ff9d05b0f..b20e103c2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game +- `buildingplan`: rearranged elements of ``planneroverlay`` interface ## Documentation diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index ed8f393d6..e69a4c210 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -2,9 +2,10 @@ local _ENV = mkmodule('plugins.buildingplan.pens') GOOD_TILE_PEN, BAD_TILE_PEN = nil, nil VERT_TOP_PEN, VERT_MID_PEN, VERT_BOT_PEN = nil, nil, nil +HORI_LEFT_PEN, HORI_MID_PEN, HORI_RIGHT_PEN = nil, nil, nil BUTTON_START_PEN, BUTTON_END_PEN = nil, nil SELECTED_ITEM_PEN = nil -MINIMIZED_LEFT_PEN, MINIMIZED_RIGHT_PEN = nil, nil +MINI_TEXT_PEN, MINI_TEXT_HPEN, MINI_BUTT_PEN, MINI_BUTT_HPEN = nil, nil, nil, nil local to_pen = dfhack.pen.parse @@ -22,14 +23,20 @@ function reload_pens() VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=193, fg=COLOR_GREY, bg=COLOR_BLACK} + local mb_texpos = dfhack.textures.getMediumBordersTexposStart() + HORI_LEFT_PEN = to_pen{tile=tp(mb_texpos, 12), ch=195, fg=COLOR_GREY, bg=COLOR_BLACK} + HORI_MID_PEN = to_pen{tile=tp(mb_texpos, 5), ch=196, fg=COLOR_GREY, bg=COLOR_BLACK} + HORI_RIGHT_PEN = to_pen{tile=tp(mb_texpos, 13), ch=180, fg=COLOR_GREY, bg=COLOR_BLACK} + local cp_texpos = dfhack.textures.getControlPanelTexposStart() BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} BUTTON_END_PEN = to_pen{tile=tp(cp_texpos, 15), ch=']', fg=COLOR_YELLOW} SELECTED_ITEM_PEN = to_pen{tile=tp(cp_texpos, 9), ch=string.char(251), fg=COLOR_YELLOW} - local wb_texpos = dfhack.textures.getWindowBordersTexposStart() - MINIMIZED_LEFT_PEN = to_pen{tile=tp(wb_texpos, 0), ch=199, fg=COLOR_WHITE} - MINIMIZED_RIGHT_PEN = to_pen{tile=tp(wb_texpos, 2), ch=182, fg=COLOR_WHITE} + MINI_TEXT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_GREY} + MINI_TEXT_HPEN = to_pen{fg=COLOR_BLACK, bg=COLOR_WHITE} + MINI_BUTT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_LIGHTRED} + MINI_BUTT_HPEN = to_pen{fg=COLOR_WHITE, bg=COLOR_RED} end reload_pens() diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 3c08597d3..8c67b59f5 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -207,20 +207,29 @@ ItemLine.ATTRS{ } function ItemLine:init() - self.frame.h = 1 + --self.frame.h = 2 self.visible = function() return #get_cur_filters() >= self.idx end self:addviews{ widgets.Label{ - frame={t=0, l=0}, - text='*', - auto_width=true, + frame={t=0, l=1}, + text=string.char(26), + --auto_width=true, visible=self.is_selected_fn, }, + widgets.Label{ + frame={t=0, l=2}, + text={ + {text=self:callback('get_item_line_text')}, + --{text='[filter]', pen=self:callback('get_f_pen')}, + --{text='[x]', pen=self:callback('get_x_pen')}, + }, + }, widgets.Label{ frame={t=0, l=25}, text={ - {tile=pens.BUTTON_START_PEN}, - {gap=6, tile=pens.BUTTON_END_PEN}, + --{tile=pens.BUTTON_START_PEN}, + --{gap=6, tile=pens.BUTTON_END_PEN}, + {text='[filter]', pen=self:callback('get_f_pen')}, }, auto_width=true, on_click=function() self.on_filter(self.idx) end, @@ -228,19 +237,17 @@ function ItemLine:init() widgets.Label{ frame={t=0, l=33}, text={ - {tile=pens.BUTTON_START_PEN}, - {gap=1, tile=pens.BUTTON_END_PEN}, + --{tile=pens.BUTTON_START_PEN}, + --{gap=1, tile=pens.BUTTON_END_PEN}, + {text='[x]', pen=self:callback('get_x_pen')}, }, auto_width=true, on_click=function() self.on_clear_filter(self.idx) end, }, widgets.Label{ - frame={t=0, l=2}, + frame={t=1, l=2}, text={ - {width=21, text=self:callback('get_item_line_text')}, - {gap=3, text='filter', pen=COLOR_GREEN}, - {gap=2, text='x', pen=self:callback('get_x_pen')}, - {gap=3, text=function() return self.note end, + {gap=2, text=function() return self.note end, pen=function() return self.note_pen end}, }, }, @@ -259,9 +266,13 @@ function ItemLine:onInput(keys) return ItemLine.super.onInput(self, keys) end +function ItemLine:get_f_pen() + return self.is_selected_fn and COLOR_LIGHTCYAN or COLOR_CYAN +end + function ItemLine:get_x_pen() return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) and - COLOR_GREEN or COLOR_GREY + COLOR_LIGHTRED or COLOR_BLACK end function ItemLine:get_item_line_text() @@ -276,13 +287,13 @@ function ItemLine:get_item_line_text() uibs.building_type, uibs.building_subtype, uibs.custom_type, idx - 1) if self.available >= quantity then self.note_pen = COLOR_GREEN - self.note = 'Available now' + self.note = string.char(192)..' Available now' else - self.note_pen = COLOR_YELLOW - self.note = 'Will link later' + self.note_pen = COLOR_BROWN + self.note = string.char(192)..' Will link later' end - return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and '' or 's') + return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and ' of ' or 's of ') end function ItemLine:reduce_quantity(used_quantity) @@ -307,10 +318,10 @@ end PlannerOverlay = defclass(PlannerOverlay, overlay.OverlayWidget) PlannerOverlay.ATTRS{ - default_pos={x=5,y=9}, + default_pos={x=5,y=8}, default_enabled=true, viewscreens='dwarfmode/Building/Placement', - frame={w=56, h=20}, + frame={w=56, h=22}, } function PlannerOverlay:init() @@ -319,31 +330,32 @@ function PlannerOverlay:init() local main_panel = widgets.Panel{ view_id='main', - frame={t=0, l=0, r=0, h=14}, - frame_style=gui.MEDIUM_FRAME, + frame={t=1, l=0, r=0, h=14}, + frame_style=gui.INTERIOR_MEDIUM_FRAME, frame_background=gui.CLEAR_PEN, visible=function() return not self.minimized end, } local minimized_panel = widgets.Panel{ - frame={t=0, r=0, w=4, h=1}, + frame={t=0, r=1, w=17, h=1}, subviews={ widgets.Label{ - frame={t=0, l=0, w=1, h=1}, - text={{tile=pens.MINIMIZED_LEFT_PEN}}, + frame={t=0, r=0, h=1}, + text={ + {text=' show Planner ', pen=pens.MINI_TEXT_PEN, hpen=pens.MINI_TEXT_HPEN}, + {text='['..string.char(31)..']', pen=pens.MINI_BUTT_PEN, hpen=pens.MINI_BUTT_HPEN}, + }, visible=function() return self.minimized end, - }, - widgets.Label{ - frame={t=0, l=1, w=2, h=1}, - text=string.char(31)..string.char(30), - text_pen=dfhack.pen.parse{fg=COLOR_BLACK, bg=COLOR_GREY}, - text_hpen=dfhack.pen.parse{fg=COLOR_BLACK, bg=COLOR_WHITE}, on_click=function() self.minimized = not self.minimized end, }, widgets.Label{ - frame={t=0, r=0, w=1, h=1}, - text={{tile=pens.MINIMIZED_RIGHT_PEN}}, - visible=function() return self.minimized end, + frame={t=0, r=0, h=1}, + text={ + {text=' hide Planner ', pen=pens.MINI_TEXT_PEN, hpen=pens.MINI_TEXT_HPEN}, + {text='['..string.char(30)..']', pen=pens.MINI_BUTT_PEN, hpen=pens.MINI_BUTT_HPEN}, + }, + visible=function() return not self.minimized end, + on_click=function() self.minimized = not self.minimized end, }, }, } @@ -387,7 +399,7 @@ function PlannerOverlay:init() on_clear_filter=self:callback('clear_filter')}, widgets.CycleHotkeyLabel{ view_id='hollow', - frame={t=3, l=4}, + frame={b=4, l=1, w=19}, key='CUSTOM_H', label='Hollow area:', visible=is_construction, @@ -398,7 +410,7 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel{ view_id='stairs_top_subtype', - frame={t=4, l=4}, + frame={b=5, l=23, w=28}, key='CUSTOM_R', label='Top Stair Type: ', visible=is_stairs, @@ -410,7 +422,7 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel { view_id='stairs_bottom_subtype', - frame={t=5, l=4}, + frame={b=4, l=23, w=28}, key='CUSTOM_B', label='Bottom Stair Type:', visible=is_stairs, @@ -422,17 +434,28 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel { view_id='weapons', - frame={t=5, l=4}, + frame={b=4, l=1, w=22}, key='CUSTOM_T', key_back='CUSTOM_SHIFT_T', - label='Num weapons:', + label='# of weapons:', visible=is_weapon_or_spike_trap, - options={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + options={ + {label='(1)', value=1, pen=COLOR_YELLOW}, + {label='(2)', value=2, pen=COLOR_YELLOW}, + {label='(3)', value=3, pen=COLOR_YELLOW}, + {label='(4)', value=4, pen=COLOR_YELLOW}, + {label='(5)', value=5, pen=COLOR_YELLOW}, + {label='(6)', value=6, pen=COLOR_YELLOW}, + {label='(7)', value=7, pen=COLOR_YELLOW}, + {label='(8)', value=8, pen=COLOR_YELLOW}, + {label='(9)', value=9, pen=COLOR_YELLOW}, + {label='(10)', value=10, pen=COLOR_YELLOW}, + }, on_change=function(val) weapon_quantity = val end, }, widgets.ToggleHotkeyLabel { view_id='engraved', - frame={t=5, l=4}, + frame={b=4, l=1, w=22}, key='CUSTOM_T', label='Engraved only:', visible=is_slab, @@ -441,7 +464,8 @@ function PlannerOverlay:init() end, }, widgets.Label{ - frame={b=3, l=17}, + frame={b=2, l=25}, + text_pen=dfhack.pen.parse{fg=COLOR_DARKGREY}, text={ 'Selected area: ', {text=function() @@ -457,29 +481,29 @@ function PlannerOverlay:init() visible=function() return #get_cur_filters() > 0 end, subviews={ widgets.HotkeyLabel{ - frame={b=1, l=0}, - key='STRING_A042', + frame={b=2, l=1}, + key='CUSTOM_SHIFT_Q', auto_width=true, enabled=function() return #get_cur_filters() > 1 end, on_activate=function() self.selected = ((self.selected - 2) % #get_cur_filters()) + 1 end, }, widgets.HotkeyLabel{ - frame={b=1, l=1}, - key='STRING_A047', - label='Prev/next item', + frame={b=2, l=2}, + key='CUSTOM_Q', + label='Prev/next', auto_width=true, enabled=function() return #get_cur_filters() > 1 end, on_activate=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, }, widgets.HotkeyLabel{ - frame={b=1, l=21}, + frame={b=1, l=1}, key='CUSTOM_F', label='Set filter', auto_width=true, on_activate=function() self:set_filter(self.selected) end, }, widgets.HotkeyLabel{ - frame={b=1, l=37}, + frame={b=0, l=1}, key='CUSTOM_X', label='Clear filter', auto_width=true, @@ -490,19 +514,20 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel{ view_id='choose', - frame={b=0, l=0}, - key='CUSTOM_I', - label='Item selection:', + frame={b=0, l=23}, + key='CUSTOM_Z', + label='Choose items:', + label_below=true, options={ - {label='Use filters', value=0}, + {label='with Filters', value=0}, { label=function() local automaterial = itemselection.get_automaterial_selection(uibs.building_type) - return ('Last choice (%s)'):format(automaterial or 'Will ask') + return ('Last used (%s)'):format(automaterial or 'n/a') end, value=2, }, - {label='Manual choice', value=1}, + {label='Manually', value=1}, }, initial_option=0, on_change=function(choose) @@ -511,7 +536,7 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel{ view_id='safety', - frame={b=0, l=29, w=25}, + frame={b=2, l=23, w=25}, key='CUSTOM_G', label='Building safety:', options={ @@ -529,23 +554,30 @@ function PlannerOverlay:init() }, } + local divider_widget = widgets.Panel{ + view_id='divider', + frame={t=10, l=0, r=0, h=1}, + on_render=self:callback('draw_divider_h'), + visible=function() return not self.minimized end, + } + local error_panel = widgets.ResizingPanel{ view_id='errors', - frame={t=14, l=0, r=0}, - frame_style=gui.MEDIUM_FRAME, + frame={t=15, l=0, r=0}, + frame_style=gui.BOLD_FRAME, frame_background=gui.CLEAR_PEN, visible=function() return not self.minimized end, } error_panel:addviews{ widgets.WrappedLabel{ - frame={t=0, l=0, r=0}, + frame={t=0, l=1, r=0}, text_pen=COLOR_LIGHTRED, text_to_wrap=get_placement_errors, visible=function() return #uibs.errors > 0 end, }, widgets.Label{ - frame={t=0, l=0, r=0}, + frame={t=0, l=1, r=0}, text_pen=COLOR_GREEN, text='OK to build', visible=function() return #uibs.errors == 0 end, @@ -556,9 +588,24 @@ function PlannerOverlay:init() main_panel, minimized_panel, error_panel, + divider_widget, } end +function PlannerOverlay:draw_divider_h(dc) + local x2 = dc.width -1 + for x=0,x2 do + dc:seek(x, 0) + if x == 0 then + dc:char(nil, pens.HORI_LEFT_PEN) + elseif x == x2 then + dc:char(nil, pens.HORI_RIGHT_PEN) + else + dc:char(nil, pens.HORI_MID_PEN) + end + end +end + function PlannerOverlay:reset() self.subviews.item1:reset() self.subviews.item2:reset() From 824f7ed038066ea5a3c2666eb489e8518cdbc830 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Tue, 4 Apr 2023 00:08:01 +0200 Subject: [PATCH 208/439] clean up Items.cpp quality symbols definitions --- library/modules/Items.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index 303f9771e..03d6cda4a 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -720,13 +720,14 @@ df::coord Items::getPosition(df::item *item) return item->pos; } -// These '\xFF' chars refer to quality markers from curses.png, namely: 250 (≡), 15 (☼), 174 («) and 175 (»). -static const char MARKER_EXCEPTIONAL = '\xF0'; -static const char MARKER_MASTERWORK = '\x0F'; -static const char MARKER_IMPROVED_LEFT = '\xAE'; -static const char MARKER_IMPROVED_RIGHT = '\xAF'; - -static char quality_table[] = { 0, '-', '+', '*', MARKER_EXCEPTIONAL, MARKER_MASTERWORK }; +static const char quality_table[] = { + '\0', // (base) + '-', // well-crafted + '+', // finely-crafted + '*', // superior quality + '\xF0', // (≡) exceptional + '\x0F' // (☼) masterful +}; static void addQuality(std::string &tmp, int quality) { @@ -831,7 +832,7 @@ std::string Items::getDescription(df::item *item, int type, bool decorate) addQuality(tmp, item->getQuality()); if (item->isImproved()) { - tmp = MARKER_IMPROVED_LEFT + tmp + MARKER_IMPROVED_RIGHT; + tmp = '\xAE' + tmp + '\xAF'; // («) + tmp + (») addQuality(tmp, item->getImprovementQuality()); } } From cf847109ce84f87047dd1c8620b01edacd57b930 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 3 Apr 2023 15:59:42 -0700 Subject: [PATCH 209/439] read mods from all mod dirs and only use most recent versions --- docs/Core.rst | 37 ++++++++---- docs/changelog.txt | 2 + docs/guides/modding-guide.rst | 26 ++++---- library/Core.cpp | 58 +++--------------- library/LuaApi.cpp | 8 +-- library/lua/script-manager.lua | 106 +++++++++++++++++++++++++++++++++ 6 files changed, 154 insertions(+), 83 deletions(-) diff --git a/docs/Core.rst b/docs/Core.rst index c06a413da..5decd668d 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -243,18 +243,31 @@ For example, if ``teleport`` is run, these folders are searched in order for Scripts in installed mods ......................... -Script directories in installed mods are automatically added to the script path -according to the following rules: - -**If a world is not loaded**, then directories matching the pattern -``data/installed_mods/*/scripts_modinstalled/`` are added to the script path -in alphabetical order. - -**If a world is loaded**, then the ``scripts_modactive`` directories of active -mods are also added to the script path according to the active mod load order, -and scripts in active mods take precedence over scripts in -``scripts_modinstalled`` in non-active mods. For example, the search paths for -mods might look like this:: +Scripts in mods are automatically added to the script path. The following +directories are searched for mods:: + + ../../workshop/content/975370/ (the DF Steam workshop directory) + mods/ + data/installed_mods/ + +Each mod can have two directories that contain scripts: + +- ``scripts_modactive/`` is added to the script path if and only if the mod is + active in the loaded world. +- ``scripts_modinstalled/`` is added to the script path as long as the mod is + installed in one of the searched mod directories. + +Multiple versions of a mod may be installed at the same time. If a mod is +active in a loaded world, then the scripts for the version of the mod that is +active will be added to the script path. Otherwise, the latest version of each +mod is added to the script path. + +Scripts for active mods take precedence according to their load order when you +generated the current world. + +Scripts for non-active mods are ordered by their containing mod's ID. + +For example, the search paths for mods might look like this:: activemod_last_in_load_order/scripts_modactive activemod_last_in_load_order/scripts_modinstalled diff --git a/docs/changelog.txt b/docs/changelog.txt index b0b86c4cd..c63168dca 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game +- Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game +- Mods: scripts from only the most recent version of an installed mod are added to the script path ## Documentation diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index b386b48c3..0c9513fef 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -77,8 +77,11 @@ Let's go through that line by line. If you develop your mod using version control (recommended!), that :file:`README.md` file can also serve as your git repository documentation. -These files end up in a subdirectory under :file:`data/installed_mods/` when -the mod is selected as "active" for the first time. +These files end up in a subdirectory under :file:`mods/` when players copy them +in or install them from the +`Steam Workshop `__, and in +:file:`data/installed_mods/` when the mod is selected as "active" for the first +time. What if I just want to distribute a simple script? -------------------------------------------------- @@ -95,13 +98,6 @@ DFHack to find it and add your mod to the `script-paths`. Your script will be runnable from the title screen and in any loaded world, regardless of whether your mod is explicitly "active". -Be sure to remind players to mark your mod as "active" at least once so it gets -installed to the :file:`data/installed_mods/` folder. They may have to create a -new world just so they can mark the mod as "active". This is true both for -players who copied the mod into the :file:`mods/` folder manually and for -players who subscribed via -`Steam Workshop `__. - A mod-maker's development environment ------------------------------------- @@ -109,11 +105,11 @@ Create a folder for development somewhere outside your Dwarf Fortress installation directory (e.g. ``/path/to/mymods/``). If you work on multiple mods, you might want to make a subdirectory for each mod. -If you have changes to the raws, you'll have to copy them into DF's ``data/ -installed_mods/`` folder to have them take effect, but you can set things up so -that scripts are run directly from your dev directory. This way, you can edit -your scripts and have the changes available in the game immediately: no -copying, no restarting. +If you have changes to the raws, you'll have to copy them into DF's +``data/installed_mods/`` folder to have them take effect, but you can set +things up so that scripts are run directly from your dev directory. This way, +you can edit your scripts and have the changes available in the game +immediately: no copying, no restarting. How does this magic work? Just add a line like this to your ``dfhack-config/script-paths.txt`` file:: @@ -123,7 +119,7 @@ How does this magic work? Just add a line like this to your Then that directory will be searched when you run DFHack commands from inside the game. The ``+`` at the front of the path means to search that directory first, before any other script directory (like :file:`hack/scripts` or other -versions of your mod in ``data/installed_mods/``). +versions of your mod in the DF mod folders). The structure of the game ------------------------- diff --git a/library/Core.cpp b/library/Core.cpp index b5337b827..d13c82fa5 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -105,7 +105,6 @@ DBG_DECLARE(core,script,DebugCategory::LINFO); static const std::string CONFIG_PATH = "dfhack-config/"; static const std::string CONFIG_DEFAULTS_PATH = "hack/data/dfhack-config-defaults/"; -static const std::string MOD_PATH = "data/installed_mods/"; class MainThread { public: @@ -534,60 +533,19 @@ bool loadScriptPaths(color_ostream &out, bool silent = false) return true; } -bool loadModScriptPaths(color_ostream &out) { - std::map files; - Filesystem::listdir_recursive(MOD_PATH, files, 0); - - DEBUG(script,out).print("found %zd installed mods\n", files.size()); - if (!files.size()) - return true; - - for (auto & entry : files) { - DEBUG(script,out).print(" %s\n", entry.first.c_str()); - } - - std::vector mod_paths; - if (Core::getInstance().isWorldLoaded()) { - DEBUG(script,out).print("active load order:\n"); - for (auto & path : df::global::world->object_loader.object_load_order_src_dir) { - DEBUG(script,out).print(" %s\n", path->c_str()); - if (0 == path->find(MOD_PATH)) - mod_paths.emplace_back(*path); - } - } - +static void loadModScriptPaths(color_ostream &out) { + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); std::vector mod_script_paths; - for (auto pathit = mod_paths.rbegin(); pathit != mod_paths.rend(); ++pathit) { - std::string active_path = *pathit + "scripts_modactive"; - std::string installed_path = *pathit + "scripts_modinstalled"; - DEBUG(script,out).print("checking active path: %s\n", pathit->c_str()); - if (Filesystem::isdir(active_path)) - mod_script_paths.emplace_back(active_path); - if (Filesystem::isdir(installed_path)) - mod_script_paths.emplace_back(installed_path); - std::string slashless = *pathit; - slashless.resize(slashless.size()-1); - if (0 == files.erase(slashless)) { - WARN(script,out).print("script path not found: '%s'\n", pathit->c_str()); - } - } - - for (auto & entry : files) { - if (!entry.second) - continue; - DEBUG(script,out).print("checking inactive path: %s\n", entry.first.c_str()); - std::string installed_path = entry.first + "/scripts_modinstalled"; - if (Filesystem::isdir(installed_path)) - mod_script_paths.emplace_back(installed_path); - } - + Lua::CallLuaModuleFunction(out, L, "script-manager", "get_mod_script_paths", 0, 1, + Lua::DEFAULT_LUA_LAMBDA, + [&](lua_State *L) { + Lua::GetVector(L, mod_script_paths); + }); DEBUG(script,out).print("final mod script paths:\n"); for (auto & path : mod_script_paths) DEBUG(script,out).print(" %s\n", path.c_str()); - Core::getInstance().setModScriptPaths(mod_script_paths); - - return true; } static std::map state_change_event_map; diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index c9bdc3021..60d533891 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -2728,13 +2728,9 @@ static int filesystem_listdir_recursive(lua_State *L) include_prefix = lua_toboolean(L, 3); std::map files; int err = DFHack::Filesystem::listdir_recursive(dir, files, depth, include_prefix); - if (err) - { + if (err != -1) { lua_pushnil(L); - if (err == -1) - lua_pushfstring(L, "max depth exceeded: %d", depth); - else - lua_pushstring(L, strerror(err)); + lua_pushstring(L, strerror(err)); lua_pushinteger(L, err); return 3; } diff --git a/library/lua/script-manager.lua b/library/lua/script-manager.lua index cc5dd9fe3..1a7161a10 100644 --- a/library/lua/script-manager.lua +++ b/library/lua/script-manager.lua @@ -2,6 +2,9 @@ local _ENV = mkmodule('script-manager') local utils = require('utils') +--------------------- +-- enabled API + -- for each script that can be loaded as a module, calls cb(script_name, env) function foreach_module_script(cb) for _,script_path in ipairs(dfhack.internal.getScriptPaths()) do @@ -57,4 +60,107 @@ function list() end end +--------------------- +-- mod script paths + +-- this perhaps could/should be queried from the Steam API +-- are there any installation configurations where this will be wrong, though? +local WORKSHOP_MODS_PATH = '../../workshop/content/975370/' +local MODS_PATH = 'mods/' +local INSTALLED_MODS_PATH = 'data/installed_mods/' + +-- last instance of the same version of the same mod wins, so read them in this +-- order (in increasing order of liklihood that players may have made custom +-- changes to the files) +local MOD_PATH_ROOTS = {WORKSHOP_MODS_PATH, MODS_PATH, INSTALLED_MODS_PATH} + +local function get_mod_id_and_version(path) + local idfile = path .. '/info.txt' + local ok, lines = pcall(io.lines, idfile) + if not ok then return end + local id, version + for line in lines do + if not id then + _,_,id = line:find('^%[ID:([^%]]+)%]') + end + if not version then + -- note this doesn't include the closing brace since some people put + -- non-number characters in here, and DF only reads the digits as the + -- numeric version + _,_,version = line:find('^%[NUMERIC_VERSION:(%d+)') + end + -- note that we do *not* want to break out of this loop early since + -- lines has to hit EOF to close the file + end + return id, version +end + +local function add_script_path(mod_script_paths, path) + if dfhack.filesystem.isdir(path) then + print('indexing scripts from mod script path: ' .. path) + table.insert(mod_script_paths, path) + end +end + +local function add_script_paths(mod_script_paths, base_path, include_modactive) + if not base_path:endswith('/') then + base_path = base_path .. '/' + end + if include_modactive then + add_script_path(mod_script_paths, base_path..'scripts_modactive') + end + add_script_path(mod_script_paths, base_path..'scripts_modinstalled') +end + +function get_mod_script_paths() + -- ordered map of mod id -> {handled=bool, versions=map of version -> path} + local mods = utils.OrderedTable() + local mod_script_paths = {} + + -- if a world is loaded, process active mods first, and lock to active version + if dfhack.isWorldLoaded() then + for _,path in ipairs(df.global.world.object_loader.object_load_order_src_dir) do + path = tostring(path) + if not path:startswith(INSTALLED_MODS_PATH) then goto continue end + local id = get_mod_id_and_version(path) + if not id then goto continue end + mods[id] = {handled=true} + add_script_paths(mod_script_paths, path, true) + ::continue:: + end + end + + -- assemble version -> path maps for all (non-handled) mod source dirs + for _,mod_path_root in ipairs(MOD_PATH_ROOTS) do + local files = dfhack.filesystem.listdir_recursive(mod_path_root, 0) + if not files then goto skip_path_root end + for _,f in ipairs(files) do + if not f.isdir then goto continue end + local id, version = get_mod_id_and_version(f.path) + if not id or not version then goto continue end + local mod = ensure_key(mods, id) + if mod.handled then goto continue end + ensure_key(mod, 'versions')[version] = f.path + ::continue:: + end + ::skip_path_root:: + end + + -- add script paths from most recent version of all not-yet-handled mods + for _,v in pairs(mods) do + if v.handled then goto continue end + local max_version, path + for version,mod_path in pairs(v.versions) do + if not max_version or max_version < version then + path = mod_path + max_version = version + end + end + add_script_paths(mod_script_paths, path) + ::continue:: + end + + return mod_script_paths +end + return _ENV From e8fb2c5a4671e613dcb3c6b58a4c76f786e0c11c Mon Sep 17 00:00:00 2001 From: TaxiService Date: Tue, 4 Apr 2023 01:37:03 +0200 Subject: [PATCH 210/439] Update docs/changelog.txt Co-authored-by: Myk --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index dd1a29e28..cbc7b284d 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,7 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game -- `buildingplan`: rearranged elements of ``itemselection`` interface +-@ `buildingplan`: rearranged elements of ``itemselection`` interface ## Documentation From 0e3df4e3a5dbc8fc30a7831c0530946588a996f6 Mon Sep 17 00:00:00 2001 From: TaxiService Date: Tue, 4 Apr 2023 03:28:23 +0200 Subject: [PATCH 211/439] Update docs/changelog.txt Co-authored-by: Myk --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b20e103c2..15a30b9e2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,7 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game -- `buildingplan`: rearranged elements of ``planneroverlay`` interface +-@ `buildingplan`: rearranged elements of ``planneroverlay`` interface ## Documentation From 0cf4497328807fe9d2b3531e15fe498040d013e2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 02:55:13 +0000 Subject: [PATCH 212/439] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/python-jsonschema/check-jsonschema: 0.21.0 → 0.22.0](https://github.com/python-jsonschema/check-jsonschema/compare/0.21.0...0.22.0) - [github.com/Lucas-C/pre-commit-hooks: v1.4.2 → v1.5.1](https://github.com/Lucas-C/pre-commit-hooks/compare/v1.4.2...v1.5.1) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 94bfad310..c305de56c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,11 +20,11 @@ repos: args: ['--fix=lf'] - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.21.0 + rev: 0.22.0 hooks: - id: check-github-workflows - repo: https://github.com/Lucas-C/pre-commit-hooks - rev: v1.4.2 + rev: v1.5.1 hooks: - id: forbid-tabs exclude_types: From d12938fb238f24e2dcfbe4e8703f7ea16eb7a71e Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 4 Apr 2023 07:13:18 +0000 Subject: [PATCH 213/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 739d17867..d7f07e54b 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 739d1786723bbe912f448064c5705092a7936cc6 +Subproject commit d7f07e54b4ea7832b226f8d8678906c9c366918a diff --git a/scripts b/scripts index d2dad272e..53f0aedf9 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit d2dad272e4b24c043ca62f843511c763fb1f67b5 +Subproject commit 53f0aedf9f7df33a4f79246ba46de02794619d09 From aa8870fcad5dc3811ffe21157508ca616fba79bd Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Tue, 4 Apr 2023 17:38:38 +0200 Subject: [PATCH 214/439] custom EditField & reorganized panels --- plugins/lua/buildingplan/itemselection.lua | 237 ++++++++++++--------- 1 file changed, 134 insertions(+), 103 deletions(-) diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index dfb77d1fd..e8687c01d 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -81,116 +81,147 @@ function ItemSelection:init() end self:addviews{ - widgets.Label{ - frame={t=0, l=0, r=16}, - text={ - self.desc, plural, NEWLINE, - ('Select up to %d item%s ('):format(self.quantity, plural), - {text=function() return self.num_selected end}, - ' selected)', - }, - }, - widgets.Label{ - frame={r=0, w=15, t=0, h=3}, - text_pen=BUILD_TEXT_PEN, - text_hpen=BUILD_TEXT_HPEN, - text={ - ' Use filter ', NEWLINE, - ' for remaining ', NEWLINE, - ' items ', - }, - on_click=self:callback('submit'), - visible=function() return self.num_selected < self.quantity end, - }, - widgets.Label{ - frame={r=0, w=15, t=0, h=3}, - text_pen=BUILD_TEXT_PEN, - text_hpen=BUILD_TEXT_HPEN, - text={ - ' ', NEWLINE, - ' Continue ', NEWLINE, - ' ', + widgets.Panel{ + view_id='header', + frame={t=0, h=3}, + subviews={ + widgets.Label{ + frame={t=0, l=0, r=16}, + text={ + self.desc, plural, NEWLINE, + ('Select up to %d item%s ('):format(self.quantity, plural), + {text=function() return self.num_selected end}, + ' selected)', + }, + }, + widgets.Label{ + frame={r=0, w=15, t=0, h=3}, + text_pen=BUILD_TEXT_PEN, + text_hpen=BUILD_TEXT_HPEN, + text={ + ' Use filter ', NEWLINE, + ' for remaining ', NEWLINE, + ' items ', + }, + on_click=self:callback('submit'), + visible=function() return self.num_selected < self.quantity end, + }, + widgets.Label{ + frame={r=0, w=15, t=0, h=3}, + text_pen=BUILD_TEXT_PEN, + text_hpen=BUILD_TEXT_HPEN, + text={ + ' ', NEWLINE, + ' Continue ', NEWLINE, + ' ', + }, + on_click=self:callback('submit'), + visible=function() return self.num_selected >= self.quantity end, + }, }, - on_click=self:callback('submit'), - visible=function() return self.num_selected >= self.quantity end, }, - widgets.CycleHotkeyLabel{ - frame={l=1, t=3}, - key='CUSTOM_SHIFT_R', - label='Sort by:', - options={ - {label='Recently used', value=sort_by_recency}, - {label='Name', value=sort_by_name}, - {label='Amount', value=sort_by_quantity}, + } + + self:addviews{ + widgets.Panel{ + view_id='body', + frame={t=self.subviews.header.frame.h, b=4}, + subviews={ + widgets.EditField{ + view_id='search', + frame={l=1, t=0}, + label_text='Search: ', + on_char=function(ch) return ch:match('[%l -]') end, + }, + widgets.CycleHotkeyLabel{ + frame={l=1, t=2}, + key='CUSTOM_SHIFT_R', + label='Sort by:', + options={ + {label='Recently used', value=sort_by_recency}, + {label='Name', value=sort_by_name}, + {label='Amount', value=sort_by_quantity}, + }, + on_change=self:callback('on_sort'), + }, + widgets.Panel{ + frame={l=0, t=3, r=0, b=0}, + frame_style=gui.INTERIOR_FRAME, + subviews={ + widgets.FilteredList{ + view_id='flist', + frame={t=0, b=0}, + case_sensitive=false, + choices=choices, + icon_width=2, + on_submit=self:callback('toggle_group'), + }, + }, + }, }, - on_change=self:callback('on_sort'), - }, - widgets.FilteredList{ - view_id='flist', - frame={t=5, l=1, r=1, b=5}, - case_sensitive=false, - choices=choices, - icon_width=2, - on_submit=self:callback('toggle_group'), - edit_on_char=function(ch) return ch:match('[%l -]') end, - }, - widgets.Label{ - frame={l=1, t=5}, - text_pen=COLOR_LIGHTCYAN, - text={">"}, }, widgets.Panel{ - frame={l=0, t=6, r=0, b=4}, - frame_style=gui.INTERIOR_FRAME, - }, - widgets.HotkeyLabel{ - frame={l=0, b=2}, - key='KEYBOARD_CURSOR_RIGHT_FAST', - key_sep='ight: ', - label='Use one', - auto_width=true, - on_activate=function() self:increment_group(self.subviews.flist.list:getSelected()) end, - }, - widgets.Label{ - frame={l=6, b=2, w=5}, - text_pen=COLOR_LIGHTGREEN, - text='Right', - }, - widgets.HotkeyLabel{ - frame={l=1, b=1}, - key='KEYBOARD_CURSOR_LEFT_FAST', - key_sep='eft: ', - label='Use one fewer', - auto_width=true, - on_activate=function() self:decrement_group(self.subviews.flist.list:getSelected()) end, - }, - widgets.Label{ - frame={l=7, b=1, w=4}, - text_pen=COLOR_LIGHTGREEN, - text='Left', - }, - widgets.HotkeyLabel{ - frame={l=6, b=0}, - key='SELECT', - label='Use all/none', - auto_width=true, - on_activate=function() self:toggle_group(self.subviews.flist.list:getSelected()) end, - }, - widgets.HotkeyLabel{ - frame={r=5, b=2}, - key='LEAVESCREEN', - label='Go back', - auto_width=true, - on_activate=self:callback('on_cancel'), - }, - widgets.HotkeyLabel{ - frame={r=4, b=0}, - key='CUSTOM_SHIFT_C', - label='Continue', - auto_width=true, - on_activate=self:callback('submit'), + view_id='footer', + frame={l=1, r=1, b=0, h=3}, + subviews={ + --[[ + add an explanation for this terribleness + --]] + widgets.HotkeyLabel{ + frame={l=0, h=1, t=0}, + key='KEYBOARD_CURSOR_RIGHT_FAST', + key_sep='----: ', --these hypens are overwritten by the next Label + label='Use one', + auto_width=true, + on_activate=function() self:increment_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.Label{ + frame={l=6, w=5, t=0}, + text_pen=COLOR_LIGHTGREEN, + text='Right', + }, + widgets.HotkeyLabel{ + frame={l=1, h=1, t=1}, + key='KEYBOARD_CURSOR_LEFT_FAST', + key_sep='---: ', --these hypens are overwritten by the next Label + label='Use one fewer', + auto_width=true, + on_activate=function() self:decrement_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.Label{ + frame={l=7, w=4, t=1}, + text_pen=COLOR_LIGHTGREEN, + text='Left', + }, + widgets.HotkeyLabel{ + frame={l=6, t=2, h=2}, + key='SELECT', + label='Use all/none', + auto_width=true, + on_activate=function() self:toggle_group(self.subviews.flist.list:getSelected()) end, + }, + widgets.HotkeyLabel{ + frame={r=5, t=0}, + key='LEAVESCREEN', + label='Go back', + auto_width=true, + on_activate=self:callback('on_cancel'), + }, + widgets.HotkeyLabel{ + frame={r=4, t=2}, + key='CUSTOM_SHIFT_C', + label='Continue', + auto_width=true, + on_activate=self:callback('submit'), + }, + }, }, } + + self.subviews.flist.list.frame.t = 0 + self.subviews.flist.edit.visible = false + self.subviews.flist.edit = self.subviews.search + self.subviews.search.on_change = self.subviews.flist:callback('onFilterChange') end -- resort and restore selection From 59b79472301f88ba94775608afb3684478cce31e Mon Sep 17 00:00:00 2001 From: TaxiService Date: Tue, 4 Apr 2023 18:31:04 +0200 Subject: [PATCH 215/439] removed trailing whitespace... --- plugins/lua/buildingplan/itemselection.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index e8687c01d..782ac915b 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -164,7 +164,7 @@ function ItemSelection:init() view_id='footer', frame={l=1, r=1, b=0, h=3}, subviews={ - --[[ + --[[ add an explanation for this terribleness --]] widgets.HotkeyLabel{ From 0c91644c5e1c20b8dcccc6b3de798a2437e4ca6e Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Tue, 4 Apr 2023 22:34:47 +0200 Subject: [PATCH 216/439] various tweaks and fixes --- plugins/lua/buildingplan/planneroverlay.lua | 42 ++++++++++++--------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 8c67b59f5..977fb154c 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -207,38 +207,38 @@ ItemLine.ATTRS{ } function ItemLine:init() - --self.frame.h = 2 + self.frame.h = 2 self.visible = function() return #get_cur_filters() >= self.idx end self:addviews{ widgets.Label{ + view_id='item_symbol', frame={t=0, l=1}, text=string.char(26), - --auto_width=true, + auto_width=true, visible=self.is_selected_fn, }, + } + self:addviews{ widgets.Label{ + view_id='item_info', frame={t=0, l=2}, text={ {text=self:callback('get_item_line_text')}, - --{text='[filter]', pen=self:callback('get_f_pen')}, - --{text='[x]', pen=self:callback('get_x_pen')}, }, }, + } + self:addviews{ widgets.Label{ - frame={t=0, l=25}, + frame={t=0, l=28}, text={ - --{tile=pens.BUTTON_START_PEN}, - --{gap=6, tile=pens.BUTTON_END_PEN}, {text='[filter]', pen=self:callback('get_f_pen')}, }, auto_width=true, on_click=function() self.on_filter(self.idx) end, }, widgets.Label{ - frame={t=0, l=33}, + frame={t=0, l=36}, text={ - --{tile=pens.BUTTON_START_PEN}, - --{gap=1, tile=pens.BUTTON_END_PEN}, {text='[x]', pen=self:callback('get_x_pen')}, }, auto_width=true, @@ -266,8 +266,8 @@ function ItemLine:onInput(keys) return ItemLine.super.onInput(self, keys) end -function ItemLine:get_f_pen() - return self.is_selected_fn and COLOR_LIGHTCYAN or COLOR_CYAN +function ItemLine:get_f_pen() -- TODO: make this thing work. I've tried many things to no avail. -taxi + return self.selected and COLOR_LIGHTCYAN or COLOR_CYAN end function ItemLine:get_x_pen() @@ -293,7 +293,7 @@ function ItemLine:get_item_line_text() self.note = string.char(192)..' Will link later' end - return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and ' of ' or 's of ') + return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and '' or 's') end function ItemLine:reduce_quantity(used_quantity) @@ -318,7 +318,7 @@ end PlannerOverlay = defclass(PlannerOverlay, overlay.OverlayWidget) PlannerOverlay.ATTRS{ - default_pos={x=5,y=8}, + default_pos={x=5,y=9}, default_enabled=true, viewscreens='dwarfmode/Building/Placement', frame={w=56, h=22}, @@ -432,7 +432,7 @@ function PlannerOverlay:init() {label='Up', value=df.construction_type.UpStair}, }, }, - widgets.CycleHotkeyLabel { + widgets.CycleHotkeyLabel { -- TODO: this thing also needs a slider view_id='weapons', frame={b=4, l=1, w=22}, key='CUSTOM_T', @@ -464,7 +464,7 @@ function PlannerOverlay:init() end, }, widgets.Label{ - frame={b=2, l=25}, + frame={b=2, l=23}, text_pen=dfhack.pen.parse{fg=COLOR_DARKGREY}, text={ 'Selected area: ', @@ -519,9 +519,9 @@ function PlannerOverlay:init() label='Choose items:', label_below=true, options={ - {label='with Filters', value=0}, + {label='with filters', value=0}, { - label=function() + label=function() -- TODO: hide this option if last used mat does not exist yet local automaterial = itemselection.get_automaterial_selection(uibs.building_type) return ('Last used (%s)'):format(automaterial or 'n/a') end, @@ -589,6 +589,12 @@ function PlannerOverlay:init() minimized_panel, error_panel, divider_widget, + widgets.Panel{ + frame={t=0, l=1, w=37, h=1}, + frame_inset=0, + frame_background=gui.CLEAR_PEN, + visible=function() return not self.minimized end, + }, } end From 0cebad10785423cd5f6f3b854eb8594738eaed02 Mon Sep 17 00:00:00 2001 From: silverflyone Date: Wed, 5 Apr 2023 11:49:14 +1000 Subject: [PATCH 217/439] Update Buildings.cpp Removed extra min/max checks. --- library/modules/Buildings.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 172975e21..23b3263f3 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -1649,11 +1649,11 @@ StockpileIterator& StockpileIterator::operator++() { while (current >= block->items.size()) { // Out of items in this block; find the next block to search. - if (std::max(block->map_pos.x + 16, 0) <= std::min(std::max(stockpile->x2, 0), world->map.x_count-1)) { - block = Maps::getTileBlock(std::min(std::max(block->map_pos.x + 16, 0), world->map.x_count-1), block->map_pos.y, stockpile->z); + if (block->map_pos.x + 16 <= std::min(stockpile->x2, world->map.x_count-1)) { + block = Maps::getTileBlock(block->map_pos.x + 16, block->map_pos.y, stockpile->z); current = 0; - } else if (std::max(block->map_pos.y + 16, 0) <= std::min(std::max(stockpile->y2, 0), world->map.y_count-1)) { - block = Maps::getTileBlock(std::min(std::max(stockpile->x1, 0), world->map.x_count-1), std::min(std::max(block->map_pos.y + 16, 0), world->map.y_count-1), stockpile->z); + } else if (block->map_pos.y + 16 <= std::min(stockpile->y2, world->map.y_count-1)) { + block = Maps::getTileBlock(std::max(stockpile->x1, 0), block->map_pos.y + 16, stockpile->z); current = 0; } else { // All items in all blocks have been checked. From d42d9ec6268ef7654c386a67b1ef9da9cd91b699 Mon Sep 17 00:00:00 2001 From: silverflyone Date: Wed, 5 Apr 2023 12:53:39 +1000 Subject: [PATCH 218/439] Update changelog.txt Fix log entry --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index ff9d05b0f..7cc0ed0c0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,6 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar - ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls +- ``Buildings::StockpileIterator:``: fix to use world map boundaries when stockpile coordinates exist outside of the world map. Fixes unhandled exception for `combine`. ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game From 7294678e2757f671ff44ffd88ef3655ca90c7920 Mon Sep 17 00:00:00 2001 From: Myk Date: Tue, 4 Apr 2023 22:42:58 -0700 Subject: [PATCH 219/439] Update docs/changelog.txt --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 7cc0ed0c0..7f3262099 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,7 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar - ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls -- ``Buildings::StockpileIterator:``: fix to use world map boundaries when stockpile coordinates exist outside of the world map. Fixes unhandled exception for `combine`. +- `combine`: fix error processing stockpiles with boundaries that extend outside of the map ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game From c490a9ebc2fb92ebcd018b9c0d5192ba01152d81 Mon Sep 17 00:00:00 2001 From: TaxiService Date: Wed, 5 Apr 2023 15:55:47 +0200 Subject: [PATCH 220/439] updated comments in the footer area --- plugins/lua/buildingplan/itemselection.lua | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index 782ac915b..84e866502 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -164,13 +164,10 @@ function ItemSelection:init() view_id='footer', frame={l=1, r=1, b=0, h=3}, subviews={ - --[[ - add an explanation for this terribleness - --]] widgets.HotkeyLabel{ frame={l=0, h=1, t=0}, key='KEYBOARD_CURSOR_RIGHT_FAST', - key_sep='----: ', --these hypens are overwritten by the next Label + key_sep='----: ', -- these hypens function as "padding" to be overwritten by the next Label label='Use one', auto_width=true, on_activate=function() self:increment_group(self.subviews.flist.list:getSelected()) end, @@ -178,12 +175,12 @@ function ItemSelection:init() widgets.Label{ frame={l=6, w=5, t=0}, text_pen=COLOR_LIGHTGREEN, - text='Right', + text='Right', -- this overrides the "6----" characters from the previous HotkeyLabel }, widgets.HotkeyLabel{ frame={l=1, h=1, t=1}, key='KEYBOARD_CURSOR_LEFT_FAST', - key_sep='---: ', --these hypens are overwritten by the next Label + key_sep='---: ', -- these hypens function as "padding" to be overwritten by the next Label label='Use one fewer', auto_width=true, on_activate=function() self:decrement_group(self.subviews.flist.list:getSelected()) end, @@ -191,7 +188,7 @@ function ItemSelection:init() widgets.Label{ frame={l=7, w=4, t=1}, text_pen=COLOR_LIGHTGREEN, - text='Left', + text='Left', -- this overrides the "4---" characters from the previous HotkeyLabel }, widgets.HotkeyLabel{ frame={l=6, t=2, h=2}, From 1ed25cdd72c9e966f17b8d3d74ea97f5fe8e36a1 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 6 Apr 2023 07:12:58 +0000 Subject: [PATCH 221/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 53f0aedf9..e6216cc28 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 53f0aedf9f7df33a4f79246ba46de02794619d09 +Subproject commit e6216cc28e4315df5fb128411d0ca57fe78ccb2b From 70b8c831788ccedde4ca429d1ed39b0d950c68dd Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 6 Apr 2023 16:08:09 +0200 Subject: [PATCH 222/439] highlight selected item, + various tweaks --- plugins/lua/buildingplan/planneroverlay.lua | 48 ++++++++++++--------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 977fb154c..d4e4acc08 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -212,36 +212,42 @@ function ItemLine:init() self:addviews{ widgets.Label{ view_id='item_symbol', - frame={t=0, l=1}, - text=string.char(26), + frame={t=0, l=0}, + text=string.char(16), -- this is the "â–º" character + text_pen=COLOR_YELLOW, auto_width=true, visible=self.is_selected_fn, }, } self:addviews{ widgets.Label{ - view_id='item_info', + view_id='item_desc', frame={t=0, l=2}, text={ - {text=self:callback('get_item_line_text')}, + {text=self:callback('get_item_line_text'), + pen=function() return gui.invert_color(COLOR_WHITE, self.is_selected_fn()) end}, }, }, } self:addviews{ widgets.Label{ + view_id='item_filter', frame={t=0, l=28}, text={ - {text='[filter]', pen=self:callback('get_f_pen')}, + {text=self:callback('get_filter_text'), + pen=function() return gui.invert_color(COLOR_LIGHTCYAN, self.is_selected_fn()) end}, }, auto_width=true, on_click=function() self.on_filter(self.idx) end, }, widgets.Label{ - frame={t=0, l=36}, + frame={t=0, l=42}, text={ - {text='[x]', pen=self:callback('get_x_pen')}, + {text='[clear]', + pen=COLOR_LIGHTRED}, }, auto_width=true, + visible=self:callback('has_filter'), on_click=function() self.on_clear_filter(self.idx) end, }, widgets.Label{ @@ -266,15 +272,6 @@ function ItemLine:onInput(keys) return ItemLine.super.onInput(self, keys) end -function ItemLine:get_f_pen() -- TODO: make this thing work. I've tried many things to no avail. -taxi - return self.selected and COLOR_LIGHTCYAN or COLOR_CYAN -end - -function ItemLine:get_x_pen() - return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) and - COLOR_LIGHTRED or COLOR_BLACK -end - function ItemLine:get_item_line_text() local idx = self.idx local filter = get_cur_filters()[idx] @@ -287,15 +284,24 @@ function ItemLine:get_item_line_text() uibs.building_type, uibs.building_subtype, uibs.custom_type, idx - 1) if self.available >= quantity then self.note_pen = COLOR_GREEN - self.note = string.char(192)..' Available now' + self.note = string.char(192)..' Available now' -- character 192 is "â””" else self.note_pen = COLOR_BROWN - self.note = string.char(192)..' Will link later' + self.note = string.char(192)..' Will link later' -- character 192 is "â””" end return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and '' or 's') end +function ItemLine:has_filter() + return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) +end + +function ItemLine:get_filter_text() -- TODO: reuse "has_filter()" instead of copying this whole string? (i couldnt make it work -taxi) + return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) + and '[edit filters]' or '[any material]' -- TODO: make this show the filter's materials instead of "edit filters" +end + function ItemLine:reduce_quantity(used_quantity) if not self.available then return end local filter = get_cur_filters()[self.idx] @@ -399,7 +405,7 @@ function PlannerOverlay:init() on_clear_filter=self:callback('clear_filter')}, widgets.CycleHotkeyLabel{ view_id='hollow', - frame={b=4, l=1, w=19}, + frame={b=4, l=1, w=21}, key='CUSTOM_H', label='Hollow area:', visible=is_construction, @@ -490,7 +496,7 @@ function PlannerOverlay:init() widgets.HotkeyLabel{ frame={b=2, l=2}, key='CUSTOM_Q', - label='Prev/next', + label='Prev/next item', auto_width=true, enabled=function() return #get_cur_filters() > 1 end, on_activate=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, @@ -523,7 +529,7 @@ function PlannerOverlay:init() { label=function() -- TODO: hide this option if last used mat does not exist yet local automaterial = itemselection.get_automaterial_selection(uibs.building_type) - return ('Last used (%s)'):format(automaterial or 'n/a') + return ('Last used (%s)'):format(automaterial or 'pick manually') end, value=2, }, From f66c60ee65b39886fc9c64bc66ff6d093bb43fb1 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 6 Apr 2023 16:22:07 +0200 Subject: [PATCH 223/439] removed some trailing whitespace... --- plugins/lua/buildingplan/planneroverlay.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index d4e4acc08..174097c1d 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -234,7 +234,7 @@ function ItemLine:init() view_id='item_filter', frame={t=0, l=28}, text={ - {text=self:callback('get_filter_text'), + {text=self:callback('get_filter_text'), pen=function() return gui.invert_color(COLOR_LIGHTCYAN, self.is_selected_fn()) end}, }, auto_width=true, @@ -243,7 +243,7 @@ function ItemLine:init() widgets.Label{ frame={t=0, l=42}, text={ - {text='[clear]', + {text='[clear]', pen=COLOR_LIGHTRED}, }, auto_width=true, From 6347e117512b659224bf551748bda20b08bf16fb Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Fri, 7 Apr 2023 00:46:32 +0200 Subject: [PATCH 224/439] moved prev/next on top, made set/edit filter button, more tweaks --- plugins/lua/buildingplan/planneroverlay.lua | 82 ++++++++++++--------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 174097c1d..a4173c5c6 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -108,7 +108,7 @@ end -- adjusted from CycleHotkeyLabel on the planner panel local weapon_quantity = 1 -local function get_quantity(filter, hollow, bounds) +local function get_quantity(filter, hollow, bounds) -- TODO: this should account for erroring constructions if is_pressure_plate() then local flags = uibs.plate_info.flags return (flags.units and 1 or 0) + (flags.water and 1 or 0) + @@ -411,12 +411,12 @@ function PlannerOverlay:init() visible=is_construction, options={ {label='No', value=false}, - {label='Yes', value=true}, + {label='Yes', value=true, pen=COLOR_GREEN}, }, }, widgets.CycleHotkeyLabel{ view_id='stairs_top_subtype', - frame={b=5, l=23, w=28}, + frame={b=5, l=23, w=30}, key='CUSTOM_R', label='Top Stair Type: ', visible=is_stairs, @@ -428,7 +428,7 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel { view_id='stairs_bottom_subtype', - frame={b=4, l=23, w=28}, + frame={b=4, l=23, w=30}, key='CUSTOM_B', label='Bottom Stair Type:', visible=is_stairs, @@ -471,7 +471,7 @@ function PlannerOverlay:init() }, widgets.Label{ frame={b=2, l=23}, - text_pen=dfhack.pen.parse{fg=COLOR_DARKGREY}, + text_pen=COLOR_DARKGREY, text={ 'Selected area: ', {text=function() @@ -487,32 +487,18 @@ function PlannerOverlay:init() visible=function() return #get_cur_filters() > 0 end, subviews={ widgets.HotkeyLabel{ - frame={b=2, l=1}, - key='CUSTOM_SHIFT_Q', - auto_width=true, - enabled=function() return #get_cur_filters() > 1 end, - on_activate=function() self.selected = ((self.selected - 2) % #get_cur_filters()) + 1 end, - }, - widgets.HotkeyLabel{ - frame={b=2, l=2}, - key='CUSTOM_Q', - label='Prev/next item', - auto_width=true, - enabled=function() return #get_cur_filters() > 1 end, - on_activate=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, - }, - widgets.HotkeyLabel{ - frame={b=1, l=1}, + frame={b=1, l=1, w=22}, key='CUSTOM_F', - label='Set filter', - auto_width=true, + label=function() + return buildingplan.hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.selected - 1) + and 'Edit filter' or 'Set filter' + end, on_activate=function() self:set_filter(self.selected) end, }, widgets.HotkeyLabel{ - frame={b=0, l=1}, + frame={b=0, l=1, w=22}, key='CUSTOM_X', label='Clear filter', - auto_width=true, on_activate=function() self:clear_filter(self.selected) end, enabled=function() return buildingplan.hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.selected - 1) @@ -590,17 +576,47 @@ function PlannerOverlay:init() }, } + local prev_next_selector = widgets.Panel{ + frame={h=1}, + auto_width=true, + subviews={ + widgets.HotkeyLabel{ + frame={t=0, l=1, w=9}, + key='CUSTOM_SHIFT_Q', + key_sep='\0', + label=': Prev/', + on_activate=function() self.selected = ((self.selected - 2) % #get_cur_filters()) + 1 end, + }, + widgets.HotkeyLabel{ + frame={t=0, l=2, w=1}, + key='CUSTOM_Q', + on_activate=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, + }, + widgets.Label{ + frame={t=0,l=10}, + text='next item', + on_click=function() self.selected = (self.selected % #get_cur_filters()) + 1 end, + }, + }, + visible=function() return #get_cur_filters() > 1 end, + } + + local black_bar = widgets.Panel{ + frame={t=0, l=1, w=37, h=1}, + frame_inset=0, + frame_background=gui.CLEAR_PEN, + visible=function() return not self.minimized end, + subviews={ + prev_next_selector, + }, + } + self:addviews{ - main_panel, + black_bar, minimized_panel, - error_panel, + main_panel, divider_widget, - widgets.Panel{ - frame={t=0, l=1, w=37, h=1}, - frame_inset=0, - frame_background=gui.CLEAR_PEN, - visible=function() return not self.minimized end, - }, + error_panel, } end From 8d40ca8be68725c11dcaadbc95cb20084bd93649 Mon Sep 17 00:00:00 2001 From: Quietust Date: Sat, 1 Apr 2023 12:37:36 -0600 Subject: [PATCH 225/439] Add "faststart" plugin to make DF start faster In particular, it makes the game's "Loading..." screen animate as quickly as possible, shortening it from around 10 seconds to slightly more than 1 second. A conditional build setting makes it skip the animation as well, making it slightly faster yet. Ideally, this should become part of the Tweak plugin, but we're not building that right now. --- docs/changelog.txt | 1 + docs/plugins/faststart.rst | 18 ++++++++++ plugins/CMakeLists.txt | 1 + plugins/faststart.cpp | 69 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 docs/plugins/faststart.rst create mode 100644 plugins/faststart.cpp diff --git a/docs/changelog.txt b/docs/changelog.txt index 4be3e6a64..59c0dc2b1 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins +- `faststart`: speeds up the "Loading..." screen so the Main Menu appears sooner ## Fixes - `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar diff --git a/docs/plugins/faststart.rst b/docs/plugins/faststart.rst new file mode 100644 index 000000000..3dc734183 --- /dev/null +++ b/docs/plugins/faststart.rst @@ -0,0 +1,18 @@ +faststart +========= + +.. dfhack-tool:: + :summary: Makes the main menu appear sooner. + :tags: interface + :no-command: + +This plugin accelerates the initial "Loading..." screen that appears when the +game first starts, so you don't have to wait as long before the Main Menu +appears and you can start playing. + +Usage +----- + +:: + + enable faststart diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index dc7fa9276..53d0296c7 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -112,6 +112,7 @@ dfhack_plugin(dig-now dig-now.cpp LINK_LIBRARIES lua) #dfhack_plugin(embark-tools embark-tools.cpp) dfhack_plugin(eventful eventful.cpp LINK_LIBRARIES lua) dfhack_plugin(fastdwarf fastdwarf.cpp) +dfhack_plugin(faststart faststart.cpp) dfhack_plugin(filltraffic filltraffic.cpp) #dfhack_plugin(fix-unit-occupancy fix-unit-occupancy.cpp) #dfhack_plugin(fixveins fixveins.cpp) diff --git a/plugins/faststart.cpp b/plugins/faststart.cpp new file mode 100644 index 000000000..d885726c0 --- /dev/null +++ b/plugins/faststart.cpp @@ -0,0 +1,69 @@ +// Fast Startup tweak + +#include "Core.h" +#include +#include +#include +#include +#include + +#include "df/viewscreen_initial_prepst.h" +#include + +using namespace DFHack; +using namespace df::enums; +using std::vector; + +// Uncomment this to make the Loading screen as fast as possible +// This has the side effect of removing the dwarf face animation +// (and briefly making the game become unresponsive) + +//#define REALLY_FAST + +DFHACK_PLUGIN("faststart"); +DFHACK_PLUGIN_IS_ENABLED(is_enabled); + +struct prep_hook : df::viewscreen_initial_prepst +{ + typedef df::viewscreen_initial_prepst interpose_base; + + DEFINE_VMETHOD_INTERPOSE(void, logic, ()) + { +#ifdef REALLY_FAST + while (breakdown_level != interface_breakdown_types::STOPSCREEN) + { + render_count++; + INTERPOSE_NEXT(logic)(); + } +#else + render_count = 4; + INTERPOSE_NEXT(logic)(); +#endif + } +}; + +IMPLEMENT_VMETHOD_INTERPOSE(prep_hook, logic); + +DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) +{ + if (enable != is_enabled) + { + if (!INTERPOSE_HOOK(prep_hook, logic).apply(enable)) + return CR_FAILURE; + + is_enabled = enable; + } + + return CR_OK; +} + +DFhackCExport command_result plugin_init ( color_ostream &out, vector &commands) +{ + return CR_OK; +} + +DFhackCExport command_result plugin_shutdown ( color_ostream &out ) +{ + INTERPOSE_HOOK(prep_hook, logic).remove(); + return CR_OK; +} From 93962df3de15db1193438b520c52ef2af00aa93d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 7 Apr 2023 01:57:11 +0000 Subject: [PATCH 226/439] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- plugins/faststart.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/faststart.cpp b/plugins/faststart.cpp index d885726c0..de014801c 100644 --- a/plugins/faststart.cpp +++ b/plugins/faststart.cpp @@ -18,7 +18,7 @@ using std::vector; // This has the side effect of removing the dwarf face animation // (and briefly making the game become unresponsive) -//#define REALLY_FAST +//#define REALLY_FAST DFHACK_PLUGIN("faststart"); DFHACK_PLUGIN_IS_ENABLED(is_enabled); From 75bdc8904c920a5542c0ee2d28a67339f9b44c19 Mon Sep 17 00:00:00 2001 From: Myk Date: Thu, 6 Apr 2023 18:59:57 -0700 Subject: [PATCH 227/439] add dfhack tag to faststart --- docs/plugins/faststart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/faststart.rst b/docs/plugins/faststart.rst index 3dc734183..b39269e01 100644 --- a/docs/plugins/faststart.rst +++ b/docs/plugins/faststart.rst @@ -3,7 +3,7 @@ faststart .. dfhack-tool:: :summary: Makes the main menu appear sooner. - :tags: interface + :tags: dfhack interface :no-command: This plugin accelerates the initial "Loading..." screen that appears when the From 2ac2817987ae2e8b9d426550c50406c2e1576b3f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 6 Apr 2023 23:19:04 -0700 Subject: [PATCH 228/439] enable bugfix services by default --- data/dfhack-config/init/dfhack.control-panel-system.init | 4 ++++ .../dfhack-config/init/onMapLoad.control-panel-new-fort.init | 4 ++++ data/dfhack-config/init/onMapLoad.control-panel-repeats.init | 5 +++++ docs/changelog.txt | 1 + 4 files changed, 14 insertions(+) create mode 100644 data/dfhack-config/init/dfhack.control-panel-system.init create mode 100644 data/dfhack-config/init/onMapLoad.control-panel-new-fort.init create mode 100644 data/dfhack-config/init/onMapLoad.control-panel-repeats.init diff --git a/data/dfhack-config/init/dfhack.control-panel-system.init b/data/dfhack-config/init/dfhack.control-panel-system.init new file mode 100644 index 000000000..c13565c28 --- /dev/null +++ b/data/dfhack-config/init/dfhack.control-panel-system.init @@ -0,0 +1,4 @@ +# DO NOT EDIT THIS FILE +# Please use gui/control-panel to edit this file + +enable faststart diff --git a/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init b/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init new file mode 100644 index 000000000..8a159b0de --- /dev/null +++ b/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init @@ -0,0 +1,4 @@ +# DO NOT EDIT THIS FILE +# Please use gui/control-panel to edit this file + +on-new-fortress enable fix/protect-nicks diff --git a/data/dfhack-config/init/onMapLoad.control-panel-repeats.init b/data/dfhack-config/init/onMapLoad.control-panel-repeats.init new file mode 100644 index 000000000..1463230aa --- /dev/null +++ b/data/dfhack-config/init/onMapLoad.control-panel-repeats.init @@ -0,0 +1,5 @@ +# DO NOT EDIT THIS FILE +# Please use gui/control-panel to edit this file + +repeat --name general-strike --time 1 --timeUnits days --command [ fix/general-strike -q ] +repeat --name warn-starving --time 10 --timeUnits days --command [ warn-starving ] diff --git a/docs/changelog.txt b/docs/changelog.txt index 59c0dc2b1..2ae96aa86 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -46,6 +46,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game - Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game - Mods: scripts from only the most recent version of an installed mod are added to the script path +- `gui/control-panel`: bugfix services are now enabled by default ## Documentation From 2923cf7d2114df2578227202a36746df7d9bff3a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 7 Apr 2023 06:22:02 +0000 Subject: [PATCH 229/439] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../init/dfhack.control-panel-system.init | 8 ++++---- .../init/onMapLoad.control-panel-new-fort.init | 8 ++++---- .../init/onMapLoad.control-panel-repeats.init | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/data/dfhack-config/init/dfhack.control-panel-system.init b/data/dfhack-config/init/dfhack.control-panel-system.init index c13565c28..8b1431373 100644 --- a/data/dfhack-config/init/dfhack.control-panel-system.init +++ b/data/dfhack-config/init/dfhack.control-panel-system.init @@ -1,4 +1,4 @@ -# DO NOT EDIT THIS FILE -# Please use gui/control-panel to edit this file - -enable faststart +# DO NOT EDIT THIS FILE +# Please use gui/control-panel to edit this file + +enable faststart diff --git a/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init b/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init index 8a159b0de..66a07d14f 100644 --- a/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init +++ b/data/dfhack-config/init/onMapLoad.control-panel-new-fort.init @@ -1,4 +1,4 @@ -# DO NOT EDIT THIS FILE -# Please use gui/control-panel to edit this file - -on-new-fortress enable fix/protect-nicks +# DO NOT EDIT THIS FILE +# Please use gui/control-panel to edit this file + +on-new-fortress enable fix/protect-nicks diff --git a/data/dfhack-config/init/onMapLoad.control-panel-repeats.init b/data/dfhack-config/init/onMapLoad.control-panel-repeats.init index 1463230aa..cbed00b67 100644 --- a/data/dfhack-config/init/onMapLoad.control-panel-repeats.init +++ b/data/dfhack-config/init/onMapLoad.control-panel-repeats.init @@ -1,5 +1,5 @@ -# DO NOT EDIT THIS FILE -# Please use gui/control-panel to edit this file - -repeat --name general-strike --time 1 --timeUnits days --command [ fix/general-strike -q ] -repeat --name warn-starving --time 10 --timeUnits days --command [ warn-starving ] +# DO NOT EDIT THIS FILE +# Please use gui/control-panel to edit this file + +repeat --name general-strike --time 1 --timeUnits days --command [ fix/general-strike -q ] +repeat --name warn-starving --time 10 --timeUnits days --command [ warn-starving ] From 00445767c74eb21600971ffd0699921e2b43300d Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 7 Apr 2023 06:27:56 +0000 Subject: [PATCH 230/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index e6216cc28..a4e5d4514 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit e6216cc28e4315df5fb128411d0ca57fe78ccb2b +Subproject commit a4e5d4514ec33462ee0c0bd25e02d4a9c3e2ce01 From 83017e8b8f7fffb935fd72bee5e356f972c1e6dd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 00:48:04 -0700 Subject: [PATCH 231/439] give active mods a chance to reattach their hooks --- docs/changelog.txt | 1 + docs/guides/modding-guide.rst | 5 +++++ library/Core.cpp | 5 ++++- library/LuaApi.cpp | 2 +- library/lua/script-manager.lua | 41 ++++++++++++++++++++++------------ 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 2ae96aa86..a0919c602 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -46,6 +46,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game - Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game - Mods: scripts from only the most recent version of an installed mod are added to the script path +- Mods: give active mods a chance to reattach their load hooks when a world is reloaded - `gui/control-panel`: bugfix services are now enabled by default ## Documentation diff --git a/docs/guides/modding-guide.rst b/docs/guides/modding-guide.rst index 0c9513fef..38117503c 100644 --- a/docs/guides/modding-guide.rst +++ b/docs/guides/modding-guide.rst @@ -461,6 +461,11 @@ Ok, you're all set up! Now, let's take a look at an example dfhack.onStateChange[GLOBAL_KEY] = function(sc) if sc == SC_MAP_UNLOADED then dfhack.run_command('disable', 'example-mod') + + -- ensure our mod doesn't try to enable itself when a different + -- world is loaded where we are *not* active + dfhack.onStateChange[GLOBAL_KEY] = nil + return end diff --git a/library/Core.cpp b/library/Core.cpp index d13c82fa5..97c69946e 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -2148,7 +2148,10 @@ void Core::onStateChange(color_ostream &out, state_change_event event) loadModScriptPaths(out); auto L = Lua::Core::State; Lua::StackUnwinder top(L); - Lua::CallLuaModuleFunction(con, L, "script-manager", "reload"); + Lua::CallLuaModuleFunction(con, L, "script-manager", "reload", 1, 0, + [](lua_State* L) { + Lua::Push(L, true); + }); // fallthrough } case SC_WORLD_UNLOADED: diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index d30dc7f77..08903c7bd 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -2729,7 +2729,7 @@ static int filesystem_listdir_recursive(lua_State *L) include_prefix = lua_toboolean(L, 3); std::map files; int err = DFHack::Filesystem::listdir_recursive(dir, files, depth, include_prefix); - if (err != -1) { + if (err != 0 && err != -1) { lua_pushnil(L); lua_pushstring(L, strerror(err)); lua_pushinteger(L, err); diff --git a/library/lua/script-manager.lua b/library/lua/script-manager.lua index 1a7161a10..450012357 100644 --- a/library/lua/script-manager.lua +++ b/library/lua/script-manager.lua @@ -6,22 +6,27 @@ local utils = require('utils') -- enabled API -- for each script that can be loaded as a module, calls cb(script_name, env) -function foreach_module_script(cb) +function foreach_module_script(cb, preprocess_script_file_fn) for _,script_path in ipairs(dfhack.internal.getScriptPaths()) do local files = dfhack.filesystem.listdir_recursive( script_path, nil, false) if not files then goto skip_path end for _,f in ipairs(files) do - if not f.isdir and - f.path:endswith('.lua') and - not f.path:startswith('test/') and - not f.path:startswith('internal/') then - local script_name = f.path:sub(1, #f.path - 4) -- remove '.lua' - local ok, script_env = pcall(reqscript, script_name) - if ok then - cb(script_name, script_env) - end + if f.isdir or not f.path:endswith('.lua') or + f.path:startswith('.git') or + f.path:startswith('test/') or + f.path:startswith('internal/') then + goto continue end + if preprocess_script_file_fn then + preprocess_script_file_fn(script_path, f.path) + end + local script_name = f.path:sub(1, #f.path - 4) -- remove '.lua' + local ok, script_env = pcall(reqscript, script_name) + if ok then + cb(script_name, script_env) + end + ::continue:: end ::skip_path:: end @@ -42,9 +47,17 @@ local function process_script(env_name, env) enabled_map[env_name] = fn end -function reload() +function reload(refresh_active_mod_scripts) enabled_map = utils.OrderedTable() - foreach_module_script(process_script) + local force_refresh_fn = refresh_active_mod_scripts and function(script_path, script_name) + if script_path:find('scripts_modactive') then + internal_script = dfhack.internal.scripts[script_path..'/'..script_name] + if internal_script then + internal_script.env = nil + end + end + end or nil + foreach_module_script(process_script, force_refresh_fn) end local function ensure_loaded() @@ -97,7 +110,7 @@ end local function add_script_path(mod_script_paths, path) if dfhack.filesystem.isdir(path) then - print('indexing scripts from mod script path: ' .. path) + print('indexing mod scripts: ' .. path) table.insert(mod_script_paths, path) end end @@ -120,7 +133,7 @@ function get_mod_script_paths() -- if a world is loaded, process active mods first, and lock to active version if dfhack.isWorldLoaded() then for _,path in ipairs(df.global.world.object_loader.object_load_order_src_dir) do - path = tostring(path) + path = tostring(path.value) if not path:startswith(INSTALLED_MODS_PATH) then goto continue end local id = get_mod_id_and_version(path) if not id then goto continue end From 9e5728244ea136df1541e0c216f27032b9e75c8a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 02:07:45 -0700 Subject: [PATCH 232/439] don't error out when buildingplan is loaded at DF start --- plugins/buildingplan/buildingplan.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index eb765c1c4..2193b380b 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -742,6 +742,8 @@ static int countAvailableItems(color_ostream &out, df::building_type type, int16 static bool hasFilter(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, int index) { TRACE(status,out).print("entering hasFilter\n"); + if (!Core::getInstance().isWorldLoaded()) + return false; BuildingTypeKey key(type, subtype, custom); auto &filters = get_item_filters(out, key); if (index < 0 || filters.getItemFilters().size() <= (size_t)index) From 54c62a7307edfa0b38f1ea79fee923466ed9dabc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 02:08:47 -0700 Subject: [PATCH 233/439] tidy up --- plugins/lua/buildingplan/planneroverlay.lua | 27 +++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index a4173c5c6..185b1e28c 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -108,7 +108,8 @@ end -- adjusted from CycleHotkeyLabel on the planner panel local weapon_quantity = 1 -local function get_quantity(filter, hollow, bounds) -- TODO: this should account for erroring constructions +-- TODO: this should account for erroring constructions +local function get_quantity(filter, hollow, bounds) if is_pressure_plate() then local flags = uibs.plate_info.flags return (flags.units and 1 or 0) + (flags.water and 1 or 0) + @@ -218,8 +219,6 @@ function ItemLine:init() auto_width=true, visible=self.is_selected_fn, }, - } - self:addviews{ widgets.Label{ view_id='item_desc', frame={t=0, l=2}, @@ -228,8 +227,6 @@ function ItemLine:init() pen=function() return gui.invert_color(COLOR_WHITE, self.is_selected_fn()) end}, }, }, - } - self:addviews{ widgets.Label{ view_id='item_filter', frame={t=0, l=28}, @@ -242,10 +239,8 @@ function ItemLine:init() }, widgets.Label{ frame={t=0, l=42}, - text={ - {text='[clear]', - pen=COLOR_LIGHTRED}, - }, + text='[clear]', + text_pen=COLOR_LIGHTRED, auto_width=true, visible=self:callback('has_filter'), on_click=function() self.on_clear_filter(self.idx) end, @@ -284,22 +279,24 @@ function ItemLine:get_item_line_text() uibs.building_type, uibs.building_subtype, uibs.custom_type, idx - 1) if self.available >= quantity then self.note_pen = COLOR_GREEN - self.note = string.char(192)..' Available now' -- character 192 is "â””" + self.note = ' Available now' else self.note_pen = COLOR_BROWN - self.note = string.char(192)..' Will link later' -- character 192 is "â””" + self.note = ' Will link later' end + self.note = string.char(192) .. self.note -- character 192 is "â””" return ('%d %s%s'):format(quantity, self.desc, quantity == 1 and '' or 's') end function ItemLine:has_filter() - return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) + return require('plugins.buildingplan').hasFilter( + uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) end -function ItemLine:get_filter_text() -- TODO: reuse "has_filter()" instead of copying this whole string? (i couldnt make it work -taxi) - return require('plugins.buildingplan').hasFilter(uibs.building_type, uibs.building_subtype, uibs.custom_type, self.idx-1) - and '[edit filters]' or '[any material]' -- TODO: make this show the filter's materials instead of "edit filters" +function ItemLine:get_filter_text() + -- TODO: make this show the filter's materials instead of "edit filters" + return self:has_filter() and '[edit filters]' or '[any material]' end function ItemLine:reduce_quantity(used_quantity) From 36db68deeda0f9485251b55ddc3013840364466d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 02:17:22 -0700 Subject: [PATCH 234/439] user longer text for weapon label --- plugins/lua/buildingplan/planneroverlay.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 185b1e28c..29e6daca5 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -437,10 +437,10 @@ function PlannerOverlay:init() }, widgets.CycleHotkeyLabel { -- TODO: this thing also needs a slider view_id='weapons', - frame={b=4, l=1, w=22}, + frame={b=4, l=1, w=28}, key='CUSTOM_T', key_back='CUSTOM_SHIFT_T', - label='# of weapons:', + label='Number of weapons:', visible=is_weapon_or_spike_trap, options={ {label='(1)', value=1, pen=COLOR_YELLOW}, @@ -508,9 +508,9 @@ function PlannerOverlay:init() label='Choose items:', label_below=true, options={ - {label='with filters', value=0}, + {label='With filters', value=0}, { - label=function() -- TODO: hide this option if last used mat does not exist yet + label=function() local automaterial = itemselection.get_automaterial_selection(uibs.building_type) return ('Last used (%s)'):format(automaterial or 'pick manually') end, From 91b35475fa941bd4d08107161fc023510412c92e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 12:41:46 -0700 Subject: [PATCH 235/439] allow launching DF to work under wine --- package/windows/launchdf.c | 71 ++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/package/windows/launchdf.c b/package/windows/launchdf.c index 588624511..e903d8a84 100644 --- a/package/windows/launchdf.c +++ b/package/windows/launchdf.c @@ -1,7 +1,26 @@ +#include #include -int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) -{ +static BOOL is_running_on_wine() { + static const char *(CDECL *pwine_get_version)(void); + HMODULE hntdll = GetModuleHandle("ntdll.dll"); + if(!hntdll) + return FALSE; + + pwine_get_version = (void *)GetProcAddress(hntdll, "wine_get_version"); + return !!pwine_get_version; +} + +static LPCWSTR launch_via_steam_posix() { + const char* argv[] = { "/bin/sh", "-c", "\"steam -applaunch 975370\"", NULL }; + + // does not return on success + _execv(argv[0], argv); + + return L"Could not launch Dwarf Fortress"; +} + +static LPCWSTR launch_via_steam_windows() { STARTUPINFOW si; PROCESS_INFORMATION pi; @@ -12,28 +31,42 @@ int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) WCHAR steamPath[1024]; DWORD datasize = 1024; - LONG retCode = RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam", L"SteamExe", RRF_RT_REG_SZ, NULL, &steamPath, &datasize); + LONG retCode = RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam", + L"SteamExe", RRF_RT_REG_SZ, NULL, &steamPath, &datasize); + + MessageBoxW(NULL, steamPath, NULL, 0); if (retCode != ERROR_SUCCESS) - { - MessageBoxW(NULL, L"Could not find Steam client executable", NULL, 0); - exit(1); - } + return L"Could not find Steam client executable"; WCHAR commandLine[1024] = L"steam.exe -applaunch 975370"; - if (CreateProcessW(steamPath, - commandLine, - NULL, - NULL, - FALSE, - 0, - NULL, - NULL, - &si, - &pi) == 0) - { - MessageBoxW(NULL, L"could not launch Dwarf Fortress", NULL, 0); + if (CreateProcessW(steamPath, commandLine, + NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) + return L"Could not launch Dwarf Fortress"; + + return NULL; +} + +// this method doesn't properly attribute Steam playtime metrics to DF, +// but that's better than not having DF start at all. +static BOOL launch_direct() { + STARTUPINFOA si; + PROCESS_INFORMATION pi; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + return CreateProcessA("Dwarf Fortress.exe", + NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); +} + +int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) { + LPCWSTR err = is_running_on_wine() ? launch_via_steam_posix() : launch_via_steam_windows(); + + if (err && !launch_direct()) { + MessageBoxW(NULL, err, NULL, 0); exit(1); } From 4d758589cba10fbca8453cfc27636112c0184f85 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 13:17:17 -0700 Subject: [PATCH 236/439] remove debug statement --- package/windows/launchdf.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/package/windows/launchdf.c b/package/windows/launchdf.c index e903d8a84..6aea4e7d2 100644 --- a/package/windows/launchdf.c +++ b/package/windows/launchdf.c @@ -34,8 +34,6 @@ static LPCWSTR launch_via_steam_windows() { LONG retCode = RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam", L"SteamExe", RRF_RT_REG_SZ, NULL, &steamPath, &datasize); - MessageBoxW(NULL, steamPath, NULL, 0); - if (retCode != ERROR_SUCCESS) return L"Could not find Steam client executable"; From 14bc22ff316b7efdac33f640ec2fa5283c958d27 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Apr 2023 14:40:38 -0700 Subject: [PATCH 237/439] A -> W to align with existing codepaths --- package/windows/launchdf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/windows/launchdf.c b/package/windows/launchdf.c index 6aea4e7d2..992bf6636 100644 --- a/package/windows/launchdf.c +++ b/package/windows/launchdf.c @@ -49,14 +49,14 @@ static LPCWSTR launch_via_steam_windows() { // this method doesn't properly attribute Steam playtime metrics to DF, // but that's better than not having DF start at all. static BOOL launch_direct() { - STARTUPINFOA si; + STARTUPINFOW si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - return CreateProcessA("Dwarf Fortress.exe", + return CreateProcessW(L"Dwarf Fortress.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); } From 882573bc4f085ae44c8501f2f986062f095f5cdc Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 8 Apr 2023 07:12:15 +0000 Subject: [PATCH 238/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index a4e5d4514..d8557ba6f 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit a4e5d4514ec33462ee0c0bd25e02d4a9c3e2ce01 +Subproject commit d8557ba6f1777c1a6d1b92a364e4ee22ec829873 From 5aa246f6b0fb62b472386b9830c3734c6f27c9e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vuchener?= Date: Sat, 8 Apr 2023 12:33:24 +0200 Subject: [PATCH 239/439] plugins: include proto directory from current source directory Updated remotefortressreader for the new behavior. --- plugins/Plugins.cmake | 10 +++++----- plugins/remotefortressreader/CMakeLists.txt | 16 +--------------- plugins/remotefortressreader/proto/.gitignore | 3 +++ .../proto/AdventureControl.proto | 0 .../proto/DwarfControl.proto | 0 .../proto/ItemdefInstrument.proto | 0 .../proto/RemoteFortressReader.proto | 0 .../proto/ui_sidebar_mode.proto | 0 8 files changed, 9 insertions(+), 20 deletions(-) create mode 100644 plugins/remotefortressreader/proto/.gitignore rename plugins/{ => remotefortressreader}/proto/AdventureControl.proto (100%) rename plugins/{ => remotefortressreader}/proto/DwarfControl.proto (100%) rename plugins/{ => remotefortressreader}/proto/ItemdefInstrument.proto (100%) rename plugins/{ => remotefortressreader}/proto/RemoteFortressReader.proto (100%) rename plugins/{ => remotefortressreader}/proto/ui_sidebar_mode.proto (100%) diff --git a/plugins/Plugins.cmake b/plugins/Plugins.cmake index db7582c09..a0cea765f 100644 --- a/plugins/Plugins.cmake +++ b/plugins/Plugins.cmake @@ -6,11 +6,6 @@ if(UNIX) endif() endif() -include_directories("${dfhack_SOURCE_DIR}/library/include") -include_directories("${dfhack_SOURCE_DIR}/library/proto") -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/proto") -include_directories("${dfhack_SOURCE_DIR}/library/depends/xgetopt") - macro(car var) set(${var} ${ARGV1}) endmacro() @@ -123,6 +118,11 @@ macro(dfhack_plugin) add_library(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES}) ide_folder(${PLUGIN_NAME} "Plugins") + target_include_directories(${PLUGIN_NAME} PRIVATE "${dfhack_SOURCE_DIR}/library/include") + target_include_directories(${PLUGIN_NAME} PRIVATE "${dfhack_SOURCE_DIR}/library/proto") + target_include_directories(${PLUGIN_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/proto") + target_include_directories(${PLUGIN_NAME} PRIVATE "${dfhack_SOURCE_DIR}/library/depends/xgetopt") + if(NUM_PROTO) add_dependencies(${PLUGIN_NAME} generate_proto_${PLUGIN_NAME}) target_link_libraries(${PLUGIN_NAME} dfhack protobuf-lite dfhack-version ${PLUGIN_LINK_LIBRARIES}) diff --git a/plugins/remotefortressreader/CMakeLists.txt b/plugins/remotefortressreader/CMakeLists.txt index 55525bc21..262d163f1 100644 --- a/plugins/remotefortressreader/CMakeLists.txt +++ b/plugins/remotefortressreader/CMakeLists.txt @@ -24,23 +24,9 @@ set(PROJECT_PROTO ui_sidebar_mode ) -set(PLUGIN_PROTOS) -foreach(pbuf ${PROJECT_PROTO}) - list(APPEND PLUGIN_PROTOS ${CMAKE_CURRENT_SOURCE_DIR}/../proto/${pbuf}.proto) -endforeach() - -string(REPLACE ".proto" ".pb.cc" PLUGIN_PROTO_SRCS "${PLUGIN_PROTOS}") -string(REPLACE ".proto" ".pb.h" PLUGIN_PROTO_HDRS "${PLUGIN_PROTOS}") -set_source_files_properties(${PLUGIN_PROTO_SRCS} ${PLUGIN_PROTO_HDRS} PROPERTIES GENERATED TRUE) - -set_source_files_properties( ${PROJECT_HDRS} ${PLUGIN_PROTO_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE) - -# mash them together (headers are marked as headers and nothing will try to compile them) -list(APPEND PROJECT_SRCS ${PROJECT_HDRS} ${PLUGIN_PROTOS} ${PLUGIN_PROTO_SRCS} ${PLUGIN_PROTO_HDRS}) - if(UNIX AND NOT APPLE) set(PROJECT_LIBS ${PROJECT_LIBS} SDL) endif() # this makes sure all the stuff is put in proper places and linked to dfhack -dfhack_plugin(RemoteFortressReader ${PROJECT_SRCS} LINK_LIBRARIES protobuf-lite ${PROJECT_LIBS} COMPILE_FLAGS_MSVC "/FI\"Export.h\"" COMPILE_FLAGS_GCC "-include Export.h -Wno-misleading-indentation" ) +dfhack_plugin(RemoteFortressReader ${PROJECT_SRCS} LINK_LIBRARIES ${PROJECT_LIBS} PROTOBUFS ${PROJECT_PROTO}) diff --git a/plugins/remotefortressreader/proto/.gitignore b/plugins/remotefortressreader/proto/.gitignore new file mode 100644 index 000000000..befabf79d --- /dev/null +++ b/plugins/remotefortressreader/proto/.gitignore @@ -0,0 +1,3 @@ +*.pb.cc +*.pb.cc.rule +*.pb.h diff --git a/plugins/proto/AdventureControl.proto b/plugins/remotefortressreader/proto/AdventureControl.proto similarity index 100% rename from plugins/proto/AdventureControl.proto rename to plugins/remotefortressreader/proto/AdventureControl.proto diff --git a/plugins/proto/DwarfControl.proto b/plugins/remotefortressreader/proto/DwarfControl.proto similarity index 100% rename from plugins/proto/DwarfControl.proto rename to plugins/remotefortressreader/proto/DwarfControl.proto diff --git a/plugins/proto/ItemdefInstrument.proto b/plugins/remotefortressreader/proto/ItemdefInstrument.proto similarity index 100% rename from plugins/proto/ItemdefInstrument.proto rename to plugins/remotefortressreader/proto/ItemdefInstrument.proto diff --git a/plugins/proto/RemoteFortressReader.proto b/plugins/remotefortressreader/proto/RemoteFortressReader.proto similarity index 100% rename from plugins/proto/RemoteFortressReader.proto rename to plugins/remotefortressreader/proto/RemoteFortressReader.proto diff --git a/plugins/proto/ui_sidebar_mode.proto b/plugins/remotefortressreader/proto/ui_sidebar_mode.proto similarity index 100% rename from plugins/proto/ui_sidebar_mode.proto rename to plugins/remotefortressreader/proto/ui_sidebar_mode.proto From 95fb4e7eaa70e3939ec6b0e0cd6acb2324f29233 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sun, 9 Apr 2023 12:57:11 -0500 Subject: [PATCH 240/439] add raw/cooked z level output to prospector toady shifted displayed z levels by 100 for v50 --- docs/changelog.txt | 1 + plugins/prospector.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 259a7ce7f..7b71f5253 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -41,6 +41,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls - `combine`: fix error processing stockpiles with boundaries that extend outside of the map +- `prospector`: display both "raw" Z levels and "cooked" elevations ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game diff --git a/plugins/prospector.cpp b/plugins/prospector.cpp index 86d77e643..148883830 100644 --- a/plugins/prospector.cpp +++ b/plugins/prospector.cpp @@ -168,9 +168,13 @@ static void printMatdata(color_ostream &con, const matdata &data, bool only_z = con << std::setw(9) << int(data.count); if(data.lower_z != data.upper_z) - con <<" Z:" << std::setw(4) << data.lower_z << ".." << data.upper_z << std::endl; + con <<" Z:" << std::setw(4) << data.lower_z << " .." << std::setw(4) << data.upper_z + <<" Elev:" << std::setw(4) << (data.lower_z - 100) << " .." << std::setw(4) << (data.upper_z - 100) + << std::endl; else - con <<" Z:" << std::setw(4) << data.lower_z << std::endl; + con <<" Z:" << std::setw(4) << data.lower_z << " " + <<" Elev:" << std::setw(4) << (data.lower_z - 100) + << std::endl; } static int getValue(const df::inorganic_raw &info) From ef53a243e64bc332a7d0e298b15cf1de84b843c6 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sun, 9 Apr 2023 13:47:45 -0500 Subject: [PATCH 241/439] prospector redux this is arguably a better approach for dealing with the change in elevation display in v50 --- plugins/prospector.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/prospector.cpp b/plugins/prospector.cpp index 148883830..d660c98b5 100644 --- a/plugins/prospector.cpp +++ b/plugins/prospector.cpp @@ -168,12 +168,10 @@ static void printMatdata(color_ostream &con, const matdata &data, bool only_z = con << std::setw(9) << int(data.count); if(data.lower_z != data.upper_z) - con <<" Z:" << std::setw(4) << data.lower_z << " .." << std::setw(4) << data.upper_z - <<" Elev:" << std::setw(4) << (data.lower_z - 100) << " .." << std::setw(4) << (data.upper_z - 100) + con <<" Elev:" << std::setw(4) << (data.lower_z) << ".." << (data.upper_z) << std::endl; else - con <<" Z:" << std::setw(4) << data.lower_z << " " - <<" Elev:" << std::setw(4) << (data.lower_z - 100) + con <<" Elev:" << std::setw(4) << (data.lower_z) << std::endl; } @@ -680,7 +678,8 @@ static command_result map_prospector(color_ostream &con, b->GetGlobalFeature(&blockFeatureGlobal); b->GetLocalFeature(&blockFeatureLocal); - int global_z = world->map.region_z + z; + // the '- 100' is because DF v50 and later have a 100 offset in reported elevation + int global_z = world->map.region_z + z - 100; // Iterate over all the tiles in the block for(uint32_t y = 0; y < 16; y++) From bd00bb8faf07914e82ac4fabd77fbc8f0f1dbc09 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 10 Apr 2023 07:13:21 +0000 Subject: [PATCH 242/439] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index d7f07e54b..78a2008e4 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit d7f07e54b4ea7832b226f8d8678906c9c366918a +Subproject commit 78a2008e4d20a47f0533f285c3457a278dba5556 From 95e796abb40a9c00320b18eb0b424820bdd06ef2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 00:14:30 -0700 Subject: [PATCH 243/439] update python build action to non-deprecated version --- .github/workflows/build.yml | 6 +++--- .github/workflows/buildmaster-rebuild.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index abee9a86a..f03d8b3b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: plugins: all steps: - name: Set up Python 3 - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3 - name: Install dependencies @@ -161,7 +161,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Set up Python 3 - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3 - name: Install dependencies @@ -184,7 +184,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Set up Python 3 - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3 - name: Set up Ruby 2.7 diff --git a/.github/workflows/buildmaster-rebuild.yml b/.github/workflows/buildmaster-rebuild.yml index 5a1fe9504..d4c7a70e6 100644 --- a/.github/workflows/buildmaster-rebuild.yml +++ b/.github/workflows/buildmaster-rebuild.yml @@ -14,7 +14,7 @@ jobs: name: Trigger Buildmaster steps: - name: Set up Python 3 - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3 - name: Install dependencies From 07c83d3bf32a67adade558bd4b6fa6bfe2e1b909 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 03:37:10 -0700 Subject: [PATCH 244/439] allow getval to take and pass params --- library/lua/utils.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/lua/utils.lua b/library/lua/utils.lua index 2e03a8616..3883439f1 100644 --- a/library/lua/utils.lua +++ b/library/lua/utils.lua @@ -2,9 +2,9 @@ local _ENV = mkmodule('utils') local df = df -function getval(obj) +function getval(obj, ...) if type(obj) == 'function' then - return obj() + return obj(...) else return obj end From 661ddbd2562deac2e9ea8e99c398985c4831dc09 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 03:37:22 -0700 Subject: [PATCH 245/439] automelt doesn't need to disable itself --- plugins/automelt.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/plugins/automelt.cpp b/plugins/automelt.cpp index beb4cba35..dc0bc0f79 100644 --- a/plugins/automelt.cpp +++ b/plugins/automelt.cpp @@ -172,20 +172,6 @@ DFhackCExport command_result plugin_load_data(color_ostream &out) return CR_OK; } -DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) -{ - if (event == DFHack::SC_WORLD_UNLOADED) - { - if (is_enabled) - { - DEBUG(status, out).print("world unloaded; disabling %s\n", plugin_name); - is_enabled = false; - } - } - - return CR_OK; -} - DFhackCExport command_result plugin_onupdate(color_ostream &out) { if (!Core::getInstance().isWorldLoaded()) From 04c16186de711e85a149dbb5dd99b9ec4c11a4c5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 04:24:00 -0700 Subject: [PATCH 246/439] hide planner overlay during the tutorial --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 7b71f5253..adc4ca786 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -45,6 +45,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game +- `buildingplan`: hide planner overlay while the DF tutorial is active so that it can detect when you have placed the carpenter's workshop and bed and allow you to finish the tutorial -@ `buildingplan`: rearranged elements of ``planneroverlay`` interface -@ `buildingplan`: rearranged elements of ``itemselection`` interface - Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 29e6daca5..3e06ac79d 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -141,8 +141,15 @@ local function is_construction() return uibs.building_type == df.building_type.Construction end +local function is_tutorial_open() + local help = df.global.game.main_interface.help + return help.open and + help.context == df.help_context_type.START_TUTORIAL_WORKSHOPS_AND_TASKS +end + local function is_plannable() - return get_cur_filters() and + return not is_tutorial_open() and + get_cur_filters() and not (is_construction() and uibs.building_subtype == df.construction_type.TrackNSEW) end From 5cb3e6215141284720728587de07bc8f6e2c6539 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:34:16 +0000 Subject: [PATCH 247/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index d8557ba6f..973b8ef19 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit d8557ba6f1777c1a6d1b92a364e4ee22ec829873 +Subproject commit 973b8ef191cc92cff62d96aa591c7631818d19b6 From 6a7446780b401c721a64fb28ce42094243448ff4 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Apr 2023 22:59:55 -0700 Subject: [PATCH 248/439] hide terminal console when running on steam deck --- docs/changelog.txt | 1 + library/CMakeLists.txt | 2 + library/Core.cpp | 7 ++++ library/include/modules/DFSteam.h | 32 ++++++++++++++++ library/modules/DFSteam.cpp | 64 +++++++++++++++++++++++++++++++ 5 files changed, 106 insertions(+) create mode 100644 library/include/modules/DFSteam.h create mode 100644 library/modules/DFSteam.cpp diff --git a/docs/changelog.txt b/docs/changelog.txt index adc4ca786..e63b80bd7 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -52,6 +52,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - Mods: scripts from only the most recent version of an installed mod are added to the script path - Mods: give active mods a chance to reattach their load hooks when a world is reloaded - `gui/control-panel`: bugfix services are now enabled by default +- Core: hide DFHack terminal console by default when running on Steam Deck ## Documentation diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 92db43563..a3fcb8b6f 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -125,6 +125,7 @@ set(MODULE_HEADERS include/modules/Burrows.h include/modules/Constructions.h include/modules/DFSDL.h + include/modules/DFSteam.h include/modules/Designations.h include/modules/EventManager.h include/modules/Filesystem.h @@ -154,6 +155,7 @@ set(MODULE_SOURCES modules/Burrows.cpp modules/Constructions.cpp modules/DFSDL.cpp + modules/DFSteam.cpp modules/Designations.cpp modules/EventManager.cpp modules/Filesystem.cpp diff --git a/library/Core.cpp b/library/Core.cpp index 97c69946e..d03e8c632 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -49,6 +49,7 @@ distribution. #include "PluginManager.h" #include "ModuleFactory.h" #include "modules/DFSDL.h" +#include "modules/DFSteam.h" #include "modules/EventManager.h" #include "modules/Filesystem.h" #include "modules/Gui.h" @@ -1303,6 +1304,10 @@ static void run_dfhack_init(color_ostream &out, Core *core) return; } + // if we're running on Steam Deck, hide the terminal by default + if (DFSteam::DFIsSteamRunningOnSteamDeck()) + core->getConsole().hide(); + // load baseline defaults core->loadScriptFile(out, CONFIG_PATH + "init/default.dfhack.init", false); @@ -1668,6 +1673,8 @@ bool Core::Init() fatal("cannot bind SDL libraries"); return false; } + if (DFSteam::init(con)) + std::cerr << "Found Steam.\n"; std::cerr << "Initializing textures.\n"; Textures::init(con); // create mutex for syncing with interactive tasks diff --git a/library/include/modules/DFSteam.h b/library/include/modules/DFSteam.h new file mode 100644 index 000000000..3144830da --- /dev/null +++ b/library/include/modules/DFSteam.h @@ -0,0 +1,32 @@ +#pragma once + +#include "ColorText.h" +#include "Export.h" + +namespace DFHack +{ + +/** + * The DFSteam module - provides access to Steam functions without actually + * requiring build-time linkage to Steam + * \ingroup grp_modules + * \ingroup grp_dfsdl + */ +namespace DFSteam +{ + +/** + * Call this on DFHack init so we can load the function pointers. Returns false on + * failure. + */ +bool init(DFHack::color_ostream& out); + +/** + * Call this when DFHack is being unloaded. + */ +void cleanup(); + +DFHACK_EXPORT bool DFIsSteamRunningOnSteamDeck(); + +} +} diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp new file mode 100644 index 000000000..d32eec961 --- /dev/null +++ b/library/modules/DFSteam.cpp @@ -0,0 +1,64 @@ +#include "Internal.h" + +#include "modules/DFSteam.h" + +#include "Debug.h" +#include "PluginManager.h" + +namespace DFHack +{ +DBG_DECLARE(core, dfsteam, DebugCategory::LINFO); +} + +using namespace DFHack; + +static DFLibrary* g_steam_handle = nullptr; +static const std::vector STEAM_LIBS { + "steam_api64.dll", + "steam_api", // TODO: validate this on OSX + "libsteam_api.so" // TODO: validate this on Linux +}; + +bool (*g_SteamAPI_Init)() = nullptr; +bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)() = nullptr; + +bool DFSteam::init(color_ostream& out) { + for (auto& lib_str : STEAM_LIBS) { + if ((g_steam_handle = OpenPlugin(lib_str.c_str()))) + break; + } + if (!g_steam_handle) { + DEBUG(dfsteam, out).print("steam library not found; stubbing calls\n"); + return false; + } + +#define bind(handle, name) \ + g_##name = (decltype(g_##name))LookupPlugin(handle, #name); \ + if (!g_##name) { \ + WARN(dfsteam, out).print("steam library function not found: " #name "\n"); \ + } + + bind(g_steam_handle, SteamAPI_Init); + if (!g_SteamAPI_Init || !g_SteamAPI_Init()) + return false; + + bind(g_steam_handle, SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck); +#undef bind + + DEBUG(dfsteam, out).print("steam library linked\n"); + return true; +} + +void DFSteam::cleanup() { + if (!g_steam_handle) + return; + + ClosePlugin(g_steam_handle); + g_steam_handle = nullptr; +} + +bool DFSteam::DFIsSteamRunningOnSteamDeck() { + if (!g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck) + return false; + return g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck(); +} From f0d19c93631b32ea96d078985502a3244897b104 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Apr 2023 23:30:23 -0700 Subject: [PATCH 249/439] add note about dfhooks --- library/modules/DFSteam.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp index d32eec961..8cc921608 100644 --- a/library/modules/DFSteam.cpp +++ b/library/modules/DFSteam.cpp @@ -39,6 +39,8 @@ bool DFSteam::init(color_ostream& out) { } bind(g_steam_handle, SteamAPI_Init); + + // TODO: can we remove this initialization of the Steam API once we move to dfhooks? if (!g_SteamAPI_Init || !g_SteamAPI_Init()) return false; From e4777d268836d34f1a11ff376dd26cb4a9130c0a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 00:00:47 -0700 Subject: [PATCH 250/439] add shutdown and cleanup logic --- library/Core.cpp | 1 + library/modules/DFSteam.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/library/Core.cpp b/library/Core.cpp index d03e8c632..b1fe2d389 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -2281,6 +2281,7 @@ int Core::Shutdown ( void ) allModules.clear(); Textures::cleanup(); DFSDL::cleanup(); + DFSteam::cleanup(); memset(&(s_mods), 0, sizeof(s_mods)); d.reset(); return -1; diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp index 8cc921608..f58bc7cb4 100644 --- a/library/modules/DFSteam.cpp +++ b/library/modules/DFSteam.cpp @@ -20,6 +20,7 @@ static const std::vector STEAM_LIBS { }; bool (*g_SteamAPI_Init)() = nullptr; +void (*g_SteamAPI_Shutdown)() = nullptr; bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)() = nullptr; bool DFSteam::init(color_ostream& out) { @@ -39,9 +40,10 @@ bool DFSteam::init(color_ostream& out) { } bind(g_steam_handle, SteamAPI_Init); + bind(g_steam_handle, SteamAPI_Shutdown); // TODO: can we remove this initialization of the Steam API once we move to dfhooks? - if (!g_SteamAPI_Init || !g_SteamAPI_Init()) + if (!g_SteamAPI_Init || !g_SteamAPI_Shutdown || !g_SteamAPI_Init()) return false; bind(g_steam_handle, SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck); @@ -55,6 +57,9 @@ void DFSteam::cleanup() { if (!g_steam_handle) return; + if (g_SteamAPI_Shutdown) + g_SteamAPI_Shutdown(); + ClosePlugin(g_steam_handle); g_steam_handle = nullptr; } From ce017ee4a88648809d789c57ff3504f00e91870e Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Mon, 10 Apr 2023 03:01:36 -0500 Subject: [PATCH 251/439] properly callIs SteamRunningOnSteamDeck --- library/modules/DFSteam.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp index f58bc7cb4..1226f2a27 100644 --- a/library/modules/DFSteam.cpp +++ b/library/modules/DFSteam.cpp @@ -21,7 +21,8 @@ static const std::vector STEAM_LIBS { bool (*g_SteamAPI_Init)() = nullptr; void (*g_SteamAPI_Shutdown)() = nullptr; -bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)() = nullptr; +void* (*g_SteamInternal_FindOrCreateUserInterface)(int, char *) = nullptr; +bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)(void*) = nullptr; bool DFSteam::init(color_ostream& out) { for (auto& lib_str : STEAM_LIBS) { @@ -46,6 +47,7 @@ bool DFSteam::init(color_ostream& out) { if (!g_SteamAPI_Init || !g_SteamAPI_Shutdown || !g_SteamAPI_Init()) return false; + bind(g_steam_handle, SteamInternal_FindOrCreateUserInterface); bind(g_steam_handle, SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck); #undef bind @@ -67,5 +69,11 @@ void DFSteam::cleanup() { bool DFSteam::DFIsSteamRunningOnSteamDeck() { if (!g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck) return false; - return g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck(); + + if (!g_SteamInternal_FindOrCreateUserInterface) + return false; + + void* SteamUtils = g_SteamInternal_FindOrCreateUserInterface(0, "SteamUtils010"); + + return g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck(SteamUtils); } From 836a3edcb958959ba9a4157b7419dacfb431e617 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 01:12:43 -0700 Subject: [PATCH 252/439] add some more logging --- library/modules/DFSteam.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp index 1226f2a27..4c45f1114 100644 --- a/library/modules/DFSteam.cpp +++ b/library/modules/DFSteam.cpp @@ -21,7 +21,7 @@ static const std::vector STEAM_LIBS { bool (*g_SteamAPI_Init)() = nullptr; void (*g_SteamAPI_Shutdown)() = nullptr; -void* (*g_SteamInternal_FindOrCreateUserInterface)(int, char *) = nullptr; +void* (*g_SteamInternal_FindOrCreateUserInterface)(int, char*) = nullptr; bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)(void*) = nullptr; bool DFSteam::init(color_ostream& out) { @@ -44,8 +44,10 @@ bool DFSteam::init(color_ostream& out) { bind(g_steam_handle, SteamAPI_Shutdown); // TODO: can we remove this initialization of the Steam API once we move to dfhooks? - if (!g_SteamAPI_Init || !g_SteamAPI_Shutdown || !g_SteamAPI_Init()) + if (!g_SteamAPI_Init || !g_SteamAPI_Shutdown || !g_SteamAPI_Init()) { + DEBUG(dfsteam, out).print("steam detected but cannot be initialized\n"); return false; + } bind(g_steam_handle, SteamInternal_FindOrCreateUserInterface); bind(g_steam_handle, SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck); From 17373dcffd6ec40cc1c8bdb105e1e92adff7f1ec Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 01:16:22 -0700 Subject: [PATCH 253/439] constify! --- library/modules/DFSteam.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp index 4c45f1114..b27cc1744 100644 --- a/library/modules/DFSteam.cpp +++ b/library/modules/DFSteam.cpp @@ -21,7 +21,7 @@ static const std::vector STEAM_LIBS { bool (*g_SteamAPI_Init)() = nullptr; void (*g_SteamAPI_Shutdown)() = nullptr; -void* (*g_SteamInternal_FindOrCreateUserInterface)(int, char*) = nullptr; +void* (*g_SteamInternal_FindOrCreateUserInterface)(int, const char*) = nullptr; bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)(void*) = nullptr; bool DFSteam::init(color_ostream& out) { From c0fe5776fb760d3cdfc3b8966ffde2e5416455dd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 18:29:41 -0700 Subject: [PATCH 254/439] update Installing docs for Steam --- docs/Installing.rst | 163 ++++++++++++++++---------------------------- docs/changelog.txt | 1 + 2 files changed, 58 insertions(+), 106 deletions(-) diff --git a/docs/Installing.rst b/docs/Installing.rst index bc58a39b7..a80133e88 100644 --- a/docs/Installing.rst +++ b/docs/Installing.rst @@ -7,78 +7,50 @@ Installing DFHack .. contents:: :local: - Requirements ============ -DFHack supports Windows, Linux, and macOS, and both 64-bit and 32-bit builds -of Dwarf Fortress. +DFHack supports all operating systems and platforms that Dwarf Fortress itself +supports, which at the moment is just 64-bit Windows. However, the Windows +build of DFHack works well under ``wine`` (or ``Proton``, Steam's fork of +``wine``) on other operating systems. .. _installing-df-version: DFHack releases generally only support the version of Dwarf Fortress that they -are named after. For example, DFHack 0.40.24-r5 only supported DF 0.40.24. -DFHack releases *never* support newer versions of DF, because DFHack requires -data about DF that is only possible to obtain after DF has been released. -Occasionally, DFHack releases will be able to maintain support for older -versions of DF - for example, DFHack 0.34.11-r5 supported both DF 0.34.11 and -0.34.10. For maximum stability, you should usually use the latest versions of -both DF and DFHack. - -Windows -------- - -* DFHack only supports the SDL version of Dwarf Fortress. The "legacy" version - will *not* work with DFHack (the "small" SDL version is acceptable, however). -* Windows XP and older are *not* supported, due in part to a - `Visual C++ 2015 bug `_ - -The Windows build of DFHack should work under Wine on other operating systems, -although this is not tested very often. It is recommended to use the native -build for your operating system instead. - -.. _installing-reqs-linux: - -Linux ------ - -Generally, DFHack should work on any modern Linux distribution. There are -multiple release binaries provided - as of DFHack 0.47.04-r1, there are built -with GCC 7 and GCC 4.8 (as indicated by the ``gcc`` component of their -filenames). Using the newest build that works on your system is recommended. -The GCC 4.8 build is built on Ubuntu 14.04 and targets an older glibc, so it -should work on older distributions. - -In the event that none of the provided binaries work on your distribution, -you may need to `compile DFHack from source `. - -macOS ------ - -OS X 10.6.8 or later is required. - +are named after. For example, DFHack 50.05 only supported DF 50.05. DFHack +releases *never* support newer versions of DF -- DFHack requires data about DF +that is only possible to obtain after DF has been released. Occasionally, +DFHack releases will be able to maintain support for older versions of DF - for +example, DFHack 0.34.11-r5 supported both DF 0.34.11 and 0.34.10. For maximum +stability, you should usually use the latest versions of both DF and DFHack. .. _downloading: Downloading DFHack ================== -Stable builds of DFHack are available on `GitHub `_. -GitHub has been known to change their layout periodically, but as of July 2020, -downloads are available at the bottom of the release notes for each release, under a section -named "Assets" (which you may have to expand). The name of the file indicates -which DF version, platform, and architecture the build supports - the platform -and architecture (64-bit or 32-bit) **must** match your build of DF. The DF -version should also match your DF version - see `above ` -for details. For example: +Stable builds of DFHack are available on +`Steam `__ +or from our `GitHub `__. Either +location will give you exactly the same package. + +On Steam, note that DFHack is a separate app, not a DF Steam Workshop mod. You +can run DF with DFHack by launching either the DFHack app or the original Dwarf +Fortress app. + +If you download from GitHub, downloads are available at the bottom of the +release notes for each release, under a section named "Assets" (which you may +have to expand). The name of the file indicates which DF version, platform, and +architecture the build supports - the platform and architecture (64-bit or +32-bit) **must** match your build of DF. The DF version should also match your +DF version - see `above ` for details. For example: -* ``dfhack-0.47.04-r1-Windows-64bit.zip`` supports 64-bit DF on Windows -* ``dfhack-0.47.04-r1-Linux-32bit-gcc-7.tar.bz2`` supports 32-bit DF on Linux - (see `installing-reqs-linux` for details on the GCC version indicator) +* ``dfhack-50.07-r1-Windows-64bit.zip`` supports 64-bit DF on Windows -The `DFHack website `_ also provides links to -unstable builds. These files have a different naming scheme, but the same -restrictions apply (e.g. a file named ``Windows64`` is for 64-bit Windows DF). +In between stable releases, we may create beta releases to test new features. +These are available via the beta release channel on Steam or from our regular +Github page as a pre-release tagged with a "beta" suffix. .. warning:: @@ -91,19 +63,22 @@ restrictions apply (e.g. a file named ``Windows64`` is for 64-bit Windows DF). Installing DFHack ================= +If you are installing from Steam, this is handled for you automatically. The +instructions here are for manual installs. + When you `download DFHack `, you will end up with a release archive (a ``.zip`` file on Windows, or a ``.tar.bz2`` file on other platforms). Your operating system should have built-in utilities capable of extracting files from these archives. -The release archives contain several folders, including a ``hack`` folder where -DFHack binary and system data is stored, a ``dfhack-config`` folder where user -data and configuration is stored, and a ``blueprints`` folder where `quickfort` -blueprints are stored. To install DFHack, copy all of the files from the DFHack -archive into the root DF folder, which should already include a ``data`` folder -and a ``raw`` folder, among other things. Some packs and other redistributions -of Dwarf Fortress may place DF in another folder, so ensure that the ``hack`` -folder ends up next to the ``data`` folder. +The release archives contain a ``hack`` folder where DFHack binary and system +data is stored, a ``stonesense`` folder that contains data specific to the +`stonesense` 3d renderer, and various libraries and executable files. To +install DFHack, copy all of the files from the DFHack archive into the root DF +folder, which should already include a ``data`` folder and a ``mods`` folder, +among other things. Some redistributions of Dwarf Fortress may place DF in +another folder, so ensure that the ``hack`` folder ends up next to the ``data`` +folder, and you'll be fine. .. note:: @@ -112,58 +87,34 @@ folder ends up next to the ``data`` folder. overwrite ``SDL.dll`` if prompted. (If you are not prompted, you may be installing DFHack in the wrong place.) - Uninstalling DFHack =================== -Uninstalling DFHack essentially involves reversing what you did to install -DFHack. On Windows, replace ``SDL.dll`` with ``SDLreal.dll`` first. Then, you +Manually uninstalling DFHack essentially involves reversing what you did to +install. On Windows, replace ``SDL.dll`` with ``SDLreal.dll`` first. Then, you can remove any files that were part of the DFHack archive. DFHack does not currently maintain a list of these files, so if you want to completely remove them, you should consult the DFHack archive that you installed for a full list. Generally, any files left behind should not negatively affect DF. +On Steam, uninstalling DFHack will cleanly remove everything that was installed +with DFHack, **including** the ``SDL.dll`` file, which will render Dwarf +Fortress inoperative. In your Steam client, open the properties window for +Dwarf Fortress, select "Local Files", and click on "Verify integrity of game +files...". This will get Dwarf Fortress working properly again. + +Note that Steam will leave behind the ``dfhack-config`` folder, which contains +all your personal DFHack-related settings and data. If you keep this folder, +all your settings will be restored when you reinstall DFHack later. Upgrading DFHack ================ -The recommended approach to upgrade DFHack is to uninstall DFHack first, then -install the new version. This will ensure that any files that are only part -of the older DFHack installation do not affect the new DFHack installation -(although this is unlikely to occur). - -It is also possible to overwrite an existing DFHack installation in-place. -To do this, follow the installation instructions above, but overwrite all files -that exist in the new DFHack archive (on Windows, this includes ``SDL.dll`` again). - -.. note:: - - You may wish to make a backup of your ``dfhack-config`` folder first if you - have made changes to it. Some archive managers (e.g. Archive Utility on macOS) - will overwrite the entire folder, removing any files that you have added. - - -Pre-packaged DFHack installations -================================= - -There are :wiki:`several packs available ` that include -DF, DFHack, and other utilities. If you are new to Dwarf Fortress and DFHack, -these may be easier to set up. Note that these packs are not maintained by the -DFHack team and vary in their release schedules and contents. Some may make -significant configuration changes, and some may not include DFHack at all. - -Linux packages -============== - -Third-party DFHack packages are available for some Linux distributions, -including in: +Again, if you have installed from Steam, your copy of DFHack will automatically be kept up to date. This section is for manual installers. -* `AUR `__, for Arch and related - distributions -* `RPM Fusion `__, - for Fedora and related distributions +First, remove the ``hack`` and ``stonesense`` folders in their entirety. This +ensures that files that don't exist in the latest version are properly removed +and don't affect your new installation. -Note that these may lag behind DFHack releases. If you want to use a newer -version of DFHack, we generally recommended installing it in a clean copy of DF -in your home folder. Attempting to upgrade an installation of DFHack from a -package manager may break it. +Then, extract the DFHack release archive into your Dwarf Fortress folder, +overwriting any remaining top-level files (including SDL.dll). diff --git a/docs/changelog.txt b/docs/changelog.txt index e63b80bd7..8beb3dc6e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -55,6 +55,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - Core: hide DFHack terminal console by default when running on Steam Deck ## Documentation +- `installing`: updated to include Steam installation instructions ## API From e16b01898b7f8788dcaf7ec97caef36f86847e7d Mon Sep 17 00:00:00 2001 From: Myk Date: Mon, 10 Apr 2023 20:35:05 -0700 Subject: [PATCH 255/439] Mention save instead of mods --- docs/Installing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Installing.rst b/docs/Installing.rst index a80133e88..15a6276bf 100644 --- a/docs/Installing.rst +++ b/docs/Installing.rst @@ -75,7 +75,7 @@ The release archives contain a ``hack`` folder where DFHack binary and system data is stored, a ``stonesense`` folder that contains data specific to the `stonesense` 3d renderer, and various libraries and executable files. To install DFHack, copy all of the files from the DFHack archive into the root DF -folder, which should already include a ``data`` folder and a ``mods`` folder, +folder, which should already include a ``data`` folder and a ``save`` folder, among other things. Some redistributions of Dwarf Fortress may place DF in another folder, so ensure that the ``hack`` folder ends up next to the ``data`` folder, and you'll be fine. From 51047367f4e29694f0a5b78f5c418826d6b5a09e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Apr 2023 23:07:18 -0700 Subject: [PATCH 256/439] fix index out of bounds error when reading gems --- docs/changelog.txt | 2 ++ plugins/lua/stockpiles.lua | 2 +- plugins/stockpiles/StockpileSerializer.cpp | 20 ++++++++++++-------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 8beb3dc6e..7c52315ea 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls - `combine`: fix error processing stockpiles with boundaries that extend outside of the map - `prospector`: display both "raw" Z levels and "cooked" elevations +- `stockpiles`: fix crash when importing settings for gems from other worlds +- `stockpiles`: allow numbers in saved stockpile filenames ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index 6134f0a1b..9e17cbe2b 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -62,7 +62,7 @@ local function assert_safe_name(name) if not name or #name == 0 then qerror('name missing or empty') end - if name:find('[^%a._]') then + if name:find('[^%w._]') then qerror('name can only contain numbers, letters, periods, and underscores') end end diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index f6a63ff4f..529e402bd 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -1848,7 +1848,7 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const vector& unserialize_list_material("mats/rough", all, val, filters, gem_mat_is_allowed, [&](const size_t& idx) -> const string& { return bgems.rough_mats(idx); }, - bgems.rough_mats_size(),pgems.rough_mats); + bgems.rough_mats_size(), pgems.rough_mats); unserialize_list_material("mats/cut", all, val, filters, gem_cut_mat_is_allowed, [&](const size_t& idx) -> const string& { return bgems.cut_mats(idx); }, @@ -1871,13 +1871,17 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const vector& return; } else { MaterialInfo mi; - for (size_t i = 0; i < builtin_size; ++i) { - string id = bgems.rough_other_mats(i); - if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) - set_filter_elem("other/rough", filters, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); - id = bgems.cut_other_mats(i); - if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) - set_filter_elem("other/cut", filters, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); + for (int i = 0; i < (int)builtin_size; ++i) { + if (i < bgems.rough_other_mats_size()) { + string id = bgems.rough_other_mats(i); + if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) + set_filter_elem("other/rough", filters, val, id, mi.type, pgems.rough_other_mats.at(mi.type)); + } + if (i < bgems.cut_other_mats_size()) { + string id = bgems.cut_other_mats(i); + if (mi.find(id) && mi.isValid() && size_t(mi.type) < builtin_size) + set_filter_elem("other/cut", filters, val, id, mi.type, pgems.cut_other_mats.at(mi.type)); + } } } }); From c5ff1622cd82113aabee9c2d55184c67ed95dca9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 00:39:22 -0700 Subject: [PATCH 257/439] reformat code and clean up headers --- plugins/getplants.cpp | 319 ++++++++++++++++-------------------------- 1 file changed, 119 insertions(+), 200 deletions(-) diff --git a/plugins/getplants.cpp b/plugins/getplants.cpp index 565316fa6..c9db92f5a 100644 --- a/plugins/getplants.cpp +++ b/plugins/getplants.cpp @@ -1,13 +1,5 @@ -// (un)designate matching plants for gathering/cutting -#include - -#include "Core.h" -#include "Console.h" -#include "Export.h" #include "PluginManager.h" -#include "DataDefs.h" #include "TileTypes.h" -#include "MiscUtils.h" #include "df/map_block.h" #include "df/map_block_column.h" @@ -76,48 +68,38 @@ enum class selectability { // result in the plants not being usable for farming or even collectable at all). //selectability selectablePlant(color_ostream &out, const df::plant_raw *plant, bool farming) -selectability selectablePlant(const df::plant_raw *plant, bool farming) -{ +selectability selectablePlant(const df::plant_raw* plant, bool farming) { const DFHack::MaterialInfo basic_mat = DFHack::MaterialInfo(plant->material_defs.type[plant_material_def::basic_mat], plant->material_defs.idx[plant_material_def::basic_mat]); bool outOfSeason = false; selectability result = selectability::Nonselectable; - if (plant->flags.is_set(plant_raw_flags::TREE)) - { -// out.print("%s is a selectable tree\n", plant->id.c_str()); - if (farming) - { + if (plant->flags.is_set(plant_raw_flags::TREE)) { + // out.print("%s is a selectable tree\n", plant->id.c_str()); + if (farming) { return selectability::Nonselectable; } - else - { + else { return selectability::Selectable; } } - else if (plant->flags.is_set(plant_raw_flags::GRASS)) - { -// out.print("%s is a non selectable Grass\n", plant->id.c_str()); + else if (plant->flags.is_set(plant_raw_flags::GRASS)) { + // out.print("%s is a non selectable Grass\n", plant->id.c_str()); return selectability::Grass; } - if (farming && plant->material_defs.type[plant_material_def::seed] == -1) - { + if (farming && plant->material_defs.type[plant_material_def::seed] == -1) { return selectability::Nonselectable; } if (basic_mat.material->flags.is_set(material_flags::EDIBLE_RAW) || - basic_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) - { -// out.print("%s is edible\n", plant->id.c_str()); - if (farming) - { - if (basic_mat.material->flags.is_set(material_flags::EDIBLE_RAW)) - { + basic_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) { + // out.print("%s is edible\n", plant->id.c_str()); + if (farming) { + if (basic_mat.material->flags.is_set(material_flags::EDIBLE_RAW)) { result = selectability::Selectable; } } - else - { + else { return selectability::Selectable; } } @@ -126,54 +108,43 @@ selectability selectablePlant(const df::plant_raw *plant, bool farming) plant->flags.is_set(plant_raw_flags::MILL) || plant->flags.is_set(plant_raw_flags::EXTRACT_VIAL) || plant->flags.is_set(plant_raw_flags::EXTRACT_BARREL) || - plant->flags.is_set(plant_raw_flags::EXTRACT_STILL_VIAL)) - { -// out.print("%s is thread/mill/extract\n", plant->id.c_str()); - if (farming) - { + plant->flags.is_set(plant_raw_flags::EXTRACT_STILL_VIAL)) { + // out.print("%s is thread/mill/extract\n", plant->id.c_str()); + if (farming) { result = selectability::Selectable; } - else - { + else { return selectability::Selectable; } } if (basic_mat.material->reaction_product.id.size() > 0 || - basic_mat.material->reaction_class.size() > 0) - { -// out.print("%s has a reaction\n", plant->id.c_str()); - if (farming) - { + basic_mat.material->reaction_class.size() > 0) { + // out.print("%s has a reaction\n", plant->id.c_str()); + if (farming) { result = selectability::Selectable; } - else - { + else { return selectability::Selectable; } } - for (size_t i = 0; i < plant->growths.size(); i++) - { + for (size_t i = 0; i < plant->growths.size(); i++) { if (plant->growths[i]->item_type == df::item_type::SEEDS || // Only trees have seed growths in vanilla, but raws can be modded... - plant->growths[i]->item_type == df::item_type::PLANT_GROWTH) - { + plant->growths[i]->item_type == df::item_type::PLANT_GROWTH) { const DFHack::MaterialInfo growth_mat = DFHack::MaterialInfo(plant->growths[i]->mat_type, plant->growths[i]->mat_index); if ((plant->growths[i]->item_type == df::item_type::SEEDS && - (growth_mat.material->flags.is_set(material_flags::EDIBLE_COOKED) || - growth_mat.material->flags.is_set(material_flags::EDIBLE_RAW))) || + (growth_mat.material->flags.is_set(material_flags::EDIBLE_COOKED) || + growth_mat.material->flags.is_set(material_flags::EDIBLE_RAW))) || (plant->growths[i]->item_type == df::item_type::PLANT_GROWTH && - growth_mat.material->flags.is_set(material_flags::LEAF_MAT))) // Will change name to STOCKPILE_PLANT_GROWTH any day now... + growth_mat.material->flags.is_set(material_flags::LEAF_MAT))) // Will change name to STOCKPILE_PLANT_GROWTH any day now... { bool seedSource = plant->growths[i]->item_type == df::item_type::SEEDS; - if (plant->growths[i]->item_type == df::item_type::PLANT_GROWTH) - { - for (size_t k = 0; growth_mat.material->reaction_product.material.mat_type.size(); k++) - { + if (plant->growths[i]->item_type == df::item_type::PLANT_GROWTH) { + for (size_t k = 0; growth_mat.material->reaction_product.material.mat_type.size(); k++) { if (growth_mat.material->reaction_product.material.mat_type[k] == plant->material_defs.type[plant_material_def::seed] && - growth_mat.material->reaction_product.material.mat_index[k] == plant->material_defs.idx[plant_material_def::seed]) - { + growth_mat.material->reaction_product.material.mat_index[k] == plant->material_defs.idx[plant_material_def::seed]) { seedSource = true; break; } @@ -182,52 +153,46 @@ selectability selectablePlant(const df::plant_raw *plant, bool farming) if (*cur_year_tick >= plant->growths[i]->timing_1 && (plant->growths[i]->timing_2 == -1 || - *cur_year_tick <= plant->growths[i]->timing_2)) - { -// out.print("%s has an edible seed or a stockpile growth\n", plant->id.c_str()); - if (!farming || seedSource) - { + *cur_year_tick <= plant->growths[i]->timing_2)) { + // out.print("%s has an edible seed or a stockpile growth\n", plant->id.c_str()); + if (!farming || seedSource) { return selectability::Selectable; } } - else - { - if (!farming || seedSource) - { + else { + if (!farming || seedSource) { outOfSeason = true; } } } } -/* else if (plant->growths[i]->behavior.bits.has_seed) // This code designates beans, etc. when DF doesn't, but plant gatherers still fail to collect anything, so it's useless: bug #0006940. - { - const DFHack::MaterialInfo seed_mat = DFHack::MaterialInfo(plant->material_defs.type[plant_material_def::seed], plant->material_defs.idx[plant_material_def::seed]); - - if (seed_mat.material->flags.is_set(material_flags::EDIBLE_RAW) || - seed_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) - { - if (*cur_year_tick >= plant->growths[i]->timing_1 && - (plant->growths[i]->timing_2 == -1 || - *cur_year_tick <= plant->growths[i]->timing_2)) + /* else if (plant->growths[i]->behavior.bits.has_seed) // This code designates beans, etc. when DF doesn't, but plant gatherers still fail to collect anything, so it's useless: bug #0006940. { - return selectability::Selectable; - } - else - { - outOfSeason = true; - } - } - } */ + const DFHack::MaterialInfo seed_mat = DFHack::MaterialInfo(plant->material_defs.type[plant_material_def::seed], plant->material_defs.idx[plant_material_def::seed]); + + if (seed_mat.material->flags.is_set(material_flags::EDIBLE_RAW) || + seed_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) + { + if (*cur_year_tick >= plant->growths[i]->timing_1 && + (plant->growths[i]->timing_2 == -1 || + *cur_year_tick <= plant->growths[i]->timing_2)) + { + return selectability::Selectable; + } + else + { + outOfSeason = true; + } + } + } */ } - if (outOfSeason) - { -// out.print("%s has an out of season growth\n", plant->id.c_str()); + if (outOfSeason) { + // out.print("%s has an out of season growth\n", plant->id.c_str()); return selectability::OutOfSeason; } - else - { -// out.printerr("%s cannot be gathered\n", plant->id.c_str()); + else { + // out.printerr("%s cannot be gathered\n", plant->id.c_str()); return result; } } @@ -241,17 +206,17 @@ bool ripe(int32_t x, int32_t y, int32_t start, int32_t end) { } // Looks in the picked growths vector to see if a matching growth has been marked as picked. -bool picked(const df::plant *plant, int32_t growth_subtype) { - df::world_data *world_data = world->world_data; - df::world_site *site = df::world_site::find(plotinfo->site_id); +bool picked(const df::plant* plant, int32_t growth_subtype) { + df::world_data* world_data = world->world_data; + df::world_site* site = df::world_site::find(plotinfo->site_id); int32_t pos_x = site->global_min_x + plant->pos.x / 48; int32_t pos_y = site->global_min_y + plant->pos.y / 48; size_t id = pos_x + pos_y * 16 * world_data->world_width; - df::world_object_data *object_data = df::world_object_data::find(id); + df::world_object_data* object_data = df::world_object_data::find(id); if (!object_data) { return false; } - df::map_block_column *column = world->map.map_block_columns[(plant->pos.x / 16) * world->map.x_count_block + (plant->pos.y / 16)]; + df::map_block_column* column = world->map.map_block_columns[(plant->pos.x / 16) * world->map.x_count_block + (plant->pos.y / 16)]; for (size_t i = 0; i < object_data->picked_growths.x.size(); i++) { if (object_data->picked_growths.x[i] == plant->pos.x && @@ -266,13 +231,12 @@ bool picked(const df::plant *plant, int32_t growth_subtype) { return false; } -bool designate(const df::plant *plant, bool farming) { - df::plant_raw *plant_raw = world->raws.plants.all[plant->material]; +bool designate(const df::plant* plant, bool farming) { + df::plant_raw* plant_raw = world->raws.plants.all[plant->material]; const DFHack::MaterialInfo basic_mat = DFHack::MaterialInfo(plant_raw->material_defs.type[plant_material_def::basic_mat], plant_raw->material_defs.idx[plant_material_def::basic_mat]); if (basic_mat.material->flags.is_set(material_flags::EDIBLE_RAW) || - basic_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) - { + basic_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) { return Designations::markPlant(plant); } @@ -280,42 +244,35 @@ bool designate(const df::plant *plant, bool farming) { plant_raw->flags.is_set(plant_raw_flags::MILL) || plant_raw->flags.is_set(plant_raw_flags::EXTRACT_VIAL) || plant_raw->flags.is_set(plant_raw_flags::EXTRACT_BARREL) || - plant_raw->flags.is_set(plant_raw_flags::EXTRACT_STILL_VIAL)) - { + plant_raw->flags.is_set(plant_raw_flags::EXTRACT_STILL_VIAL)) { if (!farming) { return Designations::markPlant(plant); } } if (basic_mat.material->reaction_product.id.size() > 0 || - basic_mat.material->reaction_class.size() > 0) - { + basic_mat.material->reaction_class.size() > 0) { if (!farming) { return Designations::markPlant(plant); } } - for (size_t i = 0; i < plant_raw->growths.size(); i++) - { + for (size_t i = 0; i < plant_raw->growths.size(); i++) { if (plant_raw->growths[i]->item_type == df::item_type::SEEDS || // Only trees have seed growths in vanilla, but raws can be modded... - plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) - { + plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) { const DFHack::MaterialInfo growth_mat = DFHack::MaterialInfo(plant_raw->growths[i]->mat_type, plant_raw->growths[i]->mat_index); if ((plant_raw->growths[i]->item_type == df::item_type::SEEDS && (growth_mat.material->flags.is_set(material_flags::EDIBLE_COOKED) || growth_mat.material->flags.is_set(material_flags::EDIBLE_RAW))) || - (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH && - growth_mat.material->flags.is_set(material_flags::LEAF_MAT))) // Will change name to STOCKPILE_PLANT_GROWTH any day now... + (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH && + growth_mat.material->flags.is_set(material_flags::LEAF_MAT))) // Will change name to STOCKPILE_PLANT_GROWTH any day now... { bool seedSource = plant_raw->growths[i]->item_type == df::item_type::SEEDS; - if (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) - { - for (size_t k = 0; growth_mat.material->reaction_product.material.mat_type.size(); k++) - { + if (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) { + for (size_t k = 0; growth_mat.material->reaction_product.material.mat_type.size(); k++) { if (growth_mat.material->reaction_product.material.mat_type[k] == plant_raw->material_defs.type[plant_material_def::seed] && - growth_mat.material->reaction_product.material.mat_index[k] == plant_raw->material_defs.idx[plant_material_def::seed]) - { + growth_mat.material->reaction_product.material.mat_index[k] == plant_raw->material_defs.idx[plant_material_def::seed]) { seedSource = true; break; } @@ -324,8 +281,7 @@ bool designate(const df::plant *plant, bool farming) { bool istree = (tileMaterial(Maps::getTileBlock(plant->pos)->tiletype[plant->pos.x % 16][plant->pos.y % 16]) == tiletype_material::TREE); bool isripe = ripe(plant->pos.x, plant->pos.y, plant_raw->growths[i]->timing_1, plant_raw->growths[i]->timing_2); - if ((!farming || seedSource) && (istree || isripe) && !picked(plant, i)) - { + if ((!farming || seedSource) && (istree || isripe) && !picked(plant, i)) { return Designations::markPlant(plant); } } @@ -335,8 +291,7 @@ bool designate(const df::plant *plant, bool farming) { return false; } -command_result df_getplants (color_ostream &out, vector & parameters) -{ +command_result df_getplants(color_ostream& out, vector & parameters) { string plantMatStr = ""; std::vector plantSelections; std::vector collectionCount; @@ -348,16 +303,14 @@ command_result df_getplants (color_ostream &out, vector & parameters) plantSelections.resize(world->raws.plants.all.size()); collectionCount.resize(world->raws.plants.all.size()); - for (size_t i = 0; i < plantSelections.size(); i++) - { + for (size_t i = 0; i < plantSelections.size(); i++) { plantSelections[i] = selectability::Unselected; collectionCount[i] = 0; } bool anyPlantsSelected = false; - for (size_t i = 0; i < parameters.size(); i++) - { + for (size_t i = 0; i < parameters.size(); i++) { if (parameters[i] == "help" || parameters[i] == "?") return CR_WRONG_USAGE; else if (parameters[i] == "-t") @@ -374,23 +327,18 @@ command_result df_getplants (color_ostream &out, vector & parameters) verbose = true; else if (parameters[i] == "-f") farming = true; - else if (parameters[i] == "-n") - { - if (parameters.size() > i + 1) - { + else if (parameters[i] == "-n") { + if (parameters.size() > i + 1) { maxCount = atoi(parameters[i + 1].c_str()); - if (maxCount >= 1) - { + if (maxCount >= 1) { i++; // We've consumed the next parameter, so we need to progress the iterator. } - else - { + else { out.printerr("-n requires a positive integer parameter!\n"); return CR_WRONG_USAGE; } } - else - { + else { out.printerr("-n requires a positive integer parameter!\n"); return CR_WRONG_USAGE; } @@ -398,55 +346,45 @@ command_result df_getplants (color_ostream &out, vector & parameters) else plantNames.insert(toUpper(parameters[i])); } - if (treesonly && shrubsonly) - { + if (treesonly && shrubsonly) { out.printerr("Cannot specify both -t and -s at the same time!\n"); return CR_WRONG_USAGE; } - if (treesonly && farming) - { + if (treesonly && farming) { out.printerr("Cannot specify both -t and -f at the same time!\n"); return CR_WRONG_USAGE; } - if (all && exclude) - { + if (all && exclude) { out.printerr("Cannot specify both -a and -x at the same time!\n"); return CR_WRONG_USAGE; } - if (all && plantNames.size()) - { + if (all && plantNames.size()) { out.printerr("Cannot specify -a along with plant IDs!\n"); return CR_WRONG_USAGE; } CoreSuspender suspend; - for (size_t i = 0; i < world->raws.plants.all.size(); i++) - { - df::plant_raw *plant = world->raws.plants.all[i]; - if (all) - { -// plantSelections[i] = selectablePlant(out, plant, farming); + for (size_t i = 0; i < world->raws.plants.all.size(); i++) { + df::plant_raw* plant = world->raws.plants.all[i]; + if (all) { + // plantSelections[i] = selectablePlant(out, plant, farming); plantSelections[i] = selectablePlant(plant, farming); } - else if (plantNames.find(plant->id) != plantNames.end()) - { + else if (plantNames.find(plant->id) != plantNames.end()) { plantNames.erase(plant->id); -// plantSelections[i] = selectablePlant(out, plant, farming); + // plantSelections[i] = selectablePlant(out, plant, farming); plantSelections[i] = selectablePlant(plant, farming); - switch (plantSelections[i]) - { + switch (plantSelections[i]) { case selectability::Grass: out.printerr("%s is a grass and cannot be gathered\n", plant->id.c_str()); break; case selectability::Nonselectable: - if (farming) - { + if (farming) { out.printerr("%s does not have any parts that can be gathered for seeds for farming\n", plant->id.c_str()); } - else - { + else { out.printerr("%s does not have any parts that can be gathered\n", plant->id.c_str()); } break; @@ -463,8 +401,7 @@ command_result df_getplants (color_ostream &out, vector & parameters) } } } - if (plantNames.size() > 0) - { + if (plantNames.size() > 0) { out.printerr("Invalid plant ID(s):"); for (set::const_iterator it = plantNames.begin(); it != plantNames.end(); it++) out.printerr(" %s", it->c_str()); @@ -472,33 +409,27 @@ command_result df_getplants (color_ostream &out, vector & parameters) return CR_FAILURE; } - for (size_t i = 0; i < plantSelections.size(); i++) - { + for (size_t i = 0; i < plantSelections.size(); i++) { if (plantSelections[i] == selectability::OutOfSeason || - plantSelections[i] == selectability::Selectable) - { + plantSelections[i] == selectability::Selectable) { anyPlantsSelected = true; break; } } - if (!anyPlantsSelected) - { + if (!anyPlantsSelected) { out.print("Valid plant IDs:\n"); - for (size_t i = 0; i < world->raws.plants.all.size(); i++) - { - df::plant_raw *plant = world->raws.plants.all[i]; -// switch (selectablePlant(out, plant, farming)) - switch (selectablePlant(plant, farming)) - { + for (size_t i = 0; i < world->raws.plants.all.size(); i++) { + df::plant_raw* plant = world->raws.plants.all[i]; + // switch (selectablePlant(out, plant, farming)) + switch (selectablePlant(plant, farming)) { case selectability::Grass: case selectability::Nonselectable: continue; case selectability::OutOfSeason: { - if (!treesonly) - { + if (!treesonly) { out.print("* (shrub) %s - %s is out of season\n", plant->id.c_str(), plant->name.c_str()); } break; @@ -523,22 +454,19 @@ command_result df_getplants (color_ostream &out, vector & parameters) } count = 0; - for (size_t i = 0; i < world->plants.all.size(); i++) - { - const df::plant *plant = world->plants.all[i]; - df::map_block *cur = Maps::getTileBlock(plant->pos); + for (size_t i = 0; i < world->plants.all.size(); i++) { + const df::plant* plant = world->plants.all[i]; + df::map_block* cur = Maps::getTileBlock(plant->pos); int x = plant->pos.x % 16; int y = plant->pos.y % 16; if (plantSelections[plant->material] == selectability::OutOfSeason || - plantSelections[plant->material] == selectability::Selectable) - { + plantSelections[plant->material] == selectability::Selectable) { if (exclude || plantSelections[plant->material] == selectability::OutOfSeason) continue; } - else - { + else { if (!exclude) continue; } @@ -553,37 +481,29 @@ command_result df_getplants (color_ostream &out, vector & parameters) continue; if (collectionCount[plant->material] >= maxCount) continue; - if (deselect && Designations::unmarkPlant(plant)) - { + if (deselect && Designations::unmarkPlant(plant)) { collectionCount[plant->material]++; ++count; } - if (!deselect && designate(plant, farming)) - { -// out.print("Designated %s at (%i, %i, %i), %d\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z, (int)i); + if (!deselect && designate(plant, farming)) { + // out.print("Designated %s at (%i, %i, %i), %d\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z, (int)i); collectionCount[plant->material]++; ++count; } } - if (count) - { - if (verbose) - { - for (size_t i = 0; i < plantSelections.size(); i++) - { - if (collectionCount[i] > 0) - out.print("Updated %d %s designations.\n", (int)collectionCount[i], world->raws.plants.all[i]->id.c_str()); - } - out.print("\n"); + if (count && verbose) { + for (size_t i = 0; i < plantSelections.size(); i++) { + if (collectionCount[i] > 0) + out.print("Updated %d %s designations.\n", (int)collectionCount[i], world->raws.plants.all[i]->id.c_str()); } + out.print("\n"); } out.print("Updated %d plant designations.\n", (int)count); return CR_OK; } -DFhackCExport command_result plugin_init ( color_ostream &out, vector &commands) -{ +DFhackCExport command_result plugin_init(color_ostream& out, vector & commands) { commands.push_back(PluginCommand( "getplants", "Designate trees for chopping and shrubs for gathering.", @@ -591,7 +511,6 @@ DFhackCExport command_result plugin_init ( color_ostream &out, vector Date: Tue, 11 Apr 2023 00:58:40 -0700 Subject: [PATCH 258/439] add debug logging --- plugins/getplants.cpp | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/plugins/getplants.cpp b/plugins/getplants.cpp index c9db92f5a..821dfa0b7 100644 --- a/plugins/getplants.cpp +++ b/plugins/getplants.cpp @@ -1,3 +1,4 @@ +#include "Debug.h" #include "PluginManager.h" #include "TileTypes.h" @@ -24,6 +25,11 @@ using std::set; using namespace DFHack; using namespace df::enums; +namespace DFHack +{ +DBG_DECLARE(getplants, log, DebugCategory::LINFO); +} + DFHACK_PLUGIN("getplants"); REQUIRE_GLOBAL(plotinfo); REQUIRE_GLOBAL(world); @@ -67,14 +73,13 @@ enum class selectability { // is one of the issues in bug 6940 on the bug tracker (the others cases are detected and // result in the plants not being usable for farming or even collectable at all). -//selectability selectablePlant(color_ostream &out, const df::plant_raw *plant, bool farming) -selectability selectablePlant(const df::plant_raw* plant, bool farming) { +selectability selectablePlant(color_ostream& out, const df::plant_raw* plant, bool farming) { const DFHack::MaterialInfo basic_mat = DFHack::MaterialInfo(plant->material_defs.type[plant_material_def::basic_mat], plant->material_defs.idx[plant_material_def::basic_mat]); bool outOfSeason = false; selectability result = selectability::Nonselectable; if (plant->flags.is_set(plant_raw_flags::TREE)) { - // out.print("%s is a selectable tree\n", plant->id.c_str()); + DEBUG(log, out).print("%s is a selectable tree\n", plant->id.c_str()); if (farming) { return selectability::Nonselectable; } @@ -83,7 +88,7 @@ selectability selectablePlant(const df::plant_raw* plant, bool farming) { } } else if (plant->flags.is_set(plant_raw_flags::GRASS)) { - // out.print("%s is a non selectable Grass\n", plant->id.c_str()); + DEBUG(log, out).print("%s is a non selectable Grass\n", plant->id.c_str()); return selectability::Grass; } @@ -93,7 +98,7 @@ selectability selectablePlant(const df::plant_raw* plant, bool farming) { if (basic_mat.material->flags.is_set(material_flags::EDIBLE_RAW) || basic_mat.material->flags.is_set(material_flags::EDIBLE_COOKED)) { - // out.print("%s is edible\n", plant->id.c_str()); + DEBUG(log, out).print("%s is edible\n", plant->id.c_str()); if (farming) { if (basic_mat.material->flags.is_set(material_flags::EDIBLE_RAW)) { result = selectability::Selectable; @@ -109,7 +114,7 @@ selectability selectablePlant(const df::plant_raw* plant, bool farming) { plant->flags.is_set(plant_raw_flags::EXTRACT_VIAL) || plant->flags.is_set(plant_raw_flags::EXTRACT_BARREL) || plant->flags.is_set(plant_raw_flags::EXTRACT_STILL_VIAL)) { - // out.print("%s is thread/mill/extract\n", plant->id.c_str()); + DEBUG(log, out).print("%s is thread/mill/extract\n", plant->id.c_str()); if (farming) { result = selectability::Selectable; } @@ -120,7 +125,7 @@ selectability selectablePlant(const df::plant_raw* plant, bool farming) { if (basic_mat.material->reaction_product.id.size() > 0 || basic_mat.material->reaction_class.size() > 0) { - // out.print("%s has a reaction\n", plant->id.c_str()); + DEBUG(log, out).print("%s has a reaction\n", plant->id.c_str()); if (farming) { result = selectability::Selectable; } @@ -154,7 +159,7 @@ selectability selectablePlant(const df::plant_raw* plant, bool farming) { if (*cur_year_tick >= plant->growths[i]->timing_1 && (plant->growths[i]->timing_2 == -1 || *cur_year_tick <= plant->growths[i]->timing_2)) { - // out.print("%s has an edible seed or a stockpile growth\n", plant->id.c_str()); + DEBUG(log, out).print("%s has an edible seed or a stockpile growth\n", plant->id.c_str()); if (!farming || seedSource) { return selectability::Selectable; } @@ -188,11 +193,11 @@ selectability selectablePlant(const df::plant_raw* plant, bool farming) { } if (outOfSeason) { - // out.print("%s has an out of season growth\n", plant->id.c_str()); + DEBUG(log, out).print("%s has an out of season growth\n", plant->id.c_str()); return selectability::OutOfSeason; } else { - // out.printerr("%s cannot be gathered\n", plant->id.c_str()); + DEBUG(log, out).print("%s cannot be gathered\n", plant->id.c_str()); return result; } } @@ -368,13 +373,11 @@ command_result df_getplants(color_ostream& out, vector & parameters) { for (size_t i = 0; i < world->raws.plants.all.size(); i++) { df::plant_raw* plant = world->raws.plants.all[i]; if (all) { - // plantSelections[i] = selectablePlant(out, plant, farming); - plantSelections[i] = selectablePlant(plant, farming); + plantSelections[i] = selectablePlant(out, plant, farming); } else if (plantNames.find(plant->id) != plantNames.end()) { plantNames.erase(plant->id); - // plantSelections[i] = selectablePlant(out, plant, farming); - plantSelections[i] = selectablePlant(plant, farming); + plantSelections[i] = selectablePlant(out, plant, farming); switch (plantSelections[i]) { case selectability::Grass: out.printerr("%s is a grass and cannot be gathered\n", plant->id.c_str()); @@ -421,8 +424,7 @@ command_result df_getplants(color_ostream& out, vector & parameters) { out.print("Valid plant IDs:\n"); for (size_t i = 0; i < world->raws.plants.all.size(); i++) { df::plant_raw* plant = world->raws.plants.all[i]; - // switch (selectablePlant(out, plant, farming)) - switch (selectablePlant(plant, farming)) { + switch (selectablePlant(out, plant, farming)) { case selectability::Grass: case selectability::Nonselectable: continue; @@ -486,7 +488,7 @@ command_result df_getplants(color_ostream& out, vector & parameters) { ++count; } if (!deselect && designate(plant, farming)) { - // out.print("Designated %s at (%i, %i, %i), %d\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z, (int)i); + DEBUG(log, out).print("Designated %s at (%i, %i, %i), %d\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z, (int)i); collectionCount[plant->material]++; ++count; } From cbf1e236721ee79f212d504ccfb6428d5c763208 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 02:34:45 -0700 Subject: [PATCH 259/439] fix designation of non-fruit trees --- plugins/getplants.cpp | 66 +++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/plugins/getplants.cpp b/plugins/getplants.cpp index 821dfa0b7..87f1c0e76 100644 --- a/plugins/getplants.cpp +++ b/plugins/getplants.cpp @@ -236,7 +236,15 @@ bool picked(const df::plant* plant, int32_t growth_subtype) { return false; } -bool designate(const df::plant* plant, bool farming) { +bool designate(color_ostream& out, const df::plant* plant, bool farming) { + TRACE(log, out).print("Attempting to designate %s at (%i, %i, %i)\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z); + + if (!farming) { + bool istree = (tileMaterial(Maps::getTileBlock(plant->pos)->tiletype[plant->pos.x % 16][plant->pos.y % 16]) == tiletype_material::TREE); + if (istree) + return Designations::markPlant(plant); + } + df::plant_raw* plant_raw = world->raws.plants.all[plant->material]; const DFHack::MaterialInfo basic_mat = DFHack::MaterialInfo(plant_raw->material_defs.type[plant_material_def::basic_mat], plant_raw->material_defs.idx[plant_material_def::basic_mat]); @@ -263,34 +271,40 @@ bool designate(const df::plant* plant, bool farming) { } for (size_t i = 0; i < plant_raw->growths.size(); i++) { - if (plant_raw->growths[i]->item_type == df::item_type::SEEDS || // Only trees have seed growths in vanilla, but raws can be modded... - plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) { - const DFHack::MaterialInfo growth_mat = DFHack::MaterialInfo(plant_raw->growths[i]->mat_type, plant_raw->growths[i]->mat_index); - if ((plant_raw->growths[i]->item_type == df::item_type::SEEDS && - (growth_mat.material->flags.is_set(material_flags::EDIBLE_COOKED) || - growth_mat.material->flags.is_set(material_flags::EDIBLE_RAW))) || - (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH && - growth_mat.material->flags.is_set(material_flags::LEAF_MAT))) // Will change name to STOCKPILE_PLANT_GROWTH any day now... - { - bool seedSource = plant_raw->growths[i]->item_type == df::item_type::SEEDS; + TRACE(log, out).print("growth item type=%d\n", plant_raw->growths[i]->item_type); + // Only trees have seed growths in vanilla, but raws can be modded... + if (plant_raw->growths[i]->item_type != df::item_type::SEEDS && + plant_raw->growths[i]->item_type != df::item_type::PLANT_GROWTH) + continue; - if (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) { - for (size_t k = 0; growth_mat.material->reaction_product.material.mat_type.size(); k++) { - if (growth_mat.material->reaction_product.material.mat_type[k] == plant_raw->material_defs.type[plant_material_def::seed] && - growth_mat.material->reaction_product.material.mat_index[k] == plant_raw->material_defs.idx[plant_material_def::seed]) { - seedSource = true; - break; - } - } - } + const DFHack::MaterialInfo growth_mat = DFHack::MaterialInfo(plant_raw->growths[i]->mat_type, plant_raw->growths[i]->mat_index); + TRACE(log, out).print("edible_cooked=%d edible_raw=%d leaf_mat=%d\n", + growth_mat.material->flags.is_set(material_flags::EDIBLE_COOKED), + growth_mat.material->flags.is_set(material_flags::EDIBLE_RAW), + growth_mat.material->flags.is_set(material_flags::LEAF_MAT)); + if (!(plant_raw->growths[i]->item_type == df::item_type::SEEDS && + (growth_mat.material->flags.is_set(material_flags::EDIBLE_COOKED) || + growth_mat.material->flags.is_set(material_flags::EDIBLE_RAW))) && + !(plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH && + growth_mat.material->flags.is_set(material_flags::LEAF_MAT))) // Will change name to STOCKPILE_PLANT_GROWTH any day now... + continue; + + bool seedSource = plant_raw->growths[i]->item_type == df::item_type::SEEDS; - bool istree = (tileMaterial(Maps::getTileBlock(plant->pos)->tiletype[plant->pos.x % 16][plant->pos.y % 16]) == tiletype_material::TREE); - bool isripe = ripe(plant->pos.x, plant->pos.y, plant_raw->growths[i]->timing_1, plant_raw->growths[i]->timing_2); - if ((!farming || seedSource) && (istree || isripe) && !picked(plant, i)) { - return Designations::markPlant(plant); + if (plant_raw->growths[i]->item_type == df::item_type::PLANT_GROWTH) { + for (size_t k = 0; growth_mat.material->reaction_product.material.mat_type.size(); k++) { + if (growth_mat.material->reaction_product.material.mat_type[k] == plant_raw->material_defs.type[plant_material_def::seed] && + growth_mat.material->reaction_product.material.mat_index[k] == plant_raw->material_defs.idx[plant_material_def::seed]) { + seedSource = true; + break; } } } + + if ((!farming || seedSource) && + ripe(plant->pos.x, plant->pos.y, plant_raw->growths[i]->timing_1, plant_raw->growths[i]->timing_2) && + !picked(plant, i)) + return Designations::markPlant(plant); } return false; @@ -460,6 +474,8 @@ command_result df_getplants(color_ostream& out, vector & parameters) { const df::plant* plant = world->plants.all[i]; df::map_block* cur = Maps::getTileBlock(plant->pos); + TRACE(log, out).print("Examining %s at (%i, %i, %i) [index=%d]\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z, (int)i); + int x = plant->pos.x % 16; int y = plant->pos.y % 16; if (plantSelections[plant->material] == selectability::OutOfSeason || @@ -487,7 +503,7 @@ command_result df_getplants(color_ostream& out, vector & parameters) { collectionCount[plant->material]++; ++count; } - if (!deselect && designate(plant, farming)) { + if (!deselect && designate(out, plant, farming)) { DEBUG(log, out).print("Designated %s at (%i, %i, %i), %d\n", world->raws.plants.all[plant->material]->id.c_str(), plant->pos.x, plant->pos.y, plant->pos.z, (int)i); collectionCount[plant->material]++; ++count; From 20bea5fa217353fb73235cc2d58b2a55bde597e6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 03:49:28 -0700 Subject: [PATCH 260/439] add ability to filter by cloth and silk --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 42 +++++++++++++++----- plugins/lua/buildingplan/filterselection.lua | 2 + 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 7c52315ea..2104158f5 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,6 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game - `buildingplan`: hide planner overlay while the DF tutorial is active so that it can detect when you have placed the carpenter's workshop and bed and allow you to finish the tutorial +- `buildingplan`: can now filter by cloth and silk materials (for ropes) -@ `buildingplan`: rearranged elements of ``planneroverlay`` interface -@ `buildingplan`: rearranged elements of ``itemselection`` interface - Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 2193b380b..1d9f58416 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -12,6 +12,7 @@ #include "df/construction_type.h" #include "df/item.h" #include "df/job_item.h" +#include "df/organic_mat_category.h" #include "df/world.h" using std::map; @@ -150,6 +151,8 @@ static const df::dfhack_material_category wood_cat(df::dfhack_material_category: static const df::dfhack_material_category metal_cat(df::dfhack_material_category::mask_metal); static const df::dfhack_material_category glass_cat(df::dfhack_material_category::mask_glass); static const df::dfhack_material_category clay_cat(df::dfhack_material_category::mask_clay); +static const df::dfhack_material_category cloth_cat(df::dfhack_material_category::mask_cloth); +static const df::dfhack_material_category silk_cat(df::dfhack_material_category::mask_silk); static void cache_matched(int16_t type, int32_t index) { MaterialInfo mi; @@ -169,11 +172,26 @@ static void cache_matched(int16_t type, int32_t index) { } else if (mi.matches(clay_cat)) { DEBUG(status).print("cached clay material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "clay")); + } else if (mi.matches(cloth_cat)) { + DEBUG(status).print("cached cloth material: %s (%d, %d)\n", mi.toString().c_str(), type, index); + mat_cache.emplace(mi.toString(), std::make_pair(mi, "cloth")); + } else if (mi.matches(silk_cat)) { + DEBUG(status).print("cached silk material: %s (%d, %d)\n", mi.toString().c_str(), type, index); + mat_cache.emplace(mi.toString(), std::make_pair(mi, "silk")); } else TRACE(status).print("not matched: %s\n", mi.toString().c_str()); } +static void load_organic_material_cache(df::organic_mat_category cat) { + auto& mat_tab = world->raws.mat_table; + auto& cat_vec = mat_tab.organic_types[cat]; + auto& cat_indices = mat_tab.organic_indexes[cat]; + for (size_t i = 0; i < cat_vec.size(); i++) { + cache_matched(cat_vec[i], cat_indices[i]); + } +} + static void load_material_cache() { df::world_raws &raws = world->raws; for (int i = 1; i < DFHack::MaterialInfo::NUM_BUILTIN; ++i) @@ -183,17 +201,9 @@ static void load_material_cache() { for (size_t i = 0; i < raws.inorganics.size(); i++) cache_matched(0, i); - for (size_t i = 0; i < raws.plants.all.size(); i++) { - df::plant_raw *p = raws.plants.all[i]; - if (p->material.size() <= 1) - continue; - for (size_t j = 0; j < p->material.size(); j++) { - if (p->material[j]->id == "WOOD") { - cache_matched(DFHack::MaterialInfo::PLANT_BASE+j, i); - break; - } - } - } + load_organic_material_cache(df::organic_mat_category::Wood); + load_organic_material_cache(df::organic_mat_category::PlantFiber); + load_organic_material_cache(df::organic_mat_category::Silk); } static HeatSafety get_heat_safety_filter(const BuildingTypeKey &key) { @@ -792,6 +802,10 @@ static int setMaterialMaskFilter(lua_State *L) { mask |= glass_cat.whole; else if (cat == "clay") mask |= clay_cat.whole; + else if (cat == "cloth") + mask |= cloth_cat.whole; + else if (cat == "silk") + mask |= silk_cat.whole; } DEBUG(status,*out).print( "setting material mask filter for building_type=%d subtype=%d custom=%d index=%d to %x\n", @@ -837,6 +851,8 @@ static int getMaterialMaskFilter(lua_State *L) { ret.emplace("metal", !bits || bits & metal_cat.whole); ret.emplace("glass", !bits || bits & glass_cat.whole); ret.emplace("clay", !bits || bits & clay_cat.whole); + ret.emplace("cloth", !bits || bits & cloth_cat.whole); + ret.emplace("silk", !bits || bits & silk_cat.whole); Lua::Push(L, ret); return 1; } @@ -883,6 +899,10 @@ static int setMaterialFilter(lua_State *L) { mask.whole |= glass_cat.whole; else if (mat.matches(clay_cat)) mask.whole |= clay_cat.whole; + else if (mat.matches(cloth_cat)) + mask.whole |= cloth_cat.whole; + else if (mat.matches(silk_cat)) + mask.whole |= silk_cat.whole; } filter.setMaterialMask(mask.whole); get_item_filters(*out, key).setItemFilter(*out, filter, index); diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index 84b5c46ea..498c89c1e 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -453,6 +453,8 @@ function QualityAndMaterialsPage:refresh() make_cat_choice('Metal', 'metal', 'CUSTOM_SHIFT_M', cats), make_cat_choice('Glass', 'glass', 'CUSTOM_SHIFT_G', cats), make_cat_choice('Clay', 'clay', 'CUSTOM_SHIFT_C', cats), + make_cat_choice('Cloth', 'cloth', 'CUSTOM_SHIFT_L', cats), + make_cat_choice('Silk', 'silk', 'CUSTOM_SHIFT_K', cats), } self.subviews.materials_categories:setChoices(category_choices) From 460b1e8eaf05f5dafad745ccc5776a66f47de431 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 10:14:28 -0700 Subject: [PATCH 261/439] adjust code to new tree root type --- library/modules/MapCache.cpp | 17 ++++++++++------- library/modules/Maps.cpp | 1 + .../remotefortressreader.cpp | 13 ++++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/library/modules/MapCache.cpp b/library/modules/MapCache.cpp index b88a078b1..c329220c9 100644 --- a/library/modules/MapCache.cpp +++ b/library/modules/MapCache.cpp @@ -60,6 +60,7 @@ using namespace std; #include "df/flow_info.h" #include "df/job.h" #include "df/plant.h" +#include "df/plant_root_tile.h" #include "df/plant_tree_info.h" #include "df/plant_tree_tile.h" #include "df/region_map_entry.h" @@ -805,14 +806,16 @@ void MapExtras::BlockInfo::prepare(Block *mblock) // If the block is at or above the plant's base level, we use the body array // otherwise we use the roots. // TODO: verify that the tree bounds intersect the block. - df::plant_tree_tile tile; + bool has_tree_tile = false; int z_diff = block->map_pos.z - pp->pos.z; - if (z_diff >= 0) - tile = info->body[z_diff][xx + (yy*info->dim_x)]; - else - tile = info->roots[-1 - z_diff][xx + (yy*info->dim_x)]; - if (tile.whole && !(tile.bits.blocked)) - { + if (z_diff >= 0) { + df::plant_tree_tile tile = info->body[z_diff][xx + (yy * info->dim_x)]; + has_tree_tile = tile.whole && !(tile.bits.blocked); + } else { + df::plant_root_tile tile = info->roots[-1 - z_diff][xx + (yy * info->dim_x)]; + has_tree_tile = tile.whole && !(tile.bits.blocked); + } + if (has_tree_tile) { df::coord pos = pp->pos; pos.x = pos.x - (info->dim_x / 2) + xx; pos.y = pos.y - (info->dim_y / 2) + yy; diff --git a/library/modules/Maps.cpp b/library/modules/Maps.cpp index ddcd6078f..2e831075d 100644 --- a/library/modules/Maps.cpp +++ b/library/modules/Maps.cpp @@ -57,6 +57,7 @@ using namespace std; #include "df/flow_info.h" #include "df/map_block_column.h" #include "df/plant.h" +#include "df/plant_root_tile.h" #include "df/plant_tree_info.h" #include "df/plant_tree_tile.h" #include "df/region_map_entry.h" diff --git a/plugins/remotefortressreader/remotefortressreader.cpp b/plugins/remotefortressreader/remotefortressreader.cpp index f33044877..061cf2698 100644 --- a/plugins/remotefortressreader/remotefortressreader.cpp +++ b/plugins/remotefortressreader/remotefortressreader.cpp @@ -76,7 +76,9 @@ #include "df/ocean_wave.h" #include "df/physical_attribute_type.h" #include "df/plant.h" +#include "df/plant_tree_tile.h" #include "df/plant_raw_flags.h" +#include "df/plant_root_tile.h" #include "df/projectile.h" #include "df/proj_itemst.h" #include "df/proj_unitst.h" @@ -971,17 +973,18 @@ void CopyBlock(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBloc || yyy >= 16 ) continue; - df::plant_tree_tile tile; if (-localPos.z < 0) { - tile = tree_info->roots[-1 + localPos.z][xx + (yy*tree_info->dim_x)]; + df::plant_root_tile tile = tree_info->roots[-1 + localPos.z][xx + (yy * tree_info->dim_x)]; + if (!tile.whole || tile.bits.blocked) + continue; } else { - tile = tree_info->body[-localPos.z][xx + (yy*tree_info->dim_x)]; + df::plant_tree_tile tile = tree_info->body[-localPos.z][xx + (yy * tree_info->dim_x)]; + if (!tile.whole || tile.bits.blocked) + continue; } - if (!tile.whole || tile.bits.blocked) - continue; if (tree_info->body_height <= 1) trunk_percent[xxx][yyy] = 0; else From 63b95994051615261ebfab22460a212697d6cd9e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 10:15:24 -0700 Subject: [PATCH 262/439] update xml head --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 78a2008e4..eea005e8c 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 78a2008e4d20a47f0533f285c3457a278dba5556 +Subproject commit eea005e8cec4448ab865862c744d6da16106f641 From f813e6fa939306b48af66e926724074630d2cffd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 10:23:29 -0700 Subject: [PATCH 263/439] update stonesense head --- plugins/stonesense | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/stonesense b/plugins/stonesense index 3e494d9d9..9046525c9 160000 --- a/plugins/stonesense +++ b/plugins/stonesense @@ -1 +1 @@ -Subproject commit 3e494d9d968add443ebd63cc167933cc813f0eee +Subproject commit 9046525c91fd91e90685dfc071aa952bfe906155 From 766ec620b5cfff4a9c2a2bbd3b494fd81c722f93 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:06:51 +0000 Subject: [PATCH 264/439] Auto-update submodules library/xml: master plugins/stonesense: master --- library/xml | 2 +- plugins/stonesense | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index eea005e8c..4453c0dcd 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit eea005e8cec4448ab865862c744d6da16106f641 +Subproject commit 4453c0dcda1255845c358f34f57c0471cf85ab2c diff --git a/plugins/stonesense b/plugins/stonesense index 9046525c9..b7073b664 160000 --- a/plugins/stonesense +++ b/plugins/stonesense @@ -1 +1 @@ -Subproject commit 9046525c91fd91e90685dfc071aa952bfe906155 +Subproject commit b7073b664310b909989ebe68de36a164e452825a From 49d55b2f07263fbb1179f6f8ec16a9f8f72026dd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 12:31:27 -0700 Subject: [PATCH 265/439] bump version for beta --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dfb6dfb21..9168ebd85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "beta2") +set(DFHACK_RELEASE "r1b4") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From 6c1740e2ca2556dd1deca0e2d6115b0368adcaef Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Apr 2023 17:13:56 -0700 Subject: [PATCH 266/439] re-version to rc1 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9168ebd85..3077bf139 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "r1b4") +set(DFHACK_RELEASE "rc1") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From f7e3973da8e6fc07574412c98de6f146f030ff6a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 12 Apr 2023 01:45:42 -0700 Subject: [PATCH 267/439] bump to 50.07-r1, scrub changelog --- CMakeLists.txt | 4 +-- docs/changelog.txt | 78 ++++++++++++++++++++++++++-------------------- library/xml | 2 +- scripts | 2 +- 4 files changed, 49 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3077bf139..b9f323640 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,8 +192,8 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "rc1") -set(DFHACK_PRERELEASE TRUE) +set(DFHACK_RELEASE "r1") +set(DFHACK_PRERELEASE FALSE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/docs/changelog.txt b/docs/changelog.txt index 2104158f5..351e13d76 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -26,7 +26,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ]]] ================================================================================ -======== IMPORTANT: rename this, and add a new "future" section, BEFORE ======== +======== IMPORTANT: rename this, and add a new "Future" section, BEFORE ======== ======== making a new DFHack release, even if the only changes made ======== ======== were in submodules with their own changelogs! ======== ================================================================================ @@ -34,54 +34,66 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins -- `faststart`: speeds up the "Loading..." screen so the Main Menu appears sooner ## Fixes -- `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar -- ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional + +## Misc Improvements + +## Documentation + +## API + +## Lua + +## Removed + +# 50.07-r1 + +## New Plugins +- `faststart`: speeds up the "Loading..." screen so the Main Menu appears faster + +## Fixes +-@ `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar +-@ ``launchdf``: launch Dwarf Fortress via the Steam client so Steam Workshop is functional - `blueprint`: interpret saplings, shrubs, and twigs as floors instead of walls - `combine`: fix error processing stockpiles with boundaries that extend outside of the map -- `prospector`: display both "raw" Z levels and "cooked" elevations +-@ `prospector`: display both "raw" Z levels and "cooked" elevations - `stockpiles`: fix crash when importing settings for gems from other worlds -- `stockpiles`: allow numbers in saved stockpile filenames +-@ `stockpiles`: allow numbers in saved stockpile filenames ## Misc Improvements -- `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game -- `buildingplan`: hide planner overlay while the DF tutorial is active so that it can detect when you have placed the carpenter's workshop and bed and allow you to finish the tutorial +-@ `buildingplan`: items in the item selection dialog should now use the same item quality symbols as the base game +-@ `buildingplan`: hide planner overlay while the DF tutorial is active so that it can detect when you have placed the carpenter's workshop and bed and allow you to finish the tutorial - `buildingplan`: can now filter by cloth and silk materials (for ropes) -@ `buildingplan`: rearranged elements of ``planneroverlay`` interface -@ `buildingplan`: rearranged elements of ``itemselection`` interface -- Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game -- Mods: scripts from only the most recent version of an installed mod are added to the script path -- Mods: give active mods a chance to reattach their load hooks when a world is reloaded +-@ Mods: scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as "active" when generating a world will still receive automatic updates and be usable from in-game +-@ Mods: scripts from only the most recent version of an installed mod are added to the script path +-@ Mods: give active mods a chance to reattach their load hooks when a world is reloaded - `gui/control-panel`: bugfix services are now enabled by default - Core: hide DFHack terminal console by default when running on Steam Deck ## Documentation - `installing`: updated to include Steam installation instructions -## API - ## Lua - added two new window borders: ``gui.BOLD_FRAME`` for accented elements and ``gui.INTERIOR_MEDIUM_FRAME`` for a signature-less frame that's thicker than the existing ``gui.INTERIOR_FRAME`` -## Removed - # 50.07-beta2 ## New Plugins - `getplants`: designate trees for chopping and shrubs for gathering according to type -- `prospector`: get stone, ore, gem, and other tile property counts in fort mode. embark site estimates are not yet available. +- `prospector`: get stone, ore, gem, and other tile property counts in fort mode. ## Fixes -- `buildingplan`: filters are now properly applied to planned stairs -- `buildingplan`: existing carved up/down stairs are now taken into account when determining which stair shape to construct +-@ `buildingplan`: filters are now properly applied to planned stairs +-@ `buildingplan`: existing carved up/down stairs are now taken into account when determining which stair shape to construct - `buildingplan`: upright spike traps are now placed extended rather than retracted - `buildingplan`: you can no longer designate constructions on tiles with magma or deep water, mirroring the vanilla restrictions -- `buildingplan`: fixed material filters getting lost for planning buildings on save/reload -- `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) +-@ `buildingplan`: fixed material filters getting lost for planning buildings on save/reload +-@ `buildingplan`: respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension) - `tailor`: properly discriminate between dyed and undyed cloth -- `tailor`: no longer default to using adamantine cloth for producing clothes +-@ `tailor`: no longer default to using adamantine cloth for producing clothes - `tailor`: take queued orders into account when calculating available materials - `tailor`: skip units who can't wear clothes - `tailor`: identify more available items as available, solving issues with over-production @@ -100,17 +112,17 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `orders`: add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen - `orders`: add option to delete exported files from the import dialog - `enable`: can now interpret aliases defined with the `alias` command -- scripts in ``data/installed mods/`` subfolders are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod's folder: ``scripts_modinstalled/`` and ``scripts_modactive/``. ``scripts_modinstalled/`` folders will always be added the script path, regardless of whether the mod is active in a world. ``scripts_modactive/`` folders will only be added to the script path when the mod is active in the current loaded world. +- Mods: scripts in mods are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod's folder: ``scripts_modinstalled/`` and ``scripts_modactive/``. ``scripts_modinstalled/`` folders will always be added the script path, regardless of whether the mod is active in a world. ``scripts_modactive/`` folders will only be added to the script path when the mod is active in the current loaded world. ## Documentation - `modding-guide`: guide updated to include information for 3rd party script developers - the ``untested`` tag has been renamed to ``unavailable`` to better reflect the status of the remaining unavaialable tools. most of the simply "untested" tools have now been tested and marked as working. the remaining tools are known to need development work before they are available again. ## Lua -- ``widget.Label``: tokens can now specify a ``htile`` property to indicate the tile that should be shown when the Label is hovered over with the mouse -- ``widget.Label``: click handlers no longer get the label itself as the first param to the click handler -- ``widget.CycleHotkeyLabel``: options that are bare integers will no longer be interpreted as the pen color in addition to being the label and value -- ``widget.CycleHotkeyLabel``: option labels and pens can now be functions that return a label or pen +- ``widgets.Label``: tokens can now specify a ``htile`` property to indicate the tile that should be shown when the Label is hovered over with the mouse +- ``widgets.Label``: click handlers no longer get the label itself as the first param to the click handler +- ``widgets.CycleHotkeyLabel``: options that are bare integers will no longer be interpreted as the pen color in addition to being the label and value +- ``widgets.CycleHotkeyLabel``: option labels and pens can now be functions that return a label or pen # 50.07-beta1 @@ -172,14 +184,14 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes -@ `nestboxes`: fixed bug causing nestboxes themselves to be forbidden, which prevented citizens from using them to lay eggs. Now only eggs are forbidden. -- `autobutcher`: implemented work-around for Dwarf Fortress not setting nicknames properly, so that nicknames created in the in-game interface are detected & protect animals from being butchered properly. Note that nicknames for unnamed units are not currently saved by dwarf fortress - use ``enable fix/protect-nicks`` to fix any nicknames created/removed within dwarf fortress so they can be saved/reloaded when you reload the game. +-@ `autobutcher`: implemented work-around for Dwarf Fortress not setting nicknames properly, so that nicknames created in the in-game interface are detected & protect animals from being butchered properly. Note that nicknames for unnamed units are not currently saved by dwarf fortress - use ``enable fix/protect-nicks`` to fix any nicknames created/removed within dwarf fortress so they can be saved/reloaded when you reload the game. -@ `seedwatch`: fix saving and loading of seed stock targets - `autodump`: changed behaviour to only change ``dump`` and ``forbid`` flags if an item is successfully dumped. -@ `autochop`: generate default names for burrows with no assigned names - ``Buildings::StockpileIterator``: fix check for stockpile items on block boundary. - `tailor`: block making clothing sized for toads; make replacement clothing orders use the size of the wearer, not the size of the garment -@ `confirm`: fix fps drop when enabled -- `channel-safely`: fix an out of bounds error regarding the REPORT event listener receiving (presumably) stale id's +-@ `channel-safely`: fix an out of bounds error regarding the REPORT event listener receiving (presumably) stale id's ## Misc Improvements - `autobutcher`: logs activity to the console terminal instead of making disruptive in-game announcements @@ -203,13 +215,13 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - ``Units::isFortControlled``: Account for agitated wildlife -@ Fix right click sometimes closing both a DFHack window and a vanilla panel -- Fixed issue with scrollable lists having some data off-screen if they were scrolled before being made visible -- `channel-safely`: fixed bug resulting in marker mode never being set for any designation +-@ Fixed issue with scrollable lists having some data off-screen if they were scrolled before being made visible +-@ `channel-safely`: fixed bug resulting in marker mode never being set for any designation -@ `automelt`: fixed bug related to lua stack smashing behavior in returned stockpile configs -@ `autochop`: fixed bug related to lua stack smashing behavior in returned stockpile configs -- `nestboxes`: now cancels any in-progress hauling jobs when it protects a fertile egg +-@ `nestboxes`: now cancels any in-progress hauling jobs when it protects a fertile egg -@ Fix persisted data not being written on manual save -- `nestboxes`: now scans for eggs more frequently and cancels any in-progress hauling jobs when it protects a fertile egg +-@ `nestboxes`: now scans for eggs more frequently and cancels any in-progress hauling jobs when it protects a fertile egg ## Misc Improvements -@ `automelt`: is now more resistent to vanilla savegame corruption @@ -301,7 +313,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # 50.05-alpha2 ## Fixes -- `autofarm`: don't duplicate status line entries for crops with no current supply +-@ `autofarm`: don't duplicate status line entries for crops with no current supply -@ `orders`: allow the orders library to be listed and imported properly (if you previously copied the orders library into your ``dfhack-config/orders`` directory to work around this bug, you can remove those files now) - `tailor`: now respects the setting of the "used dyed clothing" standing order toggle diff --git a/library/xml b/library/xml index 4453c0dcd..43a89a268 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 4453c0dcda1255845c358f34f57c0471cf85ab2c +Subproject commit 43a89a268b825fc05457678b19e551bf632dcd19 diff --git a/scripts b/scripts index 973b8ef19..ec1a69788 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 973b8ef191cc92cff62d96aa591c7631818d19b6 +Subproject commit ec1a69788fd6329008672523b622fd8b390fea73 From 21784568bd144d3a70444f9cbc35705619297a1c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 4 Jan 2023 09:57:06 -0800 Subject: [PATCH 268/439] migrate from SDL interposing to the hooks API --- CMakeLists.txt | 13 - library/CMakeLists.txt | 10 +- library/Core.cpp | 26 +- library/Hooks-darwin.cpp | 318 --------------- library/Hooks-linux.cpp | 139 ------- library/Hooks-windows.cpp | 838 -------------------------------------- library/Hooks.cpp | 3 + library/include/Core.h | 15 +- plugins/title-folder.cpp | 2 +- 9 files changed, 18 insertions(+), 1346 deletions(-) delete mode 100644 library/Hooks-darwin.cpp delete mode 100644 library/Hooks-linux.cpp delete mode 100644 library/Hooks-windows.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b9f323640..02857f91d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,19 +299,6 @@ if(WIN32) DESTINATION ${CMAKE_BINARY_DIR}/depends/) file(COPY ${ZLIB_DOWNLOAD_DIR}/zlib.lib DESTINATION ${CMAKE_BINARY_DIR}/depends/zlib/lib/) - - # Do the same for SDLreal.dll - # (DFHack doesn't require this at build time, so no need to move it to the build folder) - set(SDLREAL_DOWNLOAD_DIR ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}) - if(${DFHACK_BUILD_ARCH} STREQUAL "64") - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-SDL.dll" - ${SDLREAL_DOWNLOAD_DIR}/SDLreal.dll - "1ae242c4b94cb03756a1288122a66faf") - else() - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-SDL.dll" - ${SDLREAL_DOWNLOAD_DIR}/SDLreal.dll - "5a09604daca6b2b5ce049d79af935d6a") - endif() endif() if(APPLE) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index a3fcb8b6f..418c9b371 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -95,7 +95,6 @@ endif() set(MAIN_SOURCES_WINDOWS ${CONSOLE_SOURCES} - Hooks-windows.cpp Hooks.cpp PlugLoad-windows.cpp Process-windows.cpp @@ -108,14 +107,12 @@ endif() set(MAIN_SOURCES_LINUX ${CONSOLE_SOURCES} - Hooks-linux.cpp PlugLoad-posix.cpp Process-linux.cpp ) set(MAIN_SOURCES_DARWIN ${CONSOLE_SOURCES} - Hooks-darwin.cpp PlugLoad-posix.cpp Process-darwin.cpp ) @@ -376,8 +373,7 @@ add_executable(binpatch binpatch.cpp) target_link_libraries(binpatch dfhack-md5) if(WIN32) - # name the resulting library SDL.dll on Windows - set_target_properties(dfhack PROPERTIES OUTPUT_NAME "SDL" ) + set_target_properties(dfhack PROPERTIES OUTPUT_NAME "dfhooks" ) set_target_properties(dfhack PROPERTIES COMPILE_FLAGS "/FI\"Export.h\"" ) set_target_properties(dfhack-client PROPERTIES COMPILE_FLAGS "/FI\"Export.h\"" ) else() @@ -436,10 +432,6 @@ if(UNIX) install(TARGETS dfhooks LIBRARY DESTINATION . RUNTIME DESTINATION .) -else() - # On windows, copy the renamed SDL so DF can still run. - install(PROGRAMS ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}/SDLreal.dll - DESTINATION ${DFHACK_LIBRARY_DESTINATION}) endif() # install the main lib diff --git a/library/Core.cpp b/library/Core.cpp index b1fe2d389..7bdaed80c 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -2292,12 +2292,13 @@ int Core::Shutdown ( void ) #define KEY_F0 0410 /* Function keys. Space for 64 */ #define KEY_F(n) (KEY_F0+(n)) /* Value of function key n */ +// returns true if the event has been handled bool Core::ncurses_wgetch(int in, int & out) { if(!started) { out = in; - return true; + return false; } if(in >= KEY_F(1) && in <= KEY_F(8)) { @@ -2312,18 +2313,18 @@ bool Core::ncurses_wgetch(int in, int & out) df::global::plotinfo->main.hotkeys[idx].cmd == df::ui_hotkey::T_cmd::None) { setHotkeyCmd(df::global::plotinfo->main.hotkeys[idx].name); - return false; + return true; } else { out = in; - return true; + return false; } } */ } out = in; - return true; + return false; } bool Core::DFH_ncurses_key(int key) @@ -2331,7 +2332,7 @@ bool Core::DFH_ncurses_key(int key) if (getenv("DFHACK_HEADLESS")) return true; int dummy; - return !ncurses_wgetch(key, dummy); + return ncurses_wgetch(key, dummy); } int UnicodeAwareSym(const SDL::KeyboardEvent& ke) @@ -2382,21 +2383,19 @@ int UnicodeAwareSym(const SDL::KeyboardEvent& ke) return unicode; } - -//MEMO: return false if event is consumed -int Core::DFH_SDL_Event(SDL::Event* ev) +// returns true if the event is handled +bool Core::DFH_SDL_Event(SDL::Event* ev) { // do NOT process events before we are ready. - if(!started) return true; - if(!ev) - return true; + if(!started || !ev) + return false; if(ev->type == SDL::ET_ACTIVEEVENT && ev->active.gain) { // clear modstate when gaining focus in case alt-tab was used when // losing focus and modstate is now incorrectly set modstate = 0; - return true; + return false; } if(ev->type == SDL::ET_KEYDOWN || ev->type == SDL::ET_KEYUP) @@ -2431,8 +2430,7 @@ int Core::DFH_SDL_Event(SDL::Event* ev) hotkey_states[ke->ksym.sym] = false; } } - return true; - // do stuff with the events... + return false; } bool Core::SelectHotkey(int sym, int modifiers) diff --git a/library/Hooks-darwin.cpp b/library/Hooks-darwin.cpp deleted file mode 100644 index 418cf5472..000000000 --- a/library/Hooks-darwin.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* -https://github.com/peterix/dfhack -Copyright (c) 2009-2012 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. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct interpose_s -{ - void *new_func; - void *orig_func; -} interpose_t; - -#include "DFHack.h" -#include "Core.h" -#include "Hooks.h" -#include "SDL_events.h" -#include - -/*static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose"))) = -{ - { (void *)DFH_SDL_Init, (void *)SDL_Init }, - { (void *)DFH_SDL_PollEvent, (void *)SDL_PollEvent }, - { (void *)DFH_SDL_Quit, (void *)SDL_Quit }, - { (void *)DFH_SDL_NumJoysticks, (void *)SDL_NumJoysticks }, - -};*/ - -#define DYLD_INTERPOSE(_replacement,_replacee) \ - __attribute__((used)) static struct{ const void* replacment; const void* replacee; } \ - _interpose_##_replacee __attribute__ ((section ("__DATA,__interpose"))) = \ - { (const void*)(unsigned long)&_replacement, (const void*)(unsigned long)&_replacee }; - -DYLD_INTERPOSE(DFH_SDL_Init,SDL_Init); -DYLD_INTERPOSE(DFH_SDL_PollEvent,SDL_PollEvent); -DYLD_INTERPOSE(DFH_SDL_Quit,SDL_Quit); -DYLD_INTERPOSE(DFH_SDL_NumJoysticks,SDL_NumJoysticks); -DYLD_INTERPOSE(DFH_wgetch,wgetch); - -/******************************************************************************* -* SDL part starts here * -*******************************************************************************/ - -#define SDL_APPMOUSEFOCUS 0x01 /**< The app has mouse coverage */ -#define SDL_APPINPUTFOCUS 0x02 /**< The app has input focus */ -#define SDL_APPACTIVE 0x04 /**< The application is active */ -static uint8_t (*_SDL_GetAppState)(void) = 0; -DFhackCExport uint8_t SDL_GetAppState(void) -{ - return _SDL_GetAppState(); -} - -// hook - called for each game tick (or more often) -DFhackCExport int DFH_SDL_NumJoysticks(void) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - return c.Update(); -} - -// hook - called at program exit -static void (*_SDL_Quit)(void) = 0; -DFhackCExport void DFH_SDL_Quit(void) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - c.Shutdown(); - - SDL_Quit(); -} - -// called by DF to check input events -static int (*_SDL_PollEvent)(SDL::Event* event) = 0; -DFhackCExport int DFH_SDL_PollEvent(SDL::Event* event) -{ - pollevent_again: - // if SDL returns 0 here, it means there are no more events. return 0 - int orig_return = SDL_PollEvent(event); - if(!orig_return || (!(SDL_GetAppState() & SDL_APPINPUTFOCUS) && - (event->type == SDL::ET_KEYDOWN || event->type == SDL::ET_KEYUP))) - return 0; - // otherwise we have an event to filter - else if( event != 0 ) - { - DFHack::Core & c = DFHack::Core::getInstance(); - // if we consume the event, ask SDL for more. - if(!c.DFH_SDL_Event(event)) - goto pollevent_again; - } - return orig_return; -} - -static int (*_SDL_PushEvent)(SDL::Event* event) = 0; -DFhackCExport int SDL_PushEvent(SDL::Event* event) -{ - return _SDL_PushEvent(event); -} - -struct WINDOW; -DFhackCExport int DFH_wgetch(WINDOW *win) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - wgetch_again: - int in = wgetch(win); - int out; - if(c.ncurses_wgetch(in, out)) - { - // not consumed, give to DF - return out; - } - else - { - // consumed, repeat - goto wgetch_again; - } -} - -void dlsym_bind_or_exit(void **target, const char *name) -{ - void *sym = dlsym(RTLD_NEXT, name); - if (sym) - { - if (*target && *target != sym) - { - fprintf(stderr, "warning: rebinding symbol %s from %p to %p\n", - name, *target, sym); - } - *target = sym; - } - else - { - fprintf(stderr, "Fatal: Could not find symbol: %s\n", name); - fprintf(stdout, "dfhack: something went horribly wrong\n" - "Check stderr.log for details\n"); - exit(1); - } -} - - -// New SDL functions starting in r5 -static vPtr (*_SDL_CreateRGBSurface)(uint32_t flags, int width, int height, int depth, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) = 0; -DFhackCExport vPtr SDL_CreateRGBSurface(uint32_t flags, int width, int height, int depth, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) -{ - return _SDL_CreateRGBSurface(flags, width, height, depth, Rmask, Gmask, Bmask, Amask); -} - -static vPtr (*_SDL_CreateRGBSurfaceFrom)(vPtr pixels, int width, int height, int depth, int pitch, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) = 0; -DFhackCExport vPtr SDL_CreateRGBSurfaceFrom(vPtr pixels, int width, int height, int depth, int pitch, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) -{ - return _SDL_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask); -} - -static void (*_SDL_FreeSurface)(vPtr surface) = 0; -DFhackCExport void SDL_FreeSurface(vPtr surface) -{ - _SDL_FreeSurface(surface); -} - -static vPtr (*_SDL_ConvertSurface)(vPtr surface, vPtr format, uint32_t flags) = 0; -DFhackCExport vPtr SDL_ConvertSurface(vPtr surface, vPtr format, uint32_t flags) -{ - return _SDL_ConvertSurface(surface, format, flags); -} - -static int (*_SDL_LockSurface)(vPtr surface) = 0; -DFhackCExport int SDL_LockSurface(vPtr surface) -{ - return _SDL_LockSurface(surface); -} - -static void (*_SDL_UnlockSurface)(vPtr surface) = 0; -DFhackCExport void SDL_UnlockSurface(vPtr surface) -{ - _SDL_UnlockSurface(surface); -} - -static uint8_t (*_SDL_GetMouseState)(int *, int *) = 0; -DFhackCExport uint8_t SDL_GetMouseState(int *x, int *y) -{ - return _SDL_GetMouseState(x,y); -} - -static void * (*_SDL_GetVideoSurface)( void ) = 0; -DFhackCExport void * SDL_GetVideoSurface(void) -{ - return _SDL_GetVideoSurface(); -} - -static int (*_SDL_UpperBlit)(DFHack::DFSDL_Surface* src, DFHack::DFSDL_Rect* srcrect, DFHack::DFSDL_Surface* dst, DFHack::DFSDL_Rect* dstrect) = 0; -DFhackCExport int SDL_UpperBlit(DFHack::DFSDL_Surface* src, DFHack::DFSDL_Rect* srcrect, DFHack::DFSDL_Surface* dst, DFHack::DFSDL_Rect* dstrect) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - if ( c.isValid() && dstrect != NULL && dstrect->h != 0 && dstrect->w != 0 ) - { - DFHack::Graphic* g = c.getGraphic(); - DFHack::DFTileSurface* ov = g->Call(dstrect->x/dstrect->w, dstrect->y/dstrect->h); - - if ( ov != NULL ) - { - if ( ov->paintOver ) - { - _SDL_UpperBlit(src, srcrect, dst, dstrect); - } - - DFHack::DFSDL_Rect* dstrect2 = new DFHack::DFSDL_Rect; - dstrect2->x = dstrect->x; - dstrect2->y = dstrect->y; - dstrect2->w = dstrect->w; - dstrect2->h = dstrect->h; - - if ( ov->dstResize != NULL ) - { - DFHack::DFSDL_Rect* r = (DFHack::DFSDL_Rect*)ov->dstResize; - dstrect2->x += r->x; - dstrect2->y += r->y; - dstrect2->w += r->w; - dstrect2->h += r->h; - } - - int result = _SDL_UpperBlit(ov->surface, ov->rect, dst, dstrect2); - delete dstrect2; - return result; - } - } - - return _SDL_UpperBlit(src, srcrect, dst, dstrect); -} - -static int (*_SDL_SemWait)(vPtr) = 0; -DFhackCExport int SDL_SemWait(vPtr sem) -{ - return _SDL_SemWait(sem); -} - -static int (*_SDL_SemPost)(vPtr) = 0; -DFhackCExport int SDL_SemPost(vPtr sem) -{ - return _SDL_SemPost(sem); -} - -// hook - called at program start, initialize some stuffs we'll use later -static int (*_SDL_Init)(uint32_t flags) = 0; -DFhackCExport int DFH_SDL_Init(uint32_t flags) -{ - // reroute stderr - fprintf(stderr,"dfhack: attempting to hook in\n"); - // we don't reroute stdout until we figure out if this should be done at all - // See: Console-posix.cpp - - // find real functions - fprintf(stderr,"dfhack: saving real SDL functions\n"); - - #define bind(sym) dlsym_bind_or_exit((void**)&_##sym, #sym) - bind(SDL_Init); - bind(SDL_Quit); - bind(SDL_PollEvent); - bind(SDL_PushEvent); - - bind(SDL_UpperBlit); - bind(SDL_CreateRGBSurface); - bind(SDL_CreateRGBSurfaceFrom); - bind(SDL_FreeSurface); - bind(SDL_ConvertSurface); - bind(SDL_LockSurface); - bind(SDL_UnlockSurface); - bind(SDL_GetMouseState); - bind(SDL_GetVideoSurface); - - bind(SDL_SemWait); - bind(SDL_SemPost); - bind(SDL_GetAppState); - #undef bind - - fprintf(stderr, "dfhack: saved real SDL functions\n"); - assert(_SDL_Init && _SDL_Quit && _SDL_PollEvent); - fprintf(stderr, "dfhack: hooking successful\n"); - - // prevent any subprocesses from trying to load libdfhack.dylib - setenv("DYLD_INSERT_LIBRARIES", "", 1); - - int ret = SDL_Init(flags); - return ret; -} diff --git a/library/Hooks-linux.cpp b/library/Hooks-linux.cpp deleted file mode 100644 index 7a0cdf947..000000000 --- a/library/Hooks-linux.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* -https://github.com/peterix/dfhack -Copyright (c) 2009-2012 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. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "DFHack.h" -#include "Core.h" -#include "Hooks.h" -#include - -/******************************************************************************* -* SDL part starts here * -*******************************************************************************/ -// hook - called for each game tick (or more often) -DFhackCExport int SDL_NumJoysticks(void) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - return c.Update(); -} - -// hook - called at program exit -static void (*_SDL_Quit)(void) = 0; -DFhackCExport void SDL_Quit(void) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - c.Shutdown(); - if(_SDL_Quit) - { - _SDL_Quit(); - } -} - -// called by DF to check input events -static int (*_SDL_PollEvent)(SDL::Event* event) = 0; -DFhackCExport int SDL_PollEvent(SDL::Event* event) -{ - pollevent_again: - // if SDL returns 0 here, it means there are no more events. return 0 - int orig_return = _SDL_PollEvent(event); - if(!orig_return) - return 0; - // otherwise we have an event to filter - else if( event != 0 ) - { - DFHack::Core & c = DFHack::Core::getInstance(); - // if we consume the event, ask SDL for more. - if(!c.DFH_SDL_Event(event)) - goto pollevent_again; - } - return orig_return; -} - -struct WINDOW; -DFhackCExport int wgetch(WINDOW *win) -{ - if (getenv("DFHACK_HEADLESS")) - { - return 0; - } - static int (*_wgetch)(WINDOW * win) = (int (*)( WINDOW * )) dlsym(RTLD_NEXT, "wgetch"); - if(!_wgetch) - { - exit(EXIT_FAILURE); - } - DFHack::Core & c = DFHack::Core::getInstance(); - wgetch_again: - int in = _wgetch(win); - int out; - if(c.ncurses_wgetch(in, out)) - { - // not consumed, give to DF - return out; - } - else - { - // consumed, repeat - goto wgetch_again; - } -} - -// hook - called at program start, initialize some stuffs we'll use later -static int (*_SDL_Init)(uint32_t flags) = 0; -DFhackCExport int SDL_Init(uint32_t flags) -{ - // find real functions - _SDL_Init = (int (*)( uint32_t )) dlsym(RTLD_NEXT, "SDL_Init"); - _SDL_Quit = (void (*)( void )) dlsym(RTLD_NEXT, "SDL_Quit"); - _SDL_PollEvent = (int (*)(SDL::Event*))dlsym(RTLD_NEXT,"SDL_PollEvent"); - - // check if we got them - if(_SDL_Init && _SDL_Quit && _SDL_PollEvent) - { - fprintf(stderr,"dfhack: hooking successful\n"); - } - else - { - // bail, this would be a disaster otherwise - fprintf(stderr,"dfhack: something went horribly wrong\n"); - exit(1); - } - - int ret = _SDL_Init(flags); - return ret; -} diff --git a/library/Hooks-windows.cpp b/library/Hooks-windows.cpp deleted file mode 100644 index d3f39b969..000000000 --- a/library/Hooks-windows.cpp +++ /dev/null @@ -1,838 +0,0 @@ -/* -https://github.com/peterix/dfhack -Copyright (c) 2009-2012 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. -*/ - -#define DFhackCExport extern "C" __declspec(dllexport) - -#include -#include -#include -#include -#include -#include "Core.h" -#include "Hooks.h" -#include - -#include "tinythread.h" -#include "modules/Graphic.h" - -/*************************************************************************/ -// extremely boring wrappers beyond this point. Only fix when broken - -// we don't know which of the SDL functions will be called first... so we -// just catch the first one and init all our function pointers at that time -static void InitSDLPointers(void); -static std::once_flag inited; - -/// wrappers for SDL 1.2 functions used in 40d16 -/***** Condition variables - -SDL_CreateCond - SDL_cond * SDLCALL SDL_CreateCond(void); -SDL_CondSignal - int SDLCALL SDL_CondSignal(SDL_cond *cond); -SDL_CondWait - int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); -SDL_DestroyCond - void SDLCALL SDL_DestroyCond(SDL_cond *cond); -*/ -static vPtr (*_SDL_CreateCond)() = 0; -DFhackCExport vPtr SDL_CreateCond() -{ - return _SDL_CreateCond(); -} - -static int (*_SDL_CondSignal)( vPtr ) = 0; -DFhackCExport int SDL_CondSignal( vPtr cond ) -{ - return _SDL_CondSignal(cond); -} - -static int (*_SDL_CondWait)( vPtr,vPtr ) = 0; -DFhackCExport int SDL_CondWait( vPtr cond, vPtr mutex ) -{ - return _SDL_CondWait(cond, mutex); -} - -static void (*_SDL_DestroyCond)( vPtr ) = 0; -DFhackCExport void SDL_DestroyCond( vPtr cond ) -{ - _SDL_DestroyCond(cond); -} - -/***** mutexes - -SDL_CreateMutex - SDL_mutex * SDLCALL SDL_CreateMutex(void); -SDL_mutexP - int SDLCALL SDL_mutexP(SDL_mutex *mutex); -SDL_DestroyMutex - void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); -*/ -static vPtr (*_SDL_CreateMutex)(void) = 0; -DFhackCExport vPtr SDL_CreateMutex(void) -{ - return _SDL_CreateMutex(); -} - -static int (*_SDL_mutexP)(vPtr mutex) = 0; -DFhackCExport int SDL_mutexP(vPtr mutex) -{ - return _SDL_mutexP(mutex); -} - -static int (*_SDL_mutexV)(vPtr mutex) = 0; -DFhackCExport int SDL_mutexV(vPtr mutex) -{ - return _SDL_mutexV(mutex); -} - -static void (*_SDL_DestroyMutex)(vPtr mutex) = 0; -DFhackCExport void SDL_DestroyMutex(vPtr mutex) -{ - _SDL_DestroyMutex(mutex); -} - - -/***** timers - -SDL_AddTimer - SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); -SDL_RemoveTimer - SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); -SDL_GetTicks - Uint32 SDLCALL SDL_GetTicks(void); -*/ -static vPtr (*_SDL_AddTimer)(uint32_t interval, fPtr callback, vPtr param) = 0; -DFhackCExport vPtr SDL_AddTimer(uint32_t interval, fPtr callback, vPtr param) -{ - return _SDL_AddTimer(interval, callback, param); -} - -static bool (*_SDL_RemoveTimer)(vPtr timer) = 0; -DFhackCExport bool SDL_RemoveTimer(vPtr timer) -{ - return _SDL_RemoveTimer(timer); -} - -static uint32_t (*_SDL_GetTicks)(void) = 0; -DFhackCExport uint32_t SDL_GetTicks(void) -{ - return _SDL_GetTicks(); -} - -/***** Surfaces -SDL_CreateRGBSurface - SDL_Surface * SDLCALL SDL_CreateRGBSurface - (Uint32 flags, int width, int height, int depth, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); - -SDL_CreateRGBSurfaceFrom - SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom - (void *pixels, int width, int height, int depth, int pitch, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); - -SDL_FreeSurface - void SDLCALL SDL_FreeSurface(SDL_Surface *surface); - -SDL_ConvertSurface - SDL_Surface * SDLCALL SDL_ConvertSurface - (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); - -SDL_LockSurface - int SDLCALL SDL_LockSurface(SDL_Surface *surface); - -SDL_UnlockSurface - void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); -*/ - -static vPtr (*_SDL_CreateRGBSurface)(uint32_t flags, int width, int height, int depth, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) = 0; -DFhackCExport vPtr SDL_CreateRGBSurface(uint32_t flags, int width, int height, int depth, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) -{ - return _SDL_CreateRGBSurface(flags, width, height, depth, Rmask, Gmask, Bmask, Amask); -} - -static vPtr (*_SDL_CreateRGBSurfaceFrom)(vPtr pixels, int width, int height, int depth, int pitch, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) = 0; -DFhackCExport vPtr SDL_CreateRGBSurfaceFrom(vPtr pixels, int width, int height, int depth, int pitch, - uint32_t Rmask, uint32_t Gmask, uint32_t Bmask, uint32_t Amask) -{ - return _SDL_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask); -} - -static void (*_SDL_FreeSurface)(vPtr surface) = 0; -DFhackCExport void SDL_FreeSurface(vPtr surface) -{ - _SDL_FreeSurface(surface); -} - -static vPtr (*_SDL_ConvertSurface)(vPtr surface, vPtr format, uint32_t flags) = 0; -DFhackCExport vPtr SDL_ConvertSurface(vPtr surface, vPtr format, uint32_t flags) -{ - return _SDL_ConvertSurface(surface, format, flags); -} - -static int (*_SDL_LockSurface)(vPtr surface) = 0; -DFhackCExport int SDL_LockSurface(vPtr surface) -{ - return _SDL_LockSurface(surface); -} - -static void (*_SDL_UnlockSurface)(vPtr surface) = 0; -DFhackCExport void SDL_UnlockSurface(vPtr surface) -{ - _SDL_UnlockSurface(surface); -} - -/***** More surface stuff -SDL_MapRGB - Uint32 SDLCALL SDL_MapRGB - (const SDL_PixelFormat * const format, const Uint8 r, const Uint8 g, const Uint8 b); - -SDL_SaveBMP_RW - int SDLCALL SDL_SaveBMP_RW - (SDL_Surface *surface, SDL_RWops *dst, int freedst); - -SDL_SetAlpha - int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); - -SDL_SetColorKey - int SDLCALL SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key); - -SDL_GetVideoInfo - const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); - -SDL_SetVideoMode - SDL_Surface * SDLCALL SDL_SetVideoMode - (int width, int height, int bpp, Uint32 flags); - -SDL_UpperBlit - int SDLCALL SDL_UpperBlit - (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); -*/ - -static uint32_t (*_SDL_MapRGB)(vPtr pixelformat, uint8_t r, uint8_t g, uint8_t b) = 0; -DFhackCExport uint32_t SDL_MapRGB(vPtr pixelformat, uint8_t r, uint8_t g, uint8_t b) -{ - return _SDL_MapRGB(pixelformat,r,g,b); -} - -static int (*_SDL_SaveBMP_RW)(vPtr surface, vPtr dst, int freedst) = 0; -DFhackCExport int SDL_SaveBMP_RW(vPtr surface, vPtr dst, int freedst) -{ - return _SDL_SaveBMP_RW(surface,dst,freedst); -} - -static int (*_SDL_SetAlpha)(vPtr surface, uint32_t flag, uint8_t alpha) = 0; -DFhackCExport int SDL_SetAlpha(vPtr surface, uint32_t flag, uint8_t alpha) -{ - return _SDL_SetAlpha(surface,flag,alpha); -} - -static int (*_SDL_SetColorKey)(vPtr surface, uint32_t flag, uint32_t key) = 0; -DFhackCExport int SDL_SetColorKey(vPtr surface, uint32_t flag, uint32_t key) -{ - return _SDL_SetColorKey(surface,flag,key); -} - -static vPtr (*_SDL_GetVideoInfo)(void) = 0; -DFhackCExport vPtr SDL_GetVideoInfo(void) -{ - return _SDL_GetVideoInfo(); -} - -static vPtr (*_SDL_SetVideoMode)(int width, int height, int bpp, uint32_t flags) = 0; -DFhackCExport vPtr SDL_SetVideoMode(int width, int height, int bpp, uint32_t flags) -{ - return _SDL_SetVideoMode(width, height, bpp, flags); -} - -static int (*_SDL_UpperBlit)(DFHack::DFSDL_Surface* src, DFHack::DFSDL_Rect* srcrect, DFHack::DFSDL_Surface* dst, DFHack::DFSDL_Rect* dstrect) = 0; -DFhackCExport int SDL_UpperBlit(DFHack::DFSDL_Surface* src, DFHack::DFSDL_Rect* srcrect, DFHack::DFSDL_Surface* dst, DFHack::DFSDL_Rect* dstrect) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - if ( c.isValid() && dstrect != NULL && dstrect->h != 0 && dstrect->w != 0 ) - { - DFHack::Graphic* g = c.getGraphic(); - DFHack::DFTileSurface* ov = g->Call(dstrect->x/dstrect->w, dstrect->y/dstrect->h); - - if ( ov != NULL ) - { - if ( ov->paintOver ) - { - _SDL_UpperBlit(src, srcrect, dst, dstrect); - } - - DFHack::DFSDL_Rect* dstrect2 = new DFHack::DFSDL_Rect; - dstrect2->x = dstrect->x; - dstrect2->y = dstrect->y; - dstrect2->w = dstrect->w; - dstrect2->h = dstrect->h; - - if ( ov->dstResize != NULL ) - { - DFHack::DFSDL_Rect* r = (DFHack::DFSDL_Rect*)ov->dstResize; - dstrect2->x += r->x; - dstrect2->y += r->y; - dstrect2->w += r->w; - dstrect2->h += r->h; - } - - int result = _SDL_UpperBlit(ov->surface, ov->rect, dst, dstrect2); - delete dstrect2; - return result; - } - } - - return _SDL_UpperBlit(src, srcrect, dst, dstrect); -} - -/***** Even more surface -SDL_GL_GetAttribute - int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); - -SDL_GL_SetAttribute - int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); - -SDL_WM_SetCaption - void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); - -SDL_WM_SetIcon - void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); - -SDL_FillRect - int SDLCALL SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); -*/ - - -static void * (*_SDL_GetVideoSurface)( void ) = 0; -DFhackCExport void * SDL_GetVideoSurface(void) -{ - return _SDL_GetVideoSurface(); -} - -static void * (*_SDL_DisplayFormat)( void * surface ) = 0; -DFhackCExport void * SDL_DisplayFormat(void *surface) -{ - return _SDL_DisplayFormat(surface); -} - -// SDL_Surface *SDL_DisplayFormatAlpha(SDL_Surface *surface); -static void * (*_SDL_DisplayFormatAlpha)( void * surface ) = 0; -DFhackCExport void * SDL_DisplayFormatAlpha(void *surface) -{ - return _SDL_DisplayFormatAlpha(surface); -} - -//void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); - -static void (*_SDL_GetRGBA)(uint32_t pixel, void * fmt, uint8_t * r, uint8_t * g, uint8_t * b, uint8_t *a) = 0; -DFhackCExport void SDL_GetRGBA(uint32_t pixel, void * fmt, uint8_t * r, uint8_t * g, uint8_t * b, uint8_t *a) -{ - return _SDL_GetRGBA(pixel, fmt, r, g, b, a); -} - -static int (*_SDL_GL_GetAttribute)(int attr, int * value) = 0; -DFhackCExport int SDL_GL_GetAttribute(int attr, int * value) -{ - return _SDL_GL_GetAttribute(attr,value); -} - -static int (*_SDL_GL_SetAttribute)(int attr, int value) = 0; -DFhackCExport int SDL_GL_SetAttribute(int attr, int value) -{ - return _SDL_GL_SetAttribute(attr,value); -} - -static void (*_SDL_WM_SetCaption)(const char *title, const char *icon) = 0; -DFhackCExport void SDL_WM_SetCaption(const char *title, const char *icon) -{ - //_SDL_WM_SetCaption("DwarfHacked the Fortress of Hacks",icon); - _SDL_WM_SetCaption(title,icon); -} - -static void (*_SDL_WM_SetIcon)(vPtr icon, uint8_t *mask) = 0; -DFhackCExport void SDL_WM_SetIcon(vPtr icon, uint8_t *mask) -{ - _SDL_WM_SetIcon(icon, mask); -} - -static int (*_SDL_FillRect)(vPtr dst, vPtr dstrect, uint32_t color) = 0; -DFhackCExport int SDL_FillRect(vPtr dst, vPtr dstrect, uint32_t color) -{ - return _SDL_FillRect(dst,dstrect,color); -} - -/***** Events and input -SDL_EnableKeyRepeat - int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); -SDL_EnableUNICODE - int SDLCALL SDL_EnableUNICODE(int enable); -SDL_GetKeyState - Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); -SDL_PollEvent - int SDLCALL SDL_PollEvent(SDL_Event *event); -SDL_PushEvent - int SDLCALL SDL_PushEvent(SDL_Event *event); -*/ - -static int (*_SDL_EnableKeyRepeat)(int delay, int interval) = 0; -DFhackCExport int SDL_EnableKeyRepeat(int delay, int interval) -{ - return _SDL_EnableKeyRepeat(delay, interval); -} - -static int (*_SDL_EnableUNICODE)(int enable) = 0; -DFhackCExport int SDL_EnableUNICODE(int enable) -{ - if(!enable) - { - fprintf(stderr, "SDL_EnableUNICODE turned off. Keybindings may break.\n"); - } - return _SDL_EnableUNICODE(enable); -} - -static uint8_t * (*_SDL_GetKeyState)(int* numkeys) = 0; -DFhackCExport uint8_t * SDL_GetKeyState(int* numkeys) -{ - return _SDL_GetKeyState(numkeys); -} - -// called by DF to check input events -static int (*_SDL_PollEvent)(SDL::Event* event) = 0; -DFhackCExport int SDL_PollEvent(SDL::Event* event) -{ - pollevent_again: - // if SDL returns 0 here, it means there are no more events. return 0 - int orig_return = _SDL_PollEvent(event); - if(!orig_return) - return 0; - // otherwise we have an event to filter - else if( event != 0 ) - { - DFHack::Core & c = DFHack::Core::getInstance(); - // if we consume the event, ask SDL for more. - if(!c.DFH_SDL_Event(event)) - goto pollevent_again; - } - return orig_return; -} - -static int (*_SDL_PushEvent)(SDL::Event* event) = 0; -DFhackCExport int SDL_PushEvent(SDL::Event* event) -{ - return _SDL_PushEvent(event); -} - -/***** error handling -SDL_GetError - char * SDLCALL SDL_GetError(void); -SDL_SetError - extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); -SDL_ClearError - extern DECLSPEC void SDLCALL SDL_ClearError(void); -SDL_Error - extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); -*/ - -static char * (*_SDL_GetError)(void) = 0; -DFhackCExport char * SDL_GetError(void) -{ - return _SDL_GetError(); -} - -static void (*_SDL_SetError)(const char *fmt, ...) = 0; -DFhackCExport void SDL_SetError(const char *fmt, ...) Wformat(printf,1,2) -{ - char buf[1024]; - va_list args; - va_start(args,fmt); - vsnprintf(buf, sizeof(buf) - 1 ,fmt,args); - va_end(args); - _SDL_SetError(buf); -} - -static void (*_SDL_ClearError)(void) = 0; -DFhackCExport void SDL_ClearError(void) -{ - _SDL_ClearError(); -} - -static void (*_SDL_Error)(int code) = 0; -DFhackCExport void SDL_Error(int code) -{ - _SDL_Error(code); -} - -/***** symbol resolution -SDL_LoadFunction - extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); -SDL_LoadObject - extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); -SDL_UnloadObject - extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); -*/ - -static void * (*_SDL_LoadFunction)(vPtr handle, const char *name) = 0; -DFhackCExport void * SDL_LoadFunction(vPtr handle, const char *name) -{ - return _SDL_LoadFunction(handle, name); -} - -extern "C" static vPtr (*_SDL_LoadObject)(const char *sofile) = 0; -DFhackCExport vPtr SDL_LoadObject(const char *sofile) -{ - return _SDL_LoadObject(sofile); -} - -static void (*_SDL_UnloadObject)(vPtr handle) = 0; -DFhackCExport void SDL_UnloadObject(vPtr handle) -{ - _SDL_UnloadObject(handle); -} - -/***** r/w -SDL_ReadBE32 - extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); -SDL_ReadLE16 - extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); -SDL_ReadLE32 - extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); -*/ - -static uint32_t (*_SDL_ReadBE32)(vPtr src) = 0; -DFhackCExport uint32_t SDL_ReadBE32(vPtr src) -{ - return _SDL_ReadBE32(src); -} - -static uint16_t (*_SDL_ReadLE16)(vPtr src) = 0; -DFhackCExport uint16_t SDL_ReadLE16(vPtr src) -{ - return _SDL_ReadLE16(src); -} - -static uint32_t (*_SDL_ReadLE32)(vPtr src) = 0; -DFhackCExport uint32_t SDL_ReadLE32(vPtr src) -{ - return _SDL_ReadLE32(src); -} - -/***** Misc -SDL_RWFromFile - SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); -SDL_SetModuleHandle - void SDLCALL SDL_SetModuleHandle(void *hInst); -SDL_ShowCursor - int SDLCALL SDL_ShowCursor(int toggle); -SDL_strlcpy - size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); -*/ - -static vPtr (*_SDL_RWFromFile)(const char* file, const char *mode) = 0; -DFhackCExport vPtr SDL_RWFromFile(const char* file, const char *mode) -{ - return _SDL_RWFromFile(file, mode); -} - -static void (*_SDL_SetModuleHandle)(vPtr hInst) = 0; -DFhackCExport void SDL_SetModuleHandle(vPtr hInst) -{ - _SDL_SetModuleHandle(hInst); -} - -static int (*_SDL_ShowCursor)(int toggle) = 0; -DFhackCExport int SDL_ShowCursor(int toggle) -{ - return _SDL_ShowCursor(toggle); -} - -static size_t (*_SDL_strlcpy)(char *dst, const char *src, size_t maxlen) = 0; -DFhackCExport size_t SDL_strlcpy(char *dst, const char *src, size_t maxlen) -{ - if(!_SDL_strlcpy) - { - HMODULE realSDLlib = LoadLibrary("SDLreal.dll"); - if(!realSDLlib) - { - exit(-111); - } - _SDL_strlcpy = (size_t (*)(char*, const char*, size_t))GetProcAddress(realSDLlib,"SDL_strlcpy"); - } - return _SDL_strlcpy(dst,src,maxlen); -} - -/***** The real meat of this -SDL_Init -SDL_Quit -SDL_GL_SwapBuffers - void SDLCALL SDL_GL_SwapBuffers(void); -*/ - - -// hook - called at program exit -static void (*_SDL_Quit)(void) = 0; -DFhackCExport void SDL_Quit(void) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - c.Shutdown(); - if(_SDL_Quit) - { - _SDL_Quit(); - } -} -// this is supported from 0.31.04 forward -DFhackCExport int SDL_NumJoysticks(void) -{ - DFHack::Core & c = DFHack::Core::getInstance(); - return c.Update(); -} - -static void (*_SDL_GL_SwapBuffers)(void) = 0; -DFhackCExport void SDL_GL_SwapBuffers(void) -{ - InitSDLPointers(); - _SDL_GL_SwapBuffers(); -} - -// hook - called every tick in the 2D mode of DF -static int (*_SDL_Flip)(void * some_ptr) = 0; -DFhackCExport int SDL_Flip(void * some_ptr) -{ - InitSDLPointers(); - return _SDL_Flip(some_ptr); -} - -static int (*_SDL_Init)(uint32_t flags) = 0; -DFhackCExport int SDL_Init(uint32_t flags) -{ - InitSDLPointers(); - return _SDL_Init(flags); -} - -/* -MORE CRAP -*/ -static void * (*_SDL_CreateSemaphore)(uint32_t initial_value) = 0; -DFhackCExport void *SDL_CreateSemaphore(uint32_t initial_value) -{ - InitSDLPointers(); - return _SDL_CreateSemaphore(initial_value); -} - -static vPtr (*_SDL_CreateThread)(int (*fn)(void *), void *data) = 0; -DFhackCExport vPtr SDL_CreateThread(int (*fn)(void *), void *data) -{ - InitSDLPointers(); - return _SDL_CreateThread(fn,data); -} - - -static void (*_SDL_Delay)(uint32_t ms) = 0; -DFhackCExport void SDL_Delay(uint32_t ms) -{ - InitSDLPointers(); - _SDL_Delay(ms); -} - -static void (*_SDL_DestroySemaphore)(void *sem) = 0; -DFhackCExport void SDL_DestroySemaphore(void *sem) -{ - InitSDLPointers(); - _SDL_DestroySemaphore(sem); -} - -static vPtr (*_SDL_ListModes)(vPtr format, uint32_t flags) = 0; -DFhackCExport vPtr SDL_ListModes(vPtr format, uint32_t flags) -{ - InitSDLPointers(); - return _SDL_ListModes(format, flags); -} - -static uint8_t (*_SDL_GetAppState)(void) = 0; -DFhackCExport uint8_t SDL_GetAppState(void) -{ - InitSDLPointers(); - return _SDL_GetAppState(); -} - -static uint8_t (*_SDL_GetMouseState)(int *, int *) = 0; -DFhackCExport uint8_t SDL_GetMouseState(int *x, int *y) -{ - InitSDLPointers(); - return _SDL_GetMouseState(x,y); -} - -static int (*_SDL_InitSubSystem)(uint32_t flags) = 0; -DFhackCExport int SDL_InitSubSystem(uint32_t flags) -{ - InitSDLPointers(); - return _SDL_InitSubSystem(flags); -} - -static int (*_SDL_SemPost)(void *sem) = 0; -DFhackCExport int SDL_SemPost(void *sem) -{ - InitSDLPointers(); - return _SDL_SemPost(sem); -} - -static int (*_SDL_SemTryWait)(void *sem) = 0; -DFhackCExport int SDL_SemTryWait(void *sem) -{ - InitSDLPointers(); - return _SDL_SemTryWait(sem); -} - -static int (*_SDL_SemWait)(void *sem) = 0; -DFhackCExport int SDL_SemWait(void *sem) -{ - InitSDLPointers(); - return _SDL_SemWait(sem); -} - -static uint32_t (*_SDL_ThreadID)(void) = 0; -DFhackCExport uint32_t SDL_ThreadID(void) -{ - InitSDLPointers(); - return _SDL_ThreadID(); -} - -static char* (*_SDL_getenv)(const char *name) = 0; -DFhackCExport char* SDL_getenv(const char *name) -{ - InitSDLPointers(); - return _SDL_getenv(name); -} - -static size_t (*_SDL_strlcat)(char *dst, const char *src, size_t maxlen) = 0; -DFhackCExport size_t SDL_strlcat(char *dst, const char *src, size_t maxlen) -{ - InitSDLPointers(); - return _SDL_strlcat(dst, src, maxlen); -} - -void FirstCall() -{ - // reroute stdout and stderr - freopen("stdout.log", "w", stdout); - freopen("stderr.log", "w", stderr); - HMODULE realSDLlib = LoadLibrary("SDLreal.dll"); - if(!realSDLlib) - { - MessageBox(0,"Can't load SDLreal.dll\n","Error", MB_OK); - fprintf(stderr, "Can't load SDLreal.dll\n"); - return; - } - fprintf(stderr, "FirstCall()\n"); - // stuff for DF - _SDL_AddTimer = (void*(*)(uint32_t, void*, void*)) GetProcAddress(realSDLlib,"SDL_AddTimer"); - _SDL_CondSignal = (int (*)(vPtr))GetProcAddress(realSDLlib,"SDL_CondSignal"); - _SDL_CondWait = (int (*)(vPtr, vPtr))GetProcAddress(realSDLlib,"SDL_CondWait"); - _SDL_ConvertSurface = (void*(*)(void*, void*, uint32_t))GetProcAddress(realSDLlib,"SDL_ConvertSurface"); - _SDL_CreateCond = (vPtr(*)())GetProcAddress(realSDLlib,"SDL_CreateCond"); - _SDL_CreateMutex = (vPtr(*)())GetProcAddress(realSDLlib,"SDL_CreateMutex"); - _SDL_CreateRGBSurface = (void*(*)(uint32_t, int, int, int, uint32_t, uint32_t, uint32_t, uint32_t))GetProcAddress(realSDLlib,"SDL_CreateRGBSurface"); - _SDL_CreateRGBSurfaceFrom = (void*(*)(void*, int, int, int, int, uint32_t, uint32_t, uint32_t, uint32_t))GetProcAddress(realSDLlib,"SDL_CreateRGBSurfaceFrom"); - _SDL_DestroyCond = (void (*)(vPtr))GetProcAddress(realSDLlib,"SDL_DestroyCond"); - _SDL_DestroyMutex = (void (*)(vPtr))GetProcAddress(realSDLlib,"SDL_DestroyMutex"); - _SDL_EnableKeyRepeat = (int (*)(int, int))GetProcAddress(realSDLlib,"SDL_EnableKeyRepeat"); - _SDL_EnableUNICODE = (int (*)(int))GetProcAddress(realSDLlib,"SDL_EnableUNICODE"); - _SDL_GetVideoSurface = (void*(*)())GetProcAddress(realSDLlib,"SDL_GetVideoSurface"); - _SDL_DisplayFormat = (void * (*) (void *))GetProcAddress(realSDLlib,"SDL_DisplayFormat"); - _SDL_DisplayFormatAlpha = (void * (*) (void *))GetProcAddress(realSDLlib,"SDL_DisplayFormatAlpha"); - _SDL_GetRGBA = (void (*) (uint32_t, void *, uint8_t *, uint8_t *, uint8_t *, uint8_t *))GetProcAddress(realSDLlib,"SDL_GetRGBA"); - _SDL_FreeSurface = (void (*)(void*))GetProcAddress(realSDLlib,"SDL_FreeSurface"); - _SDL_GL_GetAttribute = (int (*)(int, int*))GetProcAddress(realSDLlib,"SDL_GL_GetAttribute"); - _SDL_GL_SetAttribute = (int (*)(int, int))GetProcAddress(realSDLlib,"SDL_GL_SetAttribute"); - _SDL_GL_SwapBuffers = (void (*)())GetProcAddress(realSDLlib,"SDL_GL_SwapBuffers"); - _SDL_GetError = (char*(*)())GetProcAddress(realSDLlib,"SDL_GetError"); - _SDL_GetKeyState = (uint8_t*(*)(int*))GetProcAddress(realSDLlib,"SDL_GetKeyState"); - _SDL_GetTicks = (uint32_t (*)())GetProcAddress(realSDLlib,"SDL_GetTicks"); - _SDL_GetVideoInfo = (void*(*)())GetProcAddress(realSDLlib,"SDL_GetVideoInfo"); - _SDL_Init = (int (*)(uint32_t))GetProcAddress(realSDLlib,"SDL_Init"); - _SDL_Flip = (int (*)( void * )) GetProcAddress(realSDLlib, "SDL_Flip"); - _SDL_LockSurface = (int (*)(void*))GetProcAddress(realSDLlib,"SDL_LockSurface"); - _SDL_MapRGB = (uint32_t (*)(void*, uint8_t, uint8_t, uint8_t))GetProcAddress(realSDLlib,"SDL_MapRGB"); - _SDL_PollEvent = (int (*)(SDL::Event*))GetProcAddress(realSDLlib,"SDL_PollEvent"); - _SDL_PushEvent = (int (*)(SDL::Event*))GetProcAddress(realSDLlib,"SDL_PushEvent"); - _SDL_Quit = (void (*)())GetProcAddress(realSDLlib,"SDL_Quit"); - _SDL_RWFromFile = (void*(*)(const char*, const char*))GetProcAddress(realSDLlib,"SDL_RWFromFile"); - _SDL_RemoveTimer = (bool (*)(void*))GetProcAddress(realSDLlib,"SDL_RemoveTimer"); - _SDL_SaveBMP_RW = (int (*)(void*, void*, int))GetProcAddress(realSDLlib,"SDL_SaveBMP_RW"); - _SDL_SetAlpha = (int (*)(void*, uint32_t, uint8_t))GetProcAddress(realSDLlib,"SDL_SetAlpha"); - _SDL_SetColorKey = (int (*)(void*, uint32_t, uint32_t))GetProcAddress(realSDLlib,"SDL_SetColorKey"); - _SDL_SetModuleHandle = (void (*)(void*))GetProcAddress(realSDLlib,"SDL_SetModuleHandle"); - _SDL_SetVideoMode = (void*(*)(int, int, int, uint32_t))GetProcAddress(realSDLlib,"SDL_SetVideoMode"); - _SDL_ShowCursor = (int (*)(int))GetProcAddress(realSDLlib,"SDL_ShowCursor"); - _SDL_UnlockSurface = (void (*)(void*))GetProcAddress(realSDLlib,"SDL_UnlockSurface"); - _SDL_UpperBlit = (int (*)(DFHack::DFSDL_Surface*, DFHack::DFSDL_Rect*, DFHack::DFSDL_Surface*, DFHack::DFSDL_Rect*))GetProcAddress(realSDLlib,"SDL_UpperBlit"); - _SDL_WM_SetCaption = (void (*)(const char*, const char*))GetProcAddress(realSDLlib,"SDL_WM_SetCaption"); - _SDL_WM_SetIcon = (void (*)(void*, uint8_t*))GetProcAddress(realSDLlib,"SDL_WM_SetIcon"); - _SDL_mutexP = (int (*)(vPtr))GetProcAddress(realSDLlib,"SDL_mutexP"); - _SDL_mutexV = (int (*)(vPtr))GetProcAddress(realSDLlib,"SDL_mutexV"); - _SDL_strlcpy = (size_t (*)(char*, const char*, size_t))GetProcAddress(realSDLlib,"SDL_strlcpy"); - - // stuff for SDL_Image - _SDL_ClearError = (void (*)())GetProcAddress(realSDLlib,"SDL_ClearError"); - _SDL_Error = (void (*)(int))GetProcAddress(realSDLlib,"SDL_Error"); - _SDL_LoadFunction = (void*(*)(vPtr, const char*))GetProcAddress(realSDLlib,"SDL_LoadFunction"); - _SDL_LoadObject = (vPtr(*)(const char*))GetProcAddress(realSDLlib,"SDL_LoadObject"); - _SDL_ReadBE32 = (uint32_t (*)(void*))GetProcAddress(realSDLlib,"SDL_ReadBE32"); - _SDL_ReadLE16 = (uint16_t (*)(void*))GetProcAddress(realSDLlib,"SDL_ReadLE16"); - _SDL_ReadLE32 = (uint32_t (*)(void*))GetProcAddress(realSDLlib,"SDL_ReadLE32"); - _SDL_SetError = (void (*)(const char*, ...))GetProcAddress(realSDLlib,"SDL_SetError"); - _SDL_UnloadObject = (void (*)(vPtr))GetProcAddress(realSDLlib,"SDL_UnloadObject"); - _SDL_FillRect = (int (*)(void*,void*,uint32_t))GetProcAddress(realSDLlib,"SDL_FillRect"); - - // new in DF 0.31.04 - _SDL_CreateSemaphore = (void* (*)(uint32_t))GetProcAddress(realSDLlib,"SDL_CreateSemaphore"); - _SDL_CreateThread = (vPtr (*)(int (*fn)(void *), void *data))GetProcAddress(realSDLlib,"SDL_CreateThread"); - _SDL_Delay = (void (*)(uint32_t))GetProcAddress(realSDLlib,"SDL_Delay"); - _SDL_DestroySemaphore = (void (*)(void *))GetProcAddress(realSDLlib,"SDL_DestroySemaphore"); - _SDL_GetAppState = (uint8_t (*)(void))GetProcAddress(realSDLlib,"SDL_GetAppState"); - _SDL_GetMouseState = (uint8_t (*)(int *, int *))GetProcAddress(realSDLlib,"SDL_GetMouseState"); - _SDL_InitSubSystem = (int (*)(uint32_t))GetProcAddress(realSDLlib,"SDL_InitSubSystem"); - _SDL_SemPost = (int (*)(void *))GetProcAddress(realSDLlib,"SDL_SemPost"); - _SDL_SemTryWait = (int (*)(void *))GetProcAddress(realSDLlib,"SDL_SemTryWait"); - _SDL_SemWait = (int (*)(void *))GetProcAddress(realSDLlib,"SDL_SemWait"); - _SDL_ThreadID = (uint32_t (*)(void))GetProcAddress(realSDLlib,"SDL_ThreadID"); - - // new in DF 0.43.05 - _SDL_getenv = (char* (*)(const char*))GetProcAddress(realSDLlib,"SDL_getenv"); - _SDL_strlcat = (size_t (*)(char*, const char*, size_t))GetProcAddress(realSDLlib,"SDL_strlcat"); - - // new in DF v50.01 - _SDL_ListModes = (void *(*)(void*, uint32_t))GetProcAddress(realSDLlib,"SDL_ListModes"); - - _SDL_EnableUNICODE(1); - - fprintf(stderr,"Initized HOOKS!\n"); -} - -void InitSDLPointers() -{ - std::call_once(inited, [](){ FirstCall(); }); -} diff --git a/library/Hooks.cpp b/library/Hooks.cpp index 36af2617c..b4a865c18 100644 --- a/library/Hooks.cpp +++ b/library/Hooks.cpp @@ -26,8 +26,11 @@ DFhackCExport void dfhooks_prerender() { DFhackCExport bool dfhooks_sdl_event(SDL::Event* event) { return DFHack::Core::getInstance().DFH_SDL_Event(event); } + // called for each utf-8 char read from the ncurses input // key is positive for ncurses keys and negative for everything else +// if true is returned, then the event has been consumed and further processing +// shouldn't happen DFhackCExport bool dfhooks_ncurses_key(int key) { return DFHack::Core::getInstance().DFH_ncurses_key(key); } diff --git a/library/include/Core.h b/library/include/Core.h index 2e022d6ca..386769fcb 100644 --- a/library/include/Core.h +++ b/library/include/Core.h @@ -108,19 +108,6 @@ namespace DFHack // Better than tracking some weird variables all over the place. class DFHACK_EXPORT Core { -#ifdef _DARWIN - friend int ::DFH_SDL_NumJoysticks(void); - friend void ::DFH_SDL_Quit(void); - friend int ::DFH_SDL_PollEvent(SDL::Event *); - friend int ::DFH_SDL_Init(uint32_t flags); - friend int ::DFH_wgetch(WINDOW * w); -#else - friend int ::SDL_NumJoysticks(void); - friend void ::SDL_Quit(void); - friend int ::SDL_PollEvent(SDL::Event *); - friend int ::SDL_Init(uint32_t flags); - friend int ::wgetch(WINDOW * w); -#endif friend void ::dfhooks_init(); friend void ::dfhooks_shutdown(); friend void ::dfhooks_update(); @@ -207,7 +194,7 @@ namespace DFHack bool Init(); int Update (void); int Shutdown (void); - int DFH_SDL_Event(SDL::Event* event); + bool DFH_SDL_Event(SDL::Event* event); bool ncurses_wgetch(int in, int & out); bool DFH_ncurses_key(int key); diff --git a/plugins/title-folder.cpp b/plugins/title-folder.cpp index 4f93a6c7f..2659a094f 100644 --- a/plugins/title-folder.cpp +++ b/plugins/title-folder.cpp @@ -20,7 +20,7 @@ static std::string original_title; static DFLibrary *sdl_handle = NULL; static const std::vector sdl_libs { - "SDLreal.dll", + "SDL.dll", "SDL.framework/Versions/A/SDL", "SDL.framework/SDL", "libSDL-1.2.so.0" From 03d42634f9621c96a8a3dbc03d9af0d170f89caf Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 4 Jan 2023 10:11:40 -0800 Subject: [PATCH 269/439] remove unused windows package dir --- package/windows/sdl license.txt | 502 ------------------------------- package/windows/win32/.gitignore | 1 - package/windows/win64/.gitignore | 1 - 3 files changed, 504 deletions(-) delete mode 100644 package/windows/sdl license.txt delete mode 100644 package/windows/win32/.gitignore delete mode 100644 package/windows/win64/.gitignore diff --git a/package/windows/sdl license.txt b/package/windows/sdl license.txt deleted file mode 100644 index e5ab03e12..000000000 --- a/package/windows/sdl license.txt +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/package/windows/win32/.gitignore b/package/windows/win32/.gitignore deleted file mode 100644 index 6a7461313..000000000 --- a/package/windows/win32/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.dll diff --git a/package/windows/win64/.gitignore b/package/windows/win64/.gitignore deleted file mode 100644 index 6a7461313..000000000 --- a/package/windows/win64/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.dll From b2f32be117aa09672447c9983134c43227081333 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 4 Jan 2023 10:30:10 -0800 Subject: [PATCH 270/439] simplify installation instructions now that we don't overwrite SDL.dll on Windows --- docs/Installing.rst | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/docs/Installing.rst b/docs/Installing.rst index 15a6276bf..8a04b7cb9 100644 --- a/docs/Installing.rst +++ b/docs/Installing.rst @@ -80,28 +80,16 @@ among other things. Some redistributions of Dwarf Fortress may place DF in another folder, so ensure that the ``hack`` folder ends up next to the ``data`` folder, and you'll be fine. -.. note:: - - On Windows, installing DFHack will overwrite ``SDL.dll``. This is - intentional and necessary for DFHack to work, so be sure to choose to - overwrite ``SDL.dll`` if prompted. (If you are not prompted, you may be - installing DFHack in the wrong place.) - Uninstalling DFHack =================== -Manually uninstalling DFHack essentially involves reversing what you did to -install. On Windows, replace ``SDL.dll`` with ``SDLreal.dll`` first. Then, you -can remove any files that were part of the DFHack archive. DFHack does not -currently maintain a list of these files, so if you want to completely remove -them, you should consult the DFHack archive that you installed for a full list. -Generally, any files left behind should not negatively affect DF. +Just renaming or removing the ``dfhooks`` library file is enough to disable +DFHack. If you would like to remove all DFHack files, consult the DFHack install +archive to see the list of files and remove the corresponding files in the Dwarf +Fortress folder. Any DFHack files left behind will not negatively affect DF. On Steam, uninstalling DFHack will cleanly remove everything that was installed -with DFHack, **including** the ``SDL.dll`` file, which will render Dwarf -Fortress inoperative. In your Steam client, open the properties window for -Dwarf Fortress, select "Local Files", and click on "Verify integrity of game -files...". This will get Dwarf Fortress working properly again. +with DFHack, so there is nothing else for you to do. Note that Steam will leave behind the ``dfhack-config`` folder, which contains all your personal DFHack-related settings and data. If you keep this folder, @@ -117,4 +105,4 @@ ensures that files that don't exist in the latest version are properly removed and don't affect your new installation. Then, extract the DFHack release archive into your Dwarf Fortress folder, -overwriting any remaining top-level files (including SDL.dll). +overwriting any remaining top-level files. From 9f605d639696fc94f8ce939b3cff4d51f2c6c9c5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 4 Jan 2023 19:55:46 -0800 Subject: [PATCH 271/439] call DF's stubs for SDL semaphore functions --- library/include/df/custom/enabler.methods.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/include/df/custom/enabler.methods.inc b/library/include/df/custom/enabler.methods.inc index 26a23a4dd..b06af2345 100644 --- a/library/include/df/custom/enabler.methods.inc +++ b/library/include/df/custom/enabler.methods.inc @@ -1,6 +1,6 @@ void zoom_display(df::zoom_commands command) { - SDL_SemWait(async_zoom.sem); + DFHack::DFSDL::DFSDL_SemWait(async_zoom.sem); async_zoom.queue.push_back(command); - SDL_SemPost(async_zoom.sem); - SDL_SemPost(async_zoom.sem_fill); + DFHack::DFSDL::DFSDL_SemPost(async_zoom.sem); + DFHack::DFSDL::DFSDL_SemPost(async_zoom.sem_fill); } From 275513319cd5b80a99c5ea63a9d4e7bfa5bcd8d1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 12 Apr 2023 23:14:03 -0700 Subject: [PATCH 272/439] remove last reference to SDLReal --- library/modules/DFSDL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/modules/DFSDL.cpp b/library/modules/DFSDL.cpp index 6a3e6af2f..b95b6302a 100644 --- a/library/modules/DFSDL.cpp +++ b/library/modules/DFSDL.cpp @@ -14,7 +14,7 @@ using namespace DFHack; static DFLibrary *g_sdl_handle = nullptr; static DFLibrary *g_sdl_image_handle = nullptr; static const std::vector SDL_LIBS { - "SDLreal.dll", // TODO: change to SDL.dll once we move to dfhooks + "SDL.dll", "SDL.framework/Versions/A/SDL", "SDL.framework/SDL", "libSDL-1.2.so.0" From 6c577fbe26cdbe0fdc2136eb66472359f5812271 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 13 Apr 2023 00:27:20 -0700 Subject: [PATCH 273/439] don't initialize Core from the main thread that's too early --- library/Hooks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Hooks.cpp b/library/Hooks.cpp index b4a865c18..13f8bd908 100644 --- a/library/Hooks.cpp +++ b/library/Hooks.cpp @@ -3,7 +3,7 @@ // called before main event loop starts DFhackCExport void dfhooks_init() { - DFHack::Core::getInstance().Init(); + // TODO: initialize things we need to do while still in the main thread } // called after main event loops exits From 48c3a2c98738dcf3f8b16c8d50de6904db96d970 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 13 Apr 2023 00:40:10 -0700 Subject: [PATCH 274/439] document which thread each call is coming from --- library/Hooks.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/library/Hooks.cpp b/library/Hooks.cpp index 13f8bd908..c241e4875 100644 --- a/library/Hooks.cpp +++ b/library/Hooks.cpp @@ -1,33 +1,35 @@ #include "Core.h" #include "Export.h" -// called before main event loop starts +// called from the main thread before the simulation thread is started +// and the main event loop is initiated DFhackCExport void dfhooks_init() { // TODO: initialize things we need to do while still in the main thread } -// called after main event loops exits +// called from the main thread after the main event loops exits DFhackCExport void dfhooks_shutdown() { DFHack::Core::getInstance().Shutdown(); } -// called in the main event loop +// called from the simulation thread in the main event loop DFhackCExport void dfhooks_update() { DFHack::Core::getInstance().Update(); } -// called just before adding the macro recording/playback overlay +// called from the simulation thread just before adding the macro +// recording/playback overlay DFhackCExport void dfhooks_prerender() { // TODO: render overlay widgets that are not attached to a viewscreen } -// called for each SDL event, if true is returned, then the event has been -// consumed and further processing shouldn't happen +// called from the main thread for each SDL event. if true is returned, then +// the event has been consumed and further processing shouldn't happen DFhackCExport bool dfhooks_sdl_event(SDL::Event* event) { return DFHack::Core::getInstance().DFH_SDL_Event(event); } -// called for each utf-8 char read from the ncurses input +// called from the main thread for each utf-8 char read from the ncurses input // key is positive for ncurses keys and negative for everything else // if true is returned, then the event has been consumed and further processing // shouldn't happen From f13548a47d53eaa45e66da5a932be5c945815784 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 13 Apr 2023 01:16:22 -0700 Subject: [PATCH 275/439] continue to ship SDL.dll until DF moves to SDL2 --- CMakeLists.txt | 16 + library/CMakeLists.txt | 4 + package/windows/sdl license.txt | 502 +++++++++++++++++++++++++++++++ package/windows/win32/.gitignore | 1 + package/windows/win64/.gitignore | 1 + 5 files changed, 524 insertions(+) create mode 100644 package/windows/sdl license.txt create mode 100644 package/windows/win32/.gitignore create mode 100644 package/windows/win64/.gitignore diff --git a/CMakeLists.txt b/CMakeLists.txt index 02857f91d..086f054c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,6 +299,22 @@ if(WIN32) DESTINATION ${CMAKE_BINARY_DIR}/depends/) file(COPY ${ZLIB_DOWNLOAD_DIR}/zlib.lib DESTINATION ${CMAKE_BINARY_DIR}/depends/zlib/lib/) + + # Do the same for SDL.dll + # (DFHack doesn't require this at build time, so no need to move it to the build folder) + # TODO: remove SDL.dll from our distribution once DF moves to SDL2. we only + # continue to include it so we don't break Steam players on update by removing + # the SDL.dll that DF needs. + set(SDL_DOWNLOAD_DIR ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}) + if(${DFHACK_BUILD_ARCH} STREQUAL "64") + download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-SDL.dll" + ${SDL_DOWNLOAD_DIR}/SDL.dll + "1ae242c4b94cb03756a1288122a66faf") + else() + download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-SDL.dll" + ${SDL_DOWNLOAD_DIR}/SDL.dll + "5a09604daca6b2b5ce049d79af935d6a") + endif() endif() if(APPLE) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 418c9b371..0b9f48413 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -432,6 +432,10 @@ if(UNIX) install(TARGETS dfhooks LIBRARY DESTINATION . RUNTIME DESTINATION .) +else() + # On windows, copy SDL.dll so DF can still run. + install(PROGRAMS ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}/SDL.dll + DESTINATION ${DFHACK_LIBRARY_DESTINATION}) endif() # install the main lib diff --git a/package/windows/sdl license.txt b/package/windows/sdl license.txt new file mode 100644 index 000000000..e5ab03e12 --- /dev/null +++ b/package/windows/sdl license.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/package/windows/win32/.gitignore b/package/windows/win32/.gitignore new file mode 100644 index 000000000..6a7461313 --- /dev/null +++ b/package/windows/win32/.gitignore @@ -0,0 +1 @@ +*.dll diff --git a/package/windows/win64/.gitignore b/package/windows/win64/.gitignore new file mode 100644 index 000000000..6a7461313 --- /dev/null +++ b/package/windows/win64/.gitignore @@ -0,0 +1 @@ +*.dll From b9d95c5a0bbc68846952c54ed91959ac55835b1f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 13 Apr 2023 18:53:11 -0700 Subject: [PATCH 276/439] bump version to 50.08-rc1 --- CMakeLists.txt | 6 +++--- library/xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9f323640..bb5c428a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,9 +191,9 @@ if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl endif() # set up versioning. -set(DF_VERSION "50.07") -set(DFHACK_RELEASE "r1") -set(DFHACK_PRERELEASE FALSE) +set(DF_VERSION "50.08") +set(DFHACK_RELEASE "rc1") +set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/library/xml b/library/xml index 43a89a268..e825025d3 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 43a89a268b825fc05457678b19e551bf632dcd19 +Subproject commit e825025d399d936548c77578d4a40eb23183af0c From 52b869d908aa55410db0574610e64f69bb5502b6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 14 Apr 2023 01:22:12 -0700 Subject: [PATCH 277/439] don't read cur_savegame.save_dir when invalid --- library/Core.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/Core.cpp b/library/Core.cpp index b1fe2d389..e9463ec51 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -2083,7 +2083,9 @@ void Core::handleLoadAndUnloadScripts(color_ostream& out, state_change_event eve if (!df::global::world) return; - std::string rawFolder = "save/" + (df::global::world->cur_savegame.save_dir) + "/init"; + + std::string rawFolder = !isWorldLoaded() ? "" : + "save/" + (df::global::world->cur_savegame.save_dir) + "/init"; auto i = table.find(event); if ( i != table.end() ) { From 5ace09fad0addc0fa02ff26bd27affa573fd39b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 14 Apr 2023 01:38:38 -0700 Subject: [PATCH 278/439] use the World module for the data read --- library/Core.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index e9463ec51..c3c7bb7f2 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -2084,8 +2084,7 @@ void Core::handleLoadAndUnloadScripts(color_ostream& out, state_change_event eve if (!df::global::world) return; - std::string rawFolder = !isWorldLoaded() ? "" : - "save/" + (df::global::world->cur_savegame.save_dir) + "/init"; + std::string rawFolder = !isWorldLoaded() ? "" : "save/" + World::ReadWorldFolder() + "/init"; auto i = table.find(event); if ( i != table.end() ) { From ce6adabbdcf50c4c0a1d071c7f874d697eaeb578 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Fri, 14 Apr 2023 05:52:24 -0500 Subject: [PATCH 279/439] sync library/xml to 50.08-beta --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index e825025d3..055f9b4ce 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit e825025d399d936548c77578d4a40eb23183af0c +Subproject commit 055f9b4cec3bbec8e562f4774754242a14026bd2 From 051baa4e6e2ad27d0a514bbf5da68b31f25ebb96 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 15 Apr 2023 07:12:55 +0000 Subject: [PATCH 280/439] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index e825025d3..43059670e 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit e825025d399d936548c77578d4a40eb23183af0c +Subproject commit 43059670e7d3338d9a164bc23d0c41994187de9c From ef380e9e1c7b4e019b4e0b31c65cf16f234043c7 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Apr 2023 15:49:36 -0700 Subject: [PATCH 281/439] don't reset planner panel minimized state --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 351e13d76..975caf91f 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements +- `buildingplan`: minimized planner panel stays minimized until you change it again ## Documentation diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 3e06ac79d..8f12c695f 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -729,7 +729,6 @@ function PlannerOverlay:onInput(keys) return true end self.selected = 1 - self.minimized = false self.subviews.hollow:setOption(false) self:reset() reset_counts_flag = true From af1d886a27a6f3c2cec8d3de1492c75d528aa74e Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sun, 16 Apr 2023 03:28:37 +0000 Subject: [PATCH 282/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index ec1a69788..7e7a1034c 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit ec1a69788fd6329008672523b622fd8b390fea73 +Subproject commit 7e7a1034c502909fdbb73398865958230da67c69 From a5e2d79e39f0fbaad03e70d16eae7e95be146bbe Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Apr 2023 21:05:05 -0700 Subject: [PATCH 283/439] remove stubs for deprecated travis scripts --- travis/authors-rst.py | 14 -------------- travis/buildmaster-rebuild-pr.py | 14 -------------- travis/check-rpc.py | 14 -------------- travis/download-df.sh | 9 --------- travis/get-df-version.sh | 9 --------- travis/lint.py | 14 -------------- travis/run-tests.py | 14 -------------- travis/script-docs.py | 14 -------------- travis/script-syntax.py | 14 -------------- 9 files changed, 116 deletions(-) delete mode 100755 travis/authors-rst.py delete mode 100755 travis/buildmaster-rebuild-pr.py delete mode 100755 travis/check-rpc.py delete mode 100755 travis/download-df.sh delete mode 100755 travis/get-df-version.sh delete mode 100755 travis/lint.py delete mode 100755 travis/run-tests.py delete mode 100755 travis/script-docs.py delete mode 100755 travis/script-syntax.py diff --git a/travis/authors-rst.py b/travis/authors-rst.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/authors-rst.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) diff --git a/travis/buildmaster-rebuild-pr.py b/travis/buildmaster-rebuild-pr.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/buildmaster-rebuild-pr.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) diff --git a/travis/check-rpc.py b/travis/check-rpc.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/check-rpc.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) diff --git a/travis/download-df.sh b/travis/download-df.sh deleted file mode 100755 index aec2d6d99..000000000 --- a/travis/download-df.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -script_name="$(basename "$0")" -new_script_path="$(dirname "$0")/../ci/${script_name}" - -printf >&2 "\nNote: travis/%s is deprecated. Use ci/%s instead.\n\n" "${script_name}" "${script_name}" - -"${new_script_path}" "$@" -exit $? diff --git a/travis/get-df-version.sh b/travis/get-df-version.sh deleted file mode 100755 index aec2d6d99..000000000 --- a/travis/get-df-version.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -script_name="$(basename "$0")" -new_script_path="$(dirname "$0")/../ci/${script_name}" - -printf >&2 "\nNote: travis/%s is deprecated. Use ci/%s instead.\n\n" "${script_name}" "${script_name}" - -"${new_script_path}" "$@" -exit $? diff --git a/travis/lint.py b/travis/lint.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/lint.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) diff --git a/travis/run-tests.py b/travis/run-tests.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/run-tests.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) diff --git a/travis/script-docs.py b/travis/script-docs.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/script-docs.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) diff --git a/travis/script-syntax.py b/travis/script-syntax.py deleted file mode 100755 index cf52385b5..000000000 --- a/travis/script-syntax.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -script_name = os.path.basename(__file__) -new_script_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ci', script_name) - -sys.stderr.write('\nNote: travis/{script_name} is deprecated. Use ci/{script_name} instead.\n\n'.format(script_name=script_name)) -sys.stderr.flush() - -p = subprocess.run([sys.executable, new_script_path] + sys.argv[1:]) -sys.exit(p.returncode) From c596df2bc57585993e7544908a3c1c8643e5d8dc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Apr 2023 21:30:51 -0700 Subject: [PATCH 284/439] update new authors from 01 Feb 2023 - 15 Apr 2023 --- docs/about/Authors.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/about/Authors.rst b/docs/about/Authors.rst index 75b9eb4f7..020ed5e76 100644 --- a/docs/about/Authors.rst +++ b/docs/about/Authors.rst @@ -45,6 +45,7 @@ cjhammel cjhammel Clayton Hughes Clément Vuchener cvuchener Corey CoreyJ87 +Cubittus Cubittus daedsidog daedsidog Dan Amlund danamlund Daniel Brooks db48x @@ -133,6 +134,7 @@ Milo Christiansen milochristiansen MithrilTuxedo MithrilTuxedo mizipzor mizipzor moversti moversti +mrrho mrrho Murad Beybalaev Erquint Myk Taylor myk002 napagokc napagokc @@ -158,6 +160,7 @@ Petr Mrázek peterix Pfhreak Pfhreak Pierre Lulé plule Pierre-David Bélanger pierredavidbelanger +PopnROFL PopnROFL potato ppaawwll ppaawwll ðŸ‡ðŸ‡ðŸ‡ðŸ‡ Priit Laes plaes @@ -201,6 +204,7 @@ SeerSkye SeerSkye seishuuu seishuuu Seth Woodworth sethwoodworth Shim Panze Shim-Panze +silverflyone silverflyone simon Simon Jackson sizeak Simon Lees simotek @@ -235,6 +239,7 @@ ViTuRaS ViTuRaS Vjek vjek Warmist warmist Wes Malone wesQ3 +Will H TSM-EVO Will Rogers wjrogers WoosterUK WoosterUK XianMaeve XianMaeve From 67f50eafb0cee72a96b2a890023b4859232c90ed Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Apr 2023 22:26:38 -0700 Subject: [PATCH 285/439] add alias and keybinding for toggling the keyboard cursor --- data/init/dfhack.keybindings.init | 3 +++ data/init/dfhack.tools.init | 1 + docs/changelog.txt | 1 + 3 files changed, 5 insertions(+) diff --git a/data/init/dfhack.keybindings.init b/data/init/dfhack.keybindings.init index 8ce0c3696..0fc596215 100644 --- a/data/init/dfhack.keybindings.init +++ b/data/init/dfhack.keybindings.init @@ -49,6 +49,9 @@ keybinding add Ctrl-H@dwarfmode autodump-destroy-here # apply blueprints to the map keybinding add Ctrl-Shift-Q@dwarfmode gui/quickfort +# toggle keyboard cursor +keybinding add Alt-K@dwarfmode toggle-kbd-cursor + # show information collected by dwarfmonitor #keybinding add Alt-M@dwarfmode/Default "dwarfmonitor prefs" #keybinding add Ctrl-F@dwarfmode/Default "dwarfmonitor stats" diff --git a/data/init/dfhack.tools.init b/data/init/dfhack.tools.init index aaf0cf277..8fd815559 100644 --- a/data/init/dfhack.tools.init +++ b/data/init/dfhack.tools.init @@ -144,3 +144,4 @@ enable \ alias add autounsuspend suspendmanager alias add gui/dig gui/design +alias add toggle-kbd-cursor lua "local flags4 = df.global.d_init.flags4 if flags4.KEYBOARD_CURSOR then flags4.KEYBOARD_CURSOR = false else local guidm = require('gui.dwarfmode') guidm.setCursorPos(guidm.Viewport.get():getCenter()) flags4.KEYBOARD_CURSOR = true end" diff --git a/docs/changelog.txt b/docs/changelog.txt index 351e13d76..3806dd125 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements +- ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) ## Documentation From 86845c5bbff2b58bd5b12f49d7184a4bafd5c36c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 16 Apr 2023 09:50:57 -0700 Subject: [PATCH 286/439] update author names as per feedback --- docs/about/Authors.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/about/Authors.rst b/docs/about/Authors.rst index 020ed5e76..cf74c6412 100644 --- a/docs/about/Authors.rst +++ b/docs/about/Authors.rst @@ -12,6 +12,7 @@ Name Github Other 8Z 8Z Abel abstern acwatkins acwatkins +Alex Blamey Cubittus Alexander Collins gearsix Alexander Gavrilov angavrilov ag Amber Brown hawkowl @@ -45,7 +46,6 @@ cjhammel cjhammel Clayton Hughes Clément Vuchener cvuchener Corey CoreyJ87 -Cubittus Cubittus daedsidog daedsidog Dan Amlund danamlund Daniel Brooks db48x @@ -204,7 +204,7 @@ SeerSkye SeerSkye seishuuu seishuuu Seth Woodworth sethwoodworth Shim Panze Shim-Panze -silverflyone silverflyone +Silver silverflyone simon Simon Jackson sizeak Simon Lees simotek From 1ec6d90e463cdb270f6f4828064ff5ce4ddb9b6a Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:06:59 +0000 Subject: [PATCH 287/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 7e7a1034c..726e5633f 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 7e7a1034c502909fdbb73398865958230da67c69 +Subproject commit 726e5633fd2aa1e0872a3f1553d8823505fca10e From 2dbfa37f54d74168b6f880d68c43617dadf13dd3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 16 Apr 2023 22:32:50 -0700 Subject: [PATCH 288/439] set version number for feedback release --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb5c428a6..239892e76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,8 +191,8 @@ if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl endif() # set up versioning. -set(DF_VERSION "50.08") -set(DFHACK_RELEASE "rc1") +set(DF_VERSION "50.07") +set(DFHACK_RELEASE "r2rc1") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From d1d521fbdb07eb72e57d2918b48d6c7cfd9a37b3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 16 Apr 2023 22:34:29 -0700 Subject: [PATCH 289/439] infrastructure for hiding the terminal console on startup --- docs/changelog.txt | 1 + library/Core.cpp | 9 +++++++++ library/lua/dfhack.lua | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index f7a3102cc..3bb16251c 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,6 +40,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: minimized planner panel stays minimized until you change it again - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) +- `gui/control-panel`: add option for hiding the terminal console by default ## Documentation diff --git a/library/Core.cpp b/library/Core.cpp index c3c7bb7f2..4f06c3d62 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -1314,6 +1314,15 @@ static void run_dfhack_init(color_ostream &out, Core *core) // load user overrides std::vector prefixes(1, "dfhack"); loadScriptFiles(core, out, prefixes, CONFIG_PATH + "init"); + + // if the option is set, hide the terminal + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); + Lua::CallLuaModuleFunction(out, L, "dfhack", "getHideConsoleOnStartup", 0, 1, + Lua::DEFAULT_LUA_LAMBDA, [&](lua_State* L) { + if (lua_toboolean(L, -1)) + core->getConsole().hide(); + }, false); } // Load dfhack.init in a dedicated thread (non-interactive console mode) diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua index aa33b62d6..bc543fd10 100644 --- a/library/lua/dfhack.lua +++ b/library/lua/dfhack.lua @@ -51,6 +51,13 @@ if dfhack.is_core_context then SC_UNPAUSED = 8 end +-- User-changeable options + +dfhack.HIDE_CONSOLE_ON_STARTUP = true +function dfhack.getHideConsoleOnStartup() + return dfhack.HIDE_CONSOLE_ON_STARTUP +end + -- Error handling safecall = dfhack.safecall From 16fbea4c1f2bd1e8eac9cbcfc6757eb659be1612 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 17 Apr 2023 05:56:19 +0000 Subject: [PATCH 290/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 726e5633f..5fe9e423b 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 726e5633fd2aa1e0872a3f1553d8823505fca10e +Subproject commit 5fe9e423bbd5cdb7c6e7e8f1051e3aa8d00c853a From a7aded65e44d95c592eb6713e2a1b9c94028c86d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 17 Apr 2023 01:04:03 -0700 Subject: [PATCH 291/439] match new gems category --- library/modules/Materials.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/library/modules/Materials.cpp b/library/modules/Materials.cpp index d73b59922..7a1ef249f 100644 --- a/library/modules/Materials.cpp +++ b/library/modules/Materials.cpp @@ -439,6 +439,7 @@ bool MaterialInfo::matches(const df::dfhack_material_category &cat) const return true; if (cat.bits.milk && linear_index(material->reaction_product.id, std::string("CHEESE_MAT")) >= 0) return true; + TEST(gem, IS_GEM); return false; } From 77c2458900b9cc6d04b7cd9cdfaaaad4a0f7a433 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 17 Apr 2023 01:05:25 -0700 Subject: [PATCH 292/439] filter by gems (for windows) --- plugins/buildingplan/buildingplan.cpp | 9 +++++++++ plugins/lua/buildingplan.lua | 2 ++ plugins/lua/buildingplan/filterselection.lua | 1 + 3 files changed, 12 insertions(+) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 1d9f58416..e2f964a44 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -150,6 +150,7 @@ static const df::dfhack_material_category stone_cat(df::dfhack_material_category static const df::dfhack_material_category wood_cat(df::dfhack_material_category::mask_wood); static const df::dfhack_material_category metal_cat(df::dfhack_material_category::mask_metal); static const df::dfhack_material_category glass_cat(df::dfhack_material_category::mask_glass); +static const df::dfhack_material_category gem_cat(df::dfhack_material_category::mask_gem); static const df::dfhack_material_category clay_cat(df::dfhack_material_category::mask_clay); static const df::dfhack_material_category cloth_cat(df::dfhack_material_category::mask_cloth); static const df::dfhack_material_category silk_cat(df::dfhack_material_category::mask_silk); @@ -169,6 +170,9 @@ static void cache_matched(int16_t type, int32_t index) { } else if (mi.matches(glass_cat)) { DEBUG(status).print("cached glass material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "glass")); + } else if (mi.matches(gem_cat)) { + DEBUG(status).print("cached gem material: %s (%d, %d)\n", mi.toString().c_str(), type, index); + mat_cache.emplace(mi.toString(), std::make_pair(mi, "gem")); } else if (mi.matches(clay_cat)) { DEBUG(status).print("cached clay material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "clay")); @@ -800,6 +804,8 @@ static int setMaterialMaskFilter(lua_State *L) { mask |= metal_cat.whole; else if (cat == "glass") mask |= glass_cat.whole; + else if (cat == "gem") + mask |= gem_cat.whole; else if (cat == "clay") mask |= clay_cat.whole; else if (cat == "cloth") @@ -850,6 +856,7 @@ static int getMaterialMaskFilter(lua_State *L) { ret.emplace("wood", !bits || bits & wood_cat.whole); ret.emplace("metal", !bits || bits & metal_cat.whole); ret.emplace("glass", !bits || bits & glass_cat.whole); + ret.emplace("gem", !bits || bits & gem_cat.whole); ret.emplace("clay", !bits || bits & clay_cat.whole); ret.emplace("cloth", !bits || bits & cloth_cat.whole); ret.emplace("silk", !bits || bits & silk_cat.whole); @@ -897,6 +904,8 @@ static int setMaterialFilter(lua_State *L) { mask.whole |= metal_cat.whole; else if (mat.matches(glass_cat)) mask.whole |= glass_cat.whole; + else if (mat.matches(gem_cat)) + mask.whole |= gem_cat.whole; else if (mat.matches(clay_cat)) mask.whole |= clay_cat.whole; else if (mat.matches(cloth_cat)) diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index 2de467f7c..d64317eb0 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -111,6 +111,8 @@ function get_desc(filter) desc = 'Ballista part' elseif desc == 'Catapultpart' then desc = 'Catapult part' + elseif desc == 'Smallgem' then + desc = 'Small, cut gem' end return desc diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index 498c89c1e..968ad88d9 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -452,6 +452,7 @@ function QualityAndMaterialsPage:refresh() make_cat_choice('Wood', 'wood', 'CUSTOM_SHIFT_O', cats), make_cat_choice('Metal', 'metal', 'CUSTOM_SHIFT_M', cats), make_cat_choice('Glass', 'glass', 'CUSTOM_SHIFT_G', cats), + make_cat_choice('Gem', 'gem', 'CUSTOM_SHIFT_E', cats), make_cat_choice('Clay', 'clay', 'CUSTOM_SHIFT_C', cats), make_cat_choice('Cloth', 'cloth', 'CUSTOM_SHIFT_L', cats), make_cat_choice('Silk', 'silk', 'CUSTOM_SHIFT_K', cats), From b26d6a90ca9edd1b8b19185cea285eed4c03803b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 17 Apr 2023 01:06:06 -0700 Subject: [PATCH 293/439] update structures head --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 43059670e..1413d3c67 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 43059670e7d3338d9a164bc23d0c41994187de9c +Subproject commit 1413d3c67c5bd85e6afbef45d8b1ade6b8389ede From eb9e40a24d6023470725959f46f2d5fe3c83daf8 Mon Sep 17 00:00:00 2001 From: John Reid Date: Mon, 17 Apr 2023 10:43:14 +0200 Subject: [PATCH 294/439] Fix typo in Quickstart.rst Fixes a typo in Quickstart.rst: mangager -> manager --- docs/Quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Quickstart.rst b/docs/Quickstart.rst index 065ba6ecc..f4a022a9c 100644 --- a/docs/Quickstart.rst +++ b/docs/Quickstart.rst @@ -162,7 +162,7 @@ You can run them all from the launcher. First, let's import some useful manager orders to keep your fort stocked with basic necessities. Run ``orders import library/basic``. If you go to your -mangager orders screen, you can see all the orders that have been created for you. +manager orders screen, you can see all the orders that have been created for you. Note that you could have imported the orders directly from this screen as well, using the DFHack `overlay` widget at the bottom of the manager orders panel. From e9f6695aceb9918ff56b3c8596498cd44faee033 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 17 Apr 2023 09:39:15 -0700 Subject: [PATCH 295/439] infrastructure for hiding armok tools --- docs/Tags.rst | 2 +- docs/changelog.txt | 3 ++- library/lua/dfhack.lua | 5 +++++ library/lua/helpdb.lua | 17 +++++++++++++++-- plugins/hotkeys.cpp | 39 +++++++++++++++++++++++++++++++-------- plugins/lua/hotkeys.lua | 13 +++++++++++++ 6 files changed, 67 insertions(+), 12 deletions(-) diff --git a/docs/Tags.rst b/docs/Tags.rst index 5ff13d632..c7b284d07 100644 --- a/docs/Tags.rst +++ b/docs/Tags.rst @@ -21,7 +21,7 @@ for the tag assignment spreadsheet. "why" tags ---------- -- `armok `: Tools that give you complete control over an aspect of the game or provide access to information that the game intentionally keeps hidden. +- `armok `: Tools that give you complete control over an aspect of the game or provide access to information that the game intentionally keeps hidden. Players that do not wish to see these tools listed in DFHack command lists can hide them in the ``Preferences`` tab of `gui/control-panel`. - `auto `: Tools that run in the background and automatically manage routine, toilsome aspects of your fortress. - `bugfix `: Tools that fix specific bugs, either permanently or on-demand. - `design `: Tools that help you design your fort. diff --git a/docs/changelog.txt b/docs/changelog.txt index 3bb16251c..553fb3362 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,7 +40,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: minimized planner panel stays minimized until you change it again - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) -- `gui/control-panel`: add option for hiding the terminal console by default +- `gui/control-panel`: add preference option for hiding the terminal console on startup +- `gui/control-panel`: add preference option for hiding "armok" tools in command lists ## Documentation diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua index bc543fd10..78d978147 100644 --- a/library/lua/dfhack.lua +++ b/library/lua/dfhack.lua @@ -58,6 +58,11 @@ function dfhack.getHideConsoleOnStartup() return dfhack.HIDE_CONSOLE_ON_STARTUP end +dfhack.HIDE_ARMOK_TOOLS = false +function dfhack.getHideArmokTools() + return dfhack.HIDE_ARMOK_TOOLS +end + -- Error handling safecall = dfhack.safecall diff --git a/library/lua/helpdb.lua b/library/lua/helpdb.lua index a7ac6226f..4ce078a22 100644 --- a/library/lua/helpdb.lua +++ b/library/lua/helpdb.lua @@ -788,7 +788,11 @@ function ls(filter_str, skip_tags, show_dev_commands, exclude_strs) table.insert(excludes, {str=argparse.stringList(exclude_strs)}) end if not show_dev_commands then - table.insert(excludes, {tag='dev'}) + local dev_tags = {'dev', 'unavailable'} + if dfhack.getHideArmokTools() then + table.insert(dev_tags, 'armok') + end + table.insert(excludes, {tag=dev_tags}) end list_entries(skip_tags, include, excludes) end @@ -813,7 +817,16 @@ function tags(tag) local skip_tags = true local include = {entry_type={ENTRY_TYPES.COMMAND}, tag=tag} - list_entries(skip_tags, include) + + local excludes = {tag={}} + if tag ~= 'unavailable' then + table.insert(excludes.tag, 'unavailable') + end + if tag ~= 'armok' and dfhack.getHideArmokTools() then + table.insert(excludes.tag, 'armok') + end + + list_entries(skip_tags, include, excludes) end return _ENV diff --git a/plugins/hotkeys.cpp b/plugins/hotkeys.cpp index 788a4c02b..136ad7a9d 100644 --- a/plugins/hotkeys.cpp +++ b/plugins/hotkeys.cpp @@ -49,7 +49,22 @@ static int cleanupHotkeys(lua_State *) { return 0; } -static void add_binding_if_valid(const string &sym, const string &cmdline, df::viewscreen *screen, bool filtermenu) { +static bool should_hide_armok(color_ostream &out, const string &cmdline) { + bool should_hide = false; + + auto L = Lua::Core::State; + Lua::StackUnwinder top(L); + Lua::CallLuaModuleFunction(out, L, "plugins.hotkeys", "should_hide_armok", 1, 1, + [&](lua_State *L){ + Lua::Push(L, cmdline); + }, [&](lua_State *L){ + should_hide = lua_toboolean(L, -1); + }); + + return should_hide; +} + +static void add_binding_if_valid(color_ostream &out, const string &sym, const string &cmdline, df::viewscreen *screen, bool filtermenu) { if (!can_invoke(cmdline, screen)) return; @@ -59,6 +74,11 @@ static void add_binding_if_valid(const string &sym, const string &cmdline, df::v return; } + if (should_hide_armok(out, cmdline)) { + DEBUG(log).print("filtering out armok keybinding\n"); + return; + } + current_bindings[sym] = cmdline; sorted_keys.push_back(sym); string keyspec = sym + "@" + MENU_SCREEN_FOCUS_STRING; @@ -67,7 +87,7 @@ static void add_binding_if_valid(const string &sym, const string &cmdline, df::v Core::getInstance().AddKeyBinding(keyspec, binding); } -static void find_active_keybindings(df::viewscreen *screen, bool filtermenu) { +static void find_active_keybindings(color_ostream &out, df::viewscreen *screen, bool filtermenu) { DEBUG(log).print("scanning for active keybindings\n"); if (valid) cleanupHotkeys(NULL); @@ -103,7 +123,7 @@ static void find_active_keybindings(df::viewscreen *screen, bool filtermenu) { string::size_type colon_pos = invoke_cmd->find(":"); // colons at location 0 are for commands like ":lua" if (colon_pos == string::npos || colon_pos == 0) { - add_binding_if_valid(sym, *invoke_cmd, screen, filtermenu); + add_binding_if_valid(out, sym, *invoke_cmd, screen, filtermenu); } else { vector tokens; @@ -111,7 +131,7 @@ static void find_active_keybindings(df::viewscreen *screen, bool filtermenu) { string focus = tokens[0].substr(1); if(Gui::matchFocusString(focus)) { auto cmdline = trim(tokens[1]); - add_binding_if_valid(sym, cmdline, screen, filtermenu); + add_binding_if_valid(out, sym, cmdline, screen, filtermenu); } } } @@ -124,7 +144,10 @@ static void find_active_keybindings(df::viewscreen *screen, bool filtermenu) { } static int getHotkeys(lua_State *L) { - find_active_keybindings(Gui::getCurViewscreen(true), true); + color_ostream *out = Lua::GetOutput(L); + if (!out) + out = &Core::getInstance().getConsole(); + find_active_keybindings(*out, Gui::getCurViewscreen(true), true); Lua::PushVector(L, sorted_keys); Lua::Push(L, current_bindings); return 2; @@ -140,7 +163,7 @@ static void list(color_ostream &out) { DEBUG(log).print("listing active hotkeys\n"); bool was_valid = valid; if (!valid) - find_active_keybindings(Gui::getCurViewscreen(true), false); + find_active_keybindings(out, Gui::getCurViewscreen(true), false); out.print("Valid keybindings for the current focus:\n %s\n", join_strings("\n", Gui::getCurFocus(true)).c_str()); @@ -176,6 +199,8 @@ static command_result hotkeys_cmd(color_ostream &out, vector & paramete return Core::getInstance().runCommand(out, INVOKE_MENU_COMMAND ); } + CoreSuspender guard; + if (parameters[0] == "list") { list(out); return CR_OK; @@ -185,8 +210,6 @@ static command_result hotkeys_cmd(color_ostream &out, vector & paramete if (parameters.size() != 2 || parameters[0] != "invoke") return CR_WRONG_USAGE; - CoreSuspender guard; - int index = string_to_int(parameters[1], -1); if (index < 0) return CR_WRONG_USAGE; diff --git a/plugins/lua/hotkeys.lua b/plugins/lua/hotkeys.lua index 8edb70073..ec5699fe4 100644 --- a/plugins/lua/hotkeys.lua +++ b/plugins/lua/hotkeys.lua @@ -5,6 +5,19 @@ local helpdb = require('helpdb') local overlay = require('plugins.overlay') local widgets = require('gui.widgets') +local function get_command(cmdline) + local first_word = cmdline:trim():split(' +')[1] + if first_word:startswith(':') then first_word = first_word:sub(2) end + return first_word +end + +function should_hide_armok(cmdline) + local first_word = get_command(cmdline) + return dfhack.getHideArmokTools() and + helpdb.is_entry(first_word) and + helpdb.get_entry_tags(first_word).armok +end + -- ----------------- -- -- HotspotMenuWidget -- -- ----------------- -- From f6031e6a799fac2cd7d9b738e99d93d9eb5d2e7e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 17 Apr 2023 13:04:42 -0700 Subject: [PATCH 296/439] refactor existing logic to use new function --- plugins/lua/hotkeys.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/plugins/lua/hotkeys.lua b/plugins/lua/hotkeys.lua index ec5699fe4..b162f0c08 100644 --- a/plugins/lua/hotkeys.lua +++ b/plugins/lua/hotkeys.lua @@ -12,10 +12,10 @@ local function get_command(cmdline) end function should_hide_armok(cmdline) - local first_word = get_command(cmdline) + local command = get_command(cmdline) return dfhack.getHideArmokTools() and - helpdb.is_entry(first_word) and - helpdb.get_entry_tags(first_word).armok + helpdb.is_entry(command) and + helpdb.get_entry_tags(command).armok end -- ----------------- -- @@ -245,10 +245,9 @@ end function Menu:onSelect(_, choice) if not choice or #self.subviews == 0 then return end - local first_word = choice.command:trim():split(' +')[1] - if first_word:startswith(':') then first_word = first_word:sub(2) end - self.subviews.help.text_to_wrap = helpdb.is_entry(first_word) and - helpdb.get_entry_short_help(first_word) or 'Command not found' + local command = get_command(choice.command) + self.subviews.help.text_to_wrap = helpdb.is_entry(command) and + helpdb.get_entry_short_help(command) or 'Command not found' self.subviews.help_panel:updateLayout() end From 3307427718814d7f6109828a9b39a95ce0b6f7aa Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 17 Apr 2023 13:29:58 -0700 Subject: [PATCH 297/439] update wording (thanks Ozzatron!) --- docs/Tags.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Tags.rst b/docs/Tags.rst index c7b284d07..ded15c4c2 100644 --- a/docs/Tags.rst +++ b/docs/Tags.rst @@ -21,7 +21,9 @@ for the tag assignment spreadsheet. "why" tags ---------- -- `armok `: Tools that give you complete control over an aspect of the game or provide access to information that the game intentionally keeps hidden. Players that do not wish to see these tools listed in DFHack command lists can hide them in the ``Preferences`` tab of `gui/control-panel`. +- `armok `: Tools which give the player god-like powers of any variety, such as control over game events, creating items from thin air, or viewing information the game intentionally keeps hidden. Players that do not wish to see these tools listed in DFHack command lists can hide them in the ``Preferences`` tab of `gui/control-panel`. + + - `auto `: Tools that run in the background and automatically manage routine, toilsome aspects of your fortress. - `bugfix `: Tools that fix specific bugs, either permanently or on-demand. - `design `: Tools that help you design your fort. From c30c59c261e5c64a7573511e676a31d8d9867502 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 18 Apr 2023 07:13:59 +0000 Subject: [PATCH 298/439] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 1413d3c67..ae268954d 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 1413d3c67c5bd85e6afbef45d8b1ade6b8389ede +Subproject commit ae268954da3cde1c4e08f6d62273a17aae0d94da diff --git a/scripts b/scripts index 5fe9e423b..6fba9905a 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 5fe9e423bbd5cdb7c6e7e8f1051e3aa8d00c853a +Subproject commit 6fba9905a71f626ecc640fd3de988e147d16cb4e From 495c94127a47f660c5bc94ece7a080d1c3dcef68 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 18 Apr 2023 10:19:25 +0000 Subject: [PATCH 299/439] Auto-update submodules depends/xlsxio: dfhack --- depends/xlsxio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/xlsxio b/depends/xlsxio index 439fdbc25..0a9945266 160000 --- a/depends/xlsxio +++ b/depends/xlsxio @@ -1 +1 @@ -Subproject commit 439fdbc259c13f23a3122e68ba35ad5a13bcd97c +Subproject commit 0a994526622c2201756e386ef98b44b193e25f06 From ed87075cb8b3875936c9823c8802d20b06f61e63 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 05:40:51 -0500 Subject: [PATCH 300/439] cmake minimum version 3.21 forced by this being the lowest version that supports vs 2022 --- depends/clsocket | 2 +- depends/lua/CMakeLists.txt | 2 +- library/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/clsocket b/depends/clsocket index 6ed8aa464..d5e17c601 160000 --- a/depends/clsocket +++ b/depends/clsocket @@ -1 +1 @@ -Subproject commit 6ed8aa46462ea01a1122fc49422840a2facc9757 +Subproject commit d5e17c6012e7eefb0cbe3e130a56c24bd11f0094 diff --git a/depends/lua/CMakeLists.txt b/depends/lua/CMakeLists.txt index c3ff0c16f..efded915f 100644 --- a/depends/lua/CMakeLists.txt +++ b/depends/lua/CMakeLists.txt @@ -1,5 +1,5 @@ project(lua CXX) -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.21) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DLUA_USE_APICHECK") diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index a3fcb8b6f..31cfb007d 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -1,5 +1,5 @@ project(dfapi) -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.21) # prevent CMake warnings about INTERFACE_LINK_LIBRARIES vs LINK_INTERFACE_LIBRARIES cmake_policy(SET CMP0022 NEW) From 649d72e658890246585e23f830b0142595c94e50 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 18 Apr 2023 08:28:00 -0700 Subject: [PATCH 301/439] add missed NO_LOGIC_SCREEN to the list adopt_region also kills the top viewscreen on transition --- library/lua/gui.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 64e203d3c..e425dbcf1 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -745,6 +745,7 @@ end local NO_LOGIC_SCREENS = { 'viewscreen_loadgamest', + 'viewscreen_adopt_regionst', 'viewscreen_export_regionst', 'viewscreen_choose_game_typest', 'viewscreen_worldst', From 250f05667b70e20a7e7c55fcfd8704477c0fe487 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 18 Apr 2023 15:50:59 -0700 Subject: [PATCH 302/439] add a warning when DT appears to be running --- docs/changelog.txt | 1 + plugins/lua/autolabor.lua | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 553fb3362..af0f208dc 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) - `gui/control-panel`: add preference option for hiding the terminal console on startup - `gui/control-panel`: add preference option for hiding "armok" tools in command lists +- ``Dwarf Therapist``: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you're starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it's not running). ## Documentation diff --git a/plugins/lua/autolabor.lua b/plugins/lua/autolabor.lua index 6ef4d7279..50f39b225 100644 --- a/plugins/lua/autolabor.lua +++ b/plugins/lua/autolabor.lua @@ -10,7 +10,7 @@ AutolaborOverlay.ATTRS{ default_enabled=true, viewscreens='dwarfmode/Info/LABOR', frame={w=29, h=5}, - frame_style=gui.MEDIUM_FRAME, + frame_style=gui.THIN_FRAME, frame_background=gui.CLEAR_PEN, } @@ -18,9 +18,20 @@ function AutolaborOverlay:init() self:addviews{ widgets.Label{ frame={t=0, l=0}, - text_pen=COLOR_RED, + text_pen=COLOR_LIGHTRED, + text='DFHack autolabor is active!', + visible=isEnabled, + }, + widgets.Label{ + frame={t=0, l=0}, + text_pen=COLOR_LIGHTRED, + text='Dwarf Therapist is active!', + visible=function() return not isEnabled() end, + }, + widgets.Label{ + frame={t=1, l=0}, + text_pen=COLOR_WHITE, text={ - 'DFHack autolabor is active!', NEWLINE, 'Any changes made on this', NEWLINE, 'screen will have no effect.' }, @@ -29,7 +40,7 @@ function AutolaborOverlay:init() end function AutolaborOverlay:render(dc) - if not isEnabled() then return false end + if df.global.game_extra.external_flag ~= 1 then return end AutolaborOverlay.super.render(self, dc) end From 150708f21db8a401a8e62f98f2c6e8ba8911d416 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 05:00:36 -0500 Subject: [PATCH 303/439] build lanchdf with steam sdk --- .gitignore | 3 +++ CMakeLists.txt | 13 ++++++++++++ package/windows/CMakeLists.txt | 10 +++++---- package/windows/{launchdf.c => launchdf.cpp} | 22 ++++++++++++++++++-- 4 files changed, 42 insertions(+), 6 deletions(-) rename package/windows/{launchdf.c => launchdf.cpp} (76%) diff --git a/.gitignore b/.gitignore index e24f11252..a386b260a 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,6 @@ tags # external plugins /plugins/CMakeLists.custom.txt + +# steam api +depends/steam diff --git a/CMakeLists.txt b/CMakeLists.txt index 239892e76..899063d9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,6 +312,19 @@ if(WIN32) ${SDLREAL_DOWNLOAD_DIR}/SDLreal.dll "5a09604daca6b2b5ce049d79af935d6a") endif() + + # download Steam SDK + set (STEAMAPI_DIR ${dfhack_SOURCE_DIR}/depends/steam/) + download_file("https://partner.steamgames.com/downloads/steamworks_sdk_156.zip" + ${STEAMAPI_DIR}/steamworks_sdk_156.zip + "af5a579990dbe5ae4c1b0689260d001b") + file(ARCHIVE_EXTRACT + INPUT ${STEAMAPI_DIR}/steamworks_sdk_156.zip + DESTINATION ${STEAMAPI_DIR}) + set(STEAMAPI_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.lib") + set(STEAMAPI_SOURCE_DIR "${STEAMAPI_DIR}/sdk/public/steam") + set(STEAMAPI_SHARED_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.dll") + endif() if(APPLE) diff --git a/package/windows/CMakeLists.txt b/package/windows/CMakeLists.txt index a5877f117..42151e663 100644 --- a/package/windows/CMakeLists.txt +++ b/package/windows/CMakeLists.txt @@ -1,7 +1,9 @@ project(package_windows) if(WIN32) - add_executable(launchdf WIN32 launchdf.c) - install(TARGETS launchdf - DESTINATION ${DFHACK_DATA_DESTINATION}) -endif() + include_directories(${STEAMAPI_SOURCE_DIR}) + link_libraries(${STEAMAPI_LIBRARY}) + add_executable(launchdf WIN32 launchdf.cpp) + install(TARGETS launchdf DESTINATION ${DFHACK_DATA_DESTINATION}) + install(FILES ${STEAMAPI_SHARED_LIBRARY} DESTINATION ${DFHACK_DATA_DESTINATION}) +endif() \ No newline at end of file diff --git a/package/windows/launchdf.c b/package/windows/launchdf.cpp similarity index 76% rename from package/windows/launchdf.c rename to package/windows/launchdf.cpp index 992bf6636..804163960 100644 --- a/package/windows/launchdf.c +++ b/package/windows/launchdf.cpp @@ -1,13 +1,17 @@ #include #include +#include "steam_api.h" + +const uint32 DFHACK_STEAM_APPID = 2346660; static BOOL is_running_on_wine() { - static const char *(CDECL *pwine_get_version)(void); + typedef const char* (CDECL wine_get_version)(void); + static wine_get_version* pwine_get_version; HMODULE hntdll = GetModuleHandle("ntdll.dll"); if(!hntdll) return FALSE; - pwine_get_version = (void *)GetProcAddress(hntdll, "wine_get_version"); + pwine_get_version = (wine_get_version*) GetProcAddress(hntdll, "wine_get_version"); return !!pwine_get_version; } @@ -61,6 +65,20 @@ static BOOL launch_direct() { } int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) { + + if (SteamAPI_RestartAppIfNecessary(DFHACK_STEAM_APPID)) // Replace with your App ID + { + return 1; + } + + if (!SteamAPI_Init()) + { + printf("Fatal Error - Steam must be running to play this game (SteamAPI_Init() failed).\n"); + return 1; + } + + return 0; + LPCWSTR err = is_running_on_wine() ? launch_via_steam_posix() : launch_via_steam_windows(); if (err && !launch_direct()) { From f336771284b152684cc4eb22cb6856330c649faf Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 08:21:54 -0500 Subject: [PATCH 304/439] launchdf rewrite this rewrites launchdf so that the dfhack launcher attempts to linger while df is running --- CMakeLists.txt | 6 +- package/windows/launchdf.cpp | 171 +++++++++++++++++++++++++++++++---- 2 files changed, 155 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 899063d9d..cf5586dfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -314,10 +314,10 @@ if(WIN32) endif() # download Steam SDK - set (STEAMAPI_DIR ${dfhack_SOURCE_DIR}/depends/steam/) - download_file("https://partner.steamgames.com/downloads/steamworks_sdk_156.zip" + set (STEAMAPI_DIR ${dfhack_SOURCE_DIR}/depends/steam) + file(DOWNLOAD "https://partner.steamgames.com/downloads/steamworks_sdk_156.zip" ${STEAMAPI_DIR}/steamworks_sdk_156.zip - "af5a579990dbe5ae4c1b0689260d001b") + EXPECTED_HASH MD5=af5a579990dbe5ae4c1b0689260d001b) file(ARCHIVE_EXTRACT INPUT ${STEAMAPI_DIR}/steamworks_sdk_156.zip DESTINATION ${STEAMAPI_DIR}) diff --git a/package/windows/launchdf.cpp b/package/windows/launchdf.cpp index 804163960..19128ead1 100644 --- a/package/windows/launchdf.cpp +++ b/package/windows/launchdf.cpp @@ -1,8 +1,12 @@ #include #include +#include #include "steam_api.h" +#include + const uint32 DFHACK_STEAM_APPID = 2346660; +const uint32 DF_STEAM_APPID = 975370; static BOOL is_running_on_wine() { typedef const char* (CDECL wine_get_version)(void); @@ -32,7 +36,7 @@ static LPCWSTR launch_via_steam_windows() { si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - WCHAR steamPath[1024]; + WCHAR steamPath[1024] = L""; DWORD datasize = 1024; LONG retCode = RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam", @@ -43,16 +47,24 @@ static LPCWSTR launch_via_steam_windows() { WCHAR commandLine[1024] = L"steam.exe -applaunch 975370"; - if (CreateProcessW(steamPath, commandLine, - NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) - return L"Could not launch Dwarf Fortress"; + BOOL res = CreateProcessW(steamPath, commandLine, + NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + + if (res) + { + WaitForSingleObject(pi.hProcess, INFINITE); - return NULL; + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return NULL; + } + else + { + return L"Could not launch Dwarf Fortress"; + } } -// this method doesn't properly attribute Steam playtime metrics to DF, -// but that's better than not having DF start at all. -static BOOL launch_direct() { +static LPCWSTR launch_direct() { STARTUPINFOW si; PROCESS_INFORMATION pi; @@ -60,31 +72,152 @@ static BOOL launch_direct() { si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - return CreateProcessW(L"Dwarf Fortress.exe", + BOOL res = CreateProcessW(L"Dwarf Fortress.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + + if (res) + { + WaitForSingleObject(pi.hProcess, INFINITE); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return NULL; + } + + return L"Could not launch via non-steam fallback method"; +} + +DWORD findDwarfFortressProcess() +{ + PROCESSENTRY32W entry; + entry.dwSize = sizeof(PROCESSENTRY32W); + + const auto snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); + + if (!Process32FirstW(snapshot, &entry)) + { + CloseHandle(snapshot); + return -1; + } + + do { + std::wstring executableName(entry.szExeFile); + if (executableName == L"Dwarf Fortress.exe") + { + CloseHandle(snapshot); + return entry.th32ProcessID; + } + } while (Process32NextW(snapshot, &entry)); + + CloseHandle(snapshot); + return -1; } -int WINAPI wWinMain(HINSTANCE hi, HINSTANCE hpi, PWSTR cmd, int ns) { +int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) { - if (SteamAPI_RestartAppIfNecessary(DFHACK_STEAM_APPID)) // Replace with your App ID + // initialize steam context + if (SteamAPI_RestartAppIfNecessary(DFHACK_STEAM_APPID)) { - return 1; + exit(0); } - if (!SteamAPI_Init()) + if (!SteamAPI_Init()) + { + // could not initialize steam context, attempt fallback launch + LPCWSTR err = launch_direct(); + if (err != NULL) { - printf("Fatal Error - Steam must be running to play this game (SteamAPI_Init() failed).\n"); - return 1; + MessageBoxW(NULL, err, NULL, 0); + exit(1); } + exit(0); + } - return 0; + bool wine = is_running_on_wine(); - LPCWSTR err = is_running_on_wine() ? launch_via_steam_posix() : launch_via_steam_windows(); + if (wine) + { + // attempt launch via steam client + LPCWSTR err = launch_via_steam_posix(); + + if (err != NULL) + // steam client launch failed, attempt fallback launch + err = launch_direct(); - if (err && !launch_direct()) { - MessageBoxW(NULL, err, NULL, 0); + if (err != NULL) + { + MessageBoxW(NULL, err, NULL, 0); + exit(1); + } + exit(0); + } + + // steam detected and not running in wine + + bool df_installed = SteamApps()->BIsAppInstalled(DF_STEAM_APPID); + + if (!df_installed) + { + // Steam DF is not installed. Assume DF is installed in same directory as DFHack and do a fallback launch + LPCWSTR err = launch_direct(); + + if (err != NULL) + { + MessageBoxW(NULL, err, NULL, 0); + exit(1); + } + exit(0); + } + + // obtain DF app path + + char buf[2048] = ""; + + int b = SteamApps()->GetAppInstallDir(DFHACK_STEAM_APPID, (char*)&buf, 2048); + std::string dfhack_install_folder = (b != -1) ? std::string(buf) : ""; + + int b2 = SteamApps()->GetAppInstallDir(DF_STEAM_APPID, (char*)&buf, 2048); + std::string df_install_folder = (b != -1) ? std::string(buf) : ""; + + + if (df_install_folder != dfhack_install_folder) + { + // DF and DFHack are not installed in the same library + MessageBoxW(NULL, L"DFHack and Dwarf Fortress must be installed in the same Steam library.\nAborting.", NULL, 0); exit(1); } + DWORD df_pid = findDwarfFortressProcess(); + + if (df_pid == -1) + { + LPCWSTR err = launch_via_steam_windows(); + if (err != NULL) + { + MessageBoxW(NULL, err, NULL, 0); + exit(1); + } + int counter = 0; + + do { + if (counter++ > 60) + { + MessageBoxW(NULL, L"Dwarf Fortress took too long to launch, aborting", NULL, 0); + exit(1); + } + Sleep(1000); + df_pid = findDwarfFortressProcess(); + } while (df_pid == -1); + } + + HANDLE hDF = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, df_pid); + + // in the future open an IPC connection so that we can proxy SteamAPI calls for the DFSteam module + + // this will eventuallyh need to become a loop with a WaitForMultipleObjects call + WaitForSingleObject(hDF, INFINITE); + + CloseHandle(hDF); + exit(0); } From dae549e3d1cc3dc775260c384eb3bd589981f662 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 08:47:05 -0500 Subject: [PATCH 305/439] fix missing end of line --- package/windows/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/windows/CMakeLists.txt b/package/windows/CMakeLists.txt index 42151e663..309613f2e 100644 --- a/package/windows/CMakeLists.txt +++ b/package/windows/CMakeLists.txt @@ -6,4 +6,4 @@ if(WIN32) add_executable(launchdf WIN32 launchdf.cpp) install(TARGETS launchdf DESTINATION ${DFHACK_DATA_DESTINATION}) install(FILES ${STEAMAPI_SHARED_LIBRARY} DESTINATION ${DFHACK_DATA_DESTINATION}) -endif() \ No newline at end of file +endif() From ea01dae88fc3cdc5d1d9673102e2bb2977ff430a Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 11:12:29 -0500 Subject: [PATCH 306/439] fix minor oops --- package/windows/launchdf.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/windows/launchdf.cpp b/package/windows/launchdf.cpp index 19128ead1..a84465f53 100644 --- a/package/windows/launchdf.cpp +++ b/package/windows/launchdf.cpp @@ -173,11 +173,11 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, char buf[2048] = ""; - int b = SteamApps()->GetAppInstallDir(DFHACK_STEAM_APPID, (char*)&buf, 2048); - std::string dfhack_install_folder = (b != -1) ? std::string(buf) : ""; + int b1 = SteamApps()->GetAppInstallDir(DFHACK_STEAM_APPID, (char*)&buf, 2048); + std::string dfhack_install_folder = (b1 != -1) ? std::string(buf) : ""; int b2 = SteamApps()->GetAppInstallDir(DF_STEAM_APPID, (char*)&buf, 2048); - std::string df_install_folder = (b != -1) ? std::string(buf) : ""; + std::string df_install_folder = (b2 != -1) ? std::string(buf) : ""; if (df_install_folder != dfhack_install_folder) From 337c5eea2adb1be611afca3af7c796e6cdc1ba47 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 18:42:42 -0500 Subject: [PATCH 307/439] changes to build process for dflaunch only build dflaunch on steam-specific builds only download steamworks SDK when building dflaunch get steam account from environment when downloading steamworks SDK --- .github/workflows/steam.yml | 4 +++- CMakeLists.txt | 12 ------------ build/win64/generate-MSVC-steam.bat | 4 ++++ package/windows/CMakeLists.txt | 30 ++++++++++++++++++++++++----- 4 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 build/win64/generate-MSVC-steam.bat diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index aae1621af..a89249eab 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -38,7 +38,9 @@ jobs: ccache-win64-cross-msvc - name: Cross-compile win64 artifacts env: - CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1' + CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1 -DBUILD_DFLAUNCH:BOOL=1' + steam_username: ${{ secrets.STEAM_USERNAME }} + steam_password: ${{ secrets.STEAM_PASSWORD }} run: | cd build bash -x build-win64-from-linux.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index cf5586dfd..fca548ccf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,18 +313,6 @@ if(WIN32) "5a09604daca6b2b5ce049d79af935d6a") endif() - # download Steam SDK - set (STEAMAPI_DIR ${dfhack_SOURCE_DIR}/depends/steam) - file(DOWNLOAD "https://partner.steamgames.com/downloads/steamworks_sdk_156.zip" - ${STEAMAPI_DIR}/steamworks_sdk_156.zip - EXPECTED_HASH MD5=af5a579990dbe5ae4c1b0689260d001b) - file(ARCHIVE_EXTRACT - INPUT ${STEAMAPI_DIR}/steamworks_sdk_156.zip - DESTINATION ${STEAMAPI_DIR}) - set(STEAMAPI_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.lib") - set(STEAMAPI_SOURCE_DIR "${STEAMAPI_DIR}/sdk/public/steam") - set(STEAMAPI_SHARED_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.dll") - endif() if(APPLE) diff --git a/build/win64/generate-MSVC-steam.bat b/build/win64/generate-MSVC-steam.bat new file mode 100644 index 000000000..007bb1c08 --- /dev/null +++ b/build/win64/generate-MSVC-steam.bat @@ -0,0 +1,4 @@ +IF EXIST DF_PATH.txt SET /P _DF_PATH= Date: Tue, 18 Apr 2023 19:14:37 -0500 Subject: [PATCH 308/439] make release channel parameter optional --- .github/workflows/steam.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index a89249eab..cf41f861d 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -14,7 +14,7 @@ on: release_channel: description: Release channel type: string - required: true + required: false default: beta jobs: From 5c541a8317ab2d82bf1744e7fdff2acf6a5d32b2 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 19:33:02 -0500 Subject: [PATCH 309/439] pass credentials into container (only when needed of course) --- build/build-win64-from-linux.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/build-win64-from-linux.sh b/build/build-win64-from-linux.sh index 11f4dbbc5..c0559a999 100755 --- a/build/build-win64-from-linux.sh +++ b/build/build-win64-from-linux.sh @@ -41,6 +41,8 @@ fi if ! docker run --rm -i -v "$srcdir":/src -v "$srcdir/build/win64-cross/":/src/build \ -e BUILDER_UID=$builder_uid \ -e CCACHE_DIR=/src/build/ccache \ + -e steam_username \ + -e steam_password \ --name dfhack-win \ ghcr.io/dfhack/build-env:msvc \ bash -c "cd /src/build && dfhack-configure windows 64 Release -DCMAKE_INSTALL_PREFIX=/src/build/output cmake .. -DBUILD_DOCS=1 $CMAKE_EXTRA_ARGS && dfhack-make -j$jobs install" \ From acc408c168093af1b1c51e1a1abe04d8eb97b177 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 21:52:57 -0500 Subject: [PATCH 310/439] change sdk download secret --- .github/workflows/steam.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index cf41f861d..71e56b662 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -39,8 +39,8 @@ jobs: - name: Cross-compile win64 artifacts env: CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1 -DBUILD_DFLAUNCH:BOOL=1' - steam_username: ${{ secrets.STEAM_USERNAME }} - steam_password: ${{ secrets.STEAM_PASSWORD }} + steam_username: ${{ secrets.STEAM_SDK_USERNAME }} + steam_password: ${{ secrets.STEAM_SDK_PASSWORD }} run: | cd build bash -x build-win64-from-linux.sh From 93aaa5d19f1d74cf602744b5ad2dbc9bec42d19f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 18 Apr 2023 21:01:49 -0700 Subject: [PATCH 311/439] bump beta version to 50.07-r2rc2 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fca548ccf..caf597088 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "r2rc1") +set(DFHACK_RELEASE "r2rc2") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From c3b077d5e742a578b066d81baebc14ba094c4701 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 23:05:27 -0500 Subject: [PATCH 312/439] merge upstream submodules --- depends/clsocket | 2 +- depends/xlsxio | 2 +- scripts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/clsocket b/depends/clsocket index d5e17c601..6ed8aa464 160000 --- a/depends/clsocket +++ b/depends/clsocket @@ -1 +1 @@ -Subproject commit d5e17c6012e7eefb0cbe3e130a56c24bd11f0094 +Subproject commit 6ed8aa46462ea01a1122fc49422840a2facc9757 diff --git a/depends/xlsxio b/depends/xlsxio index 0a9945266..439fdbc25 160000 --- a/depends/xlsxio +++ b/depends/xlsxio @@ -1 +1 @@ -Subproject commit 0a994526622c2201756e386ef98b44b193e25f06 +Subproject commit 439fdbc259c13f23a3122e68ba35ad5a13bcd97c diff --git a/scripts b/scripts index 6fba9905a..ec1a69788 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 6fba9905a71f626ecc640fd3de988e147d16cb4e +Subproject commit ec1a69788fd6329008672523b622fd8b390fea73 From ac4a068007055426d96ba64f6c4f3b0f96115ab0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 18 Apr 2023 21:08:50 -0700 Subject: [PATCH 313/439] add missing changelog for buildingplan --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 553fb3362..5110e24ab 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,6 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: minimized planner panel stays minimized until you change it again +- `buildingplan`: can now filter by gems (for gem windows) - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) - `gui/control-panel`: add preference option for hiding the terminal console on startup - `gui/control-panel`: add preference option for hiding "armok" tools in command lists From f45291780e324f3344fe5ab924147cd96119ca09 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 23:19:05 -0500 Subject: [PATCH 314/439] update structures --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 055f9b4ce..34bc84b11 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 055f9b4cec3bbec8e562f4774754242a14026bd2 +Subproject commit 34bc84b1125f32b2f09b20ee0561a24bc3a66e70 From eaf2efee05c719ffda8f45eae5697da486a7d71a Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 23:32:54 -0500 Subject: [PATCH 315/439] update dfhack version --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fca548ccf..1ac75885c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,8 +191,8 @@ if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl endif() # set up versioning. -set(DF_VERSION "50.07") -set(DFHACK_RELEASE "r2rc1") +set(DF_VERSION "50.08b1") +set(DFHACK_RELEASE "beta2") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From ae2bdfad5ff8fb4f9d530f9f1458415a45ed755e Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 19 Apr 2023 11:28:57 +0200 Subject: [PATCH 316/439] moved Slider class from filterselection.lua to widgets.lua --- library/lua/gui/widgets.lua | 137 ++++++++++++++++++ plugins/lua/buildingplan/filterselection.lua | 139 +------------------ 2 files changed, 138 insertions(+), 138 deletions(-) diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index b33076cdc..eb4d53757 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -2293,4 +2293,141 @@ function TabBar:onInput(keys) end end +-------------------------------- +-- Slider +-- + +Slider = defclass(Slider, Widget) +Slider.ATTRS{ + num_stops=DEFAULT_NIL, + get_left_idx_fn=DEFAULT_NIL, + get_right_idx_fn=DEFAULT_NIL, + on_left_change=DEFAULT_NIL, + on_right_change=DEFAULT_NIL, +} + +function Slider:preinit(init_table) + init_table.frame = init_table.frame or {} + init_table.frame.h = init_table.frame.h or 1 +end + +function Slider:init() + if self.num_stops < 2 then error('too few Slider stops') end + self.is_dragging_target = nil -- 'left', 'right', or 'both' + self.is_dragging_idx = nil -- offset from leftmost dragged tile +end + +local function slider_get_width_per_idx(self) + return math.max(5, (self.frame_body.width-7) // (self.num_stops-1)) +end + +function Slider:onInput(keys) + if not keys._MOUSE_L_DOWN then return false end + local x = self:getMousePos() + if not x then return false end + local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() + local width_per_idx = slider_get_width_per_idx(self) + local left_pos = width_per_idx*(left_idx-1) + local right_pos = width_per_idx*(right_idx-1) + 4 + if x < left_pos then + self.on_left_change(self.get_left_idx_fn() - 1) + elseif x < left_pos+3 then + self.is_dragging_target = 'left' + self.is_dragging_idx = x - left_pos + elseif x < right_pos then + self.is_dragging_target = 'both' + self.is_dragging_idx = x - left_pos + elseif x < right_pos+3 then + self.is_dragging_target = 'right' + self.is_dragging_idx = x - right_pos + else + self.on_right_change(self.get_right_idx_fn() + 1) + end + return true +end + +local function slider_do_drag(self, width_per_idx) + local x = self.frame_body:localXY(dfhack.screen.getMousePos()) + local cur_pos = x - self.is_dragging_idx + cur_pos = math.max(0, cur_pos) + cur_pos = math.min(width_per_idx*(self.num_stops-1)+7, cur_pos) + local offset = self.is_dragging_target == 'right' and -2 or 1 + local new_idx = math.max(0, cur_pos+offset)//width_per_idx + 1 + local new_left_idx, new_right_idx + if self.is_dragging_target == 'right' then + new_right_idx = new_idx + else + new_left_idx = new_idx + if self.is_dragging_target == 'both' then + new_right_idx = new_left_idx + self.get_right_idx_fn() - self.get_left_idx_fn() + if new_right_idx > self.num_stops then + return + end + end + end + if new_left_idx and new_left_idx ~= self.get_left_idx_fn() then + self.on_left_change(new_left_idx) + end + if new_right_idx and new_right_idx ~= self.get_right_idx_fn() then + self.on_right_change(new_right_idx) + end +end + +local SLIDER_LEFT_END = to_pen{ch=198, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TRACK = to_pen{ch=205, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TRACK_SELECTED = to_pen{ch=205, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} +local SLIDER_TRACK_STOP = to_pen{ch=216, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TRACK_STOP_SELECTED = to_pen{ch=216, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} +local SLIDER_RIGHT_END = to_pen{ch=181, fg=COLOR_GREY, bg=COLOR_BLACK} +local SLIDER_TAB_LEFT = to_pen{ch=60, fg=COLOR_BLACK, bg=COLOR_YELLOW} +local SLIDER_TAB_CENTER = to_pen{ch=9, fg=COLOR_BLACK, bg=COLOR_YELLOW} +local SLIDER_TAB_RIGHT = to_pen{ch=62, fg=COLOR_BLACK, bg=COLOR_YELLOW} + +function Slider:onRenderBody(dc, rect) + local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() + local width_per_idx = slider_get_width_per_idx(self) + -- draw track + dc:seek(1,0) + dc:char(nil, SLIDER_LEFT_END) + dc:char(nil, SLIDER_TRACK) + for stop_idx=1,self.num_stops-1 do + local track_stop_pen = SLIDER_TRACK_STOP_SELECTED + local track_pen = SLIDER_TRACK_SELECTED + if left_idx > stop_idx or right_idx < stop_idx then + track_stop_pen = SLIDER_TRACK_STOP + track_pen = SLIDER_TRACK + elseif right_idx == stop_idx then + track_pen = SLIDER_TRACK + end + dc:char(nil, track_stop_pen) + for i=2,width_per_idx do + dc:char(nil, track_pen) + end + end + if right_idx >= self.num_stops then + dc:char(nil, SLIDER_TRACK_STOP_SELECTED) + else + dc:char(nil, SLIDER_TRACK_STOP) + end + dc:char(nil, SLIDER_TRACK) + dc:char(nil, SLIDER_RIGHT_END) + -- draw tabs + dc:seek(width_per_idx*(left_idx-1)) + dc:char(nil, SLIDER_TAB_LEFT) + dc:char(nil, SLIDER_TAB_CENTER) + dc:char(nil, SLIDER_TAB_RIGHT) + dc:seek(width_per_idx*(right_idx-1)+4) + dc:char(nil, SLIDER_TAB_LEFT) + dc:char(nil, SLIDER_TAB_CENTER) + dc:char(nil, SLIDER_TAB_RIGHT) + -- manage dragging + if self.is_dragging_target then + slider_do_drag(self, width_per_idx) + end + if df.global.enabler.mouse_lbut == 0 then + self.is_dragging_target = nil + self.is_dragging_idx = nil + end +end + return _ENV diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index 968ad88d9..fde80d4c8 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -12,143 +12,6 @@ local function get_cur_filters() uibs.building_subtype, uibs.custom_type) end --------------------------------- --- Slider --- - -Slider = defclass(Slider, widgets.Widget) -Slider.ATTRS{ - num_stops=DEFAULT_NIL, - get_left_idx_fn=DEFAULT_NIL, - get_right_idx_fn=DEFAULT_NIL, - on_left_change=DEFAULT_NIL, - on_right_change=DEFAULT_NIL, -} - -function Slider:preinit(init_table) - init_table.frame = init_table.frame or {} - init_table.frame.h = init_table.frame.h or 1 -end - -function Slider:init() - if self.num_stops < 2 then error('too few Slider stops') end - self.is_dragging_target = nil -- 'left', 'right', or 'both' - self.is_dragging_idx = nil -- offset from leftmost dragged tile -end - -local function slider_get_width_per_idx(self) - return math.max(5, (self.frame_body.width-7) // (self.num_stops-1)) -end - -function Slider:onInput(keys) - if not keys._MOUSE_L_DOWN then return false end - local x = self:getMousePos() - if not x then return false end - local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() - local width_per_idx = slider_get_width_per_idx(self) - local left_pos = width_per_idx*(left_idx-1) - local right_pos = width_per_idx*(right_idx-1) + 4 - if x < left_pos then - self.on_left_change(self.get_left_idx_fn() - 1) - elseif x < left_pos+3 then - self.is_dragging_target = 'left' - self.is_dragging_idx = x - left_pos - elseif x < right_pos then - self.is_dragging_target = 'both' - self.is_dragging_idx = x - left_pos - elseif x < right_pos+3 then - self.is_dragging_target = 'right' - self.is_dragging_idx = x - right_pos - else - self.on_right_change(self.get_right_idx_fn() + 1) - end - return true -end - -local function slider_do_drag(self, width_per_idx) - local x = self.frame_body:localXY(dfhack.screen.getMousePos()) - local cur_pos = x - self.is_dragging_idx - cur_pos = math.max(0, cur_pos) - cur_pos = math.min(width_per_idx*(self.num_stops-1)+7, cur_pos) - local offset = self.is_dragging_target == 'right' and -2 or 1 - local new_idx = math.max(0, cur_pos+offset)//width_per_idx + 1 - local new_left_idx, new_right_idx - if self.is_dragging_target == 'right' then - new_right_idx = new_idx - else - new_left_idx = new_idx - if self.is_dragging_target == 'both' then - new_right_idx = new_left_idx + self.get_right_idx_fn() - self.get_left_idx_fn() - if new_right_idx > self.num_stops then - return - end - end - end - if new_left_idx and new_left_idx ~= self.get_left_idx_fn() then - self.on_left_change(new_left_idx) - end - if new_right_idx and new_right_idx ~= self.get_right_idx_fn() then - self.on_right_change(new_right_idx) - end -end - -local SLIDER_LEFT_END = to_pen{ch=198, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TRACK = to_pen{ch=205, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TRACK_SELECTED = to_pen{ch=205, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} -local SLIDER_TRACK_STOP = to_pen{ch=216, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TRACK_STOP_SELECTED = to_pen{ch=216, fg=COLOR_LIGHTGREEN, bg=COLOR_BLACK} -local SLIDER_RIGHT_END = to_pen{ch=181, fg=COLOR_GREY, bg=COLOR_BLACK} -local SLIDER_TAB_LEFT = to_pen{ch=60, fg=COLOR_BLACK, bg=COLOR_YELLOW} -local SLIDER_TAB_CENTER = to_pen{ch=9, fg=COLOR_BLACK, bg=COLOR_YELLOW} -local SLIDER_TAB_RIGHT = to_pen{ch=62, fg=COLOR_BLACK, bg=COLOR_YELLOW} - -function Slider:onRenderBody(dc, rect) - local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() - local width_per_idx = slider_get_width_per_idx(self) - -- draw track - dc:seek(1,0) - dc:char(nil, SLIDER_LEFT_END) - dc:char(nil, SLIDER_TRACK) - for stop_idx=1,self.num_stops-1 do - local track_stop_pen = SLIDER_TRACK_STOP_SELECTED - local track_pen = SLIDER_TRACK_SELECTED - if left_idx > stop_idx or right_idx < stop_idx then - track_stop_pen = SLIDER_TRACK_STOP - track_pen = SLIDER_TRACK - elseif right_idx == stop_idx then - track_pen = SLIDER_TRACK - end - dc:char(nil, track_stop_pen) - for i=2,width_per_idx do - dc:char(nil, track_pen) - end - end - if right_idx >= self.num_stops then - dc:char(nil, SLIDER_TRACK_STOP_SELECTED) - else - dc:char(nil, SLIDER_TRACK_STOP) - end - dc:char(nil, SLIDER_TRACK) - dc:char(nil, SLIDER_RIGHT_END) - -- draw tabs - dc:seek(width_per_idx*(left_idx-1)) - dc:char(nil, SLIDER_TAB_LEFT) - dc:char(nil, SLIDER_TAB_CENTER) - dc:char(nil, SLIDER_TAB_RIGHT) - dc:seek(width_per_idx*(right_idx-1)+4) - dc:char(nil, SLIDER_TAB_LEFT) - dc:char(nil, SLIDER_TAB_CENTER) - dc:char(nil, SLIDER_TAB_RIGHT) - -- manage dragging - if self.is_dragging_target then - slider_do_drag(self, width_per_idx) - end - if df.global.enabler.mouse_lbut == 0 then - self.is_dragging_target = nil - self.is_dragging_idx = nil - end -end - -------------------------------- -- QualityAndMaterialsPage -- @@ -328,7 +191,7 @@ function QualityAndMaterialsPage:init() enabled=enable_item_quality, on_change=function(val) self:set_max_quality(val+1) end, }, - Slider{ + widgets.Slider{ frame={l=0, t=6}, num_stops=7, get_left_idx_fn=function() From 1620604a8e0d73dd5e0b7528df284aedd11b8572 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 19 Apr 2023 11:38:22 +0200 Subject: [PATCH 317/439] added changelog entry --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 5110e24ab..809223e25 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -49,6 +49,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua +- `widgets`: "Slider" class has been moved from ``filterselection.lua`` into ``widgets.lua`` ## Removed From a0b259bb676f2000eff4e160ae14f4772ab2c82f Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 19 Apr 2023 11:44:27 +0200 Subject: [PATCH 318/439] attempt to fix changelog entry... --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 809223e25..1ad220b0d 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -49,7 +49,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua -- `widgets`: "Slider" class has been moved from ``filterselection.lua`` into ``widgets.lua`` +- ``widgets``: "Slider" class has been moved from ``filterselection.lua`` into ``widgets.lua`` ## Removed From 98a252eab4ca6418b344ac8cbbc05a3273f056e5 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 20 Apr 2023 07:13:34 +0000 Subject: [PATCH 319/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 6fba9905a..ad2bd2f60 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 6fba9905a71f626ecc640fd3de988e147d16cb4e +Subproject commit ad2bd2f60d1760db8ffb80cfa57f8fb868613e81 From 8371aa0b8b0b4bbb2716f22c649b2123e2680f41 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 20 Apr 2023 13:24:47 +0200 Subject: [PATCH 320/439] renamed Slider to RangeSlider, and added draft of Lua API.rst entry --- docs/changelog.txt | 2 +- docs/dev/Lua API.rst | 11 +++++++++ library/lua/gui/widgets.lua | 26 ++++++++++---------- plugins/lua/buildingplan/filterselection.lua | 2 +- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 1ad220b0d..c6e4386b8 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -49,7 +49,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua -- ``widgets``: "Slider" class has been moved from ``filterselection.lua`` into ``widgets.lua`` +- ``widgets``: "Slider" class has been moved from ``filterselection.lua`` into ``widgets.lua`` and renamed to "RangeSlider" ## Removed diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index e63bc8a61..212a6e891 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -5130,6 +5130,17 @@ widget does not require direct usage of ``Tab``. usage of ``Tab`` in ``TabBar:init()`` for an example. See the default value of ``active_tab_pens`` or ``inactive_tab_pens`` in ``TabBar`` for an example of how to construct pens. +RangeSlider class +----------------- + +This widget implements a mouse-interactable range-slider. The user can move its two handles to set minimum and maximum values to define a range. + +:num_stops: Specifies the amount of "notches" in the range slider, the places where handles can stop. +:get_left_idx_fn: The function used by the RangeSlider to determine what value to display on its left handle. +:get_right_idx_fn: The function used by the RangeSlider to determine what value to display on its right handle. +:on_left_change: Callback executed when a handle is moved leftwards. +:on_right_change: Callback executed when a handle is moved rightwards. + .. _lua-plugins: ======= diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index eb4d53757..a778df639 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -2294,11 +2294,11 @@ function TabBar:onInput(keys) end -------------------------------- --- Slider +-- RangeSlider -- -Slider = defclass(Slider, Widget) -Slider.ATTRS{ +RangeSlider = defclass(RangeSlider, Widget) +RangeSlider.ATTRS{ num_stops=DEFAULT_NIL, get_left_idx_fn=DEFAULT_NIL, get_right_idx_fn=DEFAULT_NIL, @@ -2306,27 +2306,27 @@ Slider.ATTRS{ on_right_change=DEFAULT_NIL, } -function Slider:preinit(init_table) +function RangeSlider:preinit(init_table) init_table.frame = init_table.frame or {} init_table.frame.h = init_table.frame.h or 1 end -function Slider:init() - if self.num_stops < 2 then error('too few Slider stops') end +function RangeSlider:init() + if self.num_stops < 2 then error('too few RangeSlider stops') end self.is_dragging_target = nil -- 'left', 'right', or 'both' self.is_dragging_idx = nil -- offset from leftmost dragged tile end -local function slider_get_width_per_idx(self) +local function rangeslider_get_width_per_idx(self) return math.max(5, (self.frame_body.width-7) // (self.num_stops-1)) end -function Slider:onInput(keys) +function RangeSlider:onInput(keys) if not keys._MOUSE_L_DOWN then return false end local x = self:getMousePos() if not x then return false end local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() - local width_per_idx = slider_get_width_per_idx(self) + local width_per_idx = rangeslider_get_width_per_idx(self) local left_pos = width_per_idx*(left_idx-1) local right_pos = width_per_idx*(right_idx-1) + 4 if x < left_pos then @@ -2346,7 +2346,7 @@ function Slider:onInput(keys) return true end -local function slider_do_drag(self, width_per_idx) +local function rangeslider_do_drag(self, width_per_idx) local x = self.frame_body:localXY(dfhack.screen.getMousePos()) local cur_pos = x - self.is_dragging_idx cur_pos = math.max(0, cur_pos) @@ -2383,9 +2383,9 @@ local SLIDER_TAB_LEFT = to_pen{ch=60, fg=COLOR_BLACK, bg=COLOR_YELLOW} local SLIDER_TAB_CENTER = to_pen{ch=9, fg=COLOR_BLACK, bg=COLOR_YELLOW} local SLIDER_TAB_RIGHT = to_pen{ch=62, fg=COLOR_BLACK, bg=COLOR_YELLOW} -function Slider:onRenderBody(dc, rect) +function RangeSlider:onRenderBody(dc, rect) local left_idx, right_idx = self.get_left_idx_fn(), self.get_right_idx_fn() - local width_per_idx = slider_get_width_per_idx(self) + local width_per_idx = rangeslider_get_width_per_idx(self) -- draw track dc:seek(1,0) dc:char(nil, SLIDER_LEFT_END) @@ -2422,7 +2422,7 @@ function Slider:onRenderBody(dc, rect) dc:char(nil, SLIDER_TAB_RIGHT) -- manage dragging if self.is_dragging_target then - slider_do_drag(self, width_per_idx) + rangeslider_do_drag(self, width_per_idx) end if df.global.enabler.mouse_lbut == 0 then self.is_dragging_target = nil diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index fde80d4c8..4e8b98073 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -191,7 +191,7 @@ function QualityAndMaterialsPage:init() enabled=enable_item_quality, on_change=function(val) self:set_max_quality(val+1) end, }, - widgets.Slider{ + widgets.RangeSlider{ frame={l=0, t=6}, num_stops=7, get_left_idx_fn=function() From 1a2d5dfc8d34df66eb2a76cc1cb97ee79c17c43b Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 21 Apr 2023 07:13:33 +0000 Subject: [PATCH 321/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index ad2bd2f60..5da969fce 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit ad2bd2f60d1760db8ffb80cfa57f8fb868613e81 +Subproject commit 5da969fce69a5b9330f183cc0629798bf9907b69 From e30b86cfd2b25bd10ebe65cf2badf9fdfb1b0744 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 18 Apr 2023 10:19:25 +0000 Subject: [PATCH 322/439] Auto-update submodules depends/xlsxio: dfhack --- depends/xlsxio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/xlsxio b/depends/xlsxio index 439fdbc25..0a9945266 160000 --- a/depends/xlsxio +++ b/depends/xlsxio @@ -1 +1 @@ -Subproject commit 439fdbc259c13f23a3122e68ba35ad5a13bcd97c +Subproject commit 0a994526622c2201756e386ef98b44b193e25f06 From 1476e67422b426631247bc8119ff1ffa4cc3c736 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 18 Apr 2023 05:40:51 -0500 Subject: [PATCH 323/439] cmake minimum version 3.21 forced by this being the lowest version that supports vs 2022 --- depends/clsocket | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/clsocket b/depends/clsocket index 6ed8aa464..d5e17c601 160000 --- a/depends/clsocket +++ b/depends/clsocket @@ -1 +1 @@ -Subproject commit 6ed8aa46462ea01a1122fc49422840a2facc9757 +Subproject commit d5e17c6012e7eefb0cbe3e130a56c24bd11f0094 From 2b8b6a62e0d984746c386b519c5882b6e81a09be Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Fri, 21 Apr 2023 08:31:17 -0500 Subject: [PATCH 324/439] update structures --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 34bc84b11..98d5f8a55 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 34bc84b1125f32b2f09b20ee0561a24bc3a66e70 +Subproject commit 98d5f8a5553690ef71b9650b28d4aababf21ef5e From 6b86f7c69128e69dc03d07b735da5c68967759d9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 21 Apr 2023 11:20:28 -0700 Subject: [PATCH 325/439] planner panel is minimized by default and minimized state is now persisted across reloads --- data/dfhack-config/buildingplan.json | 5 +++ docs/changelog.txt | 2 +- plugins/lua/buildingplan/planneroverlay.lua | 40 ++++++++++++++------- 3 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 data/dfhack-config/buildingplan.json diff --git a/data/dfhack-config/buildingplan.json b/data/dfhack-config/buildingplan.json new file mode 100644 index 000000000..9bb3052b7 --- /dev/null +++ b/data/dfhack-config/buildingplan.json @@ -0,0 +1,5 @@ +{ + "planner": { + "minimized": true + } +} \ No newline at end of file diff --git a/docs/changelog.txt b/docs/changelog.txt index 4794122f6..b53717dd0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,7 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements -- `buildingplan`: minimized planner panel stays minimized until you change it again +- `buildingplan`: planner panel is minimized by default and now remembers minimized state - `buildingplan`: can now filter by gems (for gem windows) - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) - `gui/control-panel`: add preference option for hiding the terminal console on startup diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 8f12c695f..83a58ebd8 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -4,12 +4,15 @@ local itemselection = require('plugins.buildingplan.itemselection') local filterselection = require('plugins.buildingplan.filterselection') local gui = require('gui') local guidm = require('gui.dwarfmode') +local json = require('json') local overlay = require('plugins.overlay') local pens = require('plugins.buildingplan.pens') local utils = require('utils') local widgets = require('gui.widgets') require('dfhack.buildings') +config = config or json.open('dfhack-config/buildingplan.json') + local uibs = df.global.buildreq reset_counts_flag = false @@ -336,14 +339,14 @@ PlannerOverlay.ATTRS{ function PlannerOverlay:init() self.selected = 1 - self.minimized = false + self.state = ensure_key(config.data, 'planner') local main_panel = widgets.Panel{ view_id='main', frame={t=1, l=0, r=0, h=14}, frame_style=gui.INTERIOR_MEDIUM_FRAME, frame_background=gui.CLEAR_PEN, - visible=function() return not self.minimized end, + visible=self:callback('is_not_minimized'), } local minimized_panel = widgets.Panel{ @@ -355,8 +358,8 @@ function PlannerOverlay:init() {text=' show Planner ', pen=pens.MINI_TEXT_PEN, hpen=pens.MINI_TEXT_HPEN}, {text='['..string.char(31)..']', pen=pens.MINI_BUTT_PEN, hpen=pens.MINI_BUTT_HPEN}, }, - visible=function() return self.minimized end, - on_click=function() self.minimized = not self.minimized end, + visible=self:callback('is_minimized'), + on_click=self:callback('toggle_minimized'), }, widgets.Label{ frame={t=0, r=0, h=1}, @@ -364,8 +367,8 @@ function PlannerOverlay:init() {text=' hide Planner ', pen=pens.MINI_TEXT_PEN, hpen=pens.MINI_TEXT_HPEN}, {text='['..string.char(30)..']', pen=pens.MINI_BUTT_PEN, hpen=pens.MINI_BUTT_HPEN}, }, - visible=function() return not self.minimized end, - on_click=function() self.minimized = not self.minimized end, + visible=self:callback('is_not_minimized'), + on_click=self:callback('toggle_minimized'), }, }, } @@ -554,7 +557,7 @@ function PlannerOverlay:init() view_id='divider', frame={t=10, l=0, r=0, h=1}, on_render=self:callback('draw_divider_h'), - visible=function() return not self.minimized end, + visible=self:callback('is_not_minimized'), } local error_panel = widgets.ResizingPanel{ @@ -562,7 +565,7 @@ function PlannerOverlay:init() frame={t=15, l=0, r=0}, frame_style=gui.BOLD_FRAME, frame_background=gui.CLEAR_PEN, - visible=function() return not self.minimized end, + visible=self:callback('is_not_minimized'), } error_panel:addviews{ @@ -609,7 +612,7 @@ function PlannerOverlay:init() frame={t=0, l=1, w=37, h=1}, frame_inset=0, frame_background=gui.CLEAR_PEN, - visible=function() return not self.minimized end, + visible=self:callback('is_not_minimized'), subviews={ prev_next_selector, }, @@ -624,6 +627,19 @@ function PlannerOverlay:init() } end +function PlannerOverlay:is_minimized() + return self.state.minimized +end + +function PlannerOverlay:is_not_minimized() + return not self.state.minimized +end + +function PlannerOverlay:toggle_minimized() + self.state.minimized = not self.state.minimized + config:write() +end + function PlannerOverlay:draw_divider_h(dc) local x2 = dc.width -1 for x=0,x2 do @@ -735,13 +751,13 @@ function PlannerOverlay:onInput(keys) return false end if keys.CUSTOM_ALT_M then - self.minimized = not self.minimized + self:toggle_minimized() return true end if PlannerOverlay.super.onInput(self, keys) then return true end - if self.minimized then return false end + if self:is_minimized() then return false end if keys._MOUSE_L_DOWN then if is_over_options_panel() then return false end local detect_rect = copyall(self.frame_rect) @@ -837,7 +853,7 @@ function PlannerOverlay:onRenderFrame(dc, rect) uibs.building_type, uibs.building_subtype, uibs.custom_type)) end - if self.minimized then return end + if self:is_minimized() then return end local bounds = get_selected_bounds(self.saved_selection_pos, self.saved_pos) if not bounds then return end From 6d9a07355bde4816939177bd70086231398f3564 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 21 Apr 2023 11:54:38 -0700 Subject: [PATCH 326/439] allow filtering by yarn --- docs/changelog.txt | 2 +- plugins/buildingplan/buildingplan.cpp | 10 ++++++++++ plugins/lua/buildingplan/filterselection.lua | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4794122f6..935b376b2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,7 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `buildingplan`: minimized planner panel stays minimized until you change it again -- `buildingplan`: can now filter by gems (for gem windows) +- `buildingplan`: can now filter by gems (for gem windows) and yarn (for ropes in wells) - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) - `gui/control-panel`: add preference option for hiding the terminal console on startup - `gui/control-panel`: add preference option for hiding "armok" tools in command lists diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index e2f964a44..05b2c0af6 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -154,6 +154,7 @@ static const df::dfhack_material_category gem_cat(df::dfhack_material_category:: static const df::dfhack_material_category clay_cat(df::dfhack_material_category::mask_clay); static const df::dfhack_material_category cloth_cat(df::dfhack_material_category::mask_cloth); static const df::dfhack_material_category silk_cat(df::dfhack_material_category::mask_silk); +static const df::dfhack_material_category yarn_cat(df::dfhack_material_category::mask_yarn); static void cache_matched(int16_t type, int32_t index) { MaterialInfo mi; @@ -182,6 +183,9 @@ static void cache_matched(int16_t type, int32_t index) { } else if (mi.matches(silk_cat)) { DEBUG(status).print("cached silk material: %s (%d, %d)\n", mi.toString().c_str(), type, index); mat_cache.emplace(mi.toString(), std::make_pair(mi, "silk")); + } else if (mi.matches(yarn_cat)) { + DEBUG(status).print("cached yarn material: %s (%d, %d)\n", mi.toString().c_str(), type, index); + mat_cache.emplace(mi.toString(), std::make_pair(mi, "yarn")); } else TRACE(status).print("not matched: %s\n", mi.toString().c_str()); @@ -208,6 +212,7 @@ static void load_material_cache() { load_organic_material_cache(df::organic_mat_category::Wood); load_organic_material_cache(df::organic_mat_category::PlantFiber); load_organic_material_cache(df::organic_mat_category::Silk); + load_organic_material_cache(df::organic_mat_category::Yarn); } static HeatSafety get_heat_safety_filter(const BuildingTypeKey &key) { @@ -812,6 +817,8 @@ static int setMaterialMaskFilter(lua_State *L) { mask |= cloth_cat.whole; else if (cat == "silk") mask |= silk_cat.whole; + else if (cat == "yarn") + mask |= yarn_cat.whole; } DEBUG(status,*out).print( "setting material mask filter for building_type=%d subtype=%d custom=%d index=%d to %x\n", @@ -860,6 +867,7 @@ static int getMaterialMaskFilter(lua_State *L) { ret.emplace("clay", !bits || bits & clay_cat.whole); ret.emplace("cloth", !bits || bits & cloth_cat.whole); ret.emplace("silk", !bits || bits & silk_cat.whole); + ret.emplace("yarn", !bits || bits & yarn_cat.whole); Lua::Push(L, ret); return 1; } @@ -912,6 +920,8 @@ static int setMaterialFilter(lua_State *L) { mask.whole |= cloth_cat.whole; else if (mat.matches(silk_cat)) mask.whole |= silk_cat.whole; + else if (mat.matches(yarn_cat)) + mask.whole |= yarn_cat.whole; } filter.setMaterialMask(mask.whole); get_item_filters(*out, key).setItemFilter(*out, filter, index); diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index 968ad88d9..eb364870d 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -456,6 +456,7 @@ function QualityAndMaterialsPage:refresh() make_cat_choice('Clay', 'clay', 'CUSTOM_SHIFT_C', cats), make_cat_choice('Cloth', 'cloth', 'CUSTOM_SHIFT_L', cats), make_cat_choice('Silk', 'silk', 'CUSTOM_SHIFT_K', cats), + make_cat_choice('Yarn', 'yarn', 'CUSTOM_SHIFT_Y', cats), } self.subviews.materials_categories:setChoices(category_choices) From c7bf7eba9062cc7c1aeb2f7a8cbd75e081deea5e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 21 Apr 2023 12:01:33 -0700 Subject: [PATCH 327/439] update scripts HEAD in beta branch --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index ec1a69788..5da969fce 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit ec1a69788fd6329008672523b622fd8b390fea73 +Subproject commit 5da969fce69a5b9330f183cc0629798bf9907b69 From adeb872725cb6bfdcedbd4265a9c17e5d73d9745 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Sat, 22 Apr 2023 09:44:37 +0200 Subject: [PATCH 328/439] modified 's RangeSlider entry --- docs/dev/Lua API.rst | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 212a6e891..02484c745 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -5133,13 +5133,16 @@ widget does not require direct usage of ``Tab``. RangeSlider class ----------------- -This widget implements a mouse-interactable range-slider. The user can move its two handles to set minimum and maximum values to define a range. - -:num_stops: Specifies the amount of "notches" in the range slider, the places where handles can stop. -:get_left_idx_fn: The function used by the RangeSlider to determine what value to display on its left handle. -:get_right_idx_fn: The function used by the RangeSlider to determine what value to display on its right handle. -:on_left_change: Callback executed when a handle is moved leftwards. -:on_right_change: Callback executed when a handle is moved rightwards. +This widget implements a mouse-interactable range-slider. The user can move its two handles to set minimum and maximum values +to define a range, or they can drag the bar itself to move both handles at once. +The handles mirror the state of its two parent ``CycleHotkeyLabels``. + +:num_stops: Used to specify the number of "notches" in the range slider, the places where handles can stop. + (this should match the parents' number of options) +:get_left_idx_fn: The function used by the RangeSlider to get the notch index on which to display the left handle. +:get_right_idx_fn: The function used by the RangeSlider to get the notch index on which to display the right handle. +:on_left_change: Callback executed when moving the left handle. +:on_right_change: Callback executed when moving the right handle. .. _lua-plugins: From 29741dff4b012a7a5bdbda8c9dc6f797bb56f2dc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 16:31:41 -0700 Subject: [PATCH 329/439] remove toggle-kbd-cursor alias (it's a script now) --- data/init/dfhack.tools.init | 1 - 1 file changed, 1 deletion(-) diff --git a/data/init/dfhack.tools.init b/data/init/dfhack.tools.init index 8fd815559..aaf0cf277 100644 --- a/data/init/dfhack.tools.init +++ b/data/init/dfhack.tools.init @@ -144,4 +144,3 @@ enable \ alias add autounsuspend suspendmanager alias add gui/dig gui/design -alias add toggle-kbd-cursor lua "local flags4 = df.global.d_init.flags4 if flags4.KEYBOARD_CURSOR then flags4.KEYBOARD_CURSOR = false else local guidm = require('gui.dwarfmode') guidm.setCursorPos(guidm.Viewport.get():getCenter()) flags4.KEYBOARD_CURSOR = true end" From 33142a5dfc6a0cf279570da298b62659b8ce3e07 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 17:26:45 -0700 Subject: [PATCH 330/439] add DFHack title version overlay --- docs/changelog.txt | 1 + plugins/lua/overlay.lua | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 76b9ab301..7d95d810a 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,6 +44,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/control-panel`: add preference option for hiding the terminal console on startup - `gui/control-panel`: add preference option for hiding "armok" tools in command lists - ``Dwarf Therapist``: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you're starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it's not running). +- `overlay`: add the DFHack version string to the DF title screen ## Documentation diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index ff8bf7c98..75dc301ad 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -562,4 +562,42 @@ function OverlayWidget:init() self.frame.h = self.frame.h or 1 end +-- ------------------- -- +-- TitleVersionOverlay -- +-- ------------------- -- + +TitleVersionOverlay = defclass(TitleVersionOverlay, OverlayWidget) +TitleVersionOverlay.ATTRS{ + default_pos={x=50, y=-2}, + default_enabled=true, + viewscreens='title', + frame={w=30, h=3}, +} + +function TitleVersionOverlay:init() + local text = {} + table.insert(text, 'DFHack ' .. dfhack.getDFHackVersion() .. + (dfhack.isPrerelease() and (' (%s)'):format(dfhack.getGitCommit():sub(1,7)) or '')) + if #dfhack.getDFHackBuildID() > 0 then + table.insert(text, NEWLINE) + table.insert(text, 'Build ID: ' .. dfhack.getDFHackBuildID()) + end + if dfhack.isPrerelease() then + table.insert(text, NEWLINE) + table.insert(text, {text='Pre-release build', pen=COLOR_LIGHTRED}) + end + + self:addviews{ + widgets.Label{ + frame={b=0, l=0}, + text=text, + text_pen=COLOR_WHITE, + }, + } +end + +OVERLAY_WIDGETS = { + title_version = TitleVersionOverlay, +} + return _ENV From b59bf72cd21c32cf551404ad87ac8a0b4c3d70c4 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 17:31:29 -0700 Subject: [PATCH 331/439] turn down the title-version plugin --- docs/about/Removed.rst | 6 ++ docs/changelog.txt | 1 + docs/plugins/title-version.rst | 14 ----- plugins/CMakeLists.txt | 1 - plugins/title-version.cpp | 109 --------------------------------- 5 files changed, 7 insertions(+), 124 deletions(-) delete mode 100644 docs/plugins/title-version.rst delete mode 100644 plugins/title-version.cpp diff --git a/docs/about/Removed.rst b/docs/about/Removed.rst index a0365e621..174fc56c4 100644 --- a/docs/about/Removed.rst +++ b/docs/about/Removed.rst @@ -206,6 +206,12 @@ stocksettings Along with ``copystock``, ``loadstock`` and ``savestock``, replaced with the new `stockpiles` API. +.. _title-version: + +title-version +============= +Replaced with an `overlay`. + .. _warn-stuck-trees: warn-stuck-trees diff --git a/docs/changelog.txt b/docs/changelog.txt index 76b9ab301..fa5c15fde 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -52,6 +52,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua ## Removed +- `title-version`: replaced by an `overlay` widget # 50.07-r1 diff --git a/docs/plugins/title-version.rst b/docs/plugins/title-version.rst deleted file mode 100644 index 4d0ef0c0b..000000000 --- a/docs/plugins/title-version.rst +++ /dev/null @@ -1,14 +0,0 @@ -title-version -============= - -.. dfhack-tool:: - :summary: Displays the DFHack version on DF's title screen. - :tags: unavailable interface - :no-command: - -Usage ------ - -:: - - enable title-version diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 53d0296c7..97216ad50 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -162,7 +162,6 @@ dfhack_plugin(strangemood strangemood.cpp) dfhack_plugin(tailor tailor.cpp LINK_LIBRARIES lua) dfhack_plugin(tiletypes tiletypes.cpp Brushes.h LINK_LIBRARIES lua) #dfhack_plugin(title-folder title-folder.cpp) -#dfhack_plugin(title-version title-version.cpp) #dfhack_plugin(trackstop trackstop.cpp) #dfhack_plugin(tubefill tubefill.cpp) #add_subdirectory(tweak) diff --git a/plugins/title-version.cpp b/plugins/title-version.cpp deleted file mode 100644 index 66bb159ad..000000000 --- a/plugins/title-version.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "Core.h" -#include "Console.h" -#include "Export.h" -#include "PluginManager.h" -#include "modules/Gui.h" -#include "modules/Screen.h" -#include "VTableInterpose.h" -#include "DFHackVersion.h" - -#include "df/graphic.h" -#include "df/viewscreen_optionst.h" -#include "df/viewscreen_titlest.h" -#include "uicommon.h" - -using std::vector; -using std::string; -using namespace DFHack; - -DFHACK_PLUGIN("title-version"); -DFHACK_PLUGIN_IS_ENABLED(is_enabled); -REQUIRE_GLOBAL(gps); - -void draw_version(int start_x, int start_y) { - int x = start_x, - y = start_y; - - OutputString(COLOR_WHITE, x, y, string("DFHack ") + DFHACK_VERSION); - if (!DFHACK_IS_RELEASE) - { - OutputString(COLOR_WHITE, x, y, " (dev)"); - x = start_x; y++; - OutputString(COLOR_WHITE, x, y, "Git: "); - OutputString(COLOR_WHITE, x, y, DFHACK_GIT_DESCRIPTION); - } - if (strlen(DFHACK_BUILD_ID)) - { - x = start_x; y++; - OutputString(COLOR_WHITE, x, y, "Build ID: "); - OutputString(COLOR_WHITE, x, y, DFHACK_BUILD_ID); - } - if (DFHACK_IS_PRERELEASE) - { - x = start_x; y++; - OutputString(COLOR_LIGHTRED, x, y, "Pre-release build"); - } -} - -struct title_version_hook : df::viewscreen_titlest { - typedef df::viewscreen_titlest interpose_base; - - DEFINE_VMETHOD_INTERPOSE(void, render, ()) - { - INTERPOSE_NEXT(render)(); - if (!loading) - draw_version(0, 0); - } -}; - -IMPLEMENT_VMETHOD_INTERPOSE(title_version_hook, render); - -struct options_version_hook : df::viewscreen_optionst { - typedef df::viewscreen_optionst interpose_base; - - DEFINE_VMETHOD_INTERPOSE(void, render, ()) - { - INTERPOSE_NEXT(render)(); - if (!msg_quit && !in_retire_adv && !msg_peasant && - !in_retire_dwf_abandon_adv && !in_abandon_dwf && !ending_game) - draw_version(2, gps->dimy - 6); - } -}; - -IMPLEMENT_VMETHOD_INTERPOSE(options_version_hook, render); - -DFhackCExport command_result plugin_enable (color_ostream &out, bool enable) -{ - if (!gps) - return CR_FAILURE; - - if (enable != is_enabled) - { - if (!INTERPOSE_HOOK(title_version_hook, render).apply(enable) || - !INTERPOSE_HOOK(options_version_hook, render).apply(enable)) - return CR_FAILURE; - - is_enabled = enable; - } - - return CR_OK; -} - -DFhackCExport command_result plugin_init (color_ostream &out, vector &commands) -{ - return CR_OK; -} - -DFhackCExport command_result plugin_shutdown (color_ostream &out) -{ - INTERPOSE_HOOK(title_version_hook, render).remove(); - INTERPOSE_HOOK(options_version_hook, render).remove(); - return CR_OK; -} From 87e67987a926dab0fbe98f06541717d2214eb8d3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 17:41:38 -0700 Subject: [PATCH 332/439] add "version" alias to run the help --- data/init/dfhack.tools.init | 1 + docs/changelog.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/data/init/dfhack.tools.init b/data/init/dfhack.tools.init index 8fd815559..cdd2a63a0 100644 --- a/data/init/dfhack.tools.init +++ b/data/init/dfhack.tools.init @@ -145,3 +145,4 @@ enable \ alias add autounsuspend suspendmanager alias add gui/dig gui/design alias add toggle-kbd-cursor lua "local flags4 = df.global.d_init.flags4 if flags4.KEYBOARD_CURSOR then flags4.KEYBOARD_CURSOR = false else local guidm = require('gui.dwarfmode') guidm.setCursorPos(guidm.Viewport.get():getCenter()) flags4.KEYBOARD_CURSOR = true end" +alias add version help diff --git a/docs/changelog.txt b/docs/changelog.txt index fa5c15fde..ecc616669 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -41,6 +41,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `buildingplan`: planner panel is minimized by default and now remembers minimized state - `buildingplan`: can now filter by gems (for gem windows) and yarn (for ropes in wells) - ``toggle-kbd-cursor``: add hotkey for toggling the keyboard cursor (Alt-K) +- ``version``: add alias to display the DFHack help (including the version number) so something happens when players try to run "version" - `gui/control-panel`: add preference option for hiding the terminal console on startup - `gui/control-panel`: add preference option for hiding "armok" tools in command lists - ``Dwarf Therapist``: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you're starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it's not running). From b5459faffea36a6b579f6e7fe957f29d0d7aac72 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 18:20:50 -0700 Subject: [PATCH 333/439] format version string in help the same way --- library/Core.cpp | 2 +- library/DFHackVersion.cpp | 7 +++++-- library/include/DFHackVersion.h | 2 +- plugins/lua/overlay.lua | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index 4f06c3d62..a1e3b60e5 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -273,7 +273,7 @@ static std::string dfhack_version_desc() if (Version::is_release()) s << "(release)"; else - s << "(development build " << Version::git_description() << ")"; + s << "(git: " << Version::git_commit(true) << ")"; s << " on " << (sizeof(void*) == 8 ? "x86_64" : "x86"); if (strlen(Version::dfhack_build_id())) s << " [build ID: " << Version::dfhack_build_id() << "]"; diff --git a/library/DFHackVersion.cpp b/library/DFHackVersion.cpp index 7746ebece..42aac251e 100644 --- a/library/DFHackVersion.cpp +++ b/library/DFHackVersion.cpp @@ -1,6 +1,8 @@ #define NO_DFHACK_VERSION_MACROS #include "DFHackVersion.h" #include "git-describe.h" +#include + namespace DFHack { namespace Version { int dfhack_abi_version() @@ -27,9 +29,10 @@ namespace DFHack { { return DFHACK_GIT_DESCRIPTION; } - const char *git_commit() + const char* git_commit(bool short_hash) { - return DFHACK_GIT_COMMIT; + static std::string shorty(DFHACK_GIT_COMMIT, 0, 7); + return short_hash ? shorty.c_str() : DFHACK_GIT_COMMIT; } const char *git_xml_commit() { diff --git a/library/include/DFHackVersion.h b/library/include/DFHackVersion.h index 1b69dfe55..fbf2539bf 100644 --- a/library/include/DFHackVersion.h +++ b/library/include/DFHackVersion.h @@ -8,7 +8,7 @@ namespace DFHack { int dfhack_abi_version(); const char *git_description(); - const char *git_commit(); + const char* git_commit(bool short_hash = false); const char *git_xml_commit(); const char *git_xml_expected_commit(); bool git_xml_match(); diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index 75dc301ad..6a568fb85 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -571,13 +571,13 @@ TitleVersionOverlay.ATTRS{ default_pos={x=50, y=-2}, default_enabled=true, viewscreens='title', - frame={w=30, h=3}, + frame={w=35, h=3}, } function TitleVersionOverlay:init() local text = {} table.insert(text, 'DFHack ' .. dfhack.getDFHackVersion() .. - (dfhack.isPrerelease() and (' (%s)'):format(dfhack.getGitCommit():sub(1,7)) or '')) + (dfhack.isPrerelease() and (' (git: %s)'):format(dfhack.getGitCommit(true)) or '')) if #dfhack.getDFHackBuildID() > 0 then table.insert(text, NEWLINE) table.insert(text, 'Build ID: ' .. dfhack.getDFHackBuildID()) From 276efc981302646e2cee7b3d5c63dba245cdeeef Mon Sep 17 00:00:00 2001 From: Myk Date: Sun, 23 Apr 2023 18:40:24 -0700 Subject: [PATCH 334/439] Apply suggestions from code review --- docs/changelog.txt | 2 +- docs/dev/Lua API.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index c6e4386b8..e05227e0d 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -49,7 +49,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua -- ``widgets``: "Slider" class has been moved from ``filterselection.lua`` into ``widgets.lua`` and renamed to "RangeSlider" +- ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget ## Removed diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 02484c745..078cec828 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -5133,9 +5133,9 @@ widget does not require direct usage of ``Tab``. RangeSlider class ----------------- -This widget implements a mouse-interactable range-slider. The user can move its two handles to set minimum and maximum values +This widget implements a mouse-interactable range-slider. The player can move its two handles to set minimum and maximum values to define a range, or they can drag the bar itself to move both handles at once. -The handles mirror the state of its two parent ``CycleHotkeyLabels``. +The parent widget owns the range values, and can control them independently (e.g. with ``CycleHotkeyLabels``). If the range values change, the ``RangeSlider`` appearance will adjust automatically. :num_stops: Used to specify the number of "notches" in the range slider, the places where handles can stop. (this should match the parents' number of options) From 74e1aa70d9aea0bea57573b95797a659d236c1b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 23:28:50 -0700 Subject: [PATCH 335/439] fix smoothing job detection --- docs/changelog.txt | 1 + plugins/dig-now.cpp | 10 +++------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 3c1ed7e8f..588c1a6be 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- `dig-now`: properly detect and complete smoothing designations that have been converted into active jobs ## Misc Improvements - `buildingplan`: planner panel is minimized by default and now remembers minimized state diff --git a/plugins/dig-now.cpp b/plugins/dig-now.cpp index be431722b..b2af2dbca 100644 --- a/plugins/dig-now.cpp +++ b/plugins/dig-now.cpp @@ -113,14 +113,10 @@ public: case job_type::CarveUpDownStaircase: td.bits.dig = tile_dig_designation::UpDownStair; break; - case job_type::DetailWall: - case job_type::DetailFloor: { - df::tiletype tt = map.tiletypeAt(job->pos); - if (tileSpecial(tt) != df::tiletype_special::SMOOTH) { - td.bits.smooth = 1; - } + case job_type::SmoothWall: + case job_type::SmoothFloor: + td.bits.smooth = 1; break; - } case job_type::CarveTrack: to.bits.carve_track_north = (job->item_category.whole >> 18) & 1; to.bits.carve_track_south = (job->item_category.whole >> 19) & 1; From 31401b2e199d31027be4fd155c4c91dc88805190 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 23 Apr 2023 23:48:10 -0700 Subject: [PATCH 336/439] fixed size limit calculations for rollers --- docs/changelog.txt | 1 + plugins/lua/buildingplan/planneroverlay.lua | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 3c1ed7e8f..0080ab9c3 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- `buildingplan`: fixed size limit calculations for rollers ## Misc Improvements - `buildingplan`: planner panel is minimized by default and now remembers minimized state diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 83a58ebd8..803e9ae99 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -34,9 +34,10 @@ local function get_selection_size_limits() or btype == df.building_type.RoadPaved or btype == df.building_type.RoadDirt then return {w=31, h=31} - elseif btype == df.building_type.AxleHorizontal - or btype == df.building_type.Rollers then + elseif btype == df.building_type.AxleHorizontal then return uibs.direction == 1 and {w=1, h=31} or {w=31, h=1} + elseif btype == df.building_type.Rollers then + return (uibs.direction == 1 or uibs.direction == 3) and {w=31, h=1} or {w=1, h=31} end end From 5e1117473ae577e009ba4825f81dfcd981105cfd Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 24 Apr 2023 07:14:36 +0000 Subject: [PATCH 337/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 5da969fce..68f6d354b 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 5da969fce69a5b9330f183cc0629798bf9907b69 +Subproject commit 68f6d354b0d815ad0985dbe9b5faa140c980af14 From ab047af1633ed386edef49c7e329d1d34e6b4a92 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 00:31:20 -0700 Subject: [PATCH 338/439] demote chatty WARN messages to DEBUG --- docs/changelog.txt | 1 + plugins/autoclothing.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 3c1ed7e8f..54d002f3e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- `autoclothing`: eliminate game lag when there are many inventory items in the fort ## Misc Improvements - `buildingplan`: planner panel is minimized by default and now remembers minimized state diff --git a/plugins/autoclothing.cpp b/plugins/autoclothing.cpp index aa114cb84..d404960b4 100644 --- a/plugins/autoclothing.cpp +++ b/plugins/autoclothing.cpp @@ -565,7 +565,7 @@ static void find_needed_clothing_items() if (!item) { - WARN(cycle).print("autoclothing: Invalid inventory item ID: %d\n", ownedItem); + DEBUG(cycle).print("autoclothing: Invalid inventory item ID: %d\n", ownedItem); continue; } @@ -818,7 +818,7 @@ static void generate_report(color_ostream& out) auto item = Items::findItemByID(itemId); if (!item) { - WARN(cycle,out).print("autoclothing: Invalid inventory item ID: %d\n", itemId); + DEBUG(cycle, out).print("autoclothing: Invalid inventory item ID: %d\n", itemId); continue; } if (item->getWear() >= 1) From 6203894c998aef9f9aa3de7c6b85833719032618 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 08:03:11 -0700 Subject: [PATCH 339/439] add title screen focus string detection --- library/modules/Gui.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/library/modules/Gui.cpp b/library/modules/Gui.cpp index 6ea0a5ff0..44642b5fa 100644 --- a/library/modules/Gui.cpp +++ b/library/modules/Gui.cpp @@ -84,6 +84,7 @@ using namespace DFHack; #include "df/unit.h" #include "df/unit_inventory_item.h" #include "df/viewscreen_dwarfmodest.h" +#include "df/viewscreen_titlest.h" #include "df/world.h" const size_t MAX_REPORTS_SIZE = 3000; // DF clears old reports to maintain this vector size @@ -144,6 +145,17 @@ static std::map getFocusStringsHandle ); \ static void getFocusStrings_##screen_type(std::string &baseFocus, std::vector &focusStrings, VIEWSCREEN(screen_type) *screen) +DEFINE_GET_FOCUS_STRING_HANDLER(title) +{ + if (screen->managing_mods) + focusStrings.push_back(baseFocus + "/Mods"); + else if (game->main_interface.settings.open) + focusStrings.push_back(baseFocus + "/Settings"); + + if (focusStrings.empty()) + focusStrings.push_back(baseFocus + "/Default"); +} + DEFINE_GET_FOCUS_STRING_HANDLER(dwarfmode) { std::string newFocusString; From 65da8ef3c97e9c7b819c0cabf77292c69249dcfc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 08:03:31 -0700 Subject: [PATCH 340/439] only display dfhack logo on base title screen to avoid overlapping important widgets on subscreens --- plugins/lua/hotkeys.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lua/hotkeys.lua b/plugins/lua/hotkeys.lua index b162f0c08..fca0f1f27 100644 --- a/plugins/lua/hotkeys.lua +++ b/plugins/lua/hotkeys.lua @@ -39,7 +39,7 @@ HotspotMenuWidget.ATTRS{ -- 'new_region', -- conflicts with vanilla panel layouts 'savegame', 'setupdwarfgame', - 'title', + 'title/Default', 'update_region', 'world' }, From 2686c8f08441088cb6d008c4728c66533e4a2f51 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 08:04:08 -0700 Subject: [PATCH 341/439] move DFHack version next to logo and only display on the base title screen --- plugins/lua/overlay.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index 6a568fb85..81dde32b6 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -570,7 +570,7 @@ TitleVersionOverlay = defclass(TitleVersionOverlay, OverlayWidget) TitleVersionOverlay.ATTRS{ default_pos={x=50, y=-2}, default_enabled=true, - viewscreens='title', + viewscreens='title/Default', frame={w=35, h=3}, } @@ -589,7 +589,7 @@ function TitleVersionOverlay:init() self:addviews{ widgets.Label{ - frame={b=0, l=0}, + frame={t=0, l=0}, text=text, text_pen=COLOR_WHITE, }, From 300e891f8aa8d97fcef4493cc3ac9a0d7bfd7a0c Mon Sep 17 00:00:00 2001 From: Myk Date: Mon, 24 Apr 2023 14:15:09 -0700 Subject: [PATCH 342/439] Update changelog.txt --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4429e40be..49723ab27 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -37,7 +37,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - `buildingplan`: fixed size limit calculations for rollers -`- `dig-now`: properly detect and complete smoothing designations that have been converted into active jobs +- `dig-now`: properly detect and complete smoothing designations that have been converted into active jobs ## Misc Improvements - `buildingplan`: planner panel is minimized by default and now remembers minimized state From 4ecf125a1aa2eb1c4efe513ba1cca5bbe37278d7 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 24 Apr 2023 21:19:02 +0000 Subject: [PATCH 343/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 68f6d354b..6b4001dc2 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 68f6d354b0d815ad0985dbe9b5faa140c980af14 +Subproject commit 6b4001dc2f9d0e662bb7d06d8ba6fcf343a656aa From 5a4dec35f1a28ad9838a951d3049924622c81166 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 14:28:21 -0700 Subject: [PATCH 344/439] reorder template declarations so we can push vectors of maps --- library/include/LuaTools.h | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/library/include/LuaTools.h b/library/include/LuaTools.h index b19fc31de..cab3ee9cc 100644 --- a/library/include/LuaTools.h +++ b/library/include/LuaTools.h @@ -342,26 +342,6 @@ namespace DFHack {namespace Lua { DFHACK_EXPORT void PushInterfaceKeys(lua_State *L, const std::set &keys); - template - void PushVector(lua_State *state, const T &pvec, bool addn = false) - { - lua_createtable(state,pvec.size(), addn?1:0); - - if (addn) - { - lua_pushinteger(state, pvec.size()); - lua_setfield(state, -2, "n"); - } - - for (size_t i = 0; i < pvec.size(); i++) - { - Push(state, pvec[i]); - lua_rawseti(state, -2, i+1); - } - } - - DFHACK_EXPORT void GetVector(lua_State *state, std::vector &pvec, int idx = 1); - DFHACK_EXPORT int PushPosXYZ(lua_State *state, const df::coord &pos); DFHACK_EXPORT int PushPosXY(lua_State *state, const df::coord2d &pos); @@ -412,6 +392,26 @@ namespace DFHack {namespace Lua { lua_settable(state, -3); } + template + void PushVector(lua_State *state, const T &pvec, bool addn = false) + { + lua_createtable(state,pvec.size(), addn?1:0); + + if (addn) + { + lua_pushinteger(state, pvec.size()); + lua_setfield(state, -2, "n"); + } + + for (size_t i = 0; i < pvec.size(); i++) + { + Push(state, pvec[i]); + lua_rawseti(state, -2, i+1); + } + } + + DFHACK_EXPORT void GetVector(lua_State *state, std::vector &pvec, int idx = 1); + DFHACK_EXPORT void CheckPen(lua_State *L, Screen::Pen *pen, int index, bool allow_nil = false, bool allow_color = true); DFHACK_EXPORT bool IsCoreContext(lua_State *state); From 73b5e37f678719c7f4473ebfa5263e8c743484d9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 14:28:47 -0700 Subject: [PATCH 345/439] simplify loops with foreach syntax --- library/modules/Buildings.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 7694a696b..b9e61c863 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -1115,31 +1115,17 @@ static void createDesign(df::building *bld, bool rough) static int getMaxStockpileId() { - auto &vec = world->buildings.other[buildings_other_id::STOCKPILE]; int max_id = 0; - - for (size_t i = 0; i < vec.size(); i++) - { - auto bld = strict_virtual_cast(vec[i]); - if (bld) - max_id = std::max(max_id, bld->stockpile_number); - } - + for (auto bld : world->buildings.other.STOCKPILE) + max_id = std::max(max_id, bld->stockpile_number); return max_id; } static int getMaxCivzoneId() { - auto &vec = world->buildings.other[buildings_other_id::ANY_ZONE]; int max_id = 0; - - for (size_t i = 0; i < vec.size(); i++) - { - auto bld = strict_virtual_cast(vec[i]); - if (bld) - max_id = std::max(max_id, bld->zone_num); - } - + for (auto bld : world->buildings.other.ANY_ZONE) + max_id = std::max(max_id, bld->zone_num); return max_id; } From 65d7b290a3f7a859d2a75fa44e4c3109684f63b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 14:32:33 -0700 Subject: [PATCH 346/439] add ZScreenModal class for modal dialogs --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 7 +++++++ library/lua/gui.lua | 13 +++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index a3e9c6f6c..2b3438cc5 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -55,6 +55,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget +- ``gui.ZScreenModal``: ZScreen subclass for modal dialogs ## Removed - `title-version`: replaced by an `overlay` widget diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 078cec828..9c320fc98 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4323,6 +4323,13 @@ Here is an example skeleton for a ZScreen tool window:: view = view and view:raise() or MyScreen{}:show() +ZScreenModal class +------------------ + +A ZScreen convenience subclass that sets the attributes to something +appropriate for modal dialogs. The game is force paused, and no input is passed +through to the underlying viewscreens. + FramedScreen class ------------------ diff --git a/library/lua/gui.lua b/library/lua/gui.lua index e425dbcf1..b2c90d076 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -867,8 +867,17 @@ function ZScreen:onGetSelectedPlant() return zscreen_get_any(self, 'Plant') end --------------------------- --- Framed screen object -- +-- convenience subclass for modal dialogs +ZScreenModal = defclass(ZScreenModal, ZScreen) +ZScreenModal.ATTRS{ + defocusable = false, + force_pause = true, + pass_pause = false, + pass_movement_keys = false, + pass_mouse_clicks = false, +} + +-- Framed screen object -------------------------- -- Plain grey-colored frame. From 54ea391b1daf7059eef570add6e327a2eebaa3b0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 15:26:33 -0700 Subject: [PATCH 347/439] bump to 50.07-r2rc3 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index caf597088..72314ee6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.07") -set(DFHACK_RELEASE "r2rc2") +set(DFHACK_RELEASE "r2rc3") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From 6c88fa6440b9282595fb2dddf7e6c5ba5bf07336 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 24 Apr 2023 16:12:37 -0700 Subject: [PATCH 348/439] don't output git hash on release builds --- plugins/lua/overlay.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index 81dde32b6..cf7008a40 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -577,7 +577,7 @@ TitleVersionOverlay.ATTRS{ function TitleVersionOverlay:init() local text = {} table.insert(text, 'DFHack ' .. dfhack.getDFHackVersion() .. - (dfhack.isPrerelease() and (' (git: %s)'):format(dfhack.getGitCommit(true)) or '')) + (dfhack.isRelease() and '' or (' (git: %s)'):format(dfhack.getGitCommit(true)))) if #dfhack.getDFHackBuildID() > 0 then table.insert(text, NEWLINE) table.insert(text, 'Build ID: ' .. dfhack.getDFHackBuildID()) From 4d3a4adf572dd49aab402a72bcd8bd368b0612f4 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 25 Apr 2023 07:13:39 +0000 Subject: [PATCH 349/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 6b4001dc2..ad1998a00 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 6b4001dc2f9d0e662bb7d06d8ba6fcf343a656aa +Subproject commit ad1998a0032ce50e90d05429a4178b668c0840ba From 68a8c687eabbecbf4c39b8045340ee5f76dfdf05 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 25 Apr 2023 16:02:15 -0500 Subject: [PATCH 350/439] steam build workflow improvements improve cmake handling for downloading the sdk set up GHA to cache the SDK download --- .github/workflows/steam.yml | 6 ++++++ package/windows/CMakeLists.txt | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 71e56b662..05692c680 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -36,6 +36,12 @@ jobs: restore-keys: | ccache-win64-cross-msvc-develop-${{ github.event.inputs.commit_hash }} ccache-win64-cross-msvc + - name: Restore steam SDK + uses: action/cache@v3 + with: + path: depends/steam/steamworks_sdk_156.zip + key: steam-sdk-156 + enableCrossOsArchive: true - name: Cross-compile win64 artifacts env: CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1 -DBUILD_DFLAUNCH:BOOL=1' diff --git a/package/windows/CMakeLists.txt b/package/windows/CMakeLists.txt index b74cdfec5..d92d687c4 100644 --- a/package/windows/CMakeLists.txt +++ b/package/windows/CMakeLists.txt @@ -9,13 +9,22 @@ if(WIN32) ${STEAMAPI_DIR}/steamworks_sdk_156.zip EXPECTED_HASH MD5=af5a579990dbe5ae4c1b0689260d001b USERPWD $ENV{steam_username}:$ENV{steam_password} + STATUS STEAM_SDK_DOWNLOAD_STATUS + SHOW_PROGRESS ) - file(ARCHIVE_EXTRACT - INPUT ${STEAMAPI_DIR}/steamworks_sdk_156.zip - DESTINATION ${STEAMAPI_DIR}) - set(STEAMAPI_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.lib") - set(STEAMAPI_SOURCE_DIR "${STEAMAPI_DIR}/sdk/public/steam") - set(STEAMAPI_SHARED_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.dll") + list(GET STEAM_SDK_DOWNLOAD_STATUS 0 STEAM_SDK_DL_STATUS_CODE) + list(GET STEAM_SDK_DOWNLOAD_STATUS 1 STEAM_SDK_DL_ERROR_MESSAGE) + if (NOT (${STEAM_SDK_DL_STATUS_CODE} EQUAL 0)) + message(FATAL_ERROR "Steam SDK download: " ${STEAM_SDK_DL_ERROR_MESSAGE}) + else () + message(STATUS "Steam SDK download: " ${STEAM_SDK_DL_ERROR_MESSAGE}) + file(ARCHIVE_EXTRACT + INPUT ${STEAMAPI_DIR}/steamworks_sdk_156.zip + DESTINATION ${STEAMAPI_DIR}) + set(STEAMAPI_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.lib") + set(STEAMAPI_SOURCE_DIR "${STEAMAPI_DIR}/sdk/public/steam") + set(STEAMAPI_SHARED_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.dll") + endif() else() message(SEND_ERROR "Need to set steam_username and steam_password in environment to download Steamworks SDK") endif() From 17a798d5bc9f0b3d64930663e992275bdddf7d4a Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Tue, 25 Apr 2023 16:06:36 -0500 Subject: [PATCH 351/439] add missing letter --- .github/workflows/steam.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 05692c680..ca6802446 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -37,7 +37,7 @@ jobs: ccache-win64-cross-msvc-develop-${{ github.event.inputs.commit_hash }} ccache-win64-cross-msvc - name: Restore steam SDK - uses: action/cache@v3 + uses: actions/cache@v3 with: path: depends/steam/steamworks_sdk_156.zip key: steam-sdk-156 From 48ffad2f7145cfe19613bc8e1dba2a04e4bd565e Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 26 Apr 2023 01:02:38 +0200 Subject: [PATCH 352/439] added and attributes to --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 4 ++++ library/lua/gui/widgets.lua | 9 +++++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index b85c738a5..80f2797b6 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -57,6 +57,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget - ``gui.ZScreenModal``: ZScreen subclass for modal dialogs +- ``widgets.CycleHotkeyLabel``: exposed `key_sep` and `val_gap` attributes for improved stylistic control. ## Removed - `title-version`: replaced by an `overlay` widget diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 9c320fc98..73538a5a3 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4912,12 +4912,16 @@ It has the following attributes: :key: The hotkey keycode to display, e.g. ``'CUSTOM_A'``. :key_back: Similar to ``key``, but will cycle backwards (optional) +:key_sep: If specified, will be used to customize how the activation key is + displayed. See ``token.key_sep`` in the ``Label`` documentation. :label: The string (or a function that returns a string) to display after the hotkey. :label_width: The number of spaces to allocate to the ``label`` (for use in aligning a column of ``CycleHotkeyLabel`` labels). :label_below: If ``true``, then the option value will apear below the label instead of to the right of it. Defaults to ``false``. +:val_gap: The size of the gap between the label text and the option value. + Default is ``1``. If set to ``0``, there'll be no gap between the strings. :options: A list of strings or tables of ``{label=string or fn, value=val[, pen=pen]}``. String options use the same string for the label and value and use the default pen. The optional ``pen`` diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index a778df639..c7cde698c 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1488,6 +1488,8 @@ CycleHotkeyLabel = defclass(CycleHotkeyLabel, Label) CycleHotkeyLabel.ATTRS{ key=DEFAULT_NIL, key_back=DEFAULT_NIL, + key_sep=': ', + val_gap=1, label=DEFAULT_NIL, label_width=DEFAULT_NIL, label_below=false, @@ -1499,17 +1501,16 @@ CycleHotkeyLabel.ATTRS{ function CycleHotkeyLabel:init() self:setOption(self.initial_option) - local val_gap = 1 if self.label_below then - val_gap = 0 + (self.key_back and 1 or 0) + (self.key and 3 or 0) + self.val_gap = 0 + (self.key_back and 1 or 0) + (self.key and 3 or 0) end self:setText{ self.key_back ~= nil and {key=self.key_back, key_sep='', width=0, on_activate=self:callback('cycle', true)} or {}, - {key=self.key, key_sep=': ', text=self.label, width=self.label_width, + {key=self.key, key_sep=self.key_sep, text=self.label, width=self.label_width, on_activate=self:callback('cycle')}, self.label_below and NEWLINE or '', - {gap=val_gap, text=self:callback('getOptionLabel'), + {gap=self.val_gap, text=self:callback('getOptionLabel'), pen=self:callback('getOptionPen')}, } end From 6e1300458cf4440d3c510fb7007d0925099a9e42 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 26 Apr 2023 01:26:38 +0200 Subject: [PATCH 353/439] fixed some wrong quotation marks in changelog.txt that made the build thingy cry --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 80f2797b6..91f25a323 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -57,7 +57,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget - ``gui.ZScreenModal``: ZScreen subclass for modal dialogs -- ``widgets.CycleHotkeyLabel``: exposed `key_sep` and `val_gap` attributes for improved stylistic control. +- ``widgets.CycleHotkeyLabel``: exposed "key_sep" and "val_gap" attributes for improved stylistic control. ## Removed - `title-version`: replaced by an `overlay` widget From ec659ca1c26bed0ee768421e29d49e3b4038b781 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 26 Apr 2023 11:26:29 +0200 Subject: [PATCH 354/439] added note about val_gap's behaviour when label_below == true --- docs/dev/Lua API.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 73538a5a3..37d85f7f6 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4922,6 +4922,7 @@ It has the following attributes: instead of to the right of it. Defaults to ``false``. :val_gap: The size of the gap between the label text and the option value. Default is ``1``. If set to ``0``, there'll be no gap between the strings. + Note that ``val_gap`` is ignored if ``label_below`` is set to ``true``. :options: A list of strings or tables of ``{label=string or fn, value=val[, pen=pen]}``. String options use the same string for the label and value and use the default pen. The optional ``pen`` From ba06a8f2bb1a41be61543755804999fc4fe48e33 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 26 Apr 2023 13:36:40 -0700 Subject: [PATCH 355/439] dump input vars in deploy output --- .github/workflows/steam.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index ca6802446..33aa16d34 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -48,6 +48,10 @@ jobs: steam_username: ${{ secrets.STEAM_SDK_USERNAME }} steam_password: ${{ secrets.STEAM_SDK_PASSWORD }} run: | + echo "commit: ${{ github.event.inputs.commit_hash }}" + echo "version: ${{ github.event.inputs.version }}" + echo "release_channel: ${{ github.event.inputs.release_channel }}" + echo cd build bash -x build-win64-from-linux.sh - name: Steam deploy From 9c447e8d45479c14d5a29113446c85360db70709 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 26 Apr 2023 14:39:13 -0700 Subject: [PATCH 356/439] re-add add-spatter plugin (minimal changes) --- docs/changelog.txt | 1 + docs/plugins/add-spatter.rst | 2 +- plugins/CMakeLists.txt | 2 +- plugins/add-spatter.cpp | 62 +++++++++++------------------------- 4 files changed, 21 insertions(+), 46 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 91f25a323..25391f081 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins +- `add-spatter`: allow mods to add poisons and magical effects to weapons ## Fixes - `autoclothing`: eliminate game lag when there are many inventory items in the fort diff --git a/docs/plugins/add-spatter.rst b/docs/plugins/add-spatter.rst index 6914690ea..2c43a88ef 100644 --- a/docs/plugins/add-spatter.rst +++ b/docs/plugins/add-spatter.rst @@ -2,7 +2,7 @@ add-spatter =========== .. dfhack-tool:: - :summary: Make tagged reactions produce contaminants. + :summary: Add poisons and magical effects to weapons. :tags: unavailable adventure fort gameplay items :no-command: diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 97216ad50..8aadd46f2 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -74,7 +74,7 @@ set_source_files_properties( Brushes.h PROPERTIES HEADER_FILE_ONLY TRUE ) # see instructions for adding "external" plugins at the end of this file. #dfhack_plugin(3dveins 3dveins.cpp) -#dfhack_plugin(add-spatter add-spatter.cpp) +dfhack_plugin(add-spatter add-spatter.cpp) dfhack_plugin(autobutcher autobutcher.cpp LINK_LIBRARIES lua) dfhack_plugin(autochop autochop.cpp LINK_LIBRARIES lua) dfhack_plugin(autoclothing autoclothing.cpp LINK_LIBRARIES lua) diff --git a/plugins/add-spatter.cpp b/plugins/add-spatter.cpp index 451fffabf..3cfefce39 100644 --- a/plugins/add-spatter.cpp +++ b/plugins/add-spatter.cpp @@ -1,51 +1,26 @@ -#include "Core.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "df/item_liquid_miscst.h" +#include "PluginManager.h" +#include "VTableInterpose.h" + +#include "modules/Items.h" +#include "modules/Units.h" + #include "df/item_constructed.h" -#include "df/builtin_mats.h" -#include "df/world.h" #include "df/job.h" #include "df/job_item.h" #include "df/job_item_ref.h" -#include "df/plotinfost.h" -#include "df/report.h" #include "df/reaction.h" #include "df/reaction_reagent_itemst.h" #include "df/reaction_product_item_improvementst.h" -#include "df/reaction_product_improvement_flags.h" -#include "df/matter_state.h" #include "df/spatter.h" -#include "MiscUtils.h" - using std::vector; using std::string; -using std::stack; + using namespace DFHack; using namespace df::enums; DFHACK_PLUGIN("add-spatter"); DFHACK_PLUGIN_IS_ENABLED(is_enabled); -REQUIRE_GLOBAL(gps); -REQUIRE_GLOBAL(world); -REQUIRE_GLOBAL(plotinfo); typedef df::reaction_product_item_improvementst improvement_product; @@ -397,18 +372,20 @@ static void enable_hooks(bool enable) INTERPOSE_HOOK(product_hook, produce).apply(enable); } +DFhackCExport command_result plugin_load_data (color_ostream &out) { + if (find_reactions(out)) { + out.print("Detected spatter add reactions - enabling plugin.\n"); + enable_hooks(true); + } + else + enable_hooks(false); + + return CR_OK; +} + DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) { switch (event) { - case SC_WORLD_LOADED: - if (find_reactions(out)) - { - out.print("Detected spatter add reactions - enabling plugin.\n"); - enable_hooks(true); - } - else - enable_hooks(false); - break; case SC_WORLD_UNLOADED: enable_hooks(false); reactions.clear(); @@ -423,9 +400,6 @@ DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_chan DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) { - if (Core::getInstance().isWorldLoaded()) - plugin_onstatechange(out, SC_WORLD_LOADED); - return CR_OK; } From fef7919c080d9d58783e2ab26237450b03fc24c5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 26 Apr 2023 16:19:26 -0700 Subject: [PATCH 357/439] bump version to 50.08-beta4 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index beb1f28d9..d6b5d2949 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.08b1") -set(DFHACK_RELEASE "beta3") +set(DFHACK_RELEASE "beta4") set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From 1b8fc20ad53fded507407fe0f0a52486d626b6f5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 26 Apr 2023 21:01:21 -0700 Subject: [PATCH 358/439] check items for accessibility for dialogs before we only checked when doing the cycle, so if an inaccessible item were manually selected, we'd never be able to build --- docs/changelog.txt | 1 + plugins/buildingplan/buildingplan.cpp | 2 +- plugins/buildingplan/buildingplan.h | 2 +- plugins/buildingplan/buildingplan_cycle.cpp | 42 ++++++++++----------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 91f25a323..66904aa6d 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,6 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes - `autoclothing`: eliminate game lag when there are many inventory items in the fort - `buildingplan`: fixed size limit calculations for rollers +- `buildingplan`: fixed items not being checked for accessibility in the filter and item selection dialogs - `dig-now`: properly detect and complete smoothing designations that have been converted into active jobs ## Misc Improvements diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index 05b2c0af6..ce424f9c6 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -704,7 +704,7 @@ static int scanAvailableItems(color_ostream &out, df::building_type type, int16_ filter.setMaterials(set()); special.clear(); } - if (itemPassesScreen(item) && matchesFilters(item, jitem, heat, filter, special)) { + if (itemPassesScreen(out, item) && matchesFilters(item, jitem, heat, filter, special)) { if (item_ids) item_ids->emplace_back(item->id); if (counts) { diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 5c4f25aa4..9bfd38731 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -54,7 +54,7 @@ void set_config_val(DFHack::PersistentDataItem &c, int index, int value); void set_config_bool(DFHack::PersistentDataItem &c, int index, bool value); std::vector getVectorIds(DFHack::color_ostream &out, const df::job_item *job_item, bool ignore_filters); -bool itemPassesScreen(df::item * item); +bool itemPassesScreen(DFHack::color_ostream& out, df::item* item); df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat); bool matchesFilters(df::item * item, const df::job_item * job_item, HeatSafety heat, const ItemFilter &item_filter, const std::set &special); bool isJobReady(DFHack::color_ostream &out, const std::vector &jitems); diff --git a/plugins/buildingplan/buildingplan_cycle.cpp b/plugins/buildingplan/buildingplan_cycle.cpp index 3213e741d..45cafe474 100644 --- a/plugins/buildingplan/buildingplan_cycle.cpp +++ b/plugins/buildingplan/buildingplan_cycle.cpp @@ -43,10 +43,27 @@ struct BadFlags { } }; -bool itemPassesScreen(df::item * item) { +// This is tricky. we want to choose an item that can be brought to the job site, but that's not +// necessarily the same as job->pos. it could be many tiles off in any direction (e.g. for bridges), or +// up or down (e.g. for stairs). For now, just return if the item is on a walkable tile. +static bool isAccessible(color_ostream& out, df::item* item) { + df::coord item_pos = Items::getPosition(item); + df::map_block* block = Maps::getTileBlock(item_pos); + bool is_walkable = false; + if (block) { + uint16_t walkability_group = index_tile(block->walkable, item_pos); + is_walkable = walkability_group != 0; + TRACE(cycle, out).print("item %d in walkability_group %u at (%d,%d,%d) is %saccessible from job site\n", + item->id, walkability_group, item_pos.x, item_pos.y, item_pos.z, is_walkable ? "(probably) " : "not "); + } + return is_walkable; +} + +bool itemPassesScreen(color_ostream& out, df::item* item) { static const BadFlags bad_flags; return !(item->flags.whole & bad_flags.whole) - && !item->isAssignedToStockpile(); + && !item->isAssignedToStockpile() + && isAccessible(out, item); } df::job_item getJobItemWithHeatSafety(const df::job_item *job_item, HeatSafety heat) { @@ -165,22 +182,6 @@ static df::building * popInvalidTasks(color_ostream &out, Bucket &task_queue, return NULL; } -// This is tricky. we want to choose an item that can be brought to the job site, but that's not -// necessarily the same as job->pos. it could be many tiles off in any direction (e.g. for bridges), or -// up or down (e.g. for stairs). For now, just return if the item is on a walkable tile. -static bool isAccessibleFrom(color_ostream &out, df::item *item, df::job *job) { - df::coord item_pos = Items::getPosition(item); - df::map_block *block = Maps::getTileBlock(item_pos); - bool is_walkable = false; - if (block) { - uint16_t walkability_group = index_tile(block->walkable, item_pos); - is_walkable = walkability_group != 0; - TRACE(cycle,out).print("item %d in walkability_group %u at (%d,%d,%d) is %saccessible from job site\n", - item->id, walkability_group, item_pos.x, item_pos.y, item_pos.z, is_walkable ? "" : "not "); - } - return is_walkable; -} - static void doVector(color_ostream &out, df::job_item_vector_id vector_id, map &buckets, unordered_map &planned_buildings, @@ -195,7 +196,7 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, item_it != item_vector.rend(); ++item_it) { auto item = *item_it; - if (!itemPassesScreen(item)) + if (!itemPassesScreen(out, item)) continue; for (auto bucket_it = buckets.begin(); bucket_it != buckets.end(); ) { TRACE(cycle,out).print("scanning bucket: %s/%s\n", @@ -218,8 +219,7 @@ static void doVector(color_ostream &out, df::job_item_vector_id vector_id, auto filter_idx = task.second; const int rev_filter_idx = num_filters - (filter_idx+1); auto &pb = planned_buildings.at(id); - if (isAccessibleFrom(out, item, job) - && matchesFilters(item, jitems[filter_idx], pb.heat_safety, + if (matchesFilters(item, jitems[filter_idx], pb.heat_safety, pb.item_filters[rev_filter_idx], pb.specials) && Job::attachJobItem(job, item, df::job_item_ref::Hauled, filter_idx)) From fab05ca887049b1755cca86726f740764ea25a5c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 27 Apr 2023 12:59:06 -0700 Subject: [PATCH 359/439] fix position of title overlay; force refresh on resize --- plugins/lua/overlay.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index cf7008a40..b1960989f 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -510,7 +510,7 @@ end local function _render_viewscreen_widgets(vs_name, dc) local vs_widgets = active_viewscreen_widgets[vs_name] - if not vs_widgets then return false end + if not vs_widgets then return end dc = dc or gui.Painter.new() for _,db_entry in pairs(vs_widgets) do local w = db_entry.widget @@ -518,11 +518,18 @@ local function _render_viewscreen_widgets(vs_name, dc) detect_frame_change(w, function() w:render(dc) end) end end + return dc end +local force_refresh + function render_viewscreen_widgets(vs_name) local dc = _render_viewscreen_widgets(vs_name, nil) _render_viewscreen_widgets('all', dc) + if force_refresh then + force_refresh = nil + df.global.gps.force_full_display_count = 1 + end end -- called when the DF window is resized @@ -531,6 +538,7 @@ function reposition_widgets() for _,db_entry in pairs(widget_db) do db_entry.widget:updateLayout(sr) end + force_refresh = true end -- ------------------------------------------------- -- @@ -568,7 +576,7 @@ end TitleVersionOverlay = defclass(TitleVersionOverlay, OverlayWidget) TitleVersionOverlay.ATTRS{ - default_pos={x=50, y=-2}, + default_pos={x=7, y=2}, default_enabled=true, viewscreens='title/Default', frame={w=35, h=3}, From ef140b0dd6d0a7437d5ed9f2cacb533c0bb7f484 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 27 Apr 2023 13:20:25 -0700 Subject: [PATCH 360/439] rename and enable plugin --- docs/plugins/{workNow.rst => work-now.rst} | 6 +++--- plugins/CMakeLists.txt | 2 +- plugins/{workNow.cpp => work-now.cpp} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename docs/plugins/{workNow.rst => work-now.rst} (90%) rename plugins/{workNow.cpp => work-now.cpp} (100%) diff --git a/docs/plugins/workNow.rst b/docs/plugins/work-now.rst similarity index 90% rename from docs/plugins/workNow.rst rename to docs/plugins/work-now.rst index cec39c667..7578500e8 100644 --- a/docs/plugins/workNow.rst +++ b/docs/plugins/work-now.rst @@ -1,9 +1,9 @@ -workNow -======= +work-now +======== .. dfhack-tool:: :summary: Reduce the time that dwarves idle after completing a job. - :tags: unavailable fort auto labors + :tags: fort auto jobs After finishing a job, dwarves will wander away for a while before picking up a new job. This plugin will automatically poke the game to assign dwarves to new diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 97216ad50..c9822ea8a 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -166,7 +166,7 @@ dfhack_plugin(tiletypes tiletypes.cpp Brushes.h LINK_LIBRARIES lua) #dfhack_plugin(tubefill tubefill.cpp) #add_subdirectory(tweak) #dfhack_plugin(workflow workflow.cpp LINK_LIBRARIES lua) -#dfhack_plugin(workNow workNow.cpp) +dfhack_plugin(work-now work-now.cpp) dfhack_plugin(xlsxreader xlsxreader.cpp LINK_LIBRARIES lua xlsxio_read_STATIC zip expat) #dfhack_plugin(zone zone.cpp) diff --git a/plugins/workNow.cpp b/plugins/work-now.cpp similarity index 100% rename from plugins/workNow.cpp rename to plugins/work-now.cpp From 83fa87b492edd50f1cc98159bae3d12c0fcd0342 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 27 Apr 2023 14:22:45 -0700 Subject: [PATCH 361/439] add work-now to the build --- .../init/dfhack.control-panel-system.init | 1 + docs/changelog.txt | 1 + docs/plugins/work-now.rst | 15 +-- plugins/work-now.cpp | 92 ++++++++----------- 4 files changed, 44 insertions(+), 65 deletions(-) diff --git a/data/dfhack-config/init/dfhack.control-panel-system.init b/data/dfhack-config/init/dfhack.control-panel-system.init index 8b1431373..c1ad6a679 100644 --- a/data/dfhack-config/init/dfhack.control-panel-system.init +++ b/data/dfhack-config/init/dfhack.control-panel-system.init @@ -2,3 +2,4 @@ # Please use gui/control-panel to edit this file enable faststart +enable work-now diff --git a/docs/changelog.txt b/docs/changelog.txt index 66904aa6d..a6d72d4ce 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins +- `work-now`: reduce the time that dwarves are left without a task after completing a job ## Fixes - `autoclothing`: eliminate game lag when there are many inventory items in the fort diff --git a/docs/plugins/work-now.rst b/docs/plugins/work-now.rst index 7578500e8..517378d56 100644 --- a/docs/plugins/work-now.rst +++ b/docs/plugins/work-now.rst @@ -6,17 +6,12 @@ work-now :tags: fort auto jobs After finishing a job, dwarves will wander away for a while before picking up a -new job. This plugin will automatically poke the game to assign dwarves to new -tasks. +new job. This plugin will automatically poke them to pick up a new task quicker. Usage ----- -``workNow`` - Print current plugin status. -``workNow 0`` - Stop monitoring and poking. -``workNow 1`` - Poke the game to assign dwarves to tasks whenever the game is paused. -``workNow 2`` - Poke the game to assign dwarves to tasks whenever a dwarf finishes a job. +:: + + enable work-now + work-now [status] diff --git a/plugins/work-now.cpp b/plugins/work-now.cpp index 2286fee7e..bce2d9a73 100644 --- a/plugins/work-now.cpp +++ b/plugins/work-now.cpp @@ -1,92 +1,74 @@ -#include "Core.h" -#include "Console.h" -#include "Export.h" +#include "Debug.h" #include "PluginManager.h" -#include "DataDefs.h" #include "modules/EventManager.h" -#include "modules/World.h" -#include "df/global_objects.h" - -#include - -using namespace std; +using std::string; +using std::vector; using namespace DFHack; -DFHACK_PLUGIN("workNow"); +DFHACK_PLUGIN("work-now"); +DFHACK_PLUGIN_IS_ENABLED(is_enabled); REQUIRE_GLOBAL(process_jobs); REQUIRE_GLOBAL(process_dig); -static int mode = 0; +namespace DFHack { + DBG_DECLARE(worknow, log, DebugCategory::LINFO); +} -DFhackCExport command_result workNow(color_ostream& out, vector& parameters); +DFhackCExport command_result work_now(color_ostream& out, vector& parameters); -void jobCompletedHandler(color_ostream& out, void* ptr); +static void jobCompletedHandler(color_ostream& out, void* ptr); EventManager::EventHandler handler(jobCompletedHandler,1); DFhackCExport command_result plugin_init(color_ostream& out, std::vector &commands) { - if (!process_jobs || !process_dig) - return CR_FAILURE; - commands.push_back(PluginCommand( - "workNow", + "work-now", "Reduce the time that dwarves idle after completing a job.", - workNow)); + work_now)); return CR_OK; } -DFhackCExport command_result plugin_shutdown ( color_ostream &out ) { - mode = 0; +DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) { + if (enable != is_enabled) + { + if (enable) + EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); + else + EventManager::unregister(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); + + is_enabled = enable; + } + return CR_OK; } +DFhackCExport command_result plugin_shutdown ( color_ostream &out ) { + return plugin_enable(out, false); +} + DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event e) { - if ( !mode ) - return CR_OK; - if ( e == DFHack::SC_WORLD_UNLOADED ) { - mode = 0; - return CR_OK; + if (e == SC_PAUSED) { + DEBUG(log,out).print("game paused; poking idlers\n"); + *process_jobs = true; + *process_dig = true; } - if ( e != DFHack::SC_PAUSED ) - return CR_OK; - - *process_jobs = true; - *process_dig = true; return CR_OK; } -DFhackCExport command_result workNow(color_ostream& out, vector& parameters) { - if ( parameters.size() == 0 ) { - out.print("workNow status = %d\n", mode); +DFhackCExport command_result work_now(color_ostream& out, vector& parameters) { + if (parameters.empty() || parameters[0] == "status") { + out.print("work_now is %sactively poking idle dwarves.\n", is_enabled ? "" : "not "); return CR_OK; } - if ( parameters.size() > 1 ) { - return CR_WRONG_USAGE; - } - int32_t a = atoi(parameters[0].c_str()); - - if (a < 0 || a > 2) - return CR_WRONG_USAGE; - if ( a == 2 && mode != 2 ) { - EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); - } else if ( mode == 2 && a != 2 ) { - EventManager::unregister(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); - } - - mode = a; - out.print("workNow status = %d\n", mode); - - return CR_OK; + return CR_WRONG_USAGE; } -void jobCompletedHandler(color_ostream& out, void* ptr) { - if ( mode < 2 ) - return; - +static void jobCompletedHandler(color_ostream& out, void* ptr) { + DEBUG(log,out).print("job completed; poking idlers\n"); *process_jobs = true; *process_dig = true; } From 3dafdf8f24d0ab9a5e3700ec41f0334548dc7e63 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 27 Apr 2023 14:29:50 -0700 Subject: [PATCH 362/439] absorb old sphinx anchor --- docs/plugins/work-now.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plugins/work-now.rst b/docs/plugins/work-now.rst index 517378d56..5eddf7c9f 100644 --- a/docs/plugins/work-now.rst +++ b/docs/plugins/work-now.rst @@ -1,3 +1,5 @@ +.. _worknow: + work-now ======== From 6b7c90b676ec51001a59da1388e3fa8e35ca52bf Mon Sep 17 00:00:00 2001 From: John Cosker Date: Thu, 27 Apr 2023 22:37:56 -0400 Subject: [PATCH 363/439] Working C++ and refactors --- plugins/design.cpp | 423 +++++++++++++++++------------------------ plugins/lua/design.lua | 12 +- 2 files changed, 186 insertions(+), 249 deletions(-) diff --git a/plugins/design.cpp b/plugins/design.cpp index 25f876d3e..88d40a630 100644 --- a/plugins/design.cpp +++ b/plugins/design.cpp @@ -11,6 +11,7 @@ #include "PluginManager.h" #include "df/graphic_viewportst.h" #include "df/world.h" +#include "modules/Gui.h" #include "modules/Persistence.h" #include "modules/Screen.h" #include "modules/World.h" @@ -49,8 +50,10 @@ DFhackCExport command_result plugin_init(color_ostream &out, DEBUG(status, out).print("initializing %s\n", plugin_name); // provide a configuration interface for the plugin - commands.push_back( - PluginCommand(plugin_name, "Designs stuff TBD", do_command)); + commands.push_back(PluginCommand( + plugin_name, + "Plugin to handle performance sensitive functions of gui/design", + do_command)); return CR_OK; } @@ -152,150 +155,77 @@ static command_result do_command(color_ostream &out, static int32_t do_cycle(color_ostream &out, bool force_designate) { return 0; } -// Assuming the existence of a class named Point, similar to the one in Lua -class Point { - public: - int x; - int y; +std::map PENS; - Point(int x, int y) : x(x), y(y) {} +struct DrawingPoint { + uint32_t penKey = 0; + std::pair cursor_coords; - bool operator==(const Point &other) const { - return x == other.x && y == other.y; - } + DrawingPoint() : penKey(0), cursor_coords({-1, -1}) {} }; -// Assuming the existence of a class named Color, similar to the one in Lua -class Color { - public: - // Define your color values here -}; +typedef std::map> ShapeMap; +ShapeMap arr; -// Assuming the existence of a class named Pen, similar to the one in Lua -class Pen { - public: - std::string ch; - int tile; - color_value fg; - // Define your pen properties and methods here +bool has_point(int x, int y) { + return arr.count(x) != 0 && arr.at(x).count(y) != 0; }; -class Design { - public: - std::map PENS; - - enum PEN_MASK { - NORTH = 0, - SOUTH, - EAST, - WEST, - DRAG_POINT, - MOUSEOVER, - INSHAPE, - EXTRA_POINT, - NUM_FLAGS - }; - - // Define the function similar to the Lua version - - uint32_t gen_pen_key(bool n, bool s, bool e, bool w, bool is_corner, - bool is_mouse_over, bool inshape, bool extra_point) { - std::bitset ret; - ret[NORTH] = n; - ret[SOUTH] = s; - ret[EAST] = e; - ret[WEST] = w; - ret[DRAG_POINT] = is_corner; - ret[MOUSEOVER] = is_mouse_over; - ret[INSHAPE] = inshape; - ret[EXTRA_POINT] = extra_point; - - return static_cast(ret.to_ulong()); - } - - Pen Design::get_pen(int x, int y, - const std::map> &arr); - // Define the function similar to the Lua version +// Key tuple is N, W, E, S +typedef std::tuple DirectionKey; +std::map> CURSORS_MAP = { + {{false, false, false, false}, {1, 2}}, // INSIDE + {{true, true, false, false}, {0, 1}}, // NW + {{true, false, false, false}, {1, 1}}, // NORTH + {{true, false, true, false}, {2, 1}}, // NE + {{false, true, false, false}, {0, 2}}, // WEST + {{false, false, true, false}, {2, 2}}, // EAST + {{false, true, false, true}, {0, 3}}, // SW + {{false, false, false, true}, {1, 3}}, // SOUTH + {{false, false, true, true}, {2, 3}}, // SE + {{true, true, true, false}, {3, 2}}, // N_NUB + {{true, false, true, true}, {5, 1}}, // E_NUB + {{true, true, false, true}, {3, 1}}, // W_NUB + {{false, true, true, true}, {4, 2}}, // S_NUB + {{false, true, true, false}, {3, 3}}, // VERT_NS + {{true, false, false, true}, {4, 1}}, // VERT_EW + {{true, true, true, true}, {4, 3}}, // POINT }; -Design design; - -// Add other methods and member variables needed for the class - -static int design_getPen(lua_State *L) { - std::map> arr; - if (lua_istable(L, -1)) { - // Iterate over the outer table - lua_pushnil(L); // First key - while (lua_next(L, -2) != 0) { - int x = lua_tointeger(L, -2); // Convert key to an integer - - if (lua_istable(L, -1)) { - // Iterate over the inner table - lua_pushnil(L); // First key - while (lua_next(L, -2) != 0) { - int y = lua_tointeger(L, -2); // Convert key to an integer - bool value = lua_toboolean(L, -1); - - if (value) { - if (arr.count(x) == 0) arr[x] = {}; - arr[x][y] = value; - } - lua_pop(L, 1); // Remove value, keep the key for the next iteration - } - } - lua_pop(L, 1); // Remove inner table, keep the key for the next iteration - } - } +enum PenMask { + North = 0, + South, + East, + West, + DragPoint, + MouseOver, + InShape, + ExtraPoint, + NumFlags +}; - for (auto x : arr) { - for (auto y : x.second) { - Screen::Pen cur_tile = Screen::readTile(x.first, y.first, true); - // cur_tile.tile = selected_tile_texpos; - Pen pen = design.get_pen(x.first, y.first, arr); - cur_tile.tile = pen.tile; - Screen::paintTile(cur_tile, x.first - *window_x, y.first - *window_y, - true); - } - } - return 0; +uint32_t gen_pen_key(bool n, bool s, bool e, bool w, bool is_drag_point, + bool is_mouse_over, bool inshape, bool extra_point) { + std::bitset(PenMask::NumFlags)> ret; + ret[PenMask::North] = n; + ret[PenMask::South] = s; + ret[PenMask::East] = e; + ret[PenMask::West] = w; + ret[PenMask::DragPoint] = is_drag_point; + ret[PenMask::MouseOver] = is_mouse_over; + ret[PenMask::InShape] = inshape; + ret[PenMask::ExtraPoint] = extra_point; + + return ret.to_ulong(); } -enum class CURSORS { - INSIDE, - NORTH, - N_NUB, - S_NUB, - W_NUB, - E_NUB, - NE, - NW, - WEST, - EAST, - SW, - SOUTH, - SE, - VERT_NS, - VERT_EW, - POINT -}; -std::map> CURSORS_MAP = { - {CURSORS::INSIDE, {1, 2}}, {CURSORS::NORTH, {1, 1}}, - {CURSORS::N_NUB, {3, 2}}, {CURSORS::S_NUB, {4, 2}}, - {CURSORS::W_NUB, {3, 1}}, {CURSORS::E_NUB, {5, 1}}, - {CURSORS::NE, {2, 1}}, {CURSORS::NW, {0, 1}}, - {CURSORS::WEST, {0, 2}}, {CURSORS::EAST, {2, 2}}, - {CURSORS::SW, {0, 3}}, {CURSORS::SOUTH, {1, 3}}, - {CURSORS::SE, {2, 3}}, {CURSORS::VERT_NS, {3, 3}}, - {CURSORS::VERT_EW, {4, 1}}, {CURSORS::POINT, {4, 3}}, -}; -Pen make_pen(const std::pair &direction, bool is_corner, - bool is_mouse_over, bool inshape, bool extra_point) { +Screen::Pen make_pen(const std::pair &direction, bool is_drag_point, + bool is_mouse_over, bool inshape, bool extra_point) { color_value color = COLOR_GREEN; int ycursor_mod = 0; if (!extra_point) { - if (is_corner) { + if (is_drag_point) { color = COLOR_CYAN; ycursor_mod += 6; if (is_mouse_over) { @@ -313,140 +243,141 @@ Pen make_pen(const std::pair &direction, bool is_corner, } } - Pen pen; - pen.ch = inshape ? "X" : "o"; + Screen::Pen pen; + pen.ch = inshape ? 'X' : 'o'; pen.fg = color; int selected_tile_texpos = 0; - Screen::findGraphicsTile("CURSORS", direction.first, direction.second, &selected_tile_texpos); + Screen::findGraphicsTile("CURSORS", direction.first, + direction.second + ycursor_mod, + &selected_tile_texpos); pen.tile = selected_tile_texpos; - // Assuming dfhack.screen.findGraphicsTile is replaced with a custom function - // findGraphicsTile pen.tile = findGraphicsTile("CURSORS", direction.first, - // direction.second + ycursor_mod); - return pen; } -Pen Design::get_pen(int x, int y, - const std::map> &arr) { - auto has_point = [&arr](int _x, int _y) { - return arr.count(_x) != 0 && arr.at(_x).count(_y) != 0 && arr.at(_x).at(_y); - }; - bool get_point = has_point(x, y); - - // Basic shapes are bounded by rectangles and therefore can have corner drag - // points even if they're not real points in the shape if (marks.size() >= - // shape.min_points && shape.basic_shape) { - // Point shape_top_left, shape_bot_right; - // shape.get_point_dims(shape_top_left, shape_bot_right); - - // if (x == shape_top_left.x && y == shape_top_left.y && - // shape.drag_corners.nw) { - // drag_point = true; - // } else if (x == shape_bot_right.x && y == shape_top_left.y && - // shape.drag_corners.ne) { - // drag_point = true; - // } else if (x == shape_top_left.x && y == shape_bot_right.y && - // shape.drag_corners.sw) { - // drag_point = true; - // } else if (x == shape_bot_right.x && y == shape_bot_right.y && - // shape.drag_corners.se) { - // drag_point = true; - // } - // } - - // for (const auto& mark : marks) { - // if (mark == Point(x, y)) { - // drag_point = true; - // } - // } - - // if (mirror_point && *mirror_point == Point(x, y)) { - // drag_point = true; - // } - - // // Check for an extra point - // bool extra_point = false; - // for (const auto& point : extra_points) { - // if (x == point.x && y == point.y) { - // extra_point = true; - // break; - // } - // } - - // // Show center point if both marks are set - // if ((shape.basic_shape && marks.size() == shape.max_points) || - // (!shape.basic_shape && !placing_mark.active && !marks.empty())) { - // int center_x, center_y; - // shape.get_center(center_x, center_y); - - // if (x == center_x && y == center_y) { - // extra_point = true; - // } - // } +Screen::Pen get_pen(int x, int y, ShapeMap &arr, const std::string &type = "") { bool n = false, w = false, e = false, s = false; - if (get_point) { + if (has_point(x, y)) { if (y == 0 || !has_point(x, y - 1)) n = true; if (x == 0 || !has_point(x - 1, y)) w = true; - if (!has_point(x + 1, y)) e = true; - if (!has_point(x, y + 1)) s = true; + if (!has_point(x + 1, y)) e = true; // TODO check map size + if (!has_point(x, y + 1)) s = true; // TODO check map size } - // DEBUG(status).print("jcosker %d %d %d %d\n", n, s, e, w); - // Get the bit field to use as a key for the PENS map - uint32_t pen_key = gen_pen_key(n, s, e, w, false, false, get_point, false); - // DEBUG(status).print("jcosker %zu\n", pen_key); + bool is_drag_point = type == "drag_point"; + bool is_extra = type == "extra_point"; + bool is_in_shape = has_point(x, y); + auto mouse_pos = Gui::getMousePos(); + bool mouse_over = mouse_pos.x == x && mouse_pos.y == y; + + uint32_t pen_key = + gen_pen_key(n, s, e, w, is_drag_point, mouse_over, is_in_shape, is_extra); + + if (CURSORS_MAP.count({n, w, e, s}) > 0 && has_point(x,y)) { + arr[x][y].cursor_coords = CURSORS_MAP.at({n, w, e, s}); + } if (PENS.find(pen_key) == PENS.end()) { std::pair cursor{-1, -1}; - // int cursor = -1; // Assuming -1 is an invalid cursor value - - // Determine the cursor to use based on the input parameters - // The CURSORS enum or equivalent should be defined in your code - if (get_point && !n && !w && !e && !s) - cursor = CURSORS_MAP.at(CURSORS::INSIDE); - else if (get_point && n && w && !e && !s) - cursor = CURSORS_MAP.at(CURSORS::NW); - else if (get_point && n && !w && !e && !s) - cursor = CURSORS_MAP.at(CURSORS::NORTH); - else if (get_point && n && e && !w && !s) - cursor = CURSORS_MAP.at(CURSORS::NE); - else if (get_point && !n && w && !e && !s) - cursor = CURSORS_MAP.at(CURSORS::WEST); - else if (get_point && !n && !w && e && !s) - cursor = CURSORS_MAP.at(CURSORS::EAST); - else if (get_point && !n && w && !e && s) - cursor = CURSORS_MAP.at(CURSORS::SW); - else if (get_point && !n && !w && !e && s) - cursor = CURSORS_MAP.at(CURSORS::SOUTH); - else if (get_point && !n && !w && e && s) - cursor = CURSORS_MAP.at(CURSORS::SE); - else if (get_point && n && w && e && !s) - cursor = CURSORS_MAP.at(CURSORS::N_NUB); - else if (get_point && n && !w && e && s) - cursor = CURSORS_MAP.at(CURSORS::E_NUB); - else if (get_point && n && w && !e && s) - cursor = CURSORS_MAP.at(CURSORS::W_NUB); - else if (get_point && !n && w && e && s) - cursor = CURSORS_MAP.at(CURSORS::S_NUB); - else if (get_point && !n && w && e && !s) - cursor = CURSORS_MAP.at(CURSORS::VERT_NS); - else if (get_point && n && !w && !e && s) - cursor = CURSORS_MAP.at(CURSORS::VERT_EW); - else if (get_point && n && w && e && s) - cursor = CURSORS_MAP.at(CURSORS::POINT); - // else if (drag_point && !get_point) cursor = CURSORS::INSIDE; - // else if (extra_point) cursor = CURSORS::INSIDE; - // Create the pen if the cursor is set - - DEBUG(status).print("jcosker %d, %d\n", cursor.first, cursor.second); - if (cursor.first != -1) { - PENS[pen_key] = make_pen(cursor, false, false, get_point, false); + + if (type != "") { + return make_pen(CURSORS_MAP.at({n, w, e, s}), is_drag_point, mouse_over, + is_in_shape, is_extra); + } + + if (CURSORS_MAP.count({n, w, e, s}) > 0) { + PENS.emplace(pen_key, + make_pen(CURSORS_MAP.at({n, w, e, s}), is_drag_point, + mouse_over, is_in_shape, is_extra)); + if (type == "" && has_point(x,y)) { + arr[x][y].penKey = pen_key; + } } } - // Return the pen for the caller + // DEBUG(status).print("not cached lmao\n"); return PENS.at(pen_key); } -DFHACK_PLUGIN_LUA_COMMANDS{DFHACK_LUA_COMMAND(design_getPen), DFHACK_LUA_END}; +static int design_load_shape(lua_State *L) { + if (lua_istable(L, -1)) { + lua_pushnil(L); + while (lua_next(L, -2) != 0) { + int x = lua_tointeger(L, -2); + + if (lua_istable(L, -1)) { + lua_pushnil(L); + while (lua_next(L, -2) != 0) { + int y = lua_tointeger(L, -2); + bool value = lua_toboolean(L, -1); + + if (value) { + arr[x][y] = DrawingPoint(); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + } + } + + return 0; +} + +static int design_clear_shape(lua_State *L) { + arr.clear(); + + return 0; +} + +static int design_draw_shape(lua_State *L) { + if (arr.size() == 0) { + design_load_shape(L); + } + + for (auto x : arr) { + for (auto y : x.second) { + Screen::Pen cur_tile = Screen::readTile(x.first, y.first, true); + Screen::Pen pen = get_pen(x.first, y.first, arr); + cur_tile.tile = pen.tile; + Screen::paintTile(cur_tile, x.first - *window_x, y.first - *window_y, + true); + } + } + + return 0; +} + +static int design_draw_points(lua_State *L) { + if (lua_istable(L, -1)) { + const char *str; + lua_rawgeti(L, -1, 2); + str = lua_tostring(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 1); + int n = luaL_len(L, -1); + for (int i = 1; i <= n; i++) { + lua_rawgeti(L, -1, i); + int x, y; + lua_getfield(L, -1, "y"); + y = lua_tointeger(L, -1); + lua_getfield(L, -2, "x"); + x = lua_tointeger(L, -1); + lua_pop(L, 3); + + Screen::Pen cur_tile = Screen::readTile(x, y, true); + Screen::Pen pen = get_pen(x, y, arr, str); + cur_tile.tile = pen.tile; + Screen::paintTile(cur_tile, x - *window_x, y - *window_y, true); + } + lua_pop(L, 1); + } + + return 0; +} + +DFHACK_PLUGIN_LUA_COMMANDS{DFHACK_LUA_COMMAND(design_draw_shape), + DFHACK_LUA_COMMAND(design_draw_points), + DFHACK_LUA_COMMAND(design_clear_shape), + DFHACK_LUA_END}; diff --git a/plugins/lua/design.lua b/plugins/lua/design.lua index fe916aa41..eb9dd3d9a 100644 --- a/plugins/lua/design.lua +++ b/plugins/lua/design.lua @@ -1,9 +1,15 @@ local _ENV = mkmodule('plugins.design') -view2 = {design_window = { name = "hello"}} +function draw_shape(arr) + design_draw_shape(arr) +end + +function draw_points(points_obj) + design_draw_points(points_obj) +end -function getPen(hi) - design_getPen(hi) +function clear_shape(arr) + design_clear_shape(arr) end return _ENV From f61d25bdebc3ee2b93eaf78d0e2102139a3bf907 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 29 Apr 2023 18:46:13 -0700 Subject: [PATCH 364/439] bump to 50.08-r1 --- CMakeLists.txt | 6 +++--- library/xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d6b5d2949..4228f45cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,9 +191,9 @@ if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl endif() # set up versioning. -set(DF_VERSION "50.08b1") -set(DFHACK_RELEASE "beta4") -set(DFHACK_PRERELEASE TRUE) +set(DF_VERSION "50.08") +set(DFHACK_RELEASE "r1") +set(DFHACK_PRERELEASE FALSE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/library/xml b/library/xml index 98d5f8a55..113f5e40b 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 98d5f8a5553690ef71b9650b28d4aababf21ef5e +Subproject commit 113f5e40b471c67b5414380f477d1c7be9b635ee From 923f84b2f296c6a6f4fa00af37766b05fe3485e8 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 29 Apr 2023 18:58:34 -0700 Subject: [PATCH 365/439] bump to 50.08-r1 --- docs/changelog.txt | 20 ++++++++++++++++---- library/xml | 2 +- scripts | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 66904aa6d..e3ec3ca40 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -35,6 +35,22 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins +## Fixes + +## Misc Improvements + +## Documentation + +## API + +## Lua + +## Removed + +# 50.08-r1 + +## New Plugins + ## Fixes - `autoclothing`: eliminate game lag when there are many inventory items in the fort - `buildingplan`: fixed size limit calculations for rollers @@ -51,10 +67,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - ``Dwarf Therapist``: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you're starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it's not running). - `overlay`: add the DFHack version string to the DF title screen -## Documentation - -## API - ## Lua - ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget - ``gui.ZScreenModal``: ZScreen subclass for modal dialogs diff --git a/library/xml b/library/xml index 113f5e40b..6a620feac 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 113f5e40b471c67b5414380f477d1c7be9b635ee +Subproject commit 6a620feacc85224742d8a97f633c9106ff7d81e8 diff --git a/scripts b/scripts index ad1998a00..70788484b 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit ad1998a0032ce50e90d05429a4178b668c0840ba +Subproject commit 70788484b4cf797aa71e5c6737cb77838407a677 From ffa9f79f941e1e58f591f9d45d715e7114c40a50 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 29 Apr 2023 22:30:42 -0700 Subject: [PATCH 366/439] rightsize ccache, protect steam sdk from eviction --- .github/workflows/build.yml | 8 ++++++++ .github/workflows/steam.yml | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f03d8b3b0..39be29f9c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,6 +72,12 @@ jobs: # - name: Download DF # run: | # sh ci/download-df.sh + - name: Restore steam SDK + uses: actions/cache@v3 + with: + path: depends/steam + key: steam-sdk-156 + enableCrossOsArchive: true - name: Configure DFHack env: CC: gcc-${{ matrix.gcc }} @@ -94,6 +100,8 @@ jobs: - name: Build DFHack run: | ninja -C build-ci install + ccache --max-size 100M + ccache --cleanup ccache --show-stats - name: Run cpp unit tests id: run_tests_cpp diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 33aa16d34..4c275e032 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -14,8 +14,8 @@ on: release_channel: description: Release channel type: string - required: false - default: beta + required: true + default: staging jobs: deploy-to-steam: @@ -34,12 +34,12 @@ jobs: path: build/win64-cross/ccache key: ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} restore-keys: | - ccache-win64-cross-msvc-develop-${{ github.event.inputs.commit_hash }} + ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} ccache-win64-cross-msvc - name: Restore steam SDK uses: actions/cache@v3 with: - path: depends/steam/steamworks_sdk_156.zip + path: depends/steam key: steam-sdk-156 enableCrossOsArchive: true - name: Cross-compile win64 artifacts From b69aff4d6eed64fe244255c7134ca65b54a3047a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 29 Apr 2023 23:19:02 -0700 Subject: [PATCH 367/439] reduce cache for msvc builds too; remove ruby --- .github/workflows/build.yml | 18 ++++-------------- .github/workflows/steam.yml | 3 +++ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39be29f9c..034c8c7cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -100,7 +100,7 @@ jobs: - name: Build DFHack run: | ninja -C build-ci install - ccache --max-size 100M + ccache --max-size 200M ccache --cleanup ccache --show-stats - name: Run cpp unit tests @@ -155,6 +155,9 @@ jobs: run: | cd build bash -x build-win64-from-linux.sh + ccache -d build/win64-cross/ccache --max-size 200M + ccache -d build/win64-cross/ccache --cleanup + ccache -d build/win64-cross/ccache --show-stats - name: Format artifact name id: artifactname run: | @@ -182,11 +185,6 @@ jobs: - name: Build docs run: | sphinx-build -W --keep-going -j auto --color . docs/html - - name: Upload docs - uses: actions/upload-artifact@v1 - with: - name: docs - path: docs/html lint: runs-on: ubuntu-22.04 @@ -195,10 +193,6 @@ jobs: uses: actions/setup-python@v4 with: python-version: 3 - - name: Set up Ruby 2.7 - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.7 - name: Install Lua run: | sudo apt-get update @@ -223,10 +217,6 @@ jobs: if: success() || failure() run: | python ci/script-syntax.py --ext=lua --cmd="luac5.3 -p" --github-actions - - name: Check Ruby syntax - if: success() || failure() - run: | - python ci/script-syntax.py --ext=rb --cmd="ruby -c" --github-actions check-pr: runs-on: ubuntu-latest diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 4c275e032..057ba3fd5 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -54,6 +54,9 @@ jobs: echo cd build bash -x build-win64-from-linux.sh + ccache -d build/win64-cross/ccache --max-size 200M + ccache -d build/win64-cross/ccache --cleanup + ccache -d build/win64-cross/ccache --show-stats - name: Steam deploy uses: game-ci/steam-deploy@v2 with: From 17a423bcd2eaae7c823e94e94da295597e32824d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 29 Apr 2023 23:31:44 -0700 Subject: [PATCH 368/439] ensure msvc builds have ccache --- .github/workflows/build.yml | 4 ++++ .github/workflows/steam.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 034c8c7cf..a8495cf8a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -136,6 +136,10 @@ jobs: name: Build MSVC win64 runs-on: ubuntu-22.04 steps: + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install ccache - name: Clone DFHack uses: actions/checkout@v3 with: diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 057ba3fd5..dda9b1618 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -22,6 +22,10 @@ jobs: name: Deploy to Steam runs-on: ubuntu-22.04 steps: + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install ccache - name: Clone DFHack uses: actions/checkout@v3 with: From 7aa5692fef32fa88dff776f801db90cb091d7db8 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 29 Apr 2023 23:46:06 -0700 Subject: [PATCH 369/439] reduce linux ccache size; fix msvc ccache path --- .github/workflows/build.yml | 8 ++++---- .github/workflows/steam.yml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a8495cf8a..131c21743 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -100,7 +100,7 @@ jobs: - name: Build DFHack run: | ninja -C build-ci install - ccache --max-size 200M + ccache --max-size 50M ccache --cleanup ccache --show-stats - name: Run cpp unit tests @@ -159,9 +159,9 @@ jobs: run: | cd build bash -x build-win64-from-linux.sh - ccache -d build/win64-cross/ccache --max-size 200M - ccache -d build/win64-cross/ccache --cleanup - ccache -d build/win64-cross/ccache --show-stats + ccache -d win64-cross/ccache --max-size 200M + ccache -d win64-cross/ccache --cleanup + ccache -d win64-cross/ccache --show-stats - name: Format artifact name id: artifactname run: | diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index dda9b1618..5210b3a11 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -58,9 +58,9 @@ jobs: echo cd build bash -x build-win64-from-linux.sh - ccache -d build/win64-cross/ccache --max-size 200M - ccache -d build/win64-cross/ccache --cleanup - ccache -d build/win64-cross/ccache --show-stats + ccache -d win64-cross/ccache --max-size 200M + ccache -d win64-cross/ccache --cleanup + ccache -d win64-cross/ccache --show-stats - name: Steam deploy uses: game-ci/steam-deploy@v2 with: From cfcb1cd937fc2f513ffde0a81ab2357bce517cb5 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Sun, 30 Apr 2023 10:18:15 +0200 Subject: [PATCH 370/439] make val_sep useful if label_below == true --- docs/dev/Lua API.rst | 4 ++-- library/lua/gui/widgets.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 37d85f7f6..8ebb752c9 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4918,11 +4918,11 @@ It has the following attributes: hotkey. :label_width: The number of spaces to allocate to the ``label`` (for use in aligning a column of ``CycleHotkeyLabel`` labels). -:label_below: If ``true``, then the option value will apear below the label +:label_below: If ``true``, then the option value will appear below the label instead of to the right of it. Defaults to ``false``. :val_gap: The size of the gap between the label text and the option value. Default is ``1``. If set to ``0``, there'll be no gap between the strings. - Note that ``val_gap`` is ignored if ``label_below`` is set to ``true``. + If ``label_below`` == ``true``, negative values will shift the value leftwards. :options: A list of strings or tables of ``{label=string or fn, value=val[, pen=pen]}``. String options use the same string for the label and value and use the default pen. The optional ``pen`` diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index c7cde698c..210b71f7b 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1502,7 +1502,7 @@ function CycleHotkeyLabel:init() self:setOption(self.initial_option) if self.label_below then - self.val_gap = 0 + (self.key_back and 1 or 0) + (self.key and 3 or 0) + self.val_gap = self.val_gap + (self.key_back and 1 or 0) + (self.key and 2 or 0) end self:setText{ From 0d6c5869f49f7cdec4443c0754c6fdc45e27182b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 30 Apr 2023 16:40:03 -0700 Subject: [PATCH 371/439] fix logo disappearing when hovered on title screen --- docs/changelog.txt | 1 + plugins/lua/overlay.lua | 25 +++++++++++++------------ plugins/overlay.cpp | 3 ++- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index e3ec3ca40..d0855dbc8 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- `hotkeys`: DFHack logo no longer disappears when hovered on the title screen ## Misc Improvements diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index b1960989f..84c2b4f96 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -447,7 +447,7 @@ function update_hotspot_widgets() end end -local function matches_focus_strings(db_entry, vs_name) +local function matches_focus_strings(db_entry, vs_name, vs) if not db_entry.focus_strings then return true end local matched = true local simple_vs_name = simplify_viewscreen_name(vs_name) @@ -465,9 +465,10 @@ end local function _update_viewscreen_widgets(vs_name, vs, now_ms) local vs_widgets = active_viewscreen_widgets[vs_name] if not vs_widgets then return end + local is_all = vs_name == 'all' now_ms = now_ms or dfhack.getTickCount() for name,db_entry in pairs(vs_widgets) do - if matches_focus_strings(db_entry, vs_name) and + if (is_all or matches_focus_strings(db_entry, vs_name, vs)) and do_update(name, db_entry, now_ms, vs) then return end @@ -483,12 +484,12 @@ function update_viewscreen_widgets(vs_name, vs) end end -local function _feed_viewscreen_widgets(vs_name, keys) +local function _feed_viewscreen_widgets(vs_name, vs, keys) local vs_widgets = active_viewscreen_widgets[vs_name] if not vs_widgets then return false end for _,db_entry in pairs(vs_widgets) do local w = db_entry.widget - if matches_focus_strings(db_entry, vs_name) and + if (not vs or matches_focus_strings(db_entry, vs_name, vs)) and detect_frame_change(w, function() return w:onInput(keys) end) then return true end @@ -496,9 +497,9 @@ local function _feed_viewscreen_widgets(vs_name, keys) return false end -function feed_viewscreen_widgets(vs_name, keys) - if not _feed_viewscreen_widgets(vs_name, keys) and - not _feed_viewscreen_widgets('all', keys) then +function feed_viewscreen_widgets(vs_name, vs, keys) + if not _feed_viewscreen_widgets(vs_name, vs, keys) and + not _feed_viewscreen_widgets('all', nil, keys) then return false end gui.markMouseClicksHandled(keys) @@ -508,13 +509,13 @@ function feed_viewscreen_widgets(vs_name, keys) return true end -local function _render_viewscreen_widgets(vs_name, dc) +local function _render_viewscreen_widgets(vs_name, vs, dc) local vs_widgets = active_viewscreen_widgets[vs_name] if not vs_widgets then return end dc = dc or gui.Painter.new() for _,db_entry in pairs(vs_widgets) do local w = db_entry.widget - if matches_focus_strings(db_entry, vs_name) then + if not vs or matches_focus_strings(db_entry, vs_name, vs) then detect_frame_change(w, function() w:render(dc) end) end end @@ -523,9 +524,9 @@ end local force_refresh -function render_viewscreen_widgets(vs_name) - local dc = _render_viewscreen_widgets(vs_name, nil) - _render_viewscreen_widgets('all', dc) +function render_viewscreen_widgets(vs_name, vs) + local dc = _render_viewscreen_widgets(vs_name, vs, nil) + _render_viewscreen_widgets('all', nil, dc) if force_refresh then force_refresh = nil df.global.gps.force_full_display_count = 1 diff --git a/plugins/overlay.cpp b/plugins/overlay.cpp index 8e27c8308..c02c960ba 100644 --- a/plugins/overlay.cpp +++ b/plugins/overlay.cpp @@ -72,9 +72,10 @@ struct viewscreen_overlay : T { bool input_is_handled = false; // don't send input to the overlays if there is a modal dialog up if (!world->status.popups.size()) - call_overlay_lua(NULL, "feed_viewscreen_widgets", 2, 1, + call_overlay_lua(NULL, "feed_viewscreen_widgets", 3, 1, [&](lua_State *L) { Lua::Push(L, T::_identity.getName()); + Lua::Push(L, this); Lua::PushInterfaceKeys(L, *input); }, [&](lua_State *L) { input_is_handled = lua_toboolean(L, -1); From 3f51f24f9161ecc3417b52acc6244822e9f0a44b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 30 Apr 2023 17:12:43 -0700 Subject: [PATCH 372/439] fix errors when dragging a scrollbar and the mouse leaves the window --- library/lua/gui/widgets.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index c7cde698c..7eeb00f1f 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -836,7 +836,9 @@ function Scrollbar:update(top_elem, elems_per_page, num_elems) end local function scrollbar_do_drag(scrollbar) - local _,y = scrollbar.frame_body:localXY(dfhack.screen.getMousePos()) + local x,y = dfhack.screen.getMousePos() + if not y then return end + x,y = scrollbar.frame_body:localXY(x, y) local cur_pos = y - scrollbar.is_dragging local max_top = scrollbar.num_elems - scrollbar.elems_per_page + 1 local max_pos = scrollbar_get_max_pos_and_height(scrollbar) From 528dc466e2d2f6e8114282c7d23eb2e0090a66e1 Mon Sep 17 00:00:00 2001 From: John Cosker Date: Mon, 1 May 2023 14:20:53 -0400 Subject: [PATCH 373/439] address review comments --- plugins/CMakeLists.txt | 2 +- plugins/design.cpp | 122 ++--------------------------------------- plugins/lua/design.lua | 12 ---- 3 files changed, 6 insertions(+), 130 deletions(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index c880a89ff..943bc311c 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -77,8 +77,8 @@ set_source_files_properties( Brushes.h PROPERTIES HEADER_FILE_ONLY TRUE ) #dfhack_plugin(add-spatter add-spatter.cpp) dfhack_plugin(autobutcher autobutcher.cpp LINK_LIBRARIES lua) dfhack_plugin(autochop autochop.cpp LINK_LIBRARIES lua) +dfhack_plugin(autoclothing autoclothing.cpp LINK_LIBRARIES lua) dfhack_plugin(design design.cpp LINK_LIBRARIES lua) -dfhack_plugin(autoclothing autoclothing.cpp) dfhack_plugin(autodump autodump.cpp) dfhack_plugin(autofarm autofarm.cpp) #dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_static) diff --git a/plugins/design.cpp b/plugins/design.cpp index 88d40a630..1abd61842 100644 --- a/plugins/design.cpp +++ b/plugins/design.cpp @@ -30,131 +30,19 @@ using namespace df::enums; enum ConfigValues { CONFIG_IS_ENABLED = 0, }; -namespace DFHack { -// // for configuration-related logging -DBG_DECLARE(design, status, DebugCategory::LDEBUG); -// for logging during the periodic scan -DBG_DECLARE(design, cycle, DebugCategory::LDEBUG); -} // namespace DFHack -static const std::string CONFIG_KEY = std::string(plugin_name) + "/config"; -static PersistentDataItem config; -static const int32_t CYCLE_TICKS = 1200; -static int32_t cycle_timestamp = 0; // world->frame_counter at last cycle - -static command_result do_command(color_ostream &out, - std::vector ¶meters); -static int32_t do_cycle(color_ostream &out, bool force_designate = false); - -DFhackCExport command_result plugin_init(color_ostream &out, - std::vector &commands) { - DEBUG(status, out).print("initializing %s\n", plugin_name); - - // provide a configuration interface for the plugin - commands.push_back(PluginCommand( - plugin_name, - "Plugin to handle performance sensitive functions of gui/design", - do_command)); - - return CR_OK; -} -static int get_config_val(PersistentDataItem &c, int index) { - if (!c.isValid()) return -1; - return c.ival(index); -} - -static bool get_config_bool(PersistentDataItem &c, int index) { - return get_config_val(c, index) == 1; -} - -static void set_config_val(PersistentDataItem &c, int index, int value) { - if (c.isValid()) c.ival(index) = value; +namespace DFHack { + DBG_DECLARE(pathable, log, DebugCategory::LINFO); } -static void set_config_bool(PersistentDataItem &c, int index, bool value) { - set_config_val(c, index, value ? 1 : 0); -} - -DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) { - if (!Core::getInstance().isWorldLoaded()) { - out.printerr("Cannot enable %s without a loaded world.\n", plugin_name); - - return CR_FAILURE; - } - - if (enable != is_enabled) { - is_enabled = enable; - DEBUG(status, out) - .print("%s from the API; persisting\n", - is_enabled ? "enabled" : "disabled"); - set_config_bool(config, CONFIG_IS_ENABLED, is_enabled); - if (enable) do_cycle(out, true); - } else { - DEBUG(status, out) - .print("%s from the API, but already %s; no action\n", - is_enabled ? "enabled" : "disabled", - is_enabled ? "enabled" : "disabled"); - } - return CR_OK; +DFhackCExport command_result plugin_init(color_ostream &out, std::vector &commands) { + return CR_OK; } DFhackCExport command_result plugin_shutdown(color_ostream &out) { - DEBUG(status, out).print("shutting down %s\n", plugin_name); - - return CR_OK; + return CR_OK; } -DFhackCExport command_result plugin_load_data(color_ostream &out) { - cycle_timestamp = 0; - config = World::GetPersistentData(CONFIG_KEY); - - if (!config.isValid()) { - DEBUG(status, out).print("no config found in this save; initializing\n"); - config = World::AddPersistentData(CONFIG_KEY); - set_config_bool(config, CONFIG_IS_ENABLED, is_enabled); - } - - // we have to copy our enabled flag into the global plugin variable, but - // all the other state we can directly read/modify from the persistent - // data structure. - is_enabled = get_config_bool(config, CONFIG_IS_ENABLED); - DEBUG(status, out) - .print("loading persisted enabled state: %s\n", - is_enabled ? "true" : "false"); - - return CR_OK; -} - -DFhackCExport command_result plugin_onstatechange(color_ostream &out, - state_change_event event) { - if (event == DFHack::SC_WORLD_UNLOADED) { - if (is_enabled) { - DEBUG(status, out).print("world unloaded; disabling %s\n", plugin_name); - is_enabled = false; - } - } - - return CR_OK; -} - -DFhackCExport command_result plugin_onupdate(color_ostream &out) { - if (is_enabled && world->frame_counter - cycle_timestamp >= CYCLE_TICKS) { - int32_t ret = do_cycle(out); - } - - return CR_OK; -} -int selected_tile_texpos = 0; -const static bool hi = - Screen::findGraphicsTile("CURSORS", 4, 3, &selected_tile_texpos); - -static command_result do_command(color_ostream &out, - std::vector ¶meters) { - return CR_OK; -} - -static int32_t do_cycle(color_ostream &out, bool force_designate) { return 0; } - std::map PENS; struct DrawingPoint { diff --git a/plugins/lua/design.lua b/plugins/lua/design.lua index eb9dd3d9a..ec3b4c79b 100644 --- a/plugins/lua/design.lua +++ b/plugins/lua/design.lua @@ -1,15 +1,3 @@ local _ENV = mkmodule('plugins.design') -function draw_shape(arr) - design_draw_shape(arr) -end - -function draw_points(points_obj) - design_draw_points(points_obj) -end - -function clear_shape(arr) - design_clear_shape(arr) -end - return _ENV From 0eb04f1b73d61752245a4113d89183840c55cfa2 Mon Sep 17 00:00:00 2001 From: John Cosker Date: Mon, 1 May 2023 14:32:09 -0400 Subject: [PATCH 374/439] changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 66904aa6d..e1e45f799 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -50,6 +50,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/control-panel`: add preference option for hiding "armok" tools in command lists - ``Dwarf Therapist``: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you're starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it's not running). - `overlay`: add the DFHack version string to the DF title screen +- `gui/design`: Improved performance for drawing shapes ## Documentation From ef0c8950bd60818b5fa807609f95fc330cc5e8c0 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Tue, 2 May 2023 16:46:46 +0200 Subject: [PATCH 375/439] renamed val_gap to option_gap, updated docs/changelog --- docs/changelog.txt | 2 +- docs/dev/Lua API.rst | 2 +- library/lua/gui/widgets.lua | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index e3ec3ca40..792d09167 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -70,7 +70,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget - ``gui.ZScreenModal``: ZScreen subclass for modal dialogs -- ``widgets.CycleHotkeyLabel``: exposed "key_sep" and "val_gap" attributes for improved stylistic control. +- ``widgets.CycleHotkeyLabel``: exposed "key_sep" and "option_gap" attributes for improved stylistic control. ## Removed - `title-version`: replaced by an `overlay` widget diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 8ebb752c9..85e51d11d 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4920,7 +4920,7 @@ It has the following attributes: aligning a column of ``CycleHotkeyLabel`` labels). :label_below: If ``true``, then the option value will appear below the label instead of to the right of it. Defaults to ``false``. -:val_gap: The size of the gap between the label text and the option value. +:option_gap: The size of the gap between the label text and the option value. Default is ``1``. If set to ``0``, there'll be no gap between the strings. If ``label_below`` == ``true``, negative values will shift the value leftwards. :options: A list of strings or tables of diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 2e1732f11..7aa79cbc3 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1491,7 +1491,7 @@ CycleHotkeyLabel.ATTRS{ key=DEFAULT_NIL, key_back=DEFAULT_NIL, key_sep=': ', - val_gap=1, + option_gap=1, label=DEFAULT_NIL, label_width=DEFAULT_NIL, label_below=false, @@ -1504,7 +1504,7 @@ function CycleHotkeyLabel:init() self:setOption(self.initial_option) if self.label_below then - self.val_gap = self.val_gap + (self.key_back and 1 or 0) + (self.key and 2 or 0) + self.option_gap = self.option_gap + (self.key_back and 1 or 0) + (self.key and 2 or 0) end self:setText{ @@ -1512,7 +1512,7 @@ function CycleHotkeyLabel:init() {key=self.key, key_sep=self.key_sep, text=self.label, width=self.label_width, on_activate=self:callback('cycle')}, self.label_below and NEWLINE or '', - {gap=self.val_gap, text=self:callback('getOptionLabel'), + {gap=self.option_gap, text=self:callback('getOptionLabel'), pen=self:callback('getOptionPen')}, } end From c1a0d1ad8665acbbe87538518545b635050c1b54 Mon Sep 17 00:00:00 2001 From: Myk Date: Tue, 2 May 2023 09:55:35 -0700 Subject: [PATCH 376/439] Update changelog.txt --- docs/changelog.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index d0855dbc8..e3ec3ca40 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,7 +36,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes -- `hotkeys`: DFHack logo no longer disappears when hovered on the title screen ## Misc Improvements From d21a6c6432b14a12070387db1f2ca4c2003efba7 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 2 May 2023 14:34:45 -0700 Subject: [PATCH 377/439] update symbols for 50.08 itch and classic --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 6a620feac..22d9bc0bc 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 6a620feacc85224742d8a97f633c9106ff7d81e8 +Subproject commit 22d9bc0bc1847def8a6c62893104f36262e63e98 From 8b6d20ae9e8e25feed9c851bcb68e041aaf84ece Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 3 May 2023 07:14:37 +0000 Subject: [PATCH 378/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 70788484b..8c0624942 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 70788484b4cf797aa71e5c6737cb77838407a677 +Subproject commit 8c0624942ed11b369be805b2c0b5bc5ffd14f13d From bebf3584badfd753ed7f9ad5dd70dcf604ee9d94 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 2 May 2023 21:06:46 -0700 Subject: [PATCH 379/439] maybe fix terminal in foreground issue --- docs/changelog.txt | 1 + library/Console-windows.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 2b800fc42..924adbd31 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,6 +40,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements +- Terminal console no longer appears in front of the game window on startup ## Documentation diff --git a/library/Console-windows.cpp b/library/Console-windows.cpp index 515d89911..dd8ce9d84 100644 --- a/library/Console-windows.cpp +++ b/library/Console-windows.cpp @@ -508,6 +508,7 @@ bool Console::init(bool) inited = true; // DOESN'T WORK - locks up DF! // ForceForegroundWindow(d->MainWindow); + SetForegroundWindow(d->MainWindow); return true; } // FIXME: looks awfully empty, doesn't it? @@ -608,6 +609,7 @@ void Console::msleep (unsigned int msec) bool Console::hide() { ShowWindow( GetConsoleWindow(), SW_HIDE ); + SetForegroundWindow(d->MainWindow); return true; } From ad5a0d41f5c4a56d955032c1e456527fe93bb5cc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 3 May 2023 14:34:48 -0700 Subject: [PATCH 380/439] only show the terminal if requested --- library/Console-windows.cpp | 3 +-- library/Core.cpp | 10 +++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/library/Console-windows.cpp b/library/Console-windows.cpp index dd8ce9d84..20d943b18 100644 --- a/library/Console-windows.cpp +++ b/library/Console-windows.cpp @@ -508,7 +508,7 @@ bool Console::init(bool) inited = true; // DOESN'T WORK - locks up DF! // ForceForegroundWindow(d->MainWindow); - SetForegroundWindow(d->MainWindow); + hide(); return true; } // FIXME: looks awfully empty, doesn't it? @@ -609,7 +609,6 @@ void Console::msleep (unsigned int msec) bool Console::hide() { ShowWindow( GetConsoleWindow(), SW_HIDE ); - SetForegroundWindow(d->MainWindow); return true; } diff --git a/library/Core.cpp b/library/Core.cpp index f1bb28925..9ff6976d5 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -1304,10 +1304,6 @@ static void run_dfhack_init(color_ostream &out, Core *core) return; } - // if we're running on Steam Deck, hide the terminal by default - if (DFSteam::DFIsSteamRunningOnSteamDeck()) - core->getConsole().hide(); - // load baseline defaults core->loadScriptFile(out, CONFIG_PATH + "init/default.dfhack.init", false); @@ -1315,13 +1311,13 @@ static void run_dfhack_init(color_ostream &out, Core *core) std::vector prefixes(1, "dfhack"); loadScriptFiles(core, out, prefixes, CONFIG_PATH + "init"); - // if the option is set, hide the terminal + // show the terminal if requested auto L = Lua::Core::State; Lua::StackUnwinder top(L); Lua::CallLuaModuleFunction(out, L, "dfhack", "getHideConsoleOnStartup", 0, 1, Lua::DEFAULT_LUA_LAMBDA, [&](lua_State* L) { - if (lua_toboolean(L, -1)) - core->getConsole().hide(); + if (!lua_toboolean(L, -1)) + core->getConsole().show(); }, false); } From 8f5c454b398e2c12e223ca083a90444ad0ed5d63 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 3 May 2023 15:52:01 -0700 Subject: [PATCH 381/439] add focus strings for new_region --- library/modules/Gui.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/library/modules/Gui.cpp b/library/modules/Gui.cpp index 44642b5fa..d03bcce09 100644 --- a/library/modules/Gui.cpp +++ b/library/modules/Gui.cpp @@ -84,6 +84,7 @@ using namespace DFHack; #include "df/unit.h" #include "df/unit_inventory_item.h" #include "df/viewscreen_dwarfmodest.h" +#include "df/viewscreen_new_regionst.h" #include "df/viewscreen_titlest.h" #include "df/world.h" @@ -156,6 +157,19 @@ DEFINE_GET_FOCUS_STRING_HANDLER(title) focusStrings.push_back(baseFocus + "/Default"); } +DEFINE_GET_FOCUS_STRING_HANDLER(new_region) +{ + if (screen->doing_mods) + focusStrings.push_back(baseFocus + "/Mods"); + else if (screen->doing_simple_params) + focusStrings.push_back(baseFocus + "/Basic"); + else if (screen->doing_params) + focusStrings.push_back(baseFocus + "/Advanced"); + + if (focusStrings.empty()) + focusStrings.push_back(baseFocus); +} + DEFINE_GET_FOCUS_STRING_HANDLER(dwarfmode) { std::string newFocusString; From 58e11b01cba07e3721ea1dc795b3f9258354bfc0 Mon Sep 17 00:00:00 2001 From: John Cosker Date: Wed, 3 May 2023 19:37:44 -0400 Subject: [PATCH 382/439] Comments --- docs/changelog.txt | 1 + plugins/design.cpp | 313 ++++++++++++++++++++++----------------------- 2 files changed, 157 insertions(+), 157 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index a7ce7c25f..0a37bb3b9 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -41,6 +41,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - Terminal console no longer appears in front of the game window on startup +- `gui/design`: Improved performance for drawing shapes ## Documentation diff --git a/plugins/design.cpp b/plugins/design.cpp index 1abd61842..37ee32cbd 100644 --- a/plugins/design.cpp +++ b/plugins/design.cpp @@ -17,7 +17,6 @@ #include "modules/World.h" DFHACK_PLUGIN("design"); -DFHACK_PLUGIN_IS_ENABLED(is_enabled); using DFHack::color_value; REQUIRE_GLOBAL(window_x); @@ -27,36 +26,37 @@ REQUIRE_GLOBAL(plotinfo); using namespace DFHack; using namespace df::enums; -enum ConfigValues { - CONFIG_IS_ENABLED = 0, -}; - namespace DFHack { - DBG_DECLARE(pathable, log, DebugCategory::LINFO); +DBG_DECLARE(design, log, DebugCategory::LINFO); } -DFhackCExport command_result plugin_init(color_ostream &out, std::vector &commands) { +DFhackCExport command_result plugin_init(color_ostream &out, + std::vector &commands) { return CR_OK; } -DFhackCExport command_result plugin_shutdown(color_ostream &out) { +std::map PENS; + +DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) { + if (event == DFHack::SC_WORLD_UNLOADED) { + DEBUG(log,out).print("clearing PENS\n"); + PENS.clear(); + } return CR_OK; } -std::map PENS; - struct DrawingPoint { - uint32_t penKey = 0; - std::pair cursor_coords; + uint32_t penKey = 0; + std::pair cursor_coords; - DrawingPoint() : penKey(0), cursor_coords({-1, -1}) {} + DrawingPoint() : penKey(0), cursor_coords({-1, -1}) {} }; typedef std::map> ShapeMap; ShapeMap arr; bool has_point(int x, int y) { - return arr.count(x) != 0 && arr.at(x).count(y) != 0; + return arr.count(x) != 0 && arr.at(x).count(y) != 0; }; // Key tuple is N, W, E, S @@ -81,188 +81,187 @@ std::map> CURSORS_MAP = { }; enum PenMask { - North = 0, - South, - East, - West, - DragPoint, - MouseOver, - InShape, - ExtraPoint, - NumFlags + North = 0, + South, + East, + West, + DragPoint, + MouseOver, + InShape, + ExtraPoint, + NumFlags }; uint32_t gen_pen_key(bool n, bool s, bool e, bool w, bool is_drag_point, bool is_mouse_over, bool inshape, bool extra_point) { - std::bitset(PenMask::NumFlags)> ret; - ret[PenMask::North] = n; - ret[PenMask::South] = s; - ret[PenMask::East] = e; - ret[PenMask::West] = w; - ret[PenMask::DragPoint] = is_drag_point; - ret[PenMask::MouseOver] = is_mouse_over; - ret[PenMask::InShape] = inshape; - ret[PenMask::ExtraPoint] = extra_point; - - return ret.to_ulong(); + std::bitset(PenMask::NumFlags)> ret; + ret[PenMask::North] = n; + ret[PenMask::South] = s; + ret[PenMask::East] = e; + ret[PenMask::West] = w; + ret[PenMask::DragPoint] = is_drag_point; + ret[PenMask::MouseOver] = is_mouse_over; + ret[PenMask::InShape] = inshape; + ret[PenMask::ExtraPoint] = extra_point; + + return ret.to_ulong(); } Screen::Pen make_pen(const std::pair &direction, bool is_drag_point, bool is_mouse_over, bool inshape, bool extra_point) { - color_value color = COLOR_GREEN; - int ycursor_mod = 0; - - if (!extra_point) { - if (is_drag_point) { - color = COLOR_CYAN; - ycursor_mod += 6; - if (is_mouse_over) { - color = COLOR_MAGENTA; - ycursor_mod += 3; - } - } - } else { - ycursor_mod += 15; - color = COLOR_LIGHTRED; + color_value color = COLOR_GREEN; + int ycursor_mod = 0; + + if (!extra_point) { + if (is_drag_point) { + color = COLOR_CYAN; + ycursor_mod += 6; + if (is_mouse_over) { + color = COLOR_MAGENTA; + ycursor_mod += 3; + } + } + } else { + ycursor_mod += 15; + color = COLOR_LIGHTRED; - if (is_mouse_over) { - color = COLOR_RED; - ycursor_mod += 3; + if (is_mouse_over) { + color = COLOR_RED; + ycursor_mod += 3; + } } - } - - Screen::Pen pen; - pen.ch = inshape ? 'X' : 'o'; - pen.fg = color; - int selected_tile_texpos = 0; - Screen::findGraphicsTile("CURSORS", direction.first, - direction.second + ycursor_mod, - &selected_tile_texpos); - pen.tile = selected_tile_texpos; - - return pen; + + Screen::Pen pen; + pen.ch = inshape ? 'X' : 'o'; + pen.fg = color; + int selected_tile_texpos = 0; + Screen::findGraphicsTile("CURSORS", direction.first, + direction.second + ycursor_mod, + &selected_tile_texpos); + pen.tile = selected_tile_texpos; + + return pen; } Screen::Pen get_pen(int x, int y, ShapeMap &arr, const std::string &type = "") { - bool n = false, w = false, e = false, s = false; - if (has_point(x, y)) { - if (y == 0 || !has_point(x, y - 1)) n = true; - if (x == 0 || !has_point(x - 1, y)) w = true; - if (!has_point(x + 1, y)) e = true; // TODO check map size - if (!has_point(x, y + 1)) s = true; // TODO check map size - } - - bool is_drag_point = type == "drag_point"; - bool is_extra = type == "extra_point"; - bool is_in_shape = has_point(x, y); - auto mouse_pos = Gui::getMousePos(); - bool mouse_over = mouse_pos.x == x && mouse_pos.y == y; - - uint32_t pen_key = - gen_pen_key(n, s, e, w, is_drag_point, mouse_over, is_in_shape, is_extra); - - if (CURSORS_MAP.count({n, w, e, s}) > 0 && has_point(x,y)) { - arr[x][y].cursor_coords = CURSORS_MAP.at({n, w, e, s}); - } - - if (PENS.find(pen_key) == PENS.end()) { - std::pair cursor{-1, -1}; - - if (type != "") { - return make_pen(CURSORS_MAP.at({n, w, e, s}), is_drag_point, mouse_over, - is_in_shape, is_extra); + bool n = false, w = false, e = false, s = false; + if (has_point(x, y)) { + if (y == 0 || !has_point(x, y - 1)) n = true; + if (x == 0 || !has_point(x - 1, y)) w = true; + if (!has_point(x + 1, y)) e = true; // TODO check map size + if (!has_point(x, y + 1)) s = true; // TODO check map size + } + + bool is_drag_point = type == "drag_point"; + bool is_extra = type == "extra_point"; + bool is_in_shape = has_point(x, y); + auto mouse_pos = Gui::getMousePos(); + bool mouse_over = mouse_pos.x == x && mouse_pos.y == y; + + uint32_t pen_key = gen_pen_key(n, s, e, w, is_drag_point, mouse_over, + is_in_shape, is_extra); + + if (CURSORS_MAP.count({n, w, e, s}) > 0 && has_point(x, y)) { + arr[x][y].cursor_coords = CURSORS_MAP.at({n, w, e, s}); } - if (CURSORS_MAP.count({n, w, e, s}) > 0) { - PENS.emplace(pen_key, - make_pen(CURSORS_MAP.at({n, w, e, s}), is_drag_point, - mouse_over, is_in_shape, is_extra)); - if (type == "" && has_point(x,y)) { - arr[x][y].penKey = pen_key; - } + if (PENS.find(pen_key) == PENS.end()) { + std::pair cursor{-1, -1}; + + if (type != "") { + return make_pen(CURSORS_MAP.at({n, w, e, s}), is_drag_point, + mouse_over, is_in_shape, is_extra); + } + + if (CURSORS_MAP.count({n, w, e, s}) > 0) { + PENS.emplace(pen_key, + make_pen(CURSORS_MAP.at({n, w, e, s}), is_drag_point, + mouse_over, is_in_shape, is_extra)); + if (type == "" && has_point(x, y)) { + arr[x][y].penKey = pen_key; + } + } } - } - // DEBUG(status).print("not cached lmao\n"); - return PENS.at(pen_key); + return PENS.at(pen_key); } static int design_load_shape(lua_State *L) { - if (lua_istable(L, -1)) { - lua_pushnil(L); - while (lua_next(L, -2) != 0) { - int x = lua_tointeger(L, -2); - - if (lua_istable(L, -1)) { + if (lua_istable(L, -1)) { lua_pushnil(L); while (lua_next(L, -2) != 0) { - int y = lua_tointeger(L, -2); - bool value = lua_toboolean(L, -1); - - if (value) { - arr[x][y] = DrawingPoint(); - } - lua_pop(L, 1); + int x = lua_tointeger(L, -2); + + if (lua_istable(L, -1)) { + lua_pushnil(L); + while (lua_next(L, -2) != 0) { + int y = lua_tointeger(L, -2); + bool value = lua_toboolean(L, -1); + + if (value) { + arr[x][y] = DrawingPoint(); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); } - } - lua_pop(L, 1); } - } - return 0; + return 0; } static int design_clear_shape(lua_State *L) { - arr.clear(); + arr.clear(); - return 0; + return 0; } static int design_draw_shape(lua_State *L) { - if (arr.size() == 0) { - design_load_shape(L); - } - - for (auto x : arr) { - for (auto y : x.second) { - Screen::Pen cur_tile = Screen::readTile(x.first, y.first, true); - Screen::Pen pen = get_pen(x.first, y.first, arr); - cur_tile.tile = pen.tile; - Screen::paintTile(cur_tile, x.first - *window_x, y.first - *window_y, - true); + if (arr.size() == 0) { + design_load_shape(L); + } + + for (auto x : arr) { + for (auto y : x.second) { + Screen::Pen cur_tile = Screen::readTile(x.first, y.first, true); + Screen::Pen pen = get_pen(x.first, y.first, arr); + cur_tile.tile = pen.tile; + Screen::paintTile(cur_tile, x.first - *window_x, + y.first - *window_y, true); + } } - } - return 0; + return 0; } static int design_draw_points(lua_State *L) { - if (lua_istable(L, -1)) { - const char *str; - lua_rawgeti(L, -1, 2); - str = lua_tostring(L, -1); - lua_pop(L, 1); - - lua_rawgeti(L, -1, 1); - int n = luaL_len(L, -1); - for (int i = 1; i <= n; i++) { - lua_rawgeti(L, -1, i); - int x, y; - lua_getfield(L, -1, "y"); - y = lua_tointeger(L, -1); - lua_getfield(L, -2, "x"); - x = lua_tointeger(L, -1); - lua_pop(L, 3); - - Screen::Pen cur_tile = Screen::readTile(x, y, true); - Screen::Pen pen = get_pen(x, y, arr, str); - cur_tile.tile = pen.tile; - Screen::paintTile(cur_tile, x - *window_x, y - *window_y, true); + if (lua_istable(L, -1)) { + const char *str; + lua_rawgeti(L, -1, 2); + str = lua_tostring(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 1); + int n = luaL_len(L, -1); + for (int i = 1; i <= n; i++) { + lua_rawgeti(L, -1, i); + int x, y; + lua_getfield(L, -1, "y"); + y = lua_tointeger(L, -1); + lua_getfield(L, -2, "x"); + x = lua_tointeger(L, -1); + lua_pop(L, 3); + + Screen::Pen cur_tile = Screen::readTile(x, y, true); + Screen::Pen pen = get_pen(x, y, arr, str); + cur_tile.tile = pen.tile; + Screen::paintTile(cur_tile, x - *window_x, y - *window_y, true); + } + lua_pop(L, 1); } - lua_pop(L, 1); - } - return 0; + return 0; } DFHACK_PLUGIN_LUA_COMMANDS{DFHACK_LUA_COMMAND(design_draw_shape), From aa0721edee40396c3aa11ec933f3beacdb85bc3d Mon Sep 17 00:00:00 2001 From: John Cosker Date: Wed, 3 May 2023 20:01:17 -0400 Subject: [PATCH 383/439] Changelog --- docs/changelog.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 0a37bb3b9..f6524dc58 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -68,7 +68,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/control-panel`: add preference option for hiding "armok" tools in command lists - ``Dwarf Therapist``: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you're starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it's not running). - `overlay`: add the DFHack version string to the DF title screen -- `gui/design`: Improved performance for drawing shapes ## Lua - ``widgets.RangeSlider``: new mouse-controlled two-headed slider widget From 07c8f035c7c133da150edeccead7dc4bc3dcda2b Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 4 May 2023 07:14:05 +0000 Subject: [PATCH 384/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 8c0624942..43a74b6c8 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 8c0624942ed11b369be805b2c0b5bc5ffd14f13d +Subproject commit 43a74b6c8679807a24028d56c1b157b28af59e73 From bfb6f3aa2eb1ed4834758f5506658955f9490579 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 5 May 2023 07:13:16 +0000 Subject: [PATCH 385/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 43a74b6c8..54bd83727 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 43a74b6c8679807a24028d56c1b157b28af59e73 +Subproject commit 54bd83727df5f7048f5a7251b99ada1930e18ad9 From e664f4aa7b06e1bf78283773c0b1f7dc4cc61674 Mon Sep 17 00:00:00 2001 From: lethosor Date: Tue, 9 May 2023 21:56:07 -0400 Subject: [PATCH 386/439] CMake: fix find_package(Python) when inactive pyenv Python installations are present `find_package(Python)`'s default behavior is to attempt to use any `python3.x` executables it finds before `python3`. This is problematic when using tools such as pyenv, where `python3.x` executables may be present in a user's PATH but not be functional. Setting the `Python_FIND_UNVERSIONED_NAMES` hint to `FIRST` causes `python3` to be attempted first, if it exists. Note that this option was introduced in CMake 3.20: https://cmake.org/cmake/help/latest/module/FindPython.html#hints --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4228f45cd..6d1d4c562 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -376,6 +376,9 @@ endif() #### expose depends #### +# fix for pyenv: default to `python3` before `python3.x` +set(Python_FIND_UNVERSIONED_NAMES FIRST) + if(UNIX) # Rescan for pthread and zlib if the build arch changed if(NOT "${DFHACK_BUILD_ARCH}" STREQUAL "${DFHACK_BUILD_ARCH_PREV}") From cb2db50a649ee737ea0f79c4e355cb2ec6e7c5bf Mon Sep 17 00:00:00 2001 From: lethosor Date: Tue, 9 May 2023 22:13:49 -0400 Subject: [PATCH 387/439] Re-enable build of several plugins Likely to still work, and were probably just disabled due to v50 changes: - changeitem - createitem - deramp - flows - lair and a couple that don't access DF data at all: - luasocket - title-folder --- plugins/CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 1967c370a..43b949d60 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -90,7 +90,7 @@ dfhack_plugin(blueprint blueprint.cpp LINK_LIBRARIES lua) #dfhack_plugin(burrows burrows.cpp LINK_LIBRARIES lua) #dfhack_plugin(building-hacks building-hacks.cpp LINK_LIBRARIES lua) add_subdirectory(buildingplan) -#dfhack_plugin(changeitem changeitem.cpp) +dfhack_plugin(changeitem changeitem.cpp) dfhack_plugin(changelayer changelayer.cpp) dfhack_plugin(changevein changevein.cpp) add_subdirectory(channel-safely) @@ -98,10 +98,10 @@ dfhack_plugin(cleanconst cleanconst.cpp) dfhack_plugin(cleaners cleaners.cpp) dfhack_plugin(cleanowned cleanowned.cpp) dfhack_plugin(confirm confirm.cpp LINK_LIBRARIES lua) -#dfhack_plugin(createitem createitem.cpp) +dfhack_plugin(createitem createitem.cpp) dfhack_plugin(cursecheck cursecheck.cpp) dfhack_plugin(cxxrandom cxxrandom.cpp LINK_LIBRARIES lua) -#dfhack_plugin(deramp deramp.cpp) +dfhack_plugin(deramp deramp.cpp) dfhack_plugin(debug debug.cpp LINK_LIBRARIES jsoncpp_static) dfhack_plugin(dig dig.cpp) dfhack_plugin(dig-now dig-now.cpp LINK_LIBRARIES lua) @@ -117,7 +117,7 @@ dfhack_plugin(faststart faststart.cpp) dfhack_plugin(filltraffic filltraffic.cpp) #dfhack_plugin(fix-unit-occupancy fix-unit-occupancy.cpp) #dfhack_plugin(fixveins fixveins.cpp) -#dfhack_plugin(flows flows.cpp) +dfhack_plugin(flows flows.cpp) #dfhack_plugin(follow follow.cpp) #dfhack_plugin(forceequip forceequip.cpp) #dfhack_plugin(generated-creature-renamer generated-creature-renamer.cpp) @@ -126,9 +126,9 @@ dfhack_plugin(hotkeys hotkeys.cpp LINK_LIBRARIES lua) #dfhack_plugin(infiniteSky infiniteSky.cpp) #dfhack_plugin(isoworldremote isoworldremote.cpp PROTOBUFS isoworldremote) #dfhack_plugin(jobutils jobutils.cpp) -#dfhack_plugin(lair lair.cpp) +dfhack_plugin(lair lair.cpp) dfhack_plugin(liquids liquids.cpp Brushes.h LINK_LIBRARIES lua) -#dfhack_plugin(luasocket luasocket.cpp LINK_LIBRARIES clsocket lua dfhack-tinythread) +dfhack_plugin(luasocket luasocket.cpp LINK_LIBRARIES clsocket lua dfhack-tinythread) #dfhack_plugin(manipulator manipulator.cpp) #dfhack_plugin(map-render map-render.cpp LINK_LIBRARIES lua) dfhack_plugin(misery misery.cpp LINK_LIBRARIES lua) @@ -162,7 +162,7 @@ add_subdirectory(stockpiles) dfhack_plugin(strangemood strangemood.cpp) dfhack_plugin(tailor tailor.cpp LINK_LIBRARIES lua) dfhack_plugin(tiletypes tiletypes.cpp Brushes.h LINK_LIBRARIES lua) -#dfhack_plugin(title-folder title-folder.cpp) +dfhack_plugin(title-folder title-folder.cpp) #dfhack_plugin(trackstop trackstop.cpp) #dfhack_plugin(tubefill tubefill.cpp) #add_subdirectory(tweak) From f9a946190d56ac5f64c8d740b53367b95fbca8ca Mon Sep 17 00:00:00 2001 From: lethosor Date: Wed, 10 May 2023 23:31:00 -0400 Subject: [PATCH 388/439] Disable building title-folder again Hangs when enabled in dfhack.init, at least under wine --- plugins/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 43b949d60..3ae78d320 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -162,7 +162,7 @@ add_subdirectory(stockpiles) dfhack_plugin(strangemood strangemood.cpp) dfhack_plugin(tailor tailor.cpp LINK_LIBRARIES lua) dfhack_plugin(tiletypes tiletypes.cpp Brushes.h LINK_LIBRARIES lua) -dfhack_plugin(title-folder title-folder.cpp) +#dfhack_plugin(title-folder title-folder.cpp) #dfhack_plugin(trackstop trackstop.cpp) #dfhack_plugin(tubefill tubefill.cpp) #add_subdirectory(tweak) From 94e56bf4c74e46f8b6d50c9ea051255f8308d59e Mon Sep 17 00:00:00 2001 From: lethosor Date: Wed, 10 May 2023 23:49:02 -0400 Subject: [PATCH 389/439] Update changelog and docs for readded plugins Also mark reinstated plugins in the changelog, including for previous v50 releases --- docs/changelog.txt | 14 ++++++++++---- docs/plugins/changeitem.rst | 4 ++-- docs/plugins/createitem.rst | 2 +- docs/plugins/deramp.rst | 2 +- docs/plugins/flows.rst | 2 +- docs/plugins/lair.rst | 2 +- docs/plugins/luasocket.rst | 2 +- 7 files changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index f6524dc58..fc706cdba 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,8 +34,14 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins -- `add-spatter`: allow mods to add poisons and magical effects to weapons -- `work-now`: reduce the time that dwarves are left without a task after completing a job +- `add-spatter`: reinstated: allow mods to add poisons and magical effects to weapons +- `changeitem`: reinstated: change item material, quality, and subtype +- `createitem`: reinstated: create arbitrary items, from the command line +- `deramp`: reinstated: removes all ramps designated for removal from the map +- `flows`: reinstated: counts map blocks with flowing liquids +- `lair`: reinstated: mark the map as a monster lair (this avoids item scatter when the fortress is abandoned) +- `luasocket`: reinstated: provides a Lua API for accessing network sockets +- `work-now`: reinstated, renamed from ``workNow``: reduce the time that dwarves are left without a task after completing a job ## Fixes @@ -112,8 +118,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # 50.07-beta2 ## New Plugins -- `getplants`: designate trees for chopping and shrubs for gathering according to type -- `prospector`: get stone, ore, gem, and other tile property counts in fort mode. +- `getplants`: reinstated: designate trees for chopping and shrubs for gathering according to type +- `prospector`: reinstated: get stone, ore, gem, and other tile property counts in fort mode. ## Fixes -@ `buildingplan`: filters are now properly applied to planned stairs diff --git a/docs/plugins/changeitem.rst b/docs/plugins/changeitem.rst index 788b49247..f452f6a74 100644 --- a/docs/plugins/changeitem.rst +++ b/docs/plugins/changeitem.rst @@ -2,8 +2,8 @@ changeitem ========== .. dfhack-tool:: - :summary: Change item material or base quality. - :tags: unavailable adventure fort armok items + :summary: Change item material, quality, and subtype. + :tags: adventure fort armok items By default, a change is only allowed if the existing and desired item materials are of the same subtype (for example wood -> wood, stone -> stone, etc). But diff --git a/docs/plugins/createitem.rst b/docs/plugins/createitem.rst index b287042c7..b29e41521 100644 --- a/docs/plugins/createitem.rst +++ b/docs/plugins/createitem.rst @@ -3,7 +3,7 @@ createitem .. dfhack-tool:: :summary: Create arbitrary items. - :tags: unavailable adventure fort armok items + :tags: adventure fort armok items You can create new items of any type and made of any material. A unit must be selected in-game to use this command. By default, items created are spawned at diff --git a/docs/plugins/deramp.rst b/docs/plugins/deramp.rst index 4a1f34548..fdc0f7619 100644 --- a/docs/plugins/deramp.rst +++ b/docs/plugins/deramp.rst @@ -3,7 +3,7 @@ deramp .. dfhack-tool:: :summary: Removes all ramps designated for removal from the map. - :tags: unavailable fort armok map + :tags: fort armok map It also removes any "floating" down ramps that can remain after a cave-in. diff --git a/docs/plugins/flows.rst b/docs/plugins/flows.rst index 56840d999..bbb2c6661 100644 --- a/docs/plugins/flows.rst +++ b/docs/plugins/flows.rst @@ -3,7 +3,7 @@ flows .. dfhack-tool:: :summary: Counts map blocks with flowing liquids. - :tags: unavailable fort inspection map + :tags: fort inspection map If you suspect that your magma sea leaks into HFS, you can use this tool to be sure without revealing the map. diff --git a/docs/plugins/lair.rst b/docs/plugins/lair.rst index 82c5e211c..9bded57ab 100644 --- a/docs/plugins/lair.rst +++ b/docs/plugins/lair.rst @@ -3,7 +3,7 @@ lair .. dfhack-tool:: :summary: Mark the map as a monster lair. - :tags: unavailable fort armok map + :tags: fort armok map This avoids item scatter when the fortress is abandoned. diff --git a/docs/plugins/luasocket.rst b/docs/plugins/luasocket.rst index 1aa320ed7..4b5b18540 100644 --- a/docs/plugins/luasocket.rst +++ b/docs/plugins/luasocket.rst @@ -3,7 +3,7 @@ luasocket .. dfhack-tool:: :summary: Provides a Lua API for accessing network sockets. - :tags: unavailable dev + :tags: dev :no-command: See `luasocket-api` for details. From b6723e4fdbd0a72d766d12d8322ca240632d0ba4 Mon Sep 17 00:00:00 2001 From: lethosor Date: Thu, 11 May 2023 00:26:19 -0400 Subject: [PATCH 390/439] Remove "unavailable" tag from add-spatter and channel-safely docs These plugins are currently being built --- docs/plugins/add-spatter.rst | 2 +- docs/plugins/channel-safely.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins/add-spatter.rst b/docs/plugins/add-spatter.rst index 2c43a88ef..e8a39f781 100644 --- a/docs/plugins/add-spatter.rst +++ b/docs/plugins/add-spatter.rst @@ -3,7 +3,7 @@ add-spatter .. dfhack-tool:: :summary: Add poisons and magical effects to weapons. - :tags: unavailable adventure fort gameplay items + :tags: adventure fort gameplay items :no-command: Give some use to all those poisons that can be bought from caravans! The plugin diff --git a/docs/plugins/channel-safely.rst b/docs/plugins/channel-safely.rst index c24f352b0..c5dbc37f6 100644 --- a/docs/plugins/channel-safely.rst +++ b/docs/plugins/channel-safely.rst @@ -3,7 +3,7 @@ channel-safely .. dfhack-tool:: :summary: Auto-manage channel designations to keep dwarves safe. - :tags: unavailable fort auto + :tags: fort auto Multi-level channel projects can be dangerous, and managing the safety of your dwarves throughout the completion of such projects can be difficult and time From 1a703c344f810ec289a42dddba9add8277c5ff75 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 15 May 2023 17:33:57 -0700 Subject: [PATCH 391/439] support disabling DFHack with --disable-dfhack --- docs/Core.rst | 19 ++++++++++++++++++- docs/changelog.txt | 1 + library/Core.cpp | 30 +++++++++++++++++------------- library/Hooks.cpp | 22 +++++++++++++++++++++- library/include/Core.h | 3 ++- 5 files changed, 59 insertions(+), 16 deletions(-) diff --git a/docs/Core.rst b/docs/Core.rst index 5decd668d..62b91c19c 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -53,7 +53,7 @@ double quotes. To include a double quote character, use ``\"``. If the first non-whitespace character is ``:``, the command is parsed in an alternative mode. The non-whitespace characters following the ``:`` are the command name, and the remaining part of the line is used verbatim as -the first argument. This is very useful for the `lua` and `rb` commands. +the first argument. This is very useful for the `lua` command. As an example, the following two command lines are exactly equivalent:: :foo a b "c d" e f @@ -306,6 +306,23 @@ the root DF folder. Note that ``script-paths.txt`` is only read at startup, but the paths can also be modified programmatically at any time through the `Lua API `. +Commandline options +=================== + +In addition to `Using an OS terminal`_ to execute commands on startup, DFHack +also recognizes a single commandline option that can be specified on the +commandline: + +- ``--disable-dfhack``: If this option is passed on the Dwarf Fortress + commandline, then DFHack will be disabled for the session. You will have to + restart Dwarf Fortress without specifying this option in order to use DFHack. + If you are launching Dwarf Fortress from Steam, you can enter the option in + the "Launch Options" text box in the properties for the Dwarf Fortress app. + Note that if you do this, DFHack will be disabled regardless of whether you + run Dwarf Fortress from its own app or DFHack's. You will have to clear the + DF Launch Options in order to use DFHack again. Note that even if DFHack is + disabled, :file:`stdout.txt` and :file:`stderr.txt` will still be redirected + to :file:`stdout.log` and :file:`stderr.log`, respectively. .. _env-vars: diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..d602ed93a 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,6 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - Terminal console no longer appears in front of the game window on startup - `gui/design`: Improved performance for drawing shapes +- ``Core``: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline to disable DFHack for the session. ## Documentation diff --git a/library/Core.cpp b/library/Core.cpp index 9ff6976d5..256493dce 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -1471,16 +1471,8 @@ std::string Core::getHackPath() #endif } -bool Core::Init() -{ - if(started) - return true; - if(errorstate) - return false; - - // Lock the CoreSuspendMutex until the thread exits or call Core::Shutdown - // Core::Update will temporary unlock when there is any commands queued - MainThread::suspend().lock(); +bool Core::InitMainThread() { + Filesystem::init(); // Re-route stdout and stderr again - DF seems to set up stdout and // stderr.txt on Windows as of 0.43.05. Also, log before switching files to @@ -1496,8 +1488,6 @@ bool Core::Init() if (!freopen("stderr.log", "w", stderr)) std::cerr << "Could not redirect stderr to stderr.log" << std::endl; - Filesystem::init(); - std::cerr << "DFHack build: " << Version::git_description() << "\n" << "Starting with working directory: " << Filesystem::getcwd() << std::endl; @@ -1566,6 +1556,20 @@ bool Core::Init() // Init global object pointers df::global::InitGlobals(); + return true; +} + +bool Core::InitSimulationThread() +{ + if(started) + return true; + if(errorstate) + return false; + + // Lock the CoreSuspendMutex until the thread exits or call Core::Shutdown + // Core::Update will temporary unlock when there is any commands queued + MainThread::suspend().lock(); + std::cerr << "Initializing Console.\n"; // init the console. bool is_text_mode = (init && init->display.flag.is_set(init_display_flags::TEXT)); @@ -1965,7 +1969,7 @@ int Core::Update() if(!started) { // Initialize the core - Init(); + InitSimulationThread(); if(errorstate) return -1; } diff --git a/library/Hooks.cpp b/library/Hooks.cpp index c241e4875..1976d60d7 100644 --- a/library/Hooks.cpp +++ b/library/Hooks.cpp @@ -1,31 +1,49 @@ #include "Core.h" #include "Export.h" +#include "df/gamest.h" + +static bool disabled = false; + // called from the main thread before the simulation thread is started // and the main event loop is initiated DFhackCExport void dfhooks_init() { - // TODO: initialize things we need to do while still in the main thread + if (!DFHack::Core::getInstance().InitMainThread() || !df::global::game) + return; + const std::string & cmdline = df::global::game->command_line.original; + if (cmdline.find("--disable-dfhack") != std::string::npos) { + fprintf(stdout, "dfhack: --disable-dfhack specified on commandline; disabling\n"); + disabled = true; + } } // called from the main thread after the main event loops exits DFhackCExport void dfhooks_shutdown() { + if (disabled) + return; DFHack::Core::getInstance().Shutdown(); } // called from the simulation thread in the main event loop DFhackCExport void dfhooks_update() { + if (disabled) + return; DFHack::Core::getInstance().Update(); } // called from the simulation thread just before adding the macro // recording/playback overlay DFhackCExport void dfhooks_prerender() { + if (disabled) + return; // TODO: render overlay widgets that are not attached to a viewscreen } // called from the main thread for each SDL event. if true is returned, then // the event has been consumed and further processing shouldn't happen DFhackCExport bool dfhooks_sdl_event(SDL::Event* event) { + if (disabled) + return false; return DFHack::Core::getInstance().DFH_SDL_Event(event); } @@ -34,5 +52,7 @@ DFhackCExport bool dfhooks_sdl_event(SDL::Event* event) { // if true is returned, then the event has been consumed and further processing // shouldn't happen DFhackCExport bool dfhooks_ncurses_key(int key) { + if (disabled) + return false; return DFHack::Core::getInstance().DFH_ncurses_key(key); } diff --git a/library/include/Core.h b/library/include/Core.h index 386769fcb..696be4ead 100644 --- a/library/include/Core.h +++ b/library/include/Core.h @@ -191,7 +191,8 @@ namespace DFHack struct Private; std::unique_ptr d; - bool Init(); + bool InitMainThread(); + bool InitSimulationThread(); int Update (void); int Shutdown (void); bool DFH_SDL_Event(SDL::Event* event); From 910b7c2ae945b4babe2b7304b0500ea2f189dcfb Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 15 May 2023 17:52:20 -0700 Subject: [PATCH 392/439] fix autolabor warning appearing on inappropriate screens --- docs/changelog.txt | 1 + plugins/lua/autolabor.lua | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..9b6868540 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,6 +44,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `work-now`: reinstated, renamed from ``workNow``: reduce the time that dwarves are left without a task after completing a job ## Fixes +- `autolabor`: work detail override warning now only appears on the work details screen ## Misc Improvements - Terminal console no longer appears in front of the game window on startup diff --git a/plugins/lua/autolabor.lua b/plugins/lua/autolabor.lua index 50f39b225..a468b30e1 100644 --- a/plugins/lua/autolabor.lua +++ b/plugins/lua/autolabor.lua @@ -8,9 +8,9 @@ AutolaborOverlay = defclass(AutolaborOverlay, overlay.OverlayWidget) AutolaborOverlay.ATTRS{ default_pos={x=7,y=-13}, default_enabled=true, - viewscreens='dwarfmode/Info/LABOR', + viewscreens='dwarfmode/Info/LABOR/WORK_DETAILS', frame={w=29, h=5}, - frame_style=gui.THIN_FRAME, + frame_style=gui.MEDIUM_FRAME, frame_background=gui.CLEAR_PEN, } From 9f997eaade3776997379a440af0018c6980aa8f2 Mon Sep 17 00:00:00 2001 From: Myk Date: Mon, 15 May 2023 17:54:45 -0700 Subject: [PATCH 393/439] Update docs/changelog.txt Co-authored-by: Alan --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index d602ed93a..529eebfff 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,7 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - Terminal console no longer appears in front of the game window on startup - `gui/design`: Improved performance for drawing shapes -- ``Core``: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline to disable DFHack for the session. +- Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline to disable DFHack for the session. ## Documentation From a62993b90b6c21f0f1f93dbd685e3fd19f158b73 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 15 May 2023 18:15:46 -0700 Subject: [PATCH 394/439] add DFHACK_DISABLE env var --- docs/Core.rst | 5 +++++ library/Hooks.cpp | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/docs/Core.rst b/docs/Core.rst index 62b91c19c..0e333702f 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -336,6 +336,11 @@ on UNIX-like systems: DFHACK_SOME_VAR=1 ./dfhack +- ``DFHACK_DISABLE``: if set, DFHack will not initialize, not even to redirect + :file:`stdout.txt` or :file:`stderr.txt`. This is provided as an alternative + to the ``--disable-dfhack`` commandline parameter above for when environment + variables are more convenient. + - ``DFHACK_PORT``: the port to use for the RPC server (used by ``dfhack-run`` and `remotefortressreader` among others) instead of the default ``5000``. As with the default, if this port cannot be used, the server is not started. diff --git a/library/Hooks.cpp b/library/Hooks.cpp index 1976d60d7..4e339e768 100644 --- a/library/Hooks.cpp +++ b/library/Hooks.cpp @@ -8,6 +8,13 @@ static bool disabled = false; // called from the main thread before the simulation thread is started // and the main event loop is initiated DFhackCExport void dfhooks_init() { + if (getenv("DFHACK_DISABLE")) { + fprintf(stdout, "dfhack: DFHACK_DISABLE detected in environment; disabling\n"); + disabled = true; + return; + } + + // we need to init DF globals before we can check the commandline if (!DFHack::Core::getInstance().InitMainThread() || !df::global::game) return; const std::string & cmdline = df::global::game->command_line.original; From b845ea15b8050758797c0694380dc163106d85d5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 15 May 2023 18:34:43 -0700 Subject: [PATCH 395/439] update changelog --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 529eebfff..80d07eff4 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,7 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - Terminal console no longer appears in front of the game window on startup - `gui/design`: Improved performance for drawing shapes -- Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline to disable DFHack for the session. +- Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. ## Documentation From 6b2c805d5f813b193f959758afdb5431f42fedc9 Mon Sep 17 00:00:00 2001 From: Myk Date: Mon, 15 May 2023 22:12:12 -0700 Subject: [PATCH 396/439] Update docs/Core.rst Co-authored-by: Alan --- docs/Core.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Core.rst b/docs/Core.rst index 0e333702f..763858b61 100644 --- a/docs/Core.rst +++ b/docs/Core.rst @@ -337,7 +337,7 @@ on UNIX-like systems: DFHACK_SOME_VAR=1 ./dfhack - ``DFHACK_DISABLE``: if set, DFHack will not initialize, not even to redirect - :file:`stdout.txt` or :file:`stderr.txt`. This is provided as an alternative + standard output or standard error. This is provided as an alternative to the ``--disable-dfhack`` commandline parameter above for when environment variables are more convenient. From 81918a89a33d55f2ebdea2e6fe6e66fb3b59410e Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Tue, 16 May 2023 07:13:50 +0000 Subject: [PATCH 397/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 54bd83727..1ec3602f9 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 54bd83727df5f7048f5a7251b99ada1930e18ad9 +Subproject commit 1ec3602f9d896c9dc76b26b3be845a5aa7544093 From f05fe333071a4d28cfdc643047376fa8a9bb24c6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 11:26:47 -0700 Subject: [PATCH 398/439] fix crash on malformed json (again) --- docs/changelog.txt | 1 + library/RemoteClient.cpp | 6 +++++- library/RemoteServer.cpp | 19 +++++++++++-------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..50d015c4d 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,6 +44,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `work-now`: reinstated, renamed from ``workNow``: reduce the time that dwarves are left without a task after completing a job ## Fixes +- RemoteServer: fix crash on malformed json in ``dfhack-config/remote-server.json`` ## Misc Improvements - Terminal console no longer appears in front of the game window on startup diff --git a/library/RemoteClient.cpp b/library/RemoteClient.cpp index 6a8becaae..0aa68eb51 100644 --- a/library/RemoteClient.cpp +++ b/library/RemoteClient.cpp @@ -150,7 +150,11 @@ int RemoteClient::GetDefaultPort() if (in_file) { Json::Value config; - in_file >> config; + try { + in_file >> config; + } catch (const std::exception & e) { + std::cerr << "Error reading remote server config file: " << filename << ": " << e.what() << std::endl; + } in_file.close(); if (config.isMember("port")) { port = config["port"].asInt(); diff --git a/library/RemoteServer.cpp b/library/RemoteServer.cpp index 734b80702..77510d63a 100644 --- a/library/RemoteServer.cpp +++ b/library/RemoteServer.cpp @@ -420,17 +420,20 @@ ServerMainImpl::ServerMainImpl(std::promise promise, int port) : Json::Value configJson; - std::ifstream inFile(filename, std::ios_base::in); - bool allow_remote = false; - if (inFile.is_open()) - { - inFile >> configJson; - inFile.close(); - - allow_remote = configJson.get("allow_remote", "false").asBool(); + std::ifstream inFile(filename, std::ios_base::in); + try { + if (inFile.is_open()) + { + inFile >> configJson; + allow_remote = configJson.get("allow_remote", "false").asBool(); + } + } catch (const std::exception & e) { + std::cerr << "Error reading remote server config file: " << filename << ": " << e.what() << std::endl; + std::cerr << "Reverting to remote server config to defaults" << std::endl; } + inFile.close(); // rewrite/normalize config file configJson["allow_remote"] = allow_remote; From a76bed0ed511848484bfeb0d3b94a0a8ac9af211 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 11:41:28 -0700 Subject: [PATCH 399/439] rename overlay.reload to overlay.rescan --- docs/changelog.txt | 1 + docs/dev/overlay-dev-guide.rst | 4 ++-- plugins/lua/overlay.lua | 4 ++-- plugins/overlay.cpp | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..4fab1aa28 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -54,6 +54,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua +- ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. ## Removed diff --git a/docs/dev/overlay-dev-guide.rst b/docs/dev/overlay-dev-guide.rst index 1a53e7f65..4ec226d30 100644 --- a/docs/dev/overlay-dev-guide.rst +++ b/docs/dev/overlay-dev-guide.rst @@ -183,7 +183,7 @@ Scripts #. If the script is not in your `script-paths`, install your script (see the `modding-guide` for help setting up a dev environment so that you don't need to reinstall your scripts after every edit). -#. Call ``:lua require('plugins.overlay').reload()`` to reload your overlay +#. Call ``:lua require('plugins.overlay').rescan()`` to reload your overlay widget Plugins @@ -194,7 +194,7 @@ Plugins :file:`hack/lua/plugins/` #. If you have changed the compiled plugin, `reload` it #. If you have changed the lua code, run ``:lua reload('plugins.mypluginname')`` -#. Call ``:lua require('plugins.overlay').reload()`` to reload your overlay +#. Call ``:lua require('plugins.overlay').rescan()`` to reload your overlay widget Troubleshooting diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index 84c2b4f96..9f41cb035 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -292,7 +292,7 @@ local function load_widgets(env_name, env) end -- called directly from cpp on plugin enable -function reload() +function rescan() reset() for _,plugin in ipairs(dfhack.internal.listPlugins()) do @@ -317,7 +317,7 @@ dfhack.onStateChange[GLOBAL_KEY] = function(sc) return end -- pick up widgets from active mods - reload() + rescan() end local function dump_widget_config(name, widget) diff --git a/plugins/overlay.cpp b/plugins/overlay.cpp index c02c960ba..784e17129 100644 --- a/plugins/overlay.cpp +++ b/plugins/overlay.cpp @@ -128,7 +128,7 @@ DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) { if (enable) { screenSize = Screen::getWindowSize(); - call_overlay_lua(&out, "reload"); + call_overlay_lua(&out, "rescan"); } DEBUG(control).print("%sing interpose hooks\n", enable ? "enabl" : "disabl"); From 217be6b58d16004192ed3191d9154ee87be11586 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 12:36:58 -0700 Subject: [PATCH 400/439] make full text search configurable for list filters --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 8 ++++++++ library/lua/gui/widgets.lua | 19 ++++++++++++------- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..f301a1055 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -47,6 +47,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - Terminal console no longer appears in front of the game window on startup +- `gui/control-panel`: new preference for whether filters in lists search for substrings in the middle of words (e.g. if set to true, then "ee" will match "steel") - `gui/design`: Improved performance for drawing shapes ## Documentation diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 85e51d11d..6215fd250 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -5106,6 +5106,14 @@ The widget implements: Same as with an ordinary list. +Filter behavior: + +By default, the filter matches substrings that start at the beginning of a word +(or after any punctuation). You can instead configure filters to match any +substring with a command like:: + + :lua require('gui.widgets').FILTER_FULL_TEXT=true + TabBar class ------------ diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 7aa79cbc3..e5d808903 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1932,6 +1932,8 @@ end -- Filtered List -- ------------------- +FILTER_FULL_TEXT = false + FilteredList = defclass(FilteredList, Widget) FilteredList.ATTRS { @@ -2102,19 +2104,22 @@ function FilteredList:setFilter(filter, pos) end for _,key in ipairs(tokens) do key = key:escape_pattern() - -- start matches at non-space or non-punctuation. this allows - -- punctuation itself to be matched if that is useful (e.g. - -- filenames or parameter names) if key ~= '' then if not self.case_sensitive then search_key = string.lower(search_key) key = string.lower(key) end - if not search_key:match('%f[^%p\x00]'..key) and - not search_key:match('%f[^%s\x00]'..key) then - ok = false - break + -- the separate checks for non-space or non-punctuation allows + -- punctuation itself to be matched if that is useful (e.g. + -- filenames or parameter names) + if not FILTER_FULL_TEXT and not search_key:match('%f[^%p\x00]'..key) + and not search_key:match('%f[^%s\x00]'..key) then + ok = false + break + elseif FILTER_FULL_TEXT and not search_key:find(key) then + ok = false + break end end end From b6b65d4bf69a564b2ac2b02c0cf782080b17e42b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 15:37:00 -0700 Subject: [PATCH 401/439] update library military orders move preference for silver below steel leather cloaks -> silk cloaks leather shield -> wood shield adjust target quantities for archer uniforms --- data/orders/military.json | 410 +- .../military_include_artifact_materials.json | 4971 ----------------- docs/plugins/orders.rst | 16 +- 3 files changed, 198 insertions(+), 5199 deletions(-) delete mode 100644 data/orders/military_include_artifact_materials.json diff --git a/data/orders/military.json b/data/orders/military.json index 0e53747b6..abf2675f9 100644 --- a/data/orders/military.json +++ b/data/orders/military.json @@ -92,15 +92,16 @@ [ { "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", + "flags" : + [ + "silk" + ], + "item_type" : "CLOTH", + "min_dimension" : 10000, "value" : 10 }, { "condition" : "AtMost", - "flags" : - [ - "leather" - ], "item_subtype" : "ITEM_ARMOR_CLOAK", "item_type" : "ARMOR", "value" : 10 @@ -110,7 +111,7 @@ "job" : "MakeArmor", "material_category" : [ - "leather" + "silk" ] }, { @@ -152,25 +153,21 @@ [ { "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 + "item_type" : "WOOD", + "value" : 50 }, { "condition" : "AtMost", - "flags" : - [ - "leather" - ], "item_subtype" : "ITEM_SHIELD_SHIELD", "item_type" : "SHIELD", - "value" : 1 + "value" : 10 } ], "item_subtype" : "ITEM_SHIELD_SHIELD", "job" : "MakeShield", "material_category" : [ - "leather" + "wood" ] }, { @@ -191,7 +188,7 @@ "condition" : "AtMost", "item_subtype" : "ITEM_ARMOR_LEATHER", "item_type" : "ARMOR", - "value" : 1 + "value" : 10 } ], "item_subtype" : "ITEM_ARMOR_LEATHER", @@ -223,7 +220,7 @@ ], "item_subtype" : "ITEM_HELM_HELM", "item_type" : "HELM", - "value" : 1 + "value" : 10 } ], "item_subtype" : "ITEM_HELM_HELM", @@ -255,7 +252,7 @@ ], "item_subtype" : "ITEM_SHOES_BOOTS", "item_type" : "SHOES", - "value" : 2 + "value" : 20 } ], "item_subtype" : "ITEM_SHOES_BOOTS", @@ -287,7 +284,7 @@ ], "item_subtype" : "ITEM_PANTS_LEGGINGS", "item_type" : "PANTS", - "value" : 1 + "value" : 10 } ], "item_subtype" : "ITEM_PANTS_LEGGINGS", @@ -319,7 +316,7 @@ ], "item_subtype" : "ITEM_GLOVES_GLOVES", "item_type" : "GLOVES", - "value" : 2 + "value" : 20 } ], "item_subtype" : "ITEM_GLOVES_GLOVES", @@ -571,37 +568,6 @@ "is_active" : false, "is_validated" : false, "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:NATIVE_PLATINUM", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 10 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:NATIVE_PLATINUM" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 19, - "is_active" : false, - "is_validated" : false, - "item_conditions" : [ { "condition" : "AtLeast", @@ -629,7 +595,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 20, + "id" : 19, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -660,7 +626,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 21, + "id" : 20, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -691,7 +657,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 22, + "id" : 21, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -722,7 +688,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 23, + "id" : 22, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -759,7 +725,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 24, + "id" : 23, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -808,7 +774,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 25, + "id" : 24, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -845,7 +811,7 @@ "amount_left" : 4, "amount_total" : 4, "frequency" : "Daily", - "id" : 26, + "id" : 25, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -888,7 +854,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 27, + "id" : 26, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -924,7 +890,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 28, + "id" : 27, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -967,7 +933,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 29, + "id" : 28, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1015,7 +981,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 30, + "id" : 29, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1070,79 +1036,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 35, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:SILVER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 35, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:SILVER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 37, + "id" : 30, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1175,7 +1069,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 38, + "id" : 31, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1208,7 +1102,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 39, + "id" : 32, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1241,7 +1135,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 40, + "id" : 33, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1274,7 +1168,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 41, + "id" : 34, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1307,7 +1201,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 42, + "id" : 35, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1347,7 +1241,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 43, + "id" : 36, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1387,7 +1281,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 44, + "id" : 37, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1404,12 +1298,6 @@ "material" : "COAL", "value" : 100 }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, { "condition" : "AtMost", "item_subtype" : "ITEM_WEAPON_MACE", @@ -1426,7 +1314,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 45, + "id" : 38, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1443,12 +1331,6 @@ "material" : "COAL", "value" : 100 }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, { "condition" : "AtMost", "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", @@ -1465,7 +1347,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 46, + "id" : 39, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1498,7 +1380,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 47, + "id" : 40, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1531,7 +1413,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 48, + "id" : 41, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1564,7 +1446,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 49, + "id" : 42, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1597,7 +1479,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 50, + "id" : 43, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1630,7 +1512,103 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 51, + "id" : 44, + "is_active" : false, + "is_validated" : false, + "item_conditions" : + [ + { + "condition" : "AtLeast", + "item_type" : "BAR", + "material" : "INORGANIC:SILVER", + "value" : 5 + }, + { + "condition" : "AtLeast", + "item_type" : "BAR", + "material" : "COAL", + "value" : 100 + }, + { + "condition" : "LessThan", + "item_type" : "BOULDER", + "reaction_class" : "FLUX", + "value" : 5 + }, + { + "condition" : "AtMost", + "flags" : + [ + "metal" + ], + "item_subtype" : "ITEM_WEAPON_MACE", + "item_type" : "WEAPON", + "value" : 10 + }, + { + "condition" : "LessThan", + "item_type" : "BAR", + "material" : "INORGANIC:STEEL", + "value" : 10 + } + ], + "item_subtype" : "ITEM_WEAPON_MACE", + "job" : "MakeWeapon", + "material" : "INORGANIC:SILVER" + }, + { + "amount_left" : 1, + "amount_total" : 1, + "frequency" : "Daily", + "id" : 45, + "is_active" : false, + "is_validated" : false, + "item_conditions" : + [ + { + "condition" : "AtLeast", + "item_type" : "BAR", + "material" : "INORGANIC:SILVER", + "value" : 5 + }, + { + "condition" : "AtLeast", + "item_type" : "BAR", + "material" : "COAL", + "value" : 100 + }, + { + "condition" : "LessThan", + "item_type" : "BOULDER", + "reaction_class" : "FLUX", + "value" : 5 + }, + { + "condition" : "AtMost", + "flags" : + [ + "metal" + ], + "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", + "item_type" : "WEAPON", + "value" : 10 + }, + { + "condition" : "LessThan", + "item_type" : "BAR", + "material" : "INORGANIC:STEEL", + "value" : 10 + } + ], + "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", + "job" : "MakeWeapon", + "material" : "INORGANIC:SILVER" + }, + { + "amount_left" : 1, + "amount_total" : 1, + "frequency" : "Daily", + "id" : 46, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1678,7 +1656,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 52, + "id" : 47, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1726,7 +1704,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 53, + "id" : 48, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1774,7 +1752,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 54, + "id" : 49, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1822,7 +1800,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 55, + "id" : 50, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1870,7 +1848,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 56, + "id" : 51, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1928,7 +1906,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 57, + "id" : 52, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -1986,7 +1964,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 58, + "id" : 53, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2040,7 +2018,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 59, + "id" : 54, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2094,7 +2072,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 60, + "id" : 55, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2142,7 +2120,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 61, + "id" : 56, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2190,7 +2168,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 62, + "id" : 57, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2238,7 +2216,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 63, + "id" : 58, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2286,7 +2264,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 64, + "id" : 59, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2334,7 +2312,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 79, + "id" : 74, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2382,7 +2360,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 80, + "id" : 75, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2430,7 +2408,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 81, + "id" : 76, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2478,7 +2456,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 82, + "id" : 77, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2526,7 +2504,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 83, + "id" : 78, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2574,7 +2552,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 84, + "id" : 79, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2632,7 +2610,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 85, + "id" : 80, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2690,7 +2668,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 72, + "id" : 67, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2735,7 +2713,7 @@ "item_type" : "BAR", "material" : "INORGANIC:SILVER", "value" : 5 - }, + } ], "item_subtype" : "ITEM_WEAPON_MACE", "job" : "MakeWeapon", @@ -2745,7 +2723,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 87, + "id" : 82, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2799,7 +2777,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 88, + "id" : 83, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2847,7 +2825,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 89, + "id" : 84, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2895,7 +2873,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 90, + "id" : 85, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2943,7 +2921,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 91, + "id" : 86, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -2991,7 +2969,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 92, + "id" : 87, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3039,7 +3017,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 79, + "id" : 74, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3093,7 +3071,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 80, + "id" : 75, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3147,7 +3125,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 81, + "id" : 76, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3201,7 +3179,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 82, + "id" : 77, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3255,7 +3233,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 83, + "id" : 78, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3309,7 +3287,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 84, + "id" : 79, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3373,7 +3351,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 85, + "id" : 80, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3437,7 +3415,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 86, + "id" : 81, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3497,7 +3475,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 87, + "id" : 82, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3557,7 +3535,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 88, + "id" : 83, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3611,7 +3589,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 89, + "id" : 84, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3665,7 +3643,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 90, + "id" : 85, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3719,7 +3697,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 91, + "id" : 86, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3773,7 +3751,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 92, + "id" : 87, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3827,7 +3805,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 93, + "id" : 88, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3887,7 +3865,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 94, + "id" : 89, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -3947,7 +3925,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 95, + "id" : 90, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4007,7 +3985,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 96, + "id" : 91, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4067,7 +4045,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 97, + "id" : 92, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4127,7 +4105,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 98, + "id" : 93, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4197,7 +4175,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 99, + "id" : 94, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4267,7 +4245,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 100, + "id" : 95, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4333,7 +4311,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 101, + "id" : 96, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4399,7 +4377,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 102, + "id" : 97, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4459,7 +4437,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 103, + "id" : 98, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4519,7 +4497,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 104, + "id" : 99, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4579,7 +4557,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 105, + "id" : 100, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -4639,7 +4617,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 106, + "id" : 101, "is_active" : false, "is_validated" : false, "item_conditions" : diff --git a/data/orders/military_include_artifact_materials.json b/data/orders/military_include_artifact_materials.json deleted file mode 100644 index 536b2cd7a..000000000 --- a/data/orders/military_include_artifact_materials.json +++ /dev/null @@ -1,4971 +0,0 @@ -[ - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 0, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 10 - }, - { - "condition" : "AtMost", - "item_type" : "BACKPACK", - "value" : 10 - } - ], - "job" : "MakeBackpack", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 1, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 10 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_type" : "FLASK", - "value" : 10 - } - ], - "job" : "MakeFlask", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 2, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 10 - }, - { - "condition" : "AtMost", - "item_type" : "QUIVER", - "value" : 10 - } - ], - "job" : "MakeQuiver", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 3, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 10 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_subtype" : "ITEM_ARMOR_CLOAK", - "item_type" : "ARMOR", - "value" : 10 - } - ], - "item_subtype" : "ITEM_ARMOR_CLOAK", - "job" : "MakeArmor", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 4, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "WOOD", - "value" : 50 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material_category" : - [ - "wood" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 5, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "item_type" : "SHIELD", - "value" : 1 - } - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "job" : "MakeShield", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 6, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_ARMOR_LEATHER", - "item_type" : "ARMOR", - "value" : 1 - } - ], - "item_subtype" : "ITEM_ARMOR_LEATHER", - "job" : "MakeArmor", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 7, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_subtype" : "ITEM_HELM_HELM", - "item_type" : "HELM", - "value" : 1 - } - ], - "item_subtype" : "ITEM_HELM_HELM", - "job" : "MakeHelm", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 8, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "item_type" : "SHOES", - "value" : 2 - } - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "job" : "MakeShoes", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 9, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_subtype" : "ITEM_PANTS_LEGGINGS", - "item_type" : "PANTS", - "value" : 1 - } - ], - "item_subtype" : "ITEM_PANTS_LEGGINGS", - "job" : "MakePants", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 10, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "SKIN_TANNED", - "value" : 25 - }, - { - "condition" : "AtMost", - "flags" : - [ - "leather" - ], - "item_subtype" : "ITEM_GLOVES_GLOVES", - "item_type" : "GLOVES", - "value" : 2 - } - ], - "item_subtype" : "ITEM_GLOVES_GLOVES", - "job" : "MakeGloves", - "material_category" : - [ - "leather" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 11, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "flags" : - [ - "unrotten", - "bone", - "body_part" - ], - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "bone" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 1000 - } - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "job" : "MakeAmmo", - "material_category" : - [ - "bone" - ] - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 12, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "WOOD", - "value" : 150 - }, - { - "condition" : "AtMost", - "flags" : - [ - "bone" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 200 - }, - { - "condition" : "AtMost", - "flags" : - [ - "plant" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 1000 - } - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "job" : "MakeAmmo", - "material_category" : - [ - "wood" - ] - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 13, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:CASSITERITE", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:TIN", - "value" : 20 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:CASSITERITE" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 14, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:HEMATITE", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 40 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:HEMATITE" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 15, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:HORN_SILVER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 10 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:HORN_SILVER" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 16, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:LIMONITE", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 40 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:LIMONITE" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 17, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:NATIVE_COPPER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 40 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:NATIVE_COPPER" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 18, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:NATIVE_PLATINUM", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 10 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:NATIVE_PLATINUM" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 19, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:NATIVE_SILVER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 10 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:NATIVE_SILVER" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 20, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:MAGNETITE", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 40 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:MAGNETITE" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 21, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:MALACHITE", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 40 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:MALACHITE" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 22, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "material" : "INORGANIC:TETRAHEDRITE", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 40 - } - ], - "job" : "SmeltOre", - "material" : "INORGANIC:TETRAHEDRITE" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 23, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "bearing" : "TIN", - "condition" : "AtLeast", - "item_type" : "BOULDER", - "value" : 5 - }, - { - "bearing" : "COPPER", - "condition" : "AtLeast", - "item_type" : "BOULDER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 40 - } - ], - "job" : "CustomReaction", - "reaction" : "BRONZE_MAKING" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 24, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:TIN", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 40 - }, - { - "bearing" : "TIN", - "condition" : "AtMost", - "item_type" : "BOULDER", - "value" : 5 - }, - { - "bearing" : "COPPER", - "condition" : "AtMost", - "item_type" : "BOULDER", - "value" : 5 - } - ], - "job" : "CustomReaction", - "reaction" : "BRONZE_MAKING2" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 25, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:PIG_IRON", - "value" : 10 - } - ], - "job" : "CustomReaction", - "reaction" : "PIG_IRON_MAKING" - }, - { - "amount_left" : 4, - "amount_total" : 4, - "frequency" : "Daily", - "id" : 26, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:PIG_IRON", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 40 - } - ], - "job" : "CustomReaction", - "reaction" : "STEEL_MAKING" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 27, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 1000 - } - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "job" : "MakeAmmo", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 28, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "min_dimension" : 150, - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 1000 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "job" : "MakeAmmo", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 29, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 1000 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "job" : "MakeAmmo", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 30, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "min_dimension" : 150, - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "item_type" : "AMMO", - "value" : 1000 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - } - ], - "item_subtype" : "ITEM_AMMO_BOLTS", - "job" : "MakeAmmo", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 31, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "material" : "INORGANIC:PLATINUM", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:PLATINUM" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 32, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "material" : "INORGANIC:PLATINUM", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:PLATINUM" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 64, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "material" : "INORGANIC:PLATINUM", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:PLATINUM" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 35, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:SILVER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 35, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:SILVER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 64, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:SILVER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 37, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_SHIELD_SHIELD", - "item_type" : "SHIELD", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "job" : "MakeShield", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 38, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "job" : "MakeArmor", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 39, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_HELM_HELM", - "item_type" : "HELM", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_HELM_HELM", - "job" : "MakeHelm", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 40, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_SHOES_BOOTS", - "item_type" : "SHOES", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "job" : "MakeShoes", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 41, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "item_type" : "GLOVES", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "job" : "MakeGloves", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 42, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_PANTS_GREAVES", - "item_type" : "PANTS", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "material" : "INORGANIC:STEEL", - "value" : 5 - } - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "job" : "MakePants", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 43, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "item_type" : "ARMOR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "material" : "INORGANIC:STEEL", - "value" : 5 - } - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "job" : "MakeArmor", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 44, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 45, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 46, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_SPEAR", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 47, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 48, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 49, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_PICK", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 50, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:STEEL" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 51, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "item_type" : "SHIELD", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "job" : "MakeShield", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 52, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "job" : "MakeArmor", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 53, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_HELM_HELM", - "item_type" : "HELM", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_HELM_HELM", - "job" : "MakeHelm", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 54, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "item_type" : "SHOES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "job" : "MakeShoes", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 55, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "item_type" : "GLOVES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "job" : "MakeGloves", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 56, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "item_type" : "PANTS", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - } - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "job" : "MakePants", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 57, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - } - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "job" : "MakeArmor", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 58, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 59, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 60, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 61, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 62, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 63, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - } - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 64, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BOULDER", - "reaction_class" : "FLUX", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:IRON" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 79, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "item_type" : "SHIELD", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "job" : "MakeShield", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 80, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "job" : "MakeArmor", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 81, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_HELM_HELM", - "item_type" : "HELM", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_HELM_HELM", - "job" : "MakeHelm", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 82, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "item_type" : "SHOES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "job" : "MakeShoes", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 83, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "item_type" : "GLOVES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - } - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "job" : "MakeGloves", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 84, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "item_type" : "PANTS", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - } - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "job" : "MakePants", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 85, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - } - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "job" : "MakeArmor", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 72, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "min_dimension" : 150, - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 87, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 88, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 89, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 90, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 91, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - } - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 92, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:BISMUTH_BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 79, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "item_type" : "SHIELD", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "job" : "MakeShield", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 80, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "job" : "MakeArmor", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 81, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_HELM_HELM", - "item_type" : "HELM", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_HELM_HELM", - "job" : "MakeHelm", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 82, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "item_type" : "SHOES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "job" : "MakeShoes", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 83, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "item_type" : "GLOVES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "job" : "MakeGloves", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 84, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "item_type" : "PANTS", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "job" : "MakePants", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 85, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "job" : "MakeArmor", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 86, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 87, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 88, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 89, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 90, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 91, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 30 - } - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 92, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 30 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:BRONZE" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 93, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "item_type" : "SHIELD", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHIELD_SHIELD", - "job" : "MakeShield", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 94, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "job" : "MakeArmor", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 95, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_HELM_HELM", - "item_type" : "HELM", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_HELM_HELM", - "job" : "MakeHelm", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 96, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "item_type" : "SHOES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_SHOES_BOOTS", - "job" : "MakeShoes", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 97, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "item_type" : "GLOVES", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - } - ], - "item_subtype" : "ITEM_GLOVES_GAUNTLETS", - "job" : "MakeGloves", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 98, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "item_type" : "PANTS", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - } - ], - "item_subtype" : "ITEM_PANTS_GREAVES", - "job" : "MakePants", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 99, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 20 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "item_type" : "ARMOR", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 20 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 20 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_ARMOR_MAIL_SHIRT", - "item_type" : "ARMOR", - "value" : 5 - } - ], - "item_subtype" : "ITEM_ARMOR_BREASTPLATE", - "job" : "MakeArmor", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 100, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_MACE", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 101, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "item_type" : "WEAPON", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_HAMMER_WAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 102, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SPEAR", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 103, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_SWORD_SHORT", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 104, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 10 - } - ], - "item_subtype" : "ITEM_WEAPON_AXE_BATTLE", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 105, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 10 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 30 - } - ], - "item_subtype" : "ITEM_WEAPON_PICK", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - }, - { - "amount_left" : 1, - "amount_total" : 1, - "frequency" : "Daily", - "id" : 106, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "INORGANIC:COPPER", - "value" : 30 - }, - { - "condition" : "AtLeast", - "item_type" : "BAR", - "material" : "COAL", - "value" : 100 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BRONZE", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:IRON", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:STEEL", - "value" : 30 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:SILVER", - "value" : 5 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:PLATINUM", - "value" : 5 - }, - { - "condition" : "AtMost", - "flags" : - [ - "metal" - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "item_type" : "WEAPON", - "value" : 10 - }, - { - "condition" : "LessThan", - "item_type" : "BAR", - "material" : "INORGANIC:BISMUTH_BRONZE", - "value" : 30 - } - ], - "item_subtype" : "ITEM_WEAPON_CROSSBOW", - "job" : "MakeWeapon", - "material" : "INORGANIC:COPPER" - } -] diff --git a/docs/plugins/orders.rst b/docs/plugins/orders.rst index 08e05c6ca..7082d2434 100644 --- a/docs/plugins/orders.rst +++ b/docs/plugins/orders.rst @@ -104,13 +104,15 @@ Orders are missing for plaster powder until DF :bug:`11803` is fixed. This collection adds high-volume smelting jobs for military-grade metal ores and produces weapons and armor: -- leather backpacks/waterskins/cloaks/quivers/armor +- leather backpacks/waterskins/quivers/armor +- silk cloaks - bone/wooden bolts - smelting for platinum, silver, steel, bronze, bismuth bronze, and copper (and their dependencies) - bronze/bismuth bronze/copper bolts -- silver/steel/iron/bismuth bronze/bronze/copper weapons and armor, +- steel/silver/iron/bismuth bronze/bronze/copper weapons and armor, with checks to ensure only the best available materials are being used +- wooden shields (if metal isn't available) If you set a stockpile to take weapons and armor of less than masterwork quality and turn on `automelt` (like what `dreamfort` provides on its industry level), @@ -120,16 +122,6 @@ Make sure you have a lot of fuel (or magma forges and furnaces) before you turn This file should only be imported, of course, if you need to equip a military. -:source:`library/military_include_artifact_materials ` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As above, but this collection will also allow creation of platinum blunt weapons. -Normally these are only created by artifact moods, work orders can't be created -manually for them. - -- platinum/silver/steel/iron/bismuth bronze/bronze/copper weapons and armor, - with checks to ensure only the best available materials are being used - :source:`library/smelting ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From f43bfed7f21406429fd53976d1fc2f8cf90d1a9c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 15:53:11 -0700 Subject: [PATCH 402/439] remove easy meals; add bins; document jugs --- data/orders/basic.json | 99 ++++++++++++++++++++--------------------- docs/plugins/orders.rst | 7 ++- 2 files changed, 54 insertions(+), 52 deletions(-) diff --git a/data/orders/basic.json b/data/orders/basic.json index 16b05e0ba..8e271ba04 100644 --- a/data/orders/basic.json +++ b/data/orders/basic.json @@ -1,31 +1,9 @@ [ - { - "amount_left" : 150, - "amount_total" : 150, - "frequency" : "Monthly", - "id" : 0, - "is_active" : false, - "is_validated" : false, - "item_conditions" : - [ - { - "condition" : "LessThan", - "flags" : - [ - "unrotten" - ], - "item_type" : "FOOD", - "value" : 400 - } - ], - "job" : "PrepareMeal", - "meal_ingredients" : 2 - }, { "amount_left" : 10, "amount_total" : 10, "frequency" : "Daily", - "id" : 1, + "id" : 0, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -47,7 +25,7 @@ "unrotten", "cookable" ], - "value" : 500 + "value" : 80 }, { "condition" : "AtMost", @@ -57,15 +35,6 @@ ], "item_type" : "FOOD", "value" : 3500 - }, - { - "condition" : "AtLeast", - "flags" : - [ - "unrotten" - ], - "item_type" : "FOOD", - "value" : 400 } ], "job" : "PrepareMeal", @@ -75,7 +44,7 @@ "amount_left" : 2, "amount_total" : 2, "frequency" : "Daily", - "id" : 2, + "id" : 1, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -112,7 +81,7 @@ "amount_left" : 2, "amount_total" : 2, "frequency" : "Daily", - "id" : 3, + "id" : 2, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -149,7 +118,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 4, + "id" : 3, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -170,7 +139,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 5, + "id" : 4, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -205,7 +174,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 6, + "id" : 5, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -237,7 +206,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 7, + "id" : 6, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -268,7 +237,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 8, + "id" : 7, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -290,7 +259,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 9, + "id" : 8, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -322,7 +291,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 10, + "id" : 9, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -353,7 +322,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 11, + "id" : 10, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -386,7 +355,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 12, + "id" : 11, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -426,7 +395,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 13, + "id" : 12, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -452,7 +421,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 14, + "id" : 13, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -487,7 +456,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 15, + "id" : 14, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -522,7 +491,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 16, + "id" : 15, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -557,7 +526,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 17, + "id" : 16, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -587,7 +556,7 @@ "amount_left" : 1, "amount_total" : 1, "frequency" : "Daily", - "id" : 18, + "id" : 17, "is_active" : false, "is_validated" : false, "item_conditions" : @@ -618,6 +587,36 @@ "job" : "MakeTool", "material" : "INORGANIC" }, + { + "amount_left" : 1, + "amount_total" : 1, + "frequency" : "Daily", + "id" : 18, + "is_active" : false, + "is_validated" : false, + "item_conditions" : + [ + { + "condition" : "AtLeast", + "item_type" : "WOOD", + "value" : 50 + }, + { + "condition" : "AtMost", + "flags" : + [ + "empty" + ], + "item_type" : "BIN", + "value" : 5 + } + ], + "job" : "ConstructBin", + "material_category" : + [ + "wood" + ] + }, { "amount_left" : 1, "amount_total" : 1, diff --git a/docs/plugins/orders.rst b/docs/plugins/orders.rst index 7082d2434..46a004081 100644 --- a/docs/plugins/orders.rst +++ b/docs/plugins/orders.rst @@ -67,7 +67,7 @@ This collection of orders handles basic fort necessities: - prepared meals and food products (and by-products like oil) - booze/mead - thread/cloth/dye -- pots/jugs/buckets/mugs +- pots/bins/jugs/buckets/mugs - bags of leather, cloth, silk, and yarn - crafts, totems, and shleggings from otherwise unusable by-products - mechanisms/cages @@ -80,7 +80,10 @@ This collection of orders handles basic fort necessities: You should import it as soon as you have enough dwarves to perform the tasks. Right after the first migration wave is usually a good time. -Armok's note: shleggings? Yes, `shleggings `__. +Note that the jugs are specifically made out of wood. This is so, as long as you don't may any other "Tools" out of wood, you can have a stockpile just for jugs by restricting a finished goods stockpile to only take wooden tools. + +Armok's additional note: "shleggings? Yes, +`shleggings `__." :source:`library/furnace ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 04b1b0f84d69ae41890aeda7d71d36eac0e69eb9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 16:04:33 -0700 Subject: [PATCH 403/439] update changelog --- docs/changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..f2cbeb0af 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -46,6 +46,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements +- `orders`: update orders in orders library for prepared meals, bins, archer uniforms, and weapons - Terminal console no longer appears in front of the game window on startup - `gui/design`: Improved performance for drawing shapes @@ -56,6 +57,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua ## Removed +- `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. # 50.08-r1 From 368a9fbc2eec722c1eaf47ffe99ab3c17a89732e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 16:34:22 -0700 Subject: [PATCH 404/439] update dreamfort traffic patterns --- data/blueprints/dreamfort.csv | 223 ++++++++++++++++++++++++++++------ docs/changelog.txt | 1 + 2 files changed, 184 insertions(+), 40 deletions(-) diff --git a/data/blueprints/dreamfort.csv b/data/blueprints/dreamfort.csv index c5566920b..66ce693b8 100644 --- a/data/blueprints/dreamfort.csv +++ b/data/blueprints/dreamfort.csv @@ -1890,7 +1890,7 @@ Workshops: - 1x Dyer - 1x Loom - 1x Clothier -"" + "" Manual steps you have to take: - Assign minecarts to your quantum stockpile hauling routes @@ -1954,9 +1954,46 @@ Industry Walkthrough: "#meta label(industry2) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) build workshops and stockpiles, configure stockpiles" +traffic/industry_traffic build/industry_build place/industry_place query/industry_query +#dig label(industry_traffic) start(18; 18; central stairs) hidden() + + +,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,oh,ol,ol,ol,oh,ol,ol,ol,oh,ol,ol,ol,oh +,,,,oh,oh,oh,oh,oh,oh,oh,oh,ol,ol,ol,oh,ol,ol,ol,oh,ol,ol,ol,oh,oh,oh,oh,oh,oh,oh,oh +,,,,oh,`,`,`,`,`,`,oh,ol,ol,ol,oh,ol,ol,ol,oh,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,oh,`,`,`,`,`,`,oh,ol,ol,ol,oh,oh,oh,oh,oh,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,oh,`,`,`,`,`,`,oh,ol,ol,ol,oh,oh,`,oh,oh,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,oh,`,`,`,`,`,`,oh,ol,ol,ol,oh,oh,`,oh,oh,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,oh,`,`,`,`,`,`,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,oh,`,`,`,`,`,`,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,oh,oh,oh,oh,oh,oh,oh,oh,` +,,`,ol,ol,ol,ol,ol,ol,ol,ol,ol,oh,oh,oh,`,`,`,`,`,oh,oh,oh,ol,ol,ol,ol,ol,ol,ol,ol,ol,` +,,`,ol,ol,ol,ol,ol,ol,ol,ol,ol,oh,oh,oh,`,`,`,`,`,oh,oh,oh,ol,ol,ol,ol,ol,ol,ol,ol,ol,` +,,`,ol,ol,ol,ol,ol,ol,ol,ol,ol,oh,oh,,,`,,`,,,oh,oh,ol,ol,ol,ol,ol,ol,ol,ol,ol,` +,,`,oh,oh,oh,oh,oh,oh,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,oh,oh,oh,oh,oh,oh,` +,,`,ol,ol,ol,oh,oh,oh,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,oh,oh,oh,ol,ol,ol,` +,,`,ol,ol,ol,oh,`,`,`,`,`,`,`,,`,,`,,`,,`,`,`,`,`,`,`,oh,ol,ol,ol,` +,,`,ol,ol,ol,oh,oh,oh,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,oh,oh,oh,ol,ol,ol,` +,,`,oh,oh,oh,oh,oh,oh,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,oh,oh,oh,oh,oh,oh,` +,,`,ol,ol,ol,ol,ol,ol,ol,ol,ol,oh,oh,,,`,,`,,,oh,oh,ol,ol,ol,ol,ol,ol,ol,ol,ol,` +,,`,ol,ol,ol,ol,ol,ol,ol,ol,ol,oh,oh,oh,`,`,`,`,`,oh,oh,oh,ol,ol,ol,ol,ol,ol,ol,ol,ol,` +,,`,ol,ol,ol,ol,ol,ol,ol,ol,ol,oh,oh,oh,`,`,`,`,`,oh,oh,oh,ol,ol,ol,ol,ol,ol,ol,ol,ol,` +,,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,oh,oh,oh,oh,oh,oh,oh,oh,` +,,,,`,`,`,`,`,`,`,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,`,`,`,`,`,`,`,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,`,`,`,`,`,`,`,oh,ol,ol,ol,oh,oh,`,oh,oh,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,oh,oh,oh,oh,oh,oh,oh,oh,ol,ol,ol,`,oh,`,oh,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,`,`,`,`,`,`,`,oh,ol,ol,ol,`,`,`,`,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,`,`,`,`,`,`,`,oh,ol,ol,ol,`,ol,ol,ol,`,ol,ol,ol,oh,`,`,`,`,`,`,oh +,,,,`,`,`,`,`,`,`,oh,ol,ol,ol,`,ol,ol,ol,`,ol,ol,ol,oh,oh,oh,oh,oh,oh,oh,oh +,,,,,,,,,,,oh,ol,ol,ol,oh,ol,ol,ol,oh,ol,ol,ol,oh +,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` + + #build label(industry_build) start(18; 18) hidden() @@ -2052,7 +2089,7 @@ query/industry_query ,,~,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` ,,~,`,`,`,`,`,`,"{givename name=""wood feeder""}",~,"{givename name=""goods feeder""}",nocontainers,~,,`,`,`,`,`,,craftrefuse,,,,~,`,`,`,`,`,`,` ,,t{Right 5}{Down}&,`,`,`,`,`,`,~,~,{tallow}{permitwax},~,~,`,`,,,,`,`,"{givename name=""cloth/bones feeder""}",g{Up 3}{Right 5}&,~,~,~,`,`,`,`,`,`,` -,,`,`,~,`,`,"{quantum name=""goods/wood quantum""}g{Up 13}{Right 10}&","{quantumstop name=""Goods/Wood quantum"" sp_links=""{sp_link move={Right} move_back={Left}}{sp_link move=""""{Right 5}"""" move_back=""""{Left 5}""""}{sp_link move=""""{Down}{Right 5}"""" move_back=""""{Left 5}{Up}""""}""}{givename name=""goods/wood dumper""}",~,~,{forbidcrafts}{forbidgoblets},~,~,,`,,`,,`,,nocontainers,~,~,~,~,"{quantumstopfromwest name=""Clothier/Bones quantum""}{givename name=""cloth/bones dumper""}","{quantum name=""cloth/bones quantum""}g{Up 4}&",`,`,~,`,` +,,`,`,~,`,`,"{quantum name=""goods/wood quantum""}g{Up 13}{Right 10}&","{quantumstop name=""Goods/Wood quantum"" sp_links=""{sp_link move={Right} move_back={Left}}{sp_link move=""""{Right 5}"""" move_back=""""{Left 5}""""}{sp_link move=""""{Down}{Right 5}"""" move_back=""""{Left 5}{Up}""""}""}{givename name=""goods/wood dumper""}",~,~,{forbidcrafts}{forbidgoblets},~,~,,`,,`,,`,,nocontainers,~,~,~,~,"{quantumstopfromwest name=""Clothier/Bones quantum""}{givename name=""cloth/bones dumper""}","{quantum name=""cloth/bones quantum""}g{Up 4}{Right 3}&",`,`,~,`,` ,,miscliquid,`,`,`,`,`,`,~,~,"{givename name=""furniture feeder""}",~,~,`,`,,,,`,`,forbidadamantinethread,~,~,~,~,`,`,`,`,`,`,` ,,"{givename name=""miscliquid""}",`,`,`,`,`,`,~,~,forbidsand,~,~,,`,`,`,`,`,,dye,~,~,~,~,`,`,`,`,`,`,` ,,~,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` @@ -2206,6 +2243,7 @@ Services Walkthrough: "#meta label(services2) start(central stairs) message(Remember to enqueue manager orders for this blueprint. Once furniture has been placed, continue with /services3.) dining hall anchors, stockpiles, hospital, garbage dump" +traffic/services_traffic zones/services_zones build/services_build place/services_place @@ -2221,6 +2259,108 @@ build2/services_build2 build3/services_build3 place_jail/services_place_jail query_jail/services_query_jail +#dig label(services_traffic) start(18; 18) hidden() keep lollygaggers out of the cisterns + +,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,,or,,or,or,or +,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,or,or,or,or,or,or +,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,,or,,or,or,or +,,ol,,,,ol,,,,ol,,,,,,,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,,or,or,or,,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,,or,or,or,,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,,,,or,,,,,,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,,,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,,or,,or,,or +,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,,,or,,or,,,,,or,,or,,or,,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,oh,oh,oh,oh,oh,,,,or,or,or,or,or,or,or,or,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,or,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,`,,oh,`,`,`,oh,,`,,oh,oh,oh,`,oh,or,or,or,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,or,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,oh,oh,oh,oh,oh,,,,or,or,or,or,or,or,or,or,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,,,or,,,,,,or,,or,,or,,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,,,,,,,,,or,,or,,or,,or +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh +,,,,oh,oh,,oh,oh +,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh +,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh + +#> + +,,,,,,,,,,,,,or,or,or,,or,,or,or,or +,,,,,,,,,,,,,or,or,or,or,or,or,or,or,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,or,or,or,,or,,or,or,or +,,,,,,,,,,,,,or,or,or,or,or,or,or,or,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,,,,,or +,,,,,,,,,,,,,,,,,or,or,or,or,or,or,or,or,or,or +,,,,,,,,,,,,,,,,,or,,,,,,,,,or +,,,,,,,,,,,,,,,,,or,,,,,,,,,or +,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,,or +,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or,or +,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or,or +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,` + +#> + +,,,,,,,,,,,,,or,or,or,,,,or,or,or + + + +,,,,,,,,,,,,,or,or,or,,,,or,or,or + + + + + + + + + +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or,or +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,` + +#> + +,,,,,,,,,,,,,,or,or,,,,or,or + + + +,,,,,,,,,,,,,,or,or,,,,or,or + + + + + + + + + +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or +,,,,,,,,,,,,,,,`,`,`,`,` +,,,,,,,,,,,,,,,`,`,`,`,` + "#zone label(services_zones) start(18; 18) hidden() message(If you'd like to fill your wells via bucket brigade, activate the inactive pond zones one level down from where the wells will be built.) garbage dump, hospital, and pond zones" ,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` @@ -2575,42 +2715,6 @@ query_jail/services_query_jail ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` -#dig label(services_traffic) start(18; 18) hidden() promote the tavern as the place to eat - -,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,,or,,or,or,or -,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,or,or,or,or,or,or -,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,,or,,or,or,or -,,ol,,,,ol,,,,ol,,,,,,,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,,,,or,,,,,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,,,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,,or,,or,,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,,,or,,or,,,,,or,,or,,or,,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,oh,oh,oh,oh,oh,,,,or,or,or,or,or,or,or,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,`,,oh,`,`,`,oh,,`,,oh,oh,oh,`,oh,or,or,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,oh,oh,oh,oh,oh,,,,or,or,or,or,or,or,or,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,,,`,,,,,,or,,or,,or,,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,,,,,,,,,or,,or,,or,,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,,,,oh,oh,,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh - "#build label(services_build3) start(18; 18) hidden() jail, statues" ,~,~,~,,~,~,~,,~,~,~,,t,l,b,,`,,t,l,b @@ -2946,8 +3050,47 @@ Apartments Walkthrough: ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d -"#build label(suites2) start(18; 18; central ramp) message(Remember to enqueue manager orders for this blueprint. -bedrooms are left unconfigured so you can assign them to specific nobles)" +"#meta label(suites2) start(central ramp) message(Remember to enqueue manager orders for this blueprint. +bedrooms are left unconfigured so you can assign them to specific nobles.) build furniture and set traffic patterns" +traffic_suites/suites_traffic +build_suites/suites_build +#dig label(suites_traffic) start(18; 18; central ramp) hidden() + +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,,,,or,,,,,,or,,,,`,,`,,,,or,,,,,,or,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,or,,,,,,or,,,,`,`,`,,,,or,,,,,,or,,,,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,`,,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,,,,or,,,,,,or,,,,`,`,`,,,,or,,,,,,or,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,or,,,,,,or,,,,`,,`,,,,or,,,,,,or,,,,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` + +#build label(suites_build) start(18; 18; central ramp) hidden() ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..75050ff73 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -48,6 +48,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - Terminal console no longer appears in front of the game window on startup - `gui/design`: Improved performance for drawing shapes +- Dreamfort: improve traffic patterns throughout the fortress (stockpiles and zones are still not working, pending updates in `quickfort`) ## Documentation From 11361975f903e4cb424b95e4b9e5497ef45df991 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 17:12:44 -0700 Subject: [PATCH 405/439] look up texpos values instead of assuming they're constant --- docs/changelog.txt | 1 + library/lua/gui.lua | 2 +- library/lua/gui/widgets.lua | 43 +++++++++++++++++++------------------ library/modules/Screen.cpp | 2 +- plugins/pathable.cpp | 6 ++++-- 5 files changed, 29 insertions(+), 25 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index fc706cdba..14c2d7620 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,6 +44,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `work-now`: reinstated, renamed from ``workNow``: reduce the time that dwarves are left without a task after completing a job ## Fixes +- DFHack screen backgrounds now use appropriate tiles in DF Classic ## Misc Improvements - Terminal console no longer appears in front of the game window on startup diff --git a/library/lua/gui.lua b/library/lua/gui.lua index b2c90d076..7e991e1df 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -9,7 +9,7 @@ local getval = utils.getval local to_pen = dfhack.pen.parse -CLEAR_PEN = to_pen{tile=909, ch=32, fg=0, bg=0, write_to_lower=true} +CLEAR_PEN = to_pen{tile=df.global.init.texpos_border_interior, ch=32, fg=0, bg=0, write_to_lower=true} TRANSPARENT_PEN = to_pen{tile=0, ch=0} KEEP_LOWER_PEN = to_pen{ch=32, fg=0, bg=0, keep_lower=true} diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 7aa79cbc3..5653dff94 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -853,7 +853,7 @@ local function scrollbar_is_visible(scrollbar) return scrollbar.elems_per_page < scrollbar.num_elems end -local SBSO = 922 --Scroll Bar Spritesheet Offset / change this to point to a different spritesheet (ui themes, anyone? :p) +local SBSO = df.global.init.scrollbar_texpos[0] --Scroll Bar Spritesheet Offset / change this to point to a different spritesheet (ui themes, anyone? :p) local SCROLLBAR_UP_LEFT_PEN = to_pen{tile=SBSO+0, ch=47, fg=COLOR_CYAN, bg=COLOR_BLACK} local SCROLLBAR_UP_RIGHT_PEN = to_pen{tile=SBSO+1, ch=92, fg=COLOR_CYAN, bg=COLOR_BLACK} local SCROLLBAR_DOWN_LEFT_PEN = to_pen{tile=SBSO+24, ch=92, fg=COLOR_CYAN, bg=COLOR_BLACK} @@ -2144,34 +2144,35 @@ function FilteredList:onFilterChar(char, text) return true end +local TSO = df.global.init.tabs_texpos[0] -- tab spritesheet offset local DEFAULT_ACTIVE_TAB_PENS = { text_mode_tab_pen=to_pen{fg=COLOR_YELLOW}, text_mode_label_pen=to_pen{fg=COLOR_WHITE}, - lt=to_pen{tile=1005, write_to_lower=true}, - lt2=to_pen{tile=1006, write_to_lower=true}, - t=to_pen{tile=1007, fg=COLOR_BLACK, write_to_lower=true, top_of_text=true}, - rt2=to_pen{tile=1008, write_to_lower=true}, - rt=to_pen{tile=1009, write_to_lower=true}, - lb=to_pen{tile=1015, write_to_lower=true}, - lb2=to_pen{tile=1016, write_to_lower=true}, - b=to_pen{tile=1017, fg=COLOR_BLACK, write_to_lower=true, bottom_of_text=true}, - rb2=to_pen{tile=1018, write_to_lower=true}, - rb=to_pen{tile=1019, write_to_lower=true}, + lt=to_pen{tile=TSO+5, write_to_lower=true}, + lt2=to_pen{tile=TSO+6, write_to_lower=true}, + t=to_pen{tile=TSO+7, fg=COLOR_BLACK, write_to_lower=true, top_of_text=true}, + rt2=to_pen{tile=TSO+8, write_to_lower=true}, + rt=to_pen{tile=TSO+9, write_to_lower=true}, + lb=to_pen{tile=TSO+15, write_to_lower=true}, + lb2=to_pen{tile=TSO+16, write_to_lower=true}, + b=to_pen{tile=TSO+17, fg=COLOR_BLACK, write_to_lower=true, bottom_of_text=true}, + rb2=to_pen{tile=TSO+18, write_to_lower=true}, + rb=to_pen{tile=TSO+19, write_to_lower=true}, } local DEFAULT_INACTIVE_TAB_PENS = { text_mode_tab_pen=to_pen{fg=COLOR_BROWN}, text_mode_label_pen=to_pen{fg=COLOR_DARKGREY}, - lt=to_pen{tile=1000, write_to_lower=true}, - lt2=to_pen{tile=1001, write_to_lower=true}, - t=to_pen{tile=1002, fg=COLOR_WHITE, write_to_lower=true, top_of_text=true}, - rt2=to_pen{tile=1003, write_to_lower=true}, - rt=to_pen{tile=1004, write_to_lower=true}, - lb=to_pen{tile=1010, write_to_lower=true}, - lb2=to_pen{tile=1011, write_to_lower=true}, - b=to_pen{tile=1012, fg=COLOR_WHITE, write_to_lower=true, bottom_of_text=true}, - rb2=to_pen{tile=1013, write_to_lower=true}, - rb=to_pen{tile=1014, write_to_lower=true}, + lt=to_pen{tile=TSO+0, write_to_lower=true}, + lt2=to_pen{tile=TSO+1, write_to_lower=true}, + t=to_pen{tile=TSO+2, fg=COLOR_WHITE, write_to_lower=true, top_of_text=true}, + rt2=to_pen{tile=TSO+3, write_to_lower=true}, + rt=to_pen{tile=TSO+4, write_to_lower=true}, + lb=to_pen{tile=TSO+10, write_to_lower=true}, + lb2=to_pen{tile=TSO+11, write_to_lower=true}, + b=to_pen{tile=TSO+12, fg=COLOR_WHITE, write_to_lower=true, bottom_of_text=true}, + rb2=to_pen{tile=TSO+13, write_to_lower=true}, + rb=to_pen{tile=TSO+14, write_to_lower=true}, } --------- diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index dcb18dd91..6ccf246aa 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -209,7 +209,7 @@ static bool doSetTile_default(const Pen &pen, int x, int y, bool map) } } else if (pen.ch) { screen[0] = uint8_t(pen.ch); - *texpos_lower = 909; // basic black background + *texpos_lower = df::global::init->texpos_border_interior; // basic black background } auto rgb_fg = &gps->uccolor[fg][0]; diff --git a/plugins/pathable.cpp b/plugins/pathable.cpp index dd26a712f..06394f838 100644 --- a/plugins/pathable.cpp +++ b/plugins/pathable.cpp @@ -7,6 +7,8 @@ #include "LuaTools.h" #include "PluginManager.h" +#include "df/init.h" + using namespace DFHack; DFHACK_PLUGIN("pathable"); @@ -37,8 +39,8 @@ static void paintScreen(df::coord target, bool skip_unrevealed = false) { int selected_tile_texpos = 0; Screen::findGraphicsTile("CURSORS", 4, 3, &selected_tile_texpos); - long pathable_tile_texpos = 779; - long unpathable_tile_texpos = 782; + long pathable_tile_texpos = df::global::init->load_bar_texpos[1]; + long unpathable_tile_texpos = df::global::init->load_bar_texpos[4]; long on_off_texpos = Textures::getOnOffTexposStart(); if (on_off_texpos > 0) { pathable_tile_texpos = on_off_texpos + 0; From 899422aaf8291e7028d8b30d7316b1d1f3e90704 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 17:26:16 -0700 Subject: [PATCH 406/439] give widgets.TabBar default hotkeys --- docs/dev/Lua API.rst | 4 +++- library/lua/gui/widgets.lua | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 85e51d11d..db5a9d59c 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -5113,7 +5113,9 @@ This widget implements a set of one or more tabs to allow navigation between gro the width of the window and will continue rendering on the next line(s) if all tabs cannot fit on a single line. :key: Specifies a keybinding that can be used to switch to the next tab. -:key_back: Specifies a keybinding that can be used to switch to the previous tab. + Defaults to ``CUSTOM_CTRL_T``. +:key_back: Specifies a keybinding that can be used to switch to the previous + tab. Defaults to ``CUSTOM_CTRL_Y``. :labels: A table of strings; entry representing the label text for a single tab. The order of the entries determines the order the tabs will appear in. :on_select: Callback executed when a tab is selected. It receives the selected tab index as an argument. The provided function diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 7aa79cbc3..aa18d9fa9 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -2241,8 +2241,8 @@ TabBar.ATTRS{ active_tab_pens=DEFAULT_ACTIVE_TAB_PENS, inactive_tab_pens=DEFAULT_INACTIVE_TAB_PENS, get_pens=DEFAULT_NIL, - key=DEFAULT_NIL, - key_back=DEFAULT_NIL, + key='CUSTOM_CTRL_T', + key_back='CUSTOM_CTRL_Y', } function TabBar:init() From 1d24f812dd36ad4b43dd439e30931d1481d87416 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 17 May 2023 07:13:14 +0000 Subject: [PATCH 407/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 1ec3602f9..2554b931b 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 1ec3602f9d896c9dc76b26b3be845a5aa7544093 +Subproject commit 2554b931bfc23564de5bc7cb28eed673e82d06d3 From de2e29a2e3679b560edcec9bf7dec766bc0a43ba Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 17 May 2023 02:34:19 -0700 Subject: [PATCH 408/439] add github action to clean up PR caches after merge --- .github/workflows/clean-cache.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/clean-cache.yml diff --git a/.github/workflows/clean-cache.yml b/.github/workflows/clean-cache.yml new file mode 100644 index 000000000..309fae105 --- /dev/null +++ b/.github/workflows/clean-cache.yml @@ -0,0 +1,30 @@ +name: Clean up PR caches +on: + pull_request: + types: + - closed + +jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v3 + - name: Cleanup + run: | + gh extension install actions/gh-actions-cache + + REPO=${{ github.repository }} + BRANCH="refs/pull/${{ github.event.pull_request.number }}/merge" + + echo "Fetching list of cache keys" + cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH | cut -f 1) + + set +e + echo "Deleting caches..." + for cacheKey in $cacheKeysForPR; do + gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm + done + echo "Done" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ffe8de12928e9786431947a08bbd7f63b4bc067f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 17 May 2023 11:10:20 -0700 Subject: [PATCH 409/439] clean caches in root context, not the PR --- .github/workflows/clean-cache.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clean-cache.yml b/.github/workflows/clean-cache.yml index 309fae105..d3e12959d 100644 --- a/.github/workflows/clean-cache.yml +++ b/.github/workflows/clean-cache.yml @@ -1,6 +1,6 @@ name: Clean up PR caches on: - pull_request: + pull_request_target: types: - closed From 9d8a825eb4af1de095f425b4286c95186442bd18 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 15 May 2023 15:17:06 -0700 Subject: [PATCH 410/439] adjust usage to game structure reunification --- plugins/autolabor/autolabor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/autolabor/autolabor.cpp b/plugins/autolabor/autolabor.cpp index 53a01a6a6..72bb4d84e 100644 --- a/plugins/autolabor/autolabor.cpp +++ b/plugins/autolabor/autolabor.cpp @@ -34,8 +34,8 @@ #include #include #include +#include #include -#include #include @@ -51,7 +51,7 @@ using namespace df::enums; DFHACK_PLUGIN("autolabor"); REQUIRE_GLOBAL(plotinfo); REQUIRE_GLOBAL(world); -REQUIRE_GLOBAL(game_extra); +REQUIRE_GLOBAL(game); #define ARRAY_COUNT(array) (sizeof(array)/sizeof((array)[0])) @@ -414,7 +414,7 @@ static void enable_plugin(color_ostream &out) cleanup_state(); init_state(); - df::global::game_extra->external_flag |= 1; // shut down DF's work detail system + game->external_flag |= 1; // shut down DF's work detail system } DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) @@ -1084,7 +1084,7 @@ DFhackCExport command_result plugin_enable ( color_ostream &out, bool enable ) enable_autolabor = false; setOptionEnabled(CF_ENABLED, false); - df::global::game_extra->external_flag &= ~1; // reenable DF's work detail system + game->external_flag &= ~1; // reenable DF's work detail system out << "Autolabor is disabled." << std::endl; } From aa6baae834537db062f05fac2846af2c818afbae Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 17 May 2023 11:14:00 -0700 Subject: [PATCH 411/439] update structures ref --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 22d9bc0bc..9891be326 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 22d9bc0bc1847def8a6c62893104f36262e63e98 +Subproject commit 9891be32663435f2fe875e27c70010d5618de735 From 5c7d9f228d47a7c1a34a099309254703fcb916e5 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 17 May 2023 18:55:27 +0000 Subject: [PATCH 412/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 2554b931b..2a646f9c7 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 2554b931bfc23564de5bc7cb28eed673e82d06d3 +Subproject commit 2a646f9c7204253cae70bbfb5ed194182e0ac373 From 6aede45135c5b14d0c8cbfefb8540fd846d75e9c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 16 May 2023 12:05:53 -0700 Subject: [PATCH 413/439] add links to quickstart-guide and gui/control-panel to the title screen --- docs/changelog.txt | 1 + docs/plugins/overlay.rst | 7 +++++++ plugins/lua/overlay.lua | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index c9f9fca89..59974909e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -55,6 +55,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/design`: Improved performance for drawing shapes - Dreamfort: improve traffic patterns throughout the fortress (stockpiles and zones are still not working, pending updates in `quickfort`) - Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. +- `overlay`: added links to the quickstart guide and the control panel on the DF title screen ## Documentation diff --git a/docs/plugins/overlay.rst b/docs/plugins/overlay.rst index 313220fd4..fd196158f 100644 --- a/docs/plugins/overlay.rst +++ b/docs/plugins/overlay.rst @@ -66,3 +66,10 @@ For easy reference, the corners can be found at the following coordinates: :(-1, 1): top right corner :(1, -1): lower left corner :(-1, -1): lower right corner + +Overlay +------- + +The `overlay` plugin also provides a standard overlay itself: +``title_version``, which displays the DFHack version on the DF title screen, +along with quick links to `quickstart-guide` and `gui/control-panel`. diff --git a/plugins/lua/overlay.lua b/plugins/lua/overlay.lua index 9f41cb035..fda1edc95 100644 --- a/plugins/lua/overlay.lua +++ b/plugins/lua/overlay.lua @@ -580,7 +580,8 @@ TitleVersionOverlay.ATTRS{ default_pos={x=7, y=2}, default_enabled=true, viewscreens='title/Default', - frame={w=35, h=3}, + frame={w=35, h=5}, + autoarrange_subviews=1, } function TitleVersionOverlay:init() @@ -602,6 +603,20 @@ function TitleVersionOverlay:init() text=text, text_pen=COLOR_WHITE, }, + widgets.HotkeyLabel{ + frame={l=0}, + label='Quickstart guide', + auto_width=true, + key='STRING_A063', + on_activate=function() dfhack.run_script('quickstart-guide') end, + }, + widgets.HotkeyLabel{ + frame={l=0}, + label='Control panel', + auto_width=true, + key='STRING_A047', + on_activate=function() dfhack.run_script('gui/control-panel') end, + }, } end From d4f41141ef907f336c56197a9ac3be62e751eda7 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 17 May 2023 16:45:35 -0700 Subject: [PATCH 414/439] fix game_extra reference --- plugins/lua/autolabor.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lua/autolabor.lua b/plugins/lua/autolabor.lua index a468b30e1..a2c0e88cd 100644 --- a/plugins/lua/autolabor.lua +++ b/plugins/lua/autolabor.lua @@ -40,7 +40,7 @@ function AutolaborOverlay:init() end function AutolaborOverlay:render(dc) - if df.global.game_extra.external_flag ~= 1 then return end + if df.global.game.external_flag ~= 1 then return end AutolaborOverlay.super.render(self, dc) end From b9afb94ba6f5405d681ccb289419bf1e72f5d02e Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 18 May 2023 07:12:59 +0000 Subject: [PATCH 415/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 2a646f9c7..97557b923 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 2a646f9c7204253cae70bbfb5ed194182e0ac373 +Subproject commit 97557b9239a5ad8297f6a32651b78fd9dbb333ec From eb742a603dcc945a09181662c9ea9138b78f81ba Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 11:22:58 +0200 Subject: [PATCH 416/439] renamed XYZ_FRAME to FRAME_XYZ --- library/include/modules/Textures.h | 10 ++++---- library/lua/gui.lua | 33 +++++++++++++++--------- library/modules/Textures.cpp | 40 +++++++++++++++--------------- 3 files changed, 46 insertions(+), 37 deletions(-) diff --git a/library/include/modules/Textures.h b/library/include/modules/Textures.h index 95e628d5a..1664f6081 100644 --- a/library/include/modules/Textures.h +++ b/library/include/modules/Textures.h @@ -54,11 +54,11 @@ DFHACK_EXPORT long getControlPanelTexposStart(); /** * Get the first texpos for the DFHack borders. Each is a 7x3 grid. */ -DFHACK_EXPORT long getThinBordersTexposStart(); -DFHACK_EXPORT long getMediumBordersTexposStart(); -DFHACK_EXPORT long getBoldBordersTexposStart(); -DFHACK_EXPORT long getPanelBordersTexposStart(); -DFHACK_EXPORT long getWindowBordersTexposStart(); +DFHACK_EXPORT long getBorderThinTexposStart(); +DFHACK_EXPORT long getBorderMediumTexposStart(); +DFHACK_EXPORT long getBorderBoldTexposStart(); +DFHACK_EXPORT long getBorderPanelTexposStart(); +DFHACK_EXPORT long getBorderWindowTexposStart(); } } diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 7e991e1df..311edc1f3 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -905,7 +905,7 @@ local BASE_FRAME = { } local function make_frame(name, double_line) - local texpos = dfhack.textures['get'..name..'BordersTexposStart']() + local texpos = dfhack.textures['getBorder'..name..'TexposStart']() local tp = function(offset) if texpos == -1 then return nil end return texpos + offset @@ -923,17 +923,26 @@ local function make_frame(name, double_line) return frame end -WINDOW_FRAME = make_frame('Window', true) -PANEL_FRAME = make_frame('Panel', false) -MEDIUM_FRAME = make_frame('Medium', false) -BOLD_FRAME = make_frame('Bold', true) -INTERIOR_FRAME = make_frame('Thin', false) -INTERIOR_FRAME.signature_pen = false -INTERIOR_MEDIUM_FRAME = copyall(MEDIUM_FRAME) -INTERIOR_MEDIUM_FRAME.signature_pen = false +FRAME_WINDOW = make_frame('Window', true) +FRAME_PANEL = make_frame('Panel', false) +FRAME_MEDIUM = make_frame('Medium', false) +FRAME_BOLD = make_frame('Bold', true) +FRAME_INTERIOR = make_frame('Thin', false) +FRAME_INTERIOR.signature_pen = false +FRAME_INTERIOR_MEDIUM = copyall(FRAME_MEDIUM) +FRAME_INTERIOR_MEDIUM.signature_pen = false -- for compatibility with pre-steam code -GREY_LINE_FRAME = WINDOW_FRAME +GREY_LINE_FRAME = FRAME_PANEL + +-- for compatibility with deprecated frame naming scheme +WINDOW_FRAME = FRAME_WINDOW +PANEL_FRAME = FRAME_PANEL +MEDIUM_FRAME = FRAME_MEDIUM +BOLD_FRAME = FRAME_BOLD +INTERIOR_FRAME = FRAME_INTERIOR +INTERIOR_MEDIUM_FRAME = FRAME_INTERIOR_MEDIUM + function paint_frame(dc,rect,style,title,inactive,pause_forced,resizable) local pen = style.frame_pen @@ -942,8 +951,8 @@ function paint_frame(dc,rect,style,title,inactive,pause_forced,resizable) dscreen.paintTile(style.rt_frame_pen or pen, x2, y1) dscreen.paintTile(style.lb_frame_pen or pen, x1, y2) local rb_frame_pen = style.rb_frame_pen - if rb_frame_pen == WINDOW_FRAME.rb_frame_pen and not resizable then - rb_frame_pen = PANEL_FRAME.rb_frame_pen + if rb_frame_pen == FRAME_WINDOW.rb_frame_pen and not resizable then + rb_frame_pen = FRAME_PANEL.rb_frame_pen end dscreen.paintTile(rb_frame_pen or pen, x2, y2) dscreen.fillRect(style.t_frame_pen or style.h_frame_pen or pen,x1+1,y1,x2-1,y1) diff --git a/library/modules/Textures.cpp b/library/modules/Textures.cpp index a30f879a0..40339a616 100644 --- a/library/modules/Textures.cpp +++ b/library/modules/Textures.cpp @@ -24,11 +24,11 @@ static long g_red_pin_texpos_start = -1; static long g_icons_texpos_start = -1; static long g_on_off_texpos_start = -1; static long g_control_panel_texpos_start = -1; -static long g_thin_borders_texpos_start = -1; -static long g_medium_borders_texpos_start = -1; -static long g_bold_borders_texpos_start = -1; -static long g_panel_borders_texpos_start = -1; -static long g_window_borders_texpos_start = -1; +static long g_border_thin_texpos_start = -1; +static long g_border_medium_texpos_start = -1; +static long g_border_bold_texpos_start = -1; +static long g_border_panel_texpos_start = -1; +static long g_border_window_texpos_start = -1; // Converts an arbitrary Surface to something like the display format // (32-bit RGBA), and converts magenta to transparency if convert_magenta is set @@ -132,15 +132,15 @@ void Textures::init(color_ostream &out) { g_num_dfhack_textures += load_textures(out, "hack/data/art/control-panel.png", &g_control_panel_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-thin.png", - &g_thin_borders_texpos_start); + &g_border_thin_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-medium.png", - &g_medium_borders_texpos_start); + &g_border_medium_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-bold.png", - &g_bold_borders_texpos_start); + &g_border_bold_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-panel.png", - &g_panel_borders_texpos_start); + &g_border_panel_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-window.png", - &g_window_borders_texpos_start); + &g_border_window_texpos_start); DEBUG(textures,out).print("loaded %ld textures\n", g_num_dfhack_textures); @@ -197,22 +197,22 @@ long Textures::getControlPanelTexposStart() { return g_control_panel_texpos_start; } -long Textures::getThinBordersTexposStart() { - return g_thin_borders_texpos_start; +long Textures::getBorderThinTexposStart() { + return g_border_thin_texpos_start; } -long Textures::getMediumBordersTexposStart() { - return g_medium_borders_texpos_start; +long Textures::getBorderMediumTexposStart() { + return g_border_medium_texpos_start; } -long Textures::getBoldBordersTexposStart() { - return g_bold_borders_texpos_start; +long Textures::getBorderBoldTexposStart() { + return g_border_bold_texpos_start; } -long Textures::getPanelBordersTexposStart() { - return g_panel_borders_texpos_start; +long Textures::getBorderPanelTexposStart() { + return g_border_panel_texpos_start; } -long Textures::getWindowBordersTexposStart() { - return g_window_borders_texpos_start; +long Textures::getBorderWindowTexposStart() { + return g_border_window_texpos_start; } From 90fe6e7ae34132a8aa1670ae6d0cb7189a1cfd6c Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 11:30:21 +0200 Subject: [PATCH 417/439] swapped any instance of 'border' being after 'xyz', everywhere --- docs/dev/Lua API.rst | 16 ++++++++-------- library/LuaApi.cpp | 10 +++++----- plugins/lua/buildingplan/pens.lua | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 1d70647f7..6fb2aca2c 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4347,32 +4347,32 @@ A framed screen has the following attributes: There are the following predefined frame style tables: -* ``WINDOW_FRAME`` +* ``FRAME_WINDOW`` A frame suitable for a draggable, optionally resizable window. -* ``PANEL_FRAME`` +* ``FRAME_PANEL`` A frame suitable for a static (non-draggable, non-resizable) panel. -* ``MEDIUM_FRAME`` +* ``FRAME_MEDIUM`` A frame suitable for overlay widget panels. -* ``BOLD_FRAME`` +* ``FRAME_BOLD`` A frame suitable for a non-draggable panel meant to capture the user's focus, like an important notification, confirmation dialog or error message. -* ``INTERIOR_FRAME`` +* ``FRAME_INTERIOR`` A frame suitable for light interior accent elements. This frame does *not* have a visible ``DFHack`` signature on it, so it must not be used as the most external frame for a DFHack-owned UI. -* ``INTERIOR_MEDIUM_FRAME`` +* ``FRAME_INTERIOR_MEDIUM`` - A copy of ``MEDIUM_FRAME`` that lacks the ``DFHack`` signature. Suitable for + A copy of ``FRAME_MEDIUM`` that lacks the ``DFHack`` signature. Suitable for panels that are part of a larger widget cluster. Must *not* be used as the most external frame for a DFHack-owned UI. @@ -4509,7 +4509,7 @@ Has attributes: by 1. The attributes are identical to what is defined in the `FramedScreen class`_. When using the predefined frame styles in the ``gui`` module, remember to ``require`` the gui module and prefix the identifier with - ``gui.``, e.g. ``gui.GREY_LINE_FRAME``. + ``gui.``, e.g. ``gui.FRAME_GREY_LINE``. Has functions: diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 08903c7bd..d21ce29e5 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1716,11 +1716,11 @@ static const LuaWrapper::FunctionReg dfhack_textures_module[] = { WRAPM(Textures, getIconsTexposStart), WRAPM(Textures, getOnOffTexposStart), WRAPM(Textures, getControlPanelTexposStart), - WRAPM(Textures, getThinBordersTexposStart), - WRAPM(Textures, getMediumBordersTexposStart), - WRAPM(Textures, getBoldBordersTexposStart), - WRAPM(Textures, getPanelBordersTexposStart), - WRAPM(Textures, getWindowBordersTexposStart), + WRAPM(Textures, getBorderThinTexposStart), + WRAPM(Textures, getBorderMediumTexposStart), + WRAPM(Textures, getBorderBoldTexposStart), + WRAPM(Textures, getBorderPanelTexposStart), + WRAPM(Textures, getBorderWindowTexposStart), { NULL, NULL } }; diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index e69a4c210..c68e12eae 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -18,12 +18,12 @@ function reload_pens() GOOD_TILE_PEN = to_pen{ch='o', fg=COLOR_GREEN, tile=dfhack.screen.findGraphicsTile('CURSORS', 1, 2)} BAD_TILE_PEN = to_pen{ch='X', fg=COLOR_RED, tile=dfhack.screen.findGraphicsTile('CURSORS', 3, 0)} - local tb_texpos = dfhack.textures.getThinBordersTexposStart() + local tb_texpos = dfhack.textures.getBorderThinTexposStart() VERT_TOP_PEN = to_pen{tile=tp(tb_texpos, 10), ch=194, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=193, fg=COLOR_GREY, bg=COLOR_BLACK} - local mb_texpos = dfhack.textures.getMediumBordersTexposStart() + local mb_texpos = dfhack.textures.getBorderMediumTexposStart() HORI_LEFT_PEN = to_pen{tile=tp(mb_texpos, 12), ch=195, fg=COLOR_GREY, bg=COLOR_BLACK} HORI_MID_PEN = to_pen{tile=tp(mb_texpos, 5), ch=196, fg=COLOR_GREY, bg=COLOR_BLACK} HORI_RIGHT_PEN = to_pen{tile=tp(mb_texpos, 13), ch=180, fg=COLOR_GREY, bg=COLOR_BLACK} From c52b1cc950b3e55b27050740fb3f037d45918c09 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 12:46:21 +0200 Subject: [PATCH 418/439] reverted to just renaming FRAMES in gui.lua --- library/LuaApi.cpp | 10 ++++---- library/include/modules/Textures.h | 10 ++++---- library/lua/gui.lua | 2 +- library/modules/Textures.cpp | 40 +++++++++++++++--------------- plugins/lua/buildingplan/pens.lua | 4 +-- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index d21ce29e5..08903c7bd 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1716,11 +1716,11 @@ static const LuaWrapper::FunctionReg dfhack_textures_module[] = { WRAPM(Textures, getIconsTexposStart), WRAPM(Textures, getOnOffTexposStart), WRAPM(Textures, getControlPanelTexposStart), - WRAPM(Textures, getBorderThinTexposStart), - WRAPM(Textures, getBorderMediumTexposStart), - WRAPM(Textures, getBorderBoldTexposStart), - WRAPM(Textures, getBorderPanelTexposStart), - WRAPM(Textures, getBorderWindowTexposStart), + WRAPM(Textures, getThinBordersTexposStart), + WRAPM(Textures, getMediumBordersTexposStart), + WRAPM(Textures, getBoldBordersTexposStart), + WRAPM(Textures, getPanelBordersTexposStart), + WRAPM(Textures, getWindowBordersTexposStart), { NULL, NULL } }; diff --git a/library/include/modules/Textures.h b/library/include/modules/Textures.h index 1664f6081..95e628d5a 100644 --- a/library/include/modules/Textures.h +++ b/library/include/modules/Textures.h @@ -54,11 +54,11 @@ DFHACK_EXPORT long getControlPanelTexposStart(); /** * Get the first texpos for the DFHack borders. Each is a 7x3 grid. */ -DFHACK_EXPORT long getBorderThinTexposStart(); -DFHACK_EXPORT long getBorderMediumTexposStart(); -DFHACK_EXPORT long getBorderBoldTexposStart(); -DFHACK_EXPORT long getBorderPanelTexposStart(); -DFHACK_EXPORT long getBorderWindowTexposStart(); +DFHACK_EXPORT long getThinBordersTexposStart(); +DFHACK_EXPORT long getMediumBordersTexposStart(); +DFHACK_EXPORT long getBoldBordersTexposStart(); +DFHACK_EXPORT long getPanelBordersTexposStart(); +DFHACK_EXPORT long getWindowBordersTexposStart(); } } diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 311edc1f3..d511cd51f 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -905,7 +905,7 @@ local BASE_FRAME = { } local function make_frame(name, double_line) - local texpos = dfhack.textures['getBorder'..name..'TexposStart']() + local texpos = dfhack.textures['get'..name..'BordersTexposStart']() local tp = function(offset) if texpos == -1 then return nil end return texpos + offset diff --git a/library/modules/Textures.cpp b/library/modules/Textures.cpp index 40339a616..a30f879a0 100644 --- a/library/modules/Textures.cpp +++ b/library/modules/Textures.cpp @@ -24,11 +24,11 @@ static long g_red_pin_texpos_start = -1; static long g_icons_texpos_start = -1; static long g_on_off_texpos_start = -1; static long g_control_panel_texpos_start = -1; -static long g_border_thin_texpos_start = -1; -static long g_border_medium_texpos_start = -1; -static long g_border_bold_texpos_start = -1; -static long g_border_panel_texpos_start = -1; -static long g_border_window_texpos_start = -1; +static long g_thin_borders_texpos_start = -1; +static long g_medium_borders_texpos_start = -1; +static long g_bold_borders_texpos_start = -1; +static long g_panel_borders_texpos_start = -1; +static long g_window_borders_texpos_start = -1; // Converts an arbitrary Surface to something like the display format // (32-bit RGBA), and converts magenta to transparency if convert_magenta is set @@ -132,15 +132,15 @@ void Textures::init(color_ostream &out) { g_num_dfhack_textures += load_textures(out, "hack/data/art/control-panel.png", &g_control_panel_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-thin.png", - &g_border_thin_texpos_start); + &g_thin_borders_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-medium.png", - &g_border_medium_texpos_start); + &g_medium_borders_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-bold.png", - &g_border_bold_texpos_start); + &g_bold_borders_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-panel.png", - &g_border_panel_texpos_start); + &g_panel_borders_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/border-window.png", - &g_border_window_texpos_start); + &g_window_borders_texpos_start); DEBUG(textures,out).print("loaded %ld textures\n", g_num_dfhack_textures); @@ -197,22 +197,22 @@ long Textures::getControlPanelTexposStart() { return g_control_panel_texpos_start; } -long Textures::getBorderThinTexposStart() { - return g_border_thin_texpos_start; +long Textures::getThinBordersTexposStart() { + return g_thin_borders_texpos_start; } -long Textures::getBorderMediumTexposStart() { - return g_border_medium_texpos_start; +long Textures::getMediumBordersTexposStart() { + return g_medium_borders_texpos_start; } -long Textures::getBorderBoldTexposStart() { - return g_border_bold_texpos_start; +long Textures::getBoldBordersTexposStart() { + return g_bold_borders_texpos_start; } -long Textures::getBorderPanelTexposStart() { - return g_border_panel_texpos_start; +long Textures::getPanelBordersTexposStart() { + return g_panel_borders_texpos_start; } -long Textures::getBorderWindowTexposStart() { - return g_border_window_texpos_start; +long Textures::getWindowBordersTexposStart() { + return g_window_borders_texpos_start; } diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index c68e12eae..e69a4c210 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -18,12 +18,12 @@ function reload_pens() GOOD_TILE_PEN = to_pen{ch='o', fg=COLOR_GREEN, tile=dfhack.screen.findGraphicsTile('CURSORS', 1, 2)} BAD_TILE_PEN = to_pen{ch='X', fg=COLOR_RED, tile=dfhack.screen.findGraphicsTile('CURSORS', 3, 0)} - local tb_texpos = dfhack.textures.getBorderThinTexposStart() + local tb_texpos = dfhack.textures.getThinBordersTexposStart() VERT_TOP_PEN = to_pen{tile=tp(tb_texpos, 10), ch=194, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=193, fg=COLOR_GREY, bg=COLOR_BLACK} - local mb_texpos = dfhack.textures.getBorderMediumTexposStart() + local mb_texpos = dfhack.textures.getMediumBordersTexposStart() HORI_LEFT_PEN = to_pen{tile=tp(mb_texpos, 12), ch=195, fg=COLOR_GREY, bg=COLOR_BLACK} HORI_MID_PEN = to_pen{tile=tp(mb_texpos, 5), ch=196, fg=COLOR_GREY, bg=COLOR_BLACK} HORI_RIGHT_PEN = to_pen{tile=tp(mb_texpos, 13), ch=180, fg=COLOR_GREY, bg=COLOR_BLACK} From ff498fcc586c37e9464f5e682db0bcc32b4a9114 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 12:50:25 +0200 Subject: [PATCH 419/439] fixed overly aggressive FRAME renaming in docs --- docs/dev/Lua API.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 6fb2aca2c..52ca4d935 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4509,7 +4509,7 @@ Has attributes: by 1. The attributes are identical to what is defined in the `FramedScreen class`_. When using the predefined frame styles in the ``gui`` module, remember to ``require`` the gui module and prefix the identifier with - ``gui.``, e.g. ``gui.FRAME_GREY_LINE``. + ``gui.``, e.g. ``gui.GREY_LINE_FRAME``. Has functions: From 58519890b6eda1f29b9f1dc8ddc3c03164ebe38e Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 13:13:56 +0200 Subject: [PATCH 420/439] added changelog entry --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index c9f9fca89..cc717d0bf 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -62,6 +62,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. +- `gui.lua`: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. From c224a534355154173f8b73b6d44cfaa47c0e5da8 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 13:21:18 +0200 Subject: [PATCH 421/439] fixed changelog entry... --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index cc717d0bf..4baa5e54f 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -62,7 +62,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. -- `gui.lua`: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) +- ``gui.lua``: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. From 69612bde0f76cdb0656a6b30e0850a5de966022b Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 13:27:27 +0200 Subject: [PATCH 422/439] ATTEMPTING to fix changelog entry... --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4baa5e54f..9495658d9 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -62,7 +62,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. -- ``gui.lua``: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) +- `gui`: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. From e7eb664eadde01c29e18c42ae13a80a0044d6a04 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 13:29:26 +0200 Subject: [PATCH 423/439] ATTEMPTING to fix changelog entry... AGAIN --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 9495658d9..3d9ca0356 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -62,7 +62,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. -- `gui`: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) +- gui.lua: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. From 4cf88a1f8e68b03bf71de050a96567913aa235bb Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Thu, 18 May 2023 13:52:07 +0200 Subject: [PATCH 424/439] actually fixed changelog entry..? --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 3d9ca0356..c8ccdec15 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -62,7 +62,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. -- gui.lua: changed frame naming scheme to `FRAME_X` rather than `X_FRAME`, and added aliases for backwards compatibility. (for example `BOLD_FRAME` is now called `FRAME_BOLD`) +- ``gui.lua``: changed frame naming scheme to ``FRAME_X`` rather than ``X_FRAME``, and added aliases for backwards compatibility. (for example ``BOLD_FRAME`` is now called ``FRAME_BOLD``) ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. From afcbee48ddf1b67073993a9223e0c22a1152ffe9 Mon Sep 17 00:00:00 2001 From: TaxiService Date: Thu, 18 May 2023 19:28:30 +0200 Subject: [PATCH 425/439] Update docs/changelog.txt Co-authored-by: Myk --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index c8ccdec15..832a81c56 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -62,7 +62,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. -- ``gui.lua``: changed frame naming scheme to ``FRAME_X`` rather than ``X_FRAME``, and added aliases for backwards compatibility. (for example ``BOLD_FRAME`` is now called ``FRAME_BOLD``) +- ``gui``: changed frame naming scheme to ``FRAME_X`` rather than ``X_FRAME``, and added aliases for backwards compatibility. (for example ``BOLD_FRAME`` is now called ``FRAME_BOLD``) ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. From 9928ea874abe18ca577d3214378f69259f4e4298 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 17 May 2023 17:26:33 -0700 Subject: [PATCH 426/439] transfer Ctrl-H keybinding to gui/autodump --- data/init/dfhack.keybindings.init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/init/dfhack.keybindings.init b/data/init/dfhack.keybindings.init index 0fc596215..f677ca301 100644 --- a/data/init/dfhack.keybindings.init +++ b/data/init/dfhack.keybindings.init @@ -43,8 +43,8 @@ keybinding add Ctrl-C spotclean # destroy the selected item keybinding add Ctrl-K@dwarfmode autodump-destroy-item -# destroy items designated for dump in the selected tile -keybinding add Ctrl-H@dwarfmode autodump-destroy-here +# bring up the autodump UI +keybinding add Ctrl-H@dwarfmode gui/autodump # apply blueprints to the map keybinding add Ctrl-Shift-Q@dwarfmode gui/quickfort From ee5553358e536bc97be7b9f7aa82a376a3e29626 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 17 May 2023 17:28:35 -0700 Subject: [PATCH 427/439] update changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 832a81c56..64d491906 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -55,6 +55,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/design`: Improved performance for drawing shapes - Dreamfort: improve traffic patterns throughout the fortress (stockpiles and zones are still not working, pending updates in `quickfort`) - Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. +- `gui/autodump`: fort-mode keybinding: Ctrl-H ## Documentation From 796eb331ff4992de64e53c8021506631f178295c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 11:01:16 -0700 Subject: [PATCH 428/439] update scripts head --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 97557b923..0f02ade81 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 97557b9239a5ad8297f6a32651b78fd9dbb333ec +Subproject commit 0f02ade81771a7c24a4bbd6cfd7969704288f94b From 73f6c66c3e484451335cb4c266031d3776cf22bb Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 11:13:47 -0700 Subject: [PATCH 429/439] bump version to 50.08-r2rc1 --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d1d4c562..c1560c630 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,8 +192,8 @@ endif() # set up versioning. set(DF_VERSION "50.08") -set(DFHACK_RELEASE "r1") -set(DFHACK_PRERELEASE FALSE) +set(DFHACK_RELEASE "r2rc1") +set(DFHACK_PRERELEASE TRUE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") From 1212ee0ef8bd60cacd2b05fc8f3afb96ef1d11fb Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 14:06:00 -0700 Subject: [PATCH 430/439] retrieve steam SDK from a private repo --- .github/workflows/build.yml | 15 +++++---- .github/workflows/steam.yml | 13 ++++---- package/windows/CMakeLists.txt | 60 +++++++++++++++------------------- 3 files changed, 42 insertions(+), 46 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 131c21743..94aa49452 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,12 +72,6 @@ jobs: # - name: Download DF # run: | # sh ci/download-df.sh - - name: Restore steam SDK - uses: actions/cache@v3 - with: - path: depends/steam - key: steam-sdk-156 - enableCrossOsArchive: true - name: Configure DFHack env: CC: gcc-${{ matrix.gcc }} @@ -145,6 +139,13 @@ jobs: with: submodules: true fetch-depth: 0 + - name: Get 3rd party SDKs + uses: actions/checkout@v3 + with: + repository: DFHack/3rdparty + ref: main + token: ${{ secrets.DFHACK_3RDPARTY_TOKEN }} + path: depends - name: Fetch ccache uses: actions/cache@v3 with: @@ -155,7 +156,7 @@ jobs: ccache-win64-cross-msvc - name: Cross-compile win64 artifacts env: - CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1' + CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1 -DBUILD_DFLAUNCH:BOOL=1' run: | cd build bash -x build-win64-from-linux.sh diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 5210b3a11..4f785969a 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -32,6 +32,13 @@ jobs: submodules: true fetch-depth: 0 ref: ${{ github.event.inputs.commit_hash }} + - name: Get 3rd party SDKs + uses: actions/checkout@v3 + with: + repository: DFHack/3rdparty + ref: main + token: ${{ secrets.DFHACK_3RDPARTY_TOKEN }} + path: depends - name: Fetch ccache uses: actions/cache@v3 with: @@ -40,12 +47,6 @@ jobs: restore-keys: | ccache-win64-cross-msvc-${{ github.event.inputs.commit_hash }} ccache-win64-cross-msvc - - name: Restore steam SDK - uses: actions/cache@v3 - with: - path: depends/steam - key: steam-sdk-156 - enableCrossOsArchive: true - name: Cross-compile win64 artifacts env: CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1 -DBUILD_DFLAUNCH:BOOL=1' diff --git a/package/windows/CMakeLists.txt b/package/windows/CMakeLists.txt index d92d687c4..ad5469c6b 100644 --- a/package/windows/CMakeLists.txt +++ b/package/windows/CMakeLists.txt @@ -1,38 +1,32 @@ project(package_windows) -if(WIN32) - if (BUILD_DFLAUNCH) - if ((DEFINED ENV{steam_username}) AND (DEFINED ENV{steam_password})) - # download Steam SDK - set (STEAMAPI_DIR ${dfhack_SOURCE_DIR}/depends/steam) - file(DOWNLOAD "https://partner.steamgames.com/downloads/steamworks_sdk_156.zip" - ${STEAMAPI_DIR}/steamworks_sdk_156.zip - EXPECTED_HASH MD5=af5a579990dbe5ae4c1b0689260d001b - USERPWD $ENV{steam_username}:$ENV{steam_password} - STATUS STEAM_SDK_DOWNLOAD_STATUS - SHOW_PROGRESS - ) - list(GET STEAM_SDK_DOWNLOAD_STATUS 0 STEAM_SDK_DL_STATUS_CODE) - list(GET STEAM_SDK_DOWNLOAD_STATUS 1 STEAM_SDK_DL_ERROR_MESSAGE) - if (NOT (${STEAM_SDK_DL_STATUS_CODE} EQUAL 0)) - message(FATAL_ERROR "Steam SDK download: " ${STEAM_SDK_DL_ERROR_MESSAGE}) - else () - message(STATUS "Steam SDK download: " ${STEAM_SDK_DL_ERROR_MESSAGE}) - file(ARCHIVE_EXTRACT - INPUT ${STEAMAPI_DIR}/steamworks_sdk_156.zip - DESTINATION ${STEAMAPI_DIR}) - set(STEAMAPI_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.lib") - set(STEAMAPI_SOURCE_DIR "${STEAMAPI_DIR}/sdk/public/steam") - set(STEAMAPI_SHARED_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.dll") - endif() - else() - message(SEND_ERROR "Need to set steam_username and steam_password in environment to download Steamworks SDK") - endif() +option(BUILD_DFLAUNCH "Whether to build the Steam launcher exectuable (requires Steam SDK)." OFF) - include_directories(${STEAMAPI_SOURCE_DIR}) - link_libraries(${STEAMAPI_LIBRARY}) - add_executable(launchdf WIN32 launchdf.cpp) - install(TARGETS launchdf DESTINATION ${DFHACK_DATA_DESTINATION}) - install(FILES ${STEAMAPI_SHARED_LIBRARY} DESTINATION ${DFHACK_DATA_DESTINATION}) +if(WIN32 AND BUILD_DFLAUNCH) + # builder must manually download Steam SDK + set (STEAMAPI_DIR ${dfhack_SOURCE_DIR}/depends/steam) + set (STEAMAPI_VER 156) + set (STEAMAPI_ZIP_EXPECTED_HASH af5a579990dbe5ae4c1b0689260d001b) + set (STEAMSDK_ZIP ${STEAMAPI_DIR}/steamworks_sdk_${STEAMAPI_VER}.zip) + + set (STEAM_SDK_HASH "NOT FOUND") + file(MD5 ${STEAMSDK_ZIP} STEAM_SDK_HASH) + if (NOT (${STEAM_SDK_HASH} STREQUAL ${STEAMAPI_ZIP_EXPECTED_HASH})) + message(FATAL_ERROR "You need the Steamworks SDK at ${STEAMSDK_ZIP} to build launchdf.exe. Please disable the BUILD_DFLAUNCH CMake option or download the Steam SDK from: https://partner.steamgames.com/downloads/steamworks_sdk_${STEAMAPI_VER}.zip") + endif() + if (${STEAMSDK_ZIP} IS_NEWER_THAN ${STEAMAPI_DIR}/sdk) + file(ARCHIVE_EXTRACT + INPUT ${STEAMSDK_ZIP} + DESTINATION ${STEAMAPI_DIR}) endif() + + set(STEAMAPI_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.lib") + set(STEAMAPI_SOURCE_DIR "${STEAMAPI_DIR}/sdk/public/steam") + set(STEAMAPI_SHARED_LIBRARY "${STEAMAPI_DIR}/sdk/redistributable_bin/win64/steam_api64.dll") + + include_directories(${STEAMAPI_SOURCE_DIR}) + link_libraries(${STEAMAPI_LIBRARY}) + add_executable(launchdf WIN32 launchdf.cpp) + install(TARGETS launchdf DESTINATION ${DFHACK_DATA_DESTINATION}) + install(FILES ${STEAMAPI_SHARED_LIBRARY} DESTINATION ${DFHACK_DATA_DESTINATION}) endif() From 14bbff85376cbdf412aadde12dcc1a750c0eb57f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 14:39:49 -0700 Subject: [PATCH 431/439] secrets can't be accessed from PRs; remove from build action --- .github/workflows/build.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 94aa49452..9aed03c17 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -139,13 +139,6 @@ jobs: with: submodules: true fetch-depth: 0 - - name: Get 3rd party SDKs - uses: actions/checkout@v3 - with: - repository: DFHack/3rdparty - ref: main - token: ${{ secrets.DFHACK_3RDPARTY_TOKEN }} - path: depends - name: Fetch ccache uses: actions/cache@v3 with: @@ -156,7 +149,7 @@ jobs: ccache-win64-cross-msvc - name: Cross-compile win64 artifacts env: - CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1 -DBUILD_DFLAUNCH:BOOL=1' + CMAKE_EXTRA_ARGS: '-DBUILD_STONESENSE:BOOL=1' run: | cd build bash -x build-win64-from-linux.sh From b6ee0d5c02cb620cf6f466fa2f860abfa600ca19 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 14:59:08 -0700 Subject: [PATCH 432/439] follow advice in actions/checkout#664 --- .github/workflows/steam.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 4f785969a..5ca1ebe8d 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -32,6 +32,7 @@ jobs: submodules: true fetch-depth: 0 ref: ${{ github.event.inputs.commit_hash }} + persist-credentials: false - name: Get 3rd party SDKs uses: actions/checkout@v3 with: From 09621809812812238057b2913766ef4141b90f8f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 15:10:15 -0700 Subject: [PATCH 433/439] attempting as an ssh-key instead of a token --- .github/workflows/steam.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 5ca1ebe8d..7f4c58afe 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -32,13 +32,12 @@ jobs: submodules: true fetch-depth: 0 ref: ${{ github.event.inputs.commit_hash }} - persist-credentials: false - name: Get 3rd party SDKs uses: actions/checkout@v3 with: repository: DFHack/3rdparty ref: main - token: ${{ secrets.DFHACK_3RDPARTY_TOKEN }} + ssh-key: ${{ secrets.DFHACK_3RDPARTY_TOKEN }} path: depends - name: Fetch ccache uses: actions/cache@v3 From b2102d66fa3668eeb3e62f3ef07433553291bf7b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 16:16:24 -0700 Subject: [PATCH 434/439] check out repo directly in steam dir so we don't bork the rest of depends --- .github/workflows/steam.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml index 7f4c58afe..46dd27270 100644 --- a/.github/workflows/steam.yml +++ b/.github/workflows/steam.yml @@ -38,7 +38,7 @@ jobs: repository: DFHack/3rdparty ref: main ssh-key: ${{ secrets.DFHACK_3RDPARTY_TOKEN }} - path: depends + path: depends/steam - name: Fetch ccache uses: actions/cache@v3 with: From d4e8d3399b34f84b22508baf752e9139e936cdd5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 18 May 2023 16:56:22 -0700 Subject: [PATCH 435/439] remove cursor guard from autodump so autodump destroy can work --- docs/changelog.txt | 1 + plugins/autodump.cpp | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 64d491906..eeeaf269e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -49,6 +49,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `autolabor`: work detail override warning now only appears on the work details screen ## Misc Improvements +- `autodump`: no longer checks for a keyboard cursor before executing, so ``autodump destroy`` (which doesn't require a cursor) can still function - `orders`: update orders in orders library for prepared meals, bins, archer uniforms, and weapons - Terminal console no longer appears in front of the game window on startup - `gui/control-panel`: new preference for whether filters in lists search for substrings in the middle of words (e.g. if set to true, then "ee" will match "steel") diff --git a/plugins/autodump.cpp b/plugins/autodump.cpp index 2514dd91a..839b3b727 100644 --- a/plugins/autodump.cpp +++ b/plugins/autodump.cpp @@ -280,8 +280,7 @@ DFhackCExport command_result plugin_init ( color_ostream &out, vector Date: Fri, 19 May 2023 12:12:52 -0700 Subject: [PATCH 436/439] Update widgets.lua --- library/lua/gui/widgets.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 6610dcedb..26c949805 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1664,9 +1664,9 @@ function List:setChoices(choices, selected) -- Check if page_top needs to be adjusted if #self.choices - self.page_size < 0 then self.page_top = 1 - elseif self.selected <= math.floor(self.page_size / 2) then + elseif self.selected <= (self.page_size // 2) then self.page_top = 1 - elseif self.selected >= #self.choices - math.floor(self.page_size / 2) then + elseif self.selected >= #self.choices - (self.page_size // 2) then self.page_top = #self.choices - self.page_size + 1 end end @@ -1709,7 +1709,7 @@ local function update_list_scrollbar(list) end function List:postComputeFrame(body) - local row_count = math.floor(body.height / self.row_height) + local row_count = body.height // self.row_height self.page_size = math.max(1, row_count) local num_choices = #self.choices From 3729d7daa4ccba9b5772382df7ac35209276843d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 19 May 2023 19:41:02 -0700 Subject: [PATCH 437/439] encode transmitted names in utf-8 --- docs/changelog.txt | 1 + .../remotefortressreader.cpp | 34 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 76105e9b5..60d858551 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -47,6 +47,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - DFHack screen backgrounds now use appropriate tiles in DF Classic - RemoteServer: fix crash on malformed json in ``dfhack-config/remote-server.json`` - `autolabor`: work detail override warning now only appears on the work details screen +- `RemoteFortressReader`: ensured names are transmitted in UTF-8 instead of CP437 ## Misc Improvements - `autodump`: no longer checks for a keyboard cursor before executing, so ``autodump destroy`` (which doesn't require a cursor) can still function diff --git a/plugins/remotefortressreader/remotefortressreader.cpp b/plugins/remotefortressreader/remotefortressreader.cpp index 061cf2698..ec478c632 100644 --- a/plugins/remotefortressreader/remotefortressreader.cpp +++ b/plugins/remotefortressreader/remotefortressreader.cpp @@ -808,8 +808,6 @@ static command_result GetMaterialList(color_ostream &stream, const EmptyMessage return CR_OK; } - - df::world_raws *raws = &world->raws; // df::world_history *history = &world->history; MaterialInfo mat; @@ -820,7 +818,7 @@ static command_result GetMaterialList(color_ostream &stream, const EmptyMessage mat_def->mutable_mat_pair()->set_mat_type(0); mat_def->mutable_mat_pair()->set_mat_index(i); mat_def->set_id(mat.getToken()); - mat_def->set_name(mat.toString()); //find the name at cave temperature; + mat_def->set_name(DF2UTF(mat.toString())); //find the name at cave temperature; if (size_t(raws->inorganics[i]->material.state_color[GetState(&raws->inorganics[i]->material)]) < raws->descriptors.colors.size()) { ConvertDFColorDescriptor(raws->inorganics[i]->material.state_color[GetState(&raws->inorganics[i]->material)], mat_def->mutable_state_color()); @@ -838,7 +836,7 @@ static command_result GetMaterialList(color_ostream &stream, const EmptyMessage mat_def->mutable_mat_pair()->set_mat_type(i); mat_def->mutable_mat_pair()->set_mat_index(j); mat_def->set_id(mat.getToken()); - mat_def->set_name(mat.toString()); //find the name at cave temperature; + mat_def->set_name(DF2UTF(mat.toString())); //find the name at cave temperature; if (size_t(raws->mat_table.builtin[i]->state_color[GetState(raws->mat_table.builtin[i])]) < raws->descriptors.colors.size()) { ConvertDFColorDescriptor(raws->mat_table.builtin[i]->state_color[GetState(raws->mat_table.builtin[i])], mat_def->mutable_state_color()); @@ -855,7 +853,7 @@ static command_result GetMaterialList(color_ostream &stream, const EmptyMessage mat_def->mutable_mat_pair()->set_mat_type(j + 19); mat_def->mutable_mat_pair()->set_mat_index(i); mat_def->set_id(mat.getToken()); - mat_def->set_name(mat.toString()); //find the name at cave temperature; + mat_def->set_name(DF2UTF(mat.toString())); //find the name at cave temperature; if (size_t(creature->material[j]->state_color[GetState(creature->material[j])]) < raws->descriptors.colors.size()) { ConvertDFColorDescriptor(creature->material[j]->state_color[GetState(creature->material[j])], mat_def->mutable_state_color()); @@ -872,7 +870,7 @@ static command_result GetMaterialList(color_ostream &stream, const EmptyMessage mat_def->mutable_mat_pair()->set_mat_type(j + 419); mat_def->mutable_mat_pair()->set_mat_index(i); mat_def->set_id(mat.getToken()); - mat_def->set_name(mat.toString()); //find the name at cave temperature; + mat_def->set_name(DF2UTF(mat.toString())); //find the name at cave temperature; if (size_t(plant->material[j]->state_color[GetState(plant->material[j])]) < raws->descriptors.colors.size()) { ConvertDFColorDescriptor(plant->material[j]->state_color[GetState(plant->material[j])], mat_def->mutable_state_color()); @@ -903,7 +901,7 @@ static command_result GetGrowthList(color_ostream &stream, const EmptyMessage *i continue; MaterialDefinition * basePlant = out->add_material_list(); basePlant->set_id(pp->id + ":BASE"); - basePlant->set_name(pp->name); + basePlant->set_name(DF2UTF(pp->name)); basePlant->mutable_mat_pair()->set_mat_type(-1); basePlant->mutable_mat_pair()->set_mat_index(i); #if DF_VERSION_INT > 40001 @@ -916,7 +914,7 @@ static command_result GetGrowthList(color_ostream &stream, const EmptyMessage *i { MaterialDefinition * out_growth = out->add_material_list(); out_growth->set_id(pp->id + ":" + growth->id + +":" + growth_locations[l]); - out_growth->set_name(growth->name); + out_growth->set_name(DF2UTF(growth->name)); out_growth->mutable_mat_pair()->set_mat_type(g * 10 + l); out_growth->mutable_mat_pair()->set_mat_index(i); } @@ -1951,8 +1949,8 @@ static command_result GetWorldMapCenter(color_ostream &stream, const EmptyMessag out->set_center_x(pos.x); out->set_center_y(pos.y); out->set_center_z(pos.z); - out->set_name(Translation::TranslateName(&(data->name), false)); - out->set_name_english(Translation::TranslateName(&(data->name), true)); + out->set_name(DF2UTF(Translation::TranslateName(&(data->name), false))); + out->set_name_english(DF2UTF(Translation::TranslateName(&(data->name), true))); out->set_cur_year(World::ReadCurrentYear()); out->set_cur_year_tick(World::ReadCurrentTick()); return CR_OK; @@ -1977,8 +1975,8 @@ static command_result GetWorldMap(color_ostream &stream, const EmptyMessage *in, int height = data->world_height; out->set_world_width(width); out->set_world_height(height); - out->set_name(Translation::TranslateName(&(data->name), false)); - out->set_name_english(Translation::TranslateName(&(data->name), true)); + out->set_name(DF2UTF(Translation::TranslateName(&(data->name), false))); + out->set_name_english(DF2UTF(Translation::TranslateName(&(data->name), true))); auto poles = data->flip_latitude; #if DF_VERSION_INT > 34011 switch (poles) @@ -2126,8 +2124,8 @@ static command_result GetWorldMapNew(color_ostream &stream, const EmptyMessage * int height = data->world_height; out->set_world_width(width); out->set_world_height(height); - out->set_name(Translation::TranslateName(&(data->name), false)); - out->set_name_english(Translation::TranslateName(&(data->name), true)); + out->set_name(DF2UTF(Translation::TranslateName(&(data->name), false))); + out->set_name_english(DF2UTF(Translation::TranslateName(&(data->name), true))); #if DF_VERSION_INT > 34011 auto poles = data->flip_latitude; switch (poles) @@ -2797,8 +2795,8 @@ static command_result GetPartialCreatureRaws(color_ostream &stream, const ListRe auto send_tissue = send_creature->add_tissues(); send_tissue->set_id(orig_tissue->id); - send_tissue->set_name(orig_tissue->tissue_name_singular); - send_tissue->set_subordinate_to_tissue(orig_tissue->subordinate_to_tissue); + send_tissue->set_name(DF2UTF(orig_tissue->tissue_name_singular)); + send_tissue->set_subordinate_to_tissue(DF2UTF(orig_tissue->subordinate_to_tissue)); CopyMat(send_tissue->mutable_material(), orig_tissue->mat_type, orig_tissue->mat_index); } @@ -2831,7 +2829,7 @@ static command_result GetPartialPlantRaws(color_ostream &stream, const ListReque plant_remote->set_index(i); plant_remote->set_id(plant_local->id); - plant_remote->set_name(plant_local->name); + plant_remote->set_name(DF2UTF(plant_local->name)); if (!plant_local->flags.is_set(df::plant_raw_flags::TREE)) plant_remote->set_tile(plant_local->tiles.shrub_tile); else @@ -2843,7 +2841,7 @@ static command_result GetPartialPlantRaws(color_ostream &stream, const ListReque TreeGrowth * growth_remote = plant_remote->add_growths(); growth_remote->set_index(j); growth_remote->set_id(growth_local->id); - growth_remote->set_name(growth_local->name); + growth_remote->set_name(DF2UTF(growth_local->name)); for (size_t k = 0; k < growth_local->prints.size(); k++) { df::plant_growth_print* print_local = growth_local->prints[k]; From 3cb13152f802ad59c3a211388d67ebde56395d14 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 20 May 2023 07:12:20 +0000 Subject: [PATCH 438/439] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 0f02ade81..86b083cdf 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 0f02ade81771a7c24a4bbd6cfd7969704288f94b +Subproject commit 86b083cdf5847128e88197834eb953c1716c50a8 From 9dffba68431c70d84a0951519540ec8e7802ecbc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 20 May 2023 04:38:03 -0700 Subject: [PATCH 439/439] amend #2914 so lists don't jump around on resize --- library/lua/gui/widgets.lua | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 26c949805..5c8094d28 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1664,9 +1664,7 @@ function List:setChoices(choices, selected) -- Check if page_top needs to be adjusted if #self.choices - self.page_size < 0 then self.page_top = 1 - elseif self.selected <= (self.page_size // 2) then - self.page_top = 1 - elseif self.selected >= #self.choices - (self.page_size // 2) then + elseif self.page_top > #self.choices - self.page_size + 1 then self.page_top = #self.choices - self.page_size + 1 end end @@ -1719,14 +1717,8 @@ function List:postComputeFrame(body) return end - local max_page_top = math.max(1, num_choices - row_count + 1) - - if self.selected > num_choices - row_count then - self.page_top = max_page_top - elseif self.selected < self.page_top then - self.page_top = self.selected - else - self.page_top = math.max(1, self.selected - row_count + 1) + if self.page_top > num_choices - self.page_size + 1 then + self.page_top = math.max(1, num_choices - self.page_size + 1) end update_list_scrollbar(self)