private void LoadThemeDatas(SkinDatas skinData, CollectionDataSpec <ThemeSideDataSpec> spec) { skinData.ThemeDatas = new Dictionary <string, WithSideData <ThemeSideData> >(); WithSideData <ThemeSideData> internalDefaultThemeData = new WithSideData <ThemeSideData>(); internalDefaultThemeData.Light = new ThemeSideData(); internalDefaultThemeData.Conflict = new ThemeSideData(); internalDefaultThemeData.Light.Track = new Labelled <Sprite> { value = rawDefaultData.TrackLight, label = "<internal:light>" }; internalDefaultThemeData.Conflict.Track = new Labelled <Sprite> { value = rawDefaultData.TrackConflict, label = "<internal:conflict>" }; internalDefaultThemeData.Light.CriticalLine = new Labelled <Sprite> { value = rawDefaultData.CriticalLine, label = "<internal>" }; internalDefaultThemeData.Conflict.CriticalLine = new Labelled <Sprite> { value = rawDefaultData.CriticalLine, label = "<internal>" }; internalDefaultThemeData.Light.ComboTextColor = rawDefaultData.ComboTextColorLight; internalDefaultThemeData.Conflict.ComboTextColor = rawDefaultData.ComboTextColorConflict; internalDefaultThemeData.Light.ParticleNote = new Labelled <Texture2D> { value = rawDefaultData.ParticleNote, label = "<internal>" }; internalDefaultThemeData.Conflict.ParticleNote = new Labelled <Texture2D> { value = rawDefaultData.ParticleNote, label = "<internal>" }; internalDefaultThemeData.Light.ParticleArcStartColor = rawDefaultData.ParticleArcStartColor; internalDefaultThemeData.Conflict.ParticleArcStartColor = rawDefaultData.ParticleArcStartColor; internalDefaultThemeData.Light.ParticleArcEndColor = rawDefaultData.ParticleArcEndColor; internalDefaultThemeData.Conflict.ParticleArcEndColor = rawDefaultData.ParticleArcEndColor; LoadCollectionData <ThemeSideData, ThemeSideDataSpec>(internalDefaultThemeData, skinData.ThemeDatas, (name) => { skinData.DefaultThemeData = name; }, spec, LoadThemeSideData); }
private void LoadBackgroundDatas(SkinDatas skinData, BackgroundDataSpec[] spec) { skinData.BackgroundDatas = new Dictionary <string, BackgroundData>(); if (spec != null) { foreach (BackgroundDataSpec backgroundDataSpec in spec) { LoadBackgroundData(skinData, backgroundDataSpec); } } if (skinData.DefaultBackground == null) { skinData.DefaultBackground = "\"DefaultLight\""; skinData.BackgroundDatas.Add("\"DefaultLight\"", new BackgroundData() { background = new Labelled <Sprite>() { value = rawDefaultData.BackgroundLight, label = "<internal:light>" }, side = Side.Light, theme = skinData.DefaultThemeData }); skinData.BackgroundDatas.Add("\"DefaultConflict\"", new BackgroundData() { background = new Labelled <Sprite>() { value = rawDefaultData.BackgroundConflict, label = "<internal:conflict>" }, side = Side.Conflict, theme = skinData.DefaultThemeData }); } }
private void LoadBackgroundData(SkinDatas skinData, BackgroundDataSpec spec) { if (spec == null) { return; } if (spec.name == null) { Debug.LogWarning($"BackgroundDataSpec without a name will be ignored. spec:\n{JsonConvert.SerializeObject(spec)}"); return; } if (skinData.BackgroundDatas.ContainsKey(spec.name)) { Debug.LogWarning($"BackgroundDataSpec with a duplicated name will be ignored. spec:\n{JsonConvert.SerializeObject(spec)}"); return; } string file = spec.file ?? spec.name; string path = Path.Combine(SkinFolderPath, "Playfield", "Background", file + ".jpg"); Sprite background = LoadNormalSprite(path, externalSkinDataObjects); if (background == null) { Debug.LogWarning($"Background not found, ignored the BackgroundDataSpec. spec:\n{JsonConvert.SerializeObject(spec)}"); return; } BackgroundData data = new BackgroundData(); data.background = new Labelled <Sprite> { value = background, label = path }; data.side = null; if (spec.side == "light") { data.side = Side.Light; } else if (spec.side == "conflict") { data.side = Side.Conflict; } data.theme = null; if (spec.theme != null) { if (skinData.ThemeDatas.ContainsKey(spec.theme)) { data.theme = spec.theme; } } skinData.BackgroundDatas.Add(spec.name, data); if (skinData.DefaultBackground == null) { skinData.DefaultBackground = spec.name; } }
private void LoadNoteDatas(SkinDatas skinData, CollectionDataSpec <NoteSideDataSpec> spec) { skinData.NoteDatas = new Dictionary <string, WithSideData <NoteSideData> >(); WithSideData <NoteSideData> internalDefaultNoteData = new WithSideData <NoteSideData>(); internalDefaultNoteData.Light = new NoteSideData(); internalDefaultNoteData.Conflict = new NoteSideData(); internalDefaultNoteData.Light.TapNote = new Labelled <Sprite> { value = rawDefaultData.TapNoteLight, label = "<internal:light>" }; internalDefaultNoteData.Conflict.TapNote = new Labelled <Sprite> { value = rawDefaultData.TapNoteConflict, label = "<internal:conflict>" }; internalDefaultNoteData.Light.HoldNote = new Labelled <Sprite> { value = rawDefaultData.HoldNoteLight, label = "<internal:light>" }; internalDefaultNoteData.Conflict.HoldNote = new Labelled <Sprite> { value = rawDefaultData.HoldNoteConflict, label = "<internal:conflict>" }; internalDefaultNoteData.Light.HoldNoteHighlight = new Labelled <Sprite> { value = rawDefaultData.HoldNoteHighlightLight, label = "<internal:light>" }; internalDefaultNoteData.Conflict.HoldNoteHighlight = new Labelled <Sprite> { value = rawDefaultData.HoldNoteHighlightConflict, label = "<internal:conflict>" }; internalDefaultNoteData.Light.ArcTap = new Labelled <Texture2D> { value = rawDefaultData.ArcTapLight, label = "<internal:light>" }; internalDefaultNoteData.Conflict.ArcTap = new Labelled <Texture2D> { value = rawDefaultData.ArcTapConflict, label = "<internal:conflict>" }; internalDefaultNoteData.Light.ConnectionLineColor = rawDefaultData.ConnectionLineColorLight; internalDefaultNoteData.Conflict.ConnectionLineColor = rawDefaultData.ConnectionLineColorConflict; internalDefaultNoteData.Light.ArcRedLow = rawDefaultData.ArcRedLow; internalDefaultNoteData.Conflict.ArcRedLow = rawDefaultData.ArcRedLow; internalDefaultNoteData.Light.ArcBlueLow = rawDefaultData.ArcBlueLow; internalDefaultNoteData.Conflict.ArcBlueLow = rawDefaultData.ArcBlueLow; internalDefaultNoteData.Light.ArcGreenLow = rawDefaultData.ArcGreenLow; internalDefaultNoteData.Conflict.ArcGreenLow = rawDefaultData.ArcGreenLow; internalDefaultNoteData.Light.ArcRedHigh = rawDefaultData.ArcRedHigh; internalDefaultNoteData.Conflict.ArcRedHigh = rawDefaultData.ArcRedHigh; internalDefaultNoteData.Light.ArcBlueHigh = rawDefaultData.ArcBlueHigh; internalDefaultNoteData.Conflict.ArcBlueHigh = rawDefaultData.ArcBlueHigh; internalDefaultNoteData.Light.ArcGreenHigh = rawDefaultData.ArcGreenHigh; internalDefaultNoteData.Conflict.ArcGreenHigh = rawDefaultData.ArcGreenHigh; internalDefaultNoteData.Light.ArcVoid = rawDefaultData.ArcVoid; internalDefaultNoteData.Conflict.ArcVoid = rawDefaultData.ArcVoid; LoadCollectionData <NoteSideData, NoteSideDataSpec>(internalDefaultNoteData, skinData.NoteDatas, (name) => { skinData.DefaultNoteData = name; }, spec, LoadNoteSideData); }
// Note: the LoadSkinDatas is a long sychronized method, so the application will freeze during this processing // However, If we use the network library in unity to load things, we will handle the complex coroutine programming, // and converting between uri and filepath. // Maybe the best solution is running this function in another thread, but the technical detail is unknown. // TODO: It will be better to add something indicate the loading. public void LoadSkinDatas() { this.skinData = null; DestroyExternalResources(externalSkinDataObjects); SkinDatas skinData = new SkinDatas(); skinData.SongInfo = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "SongInfo.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.SongInfo); skinData.ProgressGlow = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "ProgressGlow.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ProgressGlow); skinData.UnknownCover = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "UnknownCover.jpg"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.UnknownCover); skinData.DifficultyPast = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Difficulties", "Past.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.DifficultyPast); skinData.DifficultyPresent = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Difficulties", "Present.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.DifficultyPresent); skinData.DifficultyFuture = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Difficulties", "Future.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.DifficultyFuture); skinData.DifficultyBeyond = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Difficulties", "Beyond.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.DifficultyBeyond); skinData.Pause = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "PlayPause", "Pause.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.Pause); skinData.PausePressed = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "PlayPause", "PausePressed.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.PausePressed); skinData.Play = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "PlayPause", "Play.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.Play); skinData.PlayPressed = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "PlayPause", "PlayPressed.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.PlayPressed); skinData.DialogTop = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "DialogTop.png"), (path) => { return(Load9SliceSprite(path, new Vector4(36, 0, 40, 0), externalSkinDataObjects)); }, rawDefaultData.DialogTop); skinData.DialogBackground = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "DialogBackground.png"), (path) => { return(Load9SliceSprite(path, new Vector4(36, 60, 40, 0), externalSkinDataObjects)); }, rawDefaultData.DialogBackground); skinData.ButtonSingle = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonSingle.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonSingle); skinData.ButtonSinglePressed = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonSinglePressed.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonSinglePressed); skinData.ButtonSingleDisabled = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonSingleDisabled.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonSingleDisabled); skinData.ButtonDualLeft = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonDualLeft.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonDualLeft); skinData.ButtonDualLeftPressed = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonDualLeftPressed.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonDualLeftPressed); skinData.ButtonDualLeftDisabled = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonDualLeftDisabled.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonDualLeftDisabled); skinData.ButtonDualRight = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonDualRight.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonDualRight); skinData.ButtonDualRightPressed = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonDualRightPressed.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonDualRightPressed); skinData.ButtonDualRightDisabled = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Dialog", "ButtonDualRightDisabled.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ButtonDualRightDisabled); skinData.ShutterLeft = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Shutter", "ShutterLeft.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ShutterLeft); skinData.ShutterRight = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "UI", "Shutter", "ShutterRight.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ShutterRight); skinData.ShutterOpen = LoadLabelled <AudioClip>(Path.Combine(SkinFolderPath, "Sound", "ShutterOpen.wav"), (path) => { return(LoadWavAudioClip(path, externalSkinDataObjects)); }, rawDefaultData.ShutterOpen); skinData.ShutterClose = LoadLabelled <AudioClip>(Path.Combine(SkinFolderPath, "Sound", "ShutterClose.wav"), (path) => { return(LoadWavAudioClip(path, externalSkinDataObjects)); }, rawDefaultData.ShutterClose); skinData.TapSound = LoadLabelled <AudioClip>(Path.Combine(SkinFolderPath, "Sound", "Tap.wav"), (path) => { return(LoadWavAudioClip(path, externalSkinDataObjects)); }, rawDefaultData.TapSound); skinData.ArcSound = LoadLabelled <AudioClip>(Path.Combine(SkinFolderPath, "Sound", "Arc.wav"), (path) => { return(LoadWavAudioClip(path, externalSkinDataObjects)); }, rawDefaultData.ArcSound); skinData.TutorialBanner = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "Tutorial.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.TutorialBanner); skinData.BackgroundDarken = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "BackgroundDarken.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.TutorialBanner); skinData.SkyInputLabel = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "SkyInput", "SkyInputLabel.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.SkyInputLabel); skinData.SkyInputLine = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "SkyInput", "SkyInputLine.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.SkyInputLine); skinData.TrackLaneDivider = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "Track", "TrackLaneDivider.png"), (path) => { return(LoadPivotSprite(path, new Vector2(0.5f, 0.0f), externalSkinDataObjects)); }, rawDefaultData.TrackLaneDivider); skinData.LaneHit = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "Track", "LaneHit.png"), (path) => { return(LoadPivotSprite(path, new Vector2(0.0f, 0.0f), externalSkinDataObjects)); }, rawDefaultData.LaneHit); skinData.ParticleArc = LoadLabelled <Texture2D>(Path.Combine(SkinFolderPath, "Playfield", "Particle", "ParticleArc.png"), (path) => { return(LoadTexture2D(path, externalSkinDataObjects)); }, rawDefaultData.ParticleArc); skinData.ArcCap = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "Note", "ArcCap.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ArcCap); skinData.ArcTapShadow = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "Note", "ArcTapShadow.png"), (path) => { return(LoadNormalSprite(path, externalSkinDataObjects)); }, rawDefaultData.ArcTapShadow); skinData.HeightIndicator = LoadLabelled <Sprite>(Path.Combine(SkinFolderPath, "Playfield", "Note", "HeightIndicator.png"), (path) => { return(LoadPivotSprite(path, new Vector2(0.5f, 0.0f), externalSkinDataObjects)); }, rawDefaultData.HeightIndicator); skinData.ArcBody = LoadLabelled <Texture2D>(Path.Combine(SkinFolderPath, "Playfield", "Note", "ArcBody", "ArcBody.png"), (path) => { return(LoadTexture2D(path, externalSkinDataObjects)); }, rawDefaultData.ArcBody); skinData.ArcBodyHighlight = LoadLabelled <Texture2D>(Path.Combine(SkinFolderPath, "Playfield", "Note", "ArcBody", "ArcBodyHighlight.png"), (path) => { return(LoadTexture2D(path, externalSkinDataObjects)); }, rawDefaultData.ArcBodyHighlight); string specData = ""; try { specData = File.ReadAllText(Path.Combine(SkinFolderPath, "Arcade-editor-skin.json")); } catch { } SkinDataSpec spec = JsonConvert.DeserializeObject <SkinDataSpec>(specData, new JsonSerializerSettings { Error = (sender, error) => { Debug.LogWarning($"Error when parsing skin spec, related fields will be ignored:\n{error.ErrorContext.Error.Message}"); error.ErrorContext.Handled = true; } }); Debug.Log($"spec:{JsonConvert.SerializeObject(spec)}"); LoadNoteDatas(skinData, spec?.note); LoadThemeDatas(skinData, spec?.theme); LoadBackgroundDatas(skinData, spec?.background); this.skinData = skinData; return; }