Ejemplo n.º 1
0
        public void InsertScoreBackwardWithNote(NoteBook noteBook, ScoreBook scoreBook, Score score, int beatNumer, int beatDenom, int barCount)
        {
            int initialScoreTick = score.StartTick;

            InsertScoreBackward(scoreBook, score, beatNumer, beatDenom, barCount);
            //score以降に含まれるすべてのノーツに対して位置をずらす
            int deltaTick = barCount * ScoreInfo.MaxBeatDiv * beatNumer / beatDenom;

            noteBook.RelocateNoteTickAfterScoreTick(initialScoreTick, deltaTick);
            UpdateNoteLocation?.Invoke(this);
        }
Ejemplo n.º 2
0
 public void InsertScoreForwardWithNote(NoteBook noteBook, ScoreBook database, Score baseScore, ScoreBook newScores)
 {
     if (database.Next(baseScore) == null)
     {
         SetScore(database, newScores);
     }
     else
     {
         InsertScoreBackwardWithNote(noteBook, database, database.Next(baseScore), newScores);
     }
 }
Ejemplo n.º 3
0
 public void InsertScoreForwardWithNote(NoteBook noteBook, ScoreBook scoreBook, Score score, int beatNumer, int beatDenom, int barCount)
 {
     if (scoreBook.Next(score) == null)
     {
         SetScore(scoreBook, beatNumer, beatDenom, barCount);
     }
     else
     {
         InsertScoreBackwardWithNote(noteBook, scoreBook, scoreBook.Next(score), beatNumer, beatDenom, barCount);
     }
 }
Ejemplo n.º 4
0
        public void InsertScoreBackwardWithNote(NoteBook noteBook, ScoreBook database, Score baseScore, ScoreBook newScores)
        {
            int initialScoreTick = baseScore.StartTick;

            InsertScoreBackward(database, baseScore, newScores);
            //score以降に含まれるすべてのノーツに対して位置をずらす
            int deltaTick = 0;

            newScores.ForEach(x => deltaTick += ScoreInfo.MaxBeatDiv * x.BeatNumer / x.BeatDenom);
            noteBook.RelocateNoteTickAfterScoreTick(initialScoreTick, deltaTick);
            UpdateNoteLocation?.Invoke(this);
        }
