Mirror for Friday Night Funkin

variations loading via fnfc fix in progress

authored by ninjamuffin99.newgrounds.com and committed by

Eric 36997e8b abe4ac84

+46 -76
+44 -74
source/funkin/ui/debug/charting/handlers/ChartEditorImportExportHandler.hx
··· 12 12 import funkin.data.song.SongData.SongMetadata; 13 13 import funkin.data.song.SongRegistry; 14 14 import funkin.data.song.importer.ChartManifestData; 15 + import thx.semver.Version as SemverVersion; 15 16 16 17 /** 17 18 * Contains functions for importing, loading, saving, and exporting charts. ··· 58 59 59 60 ChartEditorAudioHandler.wipeInstrumentalData(state); 60 61 ChartEditorAudioHandler.wipeVocalData(state); 61 - state.stopExistingVocals(); 62 62 63 - var variations:Array<String> = state.availableVariations; 64 - for (variation in variations) 63 + for (variation in state.availableVariations) 65 64 { 66 65 if (variation == Constants.DEFAULT_VARIATION) 67 66 { ··· 172 171 */ 173 172 public static function loadFromFNFC(state:ChartEditorState, bytes:Bytes):Null<Array<String>> 174 173 { 175 - var warnings:Array<String> = []; 174 + var output:Array<String> = []; 176 175 177 - var songMetadatas:Map<String, SongMetadata> = []; 178 - var songChartDatas:Map<String, SongChartData> = []; 179 - 176 + // Read the ZIP/.FNFC file, and create a map of entries. 180 177 var fileEntries:Array<haxe.zip.Entry> = FileUtil.readZIPFromBytes(bytes); 181 178 var mappedFileEntries:Map<String, haxe.zip.Entry> = FileUtil.mapZIPEntriesByName(fileEntries); 182 - 183 - var manifestBytes:Null<Bytes> = mappedFileEntries.get('manifest.json')?.data; 184 - if (manifestBytes == null) throw 'Could not locate manifest.'; 185 - var manifestString = manifestBytes.toString(); 186 - var manifest:Null<ChartManifestData> = ChartManifestData.deserialize(manifestString); 187 - if (manifest == null) throw 'Could not read manifest.'; 188 - 189 - // Get the song ID. 190 - var songId:String = manifest.songId; 179 + var manifestString:String = mappedFileEntries.get('manifest.json')?.data?.toString() ?? throw 'Could not locate manifest.'; 180 + var manifest:ChartManifestData = ChartManifestData.deserialize(manifestString) ?? throw 'Could not read manifest.'; 191 181 192 182 var baseMetadataPath:String = manifest.getMetadataFileName(); 193 - var baseChartDataPath:String = manifest.getChartDataFileName(); 194 - 195 - var baseMetadataBytes:Null<Bytes> = mappedFileEntries.get(baseMetadataPath)?.data; 196 - if (baseMetadataBytes == null) throw 'Could not locate metadata (default).'; 197 - var baseMetadataString:String = baseMetadataBytes.toString(); 198 - var baseMetadataVersion:Null<thx.semver.Version> = VersionUtil.getVersionFromJSON(baseMetadataString); 199 - if (baseMetadataVersion == null) throw 'Could not read metadata version (default).'; 183 + var baseMetadataString:String = mappedFileEntries.get(baseMetadataPath)?.data?.toString() ?? throw 'Could not locate metadata (default).'; 184 + var baseMetadataVersion:SemverVersion = VersionUtil.getVersionFromJSON(baseMetadataString) ?? throw 'Could not read metadata version (default).'; 185 + var baseMetadata:SongMetadata = SongRegistry.instance.parseEntryMetadataRawWithMigration(baseMetadataString, baseMetadataPath, 186 + baseMetadataVersion) ?? throw 'Could not read metadata (default).'; 200 187 201 - var baseMetadata:Null<SongMetadata> = SongRegistry.instance.parseEntryMetadataRawWithMigration(baseMetadataString, baseMetadataPath, baseMetadataVersion); 202 - if (baseMetadata == null) throw 'Could not read metadata (default).'; 188 + var songMetadatas:Map<String, SongMetadata> = []; 203 189 songMetadatas.set(Constants.DEFAULT_VARIATION, baseMetadata); 204 190 205 - var baseChartDataBytes:Null<Bytes> = mappedFileEntries.get(baseChartDataPath)?.data; 206 - if (baseChartDataBytes == null) throw 'Could not locate chart data (default).'; 207 - var baseChartDataString:String = baseChartDataBytes.toString(); 208 - var baseChartDataVersion:Null<thx.semver.Version> = VersionUtil.getVersionFromJSON(baseChartDataString); 209 - if (baseChartDataVersion == null) throw 'Could not read chart data (default) version.'; 191 + var baseChartDataPath:String = manifest.getChartDataFileName(); 192 + var baseChartDataString:String = mappedFileEntries.get(baseChartDataPath)?.data?.toString() ?? throw 'Could not locate chart data (default).'; 193 + var baseChartDataVersion:SemverVersion = VersionUtil.getVersionFromJSON(baseChartDataString) ?? throw 'Could not read chart data version (default).'; 194 + var baseChartData:SongChartData = SongRegistry.instance.parseEntryChartDataRawWithMigration(baseChartDataString, baseChartDataPath, 195 + baseChartDataVersion) ?? throw 'Could not read chart data (default).'; 210 196 211 - var baseChartData:Null<SongChartData> = SongRegistry.instance.parseEntryChartDataRawWithMigration(baseChartDataString, baseChartDataPath, 212 - baseChartDataVersion); 213 - if (baseChartData == null) throw 'Could not read chart data (default).'; 197 + var songChartDatas:Map<String, SongChartData> = []; 214 198 songChartDatas.set(Constants.DEFAULT_VARIATION, baseChartData); 215 199 216 200 var variationList:Array<String> = baseMetadata.playData.songVariations; ··· 218 202 for (variation in variationList) 219 203 { 220 204 var variMetadataPath:String = manifest.getMetadataFileName(variation); 221 - var variChartDataPath:String = manifest.getChartDataFileName(variation); 222 - 223 - var variMetadataBytes:Null<Bytes> = mappedFileEntries.get(variMetadataPath)?.data; 224 - if (variMetadataBytes == null) throw 'Could not locate metadata ($variation).'; 225 - var variMetadataString:String = variMetadataBytes.toString(); 226 - var variMetadataVersion:Null<thx.semver.Version> = VersionUtil.getVersionFromJSON(variMetadataString); 227 - if (variMetadataVersion == null) throw 'Could not read metadata ($variation) version.'; 205 + var variMetadataString:String = mappedFileEntries.get(variMetadataPath)?.data?.toString() ?? throw 'Could not locate metadata ($variation).'; 206 + var variMetadataVersion:SemverVersion = VersionUtil.getVersionFromJSON(variMetadataString) ?? throw 'Could not read metadata ($variation) version.'; 207 + var variMetadata:SongMetadata = SongRegistry.instance.parseEntryMetadataRawWithMigration(variMetadataString, variMetadataPath, variMetadataVersion, 208 + variation) ?? throw 'Could not read metadata ($variation).'; 228 209 229 - var variMetadata:Null<SongMetadata> = SongRegistry.instance.parseEntryMetadataRawWithMigration(variMetadataString, variMetadataPath, 230 - variMetadataVersion, variation); 231 - if (variMetadata == null) throw 'Could not read metadata ($variation).'; 232 210 songMetadatas.set(variation, variMetadata); 233 211 234 - var variChartDataBytes:Null<Bytes> = mappedFileEntries.get(variChartDataPath)?.data; 235 - if (variChartDataBytes == null) throw 'Could not locate chart data ($variation).'; 236 - var variChartDataString:String = variChartDataBytes.toString(); 237 - var variChartDataVersion:Null<thx.semver.Version> = VersionUtil.getVersionFromJSON(variChartDataString); 238 - if (variChartDataVersion == null) throw 'Could not read chart data version ($variation).'; 212 + var variChartDataPath:String = manifest.getChartDataFileName(variation); 213 + var variChartDataString:String = mappedFileEntries.get(variChartDataPath)?.data?.toString() ?? throw 'Could not locate chart data ($variation).'; 214 + var variChartDataVersion:SemverVersion = VersionUtil.getVersionFromJSON(variChartDataString) ?? throw 'Could not read chart data version ($variation).'; 215 + var variChartData:SongChartData = SongRegistry.instance.parseEntryChartDataRawWithMigration(variChartDataString, variChartDataPath, 216 + variChartDataVersion) ?? throw 'Could not read chart data ($variation).'; 239 217 240 - var variChartData:Null<SongChartData> = SongRegistry.instance.parseEntryChartDataRawWithMigration(variChartDataString, variChartDataPath, 241 - variChartDataVersion); 242 - if (variChartData == null) throw 'Could not read chart data ($variation).'; 243 218 songChartDatas.set(variation, variChartData); 244 219 } 220 + loadSong(state, songMetadatas, songChartDatas); 221 + 222 + state.sortChartData(); 245 223 246 224 ChartEditorAudioHandler.wipeInstrumentalData(state); 247 225 ChartEditorAudioHandler.wipeVocalData(state); 248 226 249 227 // Load instrumentals 250 - for (variation in [Constants.DEFAULT_VARIATION].concat(variationList)) 228 + for (variation in state.availableVariations) 251 229 { 252 230 var variMetadata:Null<SongMetadata> = songMetadatas.get(variation); 253 231 if (variMetadata == null) continue; 254 232 255 233 var instId:String = variMetadata?.playData?.characters?.instrumental ?? ''; 256 - var playerCharId:String = variMetadata?.playData?.characters?.player ?? Constants.DEFAULT_CHARACTER; 257 - var opponentCharId:Null<String> = variMetadata?.playData?.characters?.opponent; 258 234 259 235 var instFileName:String = manifest.getInstFileName(instId); 260 - var instFileBytes:Null<Bytes> = mappedFileEntries.get(instFileName)?.data; 261 - if (instFileBytes != null) 262 - { 263 - if (!ChartEditorAudioHandler.loadInstFromBytes(state, instFileBytes, instId)) 264 - { 265 - throw 'Could not load instrumental ($instFileName).'; 266 - } 267 - } 268 - else 269 - { 270 - throw 'Could not find instrumental ($instFileName).'; 271 - } 236 + var instFileBytes:Bytes = mappedFileEntries.get(instFileName)?.data ?? throw 'Could not locate instrumental ($instFileName).'; 237 + if (!ChartEditorAudioHandler.loadInstFromBytes(state, instFileBytes, instId)) throw 'Could not load instrumental ($instFileName).'; 272 238 273 - var playerVocalsFileName:String = manifest.getVocalsFileName(playerCharId); 239 + var playerCharId:String = variMetadata?.playData?.characters?.player ?? Constants.DEFAULT_CHARACTER; 240 + var playerVocalsFileName:String = manifest.getVocalsFileName(playerCharId, variation); 274 241 var playerVocalsFileBytes:Null<Bytes> = mappedFileEntries.get(playerVocalsFileName)?.data; 275 242 if (playerVocalsFileBytes != null) 276 243 { 277 244 if (!ChartEditorAudioHandler.loadVocalsFromBytes(state, playerVocalsFileBytes, playerCharId, instId)) 278 245 { 279 - warnings.push('Could not parse vocals ($playerCharId).'); 246 + output.push('Could not parse vocals ($playerCharId).'); 280 247 // throw 'Could not parse vocals ($playerCharId).'; 281 248 } 282 249 } 283 250 else 284 251 { 285 - warnings.push('Could not find vocals ($playerVocalsFileName).'); 252 + output.push('Could not find vocals ($playerVocalsFileName).'); 286 253 // throw 'Could not find vocals ($playerVocalsFileName).'; 287 254 } 288 255 256 + var opponentCharId:Null<String> = variMetadata?.playData?.characters?.opponent; 257 + 289 258 if (opponentCharId != null) 290 259 { 291 - var opponentVocalsFileName:String = manifest.getVocalsFileName(opponentCharId); 260 + var opponentVocalsFileName:String = manifest.getVocalsFileName(opponentCharId, variation); 292 261 var opponentVocalsFileBytes:Null<Bytes> = mappedFileEntries.get(opponentVocalsFileName)?.data; 293 262 if (opponentVocalsFileBytes != null) 294 263 { 295 264 if (!ChartEditorAudioHandler.loadVocalsFromBytes(state, opponentVocalsFileBytes, opponentCharId, instId)) 296 265 { 297 - warnings.push('Could not parse vocals ($opponentCharId).'); 266 + output.push('Could not parse vocals ($opponentCharId).'); 298 267 // throw 'Could not parse vocals ($opponentCharId).'; 299 268 } 300 269 } 301 270 else 302 271 { 303 - warnings.push('Could not find vocals ($opponentVocalsFileName).'); 272 + output.push('Could not find vocals ($opponentVocalsFileName).'); 304 273 // throw 'Could not find vocals ($opponentVocalsFileName).'; 305 274 } 306 275 } ··· 309 278 // Apply chart data. 310 279 trace(songMetadatas); 311 280 trace(songChartDatas); 312 - loadSong(state, songMetadatas, songChartDatas); 313 281 314 282 state.switchToCurrentInstrumental(); 283 + state.postLoadInstrumental(); 284 + state.refreshToolbox(ChartEditorState.CHART_EDITOR_TOOLBOX_METADATA_LAYOUT); 315 285 316 - return warnings; 286 + return output; 317 287 } 318 288 319 289 public static function getLatestBackupPath():Null<String>
+2 -2
source/funkin/util/assets/SoundUtil.hx
··· 3 3 import haxe.io.Bytes; 4 4 import openfl.media.Sound as OpenFLSound; 5 5 import funkin.audio.FunkinSound; 6 + import lime.media.AudioBuffer; 6 7 7 8 class SoundUtil 8 9 { ··· 16 17 { 17 18 if (input == null) return null; 18 19 19 - var openflSound:OpenFLSound = new OpenFLSound(); 20 - openflSound.loadCompressedDataFromByteArray(openfl.utils.ByteArray.fromBytes(input), input.length); 20 + var openflSound:OpenFLSound = OpenFLSound.fromAudioBuffer(AudioBuffer.fromBytes(input)); 21 21 var output:FunkinSound = FunkinSound.load(openflSound, 1.0, false); 22 22 return output; 23 23 }