changeset 82:b0d97d51df51

Hook up simplistic equipment screen
author Neil Muller <drnlmuller@gmail.com>
date Wed, 09 May 2012 16:51:26 +0200
parents 59afe9f92383
children 2e566813a071
files data/images/equip_grey.png gamelib/gamegui.py gamelib/gamestate.py
diffstat 3 files changed, 113 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
Binary file data/images/equip_grey.png has changed
--- a/gamelib/gamegui.py	Wed May 09 13:03:39 2012 +0200
+++ b/gamelib/gamegui.py	Wed May 09 16:51:26 2012 +0200
@@ -118,12 +118,14 @@
     def on_click(self):
         if self.mode == 'SELECTED':
             # unselect mission
-            self.mode = 'NORMAL'
-            self.set_state('NORMAL')
+            self.reset()
         else:
             # select mission and equipment
             self.mode = 'SELECTED'
             self.set_state('SELECTED')
+            equip = EquipWindow(self.parent.screen, self.mission,
+                    self.parent.game, self)
+            AddWindow.post(equip)
 
     def selected(self):
         return self.mode == 'SELECTED'
@@ -132,11 +134,49 @@
         return self.equipment
 
     def reset(self):
+        for equip in self.equipment:
+            # Release funds
+            self.parent.game.money += equip.COST
+        self.parent.update()
         self.equipment = []
         self.mode = 'NORMAL'
         self.set_state('NORMAL')
 
 
+class EquipWidget(BigButton):
+
+    WIDTH = 200
+
+    BG_IMAGE_NORMAL = image.load(filepath('images/science_normal.png'))
+    BG_IMAGE_DOWN = image.load(filepath('images/science_down.png'))
+    BG_IMAGE_UNAVAILABLE = image.load(filepath('images/equip_grey.png'))
+
+    def __init__(self, equip, pos, parent, copies, available):
+        self.equip = equip
+        self.parent = parent
+        self.available = available
+        super(EquipWidget, self).__init__(pos, '[%s : %d] - %d (x %d)'
+                % (equip.NAME, equip.points, equip.COST, copies), font_small)
+        if not self.available:
+            unavailable = ImageDrawable((0, 0, self.WIDTH, self.HEIGHT),
+                    self.BG_IMAGE_UNAVAILABLE)
+            # Override the default
+            self.add_state('NORMAL', unavailable)
+            self.set_state('NORMAL')
+        self.equipment = []
+
+    def on_mouse_down(self, pos):
+        if self.available:
+            super(EquipWidget, self).on_mouse_down(pos)
+
+    def on_mouse_up(self, pos):
+        if self.available:
+            super(EquipWidget, self).on_mouse_up(pos)
+
+    def on_click(self):
+        self.parent.buy(self.equip)
+
+
 class ValueLabel(TextLabel):
 
     def __init__(self, pos, description):
@@ -150,6 +190,60 @@
         self._draw_text()
 
 
+class EquipWindow(Window):
+
+    def __init__(self, screen, mission, game, parent):
+        super(EquipWindow, self).__init__(screen)
+        exitbut = ExitGameButton()
+        self.add_child(exitbut)
+        reset = ResetButton(self)
+        self.add_child(reset)
+        title = TextLabel((200, 20, 400, 50), "Choose equipment for %s"
+                % mission.NAME, font_medium, (255, 255, 255))
+        self.add_child(title)
+        self.parent = parent
+        self.game = game
+        self.money = ValueLabel((10, 75), 'Money')
+        self.money.set_value(self.game.money)
+        self.add_child(self.money)
+        self._equip = []
+        self._make_equip_widgets()
+
+    def _make_equip_widgets(self):
+        for widget in self._equip:
+            self.remove_child(widget)
+        self._equip = []
+        x = 0
+        y = 150
+        available = self.game.get_available_equipment()
+        for equip in self.game.get_all_equipment():
+            copies = self.parent.equipment.count(equip)
+            widget = EquipWidget(equip, (x, y), self, copies,
+                    equip in available)
+            self._equip.append(widget)
+            self.add_child(widget)
+            x += 200
+            if x >= WIDTH:
+                x = 0
+                y += 100
+
+    def buy(self, equip):
+        self.game.money -= equip.COST
+        self.money.set_value(self.game.money)
+        self.parent.equipment.append(equip)
+        self.parent.parent.update()
+        self._make_equip_widgets()
+
+    def do_reset(self):
+        for equip in self.parent.equipment:
+            # Release funds
+            self.game.money += equip.COST
+        self.money.set_value(self.game.money)
+        self.parent.equipment = []
+        self.parent.parent.update()
+        self._make_equip_widgets()
+
+
 class ResultsWindow(Window):
 
     def __init__(self, screen, messages, turn):
@@ -191,6 +285,7 @@
         self.lab = lab
         self.develop = develop
         self.game = lab.game
+        self.screen = screen
         exitbut = ExitGameButton()
         self.add_child(exitbut)
         end_turn = EndTurnButton(self)
@@ -214,6 +309,9 @@
         self._make_widgets()
 
     def _make_widgets(self):
+        for widget in self._missions:
+            self.remove_child(widget)
+        self._missions = []
         x = 0
         y = 150
         for mission in self.game.get_available_missions():
@@ -233,9 +331,6 @@
         self.lab.end_turn()
 
     def update_widgets(self):
-        for widget in self._missions:
-            self.remove_child(widget)
-        self._missions = []
         self._make_widgets()
 
     def update(self):
@@ -300,9 +395,11 @@
             self.add_child(actbut)
 
     def _make_science_widgets(self):
+        for widget in self._sciences:
+            self.remove_child(widget)
+        self._sciences = []
         x = 0
         y = 150
-
         for science in self.game.lab.science:
             if science.SCIENCE_TYPE == 'schematic':
                 widget = ScienceWidget(science, (x, y), self)
@@ -321,9 +418,6 @@
         self.lab.end_turn()
 
     def update_widgets(self):
-        for widget in self._sciences:
-            self.remove_child(widget)
-        self._sciences = []
         self._make_science_widgets()
         self.update_labels()
 
@@ -379,9 +473,12 @@
         self._make_science_widgets()
 
     def _make_science_widgets(self):
+        # FIXME: Horrible hackery
+        for widget in self._sciences:
+            self.remove_child(widget)
+        self._sciences = []
         x = 0
         y = 150
-
         for science in self.game.lab.science:
             if science.SCIENCE_TYPE == 'research':
                 widget = ScienceWidget(science, (x, y), self)
@@ -393,10 +490,6 @@
                     y += 100
 
     def update_widgets(self):
-        # FIXME: Horrible hackery
-        for widget in self._sciences:
-            self.remove_child(widget)
-        self._sciences = []
         self._make_science_widgets()
 
     def end_turn(self):
--- a/gamelib/gamestate.py	Wed May 09 13:03:39 2012 +0200
+++ b/gamelib/gamestate.py	Wed May 09 16:51:26 2012 +0200
@@ -43,6 +43,12 @@
                      if x.SCIENCE_TYPE == 'schematic' and x.COST <= self.money]
         return available
 
+    def get_all_equipment(self):
+        """Return a list of equipment we could produce, regardless of cost"""
+        equipment = [x for x in self.lab.science
+                     if x.SCIENCE_TYPE == 'schematic']
+        return equipment
+
     def get_available_missions(self):
         """Return a list of missions we can feasibly attempt"""
         available = [x for x in self.missions if x.can_attempt(self)]