add digmat script

develop
jj 2013-10-11 19:15:56 +02:00
parent 84033bd586
commit 2bcd02ce96
3 changed files with 65 additions and 0 deletions

@ -9,6 +9,7 @@ DFHack future
- multicmd: run a sequence of dfhack commands, separated by ';'
- autobutcher: A GUI front-end for the autobutcher plugin.
- startdwarf: change the number of dwarves for a new embark
- digmat: dig veins/layers tile by tile, as discovered
Misc improvements:
- exterminate: renamed from slayrace, add help message, add butcher mode
- autoSyndrome: disable by default

@ -1996,6 +1996,16 @@ To skip a row in your design, use a single ``;``.
The script takes the plan filename, starting from the root df folder.
digmat
======
Designates a tile for digging. Monitors the tile, and when it is dug out, add
surrounding discovered tiles of the same material for digging. Similar to 'digv',
but less cheaty. Works for stone layers, soil layers, veins, etc.
If the tile you call the script on already has a digging designation, reuse the
same designation for future digging (eg dig up/downstairs). When digging stairs,
also designate tiles on z-1 and z+1 when they are discovered.
superdwarf
==========
Similar to fastdwarf, per-creature.

@ -0,0 +1,54 @@
# dig a mineral vein/layer, add tiles as they are discovered
# reuses the dig mode (upstairs etc) of the selected tile
if df.cursor.x < 0
puts "Place the game cursor on a tile to dig"
throw :script_finished
end
tile = df.map_tile_at(df.cursor)
if tile.shape_basic != :Wall or tile.designation.hidden
puts "Place the game cursor on an unmined, discovered tile"
throw :script_finished
end
def digmat_watch(tile, digmode, tilelist)
# watch the tile, expand mining operations when dug out
tilelist << [tile.x, tile.y, tile.z]
if tilelist.length == 1
df.onupdate_register_once("digmat", 10) {
tilelist.dup.each { |x, y, z|
t = df.map_tile_at(x, y, z)
if t.shape_basic != :Wall
digmat_around(t, digmode, tilelist)
tilelist.delete [x, y, z]
end
}
tilelist.empty?
}
end
tilelist.uniq!
end
def digmat_around(tile, digmode=tile.designation.dig, tilelist=[])
digmode = :Default if digmode == :No
[-1, 0, 1].each { |dz|
next if digmode == :Default and dz != 0
[-1, 0, 1].each { |dy|
[-1, 0, 1].each { |dx|
ntile = tile.offset(dx, dy, dz)
next if not ntile
next if ntile.designation.hidden
next if ntile.designation.dig != :No
next if ntile.shape_basic != :Wall
next if not ntile.mat_info === tile.mat_info
ntile.dig(digmode)
digmat_watch(ntile, digmode, tilelist)
}
}
}
end
digmat_around(tile)