diff --git a/changelog.txt b/changelog.txt index ac0ad32ec..c7372e2ad 100644 --- a/changelog.txt +++ b/changelog.txt @@ -29,6 +29,7 @@ Template for new versions: ## New Tools - `fix/wildlife`: prevent wildlife from getting stuck when trying to exit the map. This fix needs to be enabled manually in `gui/control-panel` on the Bug Fixes tab since not all players want this bug to be fixed. - `immortal-cravings`: allow immortals to satisfy their cravings for food and drink +- `justice`: various functions pertaining to the justice system, currently with a command to pardon a unit's prison sentence. ## New Features - `force`: support the ``Wildlife`` event to allow additional wildlife to enter the map diff --git a/docs/justice.rst b/docs/justice.rst new file mode 100644 index 000000000..e5ff93cbc --- /dev/null +++ b/docs/justice.rst @@ -0,0 +1,26 @@ +justice +======= + +.. dfhack-tool:: + :summary: Commands related to the justice system. + :tags: fort armok units + +This tool allows control over aspects of the justice system, such as the +ability to pardon criminals. + +Usage +----- + +:: + justice pardon [--unit ] + +Pardon the selected unit or the one specified by unit id (if provided). +Currently only applies to prison time and doesn't cancel beatings or +hammerings. + + +Options +------- + +``-u``, ``--unit `` + Specifies the unit id of the target of the command. diff --git a/justice.lua b/justice.lua new file mode 100644 index 000000000..5071f2445 --- /dev/null +++ b/justice.lua @@ -0,0 +1,42 @@ + +local argparse = require('argparse') + +local function pardon_unit(unit) + for _,punishment in ipairs(df.global.plotinfo.punishments) do + if punishment.criminal == unit.id then + punishment.prison_counter = 0 + return + end + end + qerror('Unit is not currently serving a sentence!') +end + +local function command_pardon(unit_id) + local unit = nil + if not unit_id then + unit = dfhack.gui.getSelectedUnit() + if not unit then qerror("No unit selected!") end + else + unit = df.unit.find(unit_id) + if not unit then qerror(("No unit with id %i"):format(unit_id)) end + end + if unit then pardon_unit(unit) end +end + +local unit_id = nil + +local args = {...} + +local positionals = argparse.processArgsGetopt(args, + {'u', 'unit', hasArg=true, handler=function(optarg) unit_id = optarg end} +) + +local command = positionals[1] + +if command == "pardon" then + command_pardon(unit_id) +elseif not command then + qerror('Missing command') +else + qerror(("Unrecognised command: %s"):format(command)) +end