Merge remote-tracking branch 'PeridexisErrant/digfort-checks'

Conflicts:
	NEWS
develop
lethosor 2015-01-05 16:32:14 -05:00
commit 3bc17dafab
2 changed files with 48 additions and 52 deletions

@ -3,6 +3,7 @@ DFHack Future
plugins will not be loaded if globals they specify as required are not located (should prevent some crashes) plugins will not be loaded if globals they specify as required are not located (should prevent some crashes)
Fixes Fixes
advfort works again advfort works again
digfort: now checks file type and existence
exportlegends: Fixed map export exportlegends: Fixed map export
full-heal: Fixed a problem with selecting units in the GUI full-heal: Fixed a problem with selecting units in the GUI
gui/hack-wish: Fixed restrictive material filters gui/hack-wish: Fixed restrictive material filters

@ -1,70 +1,65 @@
# designate an area for digging according to a plan in csv format # designate an area for digging according to a plan in csv format
raise "usage: digfort <plan filename>" if not $script_args[0] fname = $script_args[0].to_s
planfile = File.read($script_args[0])
if df.cursor.x == -30000 if not $script_args[0] then
puts "place the game cursor to the top-left corner of the design" puts " Usage: digfort <plan filename>"
throw :script_finished throw :script_finished
end
if not fname[-4..-1] == ".csv" then
puts " The plan file must be in .csv format."
throw :script_finished
end
if not File.file?(fname) then
puts " The specified file does not exist."
throw :script_finished
end end
# a sample CSV file planfile = File.read(fname)
# empty lines are ignored
# a special comment with start(dx, dy) means the actual patterns starts at cursor.x-dx, cursor.y-dy if df.cursor.x == -30000
# the CSV file should be saved in the main DF directory, alongside of Dwarf Fortress.exe puts "place the game cursor to the top-left corner of the design and retry"
sample_csv = <<EOS throw :script_finished
# start(3, 4) end
,d,d,d,d,d,d
d, , , , , , ,d
d, , , , , , ,d
d, ,d, , ,d, ,d
h, , , , , , ,h
h,h,h,h,h,h,h,h
h,h, ,d,d, ,h,h
h,h,h,h,h,h,h,h
,h,h,h,h,h,h
, , ,h,h,h
, , , ,h,h
EOS
offset = [0, 0] offset = [0, 0]
tiles = [] tiles = []
planfile.each_line { |l| planfile.each_line { |l|
if l =~ /#.*start\s*\(\s*(-?\d+)\s*[,;]\s*(-?\d+)/ if l =~ /#.*start\s*\(\s*(-?\d+)\s*[,;]\s*(-?\d+)/
raise "Error: multiple start() comments" if offset != [0, 0] raise "Error: multiple start() comments" if offset != [0, 0]
offset = [$1.to_i, $2.to_i] offset = [$1.to_i, $2.to_i]
end end
l = l.chomp.sub(/#.*/, '') l = l.chomp.sub(/#.*/, '')
next if l == '' next if l == ''
tiles << l.split(/[;,]/).map { |t| tiles << l.split(/[;,]/).map { |t|
t = t.strip t = t.strip
(t[0] == ?") ? t[1..-2] : t (t[0] == ?") ? t[1..-2] : t
} }
} }
x = x0 = df.cursor.x - offset[0] x = df.cursor.x - offset[0]
y = df.cursor.y - offset[1] y = df.cursor.y - offset[1]
z = df.cursor.z z = df.cursor.z
tiles.each { |line| tiles.each { |line|
next if line.empty? or line == [''] next if line.empty? or line == ['']
line.each { |tile| line.each { |tile|
t = df.map_tile_at(x, y, z) t = df.map_tile_at(x, y, z)
s = t.shape_basic s = t.shape_basic
case tile case tile
when 'd'; t.dig(:Default) if s == :Wall when 'd'; t.dig(:Default) if s == :Wall
when 'u'; t.dig(:UpStair) if s == :Wall when 'u'; t.dig(:UpStair) if s == :Wall
when 'j'; t.dig(:DownStair) if s == :Wall or s == :Floor when 'j'; t.dig(:DownStair) if s == :Wall or s == :Floor
when 'i'; t.dig(:UpDownStair) if s == :Wall when 'i'; t.dig(:UpDownStair) if s == :Wall
when 'h'; t.dig(:Channel) if s == :Wall or s == :Floor when 'h'; t.dig(:Channel) if s == :Wall or s == :Floor
when 'r'; t.dig(:Ramp) if s == :Wall when 'r'; t.dig(:Ramp) if s == :Wall
when 'x'; t.dig(:No) when 'x'; t.dig(:No)
end end
x += 1 x += 1
} }
x = x0 x = df.cursor.x - offset[0]
y += 1 y += 1
} }
puts 'done' puts ' done'