# HG changeset patch # User Simon Cross # Date 1336595869 -7200 # Node ID bb76ce231ff9a317543bb7f9f647d55400eecf99 # Parent ff7c953502d5b5c7047b042b8b8e3851389157c8# Parent 5bb711cdc569a8b68a04d15397574d5babe15714 Merge changes. diff -r ff7c953502d5 -r bb76ce231ff9 gamelib/gamegui.py --- a/gamelib/gamegui.py Wed May 09 22:37:07 2012 +0200 +++ b/gamelib/gamegui.py Wed May 09 22:37:49 2012 +0200 @@ -22,6 +22,18 @@ from gamelib.gamestate import Game +def _lookup_reputation(rep): + """Turn reputation in a nice string""" + + if rep < 0: + return 'Mindless Thug' + if rep < 10: + return 'Fringe Lunatic' + if rep < 100: + return 'Mad Scientist' + return 'Major Threat to World Peace' + + class ExitGameButton(BigButton): def __init__(self): @@ -310,13 +322,12 @@ self.add_child(won) -class ActivityWindow(Window): +class GameStateWindow(Window): + """Base class for windows that show a lot of game state info""" - def __init__(self, screen, lab, develop): - super(ActivityWindow, self).__init__(screen) - self.lab = lab - self.develop = develop - self.game = lab.game + def __init__(self, screen, game): + super(GameStateWindow, self).__init__(screen) + self.game = game self.screen = screen exitbut = ExitGameButton() self.add_child(exitbut) @@ -335,9 +346,22 @@ self.reputation = ValueLabel((310, 95), 'Reputation') self.add_child(self.reputation) + def update_labels(self): + self.points.set_value(self.game.get_available_points()) + self.money.set_value(self.game.money) + self.milestone.set_value(self.game.milestone) + self.reputation.set_value(_lookup_reputation(self.game.reputation)) + + +class ActivityWindow(GameStateWindow): + + def __init__(self, screen, lab, develop): + super(ActivityWindow, self).__init__(screen, lab.game) + self.lab = lab + self.develop = develop + labbut = SwitchWinButton((150, 10), 'Research', lab) self.add_child(labbut) - devbut = SwitchWinButton((300, 10), 'Development', develop) self.add_child(devbut) @@ -373,12 +397,6 @@ def update(self): self.update_labels() - def update_labels(self): - self.points.set_value(self.game.get_available_points()) - self.money.set_value(self.game.money) - self.milestone.set_value(self.game.milestone) - self.reputation.set_value(self.game.reputation) - def do_reset(self): self.lab.reset() self.develop.reset() @@ -399,29 +417,12 @@ self.update_labels() -class DevelopmentWindow(Window): +class DevelopmentWindow(GameStateWindow): """Window for handling schematics research""" def __init__(self, screen, lab): - super(DevelopmentWindow, self).__init__(screen) + super(DevelopmentWindow, self).__init__(screen, lab.game) self.lab = lab - self.game = lab.game - exitbut = ExitGameButton() - self.add_child(exitbut) - end_turn = EndTurnButton(self) - self.add_child(end_turn) - reset = ResetButton(self) - self.add_child(reset) - - self.points = ValueLabel((10, 75), 'Available Human Resources') - self.add_child(self.points) - self.money = ValueLabel((310, 75), 'Money') - self.add_child(self.money) - - self.milestone = ValueLabel((10, 95), 'Currently taken over') - self.add_child(self.milestone) - self.reputation = ValueLabel((310, 95), 'Reputation') - self.add_child(self.reputation) labbut = SwitchWinButton((150, 10), 'Research', lab) self.add_child(labbut) @@ -468,12 +469,6 @@ def update(self): self.update_labels() - def update_labels(self): - self.points.set_value(self.game.get_available_points()) - self.money.set_value(self.game.money) - self.milestone.set_value(self.game.milestone) - self.reputation.set_value(self.game.reputation) - def do_reset(self): self.reset() self.lab.reset() @@ -484,31 +479,14 @@ widget.reset() -class LabWindow(Window): +class LabWindow(GameStateWindow): """Window for the research lab""" def __init__(self, screen, game_dict): - super(LabWindow, self).__init__(screen) - self.screen = screen self.game = Game(game_dict) - exit = ExitGameButton() - self.add_child(exit) - end_turn = EndTurnButton(self) - self.add_child(end_turn) - reset = ResetButton(self) - self.add_child(reset) + super(LabWindow, self).__init__(screen, self.game) self.autosave = get_save_filename() - self.points = ValueLabel((10, 75), 'Available Human Resources') - self.add_child(self.points) - self.money = ValueLabel((310, 75), 'Money') - self.add_child(self.money) - - self.milestone = ValueLabel((10, 95), 'Currently taken over') - self.add_child(self.milestone) - self.reputation = ValueLabel((310, 95), 'Reputation') - self.add_child(self.reputation) - self.develop = DevelopmentWindow(screen, self) self.activity = ActivityWindow(screen, self, self.develop) self.develop.set_activity_window(self.activity) @@ -552,11 +530,15 @@ PopWindow.post() GameOver.post(results) return + self.save_game() self.game.start_turn() self.update_labels() self.update_widgets() self.develop.update_widgets() self.activity.update_widgets() + AddWindow.post(results) + + def save_game(self): game_data = self.game.save_data() if self.autosave: # Don't corrupt the savefile if json crashes @@ -564,17 +546,10 @@ savefile = open(self.autosave, 'w') savefile.write(data) savefile.close() - AddWindow.post(results) def update(self): self.update_labels() - def update_labels(self): - self.points.set_value(self.game.get_available_points()) - self.money.set_value(self.game.money) - self.milestone.set_value(self.game.milestone) - self.reputation.set_value(self.game.reputation) - def do_reset(self): self.reset() self.develop.reset() diff -r ff7c953502d5 -r bb76ce231ff9 gamelib/gamestate.py --- a/gamelib/gamestate.py Wed May 09 22:37:07 2012 +0200 +++ b/gamelib/gamestate.py Wed May 09 22:37:49 2012 +0200 @@ -5,7 +5,7 @@ from gamelib import missions, lab from gamelib.game_base import get_subclasses -from gamelib.constants import NEW_SCIENCE, NEW_SCHEMATIC +from gamelib.constants import NEW_SCIENCE, NEW_SCHEMATIC, M_VALS class Game(object): @@ -33,7 +33,7 @@ def start_turn(self): # Make more flexible? - self.points += 3 + self.points += 1 + M_VALS[self.milestone] * 2 self.turn += 1 self.cur_missions = [] self.cur_allocation = [] @@ -93,6 +93,7 @@ data['milestone'] = self.milestone data['points'] = self.points data['lab'] = self.lab.save_data() + data['turn'] = self.turn # Save mission state data['missions'] = {} for mission in self.missions: @@ -105,6 +106,7 @@ self.money = data['money'] self.reputation = data['reputation'] self.points = data['points'] + self.turn = data['turn'] self.lab = lab.Lab(data['lab']) for mis_class in missions.Mission.__subclasses__(): miss_name = mis_class.__name__ diff -r ff7c953502d5 -r bb76ce231ff9 gamelib/visualize.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gamelib/visualize.py Wed May 09 22:37:49 2012 +0200 @@ -0,0 +1,32 @@ +import networkx + +from gamelib.lab import Lab + + +def construct_research_tree(lab): + rt = networkx.DiGraph() + for research in lab.new_research: + rt.add_node(research, label=research.NAME, color='green') + for research in lab.new_research: + for prereq in research.PREREQUISITES: + rt.add_edge(prereq[0], research, weight=1.0 / prereq[1], \ + label=prereq[1], color='green') + for schematic in lab.new_schematics: + rt.add_node(schematic, label=schematic.NAME, color='red') + for schematic in lab.new_schematics: + for prereq in schematic.PREREQUISITES: + rt.add_edge(prereq[0], schematic, weight=1.0 / prereq[1], \ + label=prereq[1], color='red', size=schematic.COST / 10) + 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) diff -r ff7c953502d5 -r bb76ce231ff9 run_visualization.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/run_visualization.py Wed May 09 22:37:49 2012 +0200 @@ -0,0 +1,8 @@ +#! /usr/bin/env python +''' +Requires graphviz, pygraphviz, and networkx +''' + + +from gamelib import visualize +visualize.main()