Ejemplo n.º 1
0
        /// <summary>
        /// 将.osu中的note转为SB脚本
        /// </summary>
        /// <param name="se">设置集</param>
        /// <returns>是否成功</returns>
        public bool Make(Setting se)
        {
            fsosu = new FileStream(osuPath, FileMode.Open, FileAccess.Read);
            srosu = new StreamReader(fsosu, Encoding.Default);
            //fsosu.Seek(0, SeekOrigin.Begin);
            //设置
            settings = se;
            if (settings.ics.HasValue) {
                cs = settings.ics.Value;
                csScale = Convert.ToDouble((0.8503125 - cs * 0.07015625).ToString("0.00"));
            }
            if (settings.iar.HasValue) {
                ar = settings.iar.Value;
                approachTime = 1800 - (int)(150 * ar);
            }

            //准备工作
            string path = System.IO.Path.GetDirectoryName(osuPath);
            logBox.AppendText("解压皮肤资源..." + Environment.NewLine);
            for (int i = 0; i < Common.skinFile.Count(); i++) {
                string s = Common.skinFile[i];
                if (!File.Exists(path + "\\" + s + ".png")) {
                    GetSkinResource(i).Save(path + "\\" + s + ".png");
                }
            }
            //备份osb
            if (File.Exists(osbPath)) {
                for (int i = 0; i < 100; i++)
                    if (!File.Exists(osbPath + ".bak" + i.ToString())) {
                        logBox.AppendText("已有osb文件被备份为bak" + i.ToString() + Environment.NewLine);
                        File.Move(osbPath, osbPath + ".bak" + i.ToString());
                        break;
                    }
            }
            //打开文件,写入文件头
            fsSB = new FileStream(osbPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            swSB = new StreamWriter(fsSB, Encoding.Default);
            swSB.WriteLine("//Powered by osuSBNoteMaker");
            swSB.WriteLine("[Events]");
            //黑色背景
            if (settings.useBlackBG) {
                swSB.WriteLine("Sprite,Background,Centre,\"{0}.png\",320,240", Common.skinFile[3]);
                swSB.WriteLine(" C,0,-1000,3000000,0,0,0");
            }
            fsSB.Seek(0, SeekOrigin.End);
            //开始转换note
            logBox.AppendText("Working..." + Environment.NewLine);
            string[] data;
            string content = srosu.ReadLine();
            while (!content.StartsWith("[HitObjects]")) {
                content = srosu.ReadLine();
            }
            while (srosu.Peek() >= 0) {
                content = srosu.ReadLine();
                data = content.Split(',');
                HitObject note = new HitObject(Convert.ToInt32(data[0]), Convert.ToInt32(data[1]), Convert.ToInt32(data[2]), GetObjectType(Convert.ToInt32(data[3])));
                swSB.WriteLine(makesb(note));
            }
            logBox.AppendText("完成!" + Environment.NewLine);
            swSB.Close();
            fsSB.Close();
            srosu.Close();
            fsosu.Close();
            return true;
        }