def export(exp_data: ExportData) -> None: """Export all the packlists.""" pack_block = Property('PackList', []) for pack in PackList.all(): # type: PackList # Build a # "Pack_id" # { # "File" "filename" # "File" "filename" # } # block for each packlist files = [Property('File', file) for file in pack.files] pack_block.append(Property( pack.id, files, )) LOGGER.info('Writing packing list!') with open(exp_data.game.abs_path('bin/bee2/pack_list.cfg'), 'w') as pack_file: for line in pack_block.export(): pack_file.write(line)
def export(exp_data: ExportData) -> None: """Export the quotepack.""" if exp_data.selected is None: return # No quote pack! try: voice = QuotePack.by_id(exp_data.selected) # type: QuotePack except KeyError: raise Exception("Selected voice ({}) doesn't exist?".format( exp_data.selected)) from None vbsp_config = exp_data.vbsp_conf # type: Property # We want to strip 'trans' sections from the voice pack, since # they're not useful. for prop in voice.config: if prop.name == 'quotes': vbsp_config.append(QuotePack.strip_quote_data(prop)) else: vbsp_config.append(prop.copy()) # Set values in vbsp_config, so flags can determine which voiceline # is selected. options = vbsp_config.ensure_exists('Options') options['voice_pack'] = voice.id options['voice_char'] = ','.join(voice.chars) if voice.cave_skin is not None: options['cave_port_skin'] = str(voice.cave_skin) if voice.studio is not None: options['voice_studio_inst'] = voice.studio options['voice_studio_actor'] = voice.studio_actor options['voice_studio_inter_chance'] = str(voice.inter_chance) options['voice_studio_cam_loc'] = voice.cam_loc.join(' ') options['voice_studio_cam_pitch'] = str(voice.cam_pitch) options['voice_studio_cam_yaw'] = str(voice.cam_yaw) options['voice_studio_should_shoot'] = srctools.bool_as_int( voice.turret_hate) # Copy the config files for this voiceline.. for prefix, pretty in [('', 'normal'), ('mid_', 'MidChamber'), ('resp_', 'Responses')]: path = utils.conf_location('config/voice/') / (prefix.upper() + voice.id + '.cfg') LOGGER.info('Voice conf path: {}', path) if path.is_file(): shutil.copy( str(path), exp_data.game.abs_path( 'bin/bee2/{}voice.cfg'.format(prefix))) LOGGER.info('Written "{}voice.cfg"', prefix) else: LOGGER.info('No {} voice config!', pretty)
def export(exp_data: ExportData): """Generate the VPK file in the game folder.""" sel_vpk = exp_data.selected_style.vpk_name if sel_vpk: for vpk in StyleVPK.all(): if vpk.id.casefold() == sel_vpk: sel_vpk = vpk break else: sel_vpk = None else: sel_vpk = None try: dest_folder = StyleVPK.clear_vpk_files(exp_data.game) except PermissionError: raise NoVPKExport() # We can't edit the VPK files - P2 is open.. if exp_data.game.steamID == utils.STEAM_IDS['PORTAL2']: # In Portal 2, we make a dlc3 folder - this changes priorities, # so the soundcache will be regenerated. Just copy the old one over. sound_cache = os.path.join(dest_folder, 'maps', 'soundcache', '_master.cache') LOGGER.info('Sound cache: {}', sound_cache) if not os.path.isfile(sound_cache): LOGGER.info('Copying over soundcache file for DLC3..') os.makedirs(os.path.dirname(sound_cache), exist_ok=True) try: shutil.copy( exp_data.game.abs_path( 'portal2_dlc2/maps/soundcache/_master.cache', ), sound_cache, ) except FileNotFoundError: # It's fine, this will be regenerated automatically pass # Generate the VPK. vpk_file = VPK(os.path.join(dest_folder, 'pak01_dir.vpk'), mode='w') with vpk_file: if sel_vpk is not None: for file in sel_vpk.fsys.walk_folder(sel_vpk.dir): with file.open_bin() as open_file: vpk_file.add_file( file.path, open_file.read(), sel_vpk.dir, ) # Additionally, pack in game/vpk_override/ into the vpk - this allows # users to easily override resources in general. override_folder = exp_data.game.abs_path('vpk_override') os.makedirs(override_folder, exist_ok=True) # Also write a file to explain what it's for.. with open(os.path.join(override_folder, 'BEE2_README.txt'), 'w') as f: f.write(VPK_OVERRIDE_README) vpk_file.add_folder(override_folder) del vpk_file[ 'BEE2_README.txt'] # Don't add this to the VPK though.. LOGGER.info('Written {} files to VPK!', len(vpk_file))