Dialog PrinterΒΆ

This example prints all the dialogs in a module in tree form.

#!/usr/bin/env python

from pynwn import Module

INDENT_WIDTH = 2

def dialog_to_str(dlg):
    def fmt(string, level, link=False):
        justify = INDENT_WIDTH * level
        # Note if the node has no dialog, the string will be None
        if not string:
            res = '<EMPTY>'
        else:
            res = string.strip().replace('\n', '\n'.ljust(justify+1))

        if link:
            res = "Link: " + res

        res = res + '\n'
        return res.rjust(justify + len(res))

    def node_to_str(node, level):
        result = fmt(node.get_text(0), level)
        for ptr in node.pointers:
            node = ptr.get_node(ptr.index)
            # Make sure the dialog pointer isn't a link or else
            # there would be an infinite loop.
            if not ptr.is_link:
                level += 1
                result += node_to_str(node, level)
                level -= 1
            else:
                # Add extra indent for links...
                result += fmt(node.get_text(0), level + 1, True)
        return result

    result = ''
    for start in [s.index for s in dlg.starts]:
        result += node_to_str(dlg.entries[start], 0)

    return result

if __name__ == '__main__':
    mod = Module('test.mod')

    for dlg in mod.glob('*.dlg'):
        print(dlg.resref)
        print(dialog_to_str(dlg), '\n\n')