Mercurial > nagslang
annotate nagslang/environment.py @ 398:e36e6101b766
Restarting the level restores health
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 07 Sep 2013 01:12:21 +0200 |
parents | d42752ab3231 |
children |
rev | line source |
---|---|
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
1 class ProtagonistCondition(object): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
2 """A condition on the protagonist that can be checked. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
3 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
4 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
5 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
6 """Check if this condition applies. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
7 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
8 raise NotImplementedError() |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
9 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
10 |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
11 class YesCondition(ProtagonistCondition): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
12 """Condition that is always met. |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
13 """ |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
14 def check(self, protagonist): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
15 return True |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
16 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
17 |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
18 class AllConditions(ProtagonistCondition): |
32
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
19 """Condition that is met if all provided conditions are met. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
20 |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
21 Conditions are evaluated lazily, so the first condition to fail stops |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
22 processing. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
23 """ |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
24 def __init__(self, *conditions): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
25 self.conditions = conditions |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
26 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
27 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
28 for condition in self.conditions: |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
29 if not condition.check(protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
30 return False |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
31 return True |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
32 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
33 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
34 class AnyCondition(ProtagonistCondition): |
32
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
35 """Condition that is met if any provided condition is met. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
36 |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
37 Conditions are evaluated lazily, so the first condition to pass stops |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
38 processing. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
39 """ |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
40 def __init__(self, *conditions): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
41 self.conditions = conditions |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
42 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
43 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
44 for condition in self.conditions: |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
45 if condition.check(protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
46 return True |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
47 return False |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
48 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
49 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
50 class WolfFormCondition(ProtagonistCondition): |
32
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
51 """Condition that is met if the protagonist is in wolf form. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
52 """ |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
53 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
54 return protagonist.in_wolf_form() |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
55 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
56 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
57 class HumanFormCondition(ProtagonistCondition): |
32
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
58 """Condition that is met if the protagonist is in human form. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
59 """ |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
60 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
61 return protagonist.in_human_form() |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
62 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
63 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
64 class ItemRequiredCondition(ProtagonistCondition): |
32
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
65 """Condition that is met if the protagonist has the required item. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
66 """ |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
67 def __init__(self, required_item): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
68 self.required_item = required_item |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
69 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
70 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
71 return protagonist.has_item(self.required_item) |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
72 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
73 |
32
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
74 class FunctionCondition(ProtagonistCondition): |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
75 """Condition that is met if the provided function returns `True`. |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
76 """ |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
77 def __init__(self, func): |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
78 self.func = func |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
79 |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
80 def check(self, protagonist): |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
81 return self.func(protagonist) |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
82 |
0e49648f8d74
Arbitrary function condition.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
83 |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
84 class PuzzleStateCondition(ProtagonistCondition): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
85 """Condition that is met if the provided function returns `True`. |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
86 """ |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
87 def __init__(self, puzzler): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
88 self.puzzler = puzzler |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
89 |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
90 def check(self, protagonist): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
91 return self.puzzler.get_state() |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
92 |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
93 |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
94 class Action(object): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
95 """Representation of an action that can be performed. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
96 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
97 If the (optional) condition is met, the provided function will be called |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
98 with the protagonist as a parameter. It is assumed that the function |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
99 already knows about the target. |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
100 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
101 def __init__(self, func, condition=None): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
102 self.func = func |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
103 self.condition = condition |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
104 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
105 def check(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
106 if self.condition is None: |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
107 return True |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
108 return self.condition.check(protagonist) |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
109 |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
110 def perform(self, protagonist): |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
111 if not self.check(protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
112 raise ValueError("Attempt to perform invalid action.") |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
113 return self.func(protagonist) |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
114 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
115 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
116 class Interactible(object): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
117 """The property of interactibility on a thing. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
118 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
119 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
120 def __init__(self, *actions): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
121 self.actions = actions |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
122 |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
123 def set_game_object(self, game_object): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
124 self.game_object = game_object |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
125 |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
126 def select_action(self, protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
127 """Select a possible action given the protagonist's state. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
128 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
129 for action in self.actions: |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
130 if action.check(protagonist): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
131 return action |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
132 return None |