commit
						67f0aa774c
					
				| @ -0,0 +1,66 @@ | |||||||
|  | #include "df/building_nest_boxst.h" | ||||||
|  | #include "df/item_eggst.h" | ||||||
|  | #include "df/viewscreen_dwarfmodest.h" | ||||||
|  | 
 | ||||||
|  | using namespace DFHack; | ||||||
|  | using namespace df::enums; | ||||||
|  | 
 | ||||||
|  | using df::global::world; | ||||||
|  | using df::global::ui; | ||||||
|  | 
 | ||||||
|  | struct egg_fertile_hook : df::viewscreen_dwarfmodest { | ||||||
|  |     typedef df::viewscreen_dwarfmodest interpose_base; | ||||||
|  | 
 | ||||||
|  |     df::building_nest_boxst* getNestBox() | ||||||
|  |     { | ||||||
|  |         if (ui->main.mode != ui_sidebar_mode::QueryBuilding && | ||||||
|  |             ui->main.mode != ui_sidebar_mode::BuildingItems) | ||||||
|  |             return NULL; | ||||||
|  |         return virtual_cast<df::building_nest_boxst>(world->selected_building); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     DEFINE_VMETHOD_INTERPOSE(void, render, ()) | ||||||
|  |     { | ||||||
|  |         INTERPOSE_NEXT(render)(); | ||||||
|  |         df::building_nest_boxst* nest_box = getNestBox(); | ||||||
|  |         if (nest_box) | ||||||
|  |         { | ||||||
|  |             auto dims = Gui::getDwarfmodeViewDims(); | ||||||
|  |             bool has_eggs = false; | ||||||
|  |             bool fertile = false; | ||||||
|  |             int idx = 0; | ||||||
|  |             for (auto iter = nest_box->contained_items.begin(); | ||||||
|  |                  iter != nest_box->contained_items.end(); ++iter) | ||||||
|  |             { | ||||||
|  |                 df::item_eggst* egg = virtual_cast<df::item_eggst>((*iter)->item); | ||||||
|  |                 if (egg) | ||||||
|  |                 { | ||||||
|  |                     has_eggs = true; | ||||||
|  |                     if (egg->egg_flags.bits.fertile) | ||||||
|  |                         fertile = true; | ||||||
|  |                     if (ui->main.mode == ui_sidebar_mode::BuildingItems) | ||||||
|  |                     { | ||||||
|  |                         Screen::paintString( | ||||||
|  |                             Screen::Pen(' ', fertile ? COLOR_LIGHTGREEN : COLOR_LIGHTRED), | ||||||
|  |                             dims.menu_x2 - (fertile ? 4 : 6), | ||||||
|  |                             dims.y1 + idx + 3, | ||||||
|  |                             fertile ? "Fert" : "N.Fert" | ||||||
|  |                         ); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 ++idx; | ||||||
|  |             } | ||||||
|  |             if (has_eggs && ui->main.mode == ui_sidebar_mode::QueryBuilding) | ||||||
|  |             { | ||||||
|  |                 Screen::paintString( | ||||||
|  |                     Screen::Pen(' ', fertile ? COLOR_LIGHTGREEN : COLOR_LIGHTRED), | ||||||
|  |                     dims.menu_x1 + 1, | ||||||
|  |                     dims.y1 + 5, | ||||||
|  |                     fertile ? "Eggs Fertile" : "Eggs infertile" | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | IMPLEMENT_VMETHOD_INTERPOSE(egg_fertile_hook, render); | ||||||
| @ -0,0 +1,96 @@ | |||||||
|  | #include "df/building_stockpilest.h" | ||||||
|  | #include "df/viewscreen_dwarfmodest.h" | ||||||
|  | 
 | ||||||
|  | using namespace DFHack; | ||||||
|  | using namespace df::enums; | ||||||
|  | 
 | ||||||
|  | using df::global::world; | ||||||
|  | 
 | ||||||
|  | static bool in_wheelbarrow_entry; | ||||||
|  | static std::string wheelbarrow_entry; | ||||||
|  | 
 | ||||||
|  | struct max_wheelbarrow_hook : df::viewscreen_dwarfmodest { | ||||||
|  |     typedef df::viewscreen_dwarfmodest interpose_base; | ||||||
|  | 
 | ||||||
|  |     int wheelbarrow_count() | ||||||
|  |     { | ||||||
|  |         int ret = 0; | ||||||
|  |         std::stringstream tmp(wheelbarrow_entry); | ||||||
|  |         tmp >> ret; | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     df::building_stockpilest* getStockpile() | ||||||
|  |     { | ||||||
|  |         if (ui->main.mode != ui_sidebar_mode::QueryBuilding) | ||||||
|  |             return NULL; | ||||||
|  |         return virtual_cast<df::building_stockpilest>(world->selected_building); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     DEFINE_VMETHOD_INTERPOSE(void, render, ()) | ||||||
|  |     { | ||||||
|  |         INTERPOSE_NEXT(render)(); | ||||||
|  |         df::building_stockpilest* stockpile = getStockpile(); | ||||||
|  |         if (stockpile && in_wheelbarrow_entry) | ||||||
|  |         { | ||||||
|  |             auto dims = Gui::getDwarfmodeViewDims(); | ||||||
|  |             Screen::paintString(Screen::Pen(' ', COLOR_LIGHTCYAN), | ||||||
|  |                 dims.menu_x1 + 22, dims.y1 + 6, wheelbarrow_entry + "_"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key>* input)) | ||||||
|  |     { | ||||||
|  |         df::building_stockpilest* stockpile = getStockpile(); | ||||||
|  |         bool handled = false; | ||||||
|  |         if (stockpile) | ||||||
|  |         { | ||||||
|  |             auto dims = Gui::getDwarfmodeViewDims(); | ||||||
|  |             handled = true; | ||||||
|  |             if (!in_wheelbarrow_entry && | ||||||
|  |                 input->count(df::interface_key::BUILDJOB_STOCKPILE_WHEELBARROW)) | ||||||
|  |             { | ||||||
|  |                 in_wheelbarrow_entry = true; | ||||||
|  |                 std::stringstream tmp; | ||||||
|  |                 tmp << stockpile->max_wheelbarrows; | ||||||
|  |                 tmp >> wheelbarrow_entry; | ||||||
|  |             } | ||||||
|  |             else if (in_wheelbarrow_entry) | ||||||
|  |             { | ||||||
|  |                 if (input->count(df::interface_key::SELECT) || | ||||||
|  |                     input->count(df::interface_key::LEAVESCREEN) || | ||||||
|  |                     input->count(df::interface_key::LEAVESCREEN_ALL) || | ||||||
|  |                     input->count(df::interface_key::BUILDJOB_STOCKPILE_WHEELBARROW)) | ||||||
|  |                 { | ||||||
|  |                     in_wheelbarrow_entry = false; | ||||||
|  |                     stockpile->max_wheelbarrows = std::min(wheelbarrow_count(), | ||||||
|  |                         Buildings::countExtentTiles(&stockpile->room)); | ||||||
|  |                 } | ||||||
|  |                 else if (input->count(df::interface_key::STRING_A000) && | ||||||
|  |                     wheelbarrow_entry.size()) | ||||||
|  |                 { | ||||||
|  |                     wheelbarrow_entry.resize(wheelbarrow_entry.size() - 1); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     for (auto iter = input->begin(); iter != input->end(); ++iter) | ||||||
|  |                     { | ||||||
|  |                         df::interface_key key = *iter; | ||||||
|  |                         if (key >= Screen::charToKey('0') && key <= Screen::charToKey('9') && | ||||||
|  |                             wheelbarrow_entry.size() < 3) | ||||||
|  |                         { | ||||||
|  |                             wheelbarrow_entry.push_back(Screen::keyToChar(key)); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |                 handled = false; | ||||||
|  |         } | ||||||
|  |         if (!handled) | ||||||
|  |             INTERPOSE_NEXT(feed)(input); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | IMPLEMENT_VMETHOD_INTERPOSE(max_wheelbarrow_hook, render); | ||||||
|  | IMPLEMENT_VMETHOD_INTERPOSE(max_wheelbarrow_hook, feed); | ||||||
		Loading…
	
		Reference in New Issue