示例#1
0
        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);
        }
示例#2
0
 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
         });
     }
 }
示例#3
0
        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;
            }
        }
示例#4
0
        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);
        }
示例#5
0
        // 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;
        }