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