Rewriting the drainaquifer script

The original drainaquifer script could occasionally fail to notice aquifer layers if they happen to skip each of the special tiles that it checks, two per block.  It also left the block-level aquifer flags set, which seems like a minor waste of FPS.

The new script uses the block-level flags to determine which blocks to check, which seems to be both more correct and faster.  It's also written in Lua instead of Ruby, for clarity and ease of debugging.  The name has changed slightly to prevent problems if both scripts are installed for some reason.
develop
Eric Wald 2014-10-12 21:54:55 -06:00
parent b0b6a82c92
commit b0b1dd62d1
5 changed files with 40 additions and 18 deletions

@ -1,4 +1,6 @@
DFHack future DFHack future
Fixes:
- replaced drainaquifer.rb with a faster less buggy drain-aquifer.lua
DFHack 0.40.13-r1 DFHack 0.40.13-r1
Internals: Internals:

@ -501,7 +501,7 @@ access DF memory and allow for easier development of new tools.</p>
<li><a class="reference internal" href="#binpatch" id="id132">binpatch</a></li> <li><a class="reference internal" href="#binpatch" id="id132">binpatch</a></li>
<li><a class="reference internal" href="#create-items" id="id133">create-items</a></li> <li><a class="reference internal" href="#create-items" id="id133">create-items</a></li>
<li><a class="reference internal" href="#digfort" id="id134">digfort</a></li> <li><a class="reference internal" href="#digfort" id="id134">digfort</a></li>
<li><a class="reference internal" href="#drainaquifer" id="id135">drainaquifer</a></li> <li><a class="reference internal" href="#drain-aquifer" id="id135">drain-aquifer</a></li>
<li><a class="reference internal" href="#deathcause" id="id136">deathcause</a></li> <li><a class="reference internal" href="#deathcause" id="id136">deathcause</a></li>
<li><a class="reference internal" href="#dfstatus" id="id137">dfstatus</a></li> <li><a class="reference internal" href="#dfstatus" id="id137">dfstatus</a></li>
<li><a class="reference internal" href="#embark" id="id138">embark</a></li> <li><a class="reference internal" href="#embark" id="id138">embark</a></li>
@ -2873,8 +2873,8 @@ as an offset for the pattern: instead of starting at the cursor, it will start
<p>The script takes the plan filename, starting from the root df folder (where <p>The script takes the plan filename, starting from the root df folder (where
Dwarf Fortress.exe is found).</p> Dwarf Fortress.exe is found).</p>
</div> </div>
<div class="section" id="drainaquifer"> <div class="section" id="drain-aquifer">
<h2><a class="toc-backref" href="#id135">drainaquifer</a></h2> <h2><a class="toc-backref" href="#id135">drain-aquifer</a></h2>
<p>Remove all 'aquifer' tag from the map blocks. Irreversible.</p> <p>Remove all 'aquifer' tag from the map blocks. Irreversible.</p>
</div> </div>
<div class="section" id="deathcause"> <div class="section" id="deathcause">

@ -2149,8 +2149,8 @@ as an offset for the pattern: instead of starting at the cursor, it will start
The script takes the plan filename, starting from the root df folder (where The script takes the plan filename, starting from the root df folder (where
Dwarf Fortress.exe is found). Dwarf Fortress.exe is found).
drainaquifer drain-aquifer
============ =============
Remove all 'aquifer' tag from the map blocks. Irreversible. Remove all 'aquifer' tag from the map blocks. Irreversible.
deathcause deathcause

@ -0,0 +1,33 @@
-- Remove all aquifers from the map
local function drain()
local last_layer = nil
local layer_count = 0
local tile_count = 0
for k, block in ipairs(df.global.world.map.map_blocks) do
if block.flags.has_aquifer then
block.flags.has_aquifer = false
block.flags.check_aquifer = false
for x, row in ipairs(block.designation) do
for y, tile in ipairs(row) do
if tile.water_table then
tile.water_table = false
tile_count = tile_count + 1
end
end
end
if block.map_pos.z ~= last_layer then
last_layer = block.map_pos.z
layer_count = layer_count + 1
end
end
end
print("Cleared "..tile_count.." aquifer tile"..((tile_count ~= 1) and "s" or "")..
" in "..layer_count.." layer"..((layer_count ~= 1) and "s" or "")..".")
end
drain(...)

@ -1,13 +0,0 @@
# remove all aquifers from the map
count = 0
df.each_map_block { |b|
if b.designation[0][0].water_table or b.designation[8][8].water_table
count += 1
df.each_map_block_z(b.map_pos.z) { |bz|
bz.designation.each { |dx| dx.each { |dy| dy.water_table = false } }
}
end
}
puts "cleared #{count} aquifer#{'s' if count > 1}"