comparison src/parpg/systems/scriptingsystem.py @ 189:61d158ce6bc3

Implemented simple script system.
author KarstenBock@gmx.net
date Sat, 12 Nov 2011 16:27:39 +0100
parents 0f659c7675f6
children c97e48257f51
comparison
equal deleted inserted replaced
188:d0aa0f3eecc1 189:61d158ce6bc3
10 # 10 #
11 # You should have received a copy of the GNU General Public License 11 # You should have received a copy of the GNU General Public License
12 # along with this program. If not, see <http://www.gnu.org/licenses/>. 12 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 13
14 from parpg.bGrease import System 14 from parpg.bGrease import System
15 from collections import deque
16
17 class Script(object):
18 """Script object"""
19
20 def __init__(self, condition, actions, commands):
21 """Constructor"""
22 assert(isinstance(actions, deque))
23 self.condition = condition
24 self.actions = actions
25 self.commands = commands
26 self.running = False
27 self.finished = False
28 self.time = 0
29 self.wait = 0
30 self.cur_action = None
31
32 def update(self, time):
33 """Advance the script"""
34 if not self.running:
35 return
36 if self.cur_action and not self.cur_action.executed:
37 return
38 self.time += time
39 if self.wait <= self.time:
40 self.time = 0
41 try:
42 action = self.actions.popleft()
43 self.cur_action = action[0]
44 self.wait = action[1]
45 if len(action) >= 3:
46 vals = action[3:] if len(action) > 3 else ()
47 command = action[2]
48 self.commands[command](*vals, action=self.cur_action)
49 else:
50 self.cur_action.execute()
51 except IndexError:
52 self.finished = True
53 self.running = False
54
15 55
16 class ScriptingSystem(System): 56 class ScriptingSystem(System):
17 """ 57 """
18 System responsible for managing scripts attached to entities to define 58 System responsible for managing scripts attached to entities to define
19 their behavior. 59 their behavior.
20 """ 60 """
21 pass 61
62 def __init__(self, funcs):
63 """Constructor"""
64 self.funcs = funcs
65 self.vals = {}
66 self.scripts = []
67
68 def step(self, dt):
69 """Execute a time step for the system. Must be defined
70 by all system classes.
71
72 :param dt: Time since last step invocation
73 :type dt: float
74 """
75 for script in self.scripts:
76 assert(isinstance(script, Script))
77 if script.finished:
78 self.scripts.remove(script)
79 elif script.running:
80 script.update(dt)
81 elif eval(script.condition, self.funcs, self.vals):
82 script.running = True