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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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