Merge branch 'develop' into myk_potential

develop
Myk 2023-11-05 08:57:39 -08:00 committed by GitHub
commit d7caab9add
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 101 additions and 12 deletions

@ -70,6 +70,7 @@ Template for new versions:
- `sort`: allow searching by profession on the squad assignment page - `sort`: allow searching by profession on the squad assignment page
- `sort`: add search for work animal assignment screen; allow filtering by miltary/squad/civilian/burrow - `sort`: add search for work animal assignment screen; allow filtering by miltary/squad/civilian/burrow
- `sort`: on the squad assignment screen, make effectiveness and potential ratings use the same scale so effectiveness is always less than or equal to potential for a unit and so you can tell when units are approaching their maximum potential - `sort`: on the squad assignment screen, make effectiveness and potential ratings use the same scale so effectiveness is always less than or equal to potential for a unit and so you can tell when units are approaching their maximum potential
- `sort`: new overlay on the animal assignment screen that shows how many work animals each visible unit already has assigned to them
- `dreamfort`: Inside+ and Clearcutting burrows now automatically created and managed - `dreamfort`: Inside+ and Clearcutting burrows now automatically created and managed
## Documentation ## Documentation
@ -77,6 +78,8 @@ Template for new versions:
## API ## API
- ``Gui::revealInDwarfmodeMap``: gained ``highlight`` parameter to control setting the tile highlight on the zoom target - ``Gui::revealInDwarfmodeMap``: gained ``highlight`` parameter to control setting the tile highlight on the zoom target
- ``Maps::getWalkableGroup``: get the walkability group of a tile - ``Maps::getWalkableGroup``: get the walkability group of a tile
- ``Units::getReadableName``: now returns the *untranslated* name
- ``Burrows::setAssignedUnit``: now properly handles inactive burrows
## Lua ## Lua
- ``dfhack.gui.revealInDwarfmodeMap``: gained ``highlight`` parameter to control setting the tile highlight on the zoom target - ``dfhack.gui.revealInDwarfmodeMap``: gained ``highlight`` parameter to control setting the tile highlight on the zoom target

@ -105,6 +105,13 @@ can search for that text as well. This is often a job name or a status, like
"caged". The work animal assignment page can also filter by squad or burrow "caged". The work animal assignment page can also filter by squad or burrow
membership. membership.
Work animals overlay
--------------------
In addition to the search and filter widgets provided by the Info tabs overlay,
the work animal assignment screen has an additional overlay that annotates each
visible unit with the number of work animals that unit already has.
Interrogation overlay Interrogation overlay
--------------------- ---------------------

@ -78,8 +78,10 @@ void Burrows::clearUnits(df::burrow *burrow)
{ {
auto unit = df::unit::find(burrow->units[i]); auto unit = df::unit::find(burrow->units[i]);
if (unit) if (unit) {
erase_from_vector(unit->burrows, burrow->id); erase_from_vector(unit->burrows, burrow->id);
erase_from_vector(unit->inactive_burrows, burrow->id);
}
} }
burrow->units.clear(); burrow->units.clear();
@ -90,7 +92,8 @@ bool Burrows::isAssignedUnit(df::burrow *burrow, df::unit *unit)
CHECK_NULL_POINTER(unit); CHECK_NULL_POINTER(unit);
CHECK_NULL_POINTER(burrow); CHECK_NULL_POINTER(burrow);
return binsearch_index(unit->burrows, burrow->id) >= 0; return binsearch_index(unit->burrows, burrow->id) >= 0 ||
binsearch_index(unit->inactive_burrows, burrow->id) >= 0;
} }
void Burrows::setAssignedUnit(df::burrow *burrow, df::unit *unit, bool enable) void Burrows::setAssignedUnit(df::burrow *burrow, df::unit *unit, bool enable)
@ -100,14 +103,15 @@ void Burrows::setAssignedUnit(df::burrow *burrow, df::unit *unit, bool enable)
CHECK_NULL_POINTER(unit); CHECK_NULL_POINTER(unit);
CHECK_NULL_POINTER(burrow); CHECK_NULL_POINTER(burrow);
if (enable) if (enable) {
{ if (burrow->limit_workshops & 2) // inactive flag
insert_into_vector(unit->burrows, burrow->id); insert_into_vector(unit->inactive_burrows, burrow->id);
else
insert_into_vector(unit->burrows, burrow->id);
insert_into_vector(burrow->units, unit->id); insert_into_vector(burrow->units, unit->id);
} } else {
else
{
erase_from_vector(unit->burrows, burrow->id); erase_from_vector(unit->burrows, burrow->id);
erase_from_vector(unit->inactive_burrows, burrow->id);
erase_from_vector(burrow->units, unit->id); erase_from_vector(burrow->units, unit->id);
} }
} }

@ -252,6 +252,8 @@ DEFINE_GET_FOCUS_STRING_HANDLER(dwarfmode)
newFocusString += "/ActivityDetails"; newFocusString += "/ActivityDetails";
else if (game->main_interface.info.creatures.adding_trainer) else if (game->main_interface.info.creatures.adding_trainer)
newFocusString += "/AddingTrainer"; newFocusString += "/AddingTrainer";
else if (game->main_interface.info.creatures.assign_work_animal)
newFocusString += "/AssignWorkAnimal";
else else
newFocusString += '/' + enum_item_key(game->main_interface.info.creatures.current_mode); newFocusString += '/' + enum_item_key(game->main_interface.info.creatures.current_mode);
break; break;

