Browse Source

Move requirements and cost checking to Player class

Tankernn 7 years ago
parent
commit
d6d95acde6
3 changed files with 43 additions and 24 deletions
  1. 8 22
      citybuilder/messagehandler.py
  2. 20 1
      citybuilder/player.py
  3. 15 1
      config/game.yaml

+ 8 - 22
citybuilder/messagehandler.py

@@ -14,52 +14,38 @@ class MessageHandler:
     def build(self, player, message):
         spec = self.config['building'][message['name']]
         level_index = player.buildings[message['name']]
+        requirements = spec['levels'][level_index]['requirements']
         cost = spec['levels'][level_index]['cost']
-        if not player.resource_check(cost):
-            return {
-                'result': 1
-            }
-        player.add_job({
+        return player.add_job({
             'type': "building",
             'time': cost['time'],
             'name': message['name'],
-        })
+        }, requirements, cost)
 
     def train(self, player, message):
         spec = self.config['unit'][message['name']]
-        if message['level'] > player.research[message['name']]:
-            return {
-                'result': 2
-            }
         level_index = message['level'] - 1
+        requirements = spec['levels'][level_index]['requirements']
         cost = spec['levels'][level_index]['cost']
-        if not player.resource_check(cost):
-            return {
-                'result': 1
-            }
-        player.add_job({
+        return player.add_job({
             'type': "unit",
             'time': cost['time'],
             'name': message['name'],
             'level': message['level'],
-        })
+        }, requirements, cost)
 
     def mission(self, player, message):
         mission = player.missions[message['index']]
-        if not player.resource_check(mission['cost']):
-            return {
-                'result': 1
-            }
         units = list()
         for index in sorted(message['units'], reverse=True):
             units.append(player.units.pop(index))
 
-        player.add_job({
+        return player.add_job({
             'type': "mission",
             'time': mission['cost']['time'],
             'mission': mission,
             'units': units,
-        })
+        }, {}, mission['cost'])
 
     def handle_message(self, connection, player, message):
         handler = self.handlers[message['type']]

+ 20 - 1
citybuilder/player.py

@@ -57,7 +57,15 @@ class Player:
     def check_password(self, password):
         return pbkdf2_sha256.verify(password, self.password)
 
-    def add_job(self, product):
+    def add_job(self, product, requirements, cost):
+        if not self.check_requirements(requirements):
+            return {
+                'result': 2
+            }
+        if not self.resource_check(cost):
+            return {
+                'result': 1
+            }
         self.jobs.append(Job(self, product))
 
     def get_storage_space(self, resource):
@@ -72,6 +80,17 @@ class Player:
         self.resources[resource] += amount
         self.resources[resource] = min(self.get_storage_space(resource), self.resources[resource])
 
+    def check_requirements(self, requirements):
+        if 'buildings' in requirements:
+            for building, level in requirements['buildings'].items():
+                if self.buildings[building] < level:
+                    return False
+        if 'research' in requirements:
+            for research, level in requirements['research'].items():
+                if self.research[research] < level:
+                    return False
+        return True
+
     def resource_check(self, cost):
         """Checks if the resources are available,
         and takes them if that is the case."""

+ 15 - 1
config/game.yaml

@@ -28,12 +28,14 @@ game:
             wood: 100
             stone: 0
             time: 30
+          requirements: {}
         -
           cost:
             gold: 500
             wood: 500
             stone: 100
             time: 120
+          requirements: {}
     barracks:
       name: Barracks
       levels:
@@ -42,6 +44,7 @@ game:
             gold: 50
             wood: 200
             time: 300
+          requirements: {}
     goldmine:
       name: Gold Mine
       production: gold
@@ -52,6 +55,7 @@ game:
             gold: 20
             wood: 100
             time: 10
+          requirements: {}
     vault:
       name: vault
       storage: gold
@@ -61,6 +65,7 @@ game:
           cost:
             wood: 10
             time: 10
+          requirements: {}
     library:
       name: Library
       levels:
@@ -69,12 +74,14 @@ game:
             gold: 1000
             wood: 1000
             time: 7200
+          requirements: {}
         -
           cost:
             gold: 10000
             wood: 1000
             stone: 1000
             time: 43200 # 12 * 3600
+          requirements: {}
   unit:
     peasant:
       name: Peasant
@@ -87,6 +94,7 @@ game:
           cost:
             gold: 100
             time: 1
+          requirements: {}
     footman:
       name: Footman
       levels:
@@ -98,6 +106,9 @@ game:
           cost:
             gold: 10
             time: 10
+          requirements:
+            buildings:
+              barracks: 1
     archer:
       name: Archer
       levels:
@@ -110,6 +121,9 @@ game:
             gold: 5
             wood: 5
             time: 10
+          requirements:
+            buildings:
+              barracks: 1
   missions:
     -
       name: Got wood?
@@ -121,4 +135,4 @@ game:
       rewards:
         resources:
           wood: 200
-      requirements: []
+      requirements: {}