Mercurial > sypikslang
annotate gamelib/lab.py @ 23:f6a3b213857b
Fix up some game state logic, add very basic REPL game interface.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sun, 06 May 2012 19:06:28 +0200 |
parents | bdc6bfc34ef2 |
children | 23720d0fd9a0 |
rev | line source |
---|---|
14 | 1 # -*- test-case-name: gamelib.tests.test_lab -*- |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
2 |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
3 from random import random, choice |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
4 |
14 | 5 from gamelib import research, products |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
6 |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
7 |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
8 class Lab(object): |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
9 BASIC_RESEARCH_SUCCESS_RATE = 0.05 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
10 BASIC_RESEARCH_SUCCESS_MULTIPLIER = 2 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
11 |
20 | 12 def __init__(self, init_data=None): |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
13 self.science = [] |
14 | 14 self.new_research = research.ResearchArea.__subclasses__() |
15 self.new_products = products.Product.__subclasses__() | |
20 | 16 |
17 if init_data is not None: | |
18 # Load stored state. | |
19 self._load_data(init_data) | |
20 else: | |
21 # New game. | |
22 self._choose_initial_science() | |
23 | |
24 def _load_data(self, init_data): | |
25 for name, points in init_data['science'].iteritems(): | |
26 module, cls = name.split('.') | |
27 if module == 'products': | |
28 science = getattr(products, cls) | |
29 elif module == 'research': | |
30 science = getattr(research, cls) | |
31 else: | |
32 raise ValueError("Unknown science type: %s" % (module,)) | |
33 self._gain_science(science(points)) | |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
34 |
21 | 35 def save_data(self): |
36 data = {'science': {}} | |
37 for science in self.science: | |
38 science_class = type(science) | |
39 name = "%s.%s" % (science_class.__module__.split('.')[-1], | |
40 science_class.__name__) | |
41 data['science'][name] = science.points | |
42 return data | |
43 | |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
44 def _choose_initial_science(self): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
45 # We always get all starting products. |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
46 for product in self.new_products[:]: |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
47 if product.STARTING_PRODUCT: |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
48 self._gain_science(product()) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
49 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
50 # We get three random sciences with no prerequisites. |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
51 new_science = [] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
52 for _ in range(3): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
53 science = choice(self.find_new_research())() |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
54 self._gain_science(science) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
55 new_science.append(science) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
56 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
57 # Add a point to each of our sciences, and see if we get products. |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
58 self.spend_points(new_science, 0) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
59 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
60 def _gain_science(self, science): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
61 self.science.append(science) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
62 if isinstance(science, research.ResearchArea): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
63 self.new_research.remove(type(science)) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
64 elif isinstance(science, products.Product): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
65 self.new_products.remove(type(science)) |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
66 |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
67 def spend_points(self, things, basic_research): |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
68 breakthroughs = [] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
69 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
70 # First, allocate the points. |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
71 for thing in things: |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
72 assert thing in self.science |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
73 assert thing.can_spend(self) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
74 thing.spend_point() |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
75 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
76 # Next, check for product breakthroughs and upgrades |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
77 for thing in things: |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
78 if isinstance(thing, research.ResearchArea): |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
79 breakthroughs.extend(self.apply_area_research(thing)) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
80 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
81 # Finally, check for research breakthroughs. |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
82 breakthroughs.extend(self.apply_basic_research(basic_research)) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
83 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
84 return breakthroughs |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
85 |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
86 def _get_science(self, science_class): |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
87 for science in self.science: |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
88 if isinstance(science, science_class): |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
89 return science |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
90 return None |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
91 |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
92 def meet_requirements(self, science_class, extra=0): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
93 total_points = 0 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
94 base_points = 0 |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
95 for science, level in science_class.PREREQUISITES: |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
96 my_science = self._get_science(science) |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
97 if my_science is None: |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
98 return False |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
99 if my_science.points < level: |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
100 return False |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
101 base_points += level |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
102 total_points += my_science.points |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
103 return total_points - base_points >= extra |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
104 |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
105 def find_new_products(self, research_area): |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
106 available_products = [] |
14 | 107 for product_class in self.new_products: |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
108 if self.meet_requirements(product_class): |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
109 available_products.append(product_class) |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
110 return available_products |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
111 |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
112 def find_new_research(self): |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
113 available_research = [] |
14 | 114 for research_class in self.new_research: |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
115 if self.meet_requirements(research_class): |
6
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
116 available_research.append(research_class) |
826b44731323
Start of basic lab implementation.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
117 return available_research |
17
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
118 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
119 def apply_area_research(self, research): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
120 options = self.find_new_products(research) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
121 breakthroughs = [product for product in options |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
122 if random() < product.ACQUISITION_CHANCE] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
123 if breakthroughs: |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
124 breakthrough = choice(breakthroughs)() |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
125 self._gain_science(breakthrough) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
126 breakthroughs = [breakthrough] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
127 return breakthroughs |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
128 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
129 def apply_basic_research(self, basic_research): |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
130 if basic_research <= 1: |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
131 return [] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
132 |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
133 options = self.find_new_research() |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
134 success_chance = self.BASIC_RESEARCH_SUCCESS_RATE * ( |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
135 self.BASIC_RESEARCH_SUCCESS_MULTIPLIER ** basic_research) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
136 breakthroughs = [research for research in options |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
137 if random() < success_chance] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
138 if breakthroughs: |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
139 breakthrough = choice(breakthroughs)(1) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
140 self._gain_science(breakthrough) |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
141 breakthroughs = [breakthrough] |
10d3db1f1e08
Set up initial research and rework breakthroughs.
Jeremy Thurgood <firxen@gmail.com>
parents:
14
diff
changeset
|
142 return breakthroughs |