changeset 156:abaf6853fe37

Redo mission screen
author Neil Muller <drnlmuller@gmail.com>
date Fri, 11 May 2012 21:14:41 +0200
parents f4601492020b
children db8df35ae599
files gamelib/gamegui.py
diffstat 1 files changed, 88 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/gamegui.py	Fri May 11 21:09:01 2012 +0200
+++ b/gamelib/gamegui.py	Fri May 11 21:14:41 2012 +0200
@@ -63,9 +63,26 @@
         super(NextTurnButton, self).__init__(((WIDTH - 128), 10), 'Next Turn')
 
 
-class DoneButton(PopWindowButton):
-    def __init__(self):
-        super(DoneButton, self).__init__(((WIDTH - 128), 10), 'Done')
+class AssignButton(PopWindowButton):
+    def __init__(self, parent):
+        super(AssignButton, self).__init__(((WIDTH - 128), 10),
+                'Assign Mission')
+        self.parent = parent
+
+    def on_click(self):
+        self.parent.accept()
+        super(AssignButton, self).on_click()
+
+
+class CancelButton(PopWindowButton):
+    def __init__(self, parent):
+        super(CancelButton, self).__init__(((WIDTH - 256), 10),
+                'Cancel Mission')
+        self.parent = parent
+
+    def on_click(self):
+        self.parent.cancel()
+        super(CancelButton, self).on_click()
 
 
 class ResetButton(BigButton):
@@ -168,17 +185,25 @@
         self.set_state(self.mode)
         self.on_click()
 
+    def select(self):
+        if not self.selected():
+            self.game.minions -= self.minions
+            self.mode = 'SELECTED'
+            self.set_state(self.mode)
+        self.parent.update_labels()
+
+    def unselect(self):
+        if self.selected():
+            # Unassign the minions from the main game
+            self.game.minions += self.minions
+        self.reset()
+
     def on_click(self):
-        if self.mode == 'SELECTED':
-            # unselect mission
-            self.reset()
-        elif self.mission.can_attempt(self.game):
-            # select mission and equipment
-            self.mode = 'SELECTED'
-            self.set_state('SELECTED')
-            self.minions = self.mission.MINIONS_REQUIRED
-            self.game.minions -= self.minions
-            self.parent.update_labels()
+        # select mission and equipment
+        if self.game.minions > 0 or self.selected():
+            if not self.selected():
+                # Assign the minions automatically
+                self.minions = self.mission.MINIONS_REQUIRED
             equip = EquipWindow(self.parent.screen, self.mission,
                     self.game, self)
             AddWindow.post(equip)
@@ -193,7 +218,6 @@
         for equip in self.equipment:
             # Release funds
             self.game.money += equip.COST
-        self.game.minions += self.minions
         self.minions = 0
         self.parent.update()
         self.equipment = []
@@ -239,7 +263,7 @@
 
     def __init__(self, pos, description):
         self.description = description
-        rect = (pos[0], pos[1], 300, 50)
+        rect = (pos[0], pos[1], 300, 20)
         super(ValueLabel, self).__init__(rect,
                 '%s : 0' % description, font_medium, (255, 255, 0))
 
@@ -252,30 +276,69 @@
 
     def __init__(self, screen, mission, game, parent):
         super(EquipWindow, self).__init__(screen)
-        donebut = DoneButton()
-        self.add_child(donebut)
+        assign = AssignButton(self)
+        self.add_child(assign)
+        cancel = CancelButton(self)
+        self.add_child(cancel)
         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)
-        description = TextBox((10, 70, 790, 20), mission.LONG_DESCRIPTION,
-                font_medium, (255, 255, 255))
-        self.add_child(description)
+        self.description = TextBox((10, 70, 790, 20),
+                mission.LONG_DESCRIPTION, font_medium, (255, 255, 255))
+        self.add_child(self.description)
         self.parent = parent
         self.game = game
-        self.money = ValueLabel((10, description.rect.height + 75), 'Money')
+        self.money = ValueLabel((10, self.description.rect.height + 75),
+                'Money')
         self.money.set_value(self.game.money)
+        self.minions = ValueLabel((310, self.description.rect.height + 75),
+                'Minions Assigned')
+        self.minions.set_value(self.parent.minions)
         self.add_child(self.money)
+        self.add_child(self.minions)
+        inventory = TextLabel((10, self.description.rect.height + 90, 400, 20),
+                'Current Inventory', font_medium, (255, 255, 255))
+        self.add_child(inventory)
         self._equip = []
+        self._inventory = []
+        self._update_widgets()
+
+    def cancel(self):
+        self.do_reset()
+        self.parent.unselect()
+
+    def accept(self):
+        self.parent.select()
+
+    def _update_widgets(self):
+        self._make_inventory()
         self._make_equip_widgets()
 
+    def _make_inventory(self):
+        for widget in self._inventory:
+            self.remove_child(widget)
+        self._inventory = []
+        x = 10
+        y = 110 + self.description.rect.height
+        # collections.Counter is python 2.7. This is a bother
+        equipment = sorted(set(self.parent.equipment), key=lambda x: x.NAME)
+        for equip in equipment:
+            count = self.parent.equipment.count(equip)
+            widget = TextLabel((x, y, 700, 15), '%s  x %s'
+                    % (equip.NAME, count), font_small, (255, 255, 255))
+            y += 15
+            self._inventory.append(widget)
+            self.add_child(widget)
+
     def _make_equip_widgets(self):
         for widget in self._equip:
             self.remove_child(widget)
         self._equip = []
         x = 0
-        y = 150
+        y = max(250, 130 + self.description.rect.height +
+                20 * len(self._inventory))
         available = self.game.get_available_equipment()
         for equip in self.game.get_all_equipment():
             copies = self.parent.equipment.count(equip)
@@ -286,14 +349,14 @@
             x += 200
             if x >= WIDTH:
                 x = 0
-                y += 100
+                y += 50
 
     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()
+        self._update_widgets()
 
     def do_reset(self):
         for equip in self.parent.equipment:
@@ -302,7 +365,7 @@
         self.money.set_value(self.game.money)
         self.parent.equipment = []
         self.parent.parent.update()
-        self._make_equip_widgets()
+        self._update_widgets()
 
 
 class ResultsWindow(Window):