Example #1
0
    def copy_inside_definition_tags(self, new_swf, define_sprite):
        """
        new_swf に MovieClip 内部で用いられている
        Definition Tags を追加する
        """
        # ID 更新用辞書
        update_character_dict = {}
        
        # 全ての DefinitionTags'ID を queue に収集する
        queue = self.swf.get_all_definition_tags(define_sprite, depth=1, dts=defaultdict(set))
        """
        new_swf 内に DefinitionTag があるかどうか調べて、
        ・無ければ   -> new_swf の blocks に追加して、新規IDを取得する
        ・存在すれば -> 既存ID を取得する
        """
        for d in flatten_defaultdict_set(queue):
            ch_id = new_swf.get_same_definition_tag(self.swf.character_dict[d])
            if ch_id:
                update_character_dict[d] = ch_id
            else:
                new_dt_id = new_swf.insert_definition_tag(
                    new_dt=self.swf.character_dict[d],
                    before_dt=define_sprite)
                update_character_dict[d] = new_dt_id

        """
        最後に ID 更新用辞書に基づいて queue 内の DefineSprite 内の
        PlaceObject2 の TargetCharacterID を全て更新する

        queue の中身は、階層の深さ毎に ID が set として記述されている
        深い階層から順番に update_value を行う
        """
        for i in range(max(queue), 0, -1):
            for q in queue[i]:
                ds = new_swf.character_dict[update_character_dict[q]]
                if not isinstance(ds, DefineSprite):
                    continue

                for block in ds.blocks:
                    if isinstance(block, PlaceObject2) and block.target_character_id != None:
                        new_id = update_character_dict[block.target_character_id]
                        block.set_target_character_id(new_id)
                ds.update_value()

        for block in define_sprite.blocks:
            if isinstance(block, PlaceObject2) and block.target_character_id != None:
                new_id = update_character_dict[block.target_character_id]
                block.set_target_character_id(new_id)
        define_sprite.update_value()
Example #2
0
 def get_all_definition_tags(self, ds, depth=1, dts=defaultdict(set)):
     """
     DefineSprite(ds) 内の DefinitionTag を全て列挙する
     """
     for block in ds.blocks:
         if isinstance(block, PlaceObject2) and block.target_character_id != None:
             ch_id = block.target_character_id
             if not ch_id in flatten_defaultdict_set(dts):
                 dts[depth].add(ch_id)
                 if not ch_id in self.character_dict:  # ???
                     continue
                 if isinstance(self.character_dict[ch_id], DefineSprite):
                     self.get_all_definition_tags(
                         self.character_dict[ch_id],
                         depth + 1,
                         dts)
     return dts