Changeset 355:9589e1db4433


Ignore:
Timestamp:
Sep 6, 2013, 3:32:25 PM (7 years ago)
Author:
Neil Muller <drnlmuller@…>
Branch:
default
Message:

Allow copying polygon 6 into terrain objects

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/area_editor.py

    r330 r355  
    5050
    5151
     52class TestWorld(object):
     53
     54    def __init__(self):
     55        self.level_state = {}
     56
     57
    5258class EditorLevel(Level):
    5359
    5460    def __init__(self, name, x=800, y=600):
    55         super(EditorLevel, self).__init__(name, None)
     61        world = TestWorld()
     62        super(EditorLevel, self).__init__(name, world)
    5663        self.x = x
    5764        self.y = y
     
    263270class EditClassDialog(Dialog):
    264271
    265     def __init__(self, classname, cls, data, delete=False):
     272    def __init__(self, classname, cls, data, level_widget,
     273                 delete=False):
    266274        super(EditClassDialog, self).__init__()
     275        self.level_widget = level_widget
    267276        self.classname = classname
    268         self.rect = pygame.rect.Rect(0, 0, 800, 550)
     277        self.rect = pygame.rect.Rect(0, 0, 900, 550)
    269278        title = Label("Editing %s" % classname)
    270279        title.rect = pygame.rect.Rect(100, 10, 600, 25)
     
    274283        self.fields = {}
    275284        index = 0
     285        self.poly_field = None
     286        self.needs_cleanup = False
    276287        for requirement, hint in self.requires:
    277288            label = Label(requirement)
     
    293304                        # Assumed to be arguments with the default value
    294305                        pass
     306            if hint.startswith('polygon'):
     307                self.poly_field = field
    295308            self.fields[requirement] = field
    296309            hintlabel = Label(hint)
    297             hintlabel.rect = pygame.rect.Rect(640, y, 100, 25)
     310            hintlabel.rect = pygame.rect.Rect(640, y, 250, 25)
    298311            self.add(hintlabel)
    299312            y += 30
     313        if self.poly_field:
     314            y += 20
     315            button = Button('Use Polygon 6', action=self.get_poly)
     316            button.rect = pygame.rect.Rect(350, y, 250, 30)
     317            self.add(button)
    300318        buttons = []
    301319        if delete:
     
    309327        row.rect = pygame.rect.Rect(250, 500, 700, 50)
    310328        self.add(row)
     329
     330    def get_poly(self):
     331        try:
     332            data = self.level_widget.level.polygons[6][:]
     333        except KeyError:
     334            data = []
     335        if data:
     336            # We unclose the polygon, because that's what pymunk
     337            # wants
     338            if data[0] == data[-1] and len(data) > 1:
     339                data.pop()
     340            data = [list(x) for x in data]
     341            self.needs_cleanup = True
     342            self.poly_field.set_text('%s' % data)
     343
     344    def cleanup(self):
     345        if self.needs_cleanup:
     346            self.level_widget.level.polygons[6] = []
     347            self.level_widget.invalidate()
    311348
    312349    def get_data(self):
     
    323360            if val == 'name':
    324361                result['name'] = text
     362            elif self.fields[val] == self.poly_field and text:
     363                # Evil, but faster than good
     364                try:
     365                    l = eval(text)
     366                    args.append(' - - %s' % l[0])
     367                    for coord in l[1:]:
     368                        args.append('   - %s' % coord)
     369                except Exception:
     370                    alert("Invalid polygon %s" % text)
     371                    self.needs_cleanup = False
     372                    return None
     373                # Check for convexity
     374                hull = pymunk.util.convex_hull(l)
     375                if hull != l:
     376                    alert("Invalid polygon %s - not convex" % text)
     377                    return None
    325378            else:
    326379                args.append(' - ' + text)
     
    505558    def _edit_class(self, classname, cls, data):
    506559        # Dialog for class properties
    507         dialog = EditClassDialog(classname, cls, data)
     560        dialog = EditClassDialog(classname, cls, data, self)
    508561        if dialog.present() == 'OK':
    509             return dialog.get_data()
     562            return dialog
    510563        return None
    511564
     
    514567        cls = obj.__class__
    515568        classname = obj.__class__.__name__
    516         dialog = EditClassDialog(classname, cls, data, True)
     569        dialog = EditClassDialog(classname, cls, data, self, True)
    517570        res = dialog.present()
    518571        if res == 'OK':
     
    521574                for target in [self.level._game_objects, self.level._enemies]:
    522575                    if data in target:
    523                         self.level.try_new_object(classname, target,
    524                                                   edited, data)
     576                        if self.level.try_new_object(classname, target,
     577                                                     edited, data):
     578                            dialog.cleanup()
    525579                        break
    526580        elif res == 'Delete':
     
    555609        if res == 'OK':
    556610            cls = self.level.get_class(choice['classname'])
    557             edited = self._edit_class(choice['classname'], cls, choice)
    558             if edited is not None:
    559                 self.level.try_new_object(choice["classname"],
    560                                           self.level._game_objects,
    561                                           edited, choice)
     611            edit_dlg = self._edit_class(choice['classname'], cls, choice)
     612            if edit_dlg is not None:
     613                edited = edit_dlg.get_data()
     614                if self.level.try_new_object(choice["classname"],
     615                                             self.level._game_objects,
     616                                             edited, choice):
     617                    edit_dlg.cleanup()
    562618        elif res == 'Delete':
    563619            self.level._game_objects.remove(choice)
     
    572628        if res == 'OK':
    573629            cls = self.level.get_class(choice['classname'], ne)
    574             edited = self._edit_class(choice['classname'], cls, choice)
    575             if edited is not None:
    576                 self.level.try_new_object(choice["classname"],
    577                                           self.level._enemies, edited, choice)
     630            edit_dlg = self._edit_class(choice['classname'], cls, choice)
     631            if edit_dlg is not None:
     632                edited = edit_dlg.get_data()
     633                if self.level.try_new_object(choice["classname"],
     634                                             self.level._enemies,
     635                                             edited, choice):
     636                    edit_dlg.cleanup()
    578637        elif res == 'Delete':
    579638            self.level._enemies.remove(choice)
     
    607666            classname = choice['classname']
    608667            cls = choice['class']
    609             new_cls = self._edit_class(classname, cls, None)
    610             if new_cls is not None:
    611                 self.level.try_new_object(classname, self.level._game_objects,
    612                                           new_cls, None)
     668            edit_dlg = self._edit_class(classname, cls, None)
     669            if edit_dlg is not None:
     670                new_cls = edit_dlg.get_data()
     671                if self.level.try_new_object(classname,
     672                                             self.level._game_objects,
     673                                             new_cls, None):
     674                    edit_dlg.cleanup()
    613675
    614676    def add_enemy(self):
     
    620682            classname = choice['classname']
    621683            cls = choice['class']
    622             new_cls = self._edit_class(classname, cls, None)
    623             if new_cls is not None:
    624                 self.level.try_new_object(classname, self.level._enemies,
    625                                           new_cls, None)
     684            edit_dlg = self._edit_class(classname, cls, None)
     685            if edit_dlg is not None:
     686                new_cls = edit_dlg.get_data()
     687                if self.level.try_new_object(classname, self.level._enemies,
     688                                             new_cls, None):
     689                    edit_dlg.cleanup()
    626690
    627691    def add_puzzler(self):
     
    633697            classname = choice['classname']
    634698            cls = choice['class']
    635             new_cls = self._edit_class(classname, cls, None)
    636             if new_cls is not None:
    637                 self.level.try_new_object(classname, self.level._game_objects,
    638                                           new_cls, None)
     699            edit_dlg = self._edit_class(classname, cls, None)
     700            if edit_dlg is not None:
     701                new_cls = edit_dlg.get_data()
     702                if self.level.try_new_object(classname,
     703                                             self.level._game_objects,
     704                                             new_cls, None):
     705                    edit_dlg.cleanup()
    639706
    640707
Note: See TracChangeset for help on using the changeset viewer.