super().__init__()
self.__items = items
self.__json = json
- self.__json_name = json_name
+ if not json_name:
+ self.__json = json = {
+ 'name': '',
+ 'instructions': '',
+ 'version': '',
+ 'items': [],
+ 'start_items': [],
+ 'test_items': {
+ 'pixel_space': [],
+ 'world_space': []}}
self.__inspector = None
self.__context = context
self.__add_item = add_item
'assets/audio/sfx/rollover.ogg'),
'clickSound': loader.load_sfx(
'assets/audio/sfx/click.ogg')}
- w, h, tw, l = 1.8, .9, 30, .36
+ w, h, tw, l = 1.8, 1, 30, .36
self._frm = DirectFrame(frameColor=(.4, .4, .4, .06),
frameSize=(0, w, 0, h),
parent=base.a2dBottomCenter,
pos=(-w/2, 0, 0))
OnscreenText(
- _('Name'), pos=(l - .03, h - .1), parent=self._frm,
+ _('Filename'), pos=(l - .03, h - .1), parent=self._frm,
font=self._common['text_font'],
scale=self._common['scale'],
fg=self._common['text_fg'],
align=TextNode.A_right)
- self.__name_entry = DirectEntry(
+ self.__filenamename_entry = DirectEntry(
scale=self._common['scale'],
pos=(l, 1, h - .1),
entryFont=self._font,
width=tw,
frameColor=self._common['frameColor'],
+ initialText=json_name,
+ parent=self._frm,
+ text_fg=self._common['text_fg'])
+ OnscreenText(
+ _('Name'), pos=(l - .03, h - .2), parent=self._frm,
+ font=self._common['text_font'],
+ scale=self._common['scale'],
+ fg=self._common['text_fg'],
+ align=TextNode.A_right)
+ self.__name_entry = DirectEntry(
+ scale=self._common['scale'],
+ pos=(l, 1, h - .2),
+ entryFont=self._font,
+ width=tw,
+ frameColor=self._common['frameColor'],
initialText=json['name'],
parent=self._frm,
text_fg=self._common['text_fg'])
OnscreenText(
- _('Description'), pos=(l - .03, h - .2), parent=self._frm,
+ _('Description'), pos=(l - .03, h - .3), parent=self._frm,
font=self._common['text_font'],
scale=self._common['scale'],
fg=self._common['text_fg'],
entry['focus']=1
self.__instructions_entry = DirectEntry(
scale=self._common['scale'],
- pos=(l, 1, h - .2),
+ pos=(l, 1, h - .3),
entryFont=self._font,
width=tw,
numLines=12,
item_text_font=self._font, item_text_fg=(.9, .9, .9, 1),
rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
+ DirectButton(
+ image=load_images_btn('plus', 'gray'), scale=.05,
+ pos=(.06, 1, .58),
+ parent=self._frm, command=self.__on_new_scene, state=NORMAL, relief=FLAT,
+ frameColor=fcols[0],
+ rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
+ clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
messenger.send('editor-start')
self.accept('editor-item-click', self.__on_item_click)
self.accept('editor-inspector-destroy', self.__on_inspector_destroy)
def __actually_close(self, arg):
if arg:
- self._frm.destroy()
+ self.destroy()
messenger.send('editor-stop')
self.__dialog.cleanup()
self.__json['name'] = self.__name_entry.get()
self.__json['instructions'] = self.__instructions_entry.get()
self.__json['version'] = self.__compute_hash()
- with open('assets/scenes/%s.json' % self.__json_name, 'w') as f:
+ json_name = self.__filenamename_entry.get()
+ with open('assets/scenes/%s.json' % json_name, 'w') as f:
f.write(dumps(self.__json, indent=2, sort_keys=True))
def __on_scene_list(self):
def __on_inspector_destroy(self):
self.__inspector = None
+
+ def __on_new_scene(self):
+ self.destroy()
+ messenger.send('editor-stop')
+ messenger.send('new_scene')
+
+ def destroy(self):
+ self._frm.destroy()
+ if self.__inspector:
+ self.__inspector.destroy()
+ self.ignore('editor-item-click')
+ self.ignore('editor-inspector-destroy')
@classmethod
def version(cls, scene_name):
+ if not scene_name: return ''
if not scene_name in cls.json_files:
with open(cls.filename(scene_name)) as f:
cls.json_files[scene_name] = loads(f.read())
return bytes(string, 'utf-8').decode('unicode-escape')
def _set_items(self):
+ if not self.__json_name: return
self.items = []
self._test_items = []
if not self.json:
taskMgr.remove(self._scene_tsk)
if hasattr(self, '_success_txt'):
self._success_txt.destroy()
+ self.ignore('editor-inspector-delete')
def _set_camera(self):
base.camera.set_pos(0, -20, 0)
self._item_active.on_mouse_move(pos)
if self._dbg_items:
self._update_info(items_hit[0] if items_hit else None)
- if self._win_condition():
+ if not self.__scene_editor and self._win_condition():
self._start_evt_time = None
self._set_fail() if self._enforce_res == 'fail' else self._set_win()
elif self._state == 'playing' and self._fail_condition():
clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
self._pos_mgr.register('replay', LibP3d.wdg_pos(btn))
btn.set_transparency(True)
- enabled = self._scenes.index(self.__json_name) < len(self._scenes) - 1
- if enabled:
- next_scene = self._scenes[self._scenes.index(self.__json_name) + 1]
+ if self.__json_name:
+ enabled = self._scenes.index(self.__json_name) < len(self._scenes) - 1
+ if enabled:
+ next_scene = self._scenes[self._scenes.index(self.__json_name) + 1]
+ else:
+ next_scene = None
else:
next_scene = None
+ enabled = False
imgs = [self.__load_img_btn('right', col) for col in colors]
btn = DirectButton(
image=imgs, scale=btn_scale,
taskMgr.doMethodLater(1.4, frame_after, 'frame after') # after the intro sequence
def _define_test_items(self):
+ if not self.__json_name: return
if not self.__json_name in self.__class__.json_files:
with open(self.__class__.filename(self.__json_name)) as f:
self.__class__.json_files[self.__json_name] = loads(f.read())