ya2 · news · projects · code · about

82be1ca109259ed3712503d4ccc8a925edb152a2
[pmachines.git] / ya2 / gameobject.py
1 from direct.fsm.FSM import FSM
2 from direct.showbase.DirectObject import DirectObject
3 from ya2.observer import Subject
4
5
6 class Colleague(Subject):
7
8 eng = None
9
10 def __init__(self, mediator):
11 Subject.__init__(self)
12 self.mediator = mediator # refactor: remove it
13
14 def destroy(self):
15 self.mediator = None
16 Subject.destroy(self)
17
18
19 class FsmColleague(FSM, Colleague):
20
21 def __init__(self, mediator):
22 FSM.__init__(self, self.__class__.__name__)
23 Colleague.__init__(self, mediator)
24
25 def destroy(self):
26 if self.state: self.cleanup()
27 Colleague.destroy(self)
28
29
30 class EventColleague(Colleague, DirectObject):
31
32 def destroy(self):
33 self.ignoreAll()
34 Colleague.destroy(self)
35
36
37 class AudioColleague(Colleague): pass
38
39
40 class AiColleague(Colleague): pass
41
42
43 class GfxColleague(Colleague): pass
44
45
46 class GuiColleague(Colleague): pass
47
48
49 class LogicColleague(Colleague):
50
51 def on_start(self): pass
52
53
54 class PhysColleague(Colleague): pass
55
56
57 class GODirector:
58
59 def __init__(self, tgt_obj, init_lst, end_cb):
60 self.__obj = tgt_obj
61 tgt_obj.attach(self.on_comp_blt)
62 self.end_cb = end_cb
63 self.completed = [False for _ in init_lst]
64 self.pending = {}
65 self.__init_lst = init_lst
66 for idx, _ in enumerate(init_lst): self.__process_lst(tgt_obj, idx)
67
68 def __process_lst(self, obj, idx):
69 if not self.__init_lst[idx]:
70 self.end_lst(idx)
71 return
72 comp_info = self.__init_lst[idx].pop(0)
73 attr_name, cls, arguments = comp_info
74 self.pending[cls.__name__] = idx
75 setattr(obj, attr_name, cls(*arguments))
76
77 def on_comp_blt(self, obj):
78 self.__process_lst(obj.mediator, self.pending[obj.__class__.__name__])
79
80 def end_lst(self, idx):
81 self.completed[idx] = True
82 if all(self.completed):
83 if self.end_cb: self.end_cb()
84 self.destroy()
85
86 def destroy(self):
87 self.__obj.detach(self.on_comp_blt)
88 self.__obj = self.end_cb = self.__init_lst = None
89
90
91 class GameObject(Subject): pass