From 42e21bf946772f986de978b944c09e8858221057 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Mon, 20 Mar 2023 11:00:25 -0500 Subject: [PATCH 001/261] 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 002/261] 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 003/261] 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 004/261] 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 005/261] 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 006/261] 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 007/261] 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 008/261] 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 009/261] 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 010/261] 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 011/261] 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 012/261] 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 013/261] 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 014/261] 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 015/261] 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 016/261] 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 017/261] 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 018/261] 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 019/261] 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 020/261] 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 021/261] 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 022/261] 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 023/261] 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 024/261] 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 025/261] 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 026/261] 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 027/261] 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 028/261] 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 029/261] 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 030/261] 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 031/261] 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 032/261] 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 033/261] 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 034/261] 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 035/261] 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 036/261] 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 037/261] 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 038/261] 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 039/261] 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 040/261] 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 041/261] 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 042/261] 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 043/261] 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 044/261] 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 045/261] 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 046/261] 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 047/261] 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 048/261] 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 049/261] 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 050/261] 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 051/261] 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 052/261] 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 053/261] 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 054/261] 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 055/261] 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 056/261] 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 057/261] 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 058/261] 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 059/261] 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 060/261] 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 061/261] 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 062/261] 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 063/261] 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 064/261] 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 065/261] 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 066/261] 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 067/261] 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 068/261] 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 069/261] 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 070/261] 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 071/261] 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 072/261] 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 073/261] 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 074/261] 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 075/261] 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 076/261] 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 077/261] 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 078/261] 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 079/261] 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 080/261] 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 081/261] 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 082/261] 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 083/261] 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 084/261] 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 085/261] 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 086/261] 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 087/261] 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 088/261] 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 089/261] 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 090/261] 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 091/261] 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 092/261] 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 093/261] 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 094/261] 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 095/261] 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 096/261] 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 097/261] 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 098/261] 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 099/261] 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 100/261] 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 101/261] 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 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 102/261] 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 103/261] 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 104/261] 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 105/261] 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 106/261] 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 107/261] 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 108/261] 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 109/261] 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 110/261] 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 111/261] 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 112/261] 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 113/261] 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 114/261] 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 115/261] 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 116/261] 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 117/261] 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 118/261] 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 119/261] 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 120/261] 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 121/261] 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 122/261] 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 123/261] 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 124/261] 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 125/261] 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 126/261] 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 127/261] 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 128/261] 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 129/261] 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 130/261] 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 131/261] 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 132/261] [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 133/261] 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 134/261] 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 135/261] 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 136/261] 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 137/261] 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 138/261] 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 139/261] 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 140/261] 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 141/261] 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 142/261] 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 143/261] 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 144/261] 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 145/261] 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 146/261] [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 147/261] 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 148/261] 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 149/261] [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 150/261] 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 151/261] 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 152/261] 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 153/261] 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 154/261] 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 155/261] 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 156/261] 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 157/261] 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 158/261] 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 159/261] 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 160/261] 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 161/261] 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 162/261] 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 163/261] 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 164/261] 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 165/261] 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 166/261] 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 167/261] 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 168/261] 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 169/261] 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 170/261] 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 171/261] 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 172/261] 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 173/261] 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 174/261] 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 175/261] 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 176/261] 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 177/261] 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 178/261] 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 179/261] 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 180/261] 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 181/261] 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 182/261] 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 183/261] 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 184/261] 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 185/261] 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 186/261] 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 187/261] 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 b9d95c5a0bbc68846952c54ed91959ac55835b1f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 13 Apr 2023 18:53:11 -0700 Subject: [PATCH 188/261] 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 189/261] 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 190/261] 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 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 191/261] 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 192/261] 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 193/261] 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 194/261] 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 195/261] 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 196/261] 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 197/261] 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 198/261] 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 199/261] 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 200/261] 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 201/261] 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 202/261] 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 203/261] 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 204/261] 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 205/261] 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 206/261] 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 207/261] 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 208/261] 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 209/261] 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 210/261] 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 211/261] 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 212/261] 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 213/261] 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 214/261] 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 215/261] 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 216/261] 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 217/261] 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 218/261] 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 219/261] 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 220/261] 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 221/261] 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 222/261] 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 ac4a068007055426d96ba64f6c4f3b0f96115ab0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 18 Apr 2023 21:08:50 -0700 Subject: [PATCH 223/261] 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 ae2bdfad5ff8fb4f9d530f9f1458415a45ed755e Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 19 Apr 2023 11:28:57 +0200 Subject: [PATCH 224/261] 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 225/261] 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 226/261] 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 227/261] 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 228/261] 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 229/261] 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 6b86f7c69128e69dc03d07b735da5c68967759d9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 21 Apr 2023 11:20:28 -0700 Subject: [PATCH 230/261] 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 231/261] 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 adeb872725cb6bfdcedbd4265a9c17e5d73d9745 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Sat, 22 Apr 2023 09:44:37 +0200 Subject: [PATCH 232/261] 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 233/261] 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 234/261] 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 235/261] 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 236/261] 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 237/261] 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 238/261] 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 239/261] 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 240/261] 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 241/261] 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 242/261] 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 243/261] 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 244/261] 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 245/261] 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 246/261] 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 247/261] 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 248/261] 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 249/261] 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 250/261] 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 251/261] 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 252/261] 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 253/261] 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 254/261] 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 255/261] 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 256/261] 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 257/261] 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 258/261] 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 259/261] 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 1b8fc20ad53fded507407fe0f0a52486d626b6f5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 26 Apr 2023 21:01:21 -0700 Subject: [PATCH 260/261] 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 261/261] 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},