@ -1282,7 +1282,7 @@ string Units::getReadableName(df::unit* unit) {
race_name = "hunter " + race_name; race_name = "hunter " + race_name;
if (isWar(unit)) if (isWar(unit))
race_name = "war " + race_name; race_name = "war " + race_name;
string name = Translation::TranslateName(getVisibleName(unit)); string name = Translation::TranslateName(getVisibleName(unit), false);
if (name.empty()) { if (name.empty()) {
name = race_name; name = race_name;
} else { } else {

@ -1289,6 +1289,7 @@ OVERLAY_WIDGETS = {
squad_assignment=SquadAssignmentOverlay, squad_assignment=SquadAssignmentOverlay,
squad_annotation=SquadAnnotationOverlay, squad_annotation=SquadAnnotationOverlay,
info=require('plugins.sort.info').InfoOverlay, info=require('plugins.sort.info').InfoOverlay,
workanimals=require('plugins.sort.info').WorkAnimalOverlay,
candidates=require('plugins.sort.info').CandidatesOverlay, candidates=require('plugins.sort.info').CandidatesOverlay,
interrogation=require('plugins.sort.info').InterrogationOverlay, interrogation=require('plugins.sort.info').InterrogationOverlay,
location_selector=require('plugins.sort.locationselector').LocationSelectorOverlay, location_selector=require('plugins.sort.locationselector').LocationSelectorOverlay,

@ -1,6 +1,7 @@
local _ENV = mkmodule('plugins.sort.info') local _ENV = mkmodule('plugins.sort.info')
local gui = require('gui') local gui = require('gui')
local overlay = require('plugins.overlay')
local sortoverlay = require('plugins.sort.sortoverlay') local sortoverlay = require('plugins.sort.sortoverlay')
local widgets = require('gui.widgets') local widgets = require('gui.widgets')
local utils = require('utils') local utils = require('utils')
@ -179,7 +180,10 @@ local function get_squad_options()
end end
local function get_burrow_options() local function get_burrow_options()
local options = {{label='Any', value='all', pen=COLOR_GREEN}} local options = {
{label='Any', value='all', pen=COLOR_GREEN},
{label='Unburrowed', value='none', pen=COLOR_LIGHTRED},
}
for _, burrow in ipairs(df.global.plotinfo.burrows.list) do for _, burrow in ipairs(df.global.plotinfo.burrows.list) do
table.insert(options, { table.insert(options, {
label=#burrow.name > 0 and burrow.name or ('Burrow %d'):format(burrow.id + 1), label=#burrow.name > 0 and burrow.name or ('Burrow %d'):format(burrow.id + 1),
@ -409,8 +413,9 @@ function InfoOverlay:matches_filters(unit)
return target_id == squad_id return target_id == squad_id
elseif subset == 'burrow' then elseif subset == 'burrow' then
local target_id = self.subviews.burrow:getOptionValue() local target_id = self.subviews.burrow:getOptionValue()
if target_id == 'all' then return true end if target_id == 'all' then return #unit.burrows + #unit.inactive_burrows > 0 end
return utils.binsearch(unit.burrows, target_id) if target_id == 'none' then return #unit.burrows + #unit.inactive_burrows == 0 end
return utils.binsearch(unit.burrows, target_id) or utils.binsearch(unit.inactive_burrows, target_id)
end end
return true return true
end end
@ -469,6 +474,73 @@ function CandidatesOverlay:onRenderBody(dc)
end end
end end
-- ----------------------
-- WorkAnimalOverlay
--
WorkAnimalOverlay = defclass(WorkAnimalOverlay, overlay.OverlayWidget)
WorkAnimalOverlay.ATTRS{
default_pos={x=-33, y=12},
viewscreens='dwarfmode/Info/CREATURES/AssignWorkAnimal',
default_enabled=true,
frame={w=29, h=1},
}
function WorkAnimalOverlay:init()
self:addviews{
widgets.Label{
view_id='annotations',
frame={t=0, l=0},
text='',
}
}
end
local function get_work_animal_counts()
local counts = {}
for _,unit in ipairs(df.global.world.units.active) do
if not dfhack.units.isOwnCiv(unit) or
(not dfhack.units.isWar(unit) and not dfhack.units.isHunter(unit))
then
goto continue
end
local owner_id = unit.relationship_ids.Pet
if owner_id == -1 then goto continue end
counts[owner_id] = (counts[owner_id] or 0) + 1
::continue::
end
return counts
end
function WorkAnimalOverlay:onRenderFrame(dc, rect)
local _, sh = dfhack.screen.getWindowSize()
local _, t = get_panel_offsets()
local list_height = sh - (17 + t)
local num_elems = list_height // 3
local max_elem = math.min(#creatures.work_animal_recipient-1,
creatures.scroll_position_work_animal+num_elems-1)
local annotations = {}
local counts = get_work_animal_counts()
for idx=creatures.scroll_position_work_animal,max_elem do
table.insert(annotations, NEWLINE)
table.insert(annotations, NEWLINE)
local animal_count = counts[creatures.work_animal_recipient[idx].id]
if animal_count and animal_count > 0 then
table.insert(annotations, {text='[', pen=COLOR_RED})
table.insert(annotations, ('Assigned work animals: %d'):format(animal_count))
table.insert(annotations, {text=']', pen=COLOR_RED})
end
table.insert(annotations, NEWLINE)
end
self.subviews.annotations.frame.t = t
self.subviews.annotations:setText(annotations)
self.frame.h = list_height + t
WorkAnimalOverlay.super.onRenderFrame(self, dc, rect)
end
-- ---------------------- -- ----------------------
-- InterrogationOverlay -- InterrogationOverlay
-- --