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()
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