Ejemplo n.º 5
0
        public void InsertScoreBackward(ScoreBook scoreBook, Score score, int beatNumer, int beatDenom, int barCount)
        {
            //新たに追加する譜面たちをリストでまとめる
            //これはLaneBookではないのでRefreshIndex()が行われない
            ScoreBook newScores = new ScoreBook();

            for (int i = 0; i < barCount; ++i)
            {
                newScores.Add(new Score(beatNumer, beatDenom));
            }
            InsertScoreBackward(scoreBook, score, newScores);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// LaneBookとScoreBookにScoreを追加します
        /// </summary>
        /// <param name="scoreBook"></param>
        /// <param name="beatNumer"></param>
        /// <param name="beatDenom"></param>
        /// <param name="barCount"></param>
        public void SetScore(ScoreBook scoreBook, int beatNumer, int beatDenom, int barCount)
        {
            //新たに追加する譜面たちをリストでまとめる
            //これはLaneBookではないのでRefreshIndex()が行われない
            ScoreBook newScores = new ScoreBook();

            for (int i = 0; i < barCount; ++i)
            {
                newScores.Add(new Score(beatNumer, beatDenom));
            }
            //まとめた譜面たちをscoreBookに入れる
            SetScore(scoreBook, newScores);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// LaneBookにScoreBookのScoreを追加します
 /// </summary>
 /// <param name="scoreBook"></param>
 public void SetScoreToLane(ScoreBook scoreBook)
 {
     if (!this.Any())
     {
         Add(new ScoreLane());
     }
     foreach (Score score in scoreBook)
     {
         // newScore全体が1つのレーンの最大サイズで収まるか判定
         if (score.BarSize <= ScoreInfo.LaneMaxBar)
         {
             //現在のリストにあるレーンの末尾にまだnewScoreを入れる余裕があるか判定
             if (this.Last().CurrentBarSize + score.BarSize > ScoreInfo.LaneMaxBar)
             {
                 //余裕がないときは新たな空レーンを追加
                 Add(new ScoreLane());
             }
             //レーン末尾にnewScoreを格納
             this.Last().AddScore(score);
         }
         // newScoreの全体は1つのレーンには収まらないけど、1拍分なら収まる場合
         else if (score.BarSize / score.BeatNumer <= ScoreInfo.LaneMaxBar)
         {
             var numerCountPerLane = (int)(ScoreInfo.LaneMaxBar / (score.BarSize / score.BeatNumer));
             for (int i = 0; i < score.BeatNumer / (float)numerCountPerLane; ++i)
             {
                 //新たにレーンを追加
                 if (this.Last().CurrentBarSize > 0)
                 {
                     Add(new ScoreLane());
                 }
                 //末尾のレーンに新たなScoreを範囲を指定して格納
                 this.Last().AddScore(
                     score,
                     new Range(
                         i * numerCountPerLane + 1,
                         Math.Min(score.BeatNumer, (i + 1) * numerCountPerLane)));
             }
         }
         // newScoreの1拍分すら1つのレーンに収まらない場合
         else
         {
             System.Diagnostics.Debug.Assert(false, "小節の描画がおかしくなるぞ!");
             // UNDONE: どうする
             // 現段階で設定できる倍率(0.5, 1, 2, 4)だと、n分のm拍子に対してnが4以上の小節であれば
             // ここに入ることは無いので、エディタから設定できる拍子をnが4以上に設定することでここの実装をしなくてもよいことにした
             // (実装が面倒臭いため)
         }
     }
     UpdateNoteLocation?.Invoke(this);
 }
Ejemplo n.º 8
0
        public void InsertScoreBackward(ScoreBook database, Score baseScore, ScoreBook newScores)
        {
            database?.InsertRange(baseScore.Index, newScores);
            //scoreを初めて含むレーンを取得
            ScoreLane        lane     = Find(x => x.Contains(baseScore));
            List <ScoreLane> newLanes = new List <ScoreLane>();

            foreach (Score newScore in newScores)
            {
                //newScoreが1つのレーンの最大サイズで収まるか判定
                if (newScore.BarSize <= ScoreInfo.LaneMaxBar)
                {
                    //そもそも現在のレーンリストが空の時は新レーンを1つ補充
                    if (!newLanes.Any())
                    {
                        newLanes.Add(new ScoreLane());
                    }
                    //現在のリストにあるレーンの末尾にまだnewScoreを入れる余裕があるか判定
                    if (newLanes.Last().CurrentBarSize + newScore.BarSize > ScoreInfo.LaneMaxBar)
                    {
                        //余裕がないときは新たな空レーンを追加
                        newLanes.Add(new ScoreLane());
                    }
                    //レーン末尾にnewScoreを格納
                    newLanes.Last().AddScore(newScore, new Range(1, newScore.BeatNumer));
                }
                //収まらなかった場合
                else
                {
                    //なんやかんやで分割して複数レーンに格納する
                    for (int i = 0; i < newScore.BarSize / ScoreInfo.LaneMaxBar; ++i)
                    {
                        //新たにレーンを追加
                        newLanes.Add(new ScoreLane());
                        //末尾のレーンに新たなScoreを範囲を指定して格納
                        newLanes.Last().AddScore(
                            newScore,
                            new Range(
                                (int)(i * newScore.BeatDenom * ScoreInfo.LaneMaxBar + 1),
                                Math.Min(newScore.BeatNumer, (int)((i + 1) * newScore.BeatDenom * ScoreInfo.LaneMaxBar))));
                    }
                }
            }
            //scoreとその1つ前のScoreでレーンを分割
            DivideLane(baseScore);
            //
            InsertRange(lane.Index, newLanes);
            //
            FillLane();
        }
Ejemplo n.º 9
0
        /// <summary>
        /// scoreを始めとしてcount個のScoreを削除
        /// </summary>
        /// <param name="model"></param>
        /// <param name="score"></param>
        /// <param name="count"></param>
        public void DeleteScore(ScoreBook scoreBook, Score score, int count)
        {
            Score itrScore;
            int   itrCount;

            //scoreからcount個Scoreを削除
            for (itrScore = score, itrCount = count; itrScore != null && itrCount > 0; itrScore = scoreBook.Next(itrScore), --itrCount)
            {
                //選択されたScoreが初めて含まれるレーンを特定
                ScoreLane laneBegin = Find(x => x.Contains(itrScore));
                int       linkCount = itrScore.LinkCount;
                System.Diagnostics.Debug.Assert(linkCount > 0, "linkCount is zero");
                for (int i = 0; i < linkCount; ++i)
                {
                    laneBegin.DeleteScore(itrScore);
                    if (!laneBegin.Any())
                    {
                        ScoreLane blankLane = laneBegin;
                        laneBegin = Next(laneBegin);
                        Remove(blankLane);
                    }
                    else
                    {
                        laneBegin = Next(laneBegin);
                    }
                }
#if DEBUG
                System.Diagnostics.Debug.WriteLine("LinkCount : " + linkCount.ToString());
#endif
            }
            //scoreBookから該当範囲のScoreを削除
            scoreBook.Delete(score.Index, count);
            //レーンを詰める
            FillLane();
            //詰み対策(雑)
            if (!this.Any())
            {
                SetScore(scoreBook, 4, 4, 1);
            }
        }
Ejemplo n.º 10
0
 public void SetScore(ScoreBook database, ScoreBook newScores)
 {
     database?.Append(newScores);
     SetScoreToLane(newScores);
 }
Ejemplo n.º 11
0
 public void Clear(ScoreBook scoreBook)
 {
     Clear();
     scoreBook.ForEach(x => x.LinkCount = 0);
 }