view gamelib/visualize.py @ 245:c39599854a2d

Better 'You've Won' Screen
author Neil Muller <drnlmuller@gmail.com>
date Sun, 13 May 2012 00:43:30 +0200
parents e49f2dba0ad4
children
line wrap: on
line source

import networkx

from gamelib.lab import Lab


COLORS = {
    'schematic': 'green',
    'research': 'blue',
    }


def color(science):
    return COLORS[science.SCIENCE_TYPE]


def add_node(rt, science):
    rt.add_node(science, label=science.NAME, color=color(science),
                group=science.NAME, fillcolor='light' + color(science),
                style='filled')


def add_pre_node(rt, prior, science, points):
    name = "%s%s" % (science.NAME[:3], points)
    if name not in rt:
        rt.add_node(name, color=color(science), group=science.NAME)
        rt.add_edge(prior, name, color=color(science))
    return name


def add_prereqs(rt, science):
    for pre, points in science.PREREQUISITES:
        prior = pre
        for i in range(points):
            prior = add_pre_node(rt, prior, pre, i + 1)
        rt.add_edge(prior, science, color=color(science))


def graph_sciences(rt, sciences):
    for science in sciences:
        add_node(rt, science)
    for science in sciences:
        add_prereqs(rt, science)


def construct_research_tree(lab):
    rt = networkx.DiGraph()
    # We do these separately for a better layout.
    graph_sciences(rt, lab.new_research)
    graph_sciences(rt, lab.new_schematics)
    return rt


def draw(rt):
    agraph = networkx.to_agraph(rt)
    agraph.graph_attr['label'] = 'Research Tree'
    agraph.write('research_tree.dot')


def main():
    lab = Lab({'science': {}})
    research_tree = construct_research_tree(lab)
    draw(research_tree)