dfhack/tools/python/reveal.py

93 lines
2.0 KiB
Python

import time
from context import ContextManager
class HideBlock(object):
__slots__ = [ "x", "y", "z", "hiddens" ]
def __init__(self, *args, **kwargs):
self.x = 0
self.y = 0
self.z = 0
self.hiddens = [[0 for i in xrange(16)] for j in xrange(16)]
df_cm = ContextManager("Memory.xml")
df = df_cm.get_single_context()
df.attach()
m = df.maps
w = df.world
print "Pausing..."
w.start()
#this mimics the hack in the C++ reveal tool that attempts to ensure that DF isn't in the middle of
#a frame update
w.set_pause_state(True)
df.resume()
time.sleep(1)
df.suspend()
w.finish()
m.start()
print "Revealing, please wait..."
m_x, m_y, m_z = m.size
hide_blocks = []
for x in xrange(m_x):
for y in xrange(m_y):
for z in xrange(m_z):
if m.is_valid_block(x, y, z):
hb = HideBlock()
hb.x = x
hb.y = y
hb.z = z
d = m.read_designations(x, y, z)
for k_i, i in enumerate(d):
for k_j, j in enumerate(i):
hb.hiddens[k_i][k_j] = j.bits.hidden
j.bits.hidden = 0
hide_blocks.append(hb)
m.write_designations(x, y, z, d)
m.finish()
df.detach()
print "Map revealed. The game has been paused for you."
print "Unpausing can unleash the forces of hell!"
print "Press any key to unreveal."
print "Close to keep the map revealed !!FOREVER!!"
raw_input()
print "Unrevealing...please wait"
df.attach()
m = df.maps
m.start()
for h in hide_blocks:
d = m.read_designations(h.x, h.y, h.z)
for k_i, i in enumerate(h.hiddens):
for k_j, j in enumerate(i):
d[k_i][k_j].bits.hidden = j
m.write_designations(h.x, h.y, h.z, d)
m.finish()
print "Done. Press any key to continue"
raw_input()
df.detach()