changeset 111:bb76ce231ff9

Merge changes.
author Simon Cross <hodgestar@gmail.com>
date Wed, 09 May 2012 22:37:49 +0200
parents ff7c953502d5 (current diff) 5bb711cdc569 (diff)
children f741bedf6670
files
diffstat 4 files changed, 83 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- 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__
--- /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)
--- /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()