ya2 · news · projects · code · about

json: scene items
[pmachines.git] / pmachines / scene.py
index a26676b3e97ba726b8f90334a5fe3e782c3b050a..bc151eb683d80bee34080df87387d9b0f1052a00 100644 (file)
@@ -14,9 +14,9 @@ from direct.interval.IntervalGlobal import Sequence, Func
 from direct.interval.LerpInterval import LerpFunctionInterval
 from pmachines.items.background import Background
 from pmachines.gui.sidepanel import SidePanel
-from pmachines.items.box import Box
+from pmachines.items.box import Box, HitStrategy
 from pmachines.items.basketball import Basketball
-from pmachines.items.domino import Domino
+from pmachines.items.domino import Domino, DownStrategy
 from pmachines.items.shelf import Shelf
 from pmachines.items.teetertooter import TeeterTooter
 from ya2.utils.cursor import MouseCursor
@@ -98,7 +98,8 @@ class Scene(DirectObject):
                 'cb_inst': self.cb_inst,
                 'curr_bottom': self.current_bottom,
                 'repos': self.repos,
-                'count': item['count']}
+                'count': item['count'],
+                'json': item}
             if 'mass' in item:
                 args['mass'] = item['mass']
             if 'friction' in item:
@@ -111,6 +112,7 @@ class Scene(DirectObject):
                 'cb_inst': self.cb_inst,
                 'curr_bottom': self.current_bottom,
                 'repos': self.repos,
+                'json': item,
                 'mass': 0}
             args['pos'] = tuple(item['position'])
             if 'roll' in item:
@@ -120,6 +122,30 @@ class Scene(DirectObject):
             if 'friction' in item:
                 args['friction'] = item['friction']
             self.items += [self.__code2class(item['class'])(**args)]
+        for item in self.__class__.json['scene_items']:
+            args = {
+                'world': self._world,
+                'plane_node': self._mouse_plane_node,
+                'cb_inst': self.cb_inst,
+                'curr_bottom': self.current_bottom,
+                'repos': self.repos,
+                'json': item}
+            args['pos'] = tuple(item['position'])
+            if 'mass' in item:
+                args['mass'] = item['mass']
+            if 'friction' in item:
+                args['friction'] = item['friction']
+            if 'roll' in item:
+                args['r'] = item['roll']
+            if 'model_scale' in item:
+                args['model_scale'] = item['model_scale']
+            self.items += [self.__code2class(item['class'])(**args)]
+            if 'strategy' in item:
+                match item['strategy']:
+                    case 'DownStrategy':
+                        self.items[-1].set_strategy(self.__code2class(item['strategy'])(self.items[-1]._np, *item['strategy_args']))
+                    case 'HitStrategy':
+                        self.items[-1].set_strategy(self.__code2class(item['strategy'])(self.__item_with_id(item['strategy_args'][0]), self.items[-1].node, self.items[-1]._world))
 
     def __code2class(self, code):
         return {
@@ -127,9 +153,16 @@ class Scene(DirectObject):
             'Basketball': Basketball,
             'Domino': Domino,
             'Shelf': Shelf,
-            'TeeterTooter': TeeterTooter
+            'TeeterTooter': TeeterTooter,
+            'DownStrategy': DownStrategy,
+            'HitStrategy': HitStrategy
         }[code]
 
+    def __item_with_id(self, id):
+        for item in self.items:
+            if 'id' in item.json and item.json['id'] == id:
+                return item
+
     def screenshot(self, task=None):
         tex = Texture('screenshot')
         buffer = base.win.make_texture_buffer('screenshot', 512, 512, tex, True )