diff --git a/NEWS b/NEWS index 854c9353e..b43ced4f0 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ DFHack future Misc improvements: - digfort: improved csv parsing, add start() comment handling + - exterminate: allow specifying a caste (exterminate gob:male) DFHack v0.34.11-r4 diff --git a/Readme.rst b/Readme.rst index 0668fd6c9..29f0a71fa 100644 --- a/Readme.rst +++ b/Readme.rst @@ -2125,6 +2125,9 @@ With the special argument ``him``, targets only the selected creature. With the special argument ``undead``, targets all undeads on the map, regardless of their race. +When specifying a race, a caste can be specified to further restrict the +targeting. To do that, append and colon and the caste name after the race. + Any non-dead non-caged unit of the specified race gets its ``blood_count`` set to 0, which means immediate death at the next game tick. For creatures such as vampires, it also sets animal.vanish_countdown to 2. @@ -2140,6 +2143,7 @@ but ignore caged/chained creatures. Ex:: exterminate gob + exterminate gob:male To kill a single creature, select the unit with the 'v' cursor and:: diff --git a/scripts/exterminate.rb b/scripts/exterminate.rb index 9fedeb48b..5dfc36a96 100644 --- a/scripts/exterminate.rb +++ b/scripts/exterminate.rb @@ -84,6 +84,7 @@ The special final argument 'magma' will make magma rain on the targets instead. The special final argument 'butcher' will mark the targets for butchering instead. Ex: exterminate gob + exterminate gob:male exterminate elve magma exterminate him exterminate pig butcher @@ -115,6 +116,10 @@ when /^undead/i puts "#{slain} #{count} undeads" else + if race.index(':') + race, caste = race.split(':') + end + raw_race = df.match_rawname(race, all_races.keys) if not raw_race puts "Invalid race, use one of #{all_races.keys.sort.join(' ')}" @@ -123,13 +128,24 @@ else race_nr = df.world.raws.creatures.all.index { |cr| cr.creature_id == raw_race } + if caste + all_castes = df.world.raws.creatures.all[race_nr].caste.map { |c| c.caste_id } + raw_caste = df.match_rawname(caste, all_castes) + if not raw_caste + puts "Invalid caste, use one of #{all_castes.sort.join(' ')}" + throw :script_finished + end + caste_nr = all_castes.index(raw_caste) + end + count = 0 df.world.units.active.each { |u| if u.race == race_nr and checkunit[u] + next if caste_nr and u.caste != caste_nr slayit[u] count += 1 end } - puts "#{slain} #{count} #{raw_race}" + puts "#{slain} #{count} #{raw_caste} #{raw_race}" end